Home | History | Annotate | Line # | Download | only in i386
      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