summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libcpu/m68k/m68040/fpsp/sgetem.s
diff options
context:
space:
mode:
authorJoel Sherrill <joel.sherrill@OARcorp.com>1997-04-16 17:33:04 +0000
committerJoel Sherrill <joel.sherrill@OARcorp.com>1997-04-16 17:33:04 +0000
commitf9b93da8b47ff7ea4d6573b75b6077f6efb8dbc6 (patch)
tree46e2747b2b8f04d36d530daad59481f4f79e3c00 /c/src/lib/libcpu/m68k/m68040/fpsp/sgetem.s
parentAdded --disable-tcpip option. (diff)
downloadrtems-f9b93da8b47ff7ea4d6573b75b6077f6efb8dbc6.tar.bz2
Added the MC68040 Floating Point Support Package. This was ported
to RTEMS by Eric Norum. It is freely distributable and was acquired from the Motorola WWW site. More info is in the FPSP README.
Diffstat (limited to 'c/src/lib/libcpu/m68k/m68040/fpsp/sgetem.s')
-rw-r--r--c/src/lib/libcpu/m68k/m68040/fpsp/sgetem.s141
1 files changed, 141 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..ca3cc09085
--- /dev/null
+++ b/c/src/lib/libcpu/m68k/m68040/fpsp/sgetem.s
@@ -0,0 +1,141 @@
+//
+// 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