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