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