diff options
author | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-04-16 18:20:36 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-04-16 18:20:36 -0400 |
commit | 1da177e4c3f41524e886b7f1b8a0c1fc7321cac2 (patch) | |
tree | 0bba044c4ce775e45a88a51686b5d9f90697ea9d /arch/m68k/fpsp040/smovecr.S |
Linux-2.6.12-rc2v2.6.12-rc2
Initial git repository build. I'm not bothering with the full history,
even though we have it. We can create a separate "historical" git
archive of that later if we want to, and in the meantime it's about
3.2GB when imported into git - space that would just make the early
git days unnecessarily complicated, when we don't have a lot of good
infrastructure for it.
Let it rip!
Diffstat (limited to 'arch/m68k/fpsp040/smovecr.S')
-rw-r--r-- | arch/m68k/fpsp040/smovecr.S | 162 |
1 files changed, 162 insertions, 0 deletions
diff --git a/arch/m68k/fpsp040/smovecr.S b/arch/m68k/fpsp040/smovecr.S new file mode 100644 index 000000000000..a0127fa55e9c --- /dev/null +++ b/arch/m68k/fpsp040/smovecr.S | |||
@@ -0,0 +1,162 @@ | |||
1 | | | ||
2 | | smovecr.sa 3.1 12/10/90 | ||
3 | | | ||
4 | | The entry point sMOVECR returns the constant at the | ||
5 | | offset given in the instruction field. | ||
6 | | | ||
7 | | Input: An offset in the instruction word. | ||
8 | | | ||
9 | | Output: The constant rounded to the user's rounding | ||
10 | | mode unchecked for overflow. | ||
11 | | | ||
12 | | Modified: fp0. | ||
13 | | | ||
14 | | | ||
15 | | Copyright (C) Motorola, Inc. 1990 | ||
16 | | All Rights Reserved | ||
17 | | | ||
18 | | THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA | ||
19 | | The copyright notice above does not evidence any | ||
20 | | actual or intended publication of such source code. | ||
21 | |||
22 | |SMOVECR idnt 2,1 | Motorola 040 Floating Point Software Package | ||
23 | |||
24 | |section 8 | ||
25 | |||
26 | #include "fpsp.h" | ||
27 | |||
28 | |xref nrm_set | ||
29 | |xref round | ||
30 | |xref PIRN | ||
31 | |xref PIRZRM | ||
32 | |xref PIRP | ||
33 | |xref SMALRN | ||
34 | |xref SMALRZRM | ||
35 | |xref SMALRP | ||
36 | |xref BIGRN | ||
37 | |xref BIGRZRM | ||
38 | |xref BIGRP | ||
39 | |||
40 | FZERO: .long 00000000 | ||
41 | | | ||
42 | | FMOVECR | ||
43 | | | ||
44 | .global smovcr | ||
45 | smovcr: | ||
46 | bfextu CMDREG1B(%a6){#9:#7},%d0 |get offset | ||
47 | bfextu USER_FPCR(%a6){#26:#2},%d1 |get rmode | ||
48 | | | ||
49 | | check range of offset | ||
50 | | | ||
51 | tstb %d0 |if zero, offset is to pi | ||
52 | beqs PI_TBL |it is pi | ||
53 | cmpib #0x0a,%d0 |check range $01 - $0a | ||
54 | bles Z_VAL |if in this range, return zero | ||
55 | cmpib #0x0e,%d0 |check range $0b - $0e | ||
56 | bles SM_TBL |valid constants in this range | ||
57 | cmpib #0x2f,%d0 |check range $10 - $2f | ||
58 | bles Z_VAL |if in this range, return zero | ||
59 | cmpib #0x3f,%d0 |check range $30 - $3f | ||
60 | ble BG_TBL |valid constants in this range | ||
61 | Z_VAL: | ||
62 | fmoves FZERO,%fp0 | ||
63 | rts | ||
64 | PI_TBL: | ||
65 | tstb %d1 |offset is zero, check for rmode | ||
66 | beqs PI_RN |if zero, rn mode | ||
67 | cmpib #0x3,%d1 |check for rp | ||
68 | beqs PI_RP |if 3, rp mode | ||
69 | PI_RZRM: | ||
70 | leal PIRZRM,%a0 |rmode is rz or rm, load PIRZRM in a0 | ||
71 | bra set_finx | ||
72 | PI_RN: | ||
73 | leal PIRN,%a0 |rmode is rn, load PIRN in a0 | ||
74 | bra set_finx | ||
75 | PI_RP: | ||
76 | leal PIRP,%a0 |rmode is rp, load PIRP in a0 | ||
77 | bra set_finx | ||
78 | SM_TBL: | ||
79 | subil #0xb,%d0 |make offset in 0 - 4 range | ||
80 | tstb %d1 |check for rmode | ||
81 | beqs SM_RN |if zero, rn mode | ||
82 | cmpib #0x3,%d1 |check for rp | ||
83 | beqs SM_RP |if 3, rp mode | ||
84 | SM_RZRM: | ||
85 | leal SMALRZRM,%a0 |rmode is rz or rm, load SMRZRM in a0 | ||
86 | cmpib #0x2,%d0 |check if result is inex | ||
87 | ble set_finx |if 0 - 2, it is inexact | ||
88 | bra no_finx |if 3, it is exact | ||
89 | SM_RN: | ||
90 | leal SMALRN,%a0 |rmode is rn, load SMRN in a0 | ||
91 | cmpib #0x2,%d0 |check if result is inex | ||
92 | ble set_finx |if 0 - 2, it is inexact | ||
93 | bra no_finx |if 3, it is exact | ||
94 | SM_RP: | ||
95 | leal SMALRP,%a0 |rmode is rp, load SMRP in a0 | ||
96 | cmpib #0x2,%d0 |check if result is inex | ||
97 | ble set_finx |if 0 - 2, it is inexact | ||
98 | bra no_finx |if 3, it is exact | ||
99 | BG_TBL: | ||
100 | subil #0x30,%d0 |make offset in 0 - f range | ||
101 | tstb %d1 |check for rmode | ||
102 | beqs BG_RN |if zero, rn mode | ||
103 | cmpib #0x3,%d1 |check for rp | ||
104 | beqs BG_RP |if 3, rp mode | ||
105 | BG_RZRM: | ||
106 | leal BIGRZRM,%a0 |rmode is rz or rm, load BGRZRM in a0 | ||
107 | cmpib #0x1,%d0 |check if result is inex | ||
108 | ble set_finx |if 0 - 1, it is inexact | ||
109 | cmpib #0x7,%d0 |second check | ||
110 | ble no_finx |if 0 - 7, it is exact | ||
111 | bra set_finx |if 8 - f, it is inexact | ||
112 | BG_RN: | ||
113 | leal BIGRN,%a0 |rmode is rn, load BGRN in a0 | ||
114 | cmpib #0x1,%d0 |check if result is inex | ||
115 | ble set_finx |if 0 - 1, it is inexact | ||
116 | cmpib #0x7,%d0 |second check | ||
117 | ble no_finx |if 0 - 7, it is exact | ||
118 | bra set_finx |if 8 - f, it is inexact | ||
119 | BG_RP: | ||
120 | leal BIGRP,%a0 |rmode is rp, load SMRP in a0 | ||
121 | cmpib #0x1,%d0 |check if result is inex | ||
122 | ble set_finx |if 0 - 1, it is inexact | ||
123 | cmpib #0x7,%d0 |second check | ||
124 | ble no_finx |if 0 - 7, it is exact | ||
125 | | bra set_finx ;if 8 - f, it is inexact | ||
126 | set_finx: | ||
127 | orl #inx2a_mask,USER_FPSR(%a6) |set inex2/ainex | ||
128 | no_finx: | ||
129 | mulul #12,%d0 |use offset to point into tables | ||
130 | movel %d1,L_SCR1(%a6) |load mode for round call | ||
131 | bfextu USER_FPCR(%a6){#24:#2},%d1 |get precision | ||
132 | tstl %d1 |check if extended precision | ||
133 | | | ||
134 | | Precision is extended | ||
135 | | | ||
136 | bnes not_ext |if extended, do not call round | ||
137 | fmovemx (%a0,%d0),%fp0-%fp0 |return result in fp0 | ||
138 | rts | ||
139 | | | ||
140 | | Precision is single or double | ||
141 | | | ||
142 | not_ext: | ||
143 | swap %d1 |rnd prec in upper word of d1 | ||
144 | addl L_SCR1(%a6),%d1 |merge rmode in low word of d1 | ||
145 | movel (%a0,%d0),FP_SCR1(%a6) |load first word to temp storage | ||
146 | movel 4(%a0,%d0),FP_SCR1+4(%a6) |load second word | ||
147 | movel 8(%a0,%d0),FP_SCR1+8(%a6) |load third word | ||
148 | clrl %d0 |clear g,r,s | ||
149 | lea FP_SCR1(%a6),%a0 | ||
150 | btstb #sign_bit,LOCAL_EX(%a0) | ||
151 | sne LOCAL_SGN(%a0) |convert to internal ext. format | ||
152 | |||
153 | bsr round |go round the mantissa | ||
154 | |||
155 | bfclr LOCAL_SGN(%a0){#0:#8} |convert back to IEEE ext format | ||
156 | beqs fin_fcr | ||
157 | bsetb #sign_bit,LOCAL_EX(%a0) | ||
158 | fin_fcr: | ||
159 | fmovemx (%a0),%fp0-%fp0 | ||
160 | rts | ||
161 | |||
162 | |end | ||