11da177e4SLinus Torvalds| 21da177e4SLinus Torvalds| scale.sa 3.3 7/30/91 31da177e4SLinus Torvalds| 41da177e4SLinus Torvalds| The entry point sSCALE computes the destination operand 51da177e4SLinus Torvalds| scaled by the source operand. If the absolute value of 61da177e4SLinus Torvalds| the source operand is (>= 2^14) an overflow or underflow 71da177e4SLinus Torvalds| is returned. 81da177e4SLinus Torvalds| 91da177e4SLinus Torvalds| The entry point sscale is called from do_func to emulate 101da177e4SLinus Torvalds| the fscale unimplemented instruction. 111da177e4SLinus Torvalds| 121da177e4SLinus Torvalds| Input: Double-extended destination operand in FPTEMP, 131da177e4SLinus Torvalds| double-extended source operand in ETEMP. 141da177e4SLinus Torvalds| 151da177e4SLinus Torvalds| Output: The function returns scale(X,Y) to fp0. 161da177e4SLinus Torvalds| 171da177e4SLinus Torvalds| Modifies: fp0. 181da177e4SLinus Torvalds| 191da177e4SLinus Torvalds| Algorithm: 201da177e4SLinus Torvalds| 211da177e4SLinus Torvalds| Copyright (C) Motorola, Inc. 1990 221da177e4SLinus Torvalds| All Rights Reserved 231da177e4SLinus Torvalds| 24e00d82d0SMatt Waddel| For details on the license for this file, please see the 25e00d82d0SMatt Waddel| file, README, in this same directory. 261da177e4SLinus Torvalds 271da177e4SLinus Torvalds|SCALE idnt 2,1 | Motorola 040 Floating Point Software Package 281da177e4SLinus Torvalds 291da177e4SLinus Torvalds |section 8 301da177e4SLinus Torvalds 311da177e4SLinus Torvalds#include "fpsp.h" 321da177e4SLinus Torvalds 331da177e4SLinus Torvalds |xref t_ovfl2 341da177e4SLinus Torvalds |xref t_unfl 351da177e4SLinus Torvalds |xref round 361da177e4SLinus Torvalds |xref t_resdnrm 371da177e4SLinus Torvalds 381da177e4SLinus TorvaldsSRC_BNDS: .short 0x3fff,0x400c 391da177e4SLinus Torvalds 401da177e4SLinus Torvalds| 411da177e4SLinus Torvalds| This entry point is used by the unimplemented instruction exception 421da177e4SLinus Torvalds| handler. 431da177e4SLinus Torvalds| 441da177e4SLinus Torvalds| 451da177e4SLinus Torvalds| 461da177e4SLinus Torvalds| FSCALE 471da177e4SLinus Torvalds| 481da177e4SLinus Torvalds .global sscale 491da177e4SLinus Torvaldssscale: 501da177e4SLinus Torvalds fmovel #0,%fpcr |clr user enabled exc 511da177e4SLinus Torvalds clrl %d1 521da177e4SLinus Torvalds movew FPTEMP(%a6),%d1 |get dest exponent 531da177e4SLinus Torvalds smi L_SCR1(%a6) |use L_SCR1 to hold sign 541da177e4SLinus Torvalds andil #0x7fff,%d1 |strip sign 551da177e4SLinus Torvalds movew ETEMP(%a6),%d0 |check src bounds 561da177e4SLinus Torvalds andiw #0x7fff,%d0 |clr sign bit 571da177e4SLinus Torvalds cmp2w SRC_BNDS,%d0 581da177e4SLinus Torvalds bccs src_in 591da177e4SLinus Torvalds cmpiw #0x400c,%d0 |test for too large 601da177e4SLinus Torvalds bge src_out 611da177e4SLinus Torvalds| 621da177e4SLinus Torvalds| The source input is below 1, so we check for denormalized numbers 631da177e4SLinus Torvalds| and set unfl. 641da177e4SLinus Torvalds| 651da177e4SLinus Torvaldssrc_small: 661da177e4SLinus Torvalds moveb DTAG(%a6),%d0 671da177e4SLinus Torvalds andib #0xe0,%d0 681da177e4SLinus Torvalds tstb %d0 691da177e4SLinus Torvalds beqs no_denorm 701da177e4SLinus Torvalds st STORE_FLG(%a6) |dest already contains result 711da177e4SLinus Torvalds orl #unfl_mask,USER_FPSR(%a6) |set UNFL 721da177e4SLinus Torvaldsden_done: 731da177e4SLinus Torvalds leal FPTEMP(%a6),%a0 741da177e4SLinus Torvalds bra t_resdnrm 751da177e4SLinus Torvaldsno_denorm: 761da177e4SLinus Torvalds fmovel USER_FPCR(%a6),%FPCR 771da177e4SLinus Torvalds fmovex FPTEMP(%a6),%fp0 |simply return dest 781da177e4SLinus Torvalds rts 791da177e4SLinus Torvalds 801da177e4SLinus Torvalds 811da177e4SLinus Torvalds| 821da177e4SLinus Torvalds| Source is within 2^14 range. To perform the int operation, 831da177e4SLinus Torvalds| move it to d0. 841da177e4SLinus Torvalds| 851da177e4SLinus Torvaldssrc_in: 861da177e4SLinus Torvalds fmovex ETEMP(%a6),%fp0 |move in src for int 871da177e4SLinus Torvalds fmovel #rz_mode,%fpcr |force rz for src conversion 881da177e4SLinus Torvalds fmovel %fp0,%d0 |int src to d0 891da177e4SLinus Torvalds fmovel #0,%FPSR |clr status from above 901da177e4SLinus Torvalds tstw ETEMP(%a6) |check src sign 911da177e4SLinus Torvalds blt src_neg 921da177e4SLinus Torvalds| 931da177e4SLinus Torvalds| Source is positive. Add the src to the dest exponent. 941da177e4SLinus Torvalds| The result can be denormalized, if src = 0, or overflow, 951da177e4SLinus Torvalds| if the result of the add sets a bit in the upper word. 961da177e4SLinus Torvalds| 971da177e4SLinus Torvaldssrc_pos: 981da177e4SLinus Torvalds tstw %d1 |check for denorm 991da177e4SLinus Torvalds beq dst_dnrm 1001da177e4SLinus Torvalds addl %d0,%d1 |add src to dest exp 1011da177e4SLinus Torvalds beqs denorm |if zero, result is denorm 1021da177e4SLinus Torvalds cmpil #0x7fff,%d1 |test for overflow 1031da177e4SLinus Torvalds bges ovfl 1041da177e4SLinus Torvalds tstb L_SCR1(%a6) 1051da177e4SLinus Torvalds beqs spos_pos 1061da177e4SLinus Torvalds orw #0x8000,%d1 1071da177e4SLinus Torvaldsspos_pos: 1081da177e4SLinus Torvalds movew %d1,FPTEMP(%a6) |result in FPTEMP 1091da177e4SLinus Torvalds fmovel USER_FPCR(%a6),%FPCR 1101da177e4SLinus Torvalds fmovex FPTEMP(%a6),%fp0 |write result to fp0 1111da177e4SLinus Torvalds rts 1121da177e4SLinus Torvaldsovfl: 1131da177e4SLinus Torvalds tstb L_SCR1(%a6) 1141da177e4SLinus Torvalds beqs sovl_pos 1151da177e4SLinus Torvalds orw #0x8000,%d1 1161da177e4SLinus Torvaldssovl_pos: 1171da177e4SLinus Torvalds movew FPTEMP(%a6),ETEMP(%a6) |result in ETEMP 1181da177e4SLinus Torvalds movel FPTEMP_HI(%a6),ETEMP_HI(%a6) 1191da177e4SLinus Torvalds movel FPTEMP_LO(%a6),ETEMP_LO(%a6) 1201da177e4SLinus Torvalds bra t_ovfl2 1211da177e4SLinus Torvalds 1221da177e4SLinus Torvaldsdenorm: 1231da177e4SLinus Torvalds tstb L_SCR1(%a6) 1241da177e4SLinus Torvalds beqs den_pos 1251da177e4SLinus Torvalds orw #0x8000,%d1 1261da177e4SLinus Torvaldsden_pos: 1271da177e4SLinus Torvalds tstl FPTEMP_HI(%a6) |check j bit 1281da177e4SLinus Torvalds blts nden_exit |if set, not denorm 1291da177e4SLinus Torvalds movew %d1,ETEMP(%a6) |input expected in ETEMP 1301da177e4SLinus Torvalds movel FPTEMP_HI(%a6),ETEMP_HI(%a6) 1311da177e4SLinus Torvalds movel FPTEMP_LO(%a6),ETEMP_LO(%a6) 1321da177e4SLinus Torvalds orl #unfl_bit,USER_FPSR(%a6) |set unfl 1331da177e4SLinus Torvalds leal ETEMP(%a6),%a0 1341da177e4SLinus Torvalds bra t_resdnrm 1351da177e4SLinus Torvaldsnden_exit: 1361da177e4SLinus Torvalds movew %d1,FPTEMP(%a6) |result in FPTEMP 1371da177e4SLinus Torvalds fmovel USER_FPCR(%a6),%FPCR 1381da177e4SLinus Torvalds fmovex FPTEMP(%a6),%fp0 |write result to fp0 1391da177e4SLinus Torvalds rts 1401da177e4SLinus Torvalds 1411da177e4SLinus Torvalds| 1421da177e4SLinus Torvalds| Source is negative. Add the src to the dest exponent. 1431da177e4SLinus Torvalds| (The result exponent will be reduced). The result can be 1441da177e4SLinus Torvalds| denormalized. 1451da177e4SLinus Torvalds| 1461da177e4SLinus Torvaldssrc_neg: 1471da177e4SLinus Torvalds addl %d0,%d1 |add src to dest 1481da177e4SLinus Torvalds beqs denorm |if zero, result is denorm 1491da177e4SLinus Torvalds blts fix_dnrm |if negative, result is 1501da177e4SLinus Torvalds| ;needing denormalization 1511da177e4SLinus Torvalds tstb L_SCR1(%a6) 1521da177e4SLinus Torvalds beqs sneg_pos 1531da177e4SLinus Torvalds orw #0x8000,%d1 1541da177e4SLinus Torvaldssneg_pos: 1551da177e4SLinus Torvalds movew %d1,FPTEMP(%a6) |result in FPTEMP 1561da177e4SLinus Torvalds fmovel USER_FPCR(%a6),%FPCR 1571da177e4SLinus Torvalds fmovex FPTEMP(%a6),%fp0 |write result to fp0 1581da177e4SLinus Torvalds rts 1591da177e4SLinus Torvalds 1601da177e4SLinus Torvalds 1611da177e4SLinus Torvalds| 1621da177e4SLinus Torvalds| The result exponent is below denorm value. Test for catastrophic 1631da177e4SLinus Torvalds| underflow and force zero if true. If not, try to shift the 1641da177e4SLinus Torvalds| mantissa right until a zero exponent exists. 1651da177e4SLinus Torvalds| 1661da177e4SLinus Torvaldsfix_dnrm: 1671da177e4SLinus Torvalds cmpiw #0xffc0,%d1 |lower bound for normalization 1681da177e4SLinus Torvalds blt fix_unfl |if lower, catastrophic unfl 1691da177e4SLinus Torvalds movew %d1,%d0 |use d0 for exp 1701da177e4SLinus Torvalds movel %d2,-(%a7) |free d2 for norm 1711da177e4SLinus Torvalds movel FPTEMP_HI(%a6),%d1 1721da177e4SLinus Torvalds movel FPTEMP_LO(%a6),%d2 1731da177e4SLinus Torvalds clrl L_SCR2(%a6) 1741da177e4SLinus Torvaldsfix_loop: 1751da177e4SLinus Torvalds addw #1,%d0 |drive d0 to 0 1761da177e4SLinus Torvalds lsrl #1,%d1 |while shifting the 1771da177e4SLinus Torvalds roxrl #1,%d2 |mantissa to the right 1781da177e4SLinus Torvalds bccs no_carry 1791da177e4SLinus Torvalds st L_SCR2(%a6) |use L_SCR2 to capture inex 1801da177e4SLinus Torvaldsno_carry: 1811da177e4SLinus Torvalds tstw %d0 |it is finished when 1821da177e4SLinus Torvalds blts fix_loop |d0 is zero or the mantissa 1831da177e4SLinus Torvalds tstb L_SCR2(%a6) 1841da177e4SLinus Torvalds beqs tst_zero 1851da177e4SLinus Torvalds orl #unfl_inx_mask,USER_FPSR(%a6) 1861da177e4SLinus Torvalds| ;set unfl, aunfl, ainex 1871da177e4SLinus Torvalds| 1881da177e4SLinus Torvalds| Test for zero. If zero, simply use fmove to return +/- zero 1891da177e4SLinus Torvalds| to the fpu. 1901da177e4SLinus Torvalds| 1911da177e4SLinus Torvaldstst_zero: 1921da177e4SLinus Torvalds clrw FPTEMP_EX(%a6) 1931da177e4SLinus Torvalds tstb L_SCR1(%a6) |test for sign 1941da177e4SLinus Torvalds beqs tst_con 1951da177e4SLinus Torvalds orw #0x8000,FPTEMP_EX(%a6) |set sign bit 1961da177e4SLinus Torvaldstst_con: 1971da177e4SLinus Torvalds movel %d1,FPTEMP_HI(%a6) 1981da177e4SLinus Torvalds movel %d2,FPTEMP_LO(%a6) 1991da177e4SLinus Torvalds movel (%a7)+,%d2 2001da177e4SLinus Torvalds tstl %d1 2011da177e4SLinus Torvalds bnes not_zero 2021da177e4SLinus Torvalds tstl FPTEMP_LO(%a6) 2031da177e4SLinus Torvalds bnes not_zero 2041da177e4SLinus Torvalds| 2051da177e4SLinus Torvalds| Result is zero. Check for rounding mode to set lsb. If the 2061da177e4SLinus Torvalds| mode is rp, and the zero is positive, return smallest denorm. 2071da177e4SLinus Torvalds| If the mode is rm, and the zero is negative, return smallest 2081da177e4SLinus Torvalds| negative denorm. 2091da177e4SLinus Torvalds| 2101da177e4SLinus Torvalds btstb #5,FPCR_MODE(%a6) |test if rm or rp 2111da177e4SLinus Torvalds beqs no_dir 2121da177e4SLinus Torvalds btstb #4,FPCR_MODE(%a6) |check which one 2131da177e4SLinus Torvalds beqs zer_rm 2141da177e4SLinus Torvaldszer_rp: 2151da177e4SLinus Torvalds tstb L_SCR1(%a6) |check sign 2161da177e4SLinus Torvalds bnes no_dir |if set, neg op, no inc 2171da177e4SLinus Torvalds movel #1,FPTEMP_LO(%a6) |set lsb 2181da177e4SLinus Torvalds bras sm_dnrm 2191da177e4SLinus Torvaldszer_rm: 2201da177e4SLinus Torvalds tstb L_SCR1(%a6) |check sign 2211da177e4SLinus Torvalds beqs no_dir |if clr, neg op, no inc 2221da177e4SLinus Torvalds movel #1,FPTEMP_LO(%a6) |set lsb 2231da177e4SLinus Torvalds orl #neg_mask,USER_FPSR(%a6) |set N 2241da177e4SLinus Torvalds bras sm_dnrm 2251da177e4SLinus Torvaldsno_dir: 2261da177e4SLinus Torvalds fmovel USER_FPCR(%a6),%FPCR 2271da177e4SLinus Torvalds fmovex FPTEMP(%a6),%fp0 |use fmove to set cc's 2281da177e4SLinus Torvalds rts 2291da177e4SLinus Torvalds 2301da177e4SLinus Torvalds| 2311da177e4SLinus Torvalds| The rounding mode changed the zero to a smallest denorm. Call 2321da177e4SLinus Torvalds| t_resdnrm with exceptional operand in ETEMP. 2331da177e4SLinus Torvalds| 2341da177e4SLinus Torvaldssm_dnrm: 2351da177e4SLinus Torvalds movel FPTEMP_EX(%a6),ETEMP_EX(%a6) 2361da177e4SLinus Torvalds movel FPTEMP_HI(%a6),ETEMP_HI(%a6) 2371da177e4SLinus Torvalds movel FPTEMP_LO(%a6),ETEMP_LO(%a6) 2381da177e4SLinus Torvalds leal ETEMP(%a6),%a0 2391da177e4SLinus Torvalds bra t_resdnrm 2401da177e4SLinus Torvalds 2411da177e4SLinus Torvalds| 2421da177e4SLinus Torvalds| Result is still denormalized. 2431da177e4SLinus Torvalds| 2441da177e4SLinus Torvaldsnot_zero: 2451da177e4SLinus Torvalds orl #unfl_mask,USER_FPSR(%a6) |set unfl 2461da177e4SLinus Torvalds tstb L_SCR1(%a6) |check for sign 2471da177e4SLinus Torvalds beqs fix_exit 2481da177e4SLinus Torvalds orl #neg_mask,USER_FPSR(%a6) |set N 2491da177e4SLinus Torvaldsfix_exit: 2501da177e4SLinus Torvalds bras sm_dnrm 2511da177e4SLinus Torvalds 2521da177e4SLinus Torvalds 2531da177e4SLinus Torvalds| 2541da177e4SLinus Torvalds| The result has underflowed to zero. Return zero and set 2551da177e4SLinus Torvalds| unfl, aunfl, and ainex. 2561da177e4SLinus Torvalds| 2571da177e4SLinus Torvaldsfix_unfl: 2581da177e4SLinus Torvalds orl #unfl_inx_mask,USER_FPSR(%a6) 2591da177e4SLinus Torvalds btstb #5,FPCR_MODE(%a6) |test if rm or rp 2601da177e4SLinus Torvalds beqs no_dir2 2611da177e4SLinus Torvalds btstb #4,FPCR_MODE(%a6) |check which one 2621da177e4SLinus Torvalds beqs zer_rm2 2631da177e4SLinus Torvaldszer_rp2: 2641da177e4SLinus Torvalds tstb L_SCR1(%a6) |check sign 2651da177e4SLinus Torvalds bnes no_dir2 |if set, neg op, no inc 2661da177e4SLinus Torvalds clrl FPTEMP_EX(%a6) 2671da177e4SLinus Torvalds clrl FPTEMP_HI(%a6) 2681da177e4SLinus Torvalds movel #1,FPTEMP_LO(%a6) |set lsb 2691da177e4SLinus Torvalds bras sm_dnrm |return smallest denorm 2701da177e4SLinus Torvaldszer_rm2: 2711da177e4SLinus Torvalds tstb L_SCR1(%a6) |check sign 2721da177e4SLinus Torvalds beqs no_dir2 |if clr, neg op, no inc 2731da177e4SLinus Torvalds movew #0x8000,FPTEMP_EX(%a6) 2741da177e4SLinus Torvalds clrl FPTEMP_HI(%a6) 2751da177e4SLinus Torvalds movel #1,FPTEMP_LO(%a6) |set lsb 2761da177e4SLinus Torvalds orl #neg_mask,USER_FPSR(%a6) |set N 2771da177e4SLinus Torvalds bra sm_dnrm |return smallest denorm 2781da177e4SLinus Torvalds 2791da177e4SLinus Torvaldsno_dir2: 2801da177e4SLinus Torvalds tstb L_SCR1(%a6) 2811da177e4SLinus Torvalds bges pos_zero 2821da177e4SLinus Torvaldsneg_zero: 2831da177e4SLinus Torvalds clrl FP_SCR1(%a6) |clear the exceptional operand 2841da177e4SLinus Torvalds clrl FP_SCR1+4(%a6) |for gen_except. 2851da177e4SLinus Torvalds clrl FP_SCR1+8(%a6) 2861da177e4SLinus Torvalds fmoves #0x80000000,%fp0 2871da177e4SLinus Torvalds rts 2881da177e4SLinus Torvaldspos_zero: 2891da177e4SLinus Torvalds clrl FP_SCR1(%a6) |clear the exceptional operand 2901da177e4SLinus Torvalds clrl FP_SCR1+4(%a6) |for gen_except. 2911da177e4SLinus Torvalds clrl FP_SCR1+8(%a6) 2921da177e4SLinus Torvalds fmoves #0x00000000,%fp0 2931da177e4SLinus Torvalds rts 2941da177e4SLinus Torvalds 2951da177e4SLinus Torvalds| 2961da177e4SLinus Torvalds| The destination is a denormalized number. It must be handled 2971da177e4SLinus Torvalds| by first shifting the bits in the mantissa until it is normalized, 2981da177e4SLinus Torvalds| then adding the remainder of the source to the exponent. 2991da177e4SLinus Torvalds| 3001da177e4SLinus Torvaldsdst_dnrm: 3011da177e4SLinus Torvalds moveml %d2/%d3,-(%a7) 3021da177e4SLinus Torvalds movew FPTEMP_EX(%a6),%d1 3031da177e4SLinus Torvalds movel FPTEMP_HI(%a6),%d2 3041da177e4SLinus Torvalds movel FPTEMP_LO(%a6),%d3 3051da177e4SLinus Torvaldsdst_loop: 3061da177e4SLinus Torvalds tstl %d2 |test for normalized result 3071da177e4SLinus Torvalds blts dst_norm |exit loop if so 3081da177e4SLinus Torvalds tstl %d0 |otherwise, test shift count 3091da177e4SLinus Torvalds beqs dst_fin |if zero, shifting is done 3101da177e4SLinus Torvalds subil #1,%d0 |dec src 3111da177e4SLinus Torvalds lsll #1,%d3 3121da177e4SLinus Torvalds roxll #1,%d2 3131da177e4SLinus Torvalds bras dst_loop 3141da177e4SLinus Torvalds| 3151da177e4SLinus Torvalds| Destination became normalized. Simply add the remaining 3161da177e4SLinus Torvalds| portion of the src to the exponent. 3171da177e4SLinus Torvalds| 3181da177e4SLinus Torvaldsdst_norm: 3191da177e4SLinus Torvalds addw %d0,%d1 |dst is normalized; add src 3201da177e4SLinus Torvalds tstb L_SCR1(%a6) 3211da177e4SLinus Torvalds beqs dnrm_pos 3221da177e4SLinus Torvalds orl #0x8000,%d1 3231da177e4SLinus Torvaldsdnrm_pos: 3241da177e4SLinus Torvalds movemw %d1,FPTEMP_EX(%a6) 3251da177e4SLinus Torvalds moveml %d2,FPTEMP_HI(%a6) 3261da177e4SLinus Torvalds moveml %d3,FPTEMP_LO(%a6) 3271da177e4SLinus Torvalds fmovel USER_FPCR(%a6),%FPCR 3281da177e4SLinus Torvalds fmovex FPTEMP(%a6),%fp0 3291da177e4SLinus Torvalds moveml (%a7)+,%d2/%d3 3301da177e4SLinus Torvalds rts 3311da177e4SLinus Torvalds 3321da177e4SLinus Torvalds| 3331da177e4SLinus Torvalds| Destination remained denormalized. Call t_excdnrm with 3341da177e4SLinus Torvalds| exceptional operand in ETEMP. 3351da177e4SLinus Torvalds| 3361da177e4SLinus Torvaldsdst_fin: 3371da177e4SLinus Torvalds tstb L_SCR1(%a6) |check for sign 3381da177e4SLinus Torvalds beqs dst_exit 3391da177e4SLinus Torvalds orl #neg_mask,USER_FPSR(%a6) |set N 3401da177e4SLinus Torvalds orl #0x8000,%d1 3411da177e4SLinus Torvaldsdst_exit: 3421da177e4SLinus Torvalds movemw %d1,ETEMP_EX(%a6) 3431da177e4SLinus Torvalds moveml %d2,ETEMP_HI(%a6) 3441da177e4SLinus Torvalds moveml %d3,ETEMP_LO(%a6) 3451da177e4SLinus Torvalds orl #unfl_mask,USER_FPSR(%a6) |set unfl 3461da177e4SLinus Torvalds moveml (%a7)+,%d2/%d3 3471da177e4SLinus Torvalds leal ETEMP(%a6),%a0 3481da177e4SLinus Torvalds bra t_resdnrm 3491da177e4SLinus Torvalds 3501da177e4SLinus Torvalds| 3511da177e4SLinus Torvalds| Source is outside of 2^14 range. Test the sign and branch 3521da177e4SLinus Torvalds| to the appropriate exception handler. 3531da177e4SLinus Torvalds| 3541da177e4SLinus Torvaldssrc_out: 3551da177e4SLinus Torvalds tstb L_SCR1(%a6) 3561da177e4SLinus Torvalds beqs scro_pos 3571da177e4SLinus Torvalds orl #0x8000,%d1 3581da177e4SLinus Torvaldsscro_pos: 3591da177e4SLinus Torvalds movel FPTEMP_HI(%a6),ETEMP_HI(%a6) 3601da177e4SLinus Torvalds movel FPTEMP_LO(%a6),ETEMP_LO(%a6) 3611da177e4SLinus Torvalds tstw ETEMP(%a6) 3621da177e4SLinus Torvalds blts res_neg 3631da177e4SLinus Torvaldsres_pos: 3641da177e4SLinus Torvalds movew %d1,ETEMP(%a6) |result in ETEMP 3651da177e4SLinus Torvalds bra t_ovfl2 3661da177e4SLinus Torvaldsres_neg: 3671da177e4SLinus Torvalds movew %d1,ETEMP(%a6) |result in ETEMP 3681da177e4SLinus Torvalds leal ETEMP(%a6),%a0 3691da177e4SLinus Torvalds bra t_unfl 3701da177e4SLinus Torvalds |end 371