math.floats.env: detect +fp-x87-stack-fault+ during collect-fp-exceptions block

db4
Joe Groff 2010-08-12 23:22:09 -07:00
parent 42b858b3f0
commit 8347a9ead8
3 changed files with 26 additions and 1 deletions

View File

@ -1 +1,2 @@
not loaded
not tested

View File

@ -0,0 +1,21 @@
USING: math.floats.env math.floats.env.x86 tools.test
alien.c-types alien.syntax classes.struct compiler.test
math kernel sequences ;
IN: math.floats.env.x86.tests
! the sqrtl function is really long double sqrtl ( long double x )
! calling it as if it had a void return leaves the return value on
! the x87 stack, so 9 calls will be guaranteed to cause a stack
! fault
STRUCT: fake-long-double { x char[20] } ;
FUNCTION-ALIAS: busted-sqrtl
void sqrtl ( fake-long-double x ) ;
[ t ] [
[
[
9 [ fake-long-double <struct> busted-sqrtl ] times
] collect-fp-exceptions
] compile-call
+fp-x87-stack-fault+ swap member?
] unit-test

View File

@ -88,7 +88,9 @@ M: sse-env (set-denormal-mode) ( register mode -- register' )
} case
] curry change-mxcsr ; inline
CONSTANT: x87-exception-bits HEX: 3f
SINGLETON: +fp-x87-stack-fault+
CONSTANT: x87-exception-bits HEX: 7f
CONSTANT: x87-exception>bit
H{
{ +fp-invalid-operation+ HEX: 01 }
@ -96,6 +98,7 @@ CONSTANT: x87-exception>bit
{ +fp-underflow+ HEX: 10 }
{ +fp-zero-divide+ HEX: 04 }
{ +fp-inexact+ HEX: 20 }
{ +fp-x87-stack-fault+ HEX: 40 }
}
CONSTANT: x87-rounding-mode-bits HEX: 0c00