mirror of
https://github.com/Zenithsiz/ftmemsim-valgrind.git
synced 2026-02-04 02:18:37 +00:00
Add test cases for out-of-range argument handling for x87 instructions
FSIN, FCOS, FSINCOS and FPTAN. Mozilla bug 995564. git-svn-id: svn://svn.valgrind.org/valgrind/trunk@13921
This commit is contained in:
parent
d8b376f404
commit
6199b0550b
@ -80,6 +80,7 @@ EXTRA_DIST = \
|
||||
slahf-amd64.stderr.exp slahf-amd64.stdout.exp \
|
||||
slahf-amd64.vgtest \
|
||||
tm1.vgtest tm1.stderr.exp tm1.stdout.exp \
|
||||
x87trigOOR.vgtest x87trigOOR.stderr.exp x87trigOOR.stdout.exp \
|
||||
xacq_xrel.stderr.exp xacq_xrel.stdout.exp xacq_xrel.vgtest \
|
||||
xadd.stderr.exp xadd.stdout.exp xadd.vgtest
|
||||
|
||||
@ -96,6 +97,7 @@ check_PROGRAMS = \
|
||||
smc1 \
|
||||
sbbmisc \
|
||||
nibz_bennee_mmap \
|
||||
x87trigOOR \
|
||||
xadd
|
||||
if BUILD_ADDR32_TESTS
|
||||
check_PROGRAMS += asorep
|
||||
|
||||
1
none/tests/amd64/x87trigOOR.c
Symbolic link
1
none/tests/amd64/x87trigOOR.c
Symbolic link
@ -0,0 +1 @@
|
||||
../x86/x87trigOOR.c
|
||||
2
none/tests/amd64/x87trigOOR.stderr.exp
Normal file
2
none/tests/amd64/x87trigOOR.stderr.exp
Normal file
@ -0,0 +1,2 @@
|
||||
|
||||
|
||||
72
none/tests/amd64/x87trigOOR.stdout.exp
Normal file
72
none/tests/amd64/x87trigOOR.stdout.exp
Normal file
@ -0,0 +1,72 @@
|
||||
fsin 0.000000e+00 --> 0.000000e+00 3.141593e+00 0000
|
||||
fsin 1.230000e-01 --> 1.226901e-01 3.141593e+00 0000
|
||||
fsin -4.560000e-01 --> -4.403604e-01 3.141593e+00 0000
|
||||
fsin 3.700000e+01 --> -6.435381e-01 3.141593e+00 0000
|
||||
fsin -5.300000e+01 --> -3.959252e-01 3.141593e+00 0000
|
||||
|
||||
fsin 8.301035e+18 --> -1.249775e-01 3.141593e+00 0000
|
||||
fsin 9.223363e+18 --> 2.344065e-01 3.141593e+00 0000
|
||||
fsin 9.223372e+18 --> 9.223372e+18 3.141593e+00 0400
|
||||
fsin 9.223381e+18 --> 9.223381e+18 3.141593e+00 0400
|
||||
fsin 1.014571e+19 --> 1.014571e+19 3.141593e+00 0400
|
||||
|
||||
fsin -8.301035e+18 --> 1.249775e-01 3.141593e+00 0000
|
||||
fsin -9.223363e+18 --> -2.344065e-01 3.141593e+00 0000
|
||||
fsin -9.223372e+18 --> -9.223372e+18 3.141593e+00 0400
|
||||
fsin -9.223381e+18 --> -9.223381e+18 3.141593e+00 0400
|
||||
fsin -1.014571e+19 --> -1.014571e+19 3.141593e+00 0400
|
||||
|
||||
fcos 0.000000e+00 --> 1.000000e+00 3.141593e+00 0000
|
||||
fcos 1.230000e-01 --> 9.924450e-01 3.141593e+00 0000
|
||||
fcos -4.560000e-01 --> 8.978211e-01 3.141593e+00 0000
|
||||
fcos 3.700000e+01 --> 7.654141e-01 3.141593e+00 0000
|
||||
fcos -5.300000e+01 --> -9.182828e-01 3.141593e+00 0000
|
||||
|
||||
fcos 8.301035e+18 --> -9.921596e-01 3.141593e+00 0000
|
||||
fcos 9.223363e+18 --> 9.721387e-01 3.141593e+00 0000
|
||||
fcos 9.223372e+18 --> 9.223372e+18 3.141593e+00 0400
|
||||
fcos 9.223381e+18 --> 9.223381e+18 3.141593e+00 0400
|
||||
fcos 1.014571e+19 --> 1.014571e+19 3.141593e+00 0400
|
||||
|
||||
fcos -8.301035e+18 --> -9.921596e-01 3.141593e+00 0000
|
||||
fcos -9.223363e+18 --> 9.721387e-01 3.141593e+00 0000
|
||||
fcos -9.223372e+18 --> -9.223372e+18 3.141593e+00 0400
|
||||
fcos -9.223381e+18 --> -9.223381e+18 3.141593e+00 0400
|
||||
fcos -1.014571e+19 --> -1.014571e+19 3.141593e+00 0400
|
||||
|
||||
fsincos 0.000000e+00 --> 1.000000e+00 0.000000e+00 0000
|
||||
fsincos 1.230000e-01 --> 9.924450e-01 1.226901e-01 0000
|
||||
fsincos -4.560000e-01 --> 8.978211e-01 -4.403604e-01 0000
|
||||
fsincos 3.700000e+01 --> 7.654141e-01 -6.435381e-01 0000
|
||||
fsincos -5.300000e+01 --> -9.182828e-01 -3.959252e-01 0000
|
||||
|
||||
fsincos 8.301035e+18 --> -9.921596e-01 -1.249775e-01 0000
|
||||
fsincos 9.223363e+18 --> 9.721387e-01 2.344065e-01 0000
|
||||
fsincos 9.223372e+18 --> 9.223372e+18 3.141593e+00 0400
|
||||
fsincos 9.223381e+18 --> 9.223381e+18 3.141593e+00 0400
|
||||
fsincos 1.014571e+19 --> 1.014571e+19 3.141593e+00 0400
|
||||
|
||||
fsincos -8.301035e+18 --> -9.921596e-01 1.249775e-01 0000
|
||||
fsincos -9.223363e+18 --> 9.721387e-01 -2.344065e-01 0000
|
||||
fsincos -9.223372e+18 --> -9.223372e+18 3.141593e+00 0400
|
||||
fsincos -9.223381e+18 --> -9.223381e+18 3.141593e+00 0400
|
||||
fsincos -1.014571e+19 --> -1.014571e+19 3.141593e+00 0400
|
||||
|
||||
fptan 0.000000e+00 --> 1.000000e+00 0.000000e+00 0000
|
||||
fptan 1.230000e-01 --> 1.000000e+00 1.236241e-01 0000
|
||||
fptan -4.560000e-01 --> 1.000000e+00 -4.904767e-01 0000
|
||||
fptan 3.700000e+01 --> 1.000000e+00 -8.407713e-01 0000
|
||||
fptan -5.300000e+01 --> 1.000000e+00 4.311582e-01 0000
|
||||
|
||||
fptan 8.301035e+18 --> 1.000000e+00 1.259651e-01 0000
|
||||
fptan 9.223363e+18 --> 1.000000e+00 2.411246e-01 0000
|
||||
fptan 9.223372e+18 --> 9.223372e+18 3.141593e+00 0400
|
||||
fptan 9.223381e+18 --> 9.223381e+18 3.141593e+00 0400
|
||||
fptan 1.014571e+19 --> 1.014571e+19 3.141593e+00 0400
|
||||
|
||||
fptan -8.301035e+18 --> 1.000000e+00 -1.259651e-01 0000
|
||||
fptan -9.223363e+18 --> 1.000000e+00 -2.411246e-01 0000
|
||||
fptan -9.223372e+18 --> -9.223372e+18 3.141593e+00 0400
|
||||
fptan -9.223381e+18 --> -9.223381e+18 3.141593e+00 0400
|
||||
fptan -1.014571e+19 --> -1.014571e+19 3.141593e+00 0400
|
||||
|
||||
1
none/tests/amd64/x87trigOOR.vgtest
Normal file
1
none/tests/amd64/x87trigOOR.vgtest
Normal file
@ -0,0 +1 @@
|
||||
prog: x87trigOOR
|
||||
@ -61,6 +61,7 @@ EXTRA_DIST = \
|
||||
ssse3_misaligned.stderr.exp ssse3_misaligned.stdout.exp \
|
||||
ssse3_misaligned.vgtest ssse3_misaligned.c \
|
||||
x86locked.vgtest x86locked.stdout.exp x86locked.stderr.exp \
|
||||
x87trigOOR.vgtest x87trigOOR.stdout.exp x87trigOOR.stderr.exp \
|
||||
yield.stderr.exp yield.stdout.exp yield.disabled \
|
||||
xadd.stdout.exp xadd.stderr.exp xadd.vgtest
|
||||
|
||||
@ -94,6 +95,7 @@ check_PROGRAMS = \
|
||||
shift_ndep \
|
||||
smc1 \
|
||||
x86locked \
|
||||
x87trigOOR \
|
||||
yield \
|
||||
xadd
|
||||
if BUILD_SSSE3_TESTS
|
||||
|
||||
159
none/tests/x86/x87trigOOR.c
Normal file
159
none/tests/x86/x87trigOOR.c
Normal file
@ -0,0 +1,159 @@
|
||||
|
||||
/* Tests out of range handling for FSIN, FCOS, FSINCOS and FPTAN. Be
|
||||
careful with the inline assembly -- this program is compiled as
|
||||
both a 32-bit and 64-bit test. */
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <assert.h>
|
||||
|
||||
typedef unsigned short int UShort;
|
||||
typedef unsigned int UInt;
|
||||
typedef double Double;
|
||||
typedef unsigned long long int ULong;
|
||||
|
||||
typedef struct { Double arg; Double st0; Double st1; UShort fpusw; } Res;
|
||||
|
||||
#define SHIFT_C3 14
|
||||
#define SHIFT_C2 10
|
||||
#define SHIFT_C1 9
|
||||
#define SHIFT_C0 8
|
||||
|
||||
|
||||
#define my_offsetof(type,memb) ((int)(unsigned long int)&((type*)0)->memb)
|
||||
|
||||
void do_fsin ( /*OUT*/Res* r, double d )
|
||||
{
|
||||
assert(my_offsetof(Res,arg) == 0);
|
||||
assert(my_offsetof(Res,st0) == 8);
|
||||
assert(my_offsetof(Res,st1) == 16);
|
||||
assert(my_offsetof(Res,fpusw) == 24);
|
||||
memset(r, 0, sizeof(*r));
|
||||
r->arg = d;
|
||||
__asm__ __volatile__(
|
||||
"finit" "\n\t"
|
||||
"fldpi" "\n\t"
|
||||
"fldl 0(%0)" "\n\t" // .arg
|
||||
"fsin" "\n\t"
|
||||
"fstsw %%ax" "\n\t"
|
||||
"fstpl 8(%0)" "\n\t" // .st0
|
||||
"fstpl 16(%0)" "\n\t" // .st1
|
||||
"movw %%ax, 24(%0)" "\n\t" // .fpusw
|
||||
"finit" "\n"
|
||||
: : "r"(r) : "eax","cc","memory"
|
||||
);
|
||||
}
|
||||
|
||||
void do_fcos ( /*OUT*/Res* r, double d )
|
||||
{
|
||||
assert(my_offsetof(Res,arg) == 0);
|
||||
assert(my_offsetof(Res,st0) == 8);
|
||||
assert(my_offsetof(Res,st1) == 16);
|
||||
assert(my_offsetof(Res,fpusw) == 24);
|
||||
memset(r, 0, sizeof(*r));
|
||||
r->arg = d;
|
||||
__asm__ __volatile__(
|
||||
"finit" "\n\t"
|
||||
"fldpi" "\n\t"
|
||||
"fldl 0(%0)" "\n\t" // .arg
|
||||
"fcos" "\n\t"
|
||||
"fstsw %%ax" "\n\t"
|
||||
"fstpl 8(%0)" "\n\t" // .st0
|
||||
"fstpl 16(%0)" "\n\t" // .st1
|
||||
"movw %%ax, 24(%0)" "\n\t" // .fpusw
|
||||
"finit" "\n"
|
||||
: : "r"(r) : "eax","cc","memory"
|
||||
);
|
||||
}
|
||||
|
||||
void do_fsincos ( /*OUT*/Res* r, double d )
|
||||
{
|
||||
assert(my_offsetof(Res,arg) == 0);
|
||||
assert(my_offsetof(Res,st0) == 8);
|
||||
assert(my_offsetof(Res,st1) == 16);
|
||||
assert(my_offsetof(Res,fpusw) == 24);
|
||||
memset(r, 0, sizeof(*r));
|
||||
r->arg = d;
|
||||
__asm__ __volatile__(
|
||||
"finit" "\n\t"
|
||||
"fldpi" "\n\t"
|
||||
"fldl 0(%0)" "\n\t" // .arg
|
||||
"fsincos" "\n\t"
|
||||
"fstsw %%ax" "\n\t"
|
||||
"fstpl 8(%0)" "\n\t" // .st0
|
||||
"fstpl 16(%0)" "\n\t" // .st1
|
||||
"movw %%ax, 24(%0)" "\n\t" // .fpusw
|
||||
"finit" "\n"
|
||||
: : "r"(r) : "eax","cc","memory"
|
||||
);
|
||||
}
|
||||
|
||||
void do_fptan ( /*OUT*/Res* r, double d )
|
||||
{
|
||||
assert(my_offsetof(Res,arg) == 0);
|
||||
assert(my_offsetof(Res,st0) == 8);
|
||||
assert(my_offsetof(Res,st1) == 16);
|
||||
assert(my_offsetof(Res,fpusw) == 24);
|
||||
memset(r, 0, sizeof(*r));
|
||||
r->arg = d;
|
||||
__asm__ __volatile__(
|
||||
"finit" "\n\t"
|
||||
"fldpi" "\n\t"
|
||||
"fldl 0(%0)" "\n\t" // .arg
|
||||
"fptan" "\n\t"
|
||||
"fstsw %%ax" "\n\t"
|
||||
"fstpl 8(%0)" "\n\t" // .st0
|
||||
"fstpl 16(%0)" "\n\t" // .st1
|
||||
"movw %%ax, 24(%0)" "\n\t" // .fpusw
|
||||
"finit" "\n"
|
||||
: : "r"(r) : "eax","cc","memory"
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
void try ( char* name, void(*fn)(Res*,double), double d )
|
||||
{
|
||||
Res r;
|
||||
fn(&r, d);
|
||||
// Mask out all except C2 (range)
|
||||
r.fpusw &= (1 << SHIFT_C2);
|
||||
printf("%s %16e --> %16e %16e %04x\n",
|
||||
name, r.arg, r.st0, r.st1, (UInt)r.fpusw);
|
||||
}
|
||||
|
||||
int main ( void )
|
||||
{
|
||||
Double limit = 9223372036854775808.0; // 2^63
|
||||
|
||||
char* names[4] = { "fsin ", "fcos ", "fsincos", "fptan " };
|
||||
void(*fns[4])(Res*,double) = { do_fsin, do_fcos, do_fsincos, do_fptan };
|
||||
|
||||
int i;
|
||||
for (i = 0; i < 4; i++) {
|
||||
char* name = names[i];
|
||||
void (*fn)(Res*,double) = fns[i];
|
||||
|
||||
try( name, fn, 0.0 );
|
||||
try( name, fn, 0.123 );
|
||||
try( name, fn, -0.456 );
|
||||
try( name, fn, 37.0 );
|
||||
try( name, fn, -53.0 );
|
||||
printf("\n");
|
||||
|
||||
try( name, fn, limit * 0.900000 );
|
||||
try( name, fn, limit * 0.999999 );
|
||||
try( name, fn, limit * 1.000000 );
|
||||
try( name, fn, limit * 1.000001 );
|
||||
try( name, fn, limit * 1.100000 );
|
||||
printf("\n");
|
||||
|
||||
try( name, fn, -limit * 0.900000 );
|
||||
try( name, fn, -limit * 0.999999 );
|
||||
try( name, fn, -limit * 1.000000 );
|
||||
try( name, fn, -limit * 1.000001 );
|
||||
try( name, fn, -limit * 1.100000 );
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
2
none/tests/x86/x87trigOOR.stderr.exp
Normal file
2
none/tests/x86/x87trigOOR.stderr.exp
Normal file
@ -0,0 +1,2 @@
|
||||
|
||||
|
||||
72
none/tests/x86/x87trigOOR.stdout.exp
Normal file
72
none/tests/x86/x87trigOOR.stdout.exp
Normal file
@ -0,0 +1,72 @@
|
||||
fsin 0.000000e+00 --> 0.000000e+00 3.141593e+00 0000
|
||||
fsin 1.230000e-01 --> 1.226901e-01 3.141593e+00 0000
|
||||
fsin -4.560000e-01 --> -4.403604e-01 3.141593e+00 0000
|
||||
fsin 3.700000e+01 --> -6.435381e-01 3.141593e+00 0000
|
||||
fsin -5.300000e+01 --> -3.959252e-01 3.141593e+00 0000
|
||||
|
||||
fsin 8.301035e+18 --> -1.249775e-01 3.141593e+00 0000
|
||||
fsin 9.223363e+18 --> 2.344065e-01 3.141593e+00 0000
|
||||
fsin 9.223372e+18 --> 9.223372e+18 3.141593e+00 0400
|
||||
fsin 9.223381e+18 --> 9.223381e+18 3.141593e+00 0400
|
||||
fsin 1.014571e+19 --> 1.014571e+19 3.141593e+00 0400
|
||||
|
||||
fsin -8.301035e+18 --> 1.249775e-01 3.141593e+00 0000
|
||||
fsin -9.223363e+18 --> -2.344065e-01 3.141593e+00 0000
|
||||
fsin -9.223372e+18 --> -9.223372e+18 3.141593e+00 0400
|
||||
fsin -9.223381e+18 --> -9.223381e+18 3.141593e+00 0400
|
||||
fsin -1.014571e+19 --> -1.014571e+19 3.141593e+00 0400
|
||||
|
||||
fcos 0.000000e+00 --> 1.000000e+00 3.141593e+00 0000
|
||||
fcos 1.230000e-01 --> 9.924450e-01 3.141593e+00 0000
|
||||
fcos -4.560000e-01 --> 8.978211e-01 3.141593e+00 0000
|
||||
fcos 3.700000e+01 --> 7.654141e-01 3.141593e+00 0000
|
||||
fcos -5.300000e+01 --> -9.182828e-01 3.141593e+00 0000
|
||||
|
||||
fcos 8.301035e+18 --> -9.921596e-01 3.141593e+00 0000
|
||||
fcos 9.223363e+18 --> 9.721387e-01 3.141593e+00 0000
|
||||
fcos 9.223372e+18 --> 9.223372e+18 3.141593e+00 0400
|
||||
fcos 9.223381e+18 --> 9.223381e+18 3.141593e+00 0400
|
||||
fcos 1.014571e+19 --> 1.014571e+19 3.141593e+00 0400
|
||||
|
||||
fcos -8.301035e+18 --> -9.921596e-01 3.141593e+00 0000
|
||||
fcos -9.223363e+18 --> 9.721387e-01 3.141593e+00 0000
|
||||
fcos -9.223372e+18 --> -9.223372e+18 3.141593e+00 0400
|
||||
fcos -9.223381e+18 --> -9.223381e+18 3.141593e+00 0400
|
||||
fcos -1.014571e+19 --> -1.014571e+19 3.141593e+00 0400
|
||||
|
||||
fsincos 0.000000e+00 --> 1.000000e+00 0.000000e+00 0000
|
||||
fsincos 1.230000e-01 --> 9.924450e-01 1.226901e-01 0000
|
||||
fsincos -4.560000e-01 --> 8.978211e-01 -4.403604e-01 0000
|
||||
fsincos 3.700000e+01 --> 7.654141e-01 -6.435381e-01 0000
|
||||
fsincos -5.300000e+01 --> -9.182828e-01 -3.959252e-01 0000
|
||||
|
||||
fsincos 8.301035e+18 --> -9.921596e-01 -1.249775e-01 0000
|
||||
fsincos 9.223363e+18 --> 9.721387e-01 2.344065e-01 0000
|
||||
fsincos 9.223372e+18 --> 9.223372e+18 3.141593e+00 0400
|
||||
fsincos 9.223381e+18 --> 9.223381e+18 3.141593e+00 0400
|
||||
fsincos 1.014571e+19 --> 1.014571e+19 3.141593e+00 0400
|
||||
|
||||
fsincos -8.301035e+18 --> -9.921596e-01 1.249775e-01 0000
|
||||
fsincos -9.223363e+18 --> 9.721387e-01 -2.344065e-01 0000
|
||||
fsincos -9.223372e+18 --> -9.223372e+18 3.141593e+00 0400
|
||||
fsincos -9.223381e+18 --> -9.223381e+18 3.141593e+00 0400
|
||||
fsincos -1.014571e+19 --> -1.014571e+19 3.141593e+00 0400
|
||||
|
||||
fptan 0.000000e+00 --> 1.000000e+00 0.000000e+00 0000
|
||||
fptan 1.230000e-01 --> 1.000000e+00 1.236241e-01 0000
|
||||
fptan -4.560000e-01 --> 1.000000e+00 -4.904767e-01 0000
|
||||
fptan 3.700000e+01 --> 1.000000e+00 -8.407713e-01 0000
|
||||
fptan -5.300000e+01 --> 1.000000e+00 4.311582e-01 0000
|
||||
|
||||
fptan 8.301035e+18 --> 1.000000e+00 1.259651e-01 0000
|
||||
fptan 9.223363e+18 --> 1.000000e+00 2.411246e-01 0000
|
||||
fptan 9.223372e+18 --> 9.223372e+18 3.141593e+00 0400
|
||||
fptan 9.223381e+18 --> 9.223381e+18 3.141593e+00 0400
|
||||
fptan 1.014571e+19 --> 1.014571e+19 3.141593e+00 0400
|
||||
|
||||
fptan -8.301035e+18 --> 1.000000e+00 -1.259651e-01 0000
|
||||
fptan -9.223363e+18 --> 1.000000e+00 -2.411246e-01 0000
|
||||
fptan -9.223372e+18 --> -9.223372e+18 3.141593e+00 0400
|
||||
fptan -9.223381e+18 --> -9.223381e+18 3.141593e+00 0400
|
||||
fptan -1.014571e+19 --> -1.014571e+19 3.141593e+00 0400
|
||||
|
||||
1
none/tests/x86/x87trigOOR.vgtest
Normal file
1
none/tests/x86/x87trigOOR.vgtest
Normal file
@ -0,0 +1 @@
|
||||
prog: x87trigOOR
|
||||
Loading…
x
Reference in New Issue
Block a user