1 
2 /* Marginally test fprem/fprem1/fsincos; these are hard to check
3    otherwise since compilers hardly ever generate them. */
4 
5 #include <stdio.h>
6 
do_fprem(void)7 double do_fprem ( void )
8 {
9   double res = 0.0;
10   __asm__ __volatile__(
11     "ffree %%st(0)\n\t"
12     "ffree %%st(1)\n\t"
13     "fldpi\n\t"
14     "fldln2\n\t"
15     "fprem\n\t"
16     "fstpl 0(%0)"
17     : : "r"(&res)
18   );
19   return res;
20 }
21 
do_fprem1(void)22 double do_fprem1 ( void )
23 {
24   double res = 0.0;
25   __asm__ __volatile__(
26     "ffree %%st(0)\n\t"
27     "ffree %%st(1)\n\t"
28     "fldpi\n\t"
29     "fldln2\n\t"
30     "fprem1\n\t"
31     "fstpl 0(%0)"
32     : : "r"(&res)
33   );
34   return res;
35 }
36 
do_fsincos(void)37 double do_fsincos ( void )
38 {
39   double res = 0.0;
40   __asm__ __volatile__(
41     "fldln2\n\t"
42     "fsincos\n\t"
43     "fsub %%st(1)\n\t"
44     "fstpl 0(%0)"
45     : : "r"(&res)
46   );
47   return res;
48 }
49 
main(void)50 int main ( void )
51 {
52   __asm__ __volatile__("finit");
53   printf("fprem   %f\n", do_fprem());
54   printf("fprem1  %f\n", do_fprem1());
55   printf("fsincos %f\n", do_fsincos());
56   return 0;
57 }
58