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