linux/arch/m68k/fpsp040/sgetem.S
<<
>>
Prefs
   1|
   2|       sgetem.sa 3.1 12/10/90
   3|
   4|       The entry point sGETEXP returns the exponent portion
   5|       of the input argument.  The exponent bias is removed
   6|       and the exponent value is returned as an extended
   7|       precision number in fp0.  sGETEXPD handles denormalized
   8|       numbers.
   9|
  10|       The entry point sGETMAN extracts the mantissa of the
  11|       input argument.  The mantissa is converted to an
  12|       extended precision number and returned in fp0.  The
  13|       range of the result is [1.0 - 2.0).
  14|
  15|
  16|       Input:  Double-extended number X in the ETEMP space in
  17|               the floating-point save stack.
  18|
  19|       Output: The functions return exp(X) or man(X) in fp0.
  20|
  21|       Modified: fp0.
  22|
  23|
  24|               Copyright (C) Motorola, Inc. 1990
  25|                       All Rights Reserved
  26|
  27|       For details on the license for this file, please see the
  28|       file, README, in this same directory.
  29
  30|SGETEM idnt    2,1 | Motorola 040 Floating Point Software Package
  31
  32        |section 8
  33
  34#include "fpsp.h"
  35
  36        |xref   nrm_set
  37
  38|
  39| This entry point is used by the unimplemented instruction exception
  40| handler.  It points a0 to the input operand.
  41|
  42|
  43|
  44|       SGETEXP
  45|
  46
  47        .global sgetexp
  48sgetexp:
  49        movew   LOCAL_EX(%a0),%d0       |get the exponent
  50        bclrl   #15,%d0         |clear the sign bit
  51        subw    #0x3fff,%d0     |subtract off the bias
  52        fmovew  %d0,%fp0                |move the exp to fp0
  53        rts
  54
  55        .global sgetexpd
  56sgetexpd:
  57        bclrb   #sign_bit,LOCAL_EX(%a0)
  58        bsr     nrm_set         |normalize (exp will go negative)
  59        movew   LOCAL_EX(%a0),%d0       |load resulting exponent into d0
  60        subw    #0x3fff,%d0     |subtract off the bias
  61        fmovew  %d0,%fp0                |move the exp to fp0
  62        rts
  63|
  64|
  65| This entry point is used by the unimplemented instruction exception
  66| handler.  It points a0 to the input operand.
  67|
  68|
  69|
  70|       SGETMAN
  71|
  72|
  73| For normalized numbers, leave the mantissa alone, simply load
  74| with an exponent of +/- $3fff.
  75|
  76        .global sgetman
  77sgetman:
  78        movel   USER_FPCR(%a6),%d0
  79        andil   #0xffffff00,%d0 |clear rounding precision and mode
  80        fmovel  %d0,%fpcr               |this fpcr setting is used by the 882
  81        movew   LOCAL_EX(%a0),%d0       |get the exp (really just want sign bit)
  82        orw     #0x7fff,%d0     |clear old exp
  83        bclrl   #14,%d0         |make it the new exp +-3fff
  84        movew   %d0,LOCAL_EX(%a0)       |move the sign & exp back to fsave stack
  85        fmovex  (%a0),%fp0      |put new value back in fp0
  86        rts
  87
  88|
  89| For denormalized numbers, shift the mantissa until the j-bit = 1,
  90| then load the exponent with +/1 $3fff.
  91|
  92        .global sgetmand
  93sgetmand:
  94        movel   LOCAL_HI(%a0),%d0       |load ms mant in d0
  95        movel   LOCAL_LO(%a0),%d1       |load ls mant in d1
  96        bsr     shft            |shift mantissa bits till msbit is set
  97        movel   %d0,LOCAL_HI(%a0)       |put ms mant back on stack
  98        movel   %d1,LOCAL_LO(%a0)       |put ls mant back on stack
  99        bras    sgetman
 100
 101|
 102|       SHFT
 103|
 104|       Shifts the mantissa bits until msbit is set.
 105|       input:
 106|               ms mantissa part in d0
 107|               ls mantissa part in d1
 108|       output:
 109|               shifted bits in d0 and d1
 110shft:
 111        tstl    %d0             |if any bits set in ms mant
 112        bnes    upper           |then branch
 113|                               ;else no bits set in ms mant
 114        tstl    %d1             |test if any bits set in ls mant
 115        bnes    cont            |if set then continue
 116        bras    shft_end        |else return
 117cont:
 118        movel   %d3,-(%a7)      |save d3
 119        exg     %d0,%d1         |shift ls mant to ms mant
 120        bfffo   %d0{#0:#32},%d3 |find first 1 in ls mant to d0
 121        lsll    %d3,%d0         |shift first 1 to integer bit in ms mant
 122        movel   (%a7)+,%d3      |restore d3
 123        bras    shft_end
 124upper:
 125
 126        moveml  %d3/%d5/%d6,-(%a7)      |save registers
 127        bfffo   %d0{#0:#32},%d3 |find first 1 in ls mant to d0
 128        lsll    %d3,%d0         |shift ms mant until j-bit is set
 129        movel   %d1,%d6         |save ls mant in d6
 130        lsll    %d3,%d1         |shift ls mant by count
 131        movel   #32,%d5
 132        subl    %d3,%d5         |sub 32 from shift for ls mant
 133        lsrl    %d5,%d6         |shift off all bits but those that will
 134|                               ;be shifted into ms mant
 135        orl     %d6,%d0         |shift the ls mant bits into the ms mant
 136        moveml  (%a7)+,%d3/%d5/%d6      |restore registers
 137shft_end:
 138        rts
 139
 140        |end
 141