1ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <assert.h>
3ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <stdio.h>
4ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <malloc.h>
5ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef unsigned int UInt;
7ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef unsigned long long int ULong;
8ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
9ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef
10ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   struct {
11ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      double fres;
12ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt cr;
13ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt fpscr;
14ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
15ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Result;
16ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
17ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
18ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void set_NEAREST ( void ) {
19ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   __asm__ __volatile__("mtfsb0 30 ; mtfsb0 31");
20ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
21ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void set_ZERO ( void ) {
22ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   __asm__ __volatile__("mtfsb0 30 ; mtfsb1 31");
23ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
24ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void set_PosINF ( void ) {
25ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   __asm__ __volatile__("mtfsb1 30 ; mtfsb0 31");
26ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
27ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void set_NegINF ( void ) {
28ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   __asm__ __volatile__("mtfsb1 30 ; mtfsb1 31");
29ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
30ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
31ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
32ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic ULong double_as_ULong ( double d )
33ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
34ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   union { double dd; ULong ll; } u;
35ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   assert(sizeof(u) == 8);
36ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   u.dd = d;
37ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return u.ll;
38ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
39ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
40ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic ULong round_with_mask ( ULong x, ULong mask )
41ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
42ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  if (mask == 1) {
43ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     switch (x & 1) {
44ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        case 0:  return x;
45ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        case 1:  return x+1;
46ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     }
47ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     assert(0);
48ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  }
49ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
50ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  if (mask == 3) {
51ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     switch (x & 3) {
52ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        case 0:  return x;
53ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        case 1:  return x-1;
54ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        case 2:  return x+2;
55ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        case 3:  return x+1;
56ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     }
57ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     assert(0);
58ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  }
59ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
60ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  if (mask == 7) {
61ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     switch (x & 7) {
62ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        case 0:  return x;
63ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        case 1:  return x-1;
64ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        case 2:  return x-2;
65ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        case 3:  return x-3;
66ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        case 4:  return x+4;
67ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        case 5:  return x+3;
68ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        case 6:  return x+2;
69ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        case 7:  return x+1;
70ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     }
71ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     assert(0);
72ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  }
73ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
74ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  if (mask == 15) {
75ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     switch (x & 15) {
76ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        case 0:  return x;
77ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        case 1:  return x-1;
78ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        case 2:  return x-2;
79ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        case 3:  return x-3;
80ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        case 4:  return x-4;
81ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        case 5:  return x-5;
82ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        case 6:  return x-6;
83ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        case 7:  return x-7;
84ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        case 8:   return x+8;
85ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        case 9:   return x+7;
86ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        case 10:  return x+6;
87ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        case 11:  return x+5;
88ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        case 12:  return x+4;
89ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        case 13:  return x+3;
90ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        case 14:  return x+2;
91ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        case 15:  return x+1;
92ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     }
93ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     assert(0);
94ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  }
95ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
96ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  assert(0);
97ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
98ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
99ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void showResult ( Result r, ULong hideMask )
100ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
101ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  /* hidemask should have 1 for every result bit we **don't**
102ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     want to show.  viz should be all zeroes normally. */
103ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if 0
104ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  printf("(%016llx cr1 0x%01x fprf 0x%02x)",
105ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         double_as_ULong(r.fres) & ~hidemask,
106ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         (r.cr >> 24) & 0xF, (r.fpscr >> 12) & 0x1F);
107ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#else
108ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  printf("(%016llx cr1 ... fprf ...)",
109ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	 (hideMask == 0x1 || hideMask == 0x3 || hideMask == 0x7)
110ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	 ? round_with_mask( double_as_ULong(r.fres), hideMask )
111ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         : double_as_ULong(r.fres) & ~hideMask
112ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        );
113ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
114ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
115ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
116ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
117ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Give an insn string such as "fmadd %%f4, %%f1,%%f2,%%f3".  Args are
118ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   in f1, f2, f3, and result should go in f4. */
119ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define INSN(name,insn)                                                 \
120ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                                                        \
121ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  static Result insn_##name ( double arg1, double arg2, double arg3 )   \
122ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  {                                                                     \
123ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     struct {                                                           \
124ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        /* 0  */ double a1;                                             \
125ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        /* 8  */ double a2;                                             \
126ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        /* 16 */ double a3;                                             \
127ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        /* 24 */ double res;                                            \
128ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        /* 32 */ UInt fpscr_after;                                      \
129ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        /* 36 */ UInt cr_after;                                         \
130ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     } foo;                                                             \
131ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     assert(sizeof(foo) == 40);                                         \
132ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     foo.a1 = foo.a2 = foo.a3 = foo.res = 0;                            \
133ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     foo.fpscr_after = foo.cr_after = 0;                                \
134ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     foo.a1 = arg1;                                                     \
135ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     foo.a2 = arg2;                                                     \
136ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     foo.a3 = arg3;                                                     \
137ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     __asm__ __volatile__(                                              \
138ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       "lfd  %%f1, 0(%0)\n\t"  /* a1 */                                 \
139ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       "lfd  %%f2, 8(%0)\n\t"  /* a2 */                                 \
140ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       "lfd  %%f3, 16(%0)\n\t" /* a3 */                                 \
141ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       insn "\n\t"                                                      \
142ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       "stfd %%f4, 24(%0)\n\t" /* res */                                \
143ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       "mffs %%f4\n\t"                                                  \
144ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       "addi %0,%0,32\n\t"                                              \
145ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       "stfiwx %%f4, %%r0,%0\n\t"  /* fpscr_after.  r0 reads as zero */ \
146ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       "addi %0,%0,-32\n\t"                                             \
147ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       "mfcr %%r31\n\t"                                                 \
148ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       "stw %%r31, 36(%0)"  /* cr_after */                              \
149ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       : /*out*/                                                        \
150ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       : /*in*/ "b" (&foo.a1)                                           \
151ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       : /*trash*/ "memory","cc", "fr1","fr2","fr3","fr4", "r31"        \
152ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     );                                                                 \
153ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     { Result result;                                                   \
154ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       result.fres  = foo.res;                                          \
155ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       result.cr    = foo.cr_after;                                     \
156ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       result.fpscr = foo.fpscr_after;                                  \
157ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       return result;                                                   \
158ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     }                                                                  \
159ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  }
160ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
161ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownINSN(fabs,     "fabs     %%f4, %%f1");
162ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownINSN(fabs_,    "fabs.    %%f4, %%f1");
163ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
164ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownINSN(fnabs,    "fnabs    %%f4, %%f1");
165ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownINSN(fnabs_,   "fnabs.   %%f4, %%f1");
166ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
167ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownINSN(fadd,     "fadd     %%f4, %%f1,%%f2");
168ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownINSN(fadd_,    "fadd.    %%f4, %%f1,%%f2");
169ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
170ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownINSN(fadds,    "fadds    %%f4, %%f1,%%f2");
171ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownINSN(fadds_,   "fadds.   %%f4, %%f1,%%f2");
172ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
173ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownINSN(fcfid,    "fcfid    %%f4, %%f1");
174ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownINSN(fcfid_,   "fcfid.   %%f4, %%f1");
175ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
176ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownINSN(fctid,    "fctid    %%f4, %%f1");
177ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownINSN(fctid_,   "fctid.   %%f4, %%f1");
178ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
179ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownINSN(fctidz,   "fctidz   %%f4, %%f1");
180ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownINSN(fctidz_,  "fctidz.  %%f4, %%f1");
181ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
182ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownINSN(fctiw,    "fctiw    %%f4, %%f1");
183ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownINSN(fctiw_,   "fctiw.   %%f4, %%f1");
184ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
185ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownINSN(fctiwz,   "fctiwz   %%f4, %%f1");
186ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownINSN(fctiwz_,  "fctiwz.  %%f4, %%f1");
187ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
188ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownINSN(fdiv,     "fdiv     %%f4, %%f1,%%f2");
189ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownINSN(fdiv_,    "fdiv.    %%f4, %%f1,%%f2");
190ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
191ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownINSN(fdivs,    "fdivs    %%f4, %%f1,%%f2");
192ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownINSN(fdivs_,   "fdivs.   %%f4, %%f1,%%f2");
193ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
194ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownINSN(fmadd,    "fmadd    %%f4, %%f1,%%f2,%%f3");
195ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownINSN(fmadd_,   "fmadd.   %%f4, %%f1,%%f2,%%f3");
196ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
197ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownINSN(fmadds,   "fmadds   %%f4, %%f1,%%f2,%%f3");
198ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownINSN(fmadds_,  "fmadds.  %%f4, %%f1,%%f2,%%f3");
199ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
200ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownINSN(fmr,      "fmr      %%f4, %%f1");
201ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownINSN(fmr_,     "fmr.     %%f4, %%f1");
202ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
203ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownINSN(fmsub,    "fmsub    %%f4, %%f1,%%f2,%%f3");
204ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownINSN(fmsub_,   "fmsub.   %%f4, %%f1,%%f2,%%f3");
205ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
206ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownINSN(fmsubs,   "fmsubs   %%f4, %%f1,%%f2,%%f3");
207ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownINSN(fmsubs_,  "fmsubs.  %%f4, %%f1,%%f2,%%f3");
208ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
209ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownINSN(fmul,     "fmul     %%f4, %%f1,%%f2");
210ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownINSN(fmul_,    "fmul.    %%f4, %%f1,%%f2");
211ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
212ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownINSN(fmuls,    "fmuls    %%f4, %%f1,%%f2");
213ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownINSN(fmuls_,   "fmuls.   %%f4, %%f1,%%f2");
214ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
215ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownINSN(fneg,     "fneg     %%f4, %%f1");
216ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownINSN(fneg_,    "fneg.    %%f4, %%f1");
217ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
218ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownINSN(fnmadd,   "fnmadd   %%f4, %%f1,%%f2,%%f3");
219ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownINSN(fnmadd_,  "fnmadd.  %%f4, %%f1,%%f2,%%f3");
220ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
221ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownINSN(fnmadds,  "fnmadds  %%f4, %%f1,%%f2,%%f3");
222ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownINSN(fnmadds_, "fnmadds. %%f4, %%f1,%%f2,%%f3");
223ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
224ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownINSN(fnmsub,   "fnmsub   %%f4, %%f1,%%f2,%%f3");
225ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownINSN(fnmsub_,  "fnmsub.  %%f4, %%f1,%%f2,%%f3");
226ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
227ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownINSN(fnmsubs,  "fnmsubs  %%f4, %%f1,%%f2,%%f3");
228ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownINSN(fnmsubs_, "fnmsubs. %%f4, %%f1,%%f2,%%f3");
229ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
230ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownINSN(fre,      "fre      %%f4, %%f1");
231ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownINSN(fre_,     "fre.     %%f4, %%f1");
232ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
233ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownINSN(fres,     "fres     %%f4, %%f1");
234ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownINSN(fres_,    "fres.    %%f4, %%f1");
235ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
236ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownINSN(frsqrte,  "frsqrte  %%f4, %%f1");
237ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownINSN(frsqrte_, "frsqrte. %%f4, %%f1");
238ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
239ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//INSN(frsqrtes, "frsqrtes %%f4, %%f1");
240ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//INSN(frsqrtes_, "frsqrtes. %%f4, %%f1");
241ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
242ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownINSN(frsp,     "frsp     %%f4, %%f1");
243ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownINSN(frsp_,    "frsp.    %%f4, %%f1");
244ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
245ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownINSN(fsel,     "fsel     %%f4, %%f1,%%f2,%%f3");
246ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownINSN(fsel_,    "fsel.    %%f4, %%f1,%%f2,%%f3");
247ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
248ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownINSN(fsqrt,    "fsqrt    %%f4, %%f1");
249ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownINSN(fsqrt_,   "fsqrt.   %%f4, %%f1");
250ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
251ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownINSN(fsqrts,   "fsqrts   %%f4, %%f1");
252ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownINSN(fsqrts_,  "fsqrts.  %%f4, %%f1");
253ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
254ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownINSN(fsub,     "fsub     %%f4, %%f1,%%f2");
255ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownINSN(fsub_,    "fsub.    %%f4, %%f1,%%f2");
256ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
257ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownINSN(fsubs,    "fsubs    %%f4, %%f1,%%f2");
258ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownINSN(fsubs_,   "fsubs.   %%f4, %%f1,%%f2");
259ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
260ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
261ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
262ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid do_1_unary ( char* name,
263ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                  Result(*f)(double,double,double),
264ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                  double a1,
265ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                  ULong hideMask )
266ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
267ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Result r;
268ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   printf("%8s: %016llx (%e)\n", name, double_as_ULong(a1), a1);
269ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   set_NEAREST();
270ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   r = f(a1, 0.0,0.0);
271ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   printf("        near "); showResult(r,hideMask); printf("\n");
272ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   set_ZERO();
273ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   r = f(a1, 0.0,0.0);
274ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   printf("        zero "); showResult(r,hideMask); printf("\n");
275ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   set_PosINF();
276ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   r = f(a1, 0.0,0.0);
277ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   printf("        +inf "); showResult(r,hideMask); printf("\n");
278ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   set_NegINF();
279ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   r = f(a1, 0.0,0.0);
280ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   printf("        -inf "); showResult(r,hideMask); printf("\n");
281ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
282ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
283ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid do_1_binary ( char* name,
284ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                   Result(*f)(double,double,double),
285ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                   double a1, double a2,
286ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                   ULong hideMask )
287ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
288ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Result r;
289ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   printf("%8s: %016llx %016llx\n", name, double_as_ULong(a1),
290ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	  double_as_ULong(a2));
291ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   set_NEAREST();
292ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   r = f(a1,a2, 0.0);
293ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   printf("        near "); showResult(r,hideMask); printf("\n");
294ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   set_ZERO();
295ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   r = f(a1,a2, 0.0);
296ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   printf("        zero "); showResult(r,hideMask); printf("\n");
297ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   set_PosINF();
298ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   r = f(a1,a2, 0.0);
299ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   printf("        +inf "); showResult(r,hideMask); printf("\n");
300ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   set_NegINF();
301ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   r = f(a1,a2, 0.0);
302ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   printf("        -inf "); showResult(r,hideMask); printf("\n");
303ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
304ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
305ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid do_1_ternary ( char* name,
306ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    Result(*f)(double,double,double),
307ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    double a1, double a2, double a3,
308ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    ULong hideMask )
309ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
310ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Result r;
311ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   printf("%8s: %016llx %016llx %016llx\n",
312ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          name, double_as_ULong(a1),
313ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	  double_as_ULong(a2), double_as_ULong(a3));
314ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   set_NEAREST();
315ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   r = f(a1,a2,a3);
316ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   printf("        near "); showResult(r,hideMask); printf("\n");
317ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   set_ZERO();
318ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   r = f(a1,a2,a3);
319ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   printf("        zero "); showResult(r,hideMask); printf("\n");
320ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   set_PosINF();
321ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   r = f(a1,a2,a3);
322ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   printf("        +inf "); showResult(r,hideMask); printf("\n");
323ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   set_NegINF();
324ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   r = f(a1,a2,a3);
325ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   printf("        -inf "); showResult(r,hideMask); printf("\n");
326ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
327ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
328ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid do_N_unary ( char* name,
329ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                  Result(*f)(double,double,double),
330ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                  double* args,
331ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown		  int nargs,
332ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                  ULong hideMask )
333ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
334ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   int i;
335ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   for (i = 0; i < nargs; i++) {
336ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      do_1_unary( name, f, args[i], hideMask );
337ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
338ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
339ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
340ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid do_N_binary ( char* name,
341ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                   Result(*f)(double,double,double),
342ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                   double* args,
343ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                   int nargs,
344ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                   ULong hideMask )
345ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
346ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   int i, j;
347ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   for (i = 0; i < nargs; i++) {
348ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      for (j = 0; j < nargs; j++) {
349ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         do_1_binary( name, f, args[i], args[j], hideMask );
350ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
351ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
352ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
353ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
354ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid do_N_ternary ( char* name,
355ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    Result(*f)(double,double,double),
356ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    double* args,
357ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    int nargs,
358ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    ULong hideMask )
359ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
360ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   int i, j, k;
361ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   for (i = 0; i < nargs; i++) {
362ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      for (j = 0; j < nargs; j++) {
363ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         for (k = 0; k < nargs; k++) {
364ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            do_1_ternary( name, f, args[i], args[j], args[k], hideMask );
365ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         }
366ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
367ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
368ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
369ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
370ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownint main ( void )
371ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
372ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  const ULong SHOW_ALL = 0;
373ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
374ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  int     nargs    = 21;
375ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  int     nMacArgs = 11;
376ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
377ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  double* args    = malloc(nargs * sizeof(double));
378ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  double* macArgs = malloc(nMacArgs * sizeof(double));
379ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
380ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  args[0]  =  0.0;
381ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  args[1]  =  1.0 / 0.0; // inf
382ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  args[2]  = -args[1]; //  -inf
383ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  args[3]  = args[2]/args[2]; // nan
384ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  args[4]  = -args[3]; // -nan
385ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  args[5]  = -5e100;
386ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  args[6]  = -5e20;
387ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  args[7]  = -501.0;
388ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  args[8]  = -6.0;
389ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  args[9]  = -1.0;
390ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  args[10] = -2e-20;
391ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  args[11] = -2e-200;
392ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  args[12] =  2e-200;
393ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  args[13] =  2e-20;
394ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  args[14] =  1.0;
395ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  args[15] =  6.0;
396ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  args[16] =  501.0;
397ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  args[17] =  5e20;
398ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  args[18] =  5e100;
399ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  args[19] =  1.23e+5;
400ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  args[20] =  1.23e+14;
401ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
402ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if 0
403ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  macArgs[0]  =  0.0;
404ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  macArgs[1]  = -5e100;
405ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  macArgs[2]  = -5e20;
406ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  macArgs[3]  = -501.0;
407ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  macArgs[4]  = -6.0;
408ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  macArgs[5]  = -1.0;
409ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  macArgs[6]  = -2e-20;
410ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  macArgs[7]  = -2e-200;
411ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  macArgs[8]  =  2e-200;
412ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  macArgs[9]  =  2e-20;
413ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  macArgs[10] =  1.0;
414ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  macArgs[11] =  6.0;
415ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  macArgs[12] =  501.0;
416ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  macArgs[13] =  5e20;
417ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  macArgs[14] =  5e100;
418ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  macArgs[15] =  1.23e+5;
419ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  macArgs[16] =  1.23e+14;
420ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
421ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  //macArgs[17]  = args[3]; // nan
422ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  //macArgs[18]  = -args[3]; // -nan
423ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
424ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
425ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  macArgs[0]  = 0.0;
426ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  macArgs[1]  = 1.0;
427ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  macArgs[2]  = 1.0 + (1.0/7.0);
428ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  macArgs[3]  = 6.01;
429ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  macArgs[4]  = 501.0;
430ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  macArgs[5]  = 31415927.0;
431ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  macArgs[6]  = - 1.0;
432ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  macArgs[7]  = - (1.0 + (1.0/7.0));
433ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  macArgs[8]  = - 6.01;
434ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  macArgs[9]  = - 501.0;
435ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  macArgs[10] = - 31415927.0;
436ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
437ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
438ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_N_unary("fmr",     insn_fmr,    args, nargs, SHOW_ALL);
439ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_N_unary("fmr_",    insn_fmr_,   args, nargs, SHOW_ALL);
440ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
441ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_N_unary("fneg",    insn_fneg,   args, nargs, SHOW_ALL);
442ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_N_unary("fneg_",   insn_fneg_,  args, nargs, SHOW_ALL);
443ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
444ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_N_unary("fabs",    insn_fabs,   args, nargs, SHOW_ALL);
445ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_N_unary("fabs_",   insn_fabs_,  args, nargs, SHOW_ALL);
446ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
447ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_N_unary("fnabs",   insn_fnabs,  args, nargs, SHOW_ALL);
448ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_N_unary("fnabs_",  insn_fnabs_, args, nargs, SHOW_ALL);
449ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
450ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
451ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_N_binary("fadd",   insn_fadd,   args, nargs, SHOW_ALL);
452ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_N_binary("fadd_",  insn_fadd_,  args, nargs, SHOW_ALL);
453ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
454ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_N_binary("fadds",  insn_fadds,  args, nargs, SHOW_ALL);
455ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_N_binary("fadds_", insn_fadds_, args, nargs, SHOW_ALL);
456ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
457ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_N_binary("fdiv",   insn_fdiv,   args, nargs, SHOW_ALL);
458ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_N_binary("fdiv_",  insn_fdiv_,  args, nargs, SHOW_ALL);
459ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
460ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_N_binary("fdivs",  insn_fdivs,  args, nargs, SHOW_ALL);
461ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_N_binary("fdivs_", insn_fdivs_, args, nargs, SHOW_ALL);
462ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
463ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_N_binary("fmul",   insn_fmul,   args, nargs, SHOW_ALL);
464ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_N_binary("fmul_",  insn_fmul_,  args, nargs, SHOW_ALL);
465ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
466ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_N_binary("fmuls",  insn_fmuls,  args, nargs, SHOW_ALL);
467ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_N_binary("fmuls_", insn_fmuls_, args, nargs, SHOW_ALL);
468ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
469ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_N_binary("fsub",   insn_fsub,   args, nargs, SHOW_ALL);
470ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_N_binary("fsub_",  insn_fsub_,  args, nargs, SHOW_ALL);
471ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
472ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_N_binary("fsubs",  insn_fsubs,  args, nargs, SHOW_ALL);
473ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_N_binary("fsubs_", insn_fsubs_, args, nargs, SHOW_ALL);
474ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
475ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  //do_N_unary(fcfid, SHOW_ALL);
476ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  //do_N_unary(fcfid_, SHOW_ALL);
477ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
478ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  //do_N_unary(fctid, SHOW_ALL);
479ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  //do_N_unary(fctid_, SHOW_ALL);
480ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
481ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  //do_N_unary(fctidz, SHOW_ALL);
482ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  //do_N_unary(fctidz_, SHOW_ALL);
483ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
484ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_N_unary("fctiw",  insn_fctiw,  args, nargs, 0xFFFFFFFF00000000ULL);
485ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_N_unary("fctiw_", insn_fctiw_, args, nargs, 0xFFFFFFFF00000000ULL);
486ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
487ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_N_unary("fctiwz",  insn_fctiwz,  args, nargs, 0xFFFFFFFF00000000ULL);
488ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_N_unary("fctiwz_", insn_fctiwz_, args, nargs, 0xFFFFFFFF00000000ULL);
489ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
490ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_N_ternary("fmadd",    insn_fmadd,    macArgs, nMacArgs, SHOW_ALL);
491ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_N_ternary("fmadd_",   insn_fmadd_,   macArgs, nMacArgs, SHOW_ALL);
492ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
493ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_N_ternary("fmadds",   insn_fmadds,   macArgs, nMacArgs, SHOW_ALL);
494ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_N_ternary("fmadds_",  insn_fmadds_,  macArgs, nMacArgs, SHOW_ALL);
495ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
496ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_N_ternary("fmsub",    insn_fmsub,    macArgs, nMacArgs, SHOW_ALL);
497ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_N_ternary("fmsub_",   insn_fmsub_,   macArgs, nMacArgs, SHOW_ALL);
498ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
499ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_N_ternary("fmsubs",   insn_fmsubs,   macArgs, nMacArgs, SHOW_ALL);
500ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_N_ternary("fmsubs_",  insn_fmsubs_,  macArgs, nMacArgs, SHOW_ALL);
501ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
502ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_N_ternary("fnmadd",   insn_fnmadd,   macArgs, nMacArgs, SHOW_ALL);
503ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_N_ternary("fnmadd_",  insn_fnmadd_,  macArgs, nMacArgs, SHOW_ALL);
504ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
505ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_N_ternary("fnmadds",  insn_fnmadds,  macArgs, nMacArgs, SHOW_ALL);
506ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_N_ternary("fnmadds_", insn_fnmadds_, macArgs, nMacArgs, SHOW_ALL);
507ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
508ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_N_ternary("fnmsub",   insn_fnmsub,   macArgs, nMacArgs, SHOW_ALL);
509ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_N_ternary("fnmsub_",  insn_fnmsub_,  macArgs, nMacArgs, SHOW_ALL);
510ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
511ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_N_ternary("fnmsubs",  insn_fnmsubs,  macArgs, nMacArgs, SHOW_ALL);
512ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_N_ternary("fnmsubs_", insn_fnmsubs_, macArgs, nMacArgs, SHOW_ALL);
513ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
514ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  //do_N_unary(fre, SHOW_ALL);
515ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  //do_N_unary(fre_, SHOW_ALL);
516ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
517ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_N_unary("fres",  insn_fres,  args, nargs, 0x000001FFFFFFFFFFULL);
518ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_N_unary("fres_", insn_fres_, args, nargs, 0x000001FFFFFFFFFFULL);
519ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
520ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_N_unary("frsqrte",  insn_frsqrte,  args, nargs, SHOW_ALL);
521ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_N_unary("frsqrte_", insn_frsqrte_, args, nargs, SHOW_ALL);
522ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
523ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  // do_N_unary("frsqrtes",  insn_frsqrtes,  args, nargs, SHOW_ALL);
524ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  // do_N_unary("frsqrtes_", insn_frsqrtes_, args, nargs, SHOW_ALL);
525ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
526ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_N_unary("frsp",  insn_frsp,  args, nargs, SHOW_ALL);
527ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_N_unary("frsp_", insn_frsp_, args, nargs, SHOW_ALL);
528ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
529ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_N_ternary("fsel",  insn_fsel,  args, nargs, SHOW_ALL);
530ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_N_ternary("fsel_", insn_fsel_, args, nargs, SHOW_ALL);
531ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
532ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  //do_N_unary(fsqrt, SHOW_ALL);
533ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  //do_N_unary(fsqrt_, SHOW_ALL);
534ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
535ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  //do_N_unary(fsqrts, SHOW_ALL);
536ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  //do_N_unary(fsqrts_, SHOW_ALL);
537ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
538ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  return 0;
539ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
540