URL
https://opencores.org/ocsvn/openrisc_2011-10-31/openrisc_2011-10-31/trunk
Subversion Repositories openrisc_2011-10-31
[/] [openrisc/] [trunk/] [rtos/] [rtems/] [c/] [src/] [lib/] [libcpu/] [m68k/] [m68040/] [fpsp/] [sgetem.S] - Rev 173
Compare with Previous | Blame | View Log
//
// $Id: sgetem.S,v 1.2 2001-09-27 12:01:22 chris Exp $
//
// 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