mirror of
https://github.com/Zenithsiz/ftmemsim-valgrind.git
synced 2026-02-12 06:11:37 +00:00
GCC10 defaults to -fno-common which exposes some latent bugs in some of the top-level asm code in various .c test files. Some of the tests started to segfault (even if not run under valgrind). Such code needs to be wrapped inside a .text and a .previous asm statement to make sure the code is generated in the .text code section and to make sure the compiler doesn't lose track of the section currently being used to generate data or code in. Without it code might be generated inside a data section or the other way around.
102 lines
1.5 KiB
C
102 lines
1.5 KiB
C
|
|
#include <stdio.h>
|
|
#include <math.h>
|
|
|
|
double arg, res1, res2;
|
|
|
|
extern void do_fxtract ( void );
|
|
asm("\n"
|
|
".text\n"
|
|
".global do_fxtract\n"
|
|
"do_fxtract:\n"
|
|
"\tfinit\n"
|
|
"\tfldl arg\n"
|
|
"\tfxtract\n"
|
|
"\tfstpl res1\n"
|
|
"\tfstpl res2\n"
|
|
"\tret\n"
|
|
".previous\n"
|
|
);
|
|
|
|
void try ( double x )
|
|
{
|
|
arg = x * 1.414213562373049;
|
|
res1 = res2 = 0.0;
|
|
do_fxtract();
|
|
printf("%17.10e -> %14.10f %14.10f\n", arg, res1, res2);
|
|
}
|
|
|
|
int main ( void )
|
|
{
|
|
int i;
|
|
|
|
/* positives */
|
|
|
|
for (i = 0; i < 40; i++)
|
|
try( 1.27 + (double)(i*10 - 200) );
|
|
|
|
try(+0.0);
|
|
try(1.0 / 0.0);
|
|
try(sqrt(-1.0));
|
|
|
|
try(5.1e-308);
|
|
try(4.1e-308);
|
|
try(3.1e-308);
|
|
try(2.1e-308);
|
|
try(1.1e-308);
|
|
try(0.9e-308);
|
|
try(0.7e-308);
|
|
try(0.6e-308);
|
|
try(0.5e-308);
|
|
try(0.4e-308);
|
|
try(0.3e-308);
|
|
try(0.1e-308);
|
|
|
|
try(1.3e-320);
|
|
try(1.3e-321);
|
|
try(1.3e-322);
|
|
try(1.3e-323);
|
|
try(0.9e-323);
|
|
try(0.7e-323);
|
|
try(0.5e-323);
|
|
try(0.3e-323);
|
|
try(0.2e-323);
|
|
try(1.3e-324);
|
|
|
|
/* negatives */
|
|
|
|
printf("\n");
|
|
for (i = 0; i < 40; i++)
|
|
try( - (1.27 + (double)(i*10 - 200)) );
|
|
|
|
try(-0.0);
|
|
try(-(1.0 / 0.0));
|
|
try(-sqrt(-1.0));
|
|
|
|
try(-5.1e-308);
|
|
try(-4.1e-308);
|
|
try(-3.1e-308);
|
|
try(-2.1e-308);
|
|
try(-1.1e-308);
|
|
try(-0.9e-308);
|
|
try(-0.7e-308);
|
|
try(-0.6e-308);
|
|
try(-0.5e-308);
|
|
try(-0.4e-308);
|
|
try(-0.3e-308);
|
|
try(-0.1e-308);
|
|
|
|
try(-1.3e-320);
|
|
try(-1.3e-321);
|
|
try(-1.3e-322);
|
|
try(-1.3e-323);
|
|
try(-0.9e-323);
|
|
try(-0.7e-323);
|
|
try(-0.5e-323);
|
|
try(-0.3e-323);
|
|
try(-0.2e-323);
|
|
try(-1.3e-324);
|
|
|
|
return 0;
|
|
}
|