1 
2 #include <stdio.h>
3 #include <stdlib.h>
4 
do_fsqrt(double x)5 double do_fsqrt ( double x )
6 {
7   double block[2];
8   block[0] = x;
9   __asm__ __volatile__(
10      "lfd %%f1, 0(%0)\n\t"
11      "fsqrt %%f1,%%f1\n\t"
12      "stfd %%f1, 8(%0)"
13      : /*out*/
14      : /*in*/ "b" (&block[0])
15      : /*trash*/ "memory", "fr1"
16   );
17   return block[1];
18 }
19 
do_fsqrts(double x)20 double do_fsqrts ( double x )
21 {
22   double block[2];
23   block[0] = x;
24   __asm__ __volatile__(
25      "lfd %%f1, 0(%0)\n\t"
26      "fsqrts %%f1,%%f1\n\t"
27      "stfd %%f1, 8(%0)"
28      : /*out*/
29      : /*in*/ "b" (&block[0])
30      : /*trash*/ "memory", "fr1"
31      );
32   return block[1];
33 }
34 
35 ////////////////////////////////////////////////////////////
36 
do_one(char * name,double (* f)(double),double * args,int nargs,char * argfmt,char * resfmt)37 void do_one ( char* name,
38               double(*f)(double),
39               double* args, int nargs,
40               char* argfmt, char* resfmt )
41 {
42   int i;
43   double a, r;
44   printf("\n");
45 
46   for (i = 0; i < nargs; i++) {
47     a = args[i];
48     r = f(a);
49     printf("%s ", name);
50     printf(argfmt, a);
51     printf(" -> ");
52     printf(resfmt, r);
53     printf("\n");
54   }
55 }
56 
main(void)57 int main ( void )
58 {
59   int nargs = 19;
60   double* args = malloc(nargs * sizeof(double));
61   args[0]  =  0.0;
62   args[1]  =  1.0 / 0.0; // inf
63   args[2]  = -args[1]; //  -inf
64   args[3]  = args[2]/args[2]; // nan
65   args[4]  = -args[3]; // -nan
66   args[5]  = -5e100;
67   args[6]  = -5e20;
68   args[7]  = -501.0;
69   args[8]  = -6.0;
70   args[9]  = -1.0;
71   args[10] = -2e-20;
72   args[11] = -2e-200;
73   args[12] =  2e-200;
74   args[13] =  2e-20;
75   args[14] =  1.0;
76   args[15] =  6.0;
77   args[16] =  501.0;
78   args[17] =  5e20;
79   args[18] =  5e100;
80 
81   do_one( "fsqrt",  do_fsqrt,  args, nargs, "%e", "%20.14e");
82   do_one( "fsqrts", do_fsqrts, args, nargs, "%e", "%e");
83 
84   free(args);
85   return 0;
86 }
87