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