git subrepo clone https://git.savannah.gnu.org/git/lightning.git deps/lightning
[pcsx_rearmed.git] / deps / lightning / check / alu.inc
1 .data   8
2 ok:
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                                    \
23 OP##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                                    \
32 OP##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                                    \
42 OP##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                                    \
52 OP##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                                    \
61 OP##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                                    \
112 OP##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                                    \
121 OP##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                                    \
131 OP##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                                    \
141 OP##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                                    \
183 OP##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                                    \
190 OP##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                                    \
230 OP##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                                    \
239 OP##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                                    \
248 OP##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                                    \
257 OP##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                                    \
266 OP##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                                    \
293 OP##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                                    \
300 OP##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                                    \
329 OP##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                                    \
336 OP##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)