try a new github issue template
[pcsx_rearmed.git] / deps / lightning / check / alu.inc
CommitLineData
4a71579b
PC
1.data 8
2ok:
3.c "ok\n"
4
5/* ia64 code generation is not optimized for size, and also some
6 * codes generate quite long sequences due to need for stops causing
7 * no code template match and needing to add nops, and other cases
8 * are division/remainder that needs function calls, or float division
9 * that requires a quite long sequence.
10 * (the brute force tests of all register combinations can easily
11 * generate several GB of jit).
12 */
13
14/* 3 operand */
15
16/* reg0 = reg1 op reg2 */
17#define ALUR(N, T, OP, I0, I1, V, R0, R1, R2) \
18 movi %R1 I0 \
19 movi %R2 I1 \
20 OP##r##T %R0 %R1 %R2 \
21 beqi OP##T##N##r_##R0##R1##R2 %R0 V \
22 calli @abort \
23OP##T##N##r_##R0##R1##R2:
24
25/* reg0 = reg1 op im */
26#define ALUI(N, T, OP, I0, I1, V, R0, R1, R2) \
27 movi %R1 I0 \
28 movi %R2 V \
29 OP##i##T %R0 %R1 I1 \
30 beqr OP##T##N##i_##R0##R1##R2 %R0 %R2 \
31 calli @abort \
32OP##T##N##i_##R0##R1##R2:
33
34/* reg0 = reg0 op reg1 */
35#define ALUR0(N, T, OP, I0, I1, V, R0, R1, R2) \
36 movi %R0 I0 \
37 movi %R1 I1 \
38 movi %R2 V \
39 OP##r##T %R0 %R0 %R1 \
40 beqr OP##T##N##r_0##R0##R1##R2 %R0 %R2 \
41 calli @abort \
42OP##T##N##r_0##R0##R1##R2:
43
44/* reg0 = reg1 op reg0 */
45#define ALUR1(N, T, OP, I0, I1, V, R0, R1, R2) \
46 movi %R0 I1 \
47 movi %R1 I0 \
48 movi %R2 V \
49 OP##r##T %R0 %R1 %R0 \
50 beqr OP##T##N##r_1##R0##R1##R2 %R0 %R2 \
51 calli @abort \
52OP##T##N##r_1##R0##R1##R2:
53
54/* reg0 = reg0 op im */
55#define ALUI0(N, T, OP, I0, I1, V, R0, R1, R2) \
56 movi %R0 I0 \
57 movi %R1 V \
58 OP##i##T %R0 %R0 I1 \
59 beqr OP##T##N##i_0##R0##R1##R2 %R0 %R1 \
60 calli @abort \
61OP##T##N##i_0##R0##R1##R2:
62
63#define ALU3(N, T, OP, I0, I1, V, R0, R1, R2) \
64 ALUR(N, T, OP, I0, I1, V, R0, R1, R2) \
65 ALUI(N, T, OP, I0, I1, V, R0, R1, R2) \
66 ALUR0(N, T, OP, I0, I1, V, R0, R1, R2) \
67 ALUR1(N, T, OP, I0, I1, V, R0, R1, R2) \
68 ALUI0(N, T, OP, I0, I1, V, R0, R1, R2)
69
70#define ALU2(N, T, OP, I0, I1, V, R0, R1, R2) \
71 ALU3(N, T, OP, I0, I1, V, R0, R1, R2) \
72 ALU3(N, T, OP, I0, I1, V, R0, R2, R1)
73
74#define ALU1(N, T, OP, I0, I1, V, R0, R1, R2) \
75 ALU2(N, T, OP, I0, I1, V, R0, R1, R2) \
76 ALU2(N, T, OP, I0, I1, V, R1, R0, R2) \
77 ALU2(N, T, OP, I0, I1, V, R2, R1, R0)
78
79#if __ia64__
80# define ALU(N, T, OP, I0, I1, V) \
81 ALU3(N, T, OP, I0, I1, V, r0, r1, r2) \
82 ALU3(N, T, OP, I0, I1, V, v0, v1, v2)
83#else
84# define ALU(N, T, OP, I0, I1, V) \
85 ALU1(N, T, OP, I0, I1, V, v0, v1, v2) \
86 ALU1(N, T, OP, I0, I1, V, v0, v1, r0) \
87 ALU1(N, T, OP, I0, I1, V, v0, v1, r1) \
88 ALU1(N, T, OP, I0, I1, V, v0, v1, r2) \
89 ALU1(N, T, OP, I0, I1, V, v1, v2, r1) \
90 ALU1(N, T, OP, I0, I1, V, v1, v2, r2) \
91 ALU1(N, T, OP, I0, I1, V, v2, r0, r1) \
92 ALU1(N, T, OP, I0, I1, V, v2, r0, r2) \
93 ALU1(N, T, OP, I0, I1, V, r0, r1, r2)
94#endif
95
96/* 3 carry set/propagate */
97
98/*
99 * r0 = i0
100 * r1 = i1
101 * r2 = 0
102 * r0 = r0 opc r1 <only want carry>
103 * r2 = r2 opx r2 <r2 must match v>
104 */
105#define ALUXII(N, OP, I0, I1, V, R0, R1, R2) \
106 movi %R0 I0 \
107 movi %R2 0 \
108 OP##ci %R0 %R0 I1 \
109 OP##xi %R2 %R2 0 \
110 beqi OP##N##ii##R0##R1##R2 %R2 V \
111 calli @abort \
112OP##N##ii##R0##R1##R2:
113
114#define ALUXIR(N, OP, I0, I1, V, R0, R1, R2) \
115 movi %R0 I0 \
116 movi %R2 0 \
117 OP##ci %R0 %R0 I1 \
118 OP##xr %R2 %R2 %R2 \
119 beqi OP##N##ir##R0##R1##R2 %R2 V \
120 calli @abort \
121OP##N##ir##R0##R1##R2:
122
123#define ALUXRI(N, OP, I0, I1, V, R0, R1, R2) \
124 movi %R0 I0 \
125 movi %R1 I1 \
126 movi %R2 0 \
127 OP##cr %R0 %R0 %R1 \
128 OP##xi %R2 %R2 0 \
129 beqi OP##N##ri##R0##R1##R2 %R2 V \
130 calli @abort \
131OP##N##ri##R0##R1##R2:
132
133#define ALUXRR(N, OP, I0, I1, V, R0, R1, R2) \
134 movi %R0 I0 \
135 movi %R1 I1 \
136 movi %R2 0 \
137 OP##cr %R0 %R0 %R1 \
138 OP##xr %R2 %R2 %R2 \
139 beqi OP##N##rr##R0##R1##R2 %R2 V \
140 calli @abort \
141OP##N##rr##R0##R1##R2:
142
143#define ALUX2(N, OP, I0, I1, V, R0, R1, R2) \
144 ALUXII(N, OP, I0, I1, V, R0, R1, R2) \
145 ALUXIR(N, OP, I0, I1, V, R0, R1, R2) \
146 ALUXRI(N, OP, I0, I1, V, R0, R1, R2) \
147 ALUXRR(N, OP, I0, I1, V, R0, R1, R2)
148
149#define ALUX1(N, OP, I0, I1, V, R0, R1, R2) \
150 ALUX2(N, OP, I0, I1, V, R0, R1, R2) \
151 ALUX2(N, OP, I0, I1, V, R0, R2, R1)
152
153#define ALUX0(N, OP, I0, I1, V, R0, R1, R2) \
154 ALUX1(N, OP, I0, I1, V, R0, R1, R2) \
155 ALUX1(N, OP, I0, I1, V, R1, R0, R2) \
156 ALUX1(N, OP, I0, I1, V, R2, R1, R0)
157
158#if __ia64__
159# define ALUX(N, OP, I0, I1, V) \
160 ALUX2(N, OP, I0, I1, V, r0, r1, r2) \
161 ALUX2(N, OP, I0, I1, V, v0, v1, v2)
162#else
163# define ALUX(N, OP, I0, I1, V) \
164 ALUX0(N, OP, I0, I1, V, v0, v1, v2) \
165 ALUX0(N, OP, I0, I1, V, v0, v1, r0) \
166 ALUX0(N, OP, I0, I1, V, v0, v1, r1) \
167 ALUX0(N, OP, I0, I1, V, v0, v1, r2) \
168 ALUX0(N, OP, I0, I1, V, v1, v2, r0) \
169 ALUX0(N, OP, I0, I1, V, v1, v2, r1) \
170 ALUX0(N, OP, I0, I1, V, v1, v2, r2) \
171 ALUX0(N, OP, I0, I1, V, v2, r0, r1) \
172 ALUX0(N, OP, I0, I1, V, v2, r0, r2) \
173 ALUX0(N, OP, I0, I1, V, r0, r1, r2)
174#endif
175
176/* unary int */
177
178#define UNR(N, OP, I, V, R0, R1) \
179 movi %R1 I \
180 OP##r %R0 %R1 \
181 beqi OP##N##R0##R1 %R0 V \
182 calli @abort \
183OP##N##R0##R1:
184
185#define UNRC(N, OP, I, V, R0, R1) \
186 movi %R0 I \
187 OP##r %R0 %R0 \
188 beqi OP##N##c##R0##R1 %R0 V \
189 calli @abort \
190OP##N##c##R0##R1:
191
192#define UN2(N, OP, I, V, R0, R1) \
193 UNR(N, OP, I, V, R0, R1) \
194 UNRC(N, OP, I, V, R0, R1)
195
196#define UN1(N, OP, I, V, R0, R1) \
197 UN2(N, OP, I, V, R0, R1) \
198 UN2(N, OP, I, V, R1, R0)
199
200#if __ia64__
201# define UN(N, OP, I, V) \
202 UN2(N, OP, I, V, r0, r1) \
203 UN2(N, OP, I, V, v0, v1)
204#else
205# define UN(N, OP, I, V) \
206 UN1(N, OP, I, V, v0, v1) \
207 UN1(N, OP, I, V, v0, v2) \
208 UN1(N, OP, I, V, v0, r0) \
209 UN1(N, OP, I, V, v0, r1) \
210 UN1(N, OP, I, V, v0, r2) \
211 UN1(N, OP, I, V, v1, v2) \
212 UN1(N, OP, I, V, v1, r0) \
213 UN1(N, OP, I, V, v1, r1) \
214 UN1(N, OP, I, V, v1, r2) \
215 UN1(N, OP, I, V, v2, r0) \
216 UN1(N, OP, I, V, v2, r1) \
217 UN1(N, OP, I, V, v2, r2) \
218 UN1(N, OP, I, V, r0, r1) \
219 UN1(N, OP, I, V, r0, r2) \
220 UN1(N, OP, I, V, r1, r2)
221#endif
222
223/* reg0 = reg1 op reg2 */
224#define FOPR(N, T, OP, I0, I1, V, F0, F1, F2) \
225 movi##T %F1 I0 \
226 movi##T %F2 I1 \
227 OP##r##T %F0 %F1 %F2 \
228 beqi##T OP##T##N##F0##F1##F2 %F0 V \
229 calli @abort \
230OP##T##N##F0##F1##F2:
231
232/* reg0 = reg0 op reg1 */
233#define FOPR0(N, T, OP, I0, I1, V, F0, F1, F2) \
234 movi##T %F0 I0 \
235 movi##T %F1 I1 \
236 OP##r##T %F0 %F0 %F1 \
237 beqi##T OP##T##N##0##F0##F1##F2 %F0 V \
238 calli @abort \
239OP##T##N##0##F0##F1##F2:
240
241/* reg1 = reg0 op reg1 */
242#define FOPR1(N, T, OP, I0, I1, V, F0, F1, F2) \
243 movi##T %F0 I0 \
244 movi##T %F1 I1 \
245 OP##r##T %F1 %F0 %F1 \
246 beqi##T OP##T##N##1##F0##F1##F2 %F1 V \
247 calli @abort \
248OP##T##N##1##F0##F1##F2:
249
250/* reg0 = reg1 op im */
251#define FOPI(N, T, OP, I0, I1, V, F0, F1, F2) \
252 movi##T %F1 I0 \
253 movi##T %F2 V \
254 OP##i##T %F0 %F1 I1 \
255 beqr##T OP##T##N##i##F0##F1##F2 %F0 %F2 \
256 calli @abort \
257OP##T##N##i##F0##F1##F2:
258
259/* reg0 = reg0 op im */
260#define FOPI0(N, T, OP, I0, I1, V, F0, F1, F2) \
261 movi##T %F0 I0 \
262 movi##T %F2 V \
263 OP##i##T %F0 %F0 I1 \
264 beqr##T OP##T##N##i0##F0##F1##F2 %F0 %F2 \
265 calli @abort \
266OP##T##N##i0##F0##F1##F2:
267
268#define FOP1(N, T, OP, I0, I1, V, F0, F1, F2) \
269 FOPR(N, T, OP, I0, I1, V, F0, F1, F2) \
270 FOPR0(N, T, OP, I0, I1, V, F0, F1, F2) \
271 FOPR1(N, T, OP, I0, I1, V, F0, F1, F2) \
272 FOPI(N, T, OP, I0, I1, V, F0, F1, F2) \
273 FOPI0(N, T, OP, I0, I1, V, F0, F1, F2)
274
275#if __ia64__
276# define FOP(N, T, OP, I0, I1, V) \
277 FOP1(N, T, OP, I0, I1, V, f0, f1, f2)
278#else
279# define FOP(N, T, OP, I0, I1, V) \
280 FOP1(N, T, OP, I0, I1, V, f0, f1, f2) \
281 FOP1(N, T, OP, I0, I1, V, f0, f2, f3) \
282 FOP1(N, T, OP, I0, I1, V, f0, f3, f4) \
283 FOP1(N, T, OP, I0, I1, V, f0, f5, f1)
284#endif
285
286/* unary float */
287
288#define FUNR(N, T, OP, I, V, R0, R1) \
289 movi##T %R1 I \
290 OP##r##T %R0 %R1 \
291 beqi##T OP##N##T##R0##R1 %R0 V \
292 calli @abort \
293OP##N##T##R0##R1:
294
295#define FUNRC(N, T, OP, I, V, R0, R1) \
296 movi##T %R0 I \
297 OP##r##T %R0 %R0 \
298 beqi##T OP##N##T##c##R0##R1 %R0 V \
299 calli @abort \
300OP##N##T##c##R0##R1:
301
302#define FUN2(N, T, OP, I, V, R0, R1) \
303 FUNR(N, T, OP, I, V, R0, R1) \
304 FUNRC(N, T, OP, I, V, R0, R1)
305
306#define FUN1(N, T, OP, I, V, R0, R1) \
307 FUN2(N, T, OP, I, V, R0, R1) \
308 FUN2(N, T, OP, I, V, R1, R0)
309
310#if __ia64__
311# define FUN(N, T, OP, I, V) \
312 FUN2(N, T, OP, I, V, f0, f1)
313#else
314# define FUN(N, T, OP, I, V) \
315 FUN1(N, T, OP, I, V, f0, f1) \
316 FUN1(N, T, OP, I, V, f0, f2) \
317 FUN1(N, T, OP, I, V, f0, f3) \
318 FUN1(N, T, OP, I, V, f0, f4) \
319 FUN1(N, T, OP, I, V, f0, f5)
320#endif
321
322/* unordered comparison unary float */
323
324#define UFUNR(N, T, OP, I, V, R0, R1) \
325 movi##T %R1 I \
326 OP##r##T %R0 %R1 \
327 buneqi##T OP##N##T##u##R0##R1 %R0 V \
328 calli @abort \
329OP##N##T##u##R0##R1:
330
331#define UFUNRC(N, T, OP, I, V, R0, R1) \
332 movi##T %R0 I \
333 OP##r##T %R0 %R0 \
334 buneqi##T OP##N##T##uc##R0##R1 %R0 V \
335 calli @abort \
336OP##N##T##uc##R0##R1:
337
338#define UFUN2(N, T, OP, I, V, R0, R1) \
339 UFUNR(N, T, OP, I, V, R0, R1) \
340 UFUNRC(N, T, OP, I, V, R0, R1)
341
342#define UFUN1(N, T, OP, I, V, R0, R1) \
343 UFUN2(N, T, OP, I, V, R0, R1) \
344 UFUN2(N, T, OP, I, V, R1, R0)
345
346#if __ia64__
347# define UFUN(N, T, OP, I, V) \
348 UFUN2(N, T, OP, I, V, f0, f1)
349#else
350# define UFUN(N, T, OP, I, V) \
351 UFUN1(N, T, OP, I, V, f0, f1) \
352 UFUN1(N, T, OP, I, V, f0, f2) \
353 UFUN1(N, T, OP, I, V, f0, f3) \
354 UFUN1(N, T, OP, I, V, f0, f4) \
355 UFUN1(N, T, OP, I, V, f0, f5)
356#endif
357
358. $( $NaN = 0.0/0.0)
359. $( $Inf = 1.0/0.0)
360. $($nInf = -1.0/0.0)