systfloat.S revision 1.3 1 1.3 martin /* $NetBSD: systfloat.S,v 1.3 2008/04/28 20:23:04 martin Exp $ */
2 1.2 ross
3 1.2 ross /* This is a derivative work. */
4 1.2 ross
5 1.2 ross /*-
6 1.2 ross * Copyright (c) 2001 The NetBSD Foundation, Inc.
7 1.2 ross * All rights reserved.
8 1.2 ross *
9 1.2 ross * This code is derived from software contributed to The NetBSD Foundation
10 1.2 ross * by Ross Harvey.
11 1.2 ross *
12 1.2 ross * Redistribution and use in source and binary forms, with or without
13 1.2 ross * modification, are permitted provided that the following conditions
14 1.2 ross * are met:
15 1.2 ross * 1. Redistributions of source code must retain the above copyright
16 1.2 ross * notice, this list of conditions and the following disclaimer.
17 1.2 ross * 2. Redistributions in binary form must reproduce the above copyright
18 1.2 ross * notice, this list of conditions and the following disclaimer in the
19 1.2 ross * documentation and/or other materials provided with the distribution.
20 1.2 ross *
21 1.2 ross * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
22 1.2 ross * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
23 1.2 ross * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
24 1.2 ross * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
25 1.2 ross * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
26 1.2 ross * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
27 1.2 ross * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
28 1.2 ross * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
29 1.2 ross * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
30 1.2 ross * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
31 1.2 ross * POSSIBILITY OF SUCH DAMAGE.
32 1.2 ross */
33 1.1 ross
34 1.1 ross /*
35 1.1 ross ===============================================================================
36 1.1 ross
37 1.1 ross This GNU assembler source file is part of TestFloat, Release 2a, a package
38 1.1 ross of programs for testing the correctness of floating-point arithmetic
39 1.1 ross complying to the IEC/IEEE Standard for Floating-Point.
40 1.1 ross
41 1.1 ross Written by John R. Hauser. More information is available through the Web
42 1.1 ross page `http://HTTP.CS.Berkeley.EDU/~jhauser/arithmetic/TestFloat.html'.
43 1.1 ross
44 1.1 ross THIS SOFTWARE IS DISTRIBUTED AS IS, FOR FREE. Although reasonable effort
45 1.1 ross has been made to avoid it, THIS SOFTWARE MAY CONTAIN FAULTS THAT WILL AT
46 1.1 ross TIMES RESULT IN INCORRECT BEHAVIOR. USE OF THIS SOFTWARE IS RESTRICTED TO
47 1.1 ross PERSONS AND ORGANIZATIONS WHO CAN AND WILL TAKE FULL RESPONSIBILITY FOR ANY
48 1.1 ross AND ALL LOSSES, COSTS, OR OTHER PROBLEMS ARISING FROM ITS USE.
49 1.1 ross
50 1.1 ross Derivative works are acceptable, even for commercial purposes, so long as
51 1.1 ross (1) they include prominent notice that the work is derivative, and (2) they
52 1.1 ross include prominent notice akin to these four paragraphs for those parts of
53 1.1 ross this code that are retained.
54 1.1 ross
55 1.1 ross ===============================================================================
56 1.1 ross */
57 1.1 ross
58 1.1 ross .text
59 1.1 ross
60 1.1 ross /*
61 1.1 ross -------------------------------------------------------------------------------
62 1.1 ross -------------------------------------------------------------------------------
63 1.1 ross */
64 1.2 ross
65 1.2 ross #include <machine/asm.h>
66 1.2 ross
67 1.2 ross ENTRY(syst_int32_to_floatx80)
68 1.1 ross fildl 8(%esp)
69 1.1 ross movl 4(%esp),%eax
70 1.1 ross fstpt (%eax)
71 1.1 ross ret $4
72 1.1 ross
73 1.1 ross /*
74 1.1 ross -------------------------------------------------------------------------------
75 1.1 ross -------------------------------------------------------------------------------
76 1.1 ross */
77 1.2 ross
78 1.2 ross ENTRY(syst_int64_to_floatx80)
79 1.1 ross fildq 8(%esp)
80 1.1 ross movl 4(%esp),%eax
81 1.1 ross fstpt (%eax)
82 1.1 ross ret $4
83 1.1 ross
84 1.1 ross /*
85 1.1 ross -------------------------------------------------------------------------------
86 1.1 ross -------------------------------------------------------------------------------
87 1.1 ross */
88 1.2 ross ENTRY(syst_float32_to_floatx80)
89 1.1 ross flds 8(%esp)
90 1.1 ross movl 4(%esp),%eax
91 1.1 ross fstpt (%eax)
92 1.1 ross ret $4
93 1.1 ross
94 1.1 ross /*
95 1.1 ross -------------------------------------------------------------------------------
96 1.1 ross -------------------------------------------------------------------------------
97 1.1 ross */
98 1.2 ross ENTRY(syst_float64_to_floatx80)
99 1.1 ross fldl 8(%esp)
100 1.1 ross movl 4(%esp),%eax
101 1.1 ross fstpt (%eax)
102 1.1 ross ret $4
103 1.1 ross
104 1.1 ross /*
105 1.1 ross -------------------------------------------------------------------------------
106 1.1 ross -------------------------------------------------------------------------------
107 1.1 ross */
108 1.2 ross ENTRY(syst_floatx80_to_int32)
109 1.1 ross fldt 4(%esp)
110 1.1 ross subl $4,%esp
111 1.1 ross fistpl (%esp)
112 1.1 ross movl (%esp),%eax
113 1.1 ross addl $4,%esp
114 1.1 ross ret
115 1.1 ross
116 1.1 ross /*
117 1.1 ross -------------------------------------------------------------------------------
118 1.1 ross -------------------------------------------------------------------------------
119 1.1 ross */
120 1.2 ross ENTRY(syst_floatx80_to_int64)
121 1.1 ross fldt 4(%esp)
122 1.1 ross subl $8,%esp
123 1.1 ross fistpq (%esp)
124 1.1 ross movl (%esp),%eax
125 1.1 ross movl 4(%esp),%edx
126 1.1 ross addl $8,%esp
127 1.1 ross ret
128 1.1 ross
129 1.1 ross /*
130 1.1 ross -------------------------------------------------------------------------------
131 1.1 ross -------------------------------------------------------------------------------
132 1.1 ross */
133 1.2 ross ENTRY(syst_floatx80_to_float32)
134 1.1 ross fldt 4(%esp)
135 1.1 ross subl $4,%esp
136 1.1 ross fstps (%esp)
137 1.1 ross movl (%esp),%eax
138 1.1 ross addl $4,%esp
139 1.1 ross ret
140 1.1 ross
141 1.1 ross /*
142 1.1 ross -------------------------------------------------------------------------------
143 1.1 ross -------------------------------------------------------------------------------
144 1.1 ross */
145 1.2 ross ENTRY(syst_floatx80_to_float64)
146 1.1 ross fldt 4(%esp)
147 1.1 ross subl $8,%esp
148 1.1 ross fstpl (%esp)
149 1.1 ross movl 4(%esp),%edx
150 1.1 ross movl (%esp),%eax
151 1.1 ross addl $8,%esp
152 1.1 ross ret
153 1.1 ross
154 1.1 ross /*
155 1.1 ross -------------------------------------------------------------------------------
156 1.1 ross -------------------------------------------------------------------------------
157 1.1 ross */
158 1.2 ross ENTRY(syst_floatx80_round_to_int)
159 1.1 ross fldt 8(%esp)
160 1.1 ross frndint
161 1.1 ross movl 4(%esp),%eax
162 1.1 ross fstpt (%eax)
163 1.1 ross ret $4
164 1.1 ross
165 1.1 ross /*
166 1.1 ross -------------------------------------------------------------------------------
167 1.1 ross -------------------------------------------------------------------------------
168 1.1 ross */
169 1.2 ross ENTRY(syst_floatx80_add)
170 1.1 ross fldt 8(%esp)
171 1.1 ross fldt 20(%esp)
172 1.1 ross faddp
173 1.1 ross movl 4(%esp),%eax
174 1.1 ross fstpt (%eax)
175 1.1 ross ret $4
176 1.1 ross
177 1.1 ross /*
178 1.1 ross -------------------------------------------------------------------------------
179 1.1 ross -------------------------------------------------------------------------------
180 1.1 ross */
181 1.2 ross ENTRY(syst_floatx80_sub)
182 1.1 ross fldt 8(%esp)
183 1.1 ross fldt 20(%esp)
184 1.1 ross fsubrp
185 1.1 ross movl 4(%esp),%eax
186 1.1 ross fstpt (%eax)
187 1.1 ross ret $4
188 1.1 ross
189 1.1 ross /*
190 1.1 ross -------------------------------------------------------------------------------
191 1.1 ross -------------------------------------------------------------------------------
192 1.1 ross */
193 1.2 ross ENTRY(syst_floatx80_mul)
194 1.1 ross fldt 8(%esp)
195 1.1 ross fldt 20(%esp)
196 1.1 ross fmulp
197 1.1 ross movl 4(%esp),%eax
198 1.1 ross fstpt (%eax)
199 1.1 ross ret $4
200 1.1 ross
201 1.1 ross /*
202 1.1 ross -------------------------------------------------------------------------------
203 1.1 ross -------------------------------------------------------------------------------
204 1.1 ross */
205 1.2 ross ENTRY(syst_floatx80_div)
206 1.1 ross fldt 8(%esp)
207 1.1 ross fldt 20(%esp)
208 1.1 ross fdivrp
209 1.1 ross movl 4(%esp),%eax
210 1.1 ross fstpt (%eax)
211 1.1 ross ret $4
212 1.1 ross
213 1.1 ross /*
214 1.1 ross -------------------------------------------------------------------------------
215 1.1 ross -------------------------------------------------------------------------------
216 1.1 ross */
217 1.2 ross ENTRY(syst_floatx80_rem)
218 1.1 ross fldt 20(%esp)
219 1.1 ross fldt 8(%esp)
220 1.1 ross floatx80_rem_loop:
221 1.1 ross fprem1
222 1.1 ross fnstsw %ax
223 1.1 ross btw $10,%ax
224 1.1 ross jc floatx80_rem_loop
225 1.1 ross movl 4(%esp),%eax
226 1.1 ross fstpt (%eax)
227 1.1 ross fstp %st(0)
228 1.1 ross ret $4
229 1.1 ross
230 1.1 ross /*
231 1.1 ross -------------------------------------------------------------------------------
232 1.1 ross -------------------------------------------------------------------------------
233 1.1 ross */
234 1.2 ross ENTRY(syst_floatx80_sqrt)
235 1.1 ross fldt 8(%esp)
236 1.1 ross fsqrt
237 1.1 ross movl 4(%esp),%eax
238 1.1 ross fstpt (%eax)
239 1.1 ross ret $4
240 1.1 ross
241 1.1 ross /*
242 1.1 ross -------------------------------------------------------------------------------
243 1.1 ross -------------------------------------------------------------------------------
244 1.1 ross */
245 1.2 ross ENTRY(syst_floatx80_eq)
246 1.1 ross fldt 16(%esp)
247 1.1 ross fldt 4(%esp)
248 1.1 ross fucompp
249 1.1 ross fnstsw %ax
250 1.1 ross andw $17664,%ax
251 1.1 ross cmpw $16384,%ax
252 1.1 ross seteb %al
253 1.1 ross movzb %al,%eax
254 1.1 ross ret
255 1.1 ross
256 1.1 ross /*
257 1.1 ross -------------------------------------------------------------------------------
258 1.1 ross -------------------------------------------------------------------------------
259 1.1 ross */
260 1.2 ross ENTRY(syst_floatx80_le)
261 1.1 ross fldt 4(%esp)
262 1.1 ross fldt 16(%esp)
263 1.1 ross fcompp
264 1.1 ross fnstsw %ax
265 1.1 ross notl %eax
266 1.1 ross shrl $8,%eax
267 1.1 ross andl $1,%eax
268 1.1 ross ret
269 1.1 ross
270 1.1 ross /*
271 1.1 ross -------------------------------------------------------------------------------
272 1.1 ross -------------------------------------------------------------------------------
273 1.1 ross */
274 1.2 ross ENTRY(syst_floatx80_lt)
275 1.1 ross fldt 4(%esp)
276 1.1 ross fldt 16(%esp)
277 1.1 ross fcompp
278 1.1 ross fnstsw %ax
279 1.1 ross andw $17664,%ax
280 1.1 ross setzb %al
281 1.1 ross movzb %al,%eax
282 1.1 ross ret
283 1.1 ross
284 1.1 ross /*
285 1.1 ross -------------------------------------------------------------------------------
286 1.1 ross -------------------------------------------------------------------------------
287 1.1 ross */
288 1.2 ross ENTRY(syst_floatx80_eq_signaling)
289 1.1 ross fldt 16(%esp)
290 1.1 ross fldt 4(%esp)
291 1.1 ross fcompp
292 1.1 ross fnstsw %ax
293 1.1 ross andw $17664,%ax
294 1.1 ross cmpw $16384,%ax
295 1.1 ross seteb %al
296 1.1 ross movzb %al,%eax
297 1.1 ross ret
298 1.1 ross
299 1.1 ross /*
300 1.1 ross -------------------------------------------------------------------------------
301 1.1 ross -------------------------------------------------------------------------------
302 1.1 ross */
303 1.2 ross ENTRY(syst_floatx80_le_quiet)
304 1.1 ross fldt 4(%esp)
305 1.1 ross fldt 16(%esp)
306 1.1 ross fucompp
307 1.1 ross fnstsw %ax
308 1.1 ross notl %eax
309 1.1 ross shrl $8,%eax
310 1.1 ross andl $1,%eax
311 1.1 ross ret
312 1.1 ross
313 1.1 ross /*
314 1.1 ross -------------------------------------------------------------------------------
315 1.1 ross -------------------------------------------------------------------------------
316 1.1 ross */
317 1.2 ross
318 1.2 ross ENTRY(syst_floatx80_lt_quiet)
319 1.1 ross fldt 4(%esp)
320 1.1 ross fldt 16(%esp)
321 1.1 ross fucompp
322 1.1 ross fnstsw %ax
323 1.1 ross andw $17664,%ax
324 1.1 ross setzb %al
325 1.1 ross movzb %al,%eax
326 1.1 ross ret
327 1.1 ross
328 1.2 ross /*
329 1.2 ross -------------------------------------------------------------------------------
330 1.2 ross -------------------------------------------------------------------------------
331 1.2 ross */
332 1.2 ross
333 1.2 ross ENTRY(syst_floatx80_to_int32_round_to_zero)
334 1.2 ross pushl %ebp
335 1.2 ross movl %esp,%ebp
336 1.2 ross subl $12,%esp
337 1.2 ross fldt 8(%ebp)
338 1.2 ross fnstcw -4(%ebp)
339 1.2 ross movl -4(%ebp),%edx
340 1.2 ross movb $12,%dh
341 1.2 ross movl %edx,-12(%ebp)
342 1.2 ross fldcw -12(%ebp)
343 1.2 ross fistpl -12(%ebp)
344 1.2 ross movl -12(%ebp),%eax
345 1.2 ross fldcw -4(%ebp)
346 1.2 ross leave
347 1.2 ross ret
348 1.2 ross
349 1.2 ross /*
350 1.2 ross -------------------------------------------------------------------------------
351 1.2 ross -------------------------------------------------------------------------------
352 1.2 ross */
353 1.2 ross
354 1.2 ross ENTRY(syst_floatx80_to_int64_round_to_zero)
355 1.2 ross pushl %ebp
356 1.2 ross movl %esp,%ebp
357 1.2 ross subl $12,%esp
358 1.2 ross fldt 8(%ebp)
359 1.2 ross fnstcw -4(%ebp)
360 1.2 ross movl -4(%ebp),%ecx
361 1.2 ross movb $12,%ch
362 1.2 ross movl %ecx,-12(%ebp)
363 1.2 ross fldcw -12(%ebp)
364 1.2 ross fistpq -12(%ebp)
365 1.2 ross movl -12(%ebp),%eax
366 1.2 ross movl -8(%ebp),%edx
367 1.2 ross fldcw -4(%ebp)
368 1.2 ross leave
369 1.2 ross ret
370