162306a36Sopenharmony_ci| 262306a36Sopenharmony_ci| scale.sa 3.3 7/30/91 362306a36Sopenharmony_ci| 462306a36Sopenharmony_ci| The entry point sSCALE computes the destination operand 562306a36Sopenharmony_ci| scaled by the source operand. If the absolute value of 662306a36Sopenharmony_ci| the source operand is (>= 2^14) an overflow or underflow 762306a36Sopenharmony_ci| is returned. 862306a36Sopenharmony_ci| 962306a36Sopenharmony_ci| The entry point sscale is called from do_func to emulate 1062306a36Sopenharmony_ci| the fscale unimplemented instruction. 1162306a36Sopenharmony_ci| 1262306a36Sopenharmony_ci| Input: Double-extended destination operand in FPTEMP, 1362306a36Sopenharmony_ci| double-extended source operand in ETEMP. 1462306a36Sopenharmony_ci| 1562306a36Sopenharmony_ci| Output: The function returns scale(X,Y) to fp0. 1662306a36Sopenharmony_ci| 1762306a36Sopenharmony_ci| Modifies: fp0. 1862306a36Sopenharmony_ci| 1962306a36Sopenharmony_ci| Algorithm: 2062306a36Sopenharmony_ci| 2162306a36Sopenharmony_ci| Copyright (C) Motorola, Inc. 1990 2262306a36Sopenharmony_ci| All Rights Reserved 2362306a36Sopenharmony_ci| 2462306a36Sopenharmony_ci| For details on the license for this file, please see the 2562306a36Sopenharmony_ci| file, README, in this same directory. 2662306a36Sopenharmony_ci 2762306a36Sopenharmony_ci|SCALE idnt 2,1 | Motorola 040 Floating Point Software Package 2862306a36Sopenharmony_ci 2962306a36Sopenharmony_ci |section 8 3062306a36Sopenharmony_ci 3162306a36Sopenharmony_ci#include "fpsp.h" 3262306a36Sopenharmony_ci 3362306a36Sopenharmony_ci |xref t_ovfl2 3462306a36Sopenharmony_ci |xref t_unfl 3562306a36Sopenharmony_ci |xref round 3662306a36Sopenharmony_ci |xref t_resdnrm 3762306a36Sopenharmony_ci 3862306a36Sopenharmony_ciSRC_BNDS: .short 0x3fff,0x400c 3962306a36Sopenharmony_ci 4062306a36Sopenharmony_ci| 4162306a36Sopenharmony_ci| This entry point is used by the unimplemented instruction exception 4262306a36Sopenharmony_ci| handler. 4362306a36Sopenharmony_ci| 4462306a36Sopenharmony_ci| 4562306a36Sopenharmony_ci| 4662306a36Sopenharmony_ci| FSCALE 4762306a36Sopenharmony_ci| 4862306a36Sopenharmony_ci .global sscale 4962306a36Sopenharmony_cisscale: 5062306a36Sopenharmony_ci fmovel #0,%fpcr |clr user enabled exc 5162306a36Sopenharmony_ci clrl %d1 5262306a36Sopenharmony_ci movew FPTEMP(%a6),%d1 |get dest exponent 5362306a36Sopenharmony_ci smi L_SCR1(%a6) |use L_SCR1 to hold sign 5462306a36Sopenharmony_ci andil #0x7fff,%d1 |strip sign 5562306a36Sopenharmony_ci movew ETEMP(%a6),%d0 |check src bounds 5662306a36Sopenharmony_ci andiw #0x7fff,%d0 |clr sign bit 5762306a36Sopenharmony_ci cmp2w SRC_BNDS,%d0 5862306a36Sopenharmony_ci bccs src_in 5962306a36Sopenharmony_ci cmpiw #0x400c,%d0 |test for too large 6062306a36Sopenharmony_ci bge src_out 6162306a36Sopenharmony_ci| 6262306a36Sopenharmony_ci| The source input is below 1, so we check for denormalized numbers 6362306a36Sopenharmony_ci| and set unfl. 6462306a36Sopenharmony_ci| 6562306a36Sopenharmony_cisrc_small: 6662306a36Sopenharmony_ci moveb DTAG(%a6),%d0 6762306a36Sopenharmony_ci andib #0xe0,%d0 6862306a36Sopenharmony_ci tstb %d0 6962306a36Sopenharmony_ci beqs no_denorm 7062306a36Sopenharmony_ci st STORE_FLG(%a6) |dest already contains result 7162306a36Sopenharmony_ci orl #unfl_mask,USER_FPSR(%a6) |set UNFL 7262306a36Sopenharmony_ciden_done: 7362306a36Sopenharmony_ci leal FPTEMP(%a6),%a0 7462306a36Sopenharmony_ci bra t_resdnrm 7562306a36Sopenharmony_cino_denorm: 7662306a36Sopenharmony_ci fmovel USER_FPCR(%a6),%FPCR 7762306a36Sopenharmony_ci fmovex FPTEMP(%a6),%fp0 |simply return dest 7862306a36Sopenharmony_ci rts 7962306a36Sopenharmony_ci 8062306a36Sopenharmony_ci 8162306a36Sopenharmony_ci| 8262306a36Sopenharmony_ci| Source is within 2^14 range. To perform the int operation, 8362306a36Sopenharmony_ci| move it to d0. 8462306a36Sopenharmony_ci| 8562306a36Sopenharmony_cisrc_in: 8662306a36Sopenharmony_ci fmovex ETEMP(%a6),%fp0 |move in src for int 8762306a36Sopenharmony_ci fmovel #rz_mode,%fpcr |force rz for src conversion 8862306a36Sopenharmony_ci fmovel %fp0,%d0 |int src to d0 8962306a36Sopenharmony_ci fmovel #0,%FPSR |clr status from above 9062306a36Sopenharmony_ci tstw ETEMP(%a6) |check src sign 9162306a36Sopenharmony_ci blt src_neg 9262306a36Sopenharmony_ci| 9362306a36Sopenharmony_ci| Source is positive. Add the src to the dest exponent. 9462306a36Sopenharmony_ci| The result can be denormalized, if src = 0, or overflow, 9562306a36Sopenharmony_ci| if the result of the add sets a bit in the upper word. 9662306a36Sopenharmony_ci| 9762306a36Sopenharmony_cisrc_pos: 9862306a36Sopenharmony_ci tstw %d1 |check for denorm 9962306a36Sopenharmony_ci beq dst_dnrm 10062306a36Sopenharmony_ci addl %d0,%d1 |add src to dest exp 10162306a36Sopenharmony_ci beqs denorm |if zero, result is denorm 10262306a36Sopenharmony_ci cmpil #0x7fff,%d1 |test for overflow 10362306a36Sopenharmony_ci bges ovfl 10462306a36Sopenharmony_ci tstb L_SCR1(%a6) 10562306a36Sopenharmony_ci beqs spos_pos 10662306a36Sopenharmony_ci orw #0x8000,%d1 10762306a36Sopenharmony_cispos_pos: 10862306a36Sopenharmony_ci movew %d1,FPTEMP(%a6) |result in FPTEMP 10962306a36Sopenharmony_ci fmovel USER_FPCR(%a6),%FPCR 11062306a36Sopenharmony_ci fmovex FPTEMP(%a6),%fp0 |write result to fp0 11162306a36Sopenharmony_ci rts 11262306a36Sopenharmony_ciovfl: 11362306a36Sopenharmony_ci tstb L_SCR1(%a6) 11462306a36Sopenharmony_ci beqs sovl_pos 11562306a36Sopenharmony_ci orw #0x8000,%d1 11662306a36Sopenharmony_cisovl_pos: 11762306a36Sopenharmony_ci movew FPTEMP(%a6),ETEMP(%a6) |result in ETEMP 11862306a36Sopenharmony_ci movel FPTEMP_HI(%a6),ETEMP_HI(%a6) 11962306a36Sopenharmony_ci movel FPTEMP_LO(%a6),ETEMP_LO(%a6) 12062306a36Sopenharmony_ci bra t_ovfl2 12162306a36Sopenharmony_ci 12262306a36Sopenharmony_cidenorm: 12362306a36Sopenharmony_ci tstb L_SCR1(%a6) 12462306a36Sopenharmony_ci beqs den_pos 12562306a36Sopenharmony_ci orw #0x8000,%d1 12662306a36Sopenharmony_ciden_pos: 12762306a36Sopenharmony_ci tstl FPTEMP_HI(%a6) |check j bit 12862306a36Sopenharmony_ci blts nden_exit |if set, not denorm 12962306a36Sopenharmony_ci movew %d1,ETEMP(%a6) |input expected in ETEMP 13062306a36Sopenharmony_ci movel FPTEMP_HI(%a6),ETEMP_HI(%a6) 13162306a36Sopenharmony_ci movel FPTEMP_LO(%a6),ETEMP_LO(%a6) 13262306a36Sopenharmony_ci orl #unfl_bit,USER_FPSR(%a6) |set unfl 13362306a36Sopenharmony_ci leal ETEMP(%a6),%a0 13462306a36Sopenharmony_ci bra t_resdnrm 13562306a36Sopenharmony_cinden_exit: 13662306a36Sopenharmony_ci movew %d1,FPTEMP(%a6) |result in FPTEMP 13762306a36Sopenharmony_ci fmovel USER_FPCR(%a6),%FPCR 13862306a36Sopenharmony_ci fmovex FPTEMP(%a6),%fp0 |write result to fp0 13962306a36Sopenharmony_ci rts 14062306a36Sopenharmony_ci 14162306a36Sopenharmony_ci| 14262306a36Sopenharmony_ci| Source is negative. Add the src to the dest exponent. 14362306a36Sopenharmony_ci| (The result exponent will be reduced). The result can be 14462306a36Sopenharmony_ci| denormalized. 14562306a36Sopenharmony_ci| 14662306a36Sopenharmony_cisrc_neg: 14762306a36Sopenharmony_ci addl %d0,%d1 |add src to dest 14862306a36Sopenharmony_ci beqs denorm |if zero, result is denorm 14962306a36Sopenharmony_ci blts fix_dnrm |if negative, result is 15062306a36Sopenharmony_ci| ;needing denormalization 15162306a36Sopenharmony_ci tstb L_SCR1(%a6) 15262306a36Sopenharmony_ci beqs sneg_pos 15362306a36Sopenharmony_ci orw #0x8000,%d1 15462306a36Sopenharmony_cisneg_pos: 15562306a36Sopenharmony_ci movew %d1,FPTEMP(%a6) |result in FPTEMP 15662306a36Sopenharmony_ci fmovel USER_FPCR(%a6),%FPCR 15762306a36Sopenharmony_ci fmovex FPTEMP(%a6),%fp0 |write result to fp0 15862306a36Sopenharmony_ci rts 15962306a36Sopenharmony_ci 16062306a36Sopenharmony_ci 16162306a36Sopenharmony_ci| 16262306a36Sopenharmony_ci| The result exponent is below denorm value. Test for catastrophic 16362306a36Sopenharmony_ci| underflow and force zero if true. If not, try to shift the 16462306a36Sopenharmony_ci| mantissa right until a zero exponent exists. 16562306a36Sopenharmony_ci| 16662306a36Sopenharmony_cifix_dnrm: 16762306a36Sopenharmony_ci cmpiw #0xffc0,%d1 |lower bound for normalization 16862306a36Sopenharmony_ci blt fix_unfl |if lower, catastrophic unfl 16962306a36Sopenharmony_ci movew %d1,%d0 |use d0 for exp 17062306a36Sopenharmony_ci movel %d2,-(%a7) |free d2 for norm 17162306a36Sopenharmony_ci movel FPTEMP_HI(%a6),%d1 17262306a36Sopenharmony_ci movel FPTEMP_LO(%a6),%d2 17362306a36Sopenharmony_ci clrl L_SCR2(%a6) 17462306a36Sopenharmony_cifix_loop: 17562306a36Sopenharmony_ci addw #1,%d0 |drive d0 to 0 17662306a36Sopenharmony_ci lsrl #1,%d1 |while shifting the 17762306a36Sopenharmony_ci roxrl #1,%d2 |mantissa to the right 17862306a36Sopenharmony_ci bccs no_carry 17962306a36Sopenharmony_ci st L_SCR2(%a6) |use L_SCR2 to capture inex 18062306a36Sopenharmony_cino_carry: 18162306a36Sopenharmony_ci tstw %d0 |it is finished when 18262306a36Sopenharmony_ci blts fix_loop |d0 is zero or the mantissa 18362306a36Sopenharmony_ci tstb L_SCR2(%a6) 18462306a36Sopenharmony_ci beqs tst_zero 18562306a36Sopenharmony_ci orl #unfl_inx_mask,USER_FPSR(%a6) 18662306a36Sopenharmony_ci| ;set unfl, aunfl, ainex 18762306a36Sopenharmony_ci| 18862306a36Sopenharmony_ci| Test for zero. If zero, simply use fmove to return +/- zero 18962306a36Sopenharmony_ci| to the fpu. 19062306a36Sopenharmony_ci| 19162306a36Sopenharmony_citst_zero: 19262306a36Sopenharmony_ci clrw FPTEMP_EX(%a6) 19362306a36Sopenharmony_ci tstb L_SCR1(%a6) |test for sign 19462306a36Sopenharmony_ci beqs tst_con 19562306a36Sopenharmony_ci orw #0x8000,FPTEMP_EX(%a6) |set sign bit 19662306a36Sopenharmony_citst_con: 19762306a36Sopenharmony_ci movel %d1,FPTEMP_HI(%a6) 19862306a36Sopenharmony_ci movel %d2,FPTEMP_LO(%a6) 19962306a36Sopenharmony_ci movel (%a7)+,%d2 20062306a36Sopenharmony_ci tstl %d1 20162306a36Sopenharmony_ci bnes not_zero 20262306a36Sopenharmony_ci tstl FPTEMP_LO(%a6) 20362306a36Sopenharmony_ci bnes not_zero 20462306a36Sopenharmony_ci| 20562306a36Sopenharmony_ci| Result is zero. Check for rounding mode to set lsb. If the 20662306a36Sopenharmony_ci| mode is rp, and the zero is positive, return smallest denorm. 20762306a36Sopenharmony_ci| If the mode is rm, and the zero is negative, return smallest 20862306a36Sopenharmony_ci| negative denorm. 20962306a36Sopenharmony_ci| 21062306a36Sopenharmony_ci btstb #5,FPCR_MODE(%a6) |test if rm or rp 21162306a36Sopenharmony_ci beqs no_dir 21262306a36Sopenharmony_ci btstb #4,FPCR_MODE(%a6) |check which one 21362306a36Sopenharmony_ci beqs zer_rm 21462306a36Sopenharmony_cizer_rp: 21562306a36Sopenharmony_ci tstb L_SCR1(%a6) |check sign 21662306a36Sopenharmony_ci bnes no_dir |if set, neg op, no inc 21762306a36Sopenharmony_ci movel #1,FPTEMP_LO(%a6) |set lsb 21862306a36Sopenharmony_ci bras sm_dnrm 21962306a36Sopenharmony_cizer_rm: 22062306a36Sopenharmony_ci tstb L_SCR1(%a6) |check sign 22162306a36Sopenharmony_ci beqs no_dir |if clr, neg op, no inc 22262306a36Sopenharmony_ci movel #1,FPTEMP_LO(%a6) |set lsb 22362306a36Sopenharmony_ci orl #neg_mask,USER_FPSR(%a6) |set N 22462306a36Sopenharmony_ci bras sm_dnrm 22562306a36Sopenharmony_cino_dir: 22662306a36Sopenharmony_ci fmovel USER_FPCR(%a6),%FPCR 22762306a36Sopenharmony_ci fmovex FPTEMP(%a6),%fp0 |use fmove to set cc's 22862306a36Sopenharmony_ci rts 22962306a36Sopenharmony_ci 23062306a36Sopenharmony_ci| 23162306a36Sopenharmony_ci| The rounding mode changed the zero to a smallest denorm. Call 23262306a36Sopenharmony_ci| t_resdnrm with exceptional operand in ETEMP. 23362306a36Sopenharmony_ci| 23462306a36Sopenharmony_cism_dnrm: 23562306a36Sopenharmony_ci movel FPTEMP_EX(%a6),ETEMP_EX(%a6) 23662306a36Sopenharmony_ci movel FPTEMP_HI(%a6),ETEMP_HI(%a6) 23762306a36Sopenharmony_ci movel FPTEMP_LO(%a6),ETEMP_LO(%a6) 23862306a36Sopenharmony_ci leal ETEMP(%a6),%a0 23962306a36Sopenharmony_ci bra t_resdnrm 24062306a36Sopenharmony_ci 24162306a36Sopenharmony_ci| 24262306a36Sopenharmony_ci| Result is still denormalized. 24362306a36Sopenharmony_ci| 24462306a36Sopenharmony_cinot_zero: 24562306a36Sopenharmony_ci orl #unfl_mask,USER_FPSR(%a6) |set unfl 24662306a36Sopenharmony_ci tstb L_SCR1(%a6) |check for sign 24762306a36Sopenharmony_ci beqs fix_exit 24862306a36Sopenharmony_ci orl #neg_mask,USER_FPSR(%a6) |set N 24962306a36Sopenharmony_cifix_exit: 25062306a36Sopenharmony_ci bras sm_dnrm 25162306a36Sopenharmony_ci 25262306a36Sopenharmony_ci 25362306a36Sopenharmony_ci| 25462306a36Sopenharmony_ci| The result has underflowed to zero. Return zero and set 25562306a36Sopenharmony_ci| unfl, aunfl, and ainex. 25662306a36Sopenharmony_ci| 25762306a36Sopenharmony_cifix_unfl: 25862306a36Sopenharmony_ci orl #unfl_inx_mask,USER_FPSR(%a6) 25962306a36Sopenharmony_ci btstb #5,FPCR_MODE(%a6) |test if rm or rp 26062306a36Sopenharmony_ci beqs no_dir2 26162306a36Sopenharmony_ci btstb #4,FPCR_MODE(%a6) |check which one 26262306a36Sopenharmony_ci beqs zer_rm2 26362306a36Sopenharmony_cizer_rp2: 26462306a36Sopenharmony_ci tstb L_SCR1(%a6) |check sign 26562306a36Sopenharmony_ci bnes no_dir2 |if set, neg op, no inc 26662306a36Sopenharmony_ci clrl FPTEMP_EX(%a6) 26762306a36Sopenharmony_ci clrl FPTEMP_HI(%a6) 26862306a36Sopenharmony_ci movel #1,FPTEMP_LO(%a6) |set lsb 26962306a36Sopenharmony_ci bras sm_dnrm |return smallest denorm 27062306a36Sopenharmony_cizer_rm2: 27162306a36Sopenharmony_ci tstb L_SCR1(%a6) |check sign 27262306a36Sopenharmony_ci beqs no_dir2 |if clr, neg op, no inc 27362306a36Sopenharmony_ci movew #0x8000,FPTEMP_EX(%a6) 27462306a36Sopenharmony_ci clrl FPTEMP_HI(%a6) 27562306a36Sopenharmony_ci movel #1,FPTEMP_LO(%a6) |set lsb 27662306a36Sopenharmony_ci orl #neg_mask,USER_FPSR(%a6) |set N 27762306a36Sopenharmony_ci bra sm_dnrm |return smallest denorm 27862306a36Sopenharmony_ci 27962306a36Sopenharmony_cino_dir2: 28062306a36Sopenharmony_ci tstb L_SCR1(%a6) 28162306a36Sopenharmony_ci bges pos_zero 28262306a36Sopenharmony_cineg_zero: 28362306a36Sopenharmony_ci clrl FP_SCR1(%a6) |clear the exceptional operand 28462306a36Sopenharmony_ci clrl FP_SCR1+4(%a6) |for gen_except. 28562306a36Sopenharmony_ci clrl FP_SCR1+8(%a6) 28662306a36Sopenharmony_ci fmoves #0x80000000,%fp0 28762306a36Sopenharmony_ci rts 28862306a36Sopenharmony_cipos_zero: 28962306a36Sopenharmony_ci clrl FP_SCR1(%a6) |clear the exceptional operand 29062306a36Sopenharmony_ci clrl FP_SCR1+4(%a6) |for gen_except. 29162306a36Sopenharmony_ci clrl FP_SCR1+8(%a6) 29262306a36Sopenharmony_ci fmoves #0x00000000,%fp0 29362306a36Sopenharmony_ci rts 29462306a36Sopenharmony_ci 29562306a36Sopenharmony_ci| 29662306a36Sopenharmony_ci| The destination is a denormalized number. It must be handled 29762306a36Sopenharmony_ci| by first shifting the bits in the mantissa until it is normalized, 29862306a36Sopenharmony_ci| then adding the remainder of the source to the exponent. 29962306a36Sopenharmony_ci| 30062306a36Sopenharmony_cidst_dnrm: 30162306a36Sopenharmony_ci moveml %d2/%d3,-(%a7) 30262306a36Sopenharmony_ci movew FPTEMP_EX(%a6),%d1 30362306a36Sopenharmony_ci movel FPTEMP_HI(%a6),%d2 30462306a36Sopenharmony_ci movel FPTEMP_LO(%a6),%d3 30562306a36Sopenharmony_cidst_loop: 30662306a36Sopenharmony_ci tstl %d2 |test for normalized result 30762306a36Sopenharmony_ci blts dst_norm |exit loop if so 30862306a36Sopenharmony_ci tstl %d0 |otherwise, test shift count 30962306a36Sopenharmony_ci beqs dst_fin |if zero, shifting is done 31062306a36Sopenharmony_ci subil #1,%d0 |dec src 31162306a36Sopenharmony_ci lsll #1,%d3 31262306a36Sopenharmony_ci roxll #1,%d2 31362306a36Sopenharmony_ci bras dst_loop 31462306a36Sopenharmony_ci| 31562306a36Sopenharmony_ci| Destination became normalized. Simply add the remaining 31662306a36Sopenharmony_ci| portion of the src to the exponent. 31762306a36Sopenharmony_ci| 31862306a36Sopenharmony_cidst_norm: 31962306a36Sopenharmony_ci addw %d0,%d1 |dst is normalized; add src 32062306a36Sopenharmony_ci tstb L_SCR1(%a6) 32162306a36Sopenharmony_ci beqs dnrm_pos 32262306a36Sopenharmony_ci orl #0x8000,%d1 32362306a36Sopenharmony_cidnrm_pos: 32462306a36Sopenharmony_ci movemw %d1,FPTEMP_EX(%a6) 32562306a36Sopenharmony_ci moveml %d2,FPTEMP_HI(%a6) 32662306a36Sopenharmony_ci moveml %d3,FPTEMP_LO(%a6) 32762306a36Sopenharmony_ci fmovel USER_FPCR(%a6),%FPCR 32862306a36Sopenharmony_ci fmovex FPTEMP(%a6),%fp0 32962306a36Sopenharmony_ci moveml (%a7)+,%d2/%d3 33062306a36Sopenharmony_ci rts 33162306a36Sopenharmony_ci 33262306a36Sopenharmony_ci| 33362306a36Sopenharmony_ci| Destination remained denormalized. Call t_excdnrm with 33462306a36Sopenharmony_ci| exceptional operand in ETEMP. 33562306a36Sopenharmony_ci| 33662306a36Sopenharmony_cidst_fin: 33762306a36Sopenharmony_ci tstb L_SCR1(%a6) |check for sign 33862306a36Sopenharmony_ci beqs dst_exit 33962306a36Sopenharmony_ci orl #neg_mask,USER_FPSR(%a6) |set N 34062306a36Sopenharmony_ci orl #0x8000,%d1 34162306a36Sopenharmony_cidst_exit: 34262306a36Sopenharmony_ci movemw %d1,ETEMP_EX(%a6) 34362306a36Sopenharmony_ci moveml %d2,ETEMP_HI(%a6) 34462306a36Sopenharmony_ci moveml %d3,ETEMP_LO(%a6) 34562306a36Sopenharmony_ci orl #unfl_mask,USER_FPSR(%a6) |set unfl 34662306a36Sopenharmony_ci moveml (%a7)+,%d2/%d3 34762306a36Sopenharmony_ci leal ETEMP(%a6),%a0 34862306a36Sopenharmony_ci bra t_resdnrm 34962306a36Sopenharmony_ci 35062306a36Sopenharmony_ci| 35162306a36Sopenharmony_ci| Source is outside of 2^14 range. Test the sign and branch 35262306a36Sopenharmony_ci| to the appropriate exception handler. 35362306a36Sopenharmony_ci| 35462306a36Sopenharmony_cisrc_out: 35562306a36Sopenharmony_ci tstb L_SCR1(%a6) 35662306a36Sopenharmony_ci beqs scro_pos 35762306a36Sopenharmony_ci orl #0x8000,%d1 35862306a36Sopenharmony_ciscro_pos: 35962306a36Sopenharmony_ci movel FPTEMP_HI(%a6),ETEMP_HI(%a6) 36062306a36Sopenharmony_ci movel FPTEMP_LO(%a6),ETEMP_LO(%a6) 36162306a36Sopenharmony_ci tstw ETEMP(%a6) 36262306a36Sopenharmony_ci blts res_neg 36362306a36Sopenharmony_cires_pos: 36462306a36Sopenharmony_ci movew %d1,ETEMP(%a6) |result in ETEMP 36562306a36Sopenharmony_ci bra t_ovfl2 36662306a36Sopenharmony_cires_neg: 36762306a36Sopenharmony_ci movew %d1,ETEMP(%a6) |result in ETEMP 36862306a36Sopenharmony_ci leal ETEMP(%a6),%a0 36962306a36Sopenharmony_ci bra t_unfl 37062306a36Sopenharmony_ci |end 371