summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libcpu/m68k/m68040/fpsp/sgetem.S
diff options
context:
space:
mode:
Diffstat (limited to 'c/src/lib/libcpu/m68k/m68040/fpsp/sgetem.S')
-rw-r--r--c/src/lib/libcpu/m68k/m68040/fpsp/sgetem.S143
1 files changed, 143 insertions, 0 deletions
diff --git a/c/src/lib/libcpu/m68k/m68040/fpsp/sgetem.S b/c/src/lib/libcpu/m68k/m68040/fpsp/sgetem.S
new file mode 100644
index 0000000000..d1e8a49c41
--- /dev/null
+++ b/c/src/lib/libcpu/m68k/m68040/fpsp/sgetem.S
@@ -0,0 +1,143 @@
+//
+// $Id$
+//
+// 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.defs"
+
+ |xref nrm_set
+
+//
+// This entry point is used by the unimplemented instruction exception
+// handler. It points a0 to the input operand.
+//
+//
+//
+// SGETEXP
+//
+
+ .global sgetexp
+sgetexp:
+ 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 sgetexpd
+sgetexpd:
+ 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 sgetman
+sgetman:
+ 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 sgetmand
+sgetmand:
+ 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 d1
+shft:
+ 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 return
+cont:
+ 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_end
+upper:
+
+ 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 registers
+shft_end:
+ rts
+
+ |end