diff --git a/libgcc/config/arm/ieee754-df.S b/libgcc/config/arm/ieee754-df.S index 406bb70..ecdd46f 100644 --- a/libgcc/config/arm/ieee754-df.S +++ b/libgcc/config/arm/ieee754-df.S @@ -559,7 +559,7 @@ ARM_FUNC_ALIAS aeabi_l2d floatdidf #ifdef L_arm_muldivdf3 -ARM_FUNC_START muldf3 +ARM_FUNC_START muldf3, function_section ARM_FUNC_ALIAS aeabi_dmul muldf3 do_push {r4, r5, r6, lr} @@ -571,7 +571,7 @@ ARM_FUNC_ALIAS aeabi_dmul muldf3 COND(and,s,ne) r5, ip, yh, lsr #20 teqne r4, ip teqne r5, ip - bleq LSYM(Lml_s) + bleq Lml_s @ Add exponents together add r4, r4, r5 @@ -689,7 +689,7 @@ ARM_FUNC_ALIAS aeabi_dmul muldf3 subs ip, r4, #(254 - 1) do_it hi cmphi ip, #0x700 - bhi LSYM(Lml_u) + bhi Lml_u @ Round the result, merge final exponent. cmp lr, #0x80000000 @@ -716,9 +716,12 @@ LSYM(Lml_1): mov lr, #0 subs r4, r4, #1 -LSYM(Lml_u): + FUNC_END aeabi_dmul + FUNC_END muldf3 + +ARM_SYM_START Lml_u @ Overflow? - bgt LSYM(Lml_o) + bgt Lml_o @ Check if denormalized result is possible, otherwise return signed 0. cmn r4, #(53 + 1) @@ -778,10 +781,11 @@ LSYM(Lml_u): do_it eq biceq xl, xl, r3, lsr #31 RETLDM "r4, r5, r6" + SYM_END Lml_u @ One or both arguments are denormalized. @ Scale them leftwards and preserve sign bit. -LSYM(Lml_d): +ARM_SYM_START Lml_d teq r4, #0 bne 2f and r6, xh, #0x80000000 @@ -804,8 +808,9 @@ LSYM(Lml_d): beq 3b orr yh, yh, r6 RET + SYM_END Lml_d -LSYM(Lml_s): +ARM_SYM_START Lml_s @ Isolate the INF and NAN cases away teq r4, ip and r5, ip, yh, lsr #20 @@ -817,10 +822,11 @@ LSYM(Lml_s): orrs r6, xl, xh, lsl #1 do_it ne COND(orr,s,ne) r6, yl, yh, lsl #1 - bne LSYM(Lml_d) + bne Lml_d + SYM_END Lml_s @ Result is 0, but determine sign anyway. -LSYM(Lml_z): +ARM_SYM_START Lml_z eor xh, xh, yh and xh, xh, #0x80000000 mov xl, #0 @@ -832,41 +838,42 @@ LSYM(Lml_z): moveq xl, yl moveq xh, yh COND(orr,s,ne) r6, yl, yh, lsl #1 - beq LSYM(Lml_n) @ 0 * INF or INF * 0 -> NAN + beq Lml_n @ 0 * INF or INF * 0 -> NAN teq r4, ip bne 1f orrs r6, xl, xh, lsl #12 - bne LSYM(Lml_n) @ NAN * -> NAN + bne Lml_n @ NAN * -> NAN 1: teq r5, ip - bne LSYM(Lml_i) + bne Lml_i orrs r6, yl, yh, lsl #12 do_it ne, t movne xl, yl movne xh, yh - bne LSYM(Lml_n) @ * NAN -> NAN + bne Lml_n @ * NAN -> NAN + SYM_END Lml_z @ Result is INF, but we need to determine its sign. -LSYM(Lml_i): +ARM_SYM_START Lml_i eor xh, xh, yh + SYM_END Lml_i @ Overflow: return INF (sign already in xh). -LSYM(Lml_o): +ARM_SYM_START Lml_o and xh, xh, #0x80000000 orr xh, xh, #0x7f000000 orr xh, xh, #0x00f00000 mov xl, #0 RETLDM "r4, r5, r6" + SYM_END Lml_o @ Return a quiet NAN. -LSYM(Lml_n): +ARM_SYM_START Lml_n orr xh, xh, #0x7f000000 orr xh, xh, #0x00f80000 RETLDM "r4, r5, r6" + SYM_END Lml_n - FUNC_END aeabi_dmul - FUNC_END muldf3 - -ARM_FUNC_START divdf3 +ARM_FUNC_START divdf3 function_section ARM_FUNC_ALIAS aeabi_ddiv divdf3 do_push {r4, r5, r6, lr} @@ -985,7 +992,7 @@ ARM_FUNC_ALIAS aeabi_ddiv divdf3 subs ip, r4, #(254 - 1) do_it hi cmphi ip, #0x700 - bhi LSYM(Lml_u) + bhi Lml_u @ Round the result, merge final exponent. subs ip, r5, yh @@ -1009,13 +1016,13 @@ LSYM(Ldv_1): orr xh, xh, #0x00100000 mov lr, #0 subs r4, r4, #1 - b LSYM(Lml_u) + b Lml_u @ Result mightt need to be denormalized: put remainder bits @ in lr for rounding considerations. LSYM(Ldv_u): orr lr, r5, r6 - b LSYM(Lml_u) + b Lml_u @ One or both arguments is either INF, NAN or zero. LSYM(Ldv_s): @@ -1023,34 +1030,34 @@ LSYM(Ldv_s): teq r4, ip do_it eq teqeq r5, ip - beq LSYM(Lml_n) @ INF/NAN / INF/NAN -> NAN + beq Lml_n @ INF/NAN / INF/NAN -> NAN teq r4, ip bne 1f orrs r4, xl, xh, lsl #12 - bne LSYM(Lml_n) @ NAN / -> NAN + bne Lml_n @ NAN / -> NAN teq r5, ip - bne LSYM(Lml_i) @ INF / -> INF + bne Lml_i @ INF / -> INF mov xl, yl mov xh, yh - b LSYM(Lml_n) @ INF / (INF or NAN) -> NAN + b Lml_n @ INF / (INF or NAN) -> NAN 1: teq r5, ip bne 2f orrs r5, yl, yh, lsl #12 - beq LSYM(Lml_z) @ / INF -> 0 + beq Lml_z @ / INF -> 0 mov xl, yl mov xh, yh - b LSYM(Lml_n) @ / NAN -> NAN + b Lml_n @ / NAN -> NAN 2: @ If both are nonzero, we need to normalize and resume above. orrs r6, xl, xh, lsl #1 do_it ne COND(orr,s,ne) r6, yl, yh, lsl #1 - bne LSYM(Lml_d) + bne Lml_d @ One or both arguments are 0. orrs r4, xl, xh, lsl #1 - bne LSYM(Lml_i) @ / 0 -> INF + bne Lml_i @ / 0 -> INF orrs r5, yl, yh, lsl #1 - bne LSYM(Lml_z) @ 0 / -> 0 - b LSYM(Lml_n) @ 0 / 0 -> NAN + bne Lml_z @ 0 / -> 0 + b Lml_n @ 0 / 0 -> NAN FUNC_END aeabi_ddiv FUNC_END divdf3 diff --git a/libgcc/config/arm/ieee754-sf.S b/libgcc/config/arm/ieee754-sf.S index c9bca4d..45bada4 100644 --- a/libgcc/config/arm/ieee754-sf.S +++ b/libgcc/config/arm/ieee754-sf.S @@ -418,7 +418,7 @@ ARM_FUNC_ALIAS aeabi_l2f floatdisf #ifdef L_arm_muldivsf3 -ARM_FUNC_START mulsf3 +ARM_FUNC_START mulsf3, function_section ARM_FUNC_ALIAS aeabi_fmul mulsf3 @ Mask out exponents, trap any zero/denormal/INF/NAN. @@ -428,7 +428,7 @@ ARM_FUNC_ALIAS aeabi_fmul mulsf3 COND(and,s,ne) r3, ip, r1, lsr #23 teqne r2, ip teqne r3, ip - beq LSYM(Lml_s) + beq Lml_s LSYM(Lml_x): @ Add exponents together @@ -490,7 +490,7 @@ LSYM(Lml_x): @ Apply exponent bias, check for under/overflow. sbc r2, r2, #127 cmp r2, #(254 - 1) - bhi LSYM(Lml_u) + bhi Lml_u @ Round the result, merge final exponent. cmp r3, #0x80000000 @@ -518,9 +518,12 @@ LSYM(Lml_1): mov r3, #0 subs r2, r2, #1 -LSYM(Lml_u): + FUNC_END aeabi_fmul + FUNC_END mulsf3 + +ARM_SYM_START Lml_u @ Overflow? - bgt LSYM(Lml_o) + bgt Lml_o @ Check if denormalized result is possible, otherwise return signed 0. cmn r2, #(24 + 1) @@ -540,10 +543,11 @@ LSYM(Lml_u): do_it eq biceq r0, r0, ip, lsr #31 RET + SYM_END Lml_u @ One or both arguments are denormalized. @ Scale them leftwards and preserve sign bit. -LSYM(Lml_d): +ARM_SYM_START Lml_d teq r2, #0 and ip, r0, #0x80000000 1: do_it eq, tt @@ -561,8 +565,9 @@ LSYM(Lml_d): beq 2b orr r1, r1, ip b LSYM(Lml_x) + SYM_END Lml_d -LSYM(Lml_s): +ARM_SYM_START Lml_s @ Isolate the INF and NAN cases away and r3, ip, r1, lsr #23 teq r2, ip @@ -574,10 +579,11 @@ LSYM(Lml_s): bics ip, r0, #0x80000000 do_it ne COND(bic,s,ne) ip, r1, #0x80000000 - bne LSYM(Lml_d) + bne Lml_d + SYM_END Lml_s @ Result is 0, but determine sign anyway. -LSYM(Lml_z): +ARM_SYM_START Lml_z eor r0, r0, r1 bic r0, r0, #0x7fffffff RET @@ -589,39 +595,41 @@ LSYM(Lml_z): moveq r0, r1 teqne r1, #0x0 teqne r1, #0x80000000 - beq LSYM(Lml_n) @ 0 * INF or INF * 0 -> NAN + beq Lml_n @ 0 * INF or INF * 0 -> NAN teq r2, ip bne 1f movs r2, r0, lsl #9 - bne LSYM(Lml_n) @ NAN * -> NAN + bne Lml_n @ NAN * -> NAN 1: teq r3, ip - bne LSYM(Lml_i) + bne Lml_i movs r3, r1, lsl #9 do_it ne movne r0, r1 - bne LSYM(Lml_n) @ * NAN -> NAN + bne Lml_n @ * NAN -> NAN + SYM_END Lml_z @ Result is INF, but we need to determine its sign. -LSYM(Lml_i): +ARM_SYM_START Lml_i eor r0, r0, r1 + SYM_END Lml_i @ Overflow: return INF (sign already in r0). -LSYM(Lml_o): +ARM_SYM_START Lml_o and r0, r0, #0x80000000 orr r0, r0, #0x7f000000 orr r0, r0, #0x00800000 RET + SYM_END Lml_o @ Return a quiet NAN. -LSYM(Lml_n): +ARM_SYM_START Lml_n orr r0, r0, #0x7f000000 orr r0, r0, #0x00c00000 RET + SYM_END Lml_n - FUNC_END aeabi_fmul - FUNC_END mulsf3 -ARM_FUNC_START divsf3 +ARM_FUNC_START divsf3 function_section ARM_FUNC_ALIAS aeabi_fdiv divsf3 @ Mask out exponents, trap any zero/denormal/INF/NAN. @@ -684,7 +692,7 @@ LSYM(Ldv_x): @ Check exponent for under/overflow. cmp r2, #(254 - 1) - bhi LSYM(Lml_u) + bhi Lml_u @ Round the result, merge final exponent. cmp r3, r1 @@ -706,7 +714,7 @@ LSYM(Ldv_1): orr r0, r0, #0x00800000 mov r3, #0 subs r2, r2, #1 - b LSYM(Lml_u) + b Lml_u @ One or both arguments are denormalized. @ Scale them leftwards and preserve sign bit. @@ -735,17 +743,17 @@ LSYM(Ldv_s): teq r2, ip bne 1f movs r2, r0, lsl #9 - bne LSYM(Lml_n) @ NAN / -> NAN + bne Lml_n @ NAN / -> NAN teq r3, ip - bne LSYM(Lml_i) @ INF / -> INF + bne Lml_i @ INF / -> INF mov r0, r1 - b LSYM(Lml_n) @ INF / (INF or NAN) -> NAN + b Lml_n @ INF / (INF or NAN) -> NAN 1: teq r3, ip bne 2f movs r3, r1, lsl #9 - beq LSYM(Lml_z) @ / INF -> 0 + beq Lml_z @ / INF -> 0 mov r0, r1 - b LSYM(Lml_n) @ / NAN -> NAN + b Lml_n @ / NAN -> NAN 2: @ If both are nonzero, we need to normalize and resume above. bics ip, r0, #0x80000000 do_it ne @@ -753,10 +761,10 @@ LSYM(Ldv_s): bne LSYM(Ldv_d) @ One or both arguments are zero. bics r2, r0, #0x80000000 - bne LSYM(Lml_i) @ / 0 -> INF + bne Lml_i @ / 0 -> INF bics r3, r1, #0x80000000 - bne LSYM(Lml_z) @ 0 / -> 0 - b LSYM(Lml_n) @ 0 / 0 -> NAN + bne Lml_z @ 0 / -> 0 + b Lml_n @ 0 / 0 -> NAN FUNC_END aeabi_fdiv FUNC_END divsf3