1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24#include "tcg.h"
25
26int gen_new_label(void);
27
28static inline void tcg_gen_op0(TCGOpcode opc)
29{
30 *tcg_ctx.gen_opc_ptr++ = opc;
31}
32
33static inline void tcg_gen_op1_i32(TCGOpcode opc, TCGv_i32 arg1)
34{
35 *tcg_ctx.gen_opc_ptr++ = opc;
36 *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I32(arg1);
37}
38
39static inline void tcg_gen_op1_i64(TCGOpcode opc, TCGv_i64 arg1)
40{
41 *tcg_ctx.gen_opc_ptr++ = opc;
42 *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I64(arg1);
43}
44
45static inline void tcg_gen_op1i(TCGOpcode opc, TCGArg arg1)
46{
47 *tcg_ctx.gen_opc_ptr++ = opc;
48 *tcg_ctx.gen_opparam_ptr++ = arg1;
49}
50
51static inline void tcg_gen_op2_i32(TCGOpcode opc, TCGv_i32 arg1, TCGv_i32 arg2)
52{
53 *tcg_ctx.gen_opc_ptr++ = opc;
54 *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I32(arg1);
55 *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I32(arg2);
56}
57
58static inline void tcg_gen_op2_i64(TCGOpcode opc, TCGv_i64 arg1, TCGv_i64 arg2)
59{
60 *tcg_ctx.gen_opc_ptr++ = opc;
61 *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I64(arg1);
62 *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I64(arg2);
63}
64
65static inline void tcg_gen_op2i_i32(TCGOpcode opc, TCGv_i32 arg1, TCGArg arg2)
66{
67 *tcg_ctx.gen_opc_ptr++ = opc;
68 *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I32(arg1);
69 *tcg_ctx.gen_opparam_ptr++ = arg2;
70}
71
72static inline void tcg_gen_op2i_i64(TCGOpcode opc, TCGv_i64 arg1, TCGArg arg2)
73{
74 *tcg_ctx.gen_opc_ptr++ = opc;
75 *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I64(arg1);
76 *tcg_ctx.gen_opparam_ptr++ = arg2;
77}
78
79static inline void tcg_gen_op2ii(TCGOpcode opc, TCGArg arg1, TCGArg arg2)
80{
81 *tcg_ctx.gen_opc_ptr++ = opc;
82 *tcg_ctx.gen_opparam_ptr++ = arg1;
83 *tcg_ctx.gen_opparam_ptr++ = arg2;
84}
85
86static inline void tcg_gen_op3_i32(TCGOpcode opc, TCGv_i32 arg1, TCGv_i32 arg2,
87 TCGv_i32 arg3)
88{
89 *tcg_ctx.gen_opc_ptr++ = opc;
90 *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I32(arg1);
91 *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I32(arg2);
92 *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I32(arg3);
93}
94
95static inline void tcg_gen_op3_i64(TCGOpcode opc, TCGv_i64 arg1, TCGv_i64 arg2,
96 TCGv_i64 arg3)
97{
98 *tcg_ctx.gen_opc_ptr++ = opc;
99 *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I64(arg1);
100 *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I64(arg2);
101 *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I64(arg3);
102}
103
104static inline void tcg_gen_op3i_i32(TCGOpcode opc, TCGv_i32 arg1,
105 TCGv_i32 arg2, TCGArg arg3)
106{
107 *tcg_ctx.gen_opc_ptr++ = opc;
108 *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I32(arg1);
109 *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I32(arg2);
110 *tcg_ctx.gen_opparam_ptr++ = arg3;
111}
112
113static inline void tcg_gen_op3i_i64(TCGOpcode opc, TCGv_i64 arg1,
114 TCGv_i64 arg2, TCGArg arg3)
115{
116 *tcg_ctx.gen_opc_ptr++ = opc;
117 *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I64(arg1);
118 *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I64(arg2);
119 *tcg_ctx.gen_opparam_ptr++ = arg3;
120}
121
122static inline void tcg_gen_ldst_op_i32(TCGOpcode opc, TCGv_i32 val,
123 TCGv_ptr base, TCGArg offset)
124{
125 *tcg_ctx.gen_opc_ptr++ = opc;
126 *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I32(val);
127 *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_PTR(base);
128 *tcg_ctx.gen_opparam_ptr++ = offset;
129}
130
131static inline void tcg_gen_ldst_op_i64(TCGOpcode opc, TCGv_i64 val,
132 TCGv_ptr base, TCGArg offset)
133{
134 *tcg_ctx.gen_opc_ptr++ = opc;
135 *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I64(val);
136 *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_PTR(base);
137 *tcg_ctx.gen_opparam_ptr++ = offset;
138}
139
140static inline void tcg_gen_op4_i32(TCGOpcode opc, TCGv_i32 arg1, TCGv_i32 arg2,
141 TCGv_i32 arg3, TCGv_i32 arg4)
142{
143 *tcg_ctx.gen_opc_ptr++ = opc;
144 *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I32(arg1);
145 *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I32(arg2);
146 *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I32(arg3);
147 *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I32(arg4);
148}
149
150static inline void tcg_gen_op4_i64(TCGOpcode opc, TCGv_i64 arg1, TCGv_i64 arg2,
151 TCGv_i64 arg3, TCGv_i64 arg4)
152{
153 *tcg_ctx.gen_opc_ptr++ = opc;
154 *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I64(arg1);
155 *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I64(arg2);
156 *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I64(arg3);
157 *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I64(arg4);
158}
159
160static inline void tcg_gen_op4i_i32(TCGOpcode opc, TCGv_i32 arg1, TCGv_i32 arg2,
161 TCGv_i32 arg3, TCGArg arg4)
162{
163 *tcg_ctx.gen_opc_ptr++ = opc;
164 *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I32(arg1);
165 *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I32(arg2);
166 *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I32(arg3);
167 *tcg_ctx.gen_opparam_ptr++ = arg4;
168}
169
170static inline void tcg_gen_op4i_i64(TCGOpcode opc, TCGv_i64 arg1, TCGv_i64 arg2,
171 TCGv_i64 arg3, TCGArg arg4)
172{
173 *tcg_ctx.gen_opc_ptr++ = opc;
174 *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I64(arg1);
175 *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I64(arg2);
176 *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I64(arg3);
177 *tcg_ctx.gen_opparam_ptr++ = arg4;
178}
179
180static inline void tcg_gen_op4ii_i32(TCGOpcode opc, TCGv_i32 arg1, TCGv_i32 arg2,
181 TCGArg arg3, TCGArg arg4)
182{
183 *tcg_ctx.gen_opc_ptr++ = opc;
184 *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I32(arg1);
185 *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I32(arg2);
186 *tcg_ctx.gen_opparam_ptr++ = arg3;
187 *tcg_ctx.gen_opparam_ptr++ = arg4;
188}
189
190static inline void tcg_gen_op4ii_i64(TCGOpcode opc, TCGv_i64 arg1, TCGv_i64 arg2,
191 TCGArg arg3, TCGArg arg4)
192{
193 *tcg_ctx.gen_opc_ptr++ = opc;
194 *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I64(arg1);
195 *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I64(arg2);
196 *tcg_ctx.gen_opparam_ptr++ = arg3;
197 *tcg_ctx.gen_opparam_ptr++ = arg4;
198}
199
200static inline void tcg_gen_op5_i32(TCGOpcode opc, TCGv_i32 arg1, TCGv_i32 arg2,
201 TCGv_i32 arg3, TCGv_i32 arg4, TCGv_i32 arg5)
202{
203 *tcg_ctx.gen_opc_ptr++ = opc;
204 *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I32(arg1);
205 *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I32(arg2);
206 *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I32(arg3);
207 *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I32(arg4);
208 *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I32(arg5);
209}
210
211static inline void tcg_gen_op5_i64(TCGOpcode opc, TCGv_i64 arg1, TCGv_i64 arg2,
212 TCGv_i64 arg3, TCGv_i64 arg4, TCGv_i64 arg5)
213{
214 *tcg_ctx.gen_opc_ptr++ = opc;
215 *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I64(arg1);
216 *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I64(arg2);
217 *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I64(arg3);
218 *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I64(arg4);
219 *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I64(arg5);
220}
221
222static inline void tcg_gen_op5i_i32(TCGOpcode opc, TCGv_i32 arg1, TCGv_i32 arg2,
223 TCGv_i32 arg3, TCGv_i32 arg4, TCGArg arg5)
224{
225 *tcg_ctx.gen_opc_ptr++ = opc;
226 *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I32(arg1);
227 *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I32(arg2);
228 *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I32(arg3);
229 *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I32(arg4);
230 *tcg_ctx.gen_opparam_ptr++ = arg5;
231}
232
233static inline void tcg_gen_op5i_i64(TCGOpcode opc, TCGv_i64 arg1, TCGv_i64 arg2,
234 TCGv_i64 arg3, TCGv_i64 arg4, TCGArg arg5)
235{
236 *tcg_ctx.gen_opc_ptr++ = opc;
237 *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I64(arg1);
238 *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I64(arg2);
239 *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I64(arg3);
240 *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I64(arg4);
241 *tcg_ctx.gen_opparam_ptr++ = arg5;
242}
243
244static inline void tcg_gen_op5ii_i32(TCGOpcode opc, TCGv_i32 arg1,
245 TCGv_i32 arg2, TCGv_i32 arg3,
246 TCGArg arg4, TCGArg arg5)
247{
248 *tcg_ctx.gen_opc_ptr++ = opc;
249 *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I32(arg1);
250 *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I32(arg2);
251 *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I32(arg3);
252 *tcg_ctx.gen_opparam_ptr++ = arg4;
253 *tcg_ctx.gen_opparam_ptr++ = arg5;
254}
255
256static inline void tcg_gen_op5ii_i64(TCGOpcode opc, TCGv_i64 arg1,
257 TCGv_i64 arg2, TCGv_i64 arg3,
258 TCGArg arg4, TCGArg arg5)
259{
260 *tcg_ctx.gen_opc_ptr++ = opc;
261 *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I64(arg1);
262 *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I64(arg2);
263 *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I64(arg3);
264 *tcg_ctx.gen_opparam_ptr++ = arg4;
265 *tcg_ctx.gen_opparam_ptr++ = arg5;
266}
267
268static inline void tcg_gen_op6_i32(TCGOpcode opc, TCGv_i32 arg1, TCGv_i32 arg2,
269 TCGv_i32 arg3, TCGv_i32 arg4, TCGv_i32 arg5,
270 TCGv_i32 arg6)
271{
272 *tcg_ctx.gen_opc_ptr++ = opc;
273 *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I32(arg1);
274 *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I32(arg2);
275 *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I32(arg3);
276 *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I32(arg4);
277 *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I32(arg5);
278 *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I32(arg6);
279}
280
281static inline void tcg_gen_op6_i64(TCGOpcode opc, TCGv_i64 arg1, TCGv_i64 arg2,
282 TCGv_i64 arg3, TCGv_i64 arg4, TCGv_i64 arg5,
283 TCGv_i64 arg6)
284{
285 *tcg_ctx.gen_opc_ptr++ = opc;
286 *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I64(arg1);
287 *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I64(arg2);
288 *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I64(arg3);
289 *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I64(arg4);
290 *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I64(arg5);
291 *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I64(arg6);
292}
293
294static inline void tcg_gen_op6i_i32(TCGOpcode opc, TCGv_i32 arg1, TCGv_i32 arg2,
295 TCGv_i32 arg3, TCGv_i32 arg4,
296 TCGv_i32 arg5, TCGArg arg6)
297{
298 *tcg_ctx.gen_opc_ptr++ = opc;
299 *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I32(arg1);
300 *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I32(arg2);
301 *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I32(arg3);
302 *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I32(arg4);
303 *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I32(arg5);
304 *tcg_ctx.gen_opparam_ptr++ = arg6;
305}
306
307static inline void tcg_gen_op6i_i64(TCGOpcode opc, TCGv_i64 arg1, TCGv_i64 arg2,
308 TCGv_i64 arg3, TCGv_i64 arg4,
309 TCGv_i64 arg5, TCGArg arg6)
310{
311 *tcg_ctx.gen_opc_ptr++ = opc;
312 *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I64(arg1);
313 *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I64(arg2);
314 *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I64(arg3);
315 *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I64(arg4);
316 *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I64(arg5);
317 *tcg_ctx.gen_opparam_ptr++ = arg6;
318}
319
320static inline void tcg_gen_op6ii_i32(TCGOpcode opc, TCGv_i32 arg1,
321 TCGv_i32 arg2, TCGv_i32 arg3,
322 TCGv_i32 arg4, TCGArg arg5, TCGArg arg6)
323{
324 *tcg_ctx.gen_opc_ptr++ = opc;
325 *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I32(arg1);
326 *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I32(arg2);
327 *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I32(arg3);
328 *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I32(arg4);
329 *tcg_ctx.gen_opparam_ptr++ = arg5;
330 *tcg_ctx.gen_opparam_ptr++ = arg6;
331}
332
333static inline void tcg_gen_op6ii_i64(TCGOpcode opc, TCGv_i64 arg1,
334 TCGv_i64 arg2, TCGv_i64 arg3,
335 TCGv_i64 arg4, TCGArg arg5, TCGArg arg6)
336{
337 *tcg_ctx.gen_opc_ptr++ = opc;
338 *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I64(arg1);
339 *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I64(arg2);
340 *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I64(arg3);
341 *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I64(arg4);
342 *tcg_ctx.gen_opparam_ptr++ = arg5;
343 *tcg_ctx.gen_opparam_ptr++ = arg6;
344}
345
346static inline void tcg_add_param_i32(TCGv_i32 val)
347{
348 *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I32(val);
349}
350
351static inline void tcg_add_param_i64(TCGv_i64 val)
352{
353#if TCG_TARGET_REG_BITS == 32
354 *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I32(TCGV_LOW(val));
355 *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I32(TCGV_HIGH(val));
356#else
357 *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I64(val);
358#endif
359}
360
361static inline void gen_set_label(int n)
362{
363 tcg_gen_op1i(INDEX_op_set_label, n);
364}
365
366static inline void tcg_gen_br(int label)
367{
368 tcg_gen_op1i(INDEX_op_br, label);
369}
370
371static inline void tcg_gen_mov_i32(TCGv_i32 ret, TCGv_i32 arg)
372{
373 if (!TCGV_EQUAL_I32(ret, arg))
374 tcg_gen_op2_i32(INDEX_op_mov_i32, ret, arg);
375}
376
377static inline void tcg_gen_movi_i32(TCGv_i32 ret, int32_t arg)
378{
379 tcg_gen_op2i_i32(INDEX_op_movi_i32, ret, arg);
380}
381
382
383
384static inline int tcg_gen_sizemask(int n, int is_64bit, int is_signed)
385{
386 return (is_64bit << n*2) | (is_signed << (n*2 + 1));
387}
388
389
390static inline void tcg_gen_helperN(void *func, int flags, int sizemask,
391 TCGArg ret, int nargs, TCGArg *args)
392{
393 TCGv_ptr fn;
394 fn = tcg_const_ptr(func);
395 tcg_gen_callN(&tcg_ctx, fn, flags, sizemask, ret,
396 nargs, args);
397 tcg_temp_free_ptr(fn);
398}
399
400
401
402
403
404
405static inline void tcg_gen_helper32(void *func, int sizemask, TCGv_i32 ret,
406 TCGv_i32 a, TCGv_i32 b)
407{
408 TCGv_ptr fn;
409 TCGArg args[2];
410 fn = tcg_const_ptr(func);
411 args[0] = GET_TCGV_I32(a);
412 args[1] = GET_TCGV_I32(b);
413 tcg_gen_callN(&tcg_ctx, fn,
414 TCG_CALL_NO_READ_GLOBALS | TCG_CALL_NO_SIDE_EFFECTS,
415 sizemask, GET_TCGV_I32(ret), 2, args);
416 tcg_temp_free_ptr(fn);
417}
418
419static inline void tcg_gen_helper64(void *func, int sizemask, TCGv_i64 ret,
420 TCGv_i64 a, TCGv_i64 b)
421{
422 TCGv_ptr fn;
423 TCGArg args[2];
424 fn = tcg_const_ptr(func);
425 args[0] = GET_TCGV_I64(a);
426 args[1] = GET_TCGV_I64(b);
427 tcg_gen_callN(&tcg_ctx, fn,
428 TCG_CALL_NO_READ_GLOBALS | TCG_CALL_NO_SIDE_EFFECTS,
429 sizemask, GET_TCGV_I64(ret), 2, args);
430 tcg_temp_free_ptr(fn);
431}
432
433
434
435static inline void tcg_gen_ld8u_i32(TCGv_i32 ret, TCGv_ptr arg2, tcg_target_long offset)
436{
437 tcg_gen_ldst_op_i32(INDEX_op_ld8u_i32, ret, arg2, offset);
438}
439
440static inline void tcg_gen_ld8s_i32(TCGv_i32 ret, TCGv_ptr arg2, tcg_target_long offset)
441{
442 tcg_gen_ldst_op_i32(INDEX_op_ld8s_i32, ret, arg2, offset);
443}
444
445static inline void tcg_gen_ld16u_i32(TCGv_i32 ret, TCGv_ptr arg2, tcg_target_long offset)
446{
447 tcg_gen_ldst_op_i32(INDEX_op_ld16u_i32, ret, arg2, offset);
448}
449
450static inline void tcg_gen_ld16s_i32(TCGv_i32 ret, TCGv_ptr arg2, tcg_target_long offset)
451{
452 tcg_gen_ldst_op_i32(INDEX_op_ld16s_i32, ret, arg2, offset);
453}
454
455static inline void tcg_gen_ld_i32(TCGv_i32 ret, TCGv_ptr arg2, tcg_target_long offset)
456{
457 tcg_gen_ldst_op_i32(INDEX_op_ld_i32, ret, arg2, offset);
458}
459
460static inline void tcg_gen_st8_i32(TCGv_i32 arg1, TCGv_ptr arg2, tcg_target_long offset)
461{
462 tcg_gen_ldst_op_i32(INDEX_op_st8_i32, arg1, arg2, offset);
463}
464
465static inline void tcg_gen_st16_i32(TCGv_i32 arg1, TCGv_ptr arg2, tcg_target_long offset)
466{
467 tcg_gen_ldst_op_i32(INDEX_op_st16_i32, arg1, arg2, offset);
468}
469
470static inline void tcg_gen_st_i32(TCGv_i32 arg1, TCGv_ptr arg2, tcg_target_long offset)
471{
472 tcg_gen_ldst_op_i32(INDEX_op_st_i32, arg1, arg2, offset);
473}
474
475static inline void tcg_gen_add_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
476{
477 tcg_gen_op3_i32(INDEX_op_add_i32, ret, arg1, arg2);
478}
479
480static inline void tcg_gen_addi_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2)
481{
482
483 if (arg2 == 0) {
484 tcg_gen_mov_i32(ret, arg1);
485 } else {
486 TCGv_i32 t0 = tcg_const_i32(arg2);
487 tcg_gen_add_i32(ret, arg1, t0);
488 tcg_temp_free_i32(t0);
489 }
490}
491
492static inline void tcg_gen_sub_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
493{
494 tcg_gen_op3_i32(INDEX_op_sub_i32, ret, arg1, arg2);
495}
496
497static inline void tcg_gen_subfi_i32(TCGv_i32 ret, int32_t arg1, TCGv_i32 arg2)
498{
499 TCGv_i32 t0 = tcg_const_i32(arg1);
500 tcg_gen_sub_i32(ret, t0, arg2);
501 tcg_temp_free_i32(t0);
502}
503
504static inline void tcg_gen_subi_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2)
505{
506
507 if (arg2 == 0) {
508 tcg_gen_mov_i32(ret, arg1);
509 } else {
510 TCGv_i32 t0 = tcg_const_i32(arg2);
511 tcg_gen_sub_i32(ret, arg1, t0);
512 tcg_temp_free_i32(t0);
513 }
514}
515
516static inline void tcg_gen_and_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
517{
518 if (TCGV_EQUAL_I32(arg1, arg2)) {
519 tcg_gen_mov_i32(ret, arg1);
520 } else {
521 tcg_gen_op3_i32(INDEX_op_and_i32, ret, arg1, arg2);
522 }
523}
524
525static inline void tcg_gen_andi_i32(TCGv_i32 ret, TCGv_i32 arg1, uint32_t arg2)
526{
527 TCGv_i32 t0;
528
529 switch (arg2) {
530 case 0:
531 tcg_gen_movi_i32(ret, 0);
532 return;
533 case 0xffffffffu:
534 tcg_gen_mov_i32(ret, arg1);
535 return;
536 case 0xffu:
537
538 if (TCG_TARGET_HAS_ext8u_i32) {
539 tcg_gen_op2_i32(INDEX_op_ext8u_i32, ret, arg1);
540 return;
541 }
542 break;
543 case 0xffffu:
544 if (TCG_TARGET_HAS_ext16u_i32) {
545 tcg_gen_op2_i32(INDEX_op_ext16u_i32, ret, arg1);
546 return;
547 }
548 break;
549 }
550 t0 = tcg_const_i32(arg2);
551 tcg_gen_and_i32(ret, arg1, t0);
552 tcg_temp_free_i32(t0);
553}
554
555static inline void tcg_gen_or_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
556{
557 if (TCGV_EQUAL_I32(arg1, arg2)) {
558 tcg_gen_mov_i32(ret, arg1);
559 } else {
560 tcg_gen_op3_i32(INDEX_op_or_i32, ret, arg1, arg2);
561 }
562}
563
564static inline void tcg_gen_ori_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2)
565{
566
567 if (arg2 == -1) {
568 tcg_gen_movi_i32(ret, -1);
569 } else if (arg2 == 0) {
570 tcg_gen_mov_i32(ret, arg1);
571 } else {
572 TCGv_i32 t0 = tcg_const_i32(arg2);
573 tcg_gen_or_i32(ret, arg1, t0);
574 tcg_temp_free_i32(t0);
575 }
576}
577
578static inline void tcg_gen_xor_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
579{
580 if (TCGV_EQUAL_I32(arg1, arg2)) {
581 tcg_gen_movi_i32(ret, 0);
582 } else {
583 tcg_gen_op3_i32(INDEX_op_xor_i32, ret, arg1, arg2);
584 }
585}
586
587static inline void tcg_gen_xori_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2)
588{
589
590 if (arg2 == 0) {
591 tcg_gen_mov_i32(ret, arg1);
592 } else if (arg2 == -1 && TCG_TARGET_HAS_not_i32) {
593
594 tcg_gen_op2_i32(INDEX_op_not_i32, ret, arg1);
595 } else {
596 TCGv_i32 t0 = tcg_const_i32(arg2);
597 tcg_gen_xor_i32(ret, arg1, t0);
598 tcg_temp_free_i32(t0);
599 }
600}
601
602static inline void tcg_gen_shl_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
603{
604 tcg_gen_op3_i32(INDEX_op_shl_i32, ret, arg1, arg2);
605}
606
607static inline void tcg_gen_shli_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2)
608{
609 if (arg2 == 0) {
610 tcg_gen_mov_i32(ret, arg1);
611 } else {
612 TCGv_i32 t0 = tcg_const_i32(arg2);
613 tcg_gen_shl_i32(ret, arg1, t0);
614 tcg_temp_free_i32(t0);
615 }
616}
617
618static inline void tcg_gen_shr_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
619{
620 tcg_gen_op3_i32(INDEX_op_shr_i32, ret, arg1, arg2);
621}
622
623static inline void tcg_gen_shri_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2)
624{
625 if (arg2 == 0) {
626 tcg_gen_mov_i32(ret, arg1);
627 } else {
628 TCGv_i32 t0 = tcg_const_i32(arg2);
629 tcg_gen_shr_i32(ret, arg1, t0);
630 tcg_temp_free_i32(t0);
631 }
632}
633
634static inline void tcg_gen_sar_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
635{
636 tcg_gen_op3_i32(INDEX_op_sar_i32, ret, arg1, arg2);
637}
638
639static inline void tcg_gen_sari_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2)
640{
641 if (arg2 == 0) {
642 tcg_gen_mov_i32(ret, arg1);
643 } else {
644 TCGv_i32 t0 = tcg_const_i32(arg2);
645 tcg_gen_sar_i32(ret, arg1, t0);
646 tcg_temp_free_i32(t0);
647 }
648}
649
650static inline void tcg_gen_brcond_i32(TCGCond cond, TCGv_i32 arg1,
651 TCGv_i32 arg2, int label_index)
652{
653 if (cond == TCG_COND_ALWAYS) {
654 tcg_gen_br(label_index);
655 } else if (cond != TCG_COND_NEVER) {
656 tcg_gen_op4ii_i32(INDEX_op_brcond_i32, arg1, arg2, cond, label_index);
657 }
658}
659
660static inline void tcg_gen_brcondi_i32(TCGCond cond, TCGv_i32 arg1,
661 int32_t arg2, int label_index)
662{
663 if (cond == TCG_COND_ALWAYS) {
664 tcg_gen_br(label_index);
665 } else if (cond != TCG_COND_NEVER) {
666 TCGv_i32 t0 = tcg_const_i32(arg2);
667 tcg_gen_brcond_i32(cond, arg1, t0, label_index);
668 tcg_temp_free_i32(t0);
669 }
670}
671
672static inline void tcg_gen_setcond_i32(TCGCond cond, TCGv_i32 ret,
673 TCGv_i32 arg1, TCGv_i32 arg2)
674{
675 if (cond == TCG_COND_ALWAYS) {
676 tcg_gen_movi_i32(ret, 1);
677 } else if (cond == TCG_COND_NEVER) {
678 tcg_gen_movi_i32(ret, 0);
679 } else {
680 tcg_gen_op4i_i32(INDEX_op_setcond_i32, ret, arg1, arg2, cond);
681 }
682}
683
684static inline void tcg_gen_setcondi_i32(TCGCond cond, TCGv_i32 ret,
685 TCGv_i32 arg1, int32_t arg2)
686{
687 if (cond == TCG_COND_ALWAYS) {
688 tcg_gen_movi_i32(ret, 1);
689 } else if (cond == TCG_COND_NEVER) {
690 tcg_gen_movi_i32(ret, 0);
691 } else {
692 TCGv_i32 t0 = tcg_const_i32(arg2);
693 tcg_gen_setcond_i32(cond, ret, arg1, t0);
694 tcg_temp_free_i32(t0);
695 }
696}
697
698static inline void tcg_gen_mul_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
699{
700 tcg_gen_op3_i32(INDEX_op_mul_i32, ret, arg1, arg2);
701}
702
703static inline void tcg_gen_muli_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2)
704{
705 TCGv_i32 t0 = tcg_const_i32(arg2);
706 tcg_gen_mul_i32(ret, arg1, t0);
707 tcg_temp_free_i32(t0);
708}
709
710static inline void tcg_gen_div_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
711{
712 if (TCG_TARGET_HAS_div_i32) {
713 tcg_gen_op3_i32(INDEX_op_div_i32, ret, arg1, arg2);
714 } else if (TCG_TARGET_HAS_div2_i32) {
715 TCGv_i32 t0 = tcg_temp_new_i32();
716 tcg_gen_sari_i32(t0, arg1, 31);
717 tcg_gen_op5_i32(INDEX_op_div2_i32, ret, t0, arg1, t0, arg2);
718 tcg_temp_free_i32(t0);
719 } else {
720 int sizemask = 0;
721
722 sizemask |= tcg_gen_sizemask(0, 0, 1);
723 sizemask |= tcg_gen_sizemask(1, 0, 1);
724 sizemask |= tcg_gen_sizemask(2, 0, 1);
725 tcg_gen_helper32(tcg_helper_div_i32, sizemask, ret, arg1, arg2);
726 }
727}
728
729static inline void tcg_gen_rem_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
730{
731 if (TCG_TARGET_HAS_rem_i32) {
732 tcg_gen_op3_i32(INDEX_op_rem_i32, ret, arg1, arg2);
733 } else if (TCG_TARGET_HAS_div_i32) {
734 TCGv_i32 t0 = tcg_temp_new_i32();
735 tcg_gen_op3_i32(INDEX_op_div_i32, t0, arg1, arg2);
736 tcg_gen_mul_i32(t0, t0, arg2);
737 tcg_gen_sub_i32(ret, arg1, t0);
738 tcg_temp_free_i32(t0);
739 } else if (TCG_TARGET_HAS_div2_i32) {
740 TCGv_i32 t0 = tcg_temp_new_i32();
741 tcg_gen_sari_i32(t0, arg1, 31);
742 tcg_gen_op5_i32(INDEX_op_div2_i32, t0, ret, arg1, t0, arg2);
743 tcg_temp_free_i32(t0);
744 } else {
745 int sizemask = 0;
746
747 sizemask |= tcg_gen_sizemask(0, 0, 1);
748 sizemask |= tcg_gen_sizemask(1, 0, 1);
749 sizemask |= tcg_gen_sizemask(2, 0, 1);
750 tcg_gen_helper32(tcg_helper_rem_i32, sizemask, ret, arg1, arg2);
751 }
752}
753
754static inline void tcg_gen_divu_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
755{
756 if (TCG_TARGET_HAS_div_i32) {
757 tcg_gen_op3_i32(INDEX_op_divu_i32, ret, arg1, arg2);
758 } else if (TCG_TARGET_HAS_div2_i32) {
759 TCGv_i32 t0 = tcg_temp_new_i32();
760 tcg_gen_movi_i32(t0, 0);
761 tcg_gen_op5_i32(INDEX_op_divu2_i32, ret, t0, arg1, t0, arg2);
762 tcg_temp_free_i32(t0);
763 } else {
764 int sizemask = 0;
765
766 sizemask |= tcg_gen_sizemask(0, 0, 0);
767 sizemask |= tcg_gen_sizemask(1, 0, 0);
768 sizemask |= tcg_gen_sizemask(2, 0, 0);
769 tcg_gen_helper32(tcg_helper_divu_i32, sizemask, ret, arg1, arg2);
770 }
771}
772
773static inline void tcg_gen_remu_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
774{
775 if (TCG_TARGET_HAS_rem_i32) {
776 tcg_gen_op3_i32(INDEX_op_remu_i32, ret, arg1, arg2);
777 } else if (TCG_TARGET_HAS_div_i32) {
778 TCGv_i32 t0 = tcg_temp_new_i32();
779 tcg_gen_op3_i32(INDEX_op_divu_i32, t0, arg1, arg2);
780 tcg_gen_mul_i32(t0, t0, arg2);
781 tcg_gen_sub_i32(ret, arg1, t0);
782 tcg_temp_free_i32(t0);
783 } else if (TCG_TARGET_HAS_div2_i32) {
784 TCGv_i32 t0 = tcg_temp_new_i32();
785 tcg_gen_movi_i32(t0, 0);
786 tcg_gen_op5_i32(INDEX_op_divu2_i32, t0, ret, arg1, t0, arg2);
787 tcg_temp_free_i32(t0);
788 } else {
789 int sizemask = 0;
790
791 sizemask |= tcg_gen_sizemask(0, 0, 0);
792 sizemask |= tcg_gen_sizemask(1, 0, 0);
793 sizemask |= tcg_gen_sizemask(2, 0, 0);
794 tcg_gen_helper32(tcg_helper_remu_i32, sizemask, ret, arg1, arg2);
795 }
796}
797
798#if TCG_TARGET_REG_BITS == 32
799
800static inline void tcg_gen_mov_i64(TCGv_i64 ret, TCGv_i64 arg)
801{
802 if (!TCGV_EQUAL_I64(ret, arg)) {
803 tcg_gen_mov_i32(TCGV_LOW(ret), TCGV_LOW(arg));
804 tcg_gen_mov_i32(TCGV_HIGH(ret), TCGV_HIGH(arg));
805 }
806}
807
808static inline void tcg_gen_movi_i64(TCGv_i64 ret, int64_t arg)
809{
810 tcg_gen_movi_i32(TCGV_LOW(ret), arg);
811 tcg_gen_movi_i32(TCGV_HIGH(ret), arg >> 32);
812}
813
814static inline void tcg_gen_ld8u_i64(TCGv_i64 ret, TCGv_ptr arg2,
815 tcg_target_long offset)
816{
817 tcg_gen_ld8u_i32(TCGV_LOW(ret), arg2, offset);
818 tcg_gen_movi_i32(TCGV_HIGH(ret), 0);
819}
820
821static inline void tcg_gen_ld8s_i64(TCGv_i64 ret, TCGv_ptr arg2,
822 tcg_target_long offset)
823{
824 tcg_gen_ld8s_i32(TCGV_LOW(ret), arg2, offset);
825 tcg_gen_sari_i32(TCGV_HIGH(ret), TCGV_HIGH(ret), 31);
826}
827
828static inline void tcg_gen_ld16u_i64(TCGv_i64 ret, TCGv_ptr arg2,
829 tcg_target_long offset)
830{
831 tcg_gen_ld16u_i32(TCGV_LOW(ret), arg2, offset);
832 tcg_gen_movi_i32(TCGV_HIGH(ret), 0);
833}
834
835static inline void tcg_gen_ld16s_i64(TCGv_i64 ret, TCGv_ptr arg2,
836 tcg_target_long offset)
837{
838 tcg_gen_ld16s_i32(TCGV_LOW(ret), arg2, offset);
839 tcg_gen_sari_i32(TCGV_HIGH(ret), TCGV_LOW(ret), 31);
840}
841
842static inline void tcg_gen_ld32u_i64(TCGv_i64 ret, TCGv_ptr arg2,
843 tcg_target_long offset)
844{
845 tcg_gen_ld_i32(TCGV_LOW(ret), arg2, offset);
846 tcg_gen_movi_i32(TCGV_HIGH(ret), 0);
847}
848
849static inline void tcg_gen_ld32s_i64(TCGv_i64 ret, TCGv_ptr arg2,
850 tcg_target_long offset)
851{
852 tcg_gen_ld_i32(TCGV_LOW(ret), arg2, offset);
853 tcg_gen_sari_i32(TCGV_HIGH(ret), TCGV_LOW(ret), 31);
854}
855
856static inline void tcg_gen_ld_i64(TCGv_i64 ret, TCGv_ptr arg2,
857 tcg_target_long offset)
858{
859
860
861#ifdef TCG_TARGET_WORDS_BIGENDIAN
862 tcg_gen_ld_i32(TCGV_HIGH(ret), arg2, offset);
863 tcg_gen_ld_i32(TCGV_LOW(ret), arg2, offset + 4);
864#else
865 tcg_gen_ld_i32(TCGV_LOW(ret), arg2, offset);
866 tcg_gen_ld_i32(TCGV_HIGH(ret), arg2, offset + 4);
867#endif
868}
869
870static inline void tcg_gen_st8_i64(TCGv_i64 arg1, TCGv_ptr arg2,
871 tcg_target_long offset)
872{
873 tcg_gen_st8_i32(TCGV_LOW(arg1), arg2, offset);
874}
875
876static inline void tcg_gen_st16_i64(TCGv_i64 arg1, TCGv_ptr arg2,
877 tcg_target_long offset)
878{
879 tcg_gen_st16_i32(TCGV_LOW(arg1), arg2, offset);
880}
881
882static inline void tcg_gen_st32_i64(TCGv_i64 arg1, TCGv_ptr arg2,
883 tcg_target_long offset)
884{
885 tcg_gen_st_i32(TCGV_LOW(arg1), arg2, offset);
886}
887
888static inline void tcg_gen_st_i64(TCGv_i64 arg1, TCGv_ptr arg2,
889 tcg_target_long offset)
890{
891#ifdef TCG_TARGET_WORDS_BIGENDIAN
892 tcg_gen_st_i32(TCGV_HIGH(arg1), arg2, offset);
893 tcg_gen_st_i32(TCGV_LOW(arg1), arg2, offset + 4);
894#else
895 tcg_gen_st_i32(TCGV_LOW(arg1), arg2, offset);
896 tcg_gen_st_i32(TCGV_HIGH(arg1), arg2, offset + 4);
897#endif
898}
899
900static inline void tcg_gen_add_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
901{
902 tcg_gen_op6_i32(INDEX_op_add2_i32, TCGV_LOW(ret), TCGV_HIGH(ret),
903 TCGV_LOW(arg1), TCGV_HIGH(arg1), TCGV_LOW(arg2),
904 TCGV_HIGH(arg2));
905
906 tcg_gen_op0(INDEX_op_nop);
907}
908
909static inline void tcg_gen_sub_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
910{
911 tcg_gen_op6_i32(INDEX_op_sub2_i32, TCGV_LOW(ret), TCGV_HIGH(ret),
912 TCGV_LOW(arg1), TCGV_HIGH(arg1), TCGV_LOW(arg2),
913 TCGV_HIGH(arg2));
914
915 tcg_gen_op0(INDEX_op_nop);
916}
917
918static inline void tcg_gen_and_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
919{
920 tcg_gen_and_i32(TCGV_LOW(ret), TCGV_LOW(arg1), TCGV_LOW(arg2));
921 tcg_gen_and_i32(TCGV_HIGH(ret), TCGV_HIGH(arg1), TCGV_HIGH(arg2));
922}
923
924static inline void tcg_gen_andi_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
925{
926 tcg_gen_andi_i32(TCGV_LOW(ret), TCGV_LOW(arg1), arg2);
927 tcg_gen_andi_i32(TCGV_HIGH(ret), TCGV_HIGH(arg1), arg2 >> 32);
928}
929
930static inline void tcg_gen_or_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
931{
932 tcg_gen_or_i32(TCGV_LOW(ret), TCGV_LOW(arg1), TCGV_LOW(arg2));
933 tcg_gen_or_i32(TCGV_HIGH(ret), TCGV_HIGH(arg1), TCGV_HIGH(arg2));
934}
935
936static inline void tcg_gen_ori_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
937{
938 tcg_gen_ori_i32(TCGV_LOW(ret), TCGV_LOW(arg1), arg2);
939 tcg_gen_ori_i32(TCGV_HIGH(ret), TCGV_HIGH(arg1), arg2 >> 32);
940}
941
942static inline void tcg_gen_xor_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
943{
944 tcg_gen_xor_i32(TCGV_LOW(ret), TCGV_LOW(arg1), TCGV_LOW(arg2));
945 tcg_gen_xor_i32(TCGV_HIGH(ret), TCGV_HIGH(arg1), TCGV_HIGH(arg2));
946}
947
948static inline void tcg_gen_xori_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
949{
950 tcg_gen_xori_i32(TCGV_LOW(ret), TCGV_LOW(arg1), arg2);
951 tcg_gen_xori_i32(TCGV_HIGH(ret), TCGV_HIGH(arg1), arg2 >> 32);
952}
953
954
955
956static inline void tcg_gen_shl_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
957{
958 int sizemask = 0;
959
960 sizemask |= tcg_gen_sizemask(0, 1, 1);
961 sizemask |= tcg_gen_sizemask(1, 1, 1);
962 sizemask |= tcg_gen_sizemask(2, 1, 1);
963
964 tcg_gen_helper64(tcg_helper_shl_i64, sizemask, ret, arg1, arg2);
965}
966
967static inline void tcg_gen_shli_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
968{
969 tcg_gen_shifti_i64(ret, arg1, arg2, 0, 0);
970}
971
972static inline void tcg_gen_shr_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
973{
974 int sizemask = 0;
975
976 sizemask |= tcg_gen_sizemask(0, 1, 1);
977 sizemask |= tcg_gen_sizemask(1, 1, 1);
978 sizemask |= tcg_gen_sizemask(2, 1, 1);
979
980 tcg_gen_helper64(tcg_helper_shr_i64, sizemask, ret, arg1, arg2);
981}
982
983static inline void tcg_gen_shri_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
984{
985 tcg_gen_shifti_i64(ret, arg1, arg2, 1, 0);
986}
987
988static inline void tcg_gen_sar_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
989{
990 int sizemask = 0;
991
992 sizemask |= tcg_gen_sizemask(0, 1, 1);
993 sizemask |= tcg_gen_sizemask(1, 1, 1);
994 sizemask |= tcg_gen_sizemask(2, 1, 1);
995
996 tcg_gen_helper64(tcg_helper_sar_i64, sizemask, ret, arg1, arg2);
997}
998
999static inline void tcg_gen_sari_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
1000{
1001 tcg_gen_shifti_i64(ret, arg1, arg2, 1, 1);
1002}
1003
1004static inline void tcg_gen_brcond_i64(TCGCond cond, TCGv_i64 arg1,
1005 TCGv_i64 arg2, int label_index)
1006{
1007 if (cond == TCG_COND_ALWAYS) {
1008 tcg_gen_br(label_index);
1009 } else if (cond != TCG_COND_NEVER) {
1010 tcg_gen_op6ii_i32(INDEX_op_brcond2_i32,
1011 TCGV_LOW(arg1), TCGV_HIGH(arg1), TCGV_LOW(arg2),
1012 TCGV_HIGH(arg2), cond, label_index);
1013 }
1014}
1015
1016static inline void tcg_gen_setcond_i64(TCGCond cond, TCGv_i64 ret,
1017 TCGv_i64 arg1, TCGv_i64 arg2)
1018{
1019 if (cond == TCG_COND_ALWAYS) {
1020 tcg_gen_movi_i32(TCGV_LOW(ret), 1);
1021 } else if (cond == TCG_COND_NEVER) {
1022 tcg_gen_movi_i32(TCGV_LOW(ret), 0);
1023 } else {
1024 tcg_gen_op6i_i32(INDEX_op_setcond2_i32, TCGV_LOW(ret),
1025 TCGV_LOW(arg1), TCGV_HIGH(arg1),
1026 TCGV_LOW(arg2), TCGV_HIGH(arg2), cond);
1027 }
1028 tcg_gen_movi_i32(TCGV_HIGH(ret), 0);
1029}
1030
1031static inline void tcg_gen_mul_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1032{
1033 TCGv_i64 t0;
1034 TCGv_i32 t1;
1035
1036 t0 = tcg_temp_new_i64();
1037 t1 = tcg_temp_new_i32();
1038
1039 if (TCG_TARGET_HAS_mulu2_i32) {
1040 tcg_gen_op4_i32(INDEX_op_mulu2_i32, TCGV_LOW(t0), TCGV_HIGH(t0),
1041 TCGV_LOW(arg1), TCGV_LOW(arg2));
1042
1043 tcg_gen_op0(INDEX_op_nop);
1044 } else {
1045 tcg_debug_assert(TCG_TARGET_HAS_muluh_i32);
1046 tcg_gen_op3_i32(INDEX_op_mul_i32, TCGV_LOW(t0),
1047 TCGV_LOW(arg1), TCGV_LOW(arg2));
1048 tcg_gen_op3_i32(INDEX_op_muluh_i32, TCGV_HIGH(t0),
1049 TCGV_LOW(arg1), TCGV_LOW(arg2));
1050 }
1051
1052 tcg_gen_mul_i32(t1, TCGV_LOW(arg1), TCGV_HIGH(arg2));
1053 tcg_gen_add_i32(TCGV_HIGH(t0), TCGV_HIGH(t0), t1);
1054 tcg_gen_mul_i32(t1, TCGV_HIGH(arg1), TCGV_LOW(arg2));
1055 tcg_gen_add_i32(TCGV_HIGH(t0), TCGV_HIGH(t0), t1);
1056
1057 tcg_gen_mov_i64(ret, t0);
1058 tcg_temp_free_i64(t0);
1059 tcg_temp_free_i32(t1);
1060}
1061
1062static inline void tcg_gen_div_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1063{
1064 int sizemask = 0;
1065
1066 sizemask |= tcg_gen_sizemask(0, 1, 1);
1067 sizemask |= tcg_gen_sizemask(1, 1, 1);
1068 sizemask |= tcg_gen_sizemask(2, 1, 1);
1069
1070 tcg_gen_helper64(tcg_helper_div_i64, sizemask, ret, arg1, arg2);
1071}
1072
1073static inline void tcg_gen_rem_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1074{
1075 int sizemask = 0;
1076
1077 sizemask |= tcg_gen_sizemask(0, 1, 1);
1078 sizemask |= tcg_gen_sizemask(1, 1, 1);
1079 sizemask |= tcg_gen_sizemask(2, 1, 1);
1080
1081 tcg_gen_helper64(tcg_helper_rem_i64, sizemask, ret, arg1, arg2);
1082}
1083
1084static inline void tcg_gen_divu_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1085{
1086 int sizemask = 0;
1087
1088 sizemask |= tcg_gen_sizemask(0, 1, 0);
1089 sizemask |= tcg_gen_sizemask(1, 1, 0);
1090 sizemask |= tcg_gen_sizemask(2, 1, 0);
1091
1092 tcg_gen_helper64(tcg_helper_divu_i64, sizemask, ret, arg1, arg2);
1093}
1094
1095static inline void tcg_gen_remu_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1096{
1097 int sizemask = 0;
1098
1099 sizemask |= tcg_gen_sizemask(0, 1, 0);
1100 sizemask |= tcg_gen_sizemask(1, 1, 0);
1101 sizemask |= tcg_gen_sizemask(2, 1, 0);
1102
1103 tcg_gen_helper64(tcg_helper_remu_i64, sizemask, ret, arg1, arg2);
1104}
1105
1106#else
1107
1108static inline void tcg_gen_mov_i64(TCGv_i64 ret, TCGv_i64 arg)
1109{
1110 if (!TCGV_EQUAL_I64(ret, arg))
1111 tcg_gen_op2_i64(INDEX_op_mov_i64, ret, arg);
1112}
1113
1114static inline void tcg_gen_movi_i64(TCGv_i64 ret, int64_t arg)
1115{
1116 tcg_gen_op2i_i64(INDEX_op_movi_i64, ret, arg);
1117}
1118
1119static inline void tcg_gen_ld8u_i64(TCGv_i64 ret, TCGv_ptr arg2,
1120 tcg_target_long offset)
1121{
1122 tcg_gen_ldst_op_i64(INDEX_op_ld8u_i64, ret, arg2, offset);
1123}
1124
1125static inline void tcg_gen_ld8s_i64(TCGv_i64 ret, TCGv_ptr arg2,
1126 tcg_target_long offset)
1127{
1128 tcg_gen_ldst_op_i64(INDEX_op_ld8s_i64, ret, arg2, offset);
1129}
1130
1131static inline void tcg_gen_ld16u_i64(TCGv_i64 ret, TCGv_ptr arg2,
1132 tcg_target_long offset)
1133{
1134 tcg_gen_ldst_op_i64(INDEX_op_ld16u_i64, ret, arg2, offset);
1135}
1136
1137static inline void tcg_gen_ld16s_i64(TCGv_i64 ret, TCGv_ptr arg2,
1138 tcg_target_long offset)
1139{
1140 tcg_gen_ldst_op_i64(INDEX_op_ld16s_i64, ret, arg2, offset);
1141}
1142
1143static inline void tcg_gen_ld32u_i64(TCGv_i64 ret, TCGv_ptr arg2,
1144 tcg_target_long offset)
1145{
1146 tcg_gen_ldst_op_i64(INDEX_op_ld32u_i64, ret, arg2, offset);
1147}
1148
1149static inline void tcg_gen_ld32s_i64(TCGv_i64 ret, TCGv_ptr arg2,
1150 tcg_target_long offset)
1151{
1152 tcg_gen_ldst_op_i64(INDEX_op_ld32s_i64, ret, arg2, offset);
1153}
1154
1155static inline void tcg_gen_ld_i64(TCGv_i64 ret, TCGv_ptr arg2, tcg_target_long offset)
1156{
1157 tcg_gen_ldst_op_i64(INDEX_op_ld_i64, ret, arg2, offset);
1158}
1159
1160static inline void tcg_gen_st8_i64(TCGv_i64 arg1, TCGv_ptr arg2,
1161 tcg_target_long offset)
1162{
1163 tcg_gen_ldst_op_i64(INDEX_op_st8_i64, arg1, arg2, offset);
1164}
1165
1166static inline void tcg_gen_st16_i64(TCGv_i64 arg1, TCGv_ptr arg2,
1167 tcg_target_long offset)
1168{
1169 tcg_gen_ldst_op_i64(INDEX_op_st16_i64, arg1, arg2, offset);
1170}
1171
1172static inline void tcg_gen_st32_i64(TCGv_i64 arg1, TCGv_ptr arg2,
1173 tcg_target_long offset)
1174{
1175 tcg_gen_ldst_op_i64(INDEX_op_st32_i64, arg1, arg2, offset);
1176}
1177
1178static inline void tcg_gen_st_i64(TCGv_i64 arg1, TCGv_ptr arg2, tcg_target_long offset)
1179{
1180 tcg_gen_ldst_op_i64(INDEX_op_st_i64, arg1, arg2, offset);
1181}
1182
1183static inline void tcg_gen_add_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1184{
1185 tcg_gen_op3_i64(INDEX_op_add_i64, ret, arg1, arg2);
1186}
1187
1188static inline void tcg_gen_sub_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1189{
1190 tcg_gen_op3_i64(INDEX_op_sub_i64, ret, arg1, arg2);
1191}
1192
1193static inline void tcg_gen_and_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1194{
1195 if (TCGV_EQUAL_I64(arg1, arg2)) {
1196 tcg_gen_mov_i64(ret, arg1);
1197 } else {
1198 tcg_gen_op3_i64(INDEX_op_and_i64, ret, arg1, arg2);
1199 }
1200}
1201
1202static inline void tcg_gen_andi_i64(TCGv_i64 ret, TCGv_i64 arg1, uint64_t arg2)
1203{
1204 TCGv_i64 t0;
1205
1206 switch (arg2) {
1207 case 0:
1208 tcg_gen_movi_i64(ret, 0);
1209 return;
1210 case 0xffffffffffffffffull:
1211 tcg_gen_mov_i64(ret, arg1);
1212 return;
1213 case 0xffull:
1214
1215 if (TCG_TARGET_HAS_ext8u_i64) {
1216 tcg_gen_op2_i64(INDEX_op_ext8u_i64, ret, arg1);
1217 return;
1218 }
1219 break;
1220 case 0xffffu:
1221 if (TCG_TARGET_HAS_ext16u_i64) {
1222 tcg_gen_op2_i64(INDEX_op_ext16u_i64, ret, arg1);
1223 return;
1224 }
1225 break;
1226 case 0xffffffffull:
1227 if (TCG_TARGET_HAS_ext32u_i64) {
1228 tcg_gen_op2_i64(INDEX_op_ext32u_i64, ret, arg1);
1229 return;
1230 }
1231 break;
1232 }
1233 t0 = tcg_const_i64(arg2);
1234 tcg_gen_and_i64(ret, arg1, t0);
1235 tcg_temp_free_i64(t0);
1236}
1237
1238static inline void tcg_gen_or_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1239{
1240 if (TCGV_EQUAL_I64(arg1, arg2)) {
1241 tcg_gen_mov_i64(ret, arg1);
1242 } else {
1243 tcg_gen_op3_i64(INDEX_op_or_i64, ret, arg1, arg2);
1244 }
1245}
1246
1247static inline void tcg_gen_ori_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
1248{
1249
1250 if (arg2 == -1) {
1251 tcg_gen_movi_i64(ret, -1);
1252 } else if (arg2 == 0) {
1253 tcg_gen_mov_i64(ret, arg1);
1254 } else {
1255 TCGv_i64 t0 = tcg_const_i64(arg2);
1256 tcg_gen_or_i64(ret, arg1, t0);
1257 tcg_temp_free_i64(t0);
1258 }
1259}
1260
1261static inline void tcg_gen_xor_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1262{
1263 if (TCGV_EQUAL_I64(arg1, arg2)) {
1264 tcg_gen_movi_i64(ret, 0);
1265 } else {
1266 tcg_gen_op3_i64(INDEX_op_xor_i64, ret, arg1, arg2);
1267 }
1268}
1269
1270static inline void tcg_gen_xori_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
1271{
1272
1273 if (arg2 == 0) {
1274 tcg_gen_mov_i64(ret, arg1);
1275 } else if (arg2 == -1 && TCG_TARGET_HAS_not_i64) {
1276
1277 tcg_gen_op2_i64(INDEX_op_not_i64, ret, arg1);
1278 } else {
1279 TCGv_i64 t0 = tcg_const_i64(arg2);
1280 tcg_gen_xor_i64(ret, arg1, t0);
1281 tcg_temp_free_i64(t0);
1282 }
1283}
1284
1285static inline void tcg_gen_shl_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1286{
1287 tcg_gen_op3_i64(INDEX_op_shl_i64, ret, arg1, arg2);
1288}
1289
1290static inline void tcg_gen_shli_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
1291{
1292 if (arg2 == 0) {
1293 tcg_gen_mov_i64(ret, arg1);
1294 } else {
1295 TCGv_i64 t0 = tcg_const_i64(arg2);
1296 tcg_gen_shl_i64(ret, arg1, t0);
1297 tcg_temp_free_i64(t0);
1298 }
1299}
1300
1301static inline void tcg_gen_shr_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1302{
1303 tcg_gen_op3_i64(INDEX_op_shr_i64, ret, arg1, arg2);
1304}
1305
1306static inline void tcg_gen_shri_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
1307{
1308 if (arg2 == 0) {
1309 tcg_gen_mov_i64(ret, arg1);
1310 } else {
1311 TCGv_i64 t0 = tcg_const_i64(arg2);
1312 tcg_gen_shr_i64(ret, arg1, t0);
1313 tcg_temp_free_i64(t0);
1314 }
1315}
1316
1317static inline void tcg_gen_sar_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1318{
1319 tcg_gen_op3_i64(INDEX_op_sar_i64, ret, arg1, arg2);
1320}
1321
1322static inline void tcg_gen_sari_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
1323{
1324 if (arg2 == 0) {
1325 tcg_gen_mov_i64(ret, arg1);
1326 } else {
1327 TCGv_i64 t0 = tcg_const_i64(arg2);
1328 tcg_gen_sar_i64(ret, arg1, t0);
1329 tcg_temp_free_i64(t0);
1330 }
1331}
1332
1333static inline void tcg_gen_brcond_i64(TCGCond cond, TCGv_i64 arg1,
1334 TCGv_i64 arg2, int label_index)
1335{
1336 if (cond == TCG_COND_ALWAYS) {
1337 tcg_gen_br(label_index);
1338 } else if (cond != TCG_COND_NEVER) {
1339 tcg_gen_op4ii_i64(INDEX_op_brcond_i64, arg1, arg2, cond, label_index);
1340 }
1341}
1342
1343static inline void tcg_gen_setcond_i64(TCGCond cond, TCGv_i64 ret,
1344 TCGv_i64 arg1, TCGv_i64 arg2)
1345{
1346 if (cond == TCG_COND_ALWAYS) {
1347 tcg_gen_movi_i64(ret, 1);
1348 } else if (cond == TCG_COND_NEVER) {
1349 tcg_gen_movi_i64(ret, 0);
1350 } else {
1351 tcg_gen_op4i_i64(INDEX_op_setcond_i64, ret, arg1, arg2, cond);
1352 }
1353}
1354
1355static inline void tcg_gen_mul_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1356{
1357 tcg_gen_op3_i64(INDEX_op_mul_i64, ret, arg1, arg2);
1358}
1359
1360static inline void tcg_gen_div_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1361{
1362 if (TCG_TARGET_HAS_div_i64) {
1363 tcg_gen_op3_i64(INDEX_op_div_i64, ret, arg1, arg2);
1364 } else if (TCG_TARGET_HAS_div2_i64) {
1365 TCGv_i64 t0 = tcg_temp_new_i64();
1366 tcg_gen_sari_i64(t0, arg1, 63);
1367 tcg_gen_op5_i64(INDEX_op_div2_i64, ret, t0, arg1, t0, arg2);
1368 tcg_temp_free_i64(t0);
1369 } else {
1370 int sizemask = 0;
1371
1372 sizemask |= tcg_gen_sizemask(0, 1, 1);
1373 sizemask |= tcg_gen_sizemask(1, 1, 1);
1374 sizemask |= tcg_gen_sizemask(2, 1, 1);
1375 tcg_gen_helper64(tcg_helper_div_i64, sizemask, ret, arg1, arg2);
1376 }
1377}
1378
1379static inline void tcg_gen_rem_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1380{
1381 if (TCG_TARGET_HAS_rem_i64) {
1382 tcg_gen_op3_i64(INDEX_op_rem_i64, ret, arg1, arg2);
1383 } else if (TCG_TARGET_HAS_div_i64) {
1384 TCGv_i64 t0 = tcg_temp_new_i64();
1385 tcg_gen_op3_i64(INDEX_op_div_i64, t0, arg1, arg2);
1386 tcg_gen_mul_i64(t0, t0, arg2);
1387 tcg_gen_sub_i64(ret, arg1, t0);
1388 tcg_temp_free_i64(t0);
1389 } else if (TCG_TARGET_HAS_div2_i64) {
1390 TCGv_i64 t0 = tcg_temp_new_i64();
1391 tcg_gen_sari_i64(t0, arg1, 63);
1392 tcg_gen_op5_i64(INDEX_op_div2_i64, t0, ret, arg1, t0, arg2);
1393 tcg_temp_free_i64(t0);
1394 } else {
1395 int sizemask = 0;
1396
1397 sizemask |= tcg_gen_sizemask(0, 1, 1);
1398 sizemask |= tcg_gen_sizemask(1, 1, 1);
1399 sizemask |= tcg_gen_sizemask(2, 1, 1);
1400 tcg_gen_helper64(tcg_helper_rem_i64, sizemask, ret, arg1, arg2);
1401 }
1402}
1403
1404static inline void tcg_gen_divu_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1405{
1406 if (TCG_TARGET_HAS_div_i64) {
1407 tcg_gen_op3_i64(INDEX_op_divu_i64, ret, arg1, arg2);
1408 } else if (TCG_TARGET_HAS_div2_i64) {
1409 TCGv_i64 t0 = tcg_temp_new_i64();
1410 tcg_gen_movi_i64(t0, 0);
1411 tcg_gen_op5_i64(INDEX_op_divu2_i64, ret, t0, arg1, t0, arg2);
1412 tcg_temp_free_i64(t0);
1413 } else {
1414 int sizemask = 0;
1415
1416 sizemask |= tcg_gen_sizemask(0, 1, 0);
1417 sizemask |= tcg_gen_sizemask(1, 1, 0);
1418 sizemask |= tcg_gen_sizemask(2, 1, 0);
1419 tcg_gen_helper64(tcg_helper_divu_i64, sizemask, ret, arg1, arg2);
1420 }
1421}
1422
1423static inline void tcg_gen_remu_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1424{
1425 if (TCG_TARGET_HAS_rem_i64) {
1426 tcg_gen_op3_i64(INDEX_op_remu_i64, ret, arg1, arg2);
1427 } else if (TCG_TARGET_HAS_div_i64) {
1428 TCGv_i64 t0 = tcg_temp_new_i64();
1429 tcg_gen_op3_i64(INDEX_op_divu_i64, t0, arg1, arg2);
1430 tcg_gen_mul_i64(t0, t0, arg2);
1431 tcg_gen_sub_i64(ret, arg1, t0);
1432 tcg_temp_free_i64(t0);
1433 } else if (TCG_TARGET_HAS_div2_i64) {
1434 TCGv_i64 t0 = tcg_temp_new_i64();
1435 tcg_gen_movi_i64(t0, 0);
1436 tcg_gen_op5_i64(INDEX_op_divu2_i64, t0, ret, arg1, t0, arg2);
1437 tcg_temp_free_i64(t0);
1438 } else {
1439 int sizemask = 0;
1440
1441 sizemask |= tcg_gen_sizemask(0, 1, 0);
1442 sizemask |= tcg_gen_sizemask(1, 1, 0);
1443 sizemask |= tcg_gen_sizemask(2, 1, 0);
1444 tcg_gen_helper64(tcg_helper_remu_i64, sizemask, ret, arg1, arg2);
1445 }
1446}
1447#endif
1448
1449static inline void tcg_gen_addi_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
1450{
1451
1452 if (arg2 == 0) {
1453 tcg_gen_mov_i64(ret, arg1);
1454 } else {
1455 TCGv_i64 t0 = tcg_const_i64(arg2);
1456 tcg_gen_add_i64(ret, arg1, t0);
1457 tcg_temp_free_i64(t0);
1458 }
1459}
1460
1461static inline void tcg_gen_subfi_i64(TCGv_i64 ret, int64_t arg1, TCGv_i64 arg2)
1462{
1463 TCGv_i64 t0 = tcg_const_i64(arg1);
1464 tcg_gen_sub_i64(ret, t0, arg2);
1465 tcg_temp_free_i64(t0);
1466}
1467
1468static inline void tcg_gen_subi_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
1469{
1470
1471 if (arg2 == 0) {
1472 tcg_gen_mov_i64(ret, arg1);
1473 } else {
1474 TCGv_i64 t0 = tcg_const_i64(arg2);
1475 tcg_gen_sub_i64(ret, arg1, t0);
1476 tcg_temp_free_i64(t0);
1477 }
1478}
1479static inline void tcg_gen_brcondi_i64(TCGCond cond, TCGv_i64 arg1,
1480 int64_t arg2, int label_index)
1481{
1482 if (cond == TCG_COND_ALWAYS) {
1483 tcg_gen_br(label_index);
1484 } else if (cond != TCG_COND_NEVER) {
1485 TCGv_i64 t0 = tcg_const_i64(arg2);
1486 tcg_gen_brcond_i64(cond, arg1, t0, label_index);
1487 tcg_temp_free_i64(t0);
1488 }
1489}
1490
1491static inline void tcg_gen_setcondi_i64(TCGCond cond, TCGv_i64 ret,
1492 TCGv_i64 arg1, int64_t arg2)
1493{
1494 TCGv_i64 t0 = tcg_const_i64(arg2);
1495 tcg_gen_setcond_i64(cond, ret, arg1, t0);
1496 tcg_temp_free_i64(t0);
1497}
1498
1499static inline void tcg_gen_muli_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
1500{
1501 TCGv_i64 t0 = tcg_const_i64(arg2);
1502 tcg_gen_mul_i64(ret, arg1, t0);
1503 tcg_temp_free_i64(t0);
1504}
1505
1506
1507
1508
1509
1510static inline void tcg_gen_ext8s_i32(TCGv_i32 ret, TCGv_i32 arg)
1511{
1512 if (TCG_TARGET_HAS_ext8s_i32) {
1513 tcg_gen_op2_i32(INDEX_op_ext8s_i32, ret, arg);
1514 } else {
1515 tcg_gen_shli_i32(ret, arg, 24);
1516 tcg_gen_sari_i32(ret, ret, 24);
1517 }
1518}
1519
1520static inline void tcg_gen_ext16s_i32(TCGv_i32 ret, TCGv_i32 arg)
1521{
1522 if (TCG_TARGET_HAS_ext16s_i32) {
1523 tcg_gen_op2_i32(INDEX_op_ext16s_i32, ret, arg);
1524 } else {
1525 tcg_gen_shli_i32(ret, arg, 16);
1526 tcg_gen_sari_i32(ret, ret, 16);
1527 }
1528}
1529
1530static inline void tcg_gen_ext8u_i32(TCGv_i32 ret, TCGv_i32 arg)
1531{
1532 if (TCG_TARGET_HAS_ext8u_i32) {
1533 tcg_gen_op2_i32(INDEX_op_ext8u_i32, ret, arg);
1534 } else {
1535 tcg_gen_andi_i32(ret, arg, 0xffu);
1536 }
1537}
1538
1539static inline void tcg_gen_ext16u_i32(TCGv_i32 ret, TCGv_i32 arg)
1540{
1541 if (TCG_TARGET_HAS_ext16u_i32) {
1542 tcg_gen_op2_i32(INDEX_op_ext16u_i32, ret, arg);
1543 } else {
1544 tcg_gen_andi_i32(ret, arg, 0xffffu);
1545 }
1546}
1547
1548
1549static inline void tcg_gen_bswap16_i32(TCGv_i32 ret, TCGv_i32 arg)
1550{
1551 if (TCG_TARGET_HAS_bswap16_i32) {
1552 tcg_gen_op2_i32(INDEX_op_bswap16_i32, ret, arg);
1553 } else {
1554 TCGv_i32 t0 = tcg_temp_new_i32();
1555
1556 tcg_gen_ext8u_i32(t0, arg);
1557 tcg_gen_shli_i32(t0, t0, 8);
1558 tcg_gen_shri_i32(ret, arg, 8);
1559 tcg_gen_or_i32(ret, ret, t0);
1560 tcg_temp_free_i32(t0);
1561 }
1562}
1563
1564static inline void tcg_gen_bswap32_i32(TCGv_i32 ret, TCGv_i32 arg)
1565{
1566 if (TCG_TARGET_HAS_bswap32_i32) {
1567 tcg_gen_op2_i32(INDEX_op_bswap32_i32, ret, arg);
1568 } else {
1569 TCGv_i32 t0, t1;
1570 t0 = tcg_temp_new_i32();
1571 t1 = tcg_temp_new_i32();
1572
1573 tcg_gen_shli_i32(t0, arg, 24);
1574
1575 tcg_gen_andi_i32(t1, arg, 0x0000ff00);
1576 tcg_gen_shli_i32(t1, t1, 8);
1577 tcg_gen_or_i32(t0, t0, t1);
1578
1579 tcg_gen_shri_i32(t1, arg, 8);
1580 tcg_gen_andi_i32(t1, t1, 0x0000ff00);
1581 tcg_gen_or_i32(t0, t0, t1);
1582
1583 tcg_gen_shri_i32(t1, arg, 24);
1584 tcg_gen_or_i32(ret, t0, t1);
1585 tcg_temp_free_i32(t0);
1586 tcg_temp_free_i32(t1);
1587 }
1588}
1589
1590#if TCG_TARGET_REG_BITS == 32
1591static inline void tcg_gen_ext8s_i64(TCGv_i64 ret, TCGv_i64 arg)
1592{
1593 tcg_gen_ext8s_i32(TCGV_LOW(ret), TCGV_LOW(arg));
1594 tcg_gen_sari_i32(TCGV_HIGH(ret), TCGV_LOW(ret), 31);
1595}
1596
1597static inline void tcg_gen_ext16s_i64(TCGv_i64 ret, TCGv_i64 arg)
1598{
1599 tcg_gen_ext16s_i32(TCGV_LOW(ret), TCGV_LOW(arg));
1600 tcg_gen_sari_i32(TCGV_HIGH(ret), TCGV_LOW(ret), 31);
1601}
1602
1603static inline void tcg_gen_ext32s_i64(TCGv_i64 ret, TCGv_i64 arg)
1604{
1605 tcg_gen_mov_i32(TCGV_LOW(ret), TCGV_LOW(arg));
1606 tcg_gen_sari_i32(TCGV_HIGH(ret), TCGV_LOW(ret), 31);
1607}
1608
1609static inline void tcg_gen_ext8u_i64(TCGv_i64 ret, TCGv_i64 arg)
1610{
1611 tcg_gen_ext8u_i32(TCGV_LOW(ret), TCGV_LOW(arg));
1612 tcg_gen_movi_i32(TCGV_HIGH(ret), 0);
1613}
1614
1615static inline void tcg_gen_ext16u_i64(TCGv_i64 ret, TCGv_i64 arg)
1616{
1617 tcg_gen_ext16u_i32(TCGV_LOW(ret), TCGV_LOW(arg));
1618 tcg_gen_movi_i32(TCGV_HIGH(ret), 0);
1619}
1620
1621static inline void tcg_gen_ext32u_i64(TCGv_i64 ret, TCGv_i64 arg)
1622{
1623 tcg_gen_mov_i32(TCGV_LOW(ret), TCGV_LOW(arg));
1624 tcg_gen_movi_i32(TCGV_HIGH(ret), 0);
1625}
1626
1627static inline void tcg_gen_trunc_i64_i32(TCGv_i32 ret, TCGv_i64 arg)
1628{
1629 tcg_gen_mov_i32(ret, TCGV_LOW(arg));
1630}
1631
1632static inline void tcg_gen_extu_i32_i64(TCGv_i64 ret, TCGv_i32 arg)
1633{
1634 tcg_gen_mov_i32(TCGV_LOW(ret), arg);
1635 tcg_gen_movi_i32(TCGV_HIGH(ret), 0);
1636}
1637
1638static inline void tcg_gen_ext_i32_i64(TCGv_i64 ret, TCGv_i32 arg)
1639{
1640 tcg_gen_mov_i32(TCGV_LOW(ret), arg);
1641 tcg_gen_sari_i32(TCGV_HIGH(ret), TCGV_LOW(ret), 31);
1642}
1643
1644
1645static inline void tcg_gen_bswap16_i64(TCGv_i64 ret, TCGv_i64 arg)
1646{
1647 tcg_gen_mov_i32(TCGV_HIGH(ret), TCGV_HIGH(arg));
1648 tcg_gen_bswap16_i32(TCGV_LOW(ret), TCGV_LOW(arg));
1649}
1650
1651
1652static inline void tcg_gen_bswap32_i64(TCGv_i64 ret, TCGv_i64 arg)
1653{
1654 tcg_gen_mov_i32(TCGV_HIGH(ret), TCGV_HIGH(arg));
1655 tcg_gen_bswap32_i32(TCGV_LOW(ret), TCGV_LOW(arg));
1656}
1657
1658static inline void tcg_gen_bswap64_i64(TCGv_i64 ret, TCGv_i64 arg)
1659{
1660 TCGv_i32 t0, t1;
1661 t0 = tcg_temp_new_i32();
1662 t1 = tcg_temp_new_i32();
1663
1664 tcg_gen_bswap32_i32(t0, TCGV_LOW(arg));
1665 tcg_gen_bswap32_i32(t1, TCGV_HIGH(arg));
1666 tcg_gen_mov_i32(TCGV_LOW(ret), t1);
1667 tcg_gen_mov_i32(TCGV_HIGH(ret), t0);
1668 tcg_temp_free_i32(t0);
1669 tcg_temp_free_i32(t1);
1670}
1671#else
1672
1673static inline void tcg_gen_ext8s_i64(TCGv_i64 ret, TCGv_i64 arg)
1674{
1675 if (TCG_TARGET_HAS_ext8s_i64) {
1676 tcg_gen_op2_i64(INDEX_op_ext8s_i64, ret, arg);
1677 } else {
1678 tcg_gen_shli_i64(ret, arg, 56);
1679 tcg_gen_sari_i64(ret, ret, 56);
1680 }
1681}
1682
1683static inline void tcg_gen_ext16s_i64(TCGv_i64 ret, TCGv_i64 arg)
1684{
1685 if (TCG_TARGET_HAS_ext16s_i64) {
1686 tcg_gen_op2_i64(INDEX_op_ext16s_i64, ret, arg);
1687 } else {
1688 tcg_gen_shli_i64(ret, arg, 48);
1689 tcg_gen_sari_i64(ret, ret, 48);
1690 }
1691}
1692
1693static inline void tcg_gen_ext32s_i64(TCGv_i64 ret, TCGv_i64 arg)
1694{
1695 if (TCG_TARGET_HAS_ext32s_i64) {
1696 tcg_gen_op2_i64(INDEX_op_ext32s_i64, ret, arg);
1697 } else {
1698 tcg_gen_shli_i64(ret, arg, 32);
1699 tcg_gen_sari_i64(ret, ret, 32);
1700 }
1701}
1702
1703static inline void tcg_gen_ext8u_i64(TCGv_i64 ret, TCGv_i64 arg)
1704{
1705 if (TCG_TARGET_HAS_ext8u_i64) {
1706 tcg_gen_op2_i64(INDEX_op_ext8u_i64, ret, arg);
1707 } else {
1708 tcg_gen_andi_i64(ret, arg, 0xffu);
1709 }
1710}
1711
1712static inline void tcg_gen_ext16u_i64(TCGv_i64 ret, TCGv_i64 arg)
1713{
1714 if (TCG_TARGET_HAS_ext16u_i64) {
1715 tcg_gen_op2_i64(INDEX_op_ext16u_i64, ret, arg);
1716 } else {
1717 tcg_gen_andi_i64(ret, arg, 0xffffu);
1718 }
1719}
1720
1721static inline void tcg_gen_ext32u_i64(TCGv_i64 ret, TCGv_i64 arg)
1722{
1723 if (TCG_TARGET_HAS_ext32u_i64) {
1724 tcg_gen_op2_i64(INDEX_op_ext32u_i64, ret, arg);
1725 } else {
1726 tcg_gen_andi_i64(ret, arg, 0xffffffffu);
1727 }
1728}
1729
1730
1731
1732static inline void tcg_gen_trunc_i64_i32(TCGv_i32 ret, TCGv_i64 arg)
1733{
1734 tcg_gen_mov_i32(ret, MAKE_TCGV_I32(GET_TCGV_I64(arg)));
1735}
1736
1737
1738
1739static inline void tcg_gen_extu_i32_i64(TCGv_i64 ret, TCGv_i32 arg)
1740{
1741 tcg_gen_ext32u_i64(ret, MAKE_TCGV_I64(GET_TCGV_I32(arg)));
1742}
1743
1744
1745
1746static inline void tcg_gen_ext_i32_i64(TCGv_i64 ret, TCGv_i32 arg)
1747{
1748 tcg_gen_ext32s_i64(ret, MAKE_TCGV_I64(GET_TCGV_I32(arg)));
1749}
1750
1751
1752static inline void tcg_gen_bswap16_i64(TCGv_i64 ret, TCGv_i64 arg)
1753{
1754 if (TCG_TARGET_HAS_bswap16_i64) {
1755 tcg_gen_op2_i64(INDEX_op_bswap16_i64, ret, arg);
1756 } else {
1757 TCGv_i64 t0 = tcg_temp_new_i64();
1758
1759 tcg_gen_ext8u_i64(t0, arg);
1760 tcg_gen_shli_i64(t0, t0, 8);
1761 tcg_gen_shri_i64(ret, arg, 8);
1762 tcg_gen_or_i64(ret, ret, t0);
1763 tcg_temp_free_i64(t0);
1764 }
1765}
1766
1767
1768static inline void tcg_gen_bswap32_i64(TCGv_i64 ret, TCGv_i64 arg)
1769{
1770 if (TCG_TARGET_HAS_bswap32_i64) {
1771 tcg_gen_op2_i64(INDEX_op_bswap32_i64, ret, arg);
1772 } else {
1773 TCGv_i64 t0, t1;
1774 t0 = tcg_temp_new_i64();
1775 t1 = tcg_temp_new_i64();
1776
1777 tcg_gen_shli_i64(t0, arg, 24);
1778 tcg_gen_ext32u_i64(t0, t0);
1779
1780 tcg_gen_andi_i64(t1, arg, 0x0000ff00);
1781 tcg_gen_shli_i64(t1, t1, 8);
1782 tcg_gen_or_i64(t0, t0, t1);
1783
1784 tcg_gen_shri_i64(t1, arg, 8);
1785 tcg_gen_andi_i64(t1, t1, 0x0000ff00);
1786 tcg_gen_or_i64(t0, t0, t1);
1787
1788 tcg_gen_shri_i64(t1, arg, 24);
1789 tcg_gen_or_i64(ret, t0, t1);
1790 tcg_temp_free_i64(t0);
1791 tcg_temp_free_i64(t1);
1792 }
1793}
1794
1795static inline void tcg_gen_bswap64_i64(TCGv_i64 ret, TCGv_i64 arg)
1796{
1797 if (TCG_TARGET_HAS_bswap64_i64) {
1798 tcg_gen_op2_i64(INDEX_op_bswap64_i64, ret, arg);
1799 } else {
1800 TCGv_i64 t0 = tcg_temp_new_i64();
1801 TCGv_i64 t1 = tcg_temp_new_i64();
1802
1803 tcg_gen_shli_i64(t0, arg, 56);
1804
1805 tcg_gen_andi_i64(t1, arg, 0x0000ff00);
1806 tcg_gen_shli_i64(t1, t1, 40);
1807 tcg_gen_or_i64(t0, t0, t1);
1808
1809 tcg_gen_andi_i64(t1, arg, 0x00ff0000);
1810 tcg_gen_shli_i64(t1, t1, 24);
1811 tcg_gen_or_i64(t0, t0, t1);
1812
1813 tcg_gen_andi_i64(t1, arg, 0xff000000);
1814 tcg_gen_shli_i64(t1, t1, 8);
1815 tcg_gen_or_i64(t0, t0, t1);
1816
1817 tcg_gen_shri_i64(t1, arg, 8);
1818 tcg_gen_andi_i64(t1, t1, 0xff000000);
1819 tcg_gen_or_i64(t0, t0, t1);
1820
1821 tcg_gen_shri_i64(t1, arg, 24);
1822 tcg_gen_andi_i64(t1, t1, 0x00ff0000);
1823 tcg_gen_or_i64(t0, t0, t1);
1824
1825 tcg_gen_shri_i64(t1, arg, 40);
1826 tcg_gen_andi_i64(t1, t1, 0x0000ff00);
1827 tcg_gen_or_i64(t0, t0, t1);
1828
1829 tcg_gen_shri_i64(t1, arg, 56);
1830 tcg_gen_or_i64(ret, t0, t1);
1831 tcg_temp_free_i64(t0);
1832 tcg_temp_free_i64(t1);
1833 }
1834}
1835
1836#endif
1837
1838static inline void tcg_gen_neg_i32(TCGv_i32 ret, TCGv_i32 arg)
1839{
1840 if (TCG_TARGET_HAS_neg_i32) {
1841 tcg_gen_op2_i32(INDEX_op_neg_i32, ret, arg);
1842 } else {
1843 TCGv_i32 t0 = tcg_const_i32(0);
1844 tcg_gen_sub_i32(ret, t0, arg);
1845 tcg_temp_free_i32(t0);
1846 }
1847}
1848
1849static inline void tcg_gen_neg_i64(TCGv_i64 ret, TCGv_i64 arg)
1850{
1851 if (TCG_TARGET_HAS_neg_i64) {
1852 tcg_gen_op2_i64(INDEX_op_neg_i64, ret, arg);
1853 } else {
1854 TCGv_i64 t0 = tcg_const_i64(0);
1855 tcg_gen_sub_i64(ret, t0, arg);
1856 tcg_temp_free_i64(t0);
1857 }
1858}
1859
1860static inline void tcg_gen_not_i32(TCGv_i32 ret, TCGv_i32 arg)
1861{
1862 if (TCG_TARGET_HAS_not_i32) {
1863 tcg_gen_op2_i32(INDEX_op_not_i32, ret, arg);
1864 } else {
1865 tcg_gen_xori_i32(ret, arg, -1);
1866 }
1867}
1868
1869static inline void tcg_gen_not_i64(TCGv_i64 ret, TCGv_i64 arg)
1870{
1871#if TCG_TARGET_REG_BITS == 64
1872 if (TCG_TARGET_HAS_not_i64) {
1873 tcg_gen_op2_i64(INDEX_op_not_i64, ret, arg);
1874 } else {
1875 tcg_gen_xori_i64(ret, arg, -1);
1876 }
1877#else
1878 tcg_gen_not_i32(TCGV_LOW(ret), TCGV_LOW(arg));
1879 tcg_gen_not_i32(TCGV_HIGH(ret), TCGV_HIGH(arg));
1880#endif
1881}
1882
1883static inline void tcg_gen_discard_i32(TCGv_i32 arg)
1884{
1885 tcg_gen_op1_i32(INDEX_op_discard, arg);
1886}
1887
1888static inline void tcg_gen_discard_i64(TCGv_i64 arg)
1889{
1890#if TCG_TARGET_REG_BITS == 32
1891 tcg_gen_discard_i32(TCGV_LOW(arg));
1892 tcg_gen_discard_i32(TCGV_HIGH(arg));
1893#else
1894 tcg_gen_op1_i64(INDEX_op_discard, arg);
1895#endif
1896}
1897
1898static inline void tcg_gen_andc_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
1899{
1900 if (TCG_TARGET_HAS_andc_i32) {
1901 tcg_gen_op3_i32(INDEX_op_andc_i32, ret, arg1, arg2);
1902 } else {
1903 TCGv_i32 t0 = tcg_temp_new_i32();
1904 tcg_gen_not_i32(t0, arg2);
1905 tcg_gen_and_i32(ret, arg1, t0);
1906 tcg_temp_free_i32(t0);
1907 }
1908}
1909
1910static inline void tcg_gen_andc_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1911{
1912#if TCG_TARGET_REG_BITS == 64
1913 if (TCG_TARGET_HAS_andc_i64) {
1914 tcg_gen_op3_i64(INDEX_op_andc_i64, ret, arg1, arg2);
1915 } else {
1916 TCGv_i64 t0 = tcg_temp_new_i64();
1917 tcg_gen_not_i64(t0, arg2);
1918 tcg_gen_and_i64(ret, arg1, t0);
1919 tcg_temp_free_i64(t0);
1920 }
1921#else
1922 tcg_gen_andc_i32(TCGV_LOW(ret), TCGV_LOW(arg1), TCGV_LOW(arg2));
1923 tcg_gen_andc_i32(TCGV_HIGH(ret), TCGV_HIGH(arg1), TCGV_HIGH(arg2));
1924#endif
1925}
1926
1927static inline void tcg_gen_eqv_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
1928{
1929 if (TCG_TARGET_HAS_eqv_i32) {
1930 tcg_gen_op3_i32(INDEX_op_eqv_i32, ret, arg1, arg2);
1931 } else {
1932 tcg_gen_xor_i32(ret, arg1, arg2);
1933 tcg_gen_not_i32(ret, ret);
1934 }
1935}
1936
1937static inline void tcg_gen_eqv_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1938{
1939#if TCG_TARGET_REG_BITS == 64
1940 if (TCG_TARGET_HAS_eqv_i64) {
1941 tcg_gen_op3_i64(INDEX_op_eqv_i64, ret, arg1, arg2);
1942 } else {
1943 tcg_gen_xor_i64(ret, arg1, arg2);
1944 tcg_gen_not_i64(ret, ret);
1945 }
1946#else
1947 tcg_gen_eqv_i32(TCGV_LOW(ret), TCGV_LOW(arg1), TCGV_LOW(arg2));
1948 tcg_gen_eqv_i32(TCGV_HIGH(ret), TCGV_HIGH(arg1), TCGV_HIGH(arg2));
1949#endif
1950}
1951
1952static inline void tcg_gen_nand_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
1953{
1954 if (TCG_TARGET_HAS_nand_i32) {
1955 tcg_gen_op3_i32(INDEX_op_nand_i32, ret, arg1, arg2);
1956 } else {
1957 tcg_gen_and_i32(ret, arg1, arg2);
1958 tcg_gen_not_i32(ret, ret);
1959 }
1960}
1961
1962static inline void tcg_gen_nand_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1963{
1964#if TCG_TARGET_REG_BITS == 64
1965 if (TCG_TARGET_HAS_nand_i64) {
1966 tcg_gen_op3_i64(INDEX_op_nand_i64, ret, arg1, arg2);
1967 } else {
1968 tcg_gen_and_i64(ret, arg1, arg2);
1969 tcg_gen_not_i64(ret, ret);
1970 }
1971#else
1972 tcg_gen_nand_i32(TCGV_LOW(ret), TCGV_LOW(arg1), TCGV_LOW(arg2));
1973 tcg_gen_nand_i32(TCGV_HIGH(ret), TCGV_HIGH(arg1), TCGV_HIGH(arg2));
1974#endif
1975}
1976
1977static inline void tcg_gen_nor_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
1978{
1979 if (TCG_TARGET_HAS_nor_i32) {
1980 tcg_gen_op3_i32(INDEX_op_nor_i32, ret, arg1, arg2);
1981 } else {
1982 tcg_gen_or_i32(ret, arg1, arg2);
1983 tcg_gen_not_i32(ret, ret);
1984 }
1985}
1986
1987static inline void tcg_gen_nor_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1988{
1989#if TCG_TARGET_REG_BITS == 64
1990 if (TCG_TARGET_HAS_nor_i64) {
1991 tcg_gen_op3_i64(INDEX_op_nor_i64, ret, arg1, arg2);
1992 } else {
1993 tcg_gen_or_i64(ret, arg1, arg2);
1994 tcg_gen_not_i64(ret, ret);
1995 }
1996#else
1997 tcg_gen_nor_i32(TCGV_LOW(ret), TCGV_LOW(arg1), TCGV_LOW(arg2));
1998 tcg_gen_nor_i32(TCGV_HIGH(ret), TCGV_HIGH(arg1), TCGV_HIGH(arg2));
1999#endif
2000}
2001
2002static inline void tcg_gen_orc_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
2003{
2004 if (TCG_TARGET_HAS_orc_i32) {
2005 tcg_gen_op3_i32(INDEX_op_orc_i32, ret, arg1, arg2);
2006 } else {
2007 TCGv_i32 t0 = tcg_temp_new_i32();
2008 tcg_gen_not_i32(t0, arg2);
2009 tcg_gen_or_i32(ret, arg1, t0);
2010 tcg_temp_free_i32(t0);
2011 }
2012}
2013
2014static inline void tcg_gen_orc_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
2015{
2016#if TCG_TARGET_REG_BITS == 64
2017 if (TCG_TARGET_HAS_orc_i64) {
2018 tcg_gen_op3_i64(INDEX_op_orc_i64, ret, arg1, arg2);
2019 } else {
2020 TCGv_i64 t0 = tcg_temp_new_i64();
2021 tcg_gen_not_i64(t0, arg2);
2022 tcg_gen_or_i64(ret, arg1, t0);
2023 tcg_temp_free_i64(t0);
2024 }
2025#else
2026 tcg_gen_orc_i32(TCGV_LOW(ret), TCGV_LOW(arg1), TCGV_LOW(arg2));
2027 tcg_gen_orc_i32(TCGV_HIGH(ret), TCGV_HIGH(arg1), TCGV_HIGH(arg2));
2028#endif
2029}
2030
2031static inline void tcg_gen_rotl_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
2032{
2033 if (TCG_TARGET_HAS_rot_i32) {
2034 tcg_gen_op3_i32(INDEX_op_rotl_i32, ret, arg1, arg2);
2035 } else {
2036 TCGv_i32 t0, t1;
2037
2038 t0 = tcg_temp_new_i32();
2039 t1 = tcg_temp_new_i32();
2040 tcg_gen_shl_i32(t0, arg1, arg2);
2041 tcg_gen_subfi_i32(t1, 32, arg2);
2042 tcg_gen_shr_i32(t1, arg1, t1);
2043 tcg_gen_or_i32(ret, t0, t1);
2044 tcg_temp_free_i32(t0);
2045 tcg_temp_free_i32(t1);
2046 }
2047}
2048
2049static inline void tcg_gen_rotl_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
2050{
2051 if (TCG_TARGET_HAS_rot_i64) {
2052 tcg_gen_op3_i64(INDEX_op_rotl_i64, ret, arg1, arg2);
2053 } else {
2054 TCGv_i64 t0, t1;
2055 t0 = tcg_temp_new_i64();
2056 t1 = tcg_temp_new_i64();
2057 tcg_gen_shl_i64(t0, arg1, arg2);
2058 tcg_gen_subfi_i64(t1, 64, arg2);
2059 tcg_gen_shr_i64(t1, arg1, t1);
2060 tcg_gen_or_i64(ret, t0, t1);
2061 tcg_temp_free_i64(t0);
2062 tcg_temp_free_i64(t1);
2063 }
2064}
2065
2066static inline void tcg_gen_rotli_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2)
2067{
2068
2069 if (arg2 == 0) {
2070 tcg_gen_mov_i32(ret, arg1);
2071 } else if (TCG_TARGET_HAS_rot_i32) {
2072 TCGv_i32 t0 = tcg_const_i32(arg2);
2073 tcg_gen_rotl_i32(ret, arg1, t0);
2074 tcg_temp_free_i32(t0);
2075 } else {
2076 TCGv_i32 t0, t1;
2077 t0 = tcg_temp_new_i32();
2078 t1 = tcg_temp_new_i32();
2079 tcg_gen_shli_i32(t0, arg1, arg2);
2080 tcg_gen_shri_i32(t1, arg1, 32 - arg2);
2081 tcg_gen_or_i32(ret, t0, t1);
2082 tcg_temp_free_i32(t0);
2083 tcg_temp_free_i32(t1);
2084 }
2085}
2086
2087static inline void tcg_gen_rotli_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
2088{
2089
2090 if (arg2 == 0) {
2091 tcg_gen_mov_i64(ret, arg1);
2092 } else if (TCG_TARGET_HAS_rot_i64) {
2093 TCGv_i64 t0 = tcg_const_i64(arg2);
2094 tcg_gen_rotl_i64(ret, arg1, t0);
2095 tcg_temp_free_i64(t0);
2096 } else {
2097 TCGv_i64 t0, t1;
2098 t0 = tcg_temp_new_i64();
2099 t1 = tcg_temp_new_i64();
2100 tcg_gen_shli_i64(t0, arg1, arg2);
2101 tcg_gen_shri_i64(t1, arg1, 64 - arg2);
2102 tcg_gen_or_i64(ret, t0, t1);
2103 tcg_temp_free_i64(t0);
2104 tcg_temp_free_i64(t1);
2105 }
2106}
2107
2108static inline void tcg_gen_rotr_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
2109{
2110 if (TCG_TARGET_HAS_rot_i32) {
2111 tcg_gen_op3_i32(INDEX_op_rotr_i32, ret, arg1, arg2);
2112 } else {
2113 TCGv_i32 t0, t1;
2114
2115 t0 = tcg_temp_new_i32();
2116 t1 = tcg_temp_new_i32();
2117 tcg_gen_shr_i32(t0, arg1, arg2);
2118 tcg_gen_subfi_i32(t1, 32, arg2);
2119 tcg_gen_shl_i32(t1, arg1, t1);
2120 tcg_gen_or_i32(ret, t0, t1);
2121 tcg_temp_free_i32(t0);
2122 tcg_temp_free_i32(t1);
2123 }
2124}
2125
2126static inline void tcg_gen_rotr_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
2127{
2128 if (TCG_TARGET_HAS_rot_i64) {
2129 tcg_gen_op3_i64(INDEX_op_rotr_i64, ret, arg1, arg2);
2130 } else {
2131 TCGv_i64 t0, t1;
2132 t0 = tcg_temp_new_i64();
2133 t1 = tcg_temp_new_i64();
2134 tcg_gen_shr_i64(t0, arg1, arg2);
2135 tcg_gen_subfi_i64(t1, 64, arg2);
2136 tcg_gen_shl_i64(t1, arg1, t1);
2137 tcg_gen_or_i64(ret, t0, t1);
2138 tcg_temp_free_i64(t0);
2139 tcg_temp_free_i64(t1);
2140 }
2141}
2142
2143static inline void tcg_gen_rotri_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2)
2144{
2145
2146 if (arg2 == 0) {
2147 tcg_gen_mov_i32(ret, arg1);
2148 } else {
2149 tcg_gen_rotli_i32(ret, arg1, 32 - arg2);
2150 }
2151}
2152
2153static inline void tcg_gen_rotri_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
2154{
2155
2156 if (arg2 == 0) {
2157 tcg_gen_mov_i64(ret, arg1);
2158 } else {
2159 tcg_gen_rotli_i64(ret, arg1, 64 - arg2);
2160 }
2161}
2162
2163static inline void tcg_gen_deposit_i32(TCGv_i32 ret, TCGv_i32 arg1,
2164 TCGv_i32 arg2, unsigned int ofs,
2165 unsigned int len)
2166{
2167 uint32_t mask;
2168 TCGv_i32 t1;
2169
2170 tcg_debug_assert(ofs < 32);
2171 tcg_debug_assert(len <= 32);
2172 tcg_debug_assert(ofs + len <= 32);
2173
2174 if (ofs == 0 && len == 32) {
2175 tcg_gen_mov_i32(ret, arg2);
2176 return;
2177 }
2178 if (TCG_TARGET_HAS_deposit_i32 && TCG_TARGET_deposit_i32_valid(ofs, len)) {
2179 tcg_gen_op5ii_i32(INDEX_op_deposit_i32, ret, arg1, arg2, ofs, len);
2180 return;
2181 }
2182
2183 mask = (1u << len) - 1;
2184 t1 = tcg_temp_new_i32();
2185
2186 if (ofs + len < 32) {
2187 tcg_gen_andi_i32(t1, arg2, mask);
2188 tcg_gen_shli_i32(t1, t1, ofs);
2189 } else {
2190 tcg_gen_shli_i32(t1, arg2, ofs);
2191 }
2192 tcg_gen_andi_i32(ret, arg1, ~(mask << ofs));
2193 tcg_gen_or_i32(ret, ret, t1);
2194
2195 tcg_temp_free_i32(t1);
2196}
2197
2198static inline void tcg_gen_deposit_i64(TCGv_i64 ret, TCGv_i64 arg1,
2199 TCGv_i64 arg2, unsigned int ofs,
2200 unsigned int len)
2201{
2202 uint64_t mask;
2203 TCGv_i64 t1;
2204
2205 tcg_debug_assert(ofs < 64);
2206 tcg_debug_assert(len <= 64);
2207 tcg_debug_assert(ofs + len <= 64);
2208
2209 if (ofs == 0 && len == 64) {
2210 tcg_gen_mov_i64(ret, arg2);
2211 return;
2212 }
2213 if (TCG_TARGET_HAS_deposit_i64 && TCG_TARGET_deposit_i64_valid(ofs, len)) {
2214 tcg_gen_op5ii_i64(INDEX_op_deposit_i64, ret, arg1, arg2, ofs, len);
2215 return;
2216 }
2217
2218#if TCG_TARGET_REG_BITS == 32
2219 if (ofs >= 32) {
2220 tcg_gen_deposit_i32(TCGV_HIGH(ret), TCGV_HIGH(arg1),
2221 TCGV_LOW(arg2), ofs - 32, len);
2222 tcg_gen_mov_i32(TCGV_LOW(ret), TCGV_LOW(arg1));
2223 return;
2224 }
2225 if (ofs + len <= 32) {
2226 tcg_gen_deposit_i32(TCGV_LOW(ret), TCGV_LOW(arg1),
2227 TCGV_LOW(arg2), ofs, len);
2228 tcg_gen_mov_i32(TCGV_HIGH(ret), TCGV_HIGH(arg1));
2229 return;
2230 }
2231#endif
2232
2233 mask = (1ull << len) - 1;
2234 t1 = tcg_temp_new_i64();
2235
2236 if (ofs + len < 64) {
2237 tcg_gen_andi_i64(t1, arg2, mask);
2238 tcg_gen_shli_i64(t1, t1, ofs);
2239 } else {
2240 tcg_gen_shli_i64(t1, arg2, ofs);
2241 }
2242 tcg_gen_andi_i64(ret, arg1, ~(mask << ofs));
2243 tcg_gen_or_i64(ret, ret, t1);
2244
2245 tcg_temp_free_i64(t1);
2246}
2247
2248static inline void tcg_gen_concat_i32_i64(TCGv_i64 dest, TCGv_i32 low,
2249 TCGv_i32 high)
2250{
2251#if TCG_TARGET_REG_BITS == 32
2252 tcg_gen_mov_i32(TCGV_LOW(dest), low);
2253 tcg_gen_mov_i32(TCGV_HIGH(dest), high);
2254#else
2255 TCGv_i64 tmp = tcg_temp_new_i64();
2256
2257
2258 tcg_gen_extu_i32_i64(tmp, high);
2259 tcg_gen_extu_i32_i64(dest, low);
2260
2261
2262 if (TCG_TARGET_HAS_deposit_i64 && TCG_TARGET_deposit_i64_valid(32, 32)) {
2263 tcg_gen_deposit_i64(dest, dest, tmp, 32, 32);
2264 } else {
2265 tcg_gen_shli_i64(tmp, tmp, 32);
2266 tcg_gen_or_i64(dest, dest, tmp);
2267 }
2268 tcg_temp_free_i64(tmp);
2269#endif
2270}
2271
2272static inline void tcg_gen_concat32_i64(TCGv_i64 dest, TCGv_i64 low,
2273 TCGv_i64 high)
2274{
2275 tcg_gen_deposit_i64(dest, low, high, 32, 32);
2276}
2277
2278static inline void tcg_gen_extr_i64_i32(TCGv_i32 lo, TCGv_i32 hi, TCGv_i64 arg)
2279{
2280#if TCG_TARGET_REG_BITS == 32
2281 tcg_gen_mov_i32(lo, TCGV_LOW(arg));
2282 tcg_gen_mov_i32(hi, TCGV_HIGH(arg));
2283#else
2284 TCGv_i64 t0 = tcg_temp_new_i64();
2285 tcg_gen_trunc_i64_i32(lo, arg);
2286 tcg_gen_shri_i64(t0, arg, 32);
2287 tcg_gen_trunc_i64_i32(hi, t0);
2288 tcg_temp_free_i64(t0);
2289#endif
2290}
2291
2292static inline void tcg_gen_extr32_i64(TCGv_i64 lo, TCGv_i64 hi, TCGv_i64 arg)
2293{
2294 tcg_gen_ext32u_i64(lo, arg);
2295 tcg_gen_shri_i64(hi, arg, 32);
2296}
2297
2298static inline void tcg_gen_movcond_i32(TCGCond cond, TCGv_i32 ret,
2299 TCGv_i32 c1, TCGv_i32 c2,
2300 TCGv_i32 v1, TCGv_i32 v2)
2301{
2302 if (TCG_TARGET_HAS_movcond_i32) {
2303 tcg_gen_op6i_i32(INDEX_op_movcond_i32, ret, c1, c2, v1, v2, cond);
2304 } else {
2305 TCGv_i32 t0 = tcg_temp_new_i32();
2306 TCGv_i32 t1 = tcg_temp_new_i32();
2307 tcg_gen_setcond_i32(cond, t0, c1, c2);
2308 tcg_gen_neg_i32(t0, t0);
2309 tcg_gen_and_i32(t1, v1, t0);
2310 tcg_gen_andc_i32(ret, v2, t0);
2311 tcg_gen_or_i32(ret, ret, t1);
2312 tcg_temp_free_i32(t0);
2313 tcg_temp_free_i32(t1);
2314 }
2315}
2316
2317static inline void tcg_gen_movcond_i64(TCGCond cond, TCGv_i64 ret,
2318 TCGv_i64 c1, TCGv_i64 c2,
2319 TCGv_i64 v1, TCGv_i64 v2)
2320{
2321#if TCG_TARGET_REG_BITS == 32
2322 TCGv_i32 t0 = tcg_temp_new_i32();
2323 TCGv_i32 t1 = tcg_temp_new_i32();
2324 tcg_gen_op6i_i32(INDEX_op_setcond2_i32, t0,
2325 TCGV_LOW(c1), TCGV_HIGH(c1),
2326 TCGV_LOW(c2), TCGV_HIGH(c2), cond);
2327
2328 if (TCG_TARGET_HAS_movcond_i32) {
2329 tcg_gen_movi_i32(t1, 0);
2330 tcg_gen_movcond_i32(TCG_COND_NE, TCGV_LOW(ret), t0, t1,
2331 TCGV_LOW(v1), TCGV_LOW(v2));
2332 tcg_gen_movcond_i32(TCG_COND_NE, TCGV_HIGH(ret), t0, t1,
2333 TCGV_HIGH(v1), TCGV_HIGH(v2));
2334 } else {
2335 tcg_gen_neg_i32(t0, t0);
2336
2337 tcg_gen_and_i32(t1, TCGV_LOW(v1), t0);
2338 tcg_gen_andc_i32(TCGV_LOW(ret), TCGV_LOW(v2), t0);
2339 tcg_gen_or_i32(TCGV_LOW(ret), TCGV_LOW(ret), t1);
2340
2341 tcg_gen_and_i32(t1, TCGV_HIGH(v1), t0);
2342 tcg_gen_andc_i32(TCGV_HIGH(ret), TCGV_HIGH(v2), t0);
2343 tcg_gen_or_i32(TCGV_HIGH(ret), TCGV_HIGH(ret), t1);
2344 }
2345 tcg_temp_free_i32(t0);
2346 tcg_temp_free_i32(t1);
2347#else
2348 if (TCG_TARGET_HAS_movcond_i64) {
2349 tcg_gen_op6i_i64(INDEX_op_movcond_i64, ret, c1, c2, v1, v2, cond);
2350 } else {
2351 TCGv_i64 t0 = tcg_temp_new_i64();
2352 TCGv_i64 t1 = tcg_temp_new_i64();
2353 tcg_gen_setcond_i64(cond, t0, c1, c2);
2354 tcg_gen_neg_i64(t0, t0);
2355 tcg_gen_and_i64(t1, v1, t0);
2356 tcg_gen_andc_i64(ret, v2, t0);
2357 tcg_gen_or_i64(ret, ret, t1);
2358 tcg_temp_free_i64(t0);
2359 tcg_temp_free_i64(t1);
2360 }
2361#endif
2362}
2363
2364static inline void tcg_gen_add2_i32(TCGv_i32 rl, TCGv_i32 rh, TCGv_i32 al,
2365 TCGv_i32 ah, TCGv_i32 bl, TCGv_i32 bh)
2366{
2367 if (TCG_TARGET_HAS_add2_i32) {
2368 tcg_gen_op6_i32(INDEX_op_add2_i32, rl, rh, al, ah, bl, bh);
2369
2370 tcg_gen_op0(INDEX_op_nop);
2371 } else {
2372 TCGv_i64 t0 = tcg_temp_new_i64();
2373 TCGv_i64 t1 = tcg_temp_new_i64();
2374 tcg_gen_concat_i32_i64(t0, al, ah);
2375 tcg_gen_concat_i32_i64(t1, bl, bh);
2376 tcg_gen_add_i64(t0, t0, t1);
2377 tcg_gen_extr_i64_i32(rl, rh, t0);
2378 tcg_temp_free_i64(t0);
2379 tcg_temp_free_i64(t1);
2380 }
2381}
2382
2383static inline void tcg_gen_sub2_i32(TCGv_i32 rl, TCGv_i32 rh, TCGv_i32 al,
2384 TCGv_i32 ah, TCGv_i32 bl, TCGv_i32 bh)
2385{
2386 if (TCG_TARGET_HAS_sub2_i32) {
2387 tcg_gen_op6_i32(INDEX_op_sub2_i32, rl, rh, al, ah, bl, bh);
2388
2389 tcg_gen_op0(INDEX_op_nop);
2390 } else {
2391 TCGv_i64 t0 = tcg_temp_new_i64();
2392 TCGv_i64 t1 = tcg_temp_new_i64();
2393 tcg_gen_concat_i32_i64(t0, al, ah);
2394 tcg_gen_concat_i32_i64(t1, bl, bh);
2395 tcg_gen_sub_i64(t0, t0, t1);
2396 tcg_gen_extr_i64_i32(rl, rh, t0);
2397 tcg_temp_free_i64(t0);
2398 tcg_temp_free_i64(t1);
2399 }
2400}
2401
2402static inline void tcg_gen_mulu2_i32(TCGv_i32 rl, TCGv_i32 rh,
2403 TCGv_i32 arg1, TCGv_i32 arg2)
2404{
2405 if (TCG_TARGET_HAS_mulu2_i32) {
2406 tcg_gen_op4_i32(INDEX_op_mulu2_i32, rl, rh, arg1, arg2);
2407
2408 tcg_gen_op0(INDEX_op_nop);
2409 } else if (TCG_TARGET_HAS_muluh_i32) {
2410 TCGv_i32 t = tcg_temp_new_i32();
2411 tcg_gen_op3_i32(INDEX_op_mul_i32, t, arg1, arg2);
2412 tcg_gen_op3_i32(INDEX_op_muluh_i32, rh, arg1, arg2);
2413 tcg_gen_mov_i32(rl, t);
2414 tcg_temp_free_i32(t);
2415 } else {
2416 TCGv_i64 t0 = tcg_temp_new_i64();
2417 TCGv_i64 t1 = tcg_temp_new_i64();
2418 tcg_gen_extu_i32_i64(t0, arg1);
2419 tcg_gen_extu_i32_i64(t1, arg2);
2420 tcg_gen_mul_i64(t0, t0, t1);
2421 tcg_gen_extr_i64_i32(rl, rh, t0);
2422 tcg_temp_free_i64(t0);
2423 tcg_temp_free_i64(t1);
2424 }
2425}
2426
2427static inline void tcg_gen_muls2_i32(TCGv_i32 rl, TCGv_i32 rh,
2428 TCGv_i32 arg1, TCGv_i32 arg2)
2429{
2430 if (TCG_TARGET_HAS_muls2_i32) {
2431 tcg_gen_op4_i32(INDEX_op_muls2_i32, rl, rh, arg1, arg2);
2432
2433 tcg_gen_op0(INDEX_op_nop);
2434 } else if (TCG_TARGET_HAS_mulsh_i32) {
2435 TCGv_i32 t = tcg_temp_new_i32();
2436 tcg_gen_op3_i32(INDEX_op_mul_i32, t, arg1, arg2);
2437 tcg_gen_op3_i32(INDEX_op_mulsh_i32, rh, arg1, arg2);
2438 tcg_gen_mov_i32(rl, t);
2439 tcg_temp_free_i32(t);
2440 } else if (TCG_TARGET_REG_BITS == 32 && TCG_TARGET_HAS_mulu2_i32) {
2441 TCGv_i32 t0 = tcg_temp_new_i32();
2442 TCGv_i32 t1 = tcg_temp_new_i32();
2443 TCGv_i32 t2 = tcg_temp_new_i32();
2444 TCGv_i32 t3 = tcg_temp_new_i32();
2445 tcg_gen_op4_i32(INDEX_op_mulu2_i32, t0, t1, arg1, arg2);
2446
2447 tcg_gen_op0(INDEX_op_nop);
2448
2449 tcg_gen_sari_i32(t2, arg1, 31);
2450 tcg_gen_sari_i32(t3, arg2, 31);
2451 tcg_gen_and_i32(t2, t2, arg2);
2452 tcg_gen_and_i32(t3, t3, arg1);
2453 tcg_gen_sub_i32(rh, t1, t2);
2454 tcg_gen_sub_i32(rh, rh, t3);
2455 tcg_gen_mov_i32(rl, t0);
2456 tcg_temp_free_i32(t0);
2457 tcg_temp_free_i32(t1);
2458 tcg_temp_free_i32(t2);
2459 tcg_temp_free_i32(t3);
2460 } else {
2461 TCGv_i64 t0 = tcg_temp_new_i64();
2462 TCGv_i64 t1 = tcg_temp_new_i64();
2463 tcg_gen_ext_i32_i64(t0, arg1);
2464 tcg_gen_ext_i32_i64(t1, arg2);
2465 tcg_gen_mul_i64(t0, t0, t1);
2466 tcg_gen_extr_i64_i32(rl, rh, t0);
2467 tcg_temp_free_i64(t0);
2468 tcg_temp_free_i64(t1);
2469 }
2470}
2471
2472static inline void tcg_gen_add2_i64(TCGv_i64 rl, TCGv_i64 rh, TCGv_i64 al,
2473 TCGv_i64 ah, TCGv_i64 bl, TCGv_i64 bh)
2474{
2475 if (TCG_TARGET_HAS_add2_i64) {
2476 tcg_gen_op6_i64(INDEX_op_add2_i64, rl, rh, al, ah, bl, bh);
2477
2478 tcg_gen_op0(INDEX_op_nop);
2479 } else {
2480 TCGv_i64 t0 = tcg_temp_new_i64();
2481 TCGv_i64 t1 = tcg_temp_new_i64();
2482 tcg_gen_add_i64(t0, al, bl);
2483 tcg_gen_setcond_i64(TCG_COND_LTU, t1, t0, al);
2484 tcg_gen_add_i64(rh, ah, bh);
2485 tcg_gen_add_i64(rh, rh, t1);
2486 tcg_gen_mov_i64(rl, t0);
2487 tcg_temp_free_i64(t0);
2488 tcg_temp_free_i64(t1);
2489 }
2490}
2491
2492static inline void tcg_gen_sub2_i64(TCGv_i64 rl, TCGv_i64 rh, TCGv_i64 al,
2493 TCGv_i64 ah, TCGv_i64 bl, TCGv_i64 bh)
2494{
2495 if (TCG_TARGET_HAS_sub2_i64) {
2496 tcg_gen_op6_i64(INDEX_op_sub2_i64, rl, rh, al, ah, bl, bh);
2497
2498 tcg_gen_op0(INDEX_op_nop);
2499 } else {
2500 TCGv_i64 t0 = tcg_temp_new_i64();
2501 TCGv_i64 t1 = tcg_temp_new_i64();
2502 tcg_gen_sub_i64(t0, al, bl);
2503 tcg_gen_setcond_i64(TCG_COND_LTU, t1, al, bl);
2504 tcg_gen_sub_i64(rh, ah, bh);
2505 tcg_gen_sub_i64(rh, rh, t1);
2506 tcg_gen_mov_i64(rl, t0);
2507 tcg_temp_free_i64(t0);
2508 tcg_temp_free_i64(t1);
2509 }
2510}
2511
2512static inline void tcg_gen_mulu2_i64(TCGv_i64 rl, TCGv_i64 rh,
2513 TCGv_i64 arg1, TCGv_i64 arg2)
2514{
2515 if (TCG_TARGET_HAS_mulu2_i64) {
2516 tcg_gen_op4_i64(INDEX_op_mulu2_i64, rl, rh, arg1, arg2);
2517
2518 tcg_gen_op0(INDEX_op_nop);
2519 } else if (TCG_TARGET_HAS_muluh_i64) {
2520 TCGv_i64 t = tcg_temp_new_i64();
2521 tcg_gen_op3_i64(INDEX_op_mul_i64, t, arg1, arg2);
2522 tcg_gen_op3_i64(INDEX_op_muluh_i64, rh, arg1, arg2);
2523 tcg_gen_mov_i64(rl, t);
2524 tcg_temp_free_i64(t);
2525 } else if (TCG_TARGET_HAS_mulu2_i64) {
2526 TCGv_i64 t0 = tcg_temp_new_i64();
2527 TCGv_i64 t1 = tcg_temp_new_i64();
2528 TCGv_i64 t2 = tcg_temp_new_i64();
2529 TCGv_i64 t3 = tcg_temp_new_i64();
2530 tcg_gen_op4_i64(INDEX_op_mulu2_i64, t0, t1, arg1, arg2);
2531
2532 tcg_gen_op0(INDEX_op_nop);
2533
2534 tcg_gen_sari_i64(t2, arg1, 63);
2535 tcg_gen_sari_i64(t3, arg2, 63);
2536 tcg_gen_and_i64(t2, t2, arg2);
2537 tcg_gen_and_i64(t3, t3, arg1);
2538 tcg_gen_sub_i64(rh, t1, t2);
2539 tcg_gen_sub_i64(rh, rh, t3);
2540 tcg_gen_mov_i64(rl, t0);
2541 tcg_temp_free_i64(t0);
2542 tcg_temp_free_i64(t1);
2543 tcg_temp_free_i64(t2);
2544 tcg_temp_free_i64(t3);
2545 } else {
2546 TCGv_i64 t0 = tcg_temp_new_i64();
2547 int sizemask = 0;
2548
2549 sizemask |= tcg_gen_sizemask(0, 1, 0);
2550 sizemask |= tcg_gen_sizemask(1, 1, 0);
2551 sizemask |= tcg_gen_sizemask(2, 1, 0);
2552 tcg_gen_mul_i64(t0, arg1, arg2);
2553 tcg_gen_helper64(tcg_helper_muluh_i64, sizemask, rh, arg1, arg2);
2554 tcg_gen_mov_i64(rl, t0);
2555 tcg_temp_free_i64(t0);
2556 }
2557}
2558
2559static inline void tcg_gen_muls2_i64(TCGv_i64 rl, TCGv_i64 rh,
2560 TCGv_i64 arg1, TCGv_i64 arg2)
2561{
2562 if (TCG_TARGET_HAS_muls2_i64) {
2563 tcg_gen_op4_i64(INDEX_op_muls2_i64, rl, rh, arg1, arg2);
2564
2565 tcg_gen_op0(INDEX_op_nop);
2566 } else if (TCG_TARGET_HAS_mulsh_i64) {
2567 TCGv_i64 t = tcg_temp_new_i64();
2568 tcg_gen_op3_i64(INDEX_op_mul_i64, t, arg1, arg2);
2569 tcg_gen_op3_i64(INDEX_op_mulsh_i64, rh, arg1, arg2);
2570 tcg_gen_mov_i64(rl, t);
2571 tcg_temp_free_i64(t);
2572 } else {
2573 TCGv_i64 t0 = tcg_temp_new_i64();
2574 int sizemask = 0;
2575
2576 sizemask |= tcg_gen_sizemask(0, 1, 1);
2577 sizemask |= tcg_gen_sizemask(1, 1, 1);
2578 sizemask |= tcg_gen_sizemask(2, 1, 1);
2579 tcg_gen_mul_i64(t0, arg1, arg2);
2580 tcg_gen_helper64(tcg_helper_mulsh_i64, sizemask, rh, arg1, arg2);
2581 tcg_gen_mov_i64(rl, t0);
2582 tcg_temp_free_i64(t0);
2583 }
2584}
2585
2586
2587
2588
2589#ifndef TARGET_LONG_BITS
2590#error must include QEMU headers
2591#endif
2592
2593#if TARGET_LONG_BITS == 32
2594#define TCGv TCGv_i32
2595#define tcg_temp_new() tcg_temp_new_i32()
2596#define tcg_global_reg_new tcg_global_reg_new_i32
2597#define tcg_global_mem_new tcg_global_mem_new_i32
2598#define tcg_temp_local_new() tcg_temp_local_new_i32()
2599#define tcg_temp_free tcg_temp_free_i32
2600#define TCGV_UNUSED(x) TCGV_UNUSED_I32(x)
2601#define TCGV_IS_UNUSED(x) TCGV_IS_UNUSED_I32(x)
2602#define TCGV_EQUAL(a, b) TCGV_EQUAL_I32(a, b)
2603#define tcg_add_param_tl tcg_add_param_i32
2604#define tcg_gen_qemu_ld_tl tcg_gen_qemu_ld_i32
2605#define tcg_gen_qemu_st_tl tcg_gen_qemu_st_i32
2606#else
2607#define TCGv TCGv_i64
2608#define tcg_temp_new() tcg_temp_new_i64()
2609#define tcg_global_reg_new tcg_global_reg_new_i64
2610#define tcg_global_mem_new tcg_global_mem_new_i64
2611#define tcg_temp_local_new() tcg_temp_local_new_i64()
2612#define tcg_temp_free tcg_temp_free_i64
2613#define TCGV_UNUSED(x) TCGV_UNUSED_I64(x)
2614#define TCGV_IS_UNUSED(x) TCGV_IS_UNUSED_I64(x)
2615#define TCGV_EQUAL(a, b) TCGV_EQUAL_I64(a, b)
2616#define tcg_add_param_tl tcg_add_param_i64
2617#define tcg_gen_qemu_ld_tl tcg_gen_qemu_ld_i64
2618#define tcg_gen_qemu_st_tl tcg_gen_qemu_st_i64
2619#endif
2620
2621
2622static inline void tcg_gen_debug_insn_start(uint64_t pc)
2623{
2624
2625#if TARGET_LONG_BITS > TCG_TARGET_REG_BITS
2626 tcg_gen_op2ii(INDEX_op_debug_insn_start,
2627 (uint32_t)(pc), (uint32_t)(pc >> 32));
2628#else
2629 tcg_gen_op1i(INDEX_op_debug_insn_start, pc);
2630#endif
2631}
2632
2633static inline void tcg_gen_exit_tb(uintptr_t val)
2634{
2635 tcg_gen_op1i(INDEX_op_exit_tb, val);
2636}
2637
2638static inline void tcg_gen_goto_tb(unsigned idx)
2639{
2640
2641 tcg_debug_assert(idx <= 1);
2642#ifdef CONFIG_DEBUG_TCG
2643
2644 tcg_debug_assert((tcg_ctx.goto_tb_issue_mask & (1 << idx)) == 0);
2645 tcg_ctx.goto_tb_issue_mask |= 1 << idx;
2646#endif
2647 tcg_gen_op1i(INDEX_op_goto_tb, idx);
2648}
2649
2650
2651void tcg_gen_qemu_ld_i32(TCGv_i32, TCGv, TCGArg, TCGMemOp);
2652void tcg_gen_qemu_st_i32(TCGv_i32, TCGv, TCGArg, TCGMemOp);
2653void tcg_gen_qemu_ld_i64(TCGv_i64, TCGv, TCGArg, TCGMemOp);
2654void tcg_gen_qemu_st_i64(TCGv_i64, TCGv, TCGArg, TCGMemOp);
2655
2656static inline void tcg_gen_qemu_ld8u(TCGv ret, TCGv addr, int mem_index)
2657{
2658 tcg_gen_qemu_ld_tl(ret, addr, mem_index, MO_UB);
2659}
2660
2661static inline void tcg_gen_qemu_ld8s(TCGv ret, TCGv addr, int mem_index)
2662{
2663 tcg_gen_qemu_ld_tl(ret, addr, mem_index, MO_SB);
2664}
2665
2666static inline void tcg_gen_qemu_ld16u(TCGv ret, TCGv addr, int mem_index)
2667{
2668 tcg_gen_qemu_ld_tl(ret, addr, mem_index, MO_TEUW);
2669}
2670
2671static inline void tcg_gen_qemu_ld16s(TCGv ret, TCGv addr, int mem_index)
2672{
2673 tcg_gen_qemu_ld_tl(ret, addr, mem_index, MO_TESW);
2674}
2675
2676static inline void tcg_gen_qemu_ld32u(TCGv ret, TCGv addr, int mem_index)
2677{
2678 tcg_gen_qemu_ld_tl(ret, addr, mem_index, MO_TEUL);
2679}
2680
2681static inline void tcg_gen_qemu_ld32s(TCGv ret, TCGv addr, int mem_index)
2682{
2683 tcg_gen_qemu_ld_tl(ret, addr, mem_index, MO_TESL);
2684}
2685
2686static inline void tcg_gen_qemu_ld64(TCGv_i64 ret, TCGv addr, int mem_index)
2687{
2688 tcg_gen_qemu_ld_i64(ret, addr, mem_index, MO_TEQ);
2689}
2690
2691static inline void tcg_gen_qemu_st8(TCGv arg, TCGv addr, int mem_index)
2692{
2693 tcg_gen_qemu_st_tl(arg, addr, mem_index, MO_UB);
2694}
2695
2696static inline void tcg_gen_qemu_st16(TCGv arg, TCGv addr, int mem_index)
2697{
2698 tcg_gen_qemu_st_tl(arg, addr, mem_index, MO_TEUW);
2699}
2700
2701static inline void tcg_gen_qemu_st32(TCGv arg, TCGv addr, int mem_index)
2702{
2703 tcg_gen_qemu_st_tl(arg, addr, mem_index, MO_TEUL);
2704}
2705
2706static inline void tcg_gen_qemu_st64(TCGv_i64 arg, TCGv addr, int mem_index)
2707{
2708 tcg_gen_qemu_st_i64(arg, addr, mem_index, MO_TEQ);
2709}
2710
2711#if TARGET_LONG_BITS == 64
2712#define tcg_gen_movi_tl tcg_gen_movi_i64
2713#define tcg_gen_mov_tl tcg_gen_mov_i64
2714#define tcg_gen_ld8u_tl tcg_gen_ld8u_i64
2715#define tcg_gen_ld8s_tl tcg_gen_ld8s_i64
2716#define tcg_gen_ld16u_tl tcg_gen_ld16u_i64
2717#define tcg_gen_ld16s_tl tcg_gen_ld16s_i64
2718#define tcg_gen_ld32u_tl tcg_gen_ld32u_i64
2719#define tcg_gen_ld32s_tl tcg_gen_ld32s_i64
2720#define tcg_gen_ld_tl tcg_gen_ld_i64
2721#define tcg_gen_st8_tl tcg_gen_st8_i64
2722#define tcg_gen_st16_tl tcg_gen_st16_i64
2723#define tcg_gen_st32_tl tcg_gen_st32_i64
2724#define tcg_gen_st_tl tcg_gen_st_i64
2725#define tcg_gen_add_tl tcg_gen_add_i64
2726#define tcg_gen_addi_tl tcg_gen_addi_i64
2727#define tcg_gen_sub_tl tcg_gen_sub_i64
2728#define tcg_gen_neg_tl tcg_gen_neg_i64
2729#define tcg_gen_subfi_tl tcg_gen_subfi_i64
2730#define tcg_gen_subi_tl tcg_gen_subi_i64
2731#define tcg_gen_and_tl tcg_gen_and_i64
2732#define tcg_gen_andi_tl tcg_gen_andi_i64
2733#define tcg_gen_or_tl tcg_gen_or_i64
2734#define tcg_gen_ori_tl tcg_gen_ori_i64
2735#define tcg_gen_xor_tl tcg_gen_xor_i64
2736#define tcg_gen_xori_tl tcg_gen_xori_i64
2737#define tcg_gen_not_tl tcg_gen_not_i64
2738#define tcg_gen_shl_tl tcg_gen_shl_i64
2739#define tcg_gen_shli_tl tcg_gen_shli_i64
2740#define tcg_gen_shr_tl tcg_gen_shr_i64
2741#define tcg_gen_shri_tl tcg_gen_shri_i64
2742#define tcg_gen_sar_tl tcg_gen_sar_i64
2743#define tcg_gen_sari_tl tcg_gen_sari_i64
2744#define tcg_gen_brcond_tl tcg_gen_brcond_i64
2745#define tcg_gen_brcondi_tl tcg_gen_brcondi_i64
2746#define tcg_gen_setcond_tl tcg_gen_setcond_i64
2747#define tcg_gen_setcondi_tl tcg_gen_setcondi_i64
2748#define tcg_gen_mul_tl tcg_gen_mul_i64
2749#define tcg_gen_muli_tl tcg_gen_muli_i64
2750#define tcg_gen_div_tl tcg_gen_div_i64
2751#define tcg_gen_rem_tl tcg_gen_rem_i64
2752#define tcg_gen_divu_tl tcg_gen_divu_i64
2753#define tcg_gen_remu_tl tcg_gen_remu_i64
2754#define tcg_gen_discard_tl tcg_gen_discard_i64
2755#define tcg_gen_trunc_tl_i32 tcg_gen_trunc_i64_i32
2756#define tcg_gen_trunc_i64_tl tcg_gen_mov_i64
2757#define tcg_gen_extu_i32_tl tcg_gen_extu_i32_i64
2758#define tcg_gen_ext_i32_tl tcg_gen_ext_i32_i64
2759#define tcg_gen_extu_tl_i64 tcg_gen_mov_i64
2760#define tcg_gen_ext_tl_i64 tcg_gen_mov_i64
2761#define tcg_gen_ext8u_tl tcg_gen_ext8u_i64
2762#define tcg_gen_ext8s_tl tcg_gen_ext8s_i64
2763#define tcg_gen_ext16u_tl tcg_gen_ext16u_i64
2764#define tcg_gen_ext16s_tl tcg_gen_ext16s_i64
2765#define tcg_gen_ext32u_tl tcg_gen_ext32u_i64
2766#define tcg_gen_ext32s_tl tcg_gen_ext32s_i64
2767#define tcg_gen_bswap16_tl tcg_gen_bswap16_i64
2768#define tcg_gen_bswap32_tl tcg_gen_bswap32_i64
2769#define tcg_gen_bswap64_tl tcg_gen_bswap64_i64
2770#define tcg_gen_concat_tl_i64 tcg_gen_concat32_i64
2771#define tcg_gen_extr_i64_tl tcg_gen_extr32_i64
2772#define tcg_gen_andc_tl tcg_gen_andc_i64
2773#define tcg_gen_eqv_tl tcg_gen_eqv_i64
2774#define tcg_gen_nand_tl tcg_gen_nand_i64
2775#define tcg_gen_nor_tl tcg_gen_nor_i64
2776#define tcg_gen_orc_tl tcg_gen_orc_i64
2777#define tcg_gen_rotl_tl tcg_gen_rotl_i64
2778#define tcg_gen_rotli_tl tcg_gen_rotli_i64
2779#define tcg_gen_rotr_tl tcg_gen_rotr_i64
2780#define tcg_gen_rotri_tl tcg_gen_rotri_i64
2781#define tcg_gen_deposit_tl tcg_gen_deposit_i64
2782#define tcg_const_tl tcg_const_i64
2783#define tcg_const_local_tl tcg_const_local_i64
2784#define tcg_gen_movcond_tl tcg_gen_movcond_i64
2785#define tcg_gen_add2_tl tcg_gen_add2_i64
2786#define tcg_gen_sub2_tl tcg_gen_sub2_i64
2787#define tcg_gen_mulu2_tl tcg_gen_mulu2_i64
2788#define tcg_gen_muls2_tl tcg_gen_muls2_i64
2789#else
2790#define tcg_gen_movi_tl tcg_gen_movi_i32
2791#define tcg_gen_mov_tl tcg_gen_mov_i32
2792#define tcg_gen_ld8u_tl tcg_gen_ld8u_i32
2793#define tcg_gen_ld8s_tl tcg_gen_ld8s_i32
2794#define tcg_gen_ld16u_tl tcg_gen_ld16u_i32
2795#define tcg_gen_ld16s_tl tcg_gen_ld16s_i32
2796#define tcg_gen_ld32u_tl tcg_gen_ld_i32
2797#define tcg_gen_ld32s_tl tcg_gen_ld_i32
2798#define tcg_gen_ld_tl tcg_gen_ld_i32
2799#define tcg_gen_st8_tl tcg_gen_st8_i32
2800#define tcg_gen_st16_tl tcg_gen_st16_i32
2801#define tcg_gen_st32_tl tcg_gen_st_i32
2802#define tcg_gen_st_tl tcg_gen_st_i32
2803#define tcg_gen_add_tl tcg_gen_add_i32
2804#define tcg_gen_addi_tl tcg_gen_addi_i32
2805#define tcg_gen_sub_tl tcg_gen_sub_i32
2806#define tcg_gen_neg_tl tcg_gen_neg_i32
2807#define tcg_gen_subfi_tl tcg_gen_subfi_i32
2808#define tcg_gen_subi_tl tcg_gen_subi_i32
2809#define tcg_gen_and_tl tcg_gen_and_i32
2810#define tcg_gen_andi_tl tcg_gen_andi_i32
2811#define tcg_gen_or_tl tcg_gen_or_i32
2812#define tcg_gen_ori_tl tcg_gen_ori_i32
2813#define tcg_gen_xor_tl tcg_gen_xor_i32
2814#define tcg_gen_xori_tl tcg_gen_xori_i32
2815#define tcg_gen_not_tl tcg_gen_not_i32
2816#define tcg_gen_shl_tl tcg_gen_shl_i32
2817#define tcg_gen_shli_tl tcg_gen_shli_i32
2818#define tcg_gen_shr_tl tcg_gen_shr_i32
2819#define tcg_gen_shri_tl tcg_gen_shri_i32
2820#define tcg_gen_sar_tl tcg_gen_sar_i32
2821#define tcg_gen_sari_tl tcg_gen_sari_i32
2822#define tcg_gen_brcond_tl tcg_gen_brcond_i32
2823#define tcg_gen_brcondi_tl tcg_gen_brcondi_i32
2824#define tcg_gen_setcond_tl tcg_gen_setcond_i32
2825#define tcg_gen_setcondi_tl tcg_gen_setcondi_i32
2826#define tcg_gen_mul_tl tcg_gen_mul_i32
2827#define tcg_gen_muli_tl tcg_gen_muli_i32
2828#define tcg_gen_div_tl tcg_gen_div_i32
2829#define tcg_gen_rem_tl tcg_gen_rem_i32
2830#define tcg_gen_divu_tl tcg_gen_divu_i32
2831#define tcg_gen_remu_tl tcg_gen_remu_i32
2832#define tcg_gen_discard_tl tcg_gen_discard_i32
2833#define tcg_gen_trunc_tl_i32 tcg_gen_mov_i32
2834#define tcg_gen_trunc_i64_tl tcg_gen_trunc_i64_i32
2835#define tcg_gen_extu_i32_tl tcg_gen_mov_i32
2836#define tcg_gen_ext_i32_tl tcg_gen_mov_i32
2837#define tcg_gen_extu_tl_i64 tcg_gen_extu_i32_i64
2838#define tcg_gen_ext_tl_i64 tcg_gen_ext_i32_i64
2839#define tcg_gen_ext8u_tl tcg_gen_ext8u_i32
2840#define tcg_gen_ext8s_tl tcg_gen_ext8s_i32
2841#define tcg_gen_ext16u_tl tcg_gen_ext16u_i32
2842#define tcg_gen_ext16s_tl tcg_gen_ext16s_i32
2843#define tcg_gen_ext32u_tl tcg_gen_mov_i32
2844#define tcg_gen_ext32s_tl tcg_gen_mov_i32
2845#define tcg_gen_bswap16_tl tcg_gen_bswap16_i32
2846#define tcg_gen_bswap32_tl tcg_gen_bswap32_i32
2847#define tcg_gen_concat_tl_i64 tcg_gen_concat_i32_i64
2848#define tcg_gen_extr_tl_i64 tcg_gen_extr_i32_i64
2849#define tcg_gen_andc_tl tcg_gen_andc_i32
2850#define tcg_gen_eqv_tl tcg_gen_eqv_i32
2851#define tcg_gen_nand_tl tcg_gen_nand_i32
2852#define tcg_gen_nor_tl tcg_gen_nor_i32
2853#define tcg_gen_orc_tl tcg_gen_orc_i32
2854#define tcg_gen_rotl_tl tcg_gen_rotl_i32
2855#define tcg_gen_rotli_tl tcg_gen_rotli_i32
2856#define tcg_gen_rotr_tl tcg_gen_rotr_i32
2857#define tcg_gen_rotri_tl tcg_gen_rotri_i32
2858#define tcg_gen_deposit_tl tcg_gen_deposit_i32
2859#define tcg_const_tl tcg_const_i32
2860#define tcg_const_local_tl tcg_const_local_i32
2861#define tcg_gen_movcond_tl tcg_gen_movcond_i32
2862#define tcg_gen_add2_tl tcg_gen_add2_i32
2863#define tcg_gen_sub2_tl tcg_gen_sub2_i32
2864#define tcg_gen_mulu2_tl tcg_gen_mulu2_i32
2865#define tcg_gen_muls2_tl tcg_gen_muls2_i32
2866#endif
2867
2868#if TCG_TARGET_REG_BITS == 32
2869# define tcg_gen_ld_ptr(R, A, O) \
2870 tcg_gen_ld_i32(TCGV_PTR_TO_NAT(R), (A), (O))
2871# define tcg_gen_discard_ptr(A) \
2872 tcg_gen_discard_i32(TCGV_PTR_TO_NAT(A))
2873# define tcg_gen_add_ptr(R, A, B) \
2874 tcg_gen_add_i32(TCGV_PTR_TO_NAT(R), TCGV_PTR_TO_NAT(A), TCGV_PTR_TO_NAT(B))
2875# define tcg_gen_addi_ptr(R, A, B) \
2876 tcg_gen_addi_i32(TCGV_PTR_TO_NAT(R), TCGV_PTR_TO_NAT(A), (B))
2877# define tcg_gen_ext_i32_ptr(R, A) \
2878 tcg_gen_mov_i32(TCGV_PTR_TO_NAT(R), (A))
2879#else
2880# define tcg_gen_ld_ptr(R, A, O) \
2881 tcg_gen_ld_i64(TCGV_PTR_TO_NAT(R), (A), (O))
2882# define tcg_gen_discard_ptr(A) \
2883 tcg_gen_discard_i64(TCGV_PTR_TO_NAT(A))
2884# define tcg_gen_add_ptr(R, A, B) \
2885 tcg_gen_add_i64(TCGV_PTR_TO_NAT(R), TCGV_PTR_TO_NAT(A), TCGV_PTR_TO_NAT(B))
2886# define tcg_gen_addi_ptr(R, A, B) \
2887 tcg_gen_addi_i64(TCGV_PTR_TO_NAT(R), TCGV_PTR_TO_NAT(A), (B))
2888# define tcg_gen_ext_i32_ptr(R, A) \
2889 tcg_gen_ext_i32_i64(TCGV_PTR_TO_NAT(R), (A))
2890#endif
2891