📄 sgetem.s
字号:
|| sgetem.sa 3.1 12/10/90|| The entry point sGETEXP returns the exponent portion | of the input argument. The exponent bias is removed| and the exponent value is returned as an extended | precision number in fp0. sGETEXPD handles denormalized| numbers.|| The entry point sGETMAN extracts the mantissa of the | input argument. The mantissa is converted to an | extended precision number and returned in fp0. The| range of the result is [1.0 - 2.0).||| Input: Double-extended number X in the ETEMP space in| the floating-point save stack.|| Output: The functions return exp(X) or man(X) in fp0.|| Modified: fp0.||| 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.|SGETEM idnt 2,1 | Motorola 040 Floating Point Software Package |section 8 .include "fpsp.h" |xref nrm_set|| This entry point is used by the unimplemented instruction exception| handler. It points a0 to the input operand.|||| SGETEXP| .global sgetexpsgetexp: movew LOCAL_EX(%a0),%d0 |get the exponent bclrl #15,%d0 |clear the sign bit subw #0x3fff,%d0 |subtract off the bias fmovew %d0,%fp0 |move the exp to fp0 rts .global sgetexpdsgetexpd: bclrb #sign_bit,LOCAL_EX(%a0) bsr nrm_set |normalize (exp will go negative) movew LOCAL_EX(%a0),%d0 |load resulting exponent into d0 subw #0x3fff,%d0 |subtract off the bias fmovew %d0,%fp0 |move the exp to fp0 rts||| This entry point is used by the unimplemented instruction exception| handler. It points a0 to the input operand.|||| SGETMAN||| For normalized numbers, leave the mantissa alone, simply load| with an exponent of +/- $3fff.| .global sgetmansgetman: movel USER_FPCR(%a6),%d0 andil #0xffffff00,%d0 |clear rounding precision and mode fmovel %d0,%fpcr |this fpcr setting is used by the 882 movew LOCAL_EX(%a0),%d0 |get the exp (really just want sign bit) orw #0x7fff,%d0 |clear old exp bclrl #14,%d0 |make it the new exp +-3fff movew %d0,LOCAL_EX(%a0) |move the sign & exp back to fsave stack fmovex (%a0),%fp0 |put new value back in fp0 rts|| For denormalized numbers, shift the mantissa until the j-bit = 1,| then load the exponent with +/1 $3fff.| .global sgetmandsgetmand: movel LOCAL_HI(%a0),%d0 |load ms mant in d0 movel LOCAL_LO(%a0),%d1 |load ls mant in d1 bsr shft |shift mantissa bits till msbit is set movel %d0,LOCAL_HI(%a0) |put ms mant back on stack movel %d1,LOCAL_LO(%a0) |put ls mant back on stack bras sgetman|| SHFT|| Shifts the mantissa bits until msbit is set.| input:| ms mantissa part in d0| ls mantissa part in d1| output:| shifted bits in d0 and d1shft: tstl %d0 |if any bits set in ms mant bnes upper |then branch| ;else no bits set in ms mant tstl %d1 |test if any bits set in ls mant bnes cont |if set then continue bras shft_end |else returncont: movel %d3,-(%a7) |save d3 exg %d0,%d1 |shift ls mant to ms mant bfffo %d0{#0:#32},%d3 |find first 1 in ls mant to d0 lsll %d3,%d0 |shift first 1 to integer bit in ms mant movel (%a7)+,%d3 |restore d3 bras shft_endupper: moveml %d3/%d5/%d6,-(%a7) |save registers bfffo %d0{#0:#32},%d3 |find first 1 in ls mant to d0 lsll %d3,%d0 |shift ms mant until j-bit is set movel %d1,%d6 |save ls mant in d6 lsll %d3,%d1 |shift ls mant by count movel #32,%d5 subl %d3,%d5 |sub 32 from shift for ls mant lsrl %d5,%d6 |shift off all bits but those that will| ;be shifted into ms mant orl %d6,%d0 |shift the ls mant bits into the ms mant moveml (%a7)+,%d3/%d5/%d6 |restore registersshft_end: rts |end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -