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