1ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <stdio.h>
3ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef unsigned int UInt;
5ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid set_fpscr ( UInt x )
7ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
8ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   UInt d[2];
9ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   d[0] = 0;
10ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   d[1] = x;
11ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   __asm__ __volatile__(
12ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      "lfd %%f0,0(%0)\n\t"
13ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      "mtfsf 255,%%f0"
14ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      : /*out*/
15ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      : /*in*/ "b"(&d[0])
16ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      : /*trash*/ "fr0", "cc", "memory"
17ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   );
18ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
19ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
20ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
21ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownint main ( void )
22ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
23ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  int i;
24ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  UInt r;
25ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  for (i = 0; i < 16; i++) {
26ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    set_fpscr(i);
27ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__(
28ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       "li %0,0\n\t"
29ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       "mtcr %0\n\t"
30ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       "mcrfs 1,7\n\t"
31ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       "mfcr %0"
32ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       : /*out*/ "=b"(r)
33ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       : /*in*/
34ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       : /*trash*/ "cc"
35ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    );
36ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    printf("0x%x -> 0x%08x\n", i, r);
37ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  }
38ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  for (i = 0; i < 16; i++) {
39ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    set_fpscr(i);
40ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__(
41ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       "li %0,-1\n\t"
42ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       "mtcr %0\n\t"
43ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       "mcrfs 1,7\n\t"
44ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       "mfcr %0"
45ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       : /*out*/ "=b"(r)
46ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       : /*in*/
47ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       : /*trash*/ "cc"
48ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    );
49ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    printf("0x%x -> 0x%08x\n", i, r);
50ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  }
51ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  return 0;
52ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
53