OpenCores
URL https://opencores.org/ocsvn/or1k_soc_on_altera_embedded_dev_kit/or1k_soc_on_altera_embedded_dev_kit/trunk

Subversion Repositories or1k_soc_on_altera_embedded_dev_kit

[/] [or1k_soc_on_altera_embedded_dev_kit/] [trunk/] [linux-2.6/] [linux-2.6.24/] [arch/] [m68k/] [fpsp040/] [sgetem.S] - Blame information for rev 3

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 3 xianfeng
|
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
48
sgetexp:
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
56
sgetexpd:
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
77
sgetman:
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
93
sgetmand:
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
110
shft:
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
117
cont:
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
124
upper:
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
137
shft_end:
138
        rts
139
 
140
        |end

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.