提交 b09b7890 编写于 作者: R Rich Felker

floating point environment, untested

at present the i386 code does not support sse floating point, which is
not part of the standard i386 abi. while it may be desirable to
support it later, doing so will reduce performance and require some
tricks to probe if sse support is present.

this first commit is i386-only, but it should be trivial to port the
asm to x86_64.
上级 2afebbbc
#include <fenv.h>
int fegetexceptflag(fexcept_t *fp, int mask)
{
*fp = fetestexcept(mask);
return 0;
}
#include <fenv.h>
int feholdexcept(fenv_t *envp)
{
fegetenv(envp);
return 0;
}
#include <fenv.h>
/* Dummy functions for archs lacking fenv implementation */
int feclearexcept(int mask)
{
return 0;
}
int feraiseexcept(int mask)
{
return 0;
}
int fetestexcept(int mask)
{
return 0;
}
int fegetround(void)
{
return 0;
}
int fesetround(int r)
{
return 0;
}
int fegetenv(fenv_t *envp)
{
return 0;
}
int fesetenv(const fenv_t *envp)
{
return 0;
}
#include <fenv.h>
int fesetexceptflag(const fexcept_t *fp, int mask)
{
feclearexcept(~*fp & mask);
feraiseexcept(*fp & mask);
return 0;
}
#include <fenv.h>
int feupdateenv(const fenv_t *envp)
{
int ex = fetestexcept(FE_ALL_EXCEPT);
fesetenv(envp);
feraiseexcept(ex);
return 0;
}
2: not %ecx
sub $32,%esp
fnstenv (%esp)
and %ecx,4(%esp)
or %edx,4(%esp)
fldenv (%esp)
add $32,%esp
ret
.global feclearexcept
feclearexcept:
xor %eax,%eax
mov 4(%esp),%ecx
xor %edx,%edx
test %ecx,%ecx
jnz 2b
ret
.global feraiseexcept
feraiseexcept:
xor %eax,%eax
mov 4(%esp),%edx
xor %ecx,%ecx
test %edx,%edx
jnz 2b
ret
.global fesetround
fesetround:
xor %eax,%eax
mov $0xc00,%ecx
mov 4(%esp),%edx
jmp 2b
.global fegetround
fegetround:
sub $28,%esp
fnstenv (%esp)
mov 4(%esp),%eax
add $28,%esp
and $0xc,%ah
ret
.global fegetenv
fegetenv:
mov 4(%esp),%ecx
xor %eax,%eax
fnstenv (%ecx)
ret
.global fesetenv
fesetenv:
mov 4(%esp),%ecx
xor %eax,%eax
test %ecx,%ecx
jz 1f
fldenv (%ecx)
ret
1: push %eax
push %eax
push %eax
push %eax
push %eax
push %eax
pushl $0x37f
fldenv (%esp)
add $28,%esp
ret
.global fetestexcept
fetestexcept:
mov 4(%esp),%ecx
fnstsw %ax
and %ecx,%eax
ret
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册