1 #include <stdio.h>
2
3 #define MAX_ARR 24
4
5 const float fs_f[] = {
6 0, 456.25, 3, -1,
7 1384.5, -7.25, 1000000000, -5786.5,
8 1752, 0.015625, 0.03125, -248562.75,
9 -45786.5, 456, 34.03125, 45786.75,
10 1752065, 107, -45667.25, -7,
11 -347856.5, 356047.5, -1.0, 23.0625
12 };
13
14 const float ft_f[] = {
15 -4578.5, 456.25, 34.03125, 4578.75,
16 175, 107, -456.25, -7.25,
17 -3478.5, 356.5, -1.0, 23.0625,
18 0, 456.25, 3, -1,
19 1384.5, -7, 100, -5786.5,
20 1752, 0.015625, 0.03125, -248562.75
21 };
22
23 const double fs_d[] = {
24 0, 456.25, 3, -1,
25 1384.5, -7.25, 1000000000, -5786.5,
26 1752, 0.015625, 0.03125, -248562.75,
27 -45786.5, 456, 34.03125, 45786.75,
28 1752065, 107, -45667.25, -7,
29 -347856.5, 356047.5, -1.0, 23.0625
30 };
31
32 const double ft_d[] = {
33 -45786.5, 456.25, 34.03125, 45786.75,
34 1752065, 107, -45667.25, -7.25,
35 -347856.5, 356047.5, -1.0, 23.0625,
36 0, 456.25, 3, -1,
37 1384.5, -7, 1000000000, -5786.5,
38 1752, 0.015625, 0.03125, -248562.75
39 };
40
41 /* Conditional macros.*/
42 #define TESTINST1s(instruction, RDval) \
43 { \
44 float outf = 0; \
45 __asm__ __volatile__( \
46 ".set noreorder" "\n\t" \
47 "mov.s $f0, %1" "\n\t" \
48 "mov.s $f2, %2" "\n\t" \
49 "c.eq.s $f0, $f2" "\n\t" \
50 instruction" end"instruction"s"#RDval "\n\t" \
51 "nop" "\n\t" \
52 "add.s $f0, $f0, $f2" "\n\t" \
53 "end"instruction"s"#RDval":" "\n\t" \
54 "mov.s %0, $f0" "\n\t" \
55 ".set reorder" "\n\t" \
56 : "=f" (outf) \
57 : "f" (fs_f[i]) , "f" (ft_f[i]) \
58 : "$f0", "$f2" \
59 ); \
60 printf("%s, c.eq.s out=%f, fs=%f, ft=%f\n", \
61 instruction, outf, fs_f[i], ft_f[i]); \
62 }
63
64 #define TESTINST1d(instruction, RDval) \
65 { \
66 double outd = 0; \
67 __asm__ __volatile__( \
68 ".set noreorder" "\n\t" \
69 "mov.d $f0, %1" "\n\t" \
70 "mov.d $f2, %2" "\n\t" \
71 "c.eq.d $f0, $f2" "\n\t" \
72 instruction" end"instruction"d"#RDval "\n\t" \
73 "nop" "\n\t" \
74 "add.d $f0, $f0, $f2" "\n\t" \
75 "end"instruction"d"#RDval":" "\n\t" \
76 "mov.d %0, $f0" "\n\t" \
77 ".set reorder" "\n\t" \
78 : "=f" (outd) \
79 : "f" (fs_d[i]) , "f" (ft_d[i]) \
80 : "$f0", "$f1", "$f2", "$f3" \
81 ); \
82 printf("%s, c.eq.d out=%f, fs=%f, ft=%f\n", \
83 instruction, outd, fs_d[i], ft_d[i]); \
84 }
85
86 #define TESTINST2s(instruction, RDval) \
87 { \
88 float outf = 0; \
89 __asm__ __volatile__( \
90 ".set noreorder" "\n\t" \
91 "mov.s $f0, %1" "\n\t" \
92 "mov.s $f2, %2" "\n\t" \
93 "c.eq.s $f0, $f2" "\n\t" \
94 instruction" end"instruction"s"#RDval "\n\t" \
95 "add.s $f0, $f0, $f2" "\n\t" \
96 "end"instruction"s"#RDval":" "\n\t" \
97 "mov.s %0, $f0" "\n\t" \
98 ".set reorder" "\n\t" \
99 : "=f" (outf) \
100 : "f" (fs_f[i]) , "f" (ft_f[i]) \
101 : "$f0", "$f2" \
102 ); \
103 printf("%s, c.eq.s out=%f, fs=%f, ft=%f\n", \
104 instruction, outf, fs_f[i], ft_f[i]); \
105 }
106
107 #define TESTINST2d(instruction, RDval) \
108 { \
109 double outd = 0; \
110 __asm__ __volatile__( \
111 ".set noreorder" "\n\t" \
112 "mov.d $f0, %1" "\n\t" \
113 "mov.d $f2, %2" "\n\t" \
114 "c.eq.d $f0, $f2" "\n\t" \
115 instruction" end"instruction"d"#RDval "\n\t" \
116 "add.d $f0, $f0, $f2" "\n\t" \
117 "end"instruction"d"#RDval":" "\n\t" \
118 "mov.d %0, $f0" "\n\t" \
119 ".set reorder" "\n\t" \
120 : "=f" (outd) \
121 : "f" (fs_d[i]) , "f" (ft_d[i]) \
122 : "$f0", "$f1", "$f2", "$f3" \
123 ); \
124 printf("%s, c.eq.d out=%f, fs=%f, ft=%f\n", \
125 instruction, outd, fs_d[i], ft_d[i]); \
126 }
127
128 #define TESTINST_CONDs(instruction, RDval) \
129 { \
130 float outf = 0; \
131 __asm__ __volatile__( \
132 ".set noreorder" "\n\t" \
133 "mov.s $f0, %1" "\n\t" \
134 "mov.s $f2, %2" "\n\t" \
135 instruction" $f0, $f2" "\n\t" \
136 "bc1f end"instruction"s"#RDval "\n\t" \
137 "nop" "\n\t" \
138 "add.s $f0, $f0, $f2" "\n\t" \
139 "end"instruction"s"#RDval":" "\n\t" \
140 "mov.s %0, $f0" "\n\t" \
141 ".set reorder" "\n\t" \
142 : "=f" (outf) \
143 : "f" (fs_f[i]) , "f" (ft_f[i]) \
144 : "$f0", "$f1", "$f2" \
145 ); \
146 printf("%s, bc1f out=%f, fs=%f, ft=%f\n", \
147 instruction, outf, fs_f[i], ft_f[i]); \
148 }
149
150 #define TESTINST_CONDd(instruction, RDval) \
151 { \
152 double outd = 0; \
153 __asm__ __volatile__( \
154 ".set noreorder" "\n\t" \
155 "mov.d $f0, %1" "\n\t" \
156 "mov.d $f2, %2" "\n\t" \
157 instruction" $f0, $f2" "\n\t" \
158 "bc1f end"instruction"d"#RDval "\n\t" \
159 "nop" "\n\t" \
160 "add.d $f0, $f0, $f2" "\n\t" \
161 "end"instruction"d"#RDval":" "\n\t" \
162 "mov.d %0, $f0" "\n\t" \
163 ".set reorder" "\n\t" \
164 : "=f" (outd) \
165 : "f" (fs_d[i]) , "f" (ft_d[i]) \
166 : "$f0", "$f1", "$f2", "$f2" \
167 ); \
168 printf("%s, bc1f out=%f, fs=%f, ft=%f\n", \
169 instruction, outd, fs_d[i], ft_d[i]); \
170 }
171
main()172 int main()
173 {
174 int i = 0;
175
176 printf("--- BC1F --- if fs != ft then " \
177 "out = fs else out = fs + ft\n");
178 for (i = 0; i < MAX_ARR; i++) {
179 TESTINST1s("bc1f", i);
180 TESTINST1d("bc1f", i);
181 }
182
183 printf("--- BC1T --- if fs == ft then " \
184 "out = fs else out = fs + ft\n");
185 for (i = 0; i < MAX_ARR; i++) {
186 TESTINST1s("bc1t", i);
187 TESTINST1d("bc1t", i);
188 }
189
190 printf("--- BC1FL --- if fs == ft then " \
191 "out = ft else out = fs + ft\n");
192 for (i = 0; i < MAX_ARR; i++) {
193 TESTINST2s("bc1fl", i);
194 TESTINST2d("bc1fl", i);
195 }
196
197 printf("--- BC1TL --- if fs != ft then " \
198 "out = fs else out = fs + ft\n");
199 for (i = 0; i < MAX_ARR; i++) {
200 TESTINST2s("bc1tl", i);
201 TESTINST2d("bc1tl", i);
202 }
203
204 printf("--- C.F.S/D --- if false then " \
205 "out = fs + ft else out = fs\n");
206 for (i = 0; i < MAX_ARR; i++) {
207 TESTINST_CONDs("c.f.s", i);
208 TESTINST_CONDd("c.f.d", i);
209 }
210
211 printf("--- C.UN.S/D --- if unordered(fs, ft) then " \
212 "out = fs + ft else out = fs\n");
213 for (i = 0; i < MAX_ARR; i++) {
214 TESTINST_CONDs("c.un.s", i);
215 TESTINST_CONDd("c.un.d", i);
216 }
217
218 printf("--- C.EQ.S/D --- if fs == ft then " \
219 "out = fs + ft else out = fs\n");
220 for (i = 0; i < MAX_ARR; i++) {
221 TESTINST_CONDs("c.eq.s", i);
222 TESTINST_CONDd("c.eq.d", i);
223 }
224
225 printf("--- C.UEQ.S/D --- if (unordered(fs, ft) or (fs == ft)) then " \
226 "out = fs + ft else out = fs\n");
227 for (i = 0; i < MAX_ARR; i++) {
228 TESTINST_CONDs("c.ueq.s", i);
229 TESTINST_CONDd("c.ueq.d", i);
230 }
231
232 printf("--- C.OLT.S/D --- if (ordered(fs, ft) or (fs < ft)) then " \
233 "out = fs + ft else out = fs\n");
234 for (i = 0; i < MAX_ARR; i++) {
235 TESTINST_CONDs("c.olt.s", i);
236 TESTINST_CONDd("c.olt.d", i);
237 }
238
239 printf("--- C.ULT.S/D --- if (unordered(fs, ft) or (fs < ft)) then " \
240 "out = fs + ft else out = fs\n");
241 for (i = 0; i < MAX_ARR; i++) {
242 TESTINST_CONDs("c.ult.s", i);
243 TESTINST_CONDd("c.ult.d", i);
244 }
245
246 printf("--- C.OLE.S/D --- if (ordered(fs, ft) or (fs <= ft)) then " \
247 "out = fs + ft else out = fs\n");
248 for (i = 0; i < MAX_ARR; i++) {
249 TESTINST_CONDs("c.ole.s", i);
250 TESTINST_CONDd("c.ole.d", i);
251 }
252
253 printf("--- C.ULE.S/D --- if (unordered(fs, ft) or (fs <= ft)) then " \
254 "out = fs + ft else out = fs\n");
255 for (i = 0; i < MAX_ARR; i++) {
256 TESTINST_CONDs("c.ule.s", i);
257 TESTINST_CONDd("c.ule.d", i);
258 }
259
260 printf("--- C.SF.S/D --- if signaling false then " \
261 "out = fs + ft else out = fs\n");
262 for (i = 0; i < MAX_ARR; i++) {
263 TESTINST_CONDs("c.sf.s", i);
264 TESTINST_CONDd("c.sf.d", i);
265 }
266
267 printf("--- C.NGLE.S/D --- if not ((fs > ft) or (fs <= ft)) then " \
268 "out = fs + ft else out = fs\n");
269 for (i = 0; i < MAX_ARR; i++) {
270 TESTINST_CONDs("c.ngle.s", i);
271 TESTINST_CONDd("c.ngle.d", i);
272 }
273
274 printf("--- C.SEQ.S/D --- if signaling equal then " \
275 "out = fs + ft else out = fs\n");
276 for (i = 0; i < MAX_ARR; i++) {
277 TESTINST_CONDs("c.seq.s", i);
278 TESTINST_CONDd("c.seq.d", i);
279 }
280
281 printf("--- C.NGL.S/D --- if not ((fs > ft) or (fs < ft)) then " \
282 "out = fs + ft else out = fs\n");
283 for (i = 0; i < MAX_ARR; i++) {
284 TESTINST_CONDs("c.ngl.s", i);
285 TESTINST_CONDd("c.ngl.d", i);
286 }
287
288 printf("--- C.LT.S/D --- if fs < ft then " \
289 "out = fs + ft else out = fs\n");
290 for (i = 0; i < MAX_ARR; i++) {
291 TESTINST_CONDs("c.lt.s", i);
292 TESTINST_CONDd("c.lt.d", i);
293 }
294
295 printf("--- C.NGE.S/D --- if not (fs >= ft) then " \
296 "out = fs + ft else out = fs\n");
297 for (i = 0; i < MAX_ARR; i++) {
298 TESTINST_CONDs("c.nge.s", i);
299 TESTINST_CONDd("c.nge.d", i);
300 }
301
302 printf("--- C.LE.S/D --- if fs <= ft then " \
303 "out = fs + ft else out = fs\n");
304 for (i = 0; i < MAX_ARR; i++) {
305 TESTINST_CONDs("c.le.s", i);
306 TESTINST_CONDd("c.le.d", i);
307 }
308
309 printf("--- C.NGT.S/D --- if not (fs > ft) then " \
310 "out = fs + ft else out = fs\n");
311 for (i = 0; i < MAX_ARR; i++) {
312 TESTINST_CONDs("c.ngt.s", i);
313 TESTINST_CONDd("c.ngt.d", i);
314 }
315 return 0;
316 }
317
318