11da177e4SLinus Torvalds| 21da177e4SLinus Torvalds| util.sa 3.7 7/29/91 31da177e4SLinus Torvalds| 41da177e4SLinus Torvalds| This file contains routines used by other programs. 51da177e4SLinus Torvalds| 61da177e4SLinus Torvalds| ovf_res: used by overflow to force the correct 71da177e4SLinus Torvalds| result. ovf_r_k, ovf_r_x2, ovf_r_x3 are 81da177e4SLinus Torvalds| derivatives of this routine. 91da177e4SLinus Torvalds| get_fline: get user's opcode word 101da177e4SLinus Torvalds| g_dfmtou: returns the destination format. 111da177e4SLinus Torvalds| g_opcls: returns the opclass of the float instruction. 121da177e4SLinus Torvalds| g_rndpr: returns the rounding precision. 131da177e4SLinus Torvalds| reg_dest: write byte, word, or long data to Dn 141da177e4SLinus Torvalds| 151da177e4SLinus Torvalds| 161da177e4SLinus Torvalds| Copyright (C) Motorola, Inc. 1990 171da177e4SLinus Torvalds| All Rights Reserved 181da177e4SLinus Torvalds| 19*e00d82d0SMatt Waddel| For details on the license for this file, please see the 20*e00d82d0SMatt Waddel| file, README, in this same directory. 211da177e4SLinus Torvalds 221da177e4SLinus Torvalds|UTIL idnt 2,1 | Motorola 040 Floating Point Software Package 231da177e4SLinus Torvalds 241da177e4SLinus Torvalds |section 8 251da177e4SLinus Torvalds 261da177e4SLinus Torvalds#include "fpsp.h" 271da177e4SLinus Torvalds 281da177e4SLinus Torvalds |xref mem_read 291da177e4SLinus Torvalds 301da177e4SLinus Torvalds .global g_dfmtou 311da177e4SLinus Torvalds .global g_opcls 321da177e4SLinus Torvalds .global g_rndpr 331da177e4SLinus Torvalds .global get_fline 341da177e4SLinus Torvalds .global reg_dest 351da177e4SLinus Torvalds 361da177e4SLinus Torvalds| 371da177e4SLinus Torvalds| Final result table for ovf_res. Note that the negative counterparts 381da177e4SLinus Torvalds| are unnecessary as ovf_res always returns the sign separately from 391da177e4SLinus Torvalds| the exponent. 401da177e4SLinus Torvalds| ;+inf 411da177e4SLinus TorvaldsEXT_PINF: .long 0x7fff0000,0x00000000,0x00000000,0x00000000 421da177e4SLinus Torvalds| ;largest +ext 431da177e4SLinus TorvaldsEXT_PLRG: .long 0x7ffe0000,0xffffffff,0xffffffff,0x00000000 441da177e4SLinus Torvalds| ;largest magnitude +sgl in ext 451da177e4SLinus TorvaldsSGL_PLRG: .long 0x407e0000,0xffffff00,0x00000000,0x00000000 461da177e4SLinus Torvalds| ;largest magnitude +dbl in ext 471da177e4SLinus TorvaldsDBL_PLRG: .long 0x43fe0000,0xffffffff,0xfffff800,0x00000000 481da177e4SLinus Torvalds| ;largest -ext 491da177e4SLinus Torvalds 501da177e4SLinus Torvaldstblovfl: 511da177e4SLinus Torvalds .long EXT_RN 521da177e4SLinus Torvalds .long EXT_RZ 531da177e4SLinus Torvalds .long EXT_RM 541da177e4SLinus Torvalds .long EXT_RP 551da177e4SLinus Torvalds .long SGL_RN 561da177e4SLinus Torvalds .long SGL_RZ 571da177e4SLinus Torvalds .long SGL_RM 581da177e4SLinus Torvalds .long SGL_RP 591da177e4SLinus Torvalds .long DBL_RN 601da177e4SLinus Torvalds .long DBL_RZ 611da177e4SLinus Torvalds .long DBL_RM 621da177e4SLinus Torvalds .long DBL_RP 631da177e4SLinus Torvalds .long error 641da177e4SLinus Torvalds .long error 651da177e4SLinus Torvalds .long error 661da177e4SLinus Torvalds .long error 671da177e4SLinus Torvalds 681da177e4SLinus Torvalds 691da177e4SLinus Torvalds| 701da177e4SLinus Torvalds| ovf_r_k --- overflow result calculation 711da177e4SLinus Torvalds| 721da177e4SLinus Torvalds| This entry point is used by kernel_ex. 731da177e4SLinus Torvalds| 741da177e4SLinus Torvalds| This forces the destination precision to be extended 751da177e4SLinus Torvalds| 761da177e4SLinus Torvalds| Input: operand in ETEMP 771da177e4SLinus Torvalds| Output: a result is in ETEMP (internal extended format) 781da177e4SLinus Torvalds| 791da177e4SLinus Torvalds .global ovf_r_k 801da177e4SLinus Torvaldsovf_r_k: 811da177e4SLinus Torvalds lea ETEMP(%a6),%a0 |a0 points to source operand 821da177e4SLinus Torvalds bclrb #sign_bit,ETEMP_EX(%a6) 831da177e4SLinus Torvalds sne ETEMP_SGN(%a6) |convert to internal IEEE format 841da177e4SLinus Torvalds 851da177e4SLinus Torvalds| 861da177e4SLinus Torvalds| ovf_r_x2 --- overflow result calculation 871da177e4SLinus Torvalds| 881da177e4SLinus Torvalds| This entry point used by x_ovfl. (opclass 0 and 2) 891da177e4SLinus Torvalds| 901da177e4SLinus Torvalds| Input a0 points to an operand in the internal extended format 911da177e4SLinus Torvalds| Output a0 points to the result in the internal extended format 921da177e4SLinus Torvalds| 931da177e4SLinus Torvalds| This sets the round precision according to the user's FPCR unless the 941da177e4SLinus Torvalds| instruction is fsgldiv or fsglmul or fsadd, fdadd, fsub, fdsub, fsmul, 951da177e4SLinus Torvalds| fdmul, fsdiv, fddiv, fssqrt, fsmove, fdmove, fsabs, fdabs, fsneg, fdneg. 961da177e4SLinus Torvalds| If the instruction is fsgldiv of fsglmul, the rounding precision must be 971da177e4SLinus Torvalds| extended. If the instruction is not fsgldiv or fsglmul but a force- 981da177e4SLinus Torvalds| precision instruction, the rounding precision is then set to the force 991da177e4SLinus Torvalds| precision. 1001da177e4SLinus Torvalds 1011da177e4SLinus Torvalds .global ovf_r_x2 1021da177e4SLinus Torvaldsovf_r_x2: 1031da177e4SLinus Torvalds btstb #E3,E_BYTE(%a6) |check for nu exception 1041da177e4SLinus Torvalds beql ovf_e1_exc |it is cu exception 1051da177e4SLinus Torvaldsovf_e3_exc: 1061da177e4SLinus Torvalds movew CMDREG3B(%a6),%d0 |get the command word 1071da177e4SLinus Torvalds andiw #0x00000060,%d0 |clear all bits except 6 and 5 1081da177e4SLinus Torvalds cmpil #0x00000040,%d0 1091da177e4SLinus Torvalds beql ovff_sgl |force precision is single 1101da177e4SLinus Torvalds cmpil #0x00000060,%d0 1111da177e4SLinus Torvalds beql ovff_dbl |force precision is double 1121da177e4SLinus Torvalds movew CMDREG3B(%a6),%d0 |get the command word again 1131da177e4SLinus Torvalds andil #0x7f,%d0 |clear all except operation 1141da177e4SLinus Torvalds cmpil #0x33,%d0 1151da177e4SLinus Torvalds beql ovf_fsgl |fsglmul or fsgldiv 1161da177e4SLinus Torvalds cmpil #0x30,%d0 1171da177e4SLinus Torvalds beql ovf_fsgl 1181da177e4SLinus Torvalds bra ovf_fpcr |instruction is none of the above 1191da177e4SLinus Torvalds| ;use FPCR 1201da177e4SLinus Torvaldsovf_e1_exc: 1211da177e4SLinus Torvalds movew CMDREG1B(%a6),%d0 |get command word 1221da177e4SLinus Torvalds andil #0x00000044,%d0 |clear all bits except 6 and 2 1231da177e4SLinus Torvalds cmpil #0x00000040,%d0 1241da177e4SLinus Torvalds beql ovff_sgl |the instruction is force single 1251da177e4SLinus Torvalds cmpil #0x00000044,%d0 1261da177e4SLinus Torvalds beql ovff_dbl |the instruction is force double 1271da177e4SLinus Torvalds movew CMDREG1B(%a6),%d0 |again get the command word 1281da177e4SLinus Torvalds andil #0x0000007f,%d0 |clear all except the op code 1291da177e4SLinus Torvalds cmpil #0x00000027,%d0 1301da177e4SLinus Torvalds beql ovf_fsgl |fsglmul 1311da177e4SLinus Torvalds cmpil #0x00000024,%d0 1321da177e4SLinus Torvalds beql ovf_fsgl |fsgldiv 1331da177e4SLinus Torvalds bra ovf_fpcr |none of the above, use FPCR 1341da177e4SLinus Torvalds| 1351da177e4SLinus Torvalds| 1361da177e4SLinus Torvalds| Inst is either fsgldiv or fsglmul. Force extended precision. 1371da177e4SLinus Torvalds| 1381da177e4SLinus Torvaldsovf_fsgl: 1391da177e4SLinus Torvalds clrl %d0 1401da177e4SLinus Torvalds bra ovf_res 1411da177e4SLinus Torvalds 1421da177e4SLinus Torvaldsovff_sgl: 1431da177e4SLinus Torvalds movel #0x00000001,%d0 |set single 1441da177e4SLinus Torvalds bra ovf_res 1451da177e4SLinus Torvaldsovff_dbl: 1461da177e4SLinus Torvalds movel #0x00000002,%d0 |set double 1471da177e4SLinus Torvalds bra ovf_res 1481da177e4SLinus Torvalds| 1491da177e4SLinus Torvalds| The precision is in the fpcr. 1501da177e4SLinus Torvalds| 1511da177e4SLinus Torvaldsovf_fpcr: 1521da177e4SLinus Torvalds bfextu FPCR_MODE(%a6){#0:#2},%d0 |set round precision 1531da177e4SLinus Torvalds bra ovf_res 1541da177e4SLinus Torvalds 1551da177e4SLinus Torvalds| 1561da177e4SLinus Torvalds| 1571da177e4SLinus Torvalds| ovf_r_x3 --- overflow result calculation 1581da177e4SLinus Torvalds| 1591da177e4SLinus Torvalds| This entry point used by x_ovfl. (opclass 3 only) 1601da177e4SLinus Torvalds| 1611da177e4SLinus Torvalds| Input a0 points to an operand in the internal extended format 1621da177e4SLinus Torvalds| Output a0 points to the result in the internal extended format 1631da177e4SLinus Torvalds| 1641da177e4SLinus Torvalds| This sets the round precision according to the destination size. 1651da177e4SLinus Torvalds| 1661da177e4SLinus Torvalds .global ovf_r_x3 1671da177e4SLinus Torvaldsovf_r_x3: 1681da177e4SLinus Torvalds bsr g_dfmtou |get dest fmt in d0{1:0} 1691da177e4SLinus Torvalds| ;for fmovout, the destination format 1701da177e4SLinus Torvalds| ;is the rounding precision 1711da177e4SLinus Torvalds 1721da177e4SLinus Torvalds| 1731da177e4SLinus Torvalds| ovf_res --- overflow result calculation 1741da177e4SLinus Torvalds| 1751da177e4SLinus Torvalds| Input: 1761da177e4SLinus Torvalds| a0 points to operand in internal extended format 1771da177e4SLinus Torvalds| Output: 1781da177e4SLinus Torvalds| a0 points to result in internal extended format 1791da177e4SLinus Torvalds| 1801da177e4SLinus Torvalds .global ovf_res 1811da177e4SLinus Torvaldsovf_res: 1821da177e4SLinus Torvalds lsll #2,%d0 |move round precision to d0{3:2} 1831da177e4SLinus Torvalds bfextu FPCR_MODE(%a6){#2:#2},%d1 |set round mode 1841da177e4SLinus Torvalds orl %d1,%d0 |index is fmt:mode in d0{3:0} 1851da177e4SLinus Torvalds leal tblovfl,%a1 |load a1 with table address 1861da177e4SLinus Torvalds movel %a1@(%d0:l:4),%a1 |use d0 as index to the table 1871da177e4SLinus Torvalds jmp (%a1) |go to the correct routine 1881da177e4SLinus Torvalds| 1891da177e4SLinus Torvalds|case DEST_FMT = EXT 1901da177e4SLinus Torvalds| 1911da177e4SLinus TorvaldsEXT_RN: 1921da177e4SLinus Torvalds leal EXT_PINF,%a1 |answer is +/- infinity 1931da177e4SLinus Torvalds bsetb #inf_bit,FPSR_CC(%a6) 1941da177e4SLinus Torvalds bra set_sign |now go set the sign 1951da177e4SLinus TorvaldsEXT_RZ: 1961da177e4SLinus Torvalds leal EXT_PLRG,%a1 |answer is +/- large number 1971da177e4SLinus Torvalds bra set_sign |now go set the sign 1981da177e4SLinus TorvaldsEXT_RM: 1991da177e4SLinus Torvalds tstb LOCAL_SGN(%a0) |if negative overflow 2001da177e4SLinus Torvalds beqs e_rm_pos 2011da177e4SLinus Torvaldse_rm_neg: 2021da177e4SLinus Torvalds leal EXT_PINF,%a1 |answer is negative infinity 2031da177e4SLinus Torvalds orl #neginf_mask,USER_FPSR(%a6) 2041da177e4SLinus Torvalds bra end_ovfr 2051da177e4SLinus Torvaldse_rm_pos: 2061da177e4SLinus Torvalds leal EXT_PLRG,%a1 |answer is large positive number 2071da177e4SLinus Torvalds bra end_ovfr 2081da177e4SLinus TorvaldsEXT_RP: 2091da177e4SLinus Torvalds tstb LOCAL_SGN(%a0) |if negative overflow 2101da177e4SLinus Torvalds beqs e_rp_pos 2111da177e4SLinus Torvaldse_rp_neg: 2121da177e4SLinus Torvalds leal EXT_PLRG,%a1 |answer is large negative number 2131da177e4SLinus Torvalds bsetb #neg_bit,FPSR_CC(%a6) 2141da177e4SLinus Torvalds bra end_ovfr 2151da177e4SLinus Torvaldse_rp_pos: 2161da177e4SLinus Torvalds leal EXT_PINF,%a1 |answer is positive infinity 2171da177e4SLinus Torvalds bsetb #inf_bit,FPSR_CC(%a6) 2181da177e4SLinus Torvalds bra end_ovfr 2191da177e4SLinus Torvalds| 2201da177e4SLinus Torvalds|case DEST_FMT = DBL 2211da177e4SLinus Torvalds| 2221da177e4SLinus TorvaldsDBL_RN: 2231da177e4SLinus Torvalds leal EXT_PINF,%a1 |answer is +/- infinity 2241da177e4SLinus Torvalds bsetb #inf_bit,FPSR_CC(%a6) 2251da177e4SLinus Torvalds bra set_sign 2261da177e4SLinus TorvaldsDBL_RZ: 2271da177e4SLinus Torvalds leal DBL_PLRG,%a1 |answer is +/- large number 2281da177e4SLinus Torvalds bra set_sign |now go set the sign 2291da177e4SLinus TorvaldsDBL_RM: 2301da177e4SLinus Torvalds tstb LOCAL_SGN(%a0) |if negative overflow 2311da177e4SLinus Torvalds beqs d_rm_pos 2321da177e4SLinus Torvaldsd_rm_neg: 2331da177e4SLinus Torvalds leal EXT_PINF,%a1 |answer is negative infinity 2341da177e4SLinus Torvalds orl #neginf_mask,USER_FPSR(%a6) 2351da177e4SLinus Torvalds bra end_ovfr |inf is same for all precisions (ext,dbl,sgl) 2361da177e4SLinus Torvaldsd_rm_pos: 2371da177e4SLinus Torvalds leal DBL_PLRG,%a1 |answer is large positive number 2381da177e4SLinus Torvalds bra end_ovfr 2391da177e4SLinus TorvaldsDBL_RP: 2401da177e4SLinus Torvalds tstb LOCAL_SGN(%a0) |if negative overflow 2411da177e4SLinus Torvalds beqs d_rp_pos 2421da177e4SLinus Torvaldsd_rp_neg: 2431da177e4SLinus Torvalds leal DBL_PLRG,%a1 |answer is large negative number 2441da177e4SLinus Torvalds bsetb #neg_bit,FPSR_CC(%a6) 2451da177e4SLinus Torvalds bra end_ovfr 2461da177e4SLinus Torvaldsd_rp_pos: 2471da177e4SLinus Torvalds leal EXT_PINF,%a1 |answer is positive infinity 2481da177e4SLinus Torvalds bsetb #inf_bit,FPSR_CC(%a6) 2491da177e4SLinus Torvalds bra end_ovfr 2501da177e4SLinus Torvalds| 2511da177e4SLinus Torvalds|case DEST_FMT = SGL 2521da177e4SLinus Torvalds| 2531da177e4SLinus TorvaldsSGL_RN: 2541da177e4SLinus Torvalds leal EXT_PINF,%a1 |answer is +/- infinity 2551da177e4SLinus Torvalds bsetb #inf_bit,FPSR_CC(%a6) 2561da177e4SLinus Torvalds bras set_sign 2571da177e4SLinus TorvaldsSGL_RZ: 2581da177e4SLinus Torvalds leal SGL_PLRG,%a1 |answer is +/- large number 2591da177e4SLinus Torvalds bras set_sign 2601da177e4SLinus TorvaldsSGL_RM: 2611da177e4SLinus Torvalds tstb LOCAL_SGN(%a0) |if negative overflow 2621da177e4SLinus Torvalds beqs s_rm_pos 2631da177e4SLinus Torvaldss_rm_neg: 2641da177e4SLinus Torvalds leal EXT_PINF,%a1 |answer is negative infinity 2651da177e4SLinus Torvalds orl #neginf_mask,USER_FPSR(%a6) 2661da177e4SLinus Torvalds bras end_ovfr 2671da177e4SLinus Torvaldss_rm_pos: 2681da177e4SLinus Torvalds leal SGL_PLRG,%a1 |answer is large positive number 2691da177e4SLinus Torvalds bras end_ovfr 2701da177e4SLinus TorvaldsSGL_RP: 2711da177e4SLinus Torvalds tstb LOCAL_SGN(%a0) |if negative overflow 2721da177e4SLinus Torvalds beqs s_rp_pos 2731da177e4SLinus Torvaldss_rp_neg: 2741da177e4SLinus Torvalds leal SGL_PLRG,%a1 |answer is large negative number 2751da177e4SLinus Torvalds bsetb #neg_bit,FPSR_CC(%a6) 2761da177e4SLinus Torvalds bras end_ovfr 2771da177e4SLinus Torvaldss_rp_pos: 2781da177e4SLinus Torvalds leal EXT_PINF,%a1 |answer is positive infinity 2791da177e4SLinus Torvalds bsetb #inf_bit,FPSR_CC(%a6) 2801da177e4SLinus Torvalds bras end_ovfr 2811da177e4SLinus Torvalds 2821da177e4SLinus Torvaldsset_sign: 2831da177e4SLinus Torvalds tstb LOCAL_SGN(%a0) |if negative overflow 2841da177e4SLinus Torvalds beqs end_ovfr 2851da177e4SLinus Torvaldsneg_sign: 2861da177e4SLinus Torvalds bsetb #neg_bit,FPSR_CC(%a6) 2871da177e4SLinus Torvalds 2881da177e4SLinus Torvaldsend_ovfr: 2891da177e4SLinus Torvalds movew LOCAL_EX(%a1),LOCAL_EX(%a0) |do not overwrite sign 2901da177e4SLinus Torvalds movel LOCAL_HI(%a1),LOCAL_HI(%a0) 2911da177e4SLinus Torvalds movel LOCAL_LO(%a1),LOCAL_LO(%a0) 2921da177e4SLinus Torvalds rts 2931da177e4SLinus Torvalds 2941da177e4SLinus Torvalds 2951da177e4SLinus Torvalds| 2961da177e4SLinus Torvalds| ERROR 2971da177e4SLinus Torvalds| 2981da177e4SLinus Torvaldserror: 2991da177e4SLinus Torvalds rts 3001da177e4SLinus Torvalds| 3011da177e4SLinus Torvalds| get_fline --- get f-line opcode of interrupted instruction 3021da177e4SLinus Torvalds| 3031da177e4SLinus Torvalds| Returns opcode in the low word of d0. 3041da177e4SLinus Torvalds| 3051da177e4SLinus Torvaldsget_fline: 3061da177e4SLinus Torvalds movel USER_FPIAR(%a6),%a0 |opcode address 3071da177e4SLinus Torvalds movel #0,-(%a7) |reserve a word on the stack 3081da177e4SLinus Torvalds leal 2(%a7),%a1 |point to low word of temporary 3091da177e4SLinus Torvalds movel #2,%d0 |count 3101da177e4SLinus Torvalds bsrl mem_read 3111da177e4SLinus Torvalds movel (%a7)+,%d0 3121da177e4SLinus Torvalds rts 3131da177e4SLinus Torvalds| 3141da177e4SLinus Torvalds| g_rndpr --- put rounding precision in d0{1:0} 3151da177e4SLinus Torvalds| 3161da177e4SLinus Torvalds| valid return codes are: 3171da177e4SLinus Torvalds| 00 - extended 3181da177e4SLinus Torvalds| 01 - single 3191da177e4SLinus Torvalds| 10 - double 3201da177e4SLinus Torvalds| 3211da177e4SLinus Torvalds| begin 3221da177e4SLinus Torvalds| get rounding precision (cmdreg3b{6:5}) 3231da177e4SLinus Torvalds| begin 3241da177e4SLinus Torvalds| case opclass = 011 (move out) 3251da177e4SLinus Torvalds| get destination format - this is the also the rounding precision 3261da177e4SLinus Torvalds| 3271da177e4SLinus Torvalds| case opclass = 0x0 3281da177e4SLinus Torvalds| if E3 3291da177e4SLinus Torvalds| *case RndPr(from cmdreg3b{6:5} = 11 then RND_PREC = DBL 3301da177e4SLinus Torvalds| *case RndPr(from cmdreg3b{6:5} = 10 then RND_PREC = SGL 3311da177e4SLinus Torvalds| case RndPr(from cmdreg3b{6:5} = 00 | 01 3321da177e4SLinus Torvalds| use precision from FPCR{7:6} 3331da177e4SLinus Torvalds| case 00 then RND_PREC = EXT 3341da177e4SLinus Torvalds| case 01 then RND_PREC = SGL 3351da177e4SLinus Torvalds| case 10 then RND_PREC = DBL 3361da177e4SLinus Torvalds| else E1 3371da177e4SLinus Torvalds| use precision in FPCR{7:6} 3381da177e4SLinus Torvalds| case 00 then RND_PREC = EXT 3391da177e4SLinus Torvalds| case 01 then RND_PREC = SGL 3401da177e4SLinus Torvalds| case 10 then RND_PREC = DBL 3411da177e4SLinus Torvalds| end 3421da177e4SLinus Torvalds| 3431da177e4SLinus Torvaldsg_rndpr: 3441da177e4SLinus Torvalds bsr g_opcls |get opclass in d0{2:0} 3451da177e4SLinus Torvalds cmpw #0x0003,%d0 |check for opclass 011 3461da177e4SLinus Torvalds bnes op_0x0 3471da177e4SLinus Torvalds 3481da177e4SLinus Torvalds| 3491da177e4SLinus Torvalds| For move out instructions (opclass 011) the destination format 3501da177e4SLinus Torvalds| is the same as the rounding precision. Pass results from g_dfmtou. 3511da177e4SLinus Torvalds| 3521da177e4SLinus Torvalds bsr g_dfmtou 3531da177e4SLinus Torvalds rts 3541da177e4SLinus Torvaldsop_0x0: 3551da177e4SLinus Torvalds btstb #E3,E_BYTE(%a6) 3561da177e4SLinus Torvalds beql unf_e1_exc |branch to e1 underflow 3571da177e4SLinus Torvaldsunf_e3_exc: 3581da177e4SLinus Torvalds movel CMDREG3B(%a6),%d0 |rounding precision in d0{10:9} 3591da177e4SLinus Torvalds bfextu %d0{#9:#2},%d0 |move the rounding prec bits to d0{1:0} 3601da177e4SLinus Torvalds cmpil #0x2,%d0 3611da177e4SLinus Torvalds beql unff_sgl |force precision is single 3621da177e4SLinus Torvalds cmpil #0x3,%d0 |force precision is double 3631da177e4SLinus Torvalds beql unff_dbl 3641da177e4SLinus Torvalds movew CMDREG3B(%a6),%d0 |get the command word again 3651da177e4SLinus Torvalds andil #0x7f,%d0 |clear all except operation 3661da177e4SLinus Torvalds cmpil #0x33,%d0 3671da177e4SLinus Torvalds beql unf_fsgl |fsglmul or fsgldiv 3681da177e4SLinus Torvalds cmpil #0x30,%d0 3691da177e4SLinus Torvalds beql unf_fsgl |fsgldiv or fsglmul 3701da177e4SLinus Torvalds bra unf_fpcr 3711da177e4SLinus Torvaldsunf_e1_exc: 3721da177e4SLinus Torvalds movel CMDREG1B(%a6),%d0 |get 32 bits off the stack, 1st 16 bits 3731da177e4SLinus Torvalds| ;are the command word 3741da177e4SLinus Torvalds andil #0x00440000,%d0 |clear all bits except bits 6 and 2 3751da177e4SLinus Torvalds cmpil #0x00400000,%d0 3761da177e4SLinus Torvalds beql unff_sgl |force single 3771da177e4SLinus Torvalds cmpil #0x00440000,%d0 |force double 3781da177e4SLinus Torvalds beql unff_dbl 3791da177e4SLinus Torvalds movel CMDREG1B(%a6),%d0 |get the command word again 3801da177e4SLinus Torvalds andil #0x007f0000,%d0 |clear all bits except the operation 3811da177e4SLinus Torvalds cmpil #0x00270000,%d0 3821da177e4SLinus Torvalds beql unf_fsgl |fsglmul 3831da177e4SLinus Torvalds cmpil #0x00240000,%d0 3841da177e4SLinus Torvalds beql unf_fsgl |fsgldiv 3851da177e4SLinus Torvalds bra unf_fpcr 3861da177e4SLinus Torvalds 3871da177e4SLinus Torvalds| 3881da177e4SLinus Torvalds| Convert to return format. The values from cmdreg3b and the return 3891da177e4SLinus Torvalds| values are: 3901da177e4SLinus Torvalds| cmdreg3b return precision 3911da177e4SLinus Torvalds| -------- ------ --------- 3921da177e4SLinus Torvalds| 00,01 0 ext 3931da177e4SLinus Torvalds| 10 1 sgl 3941da177e4SLinus Torvalds| 11 2 dbl 3951da177e4SLinus Torvalds| Force single 3961da177e4SLinus Torvalds| 3971da177e4SLinus Torvaldsunff_sgl: 3981da177e4SLinus Torvalds movel #1,%d0 |return 1 3991da177e4SLinus Torvalds rts 4001da177e4SLinus Torvalds| 4011da177e4SLinus Torvalds| Force double 4021da177e4SLinus Torvalds| 4031da177e4SLinus Torvaldsunff_dbl: 4041da177e4SLinus Torvalds movel #2,%d0 |return 2 4051da177e4SLinus Torvalds rts 4061da177e4SLinus Torvalds| 4071da177e4SLinus Torvalds| Force extended 4081da177e4SLinus Torvalds| 4091da177e4SLinus Torvaldsunf_fsgl: 4101da177e4SLinus Torvalds movel #0,%d0 4111da177e4SLinus Torvalds rts 4121da177e4SLinus Torvalds| 4131da177e4SLinus Torvalds| Get rounding precision set in FPCR{7:6}. 4141da177e4SLinus Torvalds| 4151da177e4SLinus Torvaldsunf_fpcr: 4161da177e4SLinus Torvalds movel USER_FPCR(%a6),%d0 |rounding precision bits in d0{7:6} 4171da177e4SLinus Torvalds bfextu %d0{#24:#2},%d0 |move the rounding prec bits to d0{1:0} 4181da177e4SLinus Torvalds rts 4191da177e4SLinus Torvalds| 4201da177e4SLinus Torvalds| g_opcls --- put opclass in d0{2:0} 4211da177e4SLinus Torvalds| 4221da177e4SLinus Torvaldsg_opcls: 4231da177e4SLinus Torvalds btstb #E3,E_BYTE(%a6) 4241da177e4SLinus Torvalds beqs opc_1b |if set, go to cmdreg1b 4251da177e4SLinus Torvaldsopc_3b: 4261da177e4SLinus Torvalds clrl %d0 |if E3, only opclass 0x0 is possible 4271da177e4SLinus Torvalds rts 4281da177e4SLinus Torvaldsopc_1b: 4291da177e4SLinus Torvalds movel CMDREG1B(%a6),%d0 4301da177e4SLinus Torvalds bfextu %d0{#0:#3},%d0 |shift opclass bits d0{31:29} to d0{2:0} 4311da177e4SLinus Torvalds rts 4321da177e4SLinus Torvalds| 4331da177e4SLinus Torvalds| g_dfmtou --- put destination format in d0{1:0} 4341da177e4SLinus Torvalds| 4351da177e4SLinus Torvalds| If E1, the format is from cmdreg1b{12:10} 4361da177e4SLinus Torvalds| If E3, the format is extended. 4371da177e4SLinus Torvalds| 4381da177e4SLinus Torvalds| Dest. Fmt. 4391da177e4SLinus Torvalds| extended 010 -> 00 4401da177e4SLinus Torvalds| single 001 -> 01 4411da177e4SLinus Torvalds| double 101 -> 10 4421da177e4SLinus Torvalds| 4431da177e4SLinus Torvaldsg_dfmtou: 4441da177e4SLinus Torvalds btstb #E3,E_BYTE(%a6) 4451da177e4SLinus Torvalds beqs op011 4461da177e4SLinus Torvalds clrl %d0 |if E1, size is always ext 4471da177e4SLinus Torvalds rts 4481da177e4SLinus Torvaldsop011: 4491da177e4SLinus Torvalds movel CMDREG1B(%a6),%d0 4501da177e4SLinus Torvalds bfextu %d0{#3:#3},%d0 |dest fmt from cmdreg1b{12:10} 4511da177e4SLinus Torvalds cmpb #1,%d0 |check for single 4521da177e4SLinus Torvalds bnes not_sgl 4531da177e4SLinus Torvalds movel #1,%d0 4541da177e4SLinus Torvalds rts 4551da177e4SLinus Torvaldsnot_sgl: 4561da177e4SLinus Torvalds cmpb #5,%d0 |check for double 4571da177e4SLinus Torvalds bnes not_dbl 4581da177e4SLinus Torvalds movel #2,%d0 4591da177e4SLinus Torvalds rts 4601da177e4SLinus Torvaldsnot_dbl: 4611da177e4SLinus Torvalds clrl %d0 |must be extended 4621da177e4SLinus Torvalds rts 4631da177e4SLinus Torvalds 4641da177e4SLinus Torvalds| 4651da177e4SLinus Torvalds| 4661da177e4SLinus Torvalds| Final result table for unf_sub. Note that the negative counterparts 4671da177e4SLinus Torvalds| are unnecessary as unf_sub always returns the sign separately from 4681da177e4SLinus Torvalds| the exponent. 4691da177e4SLinus Torvalds| ;+zero 4701da177e4SLinus TorvaldsEXT_PZRO: .long 0x00000000,0x00000000,0x00000000,0x00000000 4711da177e4SLinus Torvalds| ;+zero 4721da177e4SLinus TorvaldsSGL_PZRO: .long 0x3f810000,0x00000000,0x00000000,0x00000000 4731da177e4SLinus Torvalds| ;+zero 4741da177e4SLinus TorvaldsDBL_PZRO: .long 0x3c010000,0x00000000,0x00000000,0x00000000 4751da177e4SLinus Torvalds| ;smallest +ext denorm 4761da177e4SLinus TorvaldsEXT_PSML: .long 0x00000000,0x00000000,0x00000001,0x00000000 4771da177e4SLinus Torvalds| ;smallest +sgl denorm 4781da177e4SLinus TorvaldsSGL_PSML: .long 0x3f810000,0x00000100,0x00000000,0x00000000 4791da177e4SLinus Torvalds| ;smallest +dbl denorm 4801da177e4SLinus TorvaldsDBL_PSML: .long 0x3c010000,0x00000000,0x00000800,0x00000000 4811da177e4SLinus Torvalds| 4821da177e4SLinus Torvalds| UNF_SUB --- underflow result calculation 4831da177e4SLinus Torvalds| 4841da177e4SLinus Torvalds| Input: 4851da177e4SLinus Torvalds| d0 contains round precision 4861da177e4SLinus Torvalds| a0 points to input operand in the internal extended format 4871da177e4SLinus Torvalds| 4881da177e4SLinus Torvalds| Output: 4891da177e4SLinus Torvalds| a0 points to correct internal extended precision result. 4901da177e4SLinus Torvalds| 4911da177e4SLinus Torvalds 4921da177e4SLinus Torvaldstblunf: 4931da177e4SLinus Torvalds .long uEXT_RN 4941da177e4SLinus Torvalds .long uEXT_RZ 4951da177e4SLinus Torvalds .long uEXT_RM 4961da177e4SLinus Torvalds .long uEXT_RP 4971da177e4SLinus Torvalds .long uSGL_RN 4981da177e4SLinus Torvalds .long uSGL_RZ 4991da177e4SLinus Torvalds .long uSGL_RM 5001da177e4SLinus Torvalds .long uSGL_RP 5011da177e4SLinus Torvalds .long uDBL_RN 5021da177e4SLinus Torvalds .long uDBL_RZ 5031da177e4SLinus Torvalds .long uDBL_RM 5041da177e4SLinus Torvalds .long uDBL_RP 5051da177e4SLinus Torvalds .long uDBL_RN 5061da177e4SLinus Torvalds .long uDBL_RZ 5071da177e4SLinus Torvalds .long uDBL_RM 5081da177e4SLinus Torvalds .long uDBL_RP 5091da177e4SLinus Torvalds 5101da177e4SLinus Torvalds .global unf_sub 5111da177e4SLinus Torvaldsunf_sub: 5121da177e4SLinus Torvalds lsll #2,%d0 |move round precision to d0{3:2} 5131da177e4SLinus Torvalds bfextu FPCR_MODE(%a6){#2:#2},%d1 |set round mode 5141da177e4SLinus Torvalds orl %d1,%d0 |index is fmt:mode in d0{3:0} 5151da177e4SLinus Torvalds leal tblunf,%a1 |load a1 with table address 5161da177e4SLinus Torvalds movel %a1@(%d0:l:4),%a1 |use d0 as index to the table 5171da177e4SLinus Torvalds jmp (%a1) |go to the correct routine 5181da177e4SLinus Torvalds| 5191da177e4SLinus Torvalds|case DEST_FMT = EXT 5201da177e4SLinus Torvalds| 5211da177e4SLinus TorvaldsuEXT_RN: 5221da177e4SLinus Torvalds leal EXT_PZRO,%a1 |answer is +/- zero 5231da177e4SLinus Torvalds bsetb #z_bit,FPSR_CC(%a6) 5241da177e4SLinus Torvalds bra uset_sign |now go set the sign 5251da177e4SLinus TorvaldsuEXT_RZ: 5261da177e4SLinus Torvalds leal EXT_PZRO,%a1 |answer is +/- zero 5271da177e4SLinus Torvalds bsetb #z_bit,FPSR_CC(%a6) 5281da177e4SLinus Torvalds bra uset_sign |now go set the sign 5291da177e4SLinus TorvaldsuEXT_RM: 5301da177e4SLinus Torvalds tstb LOCAL_SGN(%a0) |if negative underflow 5311da177e4SLinus Torvalds beqs ue_rm_pos 5321da177e4SLinus Torvaldsue_rm_neg: 5331da177e4SLinus Torvalds leal EXT_PSML,%a1 |answer is negative smallest denorm 5341da177e4SLinus Torvalds bsetb #neg_bit,FPSR_CC(%a6) 5351da177e4SLinus Torvalds bra end_unfr 5361da177e4SLinus Torvaldsue_rm_pos: 5371da177e4SLinus Torvalds leal EXT_PZRO,%a1 |answer is positive zero 5381da177e4SLinus Torvalds bsetb #z_bit,FPSR_CC(%a6) 5391da177e4SLinus Torvalds bra end_unfr 5401da177e4SLinus TorvaldsuEXT_RP: 5411da177e4SLinus Torvalds tstb LOCAL_SGN(%a0) |if negative underflow 5421da177e4SLinus Torvalds beqs ue_rp_pos 5431da177e4SLinus Torvaldsue_rp_neg: 5441da177e4SLinus Torvalds leal EXT_PZRO,%a1 |answer is negative zero 5451da177e4SLinus Torvalds oril #negz_mask,USER_FPSR(%a6) 5461da177e4SLinus Torvalds bra end_unfr 5471da177e4SLinus Torvaldsue_rp_pos: 5481da177e4SLinus Torvalds leal EXT_PSML,%a1 |answer is positive smallest denorm 5491da177e4SLinus Torvalds bra end_unfr 5501da177e4SLinus Torvalds| 5511da177e4SLinus Torvalds|case DEST_FMT = DBL 5521da177e4SLinus Torvalds| 5531da177e4SLinus TorvaldsuDBL_RN: 5541da177e4SLinus Torvalds leal DBL_PZRO,%a1 |answer is +/- zero 5551da177e4SLinus Torvalds bsetb #z_bit,FPSR_CC(%a6) 5561da177e4SLinus Torvalds bra uset_sign 5571da177e4SLinus TorvaldsuDBL_RZ: 5581da177e4SLinus Torvalds leal DBL_PZRO,%a1 |answer is +/- zero 5591da177e4SLinus Torvalds bsetb #z_bit,FPSR_CC(%a6) 5601da177e4SLinus Torvalds bra uset_sign |now go set the sign 5611da177e4SLinus TorvaldsuDBL_RM: 5621da177e4SLinus Torvalds tstb LOCAL_SGN(%a0) |if negative overflow 5631da177e4SLinus Torvalds beqs ud_rm_pos 5641da177e4SLinus Torvaldsud_rm_neg: 5651da177e4SLinus Torvalds leal DBL_PSML,%a1 |answer is smallest denormalized negative 5661da177e4SLinus Torvalds bsetb #neg_bit,FPSR_CC(%a6) 5671da177e4SLinus Torvalds bra end_unfr 5681da177e4SLinus Torvaldsud_rm_pos: 5691da177e4SLinus Torvalds leal DBL_PZRO,%a1 |answer is positive zero 5701da177e4SLinus Torvalds bsetb #z_bit,FPSR_CC(%a6) 5711da177e4SLinus Torvalds bra end_unfr 5721da177e4SLinus TorvaldsuDBL_RP: 5731da177e4SLinus Torvalds tstb LOCAL_SGN(%a0) |if negative overflow 5741da177e4SLinus Torvalds beqs ud_rp_pos 5751da177e4SLinus Torvaldsud_rp_neg: 5761da177e4SLinus Torvalds leal DBL_PZRO,%a1 |answer is negative zero 5771da177e4SLinus Torvalds oril #negz_mask,USER_FPSR(%a6) 5781da177e4SLinus Torvalds bra end_unfr 5791da177e4SLinus Torvaldsud_rp_pos: 5801da177e4SLinus Torvalds leal DBL_PSML,%a1 |answer is smallest denormalized negative 5811da177e4SLinus Torvalds bra end_unfr 5821da177e4SLinus Torvalds| 5831da177e4SLinus Torvalds|case DEST_FMT = SGL 5841da177e4SLinus Torvalds| 5851da177e4SLinus TorvaldsuSGL_RN: 5861da177e4SLinus Torvalds leal SGL_PZRO,%a1 |answer is +/- zero 5871da177e4SLinus Torvalds bsetb #z_bit,FPSR_CC(%a6) 5881da177e4SLinus Torvalds bras uset_sign 5891da177e4SLinus TorvaldsuSGL_RZ: 5901da177e4SLinus Torvalds leal SGL_PZRO,%a1 |answer is +/- zero 5911da177e4SLinus Torvalds bsetb #z_bit,FPSR_CC(%a6) 5921da177e4SLinus Torvalds bras uset_sign 5931da177e4SLinus TorvaldsuSGL_RM: 5941da177e4SLinus Torvalds tstb LOCAL_SGN(%a0) |if negative overflow 5951da177e4SLinus Torvalds beqs us_rm_pos 5961da177e4SLinus Torvaldsus_rm_neg: 5971da177e4SLinus Torvalds leal SGL_PSML,%a1 |answer is smallest denormalized negative 5981da177e4SLinus Torvalds bsetb #neg_bit,FPSR_CC(%a6) 5991da177e4SLinus Torvalds bras end_unfr 6001da177e4SLinus Torvaldsus_rm_pos: 6011da177e4SLinus Torvalds leal SGL_PZRO,%a1 |answer is positive zero 6021da177e4SLinus Torvalds bsetb #z_bit,FPSR_CC(%a6) 6031da177e4SLinus Torvalds bras end_unfr 6041da177e4SLinus TorvaldsuSGL_RP: 6051da177e4SLinus Torvalds tstb LOCAL_SGN(%a0) |if negative overflow 6061da177e4SLinus Torvalds beqs us_rp_pos 6071da177e4SLinus Torvaldsus_rp_neg: 6081da177e4SLinus Torvalds leal SGL_PZRO,%a1 |answer is negative zero 6091da177e4SLinus Torvalds oril #negz_mask,USER_FPSR(%a6) 6101da177e4SLinus Torvalds bras end_unfr 6111da177e4SLinus Torvaldsus_rp_pos: 6121da177e4SLinus Torvalds leal SGL_PSML,%a1 |answer is smallest denormalized positive 6131da177e4SLinus Torvalds bras end_unfr 6141da177e4SLinus Torvalds 6151da177e4SLinus Torvaldsuset_sign: 6161da177e4SLinus Torvalds tstb LOCAL_SGN(%a0) |if negative overflow 6171da177e4SLinus Torvalds beqs end_unfr 6181da177e4SLinus Torvaldsuneg_sign: 6191da177e4SLinus Torvalds bsetb #neg_bit,FPSR_CC(%a6) 6201da177e4SLinus Torvalds 6211da177e4SLinus Torvaldsend_unfr: 6221da177e4SLinus Torvalds movew LOCAL_EX(%a1),LOCAL_EX(%a0) |be careful not to overwrite sign 6231da177e4SLinus Torvalds movel LOCAL_HI(%a1),LOCAL_HI(%a0) 6241da177e4SLinus Torvalds movel LOCAL_LO(%a1),LOCAL_LO(%a0) 6251da177e4SLinus Torvalds rts 6261da177e4SLinus Torvalds| 6271da177e4SLinus Torvalds| reg_dest --- write byte, word, or long data to Dn 6281da177e4SLinus Torvalds| 6291da177e4SLinus Torvalds| 6301da177e4SLinus Torvalds| Input: 6311da177e4SLinus Torvalds| L_SCR1: Data 6321da177e4SLinus Torvalds| d1: data size and dest register number formatted as: 6331da177e4SLinus Torvalds| 6341da177e4SLinus Torvalds| 32 5 4 3 2 1 0 6351da177e4SLinus Torvalds| ----------------------------------------------- 6361da177e4SLinus Torvalds| | 0 | Size | Dest Reg # | 6371da177e4SLinus Torvalds| ----------------------------------------------- 6381da177e4SLinus Torvalds| 6391da177e4SLinus Torvalds| Size is: 6401da177e4SLinus Torvalds| 0 - Byte 6411da177e4SLinus Torvalds| 1 - Word 6421da177e4SLinus Torvalds| 2 - Long/Single 6431da177e4SLinus Torvalds| 6441da177e4SLinus Torvaldspregdst: 6451da177e4SLinus Torvalds .long byte_d0 6461da177e4SLinus Torvalds .long byte_d1 6471da177e4SLinus Torvalds .long byte_d2 6481da177e4SLinus Torvalds .long byte_d3 6491da177e4SLinus Torvalds .long byte_d4 6501da177e4SLinus Torvalds .long byte_d5 6511da177e4SLinus Torvalds .long byte_d6 6521da177e4SLinus Torvalds .long byte_d7 6531da177e4SLinus Torvalds .long word_d0 6541da177e4SLinus Torvalds .long word_d1 6551da177e4SLinus Torvalds .long word_d2 6561da177e4SLinus Torvalds .long word_d3 6571da177e4SLinus Torvalds .long word_d4 6581da177e4SLinus Torvalds .long word_d5 6591da177e4SLinus Torvalds .long word_d6 6601da177e4SLinus Torvalds .long word_d7 6611da177e4SLinus Torvalds .long long_d0 6621da177e4SLinus Torvalds .long long_d1 6631da177e4SLinus Torvalds .long long_d2 6641da177e4SLinus Torvalds .long long_d3 6651da177e4SLinus Torvalds .long long_d4 6661da177e4SLinus Torvalds .long long_d5 6671da177e4SLinus Torvalds .long long_d6 6681da177e4SLinus Torvalds .long long_d7 6691da177e4SLinus Torvalds 6701da177e4SLinus Torvaldsreg_dest: 6711da177e4SLinus Torvalds leal pregdst,%a0 6721da177e4SLinus Torvalds movel %a0@(%d1:l:4),%a0 6731da177e4SLinus Torvalds jmp (%a0) 6741da177e4SLinus Torvalds 6751da177e4SLinus Torvaldsbyte_d0: 6761da177e4SLinus Torvalds moveb L_SCR1(%a6),USER_D0+3(%a6) 6771da177e4SLinus Torvalds rts 6781da177e4SLinus Torvaldsbyte_d1: 6791da177e4SLinus Torvalds moveb L_SCR1(%a6),USER_D1+3(%a6) 6801da177e4SLinus Torvalds rts 6811da177e4SLinus Torvaldsbyte_d2: 6821da177e4SLinus Torvalds moveb L_SCR1(%a6),%d2 6831da177e4SLinus Torvalds rts 6841da177e4SLinus Torvaldsbyte_d3: 6851da177e4SLinus Torvalds moveb L_SCR1(%a6),%d3 6861da177e4SLinus Torvalds rts 6871da177e4SLinus Torvaldsbyte_d4: 6881da177e4SLinus Torvalds moveb L_SCR1(%a6),%d4 6891da177e4SLinus Torvalds rts 6901da177e4SLinus Torvaldsbyte_d5: 6911da177e4SLinus Torvalds moveb L_SCR1(%a6),%d5 6921da177e4SLinus Torvalds rts 6931da177e4SLinus Torvaldsbyte_d6: 6941da177e4SLinus Torvalds moveb L_SCR1(%a6),%d6 6951da177e4SLinus Torvalds rts 6961da177e4SLinus Torvaldsbyte_d7: 6971da177e4SLinus Torvalds moveb L_SCR1(%a6),%d7 6981da177e4SLinus Torvalds rts 6991da177e4SLinus Torvaldsword_d0: 7001da177e4SLinus Torvalds movew L_SCR1(%a6),USER_D0+2(%a6) 7011da177e4SLinus Torvalds rts 7021da177e4SLinus Torvaldsword_d1: 7031da177e4SLinus Torvalds movew L_SCR1(%a6),USER_D1+2(%a6) 7041da177e4SLinus Torvalds rts 7051da177e4SLinus Torvaldsword_d2: 7061da177e4SLinus Torvalds movew L_SCR1(%a6),%d2 7071da177e4SLinus Torvalds rts 7081da177e4SLinus Torvaldsword_d3: 7091da177e4SLinus Torvalds movew L_SCR1(%a6),%d3 7101da177e4SLinus Torvalds rts 7111da177e4SLinus Torvaldsword_d4: 7121da177e4SLinus Torvalds movew L_SCR1(%a6),%d4 7131da177e4SLinus Torvalds rts 7141da177e4SLinus Torvaldsword_d5: 7151da177e4SLinus Torvalds movew L_SCR1(%a6),%d5 7161da177e4SLinus Torvalds rts 7171da177e4SLinus Torvaldsword_d6: 7181da177e4SLinus Torvalds movew L_SCR1(%a6),%d6 7191da177e4SLinus Torvalds rts 7201da177e4SLinus Torvaldsword_d7: 7211da177e4SLinus Torvalds movew L_SCR1(%a6),%d7 7221da177e4SLinus Torvalds rts 7231da177e4SLinus Torvaldslong_d0: 7241da177e4SLinus Torvalds movel L_SCR1(%a6),USER_D0(%a6) 7251da177e4SLinus Torvalds rts 7261da177e4SLinus Torvaldslong_d1: 7271da177e4SLinus Torvalds movel L_SCR1(%a6),USER_D1(%a6) 7281da177e4SLinus Torvalds rts 7291da177e4SLinus Torvaldslong_d2: 7301da177e4SLinus Torvalds movel L_SCR1(%a6),%d2 7311da177e4SLinus Torvalds rts 7321da177e4SLinus Torvaldslong_d3: 7331da177e4SLinus Torvalds movel L_SCR1(%a6),%d3 7341da177e4SLinus Torvalds rts 7351da177e4SLinus Torvaldslong_d4: 7361da177e4SLinus Torvalds movel L_SCR1(%a6),%d4 7371da177e4SLinus Torvalds rts 7381da177e4SLinus Torvaldslong_d5: 7391da177e4SLinus Torvalds movel L_SCR1(%a6),%d5 7401da177e4SLinus Torvalds rts 7411da177e4SLinus Torvaldslong_d6: 7421da177e4SLinus Torvalds movel L_SCR1(%a6),%d6 7431da177e4SLinus Torvalds rts 7441da177e4SLinus Torvaldslong_d7: 7451da177e4SLinus Torvalds movel L_SCR1(%a6),%d7 7461da177e4SLinus Torvalds rts 7471da177e4SLinus Torvalds |end 748