URL
https://opencores.org/ocsvn/openrisc/openrisc/trunk
Subversion Repositories openrisc
[/] [openrisc/] [trunk/] [rtos/] [rtems/] [c/] [src/] [lib/] [libcpu/] [m68k/] [m68040/] [fpsp/] [get_op.S] - Rev 173
Compare with Previous | Blame | View Log
//// $Id: get_op.S,v 1.2 2001-09-27 12:01:22 chris Exp $//// get_op.sa 3.6 5/19/92//// get_op.sa 3.5 4/26/91//// Description: This routine is called by the unsupported format/data// type exception handler ('unsupp' - vector 55) and the unimplemented// instruction exception handler ('unimp' - vector 11). 'get_op'// determines the opclass (0, 2, or 3) and branches to the// opclass handler routine. See 68881/2 User's Manual table 4-11// for a description of the opclasses.//// For UNSUPPORTED data/format (exception vector 55) and for// UNIMPLEMENTED instructions (exception vector 11) the following// applies://// - For unnormalized numbers (opclass 0, 2, or 3) the// number(s) is normalized and the operand type tag is updated.//// - For a packed number (opclass 2) the number is unpacked and the// operand type tag is updated.//// - For denormalized numbers (opclass 0 or 2) the number(s) is not// changed but passed to the next module. The next module for// unimp is do_func, the next module for unsupp is res_func.//// For UNSUPPORTED data/format (exception vector 55) only the// following applies://// - If there is a move out with a packed number (opclass 3) the// number is packed and written to user memory. For the other// opclasses the number(s) are written back to the fsave stack// and the instruction is then restored back into the '040. The// '040 is then able to complete the instruction.//// For example:// fadd.x fpm,fpn where the fpm contains an unnormalized number.// The '040 takes an unsupported data trap and gets to this// routine. The number is normalized, put back on the stack and// then an frestore is done to restore the instruction back into// the '040. The '040 then re-executes the fadd.x fpm,fpn with// a normalized number in the source and the instruction is// successful.//// Next consider if in the process of normalizing the un-// normalized number it becomes a denormalized number. The// routine which converts the unnorm to a norm (called mk_norm)// detects this and tags the number as a denorm. The routine// res_func sees the denorm tag and converts the denorm to a// norm. The instruction is then restored back into the '040// which re_executes the instruction.////// Copyright (C) Motorola, Inc. 1990// All Rights Reserved//// THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA// The copyright notice above does not evidence any// actual or intended publication of such source code.GET_OP: //idnt 2,1 | Motorola 040 Floating Point Software Package|section 8#include "fpsp.defs".global PIRN,PIRZRM,PIRP.global SMALRN,SMALRZRM,SMALRP.global BIGRN,BIGRZRM,BIGRPPIRN:.long 0x40000000,0xc90fdaa2,0x2168c235 //piPIRZRM:.long 0x40000000,0xc90fdaa2,0x2168c234 //piPIRP:.long 0x40000000,0xc90fdaa2,0x2168c235 //pi//round to nearestSMALRN:.long 0x3ffd0000,0x9a209a84,0xfbcff798 //log10(2).long 0x40000000,0xadf85458,0xa2bb4a9a //e.long 0x3fff0000,0xb8aa3b29,0x5c17f0bc //log2(e).long 0x3ffd0000,0xde5bd8a9,0x37287195 //log10(e).long 0x00000000,0x00000000,0x00000000 //0.0// round to zero;round to negative infinitySMALRZRM:.long 0x3ffd0000,0x9a209a84,0xfbcff798 //log10(2).long 0x40000000,0xadf85458,0xa2bb4a9a //e.long 0x3fff0000,0xb8aa3b29,0x5c17f0bb //log2(e).long 0x3ffd0000,0xde5bd8a9,0x37287195 //log10(e).long 0x00000000,0x00000000,0x00000000 //0.0// round to positive infinitySMALRP:.long 0x3ffd0000,0x9a209a84,0xfbcff799 //log10(2).long 0x40000000,0xadf85458,0xa2bb4a9b //e.long 0x3fff0000,0xb8aa3b29,0x5c17f0bc //log2(e).long 0x3ffd0000,0xde5bd8a9,0x37287195 //log10(e).long 0x00000000,0x00000000,0x00000000 //0.0//round to nearestBIGRN:.long 0x3ffe0000,0xb17217f7,0xd1cf79ac //ln(2).long 0x40000000,0x935d8ddd,0xaaa8ac17 //ln(10).long 0x3fff0000,0x80000000,0x00000000 //10 ^ 0.global PTENRNPTENRN:.long 0x40020000,0xA0000000,0x00000000 //10 ^ 1.long 0x40050000,0xC8000000,0x00000000 //10 ^ 2.long 0x400C0000,0x9C400000,0x00000000 //10 ^ 4.long 0x40190000,0xBEBC2000,0x00000000 //10 ^ 8.long 0x40340000,0x8E1BC9BF,0x04000000 //10 ^ 16.long 0x40690000,0x9DC5ADA8,0x2B70B59E //10 ^ 32.long 0x40D30000,0xC2781F49,0xFFCFA6D5 //10 ^ 64.long 0x41A80000,0x93BA47C9,0x80E98CE0 //10 ^ 128.long 0x43510000,0xAA7EEBFB,0x9DF9DE8E //10 ^ 256.long 0x46A30000,0xE319A0AE,0xA60E91C7 //10 ^ 512.long 0x4D480000,0xC9767586,0x81750C17 //10 ^ 1024.long 0x5A920000,0x9E8B3B5D,0xC53D5DE5 //10 ^ 2048.long 0x75250000,0xC4605202,0x8A20979B //10 ^ 4096//round to minus infinityBIGRZRM:.long 0x3ffe0000,0xb17217f7,0xd1cf79ab //ln(2).long 0x40000000,0x935d8ddd,0xaaa8ac16 //ln(10).long 0x3fff0000,0x80000000,0x00000000 //10 ^ 0.global PTENRMPTENRM:.long 0x40020000,0xA0000000,0x00000000 //10 ^ 1.long 0x40050000,0xC8000000,0x00000000 //10 ^ 2.long 0x400C0000,0x9C400000,0x00000000 //10 ^ 4.long 0x40190000,0xBEBC2000,0x00000000 //10 ^ 8.long 0x40340000,0x8E1BC9BF,0x04000000 //10 ^ 16.long 0x40690000,0x9DC5ADA8,0x2B70B59D //10 ^ 32.long 0x40D30000,0xC2781F49,0xFFCFA6D5 //10 ^ 64.long 0x41A80000,0x93BA47C9,0x80E98CDF //10 ^ 128.long 0x43510000,0xAA7EEBFB,0x9DF9DE8D //10 ^ 256.long 0x46A30000,0xE319A0AE,0xA60E91C6 //10 ^ 512.long 0x4D480000,0xC9767586,0x81750C17 //10 ^ 1024.long 0x5A920000,0x9E8B3B5D,0xC53D5DE5 //10 ^ 2048.long 0x75250000,0xC4605202,0x8A20979A //10 ^ 4096//round to positive infinityBIGRP:.long 0x3ffe0000,0xb17217f7,0xd1cf79ac //ln(2).long 0x40000000,0x935d8ddd,0xaaa8ac17 //ln(10).long 0x3fff0000,0x80000000,0x00000000 //10 ^ 0.global PTENRPPTENRP:.long 0x40020000,0xA0000000,0x00000000 //10 ^ 1.long 0x40050000,0xC8000000,0x00000000 //10 ^ 2.long 0x400C0000,0x9C400000,0x00000000 //10 ^ 4.long 0x40190000,0xBEBC2000,0x00000000 //10 ^ 8.long 0x40340000,0x8E1BC9BF,0x04000000 //10 ^ 16.long 0x40690000,0x9DC5ADA8,0x2B70B59E //10 ^ 32.long 0x40D30000,0xC2781F49,0xFFCFA6D6 //10 ^ 64.long 0x41A80000,0x93BA47C9,0x80E98CE0 //10 ^ 128.long 0x43510000,0xAA7EEBFB,0x9DF9DE8E //10 ^ 256.long 0x46A30000,0xE319A0AE,0xA60E91C7 //10 ^ 512.long 0x4D480000,0xC9767586,0x81750C18 //10 ^ 1024.long 0x5A920000,0x9E8B3B5D,0xC53D5DE6 //10 ^ 2048.long 0x75250000,0xC4605202,0x8A20979B //10 ^ 4096|xref nrm_zero|xref decbin|xref round.global get_op.global uns_getop.global uni_getopget_op:clrb DY_MO_FLG(%a6)tstb UFLG_TMP(%a6) //test flag for unsupp/unimp statebeq uni_getopuns_getop:btstb #direction_bit,CMDREG1B(%a6)bne opclass3 //branch if a fmove out (any kind)btstb #6,CMDREG1B(%a6)beqs uns_notpackedbfextu CMDREG1B(%a6){#3:#3},%d0cmpb #3,%d0beq pack_source //check for a packed src op, branch if souns_notpacked:bsr chk_dy_mo //set the dyadic/monadic flagtstb DY_MO_FLG(%a6)beqs src_op_ck //if monadic, go check src op// ;else, check dst op (fall through)btstb #7,DTAG(%a6)beqs src_op_ck //if dst op is norm, check src opbras dst_ex_dnrm //else, handle destination unnorm/dnrmuni_getop:bfextu CMDREG1B(%a6){#0:#6},%d0 //get opclass and src fieldscmpil #0x17,%d0 //if op class and size fields are $17,// ;it is FMOVECR; if not, continue//// If the instruction is fmovecr, exit get_op. It is handled// in do_func and smovecr.sa.//bne not_fmovecr //handle fmovecr as an unimplemented instrtsnot_fmovecr:btstb #E1,E_BYTE(%a6) //if set, there is a packed operandbne pack_source //check for packed src op, branch if so// The following lines of are coded to optimize on normalized operandsmoveb STAG(%a6),%d0orb DTAG(%a6),%d0 //check if either of STAG/DTAG msb setbmis dest_op_ck //if so, some op needs to be fixedrtsdest_op_ck:btstb #7,DTAG(%a6) //check for unsupported data types inbeqs src_op_ck //the destination, if not, check src opbsr chk_dy_mo //set dyadic/monadic flagtstb DY_MO_FLG(%a6) //beqs src_op_ck //if monadic, check src op//// At this point, destination has an extended denorm or unnorm.//dst_ex_dnrm:movew FPTEMP_EX(%a6),%d0 //get destination exponentandiw #0x7fff,%d0 //mask sign, check if exp = 0000beqs src_op_ck //if denorm then check source op.// ;denorms are taken care of in res_func// ;(unsupp) or do_func (unimp)// ;else unnorm fall throughleal FPTEMP(%a6),%a0 //point a0 to dop - used in mk_normbsr mk_norm //go normalize - mk_norm returns:// ;L_SCR1{7:5} = operand tag// ; (000 = norm, 100 = denorm)// ;L_SCR1{4} = fpte15 or ete15// ; 0 = exp > $3fff// ; 1 = exp <= $3fff// ;and puts the normalized num back// ;on the fsave stack//moveb L_SCR1(%a6),DTAG(%a6) //write the new tag & fpte15// ;to the fsave stack and fall// ;through to check source operand//src_op_ck:btstb #7,STAG(%a6)beq end_getop //check for unsupported data types on the// ;source operandbtstb #5,STAG(%a6)bnes src_sd_dnrm //if bit 5 set, handle sgl/dbl denorms//// At this point only unnorms or extended denorms are possible.//src_ex_dnrm:movew ETEMP_EX(%a6),%d0 //get source exponentandiw #0x7fff,%d0 //mask sign, check if exp = 0000beq end_getop //if denorm then exit, denorms are// ;handled in do_funcleal ETEMP(%a6),%a0 //point a0 to sop - used in mk_normbsr mk_norm //go normalize - mk_norm returns:// ;L_SCR1{7:5} = operand tag// ; (000 = norm, 100 = denorm)// ;L_SCR1{4} = fpte15 or ete15// ; 0 = exp > $3fff// ; 1 = exp <= $3fff// ;and puts the normalized num back// ;on the fsave stack//moveb L_SCR1(%a6),STAG(%a6) //write the new tag & ete15rts //end_getop//// At this point, only single or double denorms are possible.// If the inst is not fmove, normalize the source. If it is,// do nothing to the input.//src_sd_dnrm:btstb #4,CMDREG1B(%a6) //differentiate between sgl/dbl denormbnes is_doubleis_single:movew #0x3f81,%d1 //write bias for sgl denormbras common //goto the common codeis_double:movew #0x3c01,%d1 //write the bias for a dbl denormcommon:btstb #sign_bit,ETEMP_EX(%a6) //grab sign bit of mantissabeqs posbset #15,%d1 //set sign bit because it is negativepos:movew %d1,ETEMP_EX(%a6)// ;put exponent on stackmovew CMDREG1B(%a6),%d1andw #0xe3ff,%d1 //clear out source specifierorw #0x0800,%d1 //set source specifier to extended precmovew %d1,CMDREG1B(%a6) //write back to the command word in stack// ;this is needed to fix unsupp data stackleal ETEMP(%a6),%a0 //point a0 to sopbsr mk_norm //convert sgl/dbl denorm to normmoveb L_SCR1(%a6),STAG(%a6) //put tag into source tag reg - d0rts //end_getop//// At this point, the source is definitely packed, whether// instruction is dyadic or monadic is still unknown//pack_source:movel FPTEMP_LO(%a6),ETEMP(%a6) //write ms part of packed// ;number to etemp slotbsr chk_dy_mo //set dyadic/monadic flagbsr unpacktstb DY_MO_FLG(%a6)beqs end_getop //if monadic, exit// ;else, fix FPTEMPpack_dya:bfextu CMDREG1B(%a6){#6:#3},%d0 //extract dest fp regmovel #7,%d1subl %d0,%d1clrl %d0bsetl %d1,%d0 //set up d0 as a dynamic register maskfmovemx %d0,FPTEMP(%a6) //write to FPTEMPbtstb #7,DTAG(%a6) //check dest tag for unnorm or denormbne dst_ex_dnrm //else, handle the unnorm or ext denorm//// Dest is not denormalized. Check for norm, and set fpte15// accordingly.//moveb DTAG(%a6),%d0andib #0xf0,%d0 //strip to only dtag:fpte15tstb %d0 //check for normalized valuebnes end_getop //if inf/nan/zero leave get_opmovew FPTEMP_EX(%a6),%d0andiw #0x7fff,%d0cmpiw #0x3fff,%d0 //check if fpte15 needs settingbges end_getop //if >= $3fff, leave fpte15=0orb #0x10,DTAG(%a6)bras end_getop//// At this point, it is either an fmoveout packed, unnorm or denorm//opclass3:clrb DY_MO_FLG(%a6) //set dyadic/monadic flag to monadicbfextu CMDREG1B(%a6){#4:#2},%d0cmpib #3,%d0bne src_ex_dnrm //if not equal, must be unnorm or denorm// ;else it is a packed move out// ;exitend_getop:rts//// Sets the DY_MO_FLG correctly. This is used only on if it is an// unsupported data type exception. Set if dyadic.//chk_dy_mo:movew CMDREG1B(%a6),%d0btstl #5,%d0 //testing extension command wordbeqs set_mon //if bit 5 = 0 then monadicbtstl #4,%d0 //know that bit 5 = 1beqs set_dya //if bit 4 = 0 then dyadicandiw #0x007f,%d0 //get rid of all but extension bits {6:0}cmpiw #0x0038,%d0 //if extension = $38 then fcmp (dyadic)bnes set_monset_dya:st DY_MO_FLG(%a6) //set the inst flag type to dyadicrtsset_mon:clrb DY_MO_FLG(%a6) //set the inst flag type to monadicrts//// MK_NORM//// Normalizes unnormalized numbers, sets tag to norm or denorm, sets unfl// exception if denorm.//// CASE opclass 0x0 unsupp// mk_norm till msb set// set tag = norm//// CASE opclass 0x0 unimp// mk_norm till msb set or exp = 0// if integer bit = 0// tag = denorm// else// tag = norm//// CASE opclass 011 unsupp// mk_norm till msb set or exp = 0// if integer bit = 0// tag = denorm// set unfl_nmcexe = 1// else// tag = norm//// if exp <= $3fff// set ete15 or fpte15 = 1// else set ete15 or fpte15 = 0// input:// a0 = points to operand to be normalized// output:// L_SCR1{7:5} = operand tag (000 = norm, 100 = denorm)// L_SCR1{4} = fpte15 or ete15 (0 = exp > $3fff, 1 = exp <=$3fff)// the normalized operand is placed back on the fsave stackmk_norm:clrl L_SCR1(%a6)bclrb #sign_bit,LOCAL_EX(%a0)sne LOCAL_SGN(%a0) //transform into internal extended formatcmpib #0x2c,1+EXC_VEC(%a6) //check if unimpbnes uns_data //branch if unsuppbsr uni_inst //call if unimp (opclass 0x0)bras reloaduns_data:btstb #direction_bit,CMDREG1B(%a6) //check transfer directionbnes bit_set //branch if set (opclass 011)bsr uns_opx //call if opclass 0x0bras reloadbit_set:bsr uns_op3 //opclass 011reload:cmpw #0x3fff,LOCAL_EX(%a0) //if exp > $3fffbgts end_mk // fpte15/ete15 already set to 0bsetb #4,L_SCR1(%a6) //else set fpte15/ete15 to 1// ;calling routine actually sets the// ;value on the stack (along with the// ;tag), since this routine doesn't// ;know if it should set ete15 or fpte15// ;ie, it doesn't know if this is the// ;src op or dest op.end_mk:bfclr LOCAL_SGN(%a0){#0:#8}beqs end_mk_posbsetb #sign_bit,LOCAL_EX(%a0) //convert back to IEEE formatend_mk_pos:rts//// CASE opclass 011 unsupp//uns_op3:bsr nrm_zero //normalize till msb = 1 or exp = zerobtstb #7,LOCAL_HI(%a0) //if msb = 1bnes no_unfl //then branchset_unfl:orw #dnrm_tag,L_SCR1(%a6) //set denorm tagbsetb #unfl_bit,FPSR_EXCEPT(%a6) //set unfl exception bitno_unfl:rts//// CASE opclass 0x0 unsupp//uns_opx:bsr nrm_zero //normalize the numberbtstb #7,LOCAL_HI(%a0) //check if integer bit (j-bit) is setbeqs uns_den //if clear then now have a denormuns_nrm:orb #norm_tag,L_SCR1(%a6) //set tag to normrtsuns_den:orb #dnrm_tag,L_SCR1(%a6) //set tag to denormrts//// CASE opclass 0x0 unimp//uni_inst:bsr nrm_zerobtstb #7,LOCAL_HI(%a0) //check if integer bit (j-bit) is setbeqs uni_den //if clear then now have a denormuni_nrm:orb #norm_tag,L_SCR1(%a6) //set tag to normrtsuni_den:orb #dnrm_tag,L_SCR1(%a6) //set tag to denormrts//// Decimal to binary conversion//// Special cases of inf and NaNs are completed outside of decbin.// If the input is an snan, the snan bit is not set.//// input:// ETEMP(a6) - points to packed decimal string in memory// output:// fp0 - contains packed string converted to extended precision// ETEMP - same as fp0unpack:movew CMDREG1B(%a6),%d0 //examine command word, looking for fmove'sandw #0x3b,%d0beq move_unpack //special handling for fmove: must set FPSR_CCmovew ETEMP(%a6),%d0 //get word with inf informationbfextu %d0{#20:#12},%d1 //get exponent into d1cmpiw #0x0fff,%d1 //test for inf or NaNbnes try_zero //if not equal, it is not specialbfextu %d0{#17:#3},%d1 //get SE and y bits into d1cmpiw #7,%d1 //SE and y bits must be on for specialbnes try_zero //if not on, it is not special//input is of the special cases of inf and NaNtstl ETEMP_HI(%a6) //check ms mantissabnes fix_nan //if non-zero, it is a NaNtstl ETEMP_LO(%a6) //check ls mantissabnes fix_nan //if non-zero, it is a NaNbra finish //special already on stackfix_nan:btstb #signan_bit,ETEMP_HI(%a6) //test for snanbne finishorl #snaniop_mask,USER_FPSR(%a6) //always set snan if it is sobra finishtry_zero:movew ETEMP_EX+2(%a6),%d0 //get word 4andiw #0x000f,%d0 //clear all but last ni(y)bbletstw %d0 //check for zero.bne not_spectstl ETEMP_HI(%a6) //check words 3 and 2bne not_spectstl ETEMP_LO(%a6) //check words 1 and 0bne not_spectstl ETEMP(%a6) //test sign of the zerobges pos_zeromovel #0x80000000,ETEMP(%a6) //write neg zero to etempclrl ETEMP_HI(%a6)clrl ETEMP_LO(%a6)bra finishpos_zero:clrl ETEMP(%a6)clrl ETEMP_HI(%a6)clrl ETEMP_LO(%a6)bra finishnot_spec:fmovemx %fp0-%fp1,-(%a7) //save fp0 - decbin returns in itbsr decbinfmovex %fp0,ETEMP(%a6) //put the unpacked sop in the fsave stackfmovemx (%a7)+,%fp0-%fp1fmovel #0,%FPSR //clr fpsr from decbinbra finish//// Special handling for packed move in: Same results as all other// packed cases, but we must set the FPSR condition codes properly.//move_unpack:movew ETEMP(%a6),%d0 //get word with inf informationbfextu %d0{#20:#12},%d1 //get exponent into d1cmpiw #0x0fff,%d1 //test for inf or NaNbnes mtry_zero //if not equal, it is not specialbfextu %d0{#17:#3},%d1 //get SE and y bits into d1cmpiw #7,%d1 //SE and y bits must be on for specialbnes mtry_zero //if not on, it is not special//input is of the special cases of inf and NaNtstl ETEMP_HI(%a6) //check ms mantissabnes mfix_nan //if non-zero, it is a NaNtstl ETEMP_LO(%a6) //check ls mantissabnes mfix_nan //if non-zero, it is a NaN//input is inforl #inf_mask,USER_FPSR(%a6) //set I bittstl ETEMP(%a6) //check signbge finishorl #neg_mask,USER_FPSR(%a6) //set N bitbra finish //special already on stackmfix_nan:orl #nan_mask,USER_FPSR(%a6) //set NaN bitmoveb #nan_tag,STAG(%a6) //set stag to NaNbtstb #signan_bit,ETEMP_HI(%a6) //test for snanbnes mn_snanorl #snaniop_mask,USER_FPSR(%a6) //set snan bitbtstb #snan_bit,FPCR_ENABLE(%a6) //test for snan enabledbnes mn_snanbsetb #signan_bit,ETEMP_HI(%a6) //force snans to qnansmn_snan:tstl ETEMP(%a6) //check for signbge finish //if clr, go onorl #neg_mask,USER_FPSR(%a6) //set N bitbra finishmtry_zero:movew ETEMP_EX+2(%a6),%d0 //get word 4andiw #0x000f,%d0 //clear all but last ni(y)bbletstw %d0 //check for zero.bnes mnot_spectstl ETEMP_HI(%a6) //check words 3 and 2bnes mnot_spectstl ETEMP_LO(%a6) //check words 1 and 0bnes mnot_spectstl ETEMP(%a6) //test sign of the zerobges mpos_zeroorl #neg_mask+z_mask,USER_FPSR(%a6) //set N and Zmovel #0x80000000,ETEMP(%a6) //write neg zero to etempclrl ETEMP_HI(%a6)clrl ETEMP_LO(%a6)bras finishmpos_zero:orl #z_mask,USER_FPSR(%a6) //set Zclrl ETEMP(%a6)clrl ETEMP_HI(%a6)clrl ETEMP_LO(%a6)bras finishmnot_spec:fmovemx %fp0-%fp1,-(%a7) //save fp0 ,fp1 - decbin returns in fp0bsr decbinfmovex %fp0,ETEMP(%a6)// ;put the unpacked sop in the fsave stackfmovemx (%a7)+,%fp0-%fp1finish:movew CMDREG1B(%a6),%d0 //get the command wordandw #0xfbff,%d0 //change the source specifier field to// ;extended (was packed).movew %d0,CMDREG1B(%a6) //write command word back to fsave stack// ;we need to do this so the 040 will// ;re-execute the inst. without taking// ;another packed trap.fix_stag://Converted result is now in etemp on fsave stack, now set the source//tag (stag)// if (ete =$7fff) then INF or NAN// if (etemp = $x.0----0) then// stag = INF// else// stag = NAN// else// if (ete = $0000) then// stag = ZERO// else// stag = NORM//// Note also that the etemp_15 bit (just right of the stag) must// be set accordingly.//movew ETEMP_EX(%a6),%d1andiw #0x7fff,%d1 //strip signcmpw #0x7fff,%d1bnes z_or_nrmmovel ETEMP_HI(%a6),%d1bnes is_nanmovel ETEMP_LO(%a6),%d1bnes is_nanis_inf:moveb #0x40,STAG(%a6)movel #0x40,%d0rtsis_nan:moveb #0x60,STAG(%a6)movel #0x60,%d0rtsz_or_nrm:tstw %d1bnes is_nrmis_zro:// For a zero, set etemp_15moveb #0x30,STAG(%a6)movel #0x20,%d0rtsis_nrm:// For a norm, check if the exp <= $3fff; if so, set etemp_15cmpiw #0x3fff,%d1bles set_bit15moveb #0,STAG(%a6)bras end_is_nrmset_bit15:moveb #0x10,STAG(%a6)end_is_nrm:movel #0,%d0end_fix:rtsend_get:rts|end
