18c2ecf20Sopenharmony_ci| 28c2ecf20Sopenharmony_ci| scale.sa 3.3 7/30/91 38c2ecf20Sopenharmony_ci| 48c2ecf20Sopenharmony_ci| The entry point sSCALE computes the destination operand 58c2ecf20Sopenharmony_ci| scaled by the source operand. If the absolute value of 68c2ecf20Sopenharmony_ci| the source operand is (>= 2^14) an overflow or underflow 78c2ecf20Sopenharmony_ci| is returned. 88c2ecf20Sopenharmony_ci| 98c2ecf20Sopenharmony_ci| The entry point sscale is called from do_func to emulate 108c2ecf20Sopenharmony_ci| the fscale unimplemented instruction. 118c2ecf20Sopenharmony_ci| 128c2ecf20Sopenharmony_ci| Input: Double-extended destination operand in FPTEMP, 138c2ecf20Sopenharmony_ci| double-extended source operand in ETEMP. 148c2ecf20Sopenharmony_ci| 158c2ecf20Sopenharmony_ci| Output: The function returns scale(X,Y) to fp0. 168c2ecf20Sopenharmony_ci| 178c2ecf20Sopenharmony_ci| Modifies: fp0. 188c2ecf20Sopenharmony_ci| 198c2ecf20Sopenharmony_ci| Algorithm: 208c2ecf20Sopenharmony_ci| 218c2ecf20Sopenharmony_ci| Copyright (C) Motorola, Inc. 1990 228c2ecf20Sopenharmony_ci| All Rights Reserved 238c2ecf20Sopenharmony_ci| 248c2ecf20Sopenharmony_ci| For details on the license for this file, please see the 258c2ecf20Sopenharmony_ci| file, README, in this same directory. 268c2ecf20Sopenharmony_ci 278c2ecf20Sopenharmony_ci|SCALE idnt 2,1 | Motorola 040 Floating Point Software Package 288c2ecf20Sopenharmony_ci 298c2ecf20Sopenharmony_ci |section 8 308c2ecf20Sopenharmony_ci 318c2ecf20Sopenharmony_ci#include "fpsp.h" 328c2ecf20Sopenharmony_ci 338c2ecf20Sopenharmony_ci |xref t_ovfl2 348c2ecf20Sopenharmony_ci |xref t_unfl 358c2ecf20Sopenharmony_ci |xref round 368c2ecf20Sopenharmony_ci |xref t_resdnrm 378c2ecf20Sopenharmony_ci 388c2ecf20Sopenharmony_ciSRC_BNDS: .short 0x3fff,0x400c 398c2ecf20Sopenharmony_ci 408c2ecf20Sopenharmony_ci| 418c2ecf20Sopenharmony_ci| This entry point is used by the unimplemented instruction exception 428c2ecf20Sopenharmony_ci| handler. 438c2ecf20Sopenharmony_ci| 448c2ecf20Sopenharmony_ci| 458c2ecf20Sopenharmony_ci| 468c2ecf20Sopenharmony_ci| FSCALE 478c2ecf20Sopenharmony_ci| 488c2ecf20Sopenharmony_ci .global sscale 498c2ecf20Sopenharmony_cisscale: 508c2ecf20Sopenharmony_ci fmovel #0,%fpcr |clr user enabled exc 518c2ecf20Sopenharmony_ci clrl %d1 528c2ecf20Sopenharmony_ci movew FPTEMP(%a6),%d1 |get dest exponent 538c2ecf20Sopenharmony_ci smi L_SCR1(%a6) |use L_SCR1 to hold sign 548c2ecf20Sopenharmony_ci andil #0x7fff,%d1 |strip sign 558c2ecf20Sopenharmony_ci movew ETEMP(%a6),%d0 |check src bounds 568c2ecf20Sopenharmony_ci andiw #0x7fff,%d0 |clr sign bit 578c2ecf20Sopenharmony_ci cmp2w SRC_BNDS,%d0 588c2ecf20Sopenharmony_ci bccs src_in 598c2ecf20Sopenharmony_ci cmpiw #0x400c,%d0 |test for too large 608c2ecf20Sopenharmony_ci bge src_out 618c2ecf20Sopenharmony_ci| 628c2ecf20Sopenharmony_ci| The source input is below 1, so we check for denormalized numbers 638c2ecf20Sopenharmony_ci| and set unfl. 648c2ecf20Sopenharmony_ci| 658c2ecf20Sopenharmony_cisrc_small: 668c2ecf20Sopenharmony_ci moveb DTAG(%a6),%d0 678c2ecf20Sopenharmony_ci andib #0xe0,%d0 688c2ecf20Sopenharmony_ci tstb %d0 698c2ecf20Sopenharmony_ci beqs no_denorm 708c2ecf20Sopenharmony_ci st STORE_FLG(%a6) |dest already contains result 718c2ecf20Sopenharmony_ci orl #unfl_mask,USER_FPSR(%a6) |set UNFL 728c2ecf20Sopenharmony_ciden_done: 738c2ecf20Sopenharmony_ci leal FPTEMP(%a6),%a0 748c2ecf20Sopenharmony_ci bra t_resdnrm 758c2ecf20Sopenharmony_cino_denorm: 768c2ecf20Sopenharmony_ci fmovel USER_FPCR(%a6),%FPCR 778c2ecf20Sopenharmony_ci fmovex FPTEMP(%a6),%fp0 |simply return dest 788c2ecf20Sopenharmony_ci rts 798c2ecf20Sopenharmony_ci 808c2ecf20Sopenharmony_ci 818c2ecf20Sopenharmony_ci| 828c2ecf20Sopenharmony_ci| Source is within 2^14 range. To perform the int operation, 838c2ecf20Sopenharmony_ci| move it to d0. 848c2ecf20Sopenharmony_ci| 858c2ecf20Sopenharmony_cisrc_in: 868c2ecf20Sopenharmony_ci fmovex ETEMP(%a6),%fp0 |move in src for int 878c2ecf20Sopenharmony_ci fmovel #rz_mode,%fpcr |force rz for src conversion 888c2ecf20Sopenharmony_ci fmovel %fp0,%d0 |int src to d0 898c2ecf20Sopenharmony_ci fmovel #0,%FPSR |clr status from above 908c2ecf20Sopenharmony_ci tstw ETEMP(%a6) |check src sign 918c2ecf20Sopenharmony_ci blt src_neg 928c2ecf20Sopenharmony_ci| 938c2ecf20Sopenharmony_ci| Source is positive. Add the src to the dest exponent. 948c2ecf20Sopenharmony_ci| The result can be denormalized, if src = 0, or overflow, 958c2ecf20Sopenharmony_ci| if the result of the add sets a bit in the upper word. 968c2ecf20Sopenharmony_ci| 978c2ecf20Sopenharmony_cisrc_pos: 988c2ecf20Sopenharmony_ci tstw %d1 |check for denorm 998c2ecf20Sopenharmony_ci beq dst_dnrm 1008c2ecf20Sopenharmony_ci addl %d0,%d1 |add src to dest exp 1018c2ecf20Sopenharmony_ci beqs denorm |if zero, result is denorm 1028c2ecf20Sopenharmony_ci cmpil #0x7fff,%d1 |test for overflow 1038c2ecf20Sopenharmony_ci bges ovfl 1048c2ecf20Sopenharmony_ci tstb L_SCR1(%a6) 1058c2ecf20Sopenharmony_ci beqs spos_pos 1068c2ecf20Sopenharmony_ci orw #0x8000,%d1 1078c2ecf20Sopenharmony_cispos_pos: 1088c2ecf20Sopenharmony_ci movew %d1,FPTEMP(%a6) |result in FPTEMP 1098c2ecf20Sopenharmony_ci fmovel USER_FPCR(%a6),%FPCR 1108c2ecf20Sopenharmony_ci fmovex FPTEMP(%a6),%fp0 |write result to fp0 1118c2ecf20Sopenharmony_ci rts 1128c2ecf20Sopenharmony_ciovfl: 1138c2ecf20Sopenharmony_ci tstb L_SCR1(%a6) 1148c2ecf20Sopenharmony_ci beqs sovl_pos 1158c2ecf20Sopenharmony_ci orw #0x8000,%d1 1168c2ecf20Sopenharmony_cisovl_pos: 1178c2ecf20Sopenharmony_ci movew FPTEMP(%a6),ETEMP(%a6) |result in ETEMP 1188c2ecf20Sopenharmony_ci movel FPTEMP_HI(%a6),ETEMP_HI(%a6) 1198c2ecf20Sopenharmony_ci movel FPTEMP_LO(%a6),ETEMP_LO(%a6) 1208c2ecf20Sopenharmony_ci bra t_ovfl2 1218c2ecf20Sopenharmony_ci 1228c2ecf20Sopenharmony_cidenorm: 1238c2ecf20Sopenharmony_ci tstb L_SCR1(%a6) 1248c2ecf20Sopenharmony_ci beqs den_pos 1258c2ecf20Sopenharmony_ci orw #0x8000,%d1 1268c2ecf20Sopenharmony_ciden_pos: 1278c2ecf20Sopenharmony_ci tstl FPTEMP_HI(%a6) |check j bit 1288c2ecf20Sopenharmony_ci blts nden_exit |if set, not denorm 1298c2ecf20Sopenharmony_ci movew %d1,ETEMP(%a6) |input expected in ETEMP 1308c2ecf20Sopenharmony_ci movel FPTEMP_HI(%a6),ETEMP_HI(%a6) 1318c2ecf20Sopenharmony_ci movel FPTEMP_LO(%a6),ETEMP_LO(%a6) 1328c2ecf20Sopenharmony_ci orl #unfl_bit,USER_FPSR(%a6) |set unfl 1338c2ecf20Sopenharmony_ci leal ETEMP(%a6),%a0 1348c2ecf20Sopenharmony_ci bra t_resdnrm 1358c2ecf20Sopenharmony_cinden_exit: 1368c2ecf20Sopenharmony_ci movew %d1,FPTEMP(%a6) |result in FPTEMP 1378c2ecf20Sopenharmony_ci fmovel USER_FPCR(%a6),%FPCR 1388c2ecf20Sopenharmony_ci fmovex FPTEMP(%a6),%fp0 |write result to fp0 1398c2ecf20Sopenharmony_ci rts 1408c2ecf20Sopenharmony_ci 1418c2ecf20Sopenharmony_ci| 1428c2ecf20Sopenharmony_ci| Source is negative. Add the src to the dest exponent. 1438c2ecf20Sopenharmony_ci| (The result exponent will be reduced). The result can be 1448c2ecf20Sopenharmony_ci| denormalized. 1458c2ecf20Sopenharmony_ci| 1468c2ecf20Sopenharmony_cisrc_neg: 1478c2ecf20Sopenharmony_ci addl %d0,%d1 |add src to dest 1488c2ecf20Sopenharmony_ci beqs denorm |if zero, result is denorm 1498c2ecf20Sopenharmony_ci blts fix_dnrm |if negative, result is 1508c2ecf20Sopenharmony_ci| ;needing denormalization 1518c2ecf20Sopenharmony_ci tstb L_SCR1(%a6) 1528c2ecf20Sopenharmony_ci beqs sneg_pos 1538c2ecf20Sopenharmony_ci orw #0x8000,%d1 1548c2ecf20Sopenharmony_cisneg_pos: 1558c2ecf20Sopenharmony_ci movew %d1,FPTEMP(%a6) |result in FPTEMP 1568c2ecf20Sopenharmony_ci fmovel USER_FPCR(%a6),%FPCR 1578c2ecf20Sopenharmony_ci fmovex FPTEMP(%a6),%fp0 |write result to fp0 1588c2ecf20Sopenharmony_ci rts 1598c2ecf20Sopenharmony_ci 1608c2ecf20Sopenharmony_ci 1618c2ecf20Sopenharmony_ci| 1628c2ecf20Sopenharmony_ci| The result exponent is below denorm value. Test for catastrophic 1638c2ecf20Sopenharmony_ci| underflow and force zero if true. If not, try to shift the 1648c2ecf20Sopenharmony_ci| mantissa right until a zero exponent exists. 1658c2ecf20Sopenharmony_ci| 1668c2ecf20Sopenharmony_cifix_dnrm: 1678c2ecf20Sopenharmony_ci cmpiw #0xffc0,%d1 |lower bound for normalization 1688c2ecf20Sopenharmony_ci blt fix_unfl |if lower, catastrophic unfl 1698c2ecf20Sopenharmony_ci movew %d1,%d0 |use d0 for exp 1708c2ecf20Sopenharmony_ci movel %d2,-(%a7) |free d2 for norm 1718c2ecf20Sopenharmony_ci movel FPTEMP_HI(%a6),%d1 1728c2ecf20Sopenharmony_ci movel FPTEMP_LO(%a6),%d2 1738c2ecf20Sopenharmony_ci clrl L_SCR2(%a6) 1748c2ecf20Sopenharmony_cifix_loop: 1758c2ecf20Sopenharmony_ci addw #1,%d0 |drive d0 to 0 1768c2ecf20Sopenharmony_ci lsrl #1,%d1 |while shifting the 1778c2ecf20Sopenharmony_ci roxrl #1,%d2 |mantissa to the right 1788c2ecf20Sopenharmony_ci bccs no_carry 1798c2ecf20Sopenharmony_ci st L_SCR2(%a6) |use L_SCR2 to capture inex 1808c2ecf20Sopenharmony_cino_carry: 1818c2ecf20Sopenharmony_ci tstw %d0 |it is finished when 1828c2ecf20Sopenharmony_ci blts fix_loop |d0 is zero or the mantissa 1838c2ecf20Sopenharmony_ci tstb L_SCR2(%a6) 1848c2ecf20Sopenharmony_ci beqs tst_zero 1858c2ecf20Sopenharmony_ci orl #unfl_inx_mask,USER_FPSR(%a6) 1868c2ecf20Sopenharmony_ci| ;set unfl, aunfl, ainex 1878c2ecf20Sopenharmony_ci| 1888c2ecf20Sopenharmony_ci| Test for zero. If zero, simply use fmove to return +/- zero 1898c2ecf20Sopenharmony_ci| to the fpu. 1908c2ecf20Sopenharmony_ci| 1918c2ecf20Sopenharmony_citst_zero: 1928c2ecf20Sopenharmony_ci clrw FPTEMP_EX(%a6) 1938c2ecf20Sopenharmony_ci tstb L_SCR1(%a6) |test for sign 1948c2ecf20Sopenharmony_ci beqs tst_con 1958c2ecf20Sopenharmony_ci orw #0x8000,FPTEMP_EX(%a6) |set sign bit 1968c2ecf20Sopenharmony_citst_con: 1978c2ecf20Sopenharmony_ci movel %d1,FPTEMP_HI(%a6) 1988c2ecf20Sopenharmony_ci movel %d2,FPTEMP_LO(%a6) 1998c2ecf20Sopenharmony_ci movel (%a7)+,%d2 2008c2ecf20Sopenharmony_ci tstl %d1 2018c2ecf20Sopenharmony_ci bnes not_zero 2028c2ecf20Sopenharmony_ci tstl FPTEMP_LO(%a6) 2038c2ecf20Sopenharmony_ci bnes not_zero 2048c2ecf20Sopenharmony_ci| 2058c2ecf20Sopenharmony_ci| Result is zero. Check for rounding mode to set lsb. If the 2068c2ecf20Sopenharmony_ci| mode is rp, and the zero is positive, return smallest denorm. 2078c2ecf20Sopenharmony_ci| If the mode is rm, and the zero is negative, return smallest 2088c2ecf20Sopenharmony_ci| negative denorm. 2098c2ecf20Sopenharmony_ci| 2108c2ecf20Sopenharmony_ci btstb #5,FPCR_MODE(%a6) |test if rm or rp 2118c2ecf20Sopenharmony_ci beqs no_dir 2128c2ecf20Sopenharmony_ci btstb #4,FPCR_MODE(%a6) |check which one 2138c2ecf20Sopenharmony_ci beqs zer_rm 2148c2ecf20Sopenharmony_cizer_rp: 2158c2ecf20Sopenharmony_ci tstb L_SCR1(%a6) |check sign 2168c2ecf20Sopenharmony_ci bnes no_dir |if set, neg op, no inc 2178c2ecf20Sopenharmony_ci movel #1,FPTEMP_LO(%a6) |set lsb 2188c2ecf20Sopenharmony_ci bras sm_dnrm 2198c2ecf20Sopenharmony_cizer_rm: 2208c2ecf20Sopenharmony_ci tstb L_SCR1(%a6) |check sign 2218c2ecf20Sopenharmony_ci beqs no_dir |if clr, neg op, no inc 2228c2ecf20Sopenharmony_ci movel #1,FPTEMP_LO(%a6) |set lsb 2238c2ecf20Sopenharmony_ci orl #neg_mask,USER_FPSR(%a6) |set N 2248c2ecf20Sopenharmony_ci bras sm_dnrm 2258c2ecf20Sopenharmony_cino_dir: 2268c2ecf20Sopenharmony_ci fmovel USER_FPCR(%a6),%FPCR 2278c2ecf20Sopenharmony_ci fmovex FPTEMP(%a6),%fp0 |use fmove to set cc's 2288c2ecf20Sopenharmony_ci rts 2298c2ecf20Sopenharmony_ci 2308c2ecf20Sopenharmony_ci| 2318c2ecf20Sopenharmony_ci| The rounding mode changed the zero to a smallest denorm. Call 2328c2ecf20Sopenharmony_ci| t_resdnrm with exceptional operand in ETEMP. 2338c2ecf20Sopenharmony_ci| 2348c2ecf20Sopenharmony_cism_dnrm: 2358c2ecf20Sopenharmony_ci movel FPTEMP_EX(%a6),ETEMP_EX(%a6) 2368c2ecf20Sopenharmony_ci movel FPTEMP_HI(%a6),ETEMP_HI(%a6) 2378c2ecf20Sopenharmony_ci movel FPTEMP_LO(%a6),ETEMP_LO(%a6) 2388c2ecf20Sopenharmony_ci leal ETEMP(%a6),%a0 2398c2ecf20Sopenharmony_ci bra t_resdnrm 2408c2ecf20Sopenharmony_ci 2418c2ecf20Sopenharmony_ci| 2428c2ecf20Sopenharmony_ci| Result is still denormalized. 2438c2ecf20Sopenharmony_ci| 2448c2ecf20Sopenharmony_cinot_zero: 2458c2ecf20Sopenharmony_ci orl #unfl_mask,USER_FPSR(%a6) |set unfl 2468c2ecf20Sopenharmony_ci tstb L_SCR1(%a6) |check for sign 2478c2ecf20Sopenharmony_ci beqs fix_exit 2488c2ecf20Sopenharmony_ci orl #neg_mask,USER_FPSR(%a6) |set N 2498c2ecf20Sopenharmony_cifix_exit: 2508c2ecf20Sopenharmony_ci bras sm_dnrm 2518c2ecf20Sopenharmony_ci 2528c2ecf20Sopenharmony_ci 2538c2ecf20Sopenharmony_ci| 2548c2ecf20Sopenharmony_ci| The result has underflowed to zero. Return zero and set 2558c2ecf20Sopenharmony_ci| unfl, aunfl, and ainex. 2568c2ecf20Sopenharmony_ci| 2578c2ecf20Sopenharmony_cifix_unfl: 2588c2ecf20Sopenharmony_ci orl #unfl_inx_mask,USER_FPSR(%a6) 2598c2ecf20Sopenharmony_ci btstb #5,FPCR_MODE(%a6) |test if rm or rp 2608c2ecf20Sopenharmony_ci beqs no_dir2 2618c2ecf20Sopenharmony_ci btstb #4,FPCR_MODE(%a6) |check which one 2628c2ecf20Sopenharmony_ci beqs zer_rm2 2638c2ecf20Sopenharmony_cizer_rp2: 2648c2ecf20Sopenharmony_ci tstb L_SCR1(%a6) |check sign 2658c2ecf20Sopenharmony_ci bnes no_dir2 |if set, neg op, no inc 2668c2ecf20Sopenharmony_ci clrl FPTEMP_EX(%a6) 2678c2ecf20Sopenharmony_ci clrl FPTEMP_HI(%a6) 2688c2ecf20Sopenharmony_ci movel #1,FPTEMP_LO(%a6) |set lsb 2698c2ecf20Sopenharmony_ci bras sm_dnrm |return smallest denorm 2708c2ecf20Sopenharmony_cizer_rm2: 2718c2ecf20Sopenharmony_ci tstb L_SCR1(%a6) |check sign 2728c2ecf20Sopenharmony_ci beqs no_dir2 |if clr, neg op, no inc 2738c2ecf20Sopenharmony_ci movew #0x8000,FPTEMP_EX(%a6) 2748c2ecf20Sopenharmony_ci clrl FPTEMP_HI(%a6) 2758c2ecf20Sopenharmony_ci movel #1,FPTEMP_LO(%a6) |set lsb 2768c2ecf20Sopenharmony_ci orl #neg_mask,USER_FPSR(%a6) |set N 2778c2ecf20Sopenharmony_ci bra sm_dnrm |return smallest denorm 2788c2ecf20Sopenharmony_ci 2798c2ecf20Sopenharmony_cino_dir2: 2808c2ecf20Sopenharmony_ci tstb L_SCR1(%a6) 2818c2ecf20Sopenharmony_ci bges pos_zero 2828c2ecf20Sopenharmony_cineg_zero: 2838c2ecf20Sopenharmony_ci clrl FP_SCR1(%a6) |clear the exceptional operand 2848c2ecf20Sopenharmony_ci clrl FP_SCR1+4(%a6) |for gen_except. 2858c2ecf20Sopenharmony_ci clrl FP_SCR1+8(%a6) 2868c2ecf20Sopenharmony_ci fmoves #0x80000000,%fp0 2878c2ecf20Sopenharmony_ci rts 2888c2ecf20Sopenharmony_cipos_zero: 2898c2ecf20Sopenharmony_ci clrl FP_SCR1(%a6) |clear the exceptional operand 2908c2ecf20Sopenharmony_ci clrl FP_SCR1+4(%a6) |for gen_except. 2918c2ecf20Sopenharmony_ci clrl FP_SCR1+8(%a6) 2928c2ecf20Sopenharmony_ci fmoves #0x00000000,%fp0 2938c2ecf20Sopenharmony_ci rts 2948c2ecf20Sopenharmony_ci 2958c2ecf20Sopenharmony_ci| 2968c2ecf20Sopenharmony_ci| The destination is a denormalized number. It must be handled 2978c2ecf20Sopenharmony_ci| by first shifting the bits in the mantissa until it is normalized, 2988c2ecf20Sopenharmony_ci| then adding the remainder of the source to the exponent. 2998c2ecf20Sopenharmony_ci| 3008c2ecf20Sopenharmony_cidst_dnrm: 3018c2ecf20Sopenharmony_ci moveml %d2/%d3,-(%a7) 3028c2ecf20Sopenharmony_ci movew FPTEMP_EX(%a6),%d1 3038c2ecf20Sopenharmony_ci movel FPTEMP_HI(%a6),%d2 3048c2ecf20Sopenharmony_ci movel FPTEMP_LO(%a6),%d3 3058c2ecf20Sopenharmony_cidst_loop: 3068c2ecf20Sopenharmony_ci tstl %d2 |test for normalized result 3078c2ecf20Sopenharmony_ci blts dst_norm |exit loop if so 3088c2ecf20Sopenharmony_ci tstl %d0 |otherwise, test shift count 3098c2ecf20Sopenharmony_ci beqs dst_fin |if zero, shifting is done 3108c2ecf20Sopenharmony_ci subil #1,%d0 |dec src 3118c2ecf20Sopenharmony_ci lsll #1,%d3 3128c2ecf20Sopenharmony_ci roxll #1,%d2 3138c2ecf20Sopenharmony_ci bras dst_loop 3148c2ecf20Sopenharmony_ci| 3158c2ecf20Sopenharmony_ci| Destination became normalized. Simply add the remaining 3168c2ecf20Sopenharmony_ci| portion of the src to the exponent. 3178c2ecf20Sopenharmony_ci| 3188c2ecf20Sopenharmony_cidst_norm: 3198c2ecf20Sopenharmony_ci addw %d0,%d1 |dst is normalized; add src 3208c2ecf20Sopenharmony_ci tstb L_SCR1(%a6) 3218c2ecf20Sopenharmony_ci beqs dnrm_pos 3228c2ecf20Sopenharmony_ci orl #0x8000,%d1 3238c2ecf20Sopenharmony_cidnrm_pos: 3248c2ecf20Sopenharmony_ci movemw %d1,FPTEMP_EX(%a6) 3258c2ecf20Sopenharmony_ci moveml %d2,FPTEMP_HI(%a6) 3268c2ecf20Sopenharmony_ci moveml %d3,FPTEMP_LO(%a6) 3278c2ecf20Sopenharmony_ci fmovel USER_FPCR(%a6),%FPCR 3288c2ecf20Sopenharmony_ci fmovex FPTEMP(%a6),%fp0 3298c2ecf20Sopenharmony_ci moveml (%a7)+,%d2/%d3 3308c2ecf20Sopenharmony_ci rts 3318c2ecf20Sopenharmony_ci 3328c2ecf20Sopenharmony_ci| 3338c2ecf20Sopenharmony_ci| Destination remained denormalized. Call t_excdnrm with 3348c2ecf20Sopenharmony_ci| exceptional operand in ETEMP. 3358c2ecf20Sopenharmony_ci| 3368c2ecf20Sopenharmony_cidst_fin: 3378c2ecf20Sopenharmony_ci tstb L_SCR1(%a6) |check for sign 3388c2ecf20Sopenharmony_ci beqs dst_exit 3398c2ecf20Sopenharmony_ci orl #neg_mask,USER_FPSR(%a6) |set N 3408c2ecf20Sopenharmony_ci orl #0x8000,%d1 3418c2ecf20Sopenharmony_cidst_exit: 3428c2ecf20Sopenharmony_ci movemw %d1,ETEMP_EX(%a6) 3438c2ecf20Sopenharmony_ci moveml %d2,ETEMP_HI(%a6) 3448c2ecf20Sopenharmony_ci moveml %d3,ETEMP_LO(%a6) 3458c2ecf20Sopenharmony_ci orl #unfl_mask,USER_FPSR(%a6) |set unfl 3468c2ecf20Sopenharmony_ci moveml (%a7)+,%d2/%d3 3478c2ecf20Sopenharmony_ci leal ETEMP(%a6),%a0 3488c2ecf20Sopenharmony_ci bra t_resdnrm 3498c2ecf20Sopenharmony_ci 3508c2ecf20Sopenharmony_ci| 3518c2ecf20Sopenharmony_ci| Source is outside of 2^14 range. Test the sign and branch 3528c2ecf20Sopenharmony_ci| to the appropriate exception handler. 3538c2ecf20Sopenharmony_ci| 3548c2ecf20Sopenharmony_cisrc_out: 3558c2ecf20Sopenharmony_ci tstb L_SCR1(%a6) 3568c2ecf20Sopenharmony_ci beqs scro_pos 3578c2ecf20Sopenharmony_ci orl #0x8000,%d1 3588c2ecf20Sopenharmony_ciscro_pos: 3598c2ecf20Sopenharmony_ci movel FPTEMP_HI(%a6),ETEMP_HI(%a6) 3608c2ecf20Sopenharmony_ci movel FPTEMP_LO(%a6),ETEMP_LO(%a6) 3618c2ecf20Sopenharmony_ci tstw ETEMP(%a6) 3628c2ecf20Sopenharmony_ci blts res_neg 3638c2ecf20Sopenharmony_cires_pos: 3648c2ecf20Sopenharmony_ci movew %d1,ETEMP(%a6) |result in ETEMP 3658c2ecf20Sopenharmony_ci bra t_ovfl2 3668c2ecf20Sopenharmony_cires_neg: 3678c2ecf20Sopenharmony_ci movew %d1,ETEMP(%a6) |result in ETEMP 3688c2ecf20Sopenharmony_ci leal ETEMP(%a6),%a0 3698c2ecf20Sopenharmony_ci bra t_unfl 3708c2ecf20Sopenharmony_ci |end 371