github.com/afumu/libc@v0.0.6/musl/src/fenv/i386/fenv.s (about)

     1  .hidden __hwcap
     2  
     3  .global feclearexcept
     4  .type feclearexcept,@function
     5  feclearexcept:	
     6  	mov 4(%esp),%ecx
     7  	and $0x3f,%ecx
     8  	fnstsw %ax
     9  		# consider sse fenv as well if the cpu has XMM capability
    10  	call 1f
    11  1:	addl $__hwcap-1b,(%esp)
    12  	pop %edx
    13  	testl $0x02000000,(%edx)
    14  	jz 2f
    15  		# maintain exceptions in the sse mxcsr, clear x87 exceptions
    16  	test %eax,%ecx
    17  	jz 1f
    18  	fnclex
    19  1:	push %edx
    20  	stmxcsr (%esp)
    21  	pop %edx
    22  	and $0x3f,%eax
    23  	or %eax,%edx
    24  	test %edx,%ecx
    25  	jz 1f
    26  	not %ecx
    27  	and %ecx,%edx
    28  	push %edx
    29  	ldmxcsr (%esp)
    30  	pop %edx
    31  1:	xor %eax,%eax
    32  	ret
    33  		# only do the expensive x87 fenv load/store when needed
    34  2:	test %eax,%ecx
    35  	jz 1b
    36  	not %ecx
    37  	and %ecx,%eax
    38  	test $0x3f,%eax
    39  	jz 1f
    40  	fnclex
    41  	jmp 1b
    42  1:	sub $32,%esp
    43  	fnstenv (%esp)
    44  	mov %al,4(%esp)
    45  	fldenv (%esp)
    46  	add $32,%esp
    47  	xor %eax,%eax
    48  	ret
    49  
    50  .global feraiseexcept
    51  .type feraiseexcept,@function
    52  feraiseexcept:	
    53  	mov 4(%esp),%eax
    54  	and $0x3f,%eax
    55  	sub $32,%esp
    56  	fnstenv (%esp)
    57  	or %al,4(%esp)
    58  	fldenv (%esp)
    59  	add $32,%esp
    60  	xor %eax,%eax
    61  	ret
    62  
    63  .global __fesetround
    64  .hidden __fesetround
    65  .type __fesetround,@function
    66  __fesetround:
    67  	mov 4(%esp),%ecx
    68  	push %eax
    69  	xor %eax,%eax
    70  	fnstcw (%esp)
    71  	andb $0xf3,1(%esp)
    72  	or %ch,1(%esp)
    73  	fldcw (%esp)
    74  		# consider sse fenv as well if the cpu has XMM capability
    75  	call 1f
    76  1:	addl $__hwcap-1b,(%esp)
    77  	pop %edx
    78  	testl $0x02000000,(%edx)
    79  	jz 1f
    80  	stmxcsr (%esp)
    81  	shl $3,%ch
    82  	andb $0x9f,1(%esp)
    83  	or %ch,1(%esp)
    84  	ldmxcsr (%esp)
    85  1:	pop %ecx
    86  	ret
    87  
    88  .global fegetround
    89  .type fegetround,@function
    90  fegetround:
    91  	push %eax
    92  	fnstcw (%esp)
    93  	pop %eax
    94  	and $0xc00,%eax
    95  	ret
    96  
    97  .global fegetenv
    98  .type fegetenv,@function
    99  fegetenv:
   100  	mov 4(%esp),%ecx
   101  	xor %eax,%eax
   102  	fnstenv (%ecx)
   103  		# consider sse fenv as well if the cpu has XMM capability
   104  	call 1f
   105  1:	addl $__hwcap-1b,(%esp)
   106  	pop %edx
   107  	testl $0x02000000,(%edx)
   108  	jz 1f
   109  	push %eax
   110  	stmxcsr (%esp)
   111  	pop %edx
   112  	and $0x3f,%edx
   113  	or %edx,4(%ecx)
   114  1:	ret
   115  
   116  .global fesetenv
   117  .type fesetenv,@function
   118  fesetenv:
   119  	mov 4(%esp),%ecx
   120  	xor %eax,%eax
   121  	inc %ecx
   122  	jz 1f
   123  	fldenv -1(%ecx)
   124  	movl -1(%ecx),%ecx
   125  	jmp 2f
   126  1:	push %eax
   127  	push %eax
   128  	push %eax
   129  	push %eax
   130  	pushl $0xffff
   131  	push %eax
   132  	pushl $0x37f
   133  	fldenv (%esp)
   134  	add $28,%esp
   135  		# consider sse fenv as well if the cpu has XMM capability
   136  2:	call 1f
   137  1:	addl $__hwcap-1b,(%esp)
   138  	pop %edx
   139  	testl $0x02000000,(%edx)
   140  	jz 1f
   141  		# mxcsr := same rounding mode, cleared exceptions, default mask
   142  	and $0xc00,%ecx
   143  	shl $3,%ecx
   144  	or $0x1f80,%ecx
   145  	mov %ecx,4(%esp)
   146  	ldmxcsr 4(%esp)
   147  1:	ret
   148  
   149  .global fetestexcept
   150  .type fetestexcept,@function
   151  fetestexcept:
   152  	mov 4(%esp),%ecx
   153  	and $0x3f,%ecx
   154  	fnstsw %ax
   155  		# consider sse fenv as well if the cpu has XMM capability
   156  	call 1f
   157  1:	addl $__hwcap-1b,(%esp)
   158  	pop %edx
   159  	testl $0x02000000,(%edx)
   160  	jz 1f
   161  	stmxcsr 4(%esp)
   162  	or 4(%esp),%eax
   163  1:	and %ecx,%eax
   164  	ret