VirtualBox

source: vbox/trunk/src/recompiler/tcg/tcg-op.h@ 36170

Last change on this file since 36170 was 36170, checked in by vboxsync, 14 years ago

rem: synced up to svn://svn.savannah.nongnu.org/qemu/trunk@6686 (repo UUID c046a42c-6fe2-441c-8c8c-71466251a162).

  • Property svn:eol-style set to native
File size: 60.2 KB
Line 
1/*
2 * Tiny Code Generator for QEMU
3 *
4 * Copyright (c) 2008 Fabrice Bellard
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 * of this software and associated documentation files (the "Software"), to deal
8 * in the Software without restriction, including without limitation the rights
9 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 * copies of the Software, and to permit persons to whom the Software is
11 * furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included in
14 * all copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 * THE SOFTWARE.
23 */
24#include "tcg.h"
25
26int gen_new_label(void);
27
28static inline void tcg_gen_op1_i32(int opc, TCGv_i32 arg1)
29{
30 *gen_opc_ptr++ = opc;
31 *gen_opparam_ptr++ = GET_TCGV_I32(arg1);
32}
33
34static inline void tcg_gen_op1_i64(int opc, TCGv_i64 arg1)
35{
36 *gen_opc_ptr++ = opc;
37 *gen_opparam_ptr++ = GET_TCGV_I64(arg1);
38}
39
40static inline void tcg_gen_op1i(int opc, TCGArg arg1)
41{
42 *gen_opc_ptr++ = opc;
43 *gen_opparam_ptr++ = arg1;
44}
45
46static inline void tcg_gen_op2_i32(int opc, TCGv_i32 arg1, TCGv_i32 arg2)
47{
48 *gen_opc_ptr++ = opc;
49 *gen_opparam_ptr++ = GET_TCGV_I32(arg1);
50 *gen_opparam_ptr++ = GET_TCGV_I32(arg2);
51}
52
53static inline void tcg_gen_op2_i64(int opc, TCGv_i64 arg1, TCGv_i64 arg2)
54{
55 *gen_opc_ptr++ = opc;
56 *gen_opparam_ptr++ = GET_TCGV_I64(arg1);
57 *gen_opparam_ptr++ = GET_TCGV_I64(arg2);
58}
59
60static inline void tcg_gen_op2i_i32(int opc, TCGv_i32 arg1, TCGArg arg2)
61{
62 *gen_opc_ptr++ = opc;
63 *gen_opparam_ptr++ = GET_TCGV_I32(arg1);
64 *gen_opparam_ptr++ = arg2;
65}
66
67static inline void tcg_gen_op2i_i64(int opc, TCGv_i64 arg1, TCGArg arg2)
68{
69 *gen_opc_ptr++ = opc;
70 *gen_opparam_ptr++ = GET_TCGV_I64(arg1);
71 *gen_opparam_ptr++ = arg2;
72}
73
74static inline void tcg_gen_op2ii(int opc, TCGArg arg1, TCGArg arg2)
75{
76 *gen_opc_ptr++ = opc;
77 *gen_opparam_ptr++ = arg1;
78 *gen_opparam_ptr++ = arg2;
79}
80
81static inline void tcg_gen_op3_i32(int opc, TCGv_i32 arg1, TCGv_i32 arg2,
82 TCGv_i32 arg3)
83{
84 *gen_opc_ptr++ = opc;
85 *gen_opparam_ptr++ = GET_TCGV_I32(arg1);
86 *gen_opparam_ptr++ = GET_TCGV_I32(arg2);
87 *gen_opparam_ptr++ = GET_TCGV_I32(arg3);
88}
89
90static inline void tcg_gen_op3_i64(int opc, TCGv_i64 arg1, TCGv_i64 arg2,
91 TCGv_i64 arg3)
92{
93 *gen_opc_ptr++ = opc;
94 *gen_opparam_ptr++ = GET_TCGV_I64(arg1);
95 *gen_opparam_ptr++ = GET_TCGV_I64(arg2);
96 *gen_opparam_ptr++ = GET_TCGV_I64(arg3);
97}
98
99static inline void tcg_gen_op3i_i32(int opc, TCGv_i32 arg1, TCGv_i32 arg2,
100 TCGArg arg3)
101{
102 *gen_opc_ptr++ = opc;
103 *gen_opparam_ptr++ = GET_TCGV_I32(arg1);
104 *gen_opparam_ptr++ = GET_TCGV_I32(arg2);
105 *gen_opparam_ptr++ = arg3;
106}
107
108static inline void tcg_gen_op3i_i64(int opc, TCGv_i64 arg1, TCGv_i64 arg2,
109 TCGArg arg3)
110{
111 *gen_opc_ptr++ = opc;
112 *gen_opparam_ptr++ = GET_TCGV_I64(arg1);
113 *gen_opparam_ptr++ = GET_TCGV_I64(arg2);
114 *gen_opparam_ptr++ = arg3;
115}
116
117static inline void tcg_gen_ldst_op_i32(int opc, TCGv_i32 val, TCGv_ptr base,
118 TCGArg offset)
119{
120 *gen_opc_ptr++ = opc;
121 *gen_opparam_ptr++ = GET_TCGV_I32(val);
122 *gen_opparam_ptr++ = GET_TCGV_PTR(base);
123 *gen_opparam_ptr++ = offset;
124}
125
126static inline void tcg_gen_ldst_op_i64(int opc, TCGv_i64 val, TCGv_ptr base,
127 TCGArg offset)
128{
129 *gen_opc_ptr++ = opc;
130 *gen_opparam_ptr++ = GET_TCGV_I64(val);
131 *gen_opparam_ptr++ = GET_TCGV_PTR(base);
132 *gen_opparam_ptr++ = offset;
133}
134
135static inline void tcg_gen_qemu_ldst_op_i64_i32(int opc, TCGv_i64 val, TCGv_i32 addr,
136 TCGArg mem_index)
137{
138 *gen_opc_ptr++ = opc;
139 *gen_opparam_ptr++ = GET_TCGV_I64(val);
140 *gen_opparam_ptr++ = GET_TCGV_I32(addr);
141 *gen_opparam_ptr++ = mem_index;
142}
143
144static inline void tcg_gen_qemu_ldst_op_i64_i64(int opc, TCGv_i64 val, TCGv_i64 addr,
145 TCGArg mem_index)
146{
147 *gen_opc_ptr++ = opc;
148 *gen_opparam_ptr++ = GET_TCGV_I64(val);
149 *gen_opparam_ptr++ = GET_TCGV_I64(addr);
150 *gen_opparam_ptr++ = mem_index;
151}
152
153static inline void tcg_gen_op4_i32(int opc, TCGv_i32 arg1, TCGv_i32 arg2,
154 TCGv_i32 arg3, TCGv_i32 arg4)
155{
156 *gen_opc_ptr++ = opc;
157 *gen_opparam_ptr++ = GET_TCGV_I32(arg1);
158 *gen_opparam_ptr++ = GET_TCGV_I32(arg2);
159 *gen_opparam_ptr++ = GET_TCGV_I32(arg3);
160 *gen_opparam_ptr++ = GET_TCGV_I32(arg4);
161}
162
163static inline void tcg_gen_op4_i64(int opc, TCGv_i64 arg1, TCGv_i64 arg2,
164 TCGv_i64 arg3, TCGv_i64 arg4)
165{
166 *gen_opc_ptr++ = opc;
167 *gen_opparam_ptr++ = GET_TCGV_I64(arg1);
168 *gen_opparam_ptr++ = GET_TCGV_I64(arg2);
169 *gen_opparam_ptr++ = GET_TCGV_I64(arg3);
170 *gen_opparam_ptr++ = GET_TCGV_I64(arg4);
171}
172
173static inline void tcg_gen_op4i_i32(int opc, TCGv_i32 arg1, TCGv_i32 arg2,
174 TCGv_i32 arg3, TCGArg arg4)
175{
176 *gen_opc_ptr++ = opc;
177 *gen_opparam_ptr++ = GET_TCGV_I32(arg1);
178 *gen_opparam_ptr++ = GET_TCGV_I32(arg2);
179 *gen_opparam_ptr++ = GET_TCGV_I32(arg3);
180 *gen_opparam_ptr++ = arg4;
181}
182
183static inline void tcg_gen_op4i_i64(int opc, TCGv_i64 arg1, TCGv_i64 arg2,
184 TCGv_i64 arg3, TCGArg arg4)
185{
186 *gen_opc_ptr++ = opc;
187 *gen_opparam_ptr++ = GET_TCGV_I64(arg1);
188 *gen_opparam_ptr++ = GET_TCGV_I64(arg2);
189 *gen_opparam_ptr++ = GET_TCGV_I64(arg3);
190 *gen_opparam_ptr++ = arg4;
191}
192
193static inline void tcg_gen_op4ii_i32(int opc, TCGv_i32 arg1, TCGv_i32 arg2,
194 TCGArg arg3, TCGArg arg4)
195{
196 *gen_opc_ptr++ = opc;
197 *gen_opparam_ptr++ = GET_TCGV_I32(arg1);
198 *gen_opparam_ptr++ = GET_TCGV_I32(arg2);
199 *gen_opparam_ptr++ = arg3;
200 *gen_opparam_ptr++ = arg4;
201}
202
203static inline void tcg_gen_op4ii_i64(int opc, TCGv_i64 arg1, TCGv_i64 arg2,
204 TCGArg arg3, TCGArg arg4)
205{
206 *gen_opc_ptr++ = opc;
207 *gen_opparam_ptr++ = GET_TCGV_I64(arg1);
208 *gen_opparam_ptr++ = GET_TCGV_I64(arg2);
209 *gen_opparam_ptr++ = arg3;
210 *gen_opparam_ptr++ = arg4;
211}
212
213static inline void tcg_gen_op5_i32(int opc, TCGv_i32 arg1, TCGv_i32 arg2,
214 TCGv_i32 arg3, TCGv_i32 arg4, TCGv_i32 arg5)
215{
216 *gen_opc_ptr++ = opc;
217 *gen_opparam_ptr++ = GET_TCGV_I32(arg1);
218 *gen_opparam_ptr++ = GET_TCGV_I32(arg2);
219 *gen_opparam_ptr++ = GET_TCGV_I32(arg3);
220 *gen_opparam_ptr++ = GET_TCGV_I32(arg4);
221 *gen_opparam_ptr++ = GET_TCGV_I32(arg5);
222}
223
224static inline void tcg_gen_op5_i64(int opc, TCGv_i64 arg1, TCGv_i64 arg2,
225 TCGv_i64 arg3, TCGv_i64 arg4, TCGv_i64 arg5)
226{
227 *gen_opc_ptr++ = opc;
228 *gen_opparam_ptr++ = GET_TCGV_I64(arg1);
229 *gen_opparam_ptr++ = GET_TCGV_I64(arg2);
230 *gen_opparam_ptr++ = GET_TCGV_I64(arg3);
231 *gen_opparam_ptr++ = GET_TCGV_I64(arg4);
232 *gen_opparam_ptr++ = GET_TCGV_I64(arg5);
233}
234
235static inline void tcg_gen_op5i_i32(int opc, TCGv_i32 arg1, TCGv_i32 arg2,
236 TCGv_i32 arg3, TCGv_i32 arg4, TCGArg arg5)
237{
238 *gen_opc_ptr++ = opc;
239 *gen_opparam_ptr++ = GET_TCGV_I32(arg1);
240 *gen_opparam_ptr++ = GET_TCGV_I32(arg2);
241 *gen_opparam_ptr++ = GET_TCGV_I32(arg3);
242 *gen_opparam_ptr++ = GET_TCGV_I32(arg4);
243 *gen_opparam_ptr++ = arg5;
244}
245
246static inline void tcg_gen_op5i_i64(int opc, TCGv_i64 arg1, TCGv_i64 arg2,
247 TCGv_i64 arg3, TCGv_i64 arg4, TCGArg arg5)
248{
249 *gen_opc_ptr++ = opc;
250 *gen_opparam_ptr++ = GET_TCGV_I64(arg1);
251 *gen_opparam_ptr++ = GET_TCGV_I64(arg2);
252 *gen_opparam_ptr++ = GET_TCGV_I64(arg3);
253 *gen_opparam_ptr++ = GET_TCGV_I64(arg4);
254 *gen_opparam_ptr++ = arg5;
255}
256
257static inline void tcg_gen_op6_i32(int opc, TCGv_i32 arg1, TCGv_i32 arg2,
258 TCGv_i32 arg3, TCGv_i32 arg4, TCGv_i32 arg5,
259 TCGv_i32 arg6)
260{
261 *gen_opc_ptr++ = opc;
262 *gen_opparam_ptr++ = GET_TCGV_I32(arg1);
263 *gen_opparam_ptr++ = GET_TCGV_I32(arg2);
264 *gen_opparam_ptr++ = GET_TCGV_I32(arg3);
265 *gen_opparam_ptr++ = GET_TCGV_I32(arg4);
266 *gen_opparam_ptr++ = GET_TCGV_I32(arg5);
267 *gen_opparam_ptr++ = GET_TCGV_I32(arg6);
268}
269
270static inline void tcg_gen_op6_i64(int opc, TCGv_i64 arg1, TCGv_i64 arg2,
271 TCGv_i64 arg3, TCGv_i64 arg4, TCGv_i64 arg5,
272 TCGv_i64 arg6)
273{
274 *gen_opc_ptr++ = opc;
275 *gen_opparam_ptr++ = GET_TCGV_I64(arg1);
276 *gen_opparam_ptr++ = GET_TCGV_I64(arg2);
277 *gen_opparam_ptr++ = GET_TCGV_I64(arg3);
278 *gen_opparam_ptr++ = GET_TCGV_I64(arg4);
279 *gen_opparam_ptr++ = GET_TCGV_I64(arg5);
280 *gen_opparam_ptr++ = GET_TCGV_I64(arg6);
281}
282
283static inline void tcg_gen_op6ii_i32(int opc, TCGv_i32 arg1, TCGv_i32 arg2,
284 TCGv_i32 arg3, TCGv_i32 arg4, TCGArg arg5,
285 TCGArg arg6)
286{
287 *gen_opc_ptr++ = opc;
288 *gen_opparam_ptr++ = GET_TCGV_I32(arg1);
289 *gen_opparam_ptr++ = GET_TCGV_I32(arg2);
290 *gen_opparam_ptr++ = GET_TCGV_I32(arg3);
291 *gen_opparam_ptr++ = GET_TCGV_I32(arg4);
292 *gen_opparam_ptr++ = arg5;
293 *gen_opparam_ptr++ = arg6;
294}
295
296static inline void tcg_gen_op6ii_i64(int opc, TCGv_i64 arg1, TCGv_i64 arg2,
297 TCGv_i64 arg3, TCGv_i64 arg4, TCGArg arg5,
298 TCGArg arg6)
299{
300 *gen_opc_ptr++ = opc;
301 *gen_opparam_ptr++ = GET_TCGV_I64(arg1);
302 *gen_opparam_ptr++ = GET_TCGV_I64(arg2);
303 *gen_opparam_ptr++ = GET_TCGV_I64(arg3);
304 *gen_opparam_ptr++ = GET_TCGV_I64(arg4);
305 *gen_opparam_ptr++ = arg5;
306 *gen_opparam_ptr++ = arg6;
307}
308
309static inline void gen_set_label(int n)
310{
311 tcg_gen_op1i(INDEX_op_set_label, n);
312}
313
314static inline void tcg_gen_br(int label)
315{
316 tcg_gen_op1i(INDEX_op_br, label);
317}
318
319static inline void tcg_gen_mov_i32(TCGv_i32 ret, TCGv_i32 arg)
320{
321 if (GET_TCGV_I32(ret) != GET_TCGV_I32(arg))
322 tcg_gen_op2_i32(INDEX_op_mov_i32, ret, arg);
323}
324
325static inline void tcg_gen_movi_i32(TCGv_i32 ret, int32_t arg)
326{
327 tcg_gen_op2i_i32(INDEX_op_movi_i32, ret, arg);
328}
329
330/* helper calls */
331static inline void tcg_gen_helperN(void *func, int flags, int sizemask,
332 TCGArg ret, int nargs, TCGArg *args)
333{
334 TCGv_ptr fn;
335 fn = tcg_const_ptr((tcg_target_long)func);
336 tcg_gen_callN(&tcg_ctx, fn, flags, sizemask, ret,
337 nargs, args);
338 tcg_temp_free_ptr(fn);
339}
340
341/* FIXME: Should this be pure? */
342static inline void tcg_gen_helper64(void *func, TCGv_i64 ret,
343 TCGv_i64 a, TCGv_i64 b)
344{
345 TCGv_ptr fn;
346 TCGArg args[2];
347 fn = tcg_const_ptr((tcg_target_long)func);
348 args[0] = GET_TCGV_I64(a);
349 args[1] = GET_TCGV_I64(b);
350 tcg_gen_callN(&tcg_ctx, fn, 0, 7, GET_TCGV_I64(ret), 2, args);
351 tcg_temp_free_ptr(fn);
352}
353
354/* 32 bit ops */
355
356static inline void tcg_gen_ld8u_i32(TCGv_i32 ret, TCGv_ptr arg2, tcg_target_long offset)
357{
358 tcg_gen_ldst_op_i32(INDEX_op_ld8u_i32, ret, arg2, offset);
359}
360
361static inline void tcg_gen_ld8s_i32(TCGv_i32 ret, TCGv_ptr arg2, tcg_target_long offset)
362{
363 tcg_gen_ldst_op_i32(INDEX_op_ld8s_i32, ret, arg2, offset);
364}
365
366static inline void tcg_gen_ld16u_i32(TCGv_i32 ret, TCGv_ptr arg2, tcg_target_long offset)
367{
368 tcg_gen_ldst_op_i32(INDEX_op_ld16u_i32, ret, arg2, offset);
369}
370
371static inline void tcg_gen_ld16s_i32(TCGv_i32 ret, TCGv_ptr arg2, tcg_target_long offset)
372{
373 tcg_gen_ldst_op_i32(INDEX_op_ld16s_i32, ret, arg2, offset);
374}
375
376static inline void tcg_gen_ld_i32(TCGv_i32 ret, TCGv_ptr arg2, tcg_target_long offset)
377{
378 tcg_gen_ldst_op_i32(INDEX_op_ld_i32, ret, arg2, offset);
379}
380
381static inline void tcg_gen_st8_i32(TCGv_i32 arg1, TCGv_ptr arg2, tcg_target_long offset)
382{
383 tcg_gen_ldst_op_i32(INDEX_op_st8_i32, arg1, arg2, offset);
384}
385
386static inline void tcg_gen_st16_i32(TCGv_i32 arg1, TCGv_ptr arg2, tcg_target_long offset)
387{
388 tcg_gen_ldst_op_i32(INDEX_op_st16_i32, arg1, arg2, offset);
389}
390
391static inline void tcg_gen_st_i32(TCGv_i32 arg1, TCGv_ptr arg2, tcg_target_long offset)
392{
393 tcg_gen_ldst_op_i32(INDEX_op_st_i32, arg1, arg2, offset);
394}
395
396static inline void tcg_gen_add_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
397{
398 tcg_gen_op3_i32(INDEX_op_add_i32, ret, arg1, arg2);
399}
400
401static inline void tcg_gen_addi_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2)
402{
403 /* some cases can be optimized here */
404 if (arg2 == 0) {
405 tcg_gen_mov_i32(ret, arg1);
406 } else {
407 TCGv_i32 t0 = tcg_const_i32(arg2);
408 tcg_gen_add_i32(ret, arg1, t0);
409 tcg_temp_free_i32(t0);
410 }
411}
412
413static inline void tcg_gen_sub_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
414{
415 tcg_gen_op3_i32(INDEX_op_sub_i32, ret, arg1, arg2);
416}
417
418static inline void tcg_gen_subfi_i32(TCGv_i32 ret, int32_t arg1, TCGv_i32 arg2)
419{
420 TCGv_i32 t0 = tcg_const_i32(arg1);
421 tcg_gen_sub_i32(ret, t0, arg2);
422 tcg_temp_free_i32(t0);
423}
424
425static inline void tcg_gen_subi_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2)
426{
427 /* some cases can be optimized here */
428 if (arg2 == 0) {
429 tcg_gen_mov_i32(ret, arg1);
430 } else {
431 TCGv_i32 t0 = tcg_const_i32(arg2);
432 tcg_gen_sub_i32(ret, arg1, t0);
433 tcg_temp_free_i32(t0);
434 }
435}
436
437static inline void tcg_gen_and_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
438{
439 tcg_gen_op3_i32(INDEX_op_and_i32, ret, arg1, arg2);
440}
441
442static inline void tcg_gen_andi_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2)
443{
444 /* some cases can be optimized here */
445 if (arg2 == 0) {
446 tcg_gen_movi_i32(ret, 0);
447 } else if (arg2 == 0xffffffff) {
448 tcg_gen_mov_i32(ret, arg1);
449 } else {
450 TCGv_i32 t0 = tcg_const_i32(arg2);
451 tcg_gen_and_i32(ret, arg1, t0);
452 tcg_temp_free_i32(t0);
453 }
454}
455
456static inline void tcg_gen_or_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
457{
458 tcg_gen_op3_i32(INDEX_op_or_i32, ret, arg1, arg2);
459}
460
461static inline void tcg_gen_ori_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2)
462{
463 /* some cases can be optimized here */
464 if (arg2 == 0xffffffff) {
465 tcg_gen_movi_i32(ret, 0xffffffff);
466 } else if (arg2 == 0) {
467 tcg_gen_mov_i32(ret, arg1);
468 } else {
469 TCGv_i32 t0 = tcg_const_i32(arg2);
470 tcg_gen_or_i32(ret, arg1, t0);
471 tcg_temp_free_i32(t0);
472 }
473}
474
475static inline void tcg_gen_xor_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
476{
477 tcg_gen_op3_i32(INDEX_op_xor_i32, ret, arg1, arg2);
478}
479
480static inline void tcg_gen_xori_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2)
481{
482 /* some cases can be optimized here */
483 if (arg2 == 0) {
484 tcg_gen_mov_i32(ret, arg1);
485 } else {
486 TCGv_i32 t0 = tcg_const_i32(arg2);
487 tcg_gen_xor_i32(ret, arg1, t0);
488 tcg_temp_free_i32(t0);
489 }
490}
491
492static inline void tcg_gen_shl_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
493{
494 tcg_gen_op3_i32(INDEX_op_shl_i32, ret, arg1, arg2);
495}
496
497static inline void tcg_gen_shli_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2)
498{
499 if (arg2 == 0) {
500 tcg_gen_mov_i32(ret, arg1);
501 } else {
502 TCGv_i32 t0 = tcg_const_i32(arg2);
503 tcg_gen_shl_i32(ret, arg1, t0);
504 tcg_temp_free_i32(t0);
505 }
506}
507
508static inline void tcg_gen_shr_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
509{
510 tcg_gen_op3_i32(INDEX_op_shr_i32, ret, arg1, arg2);
511}
512
513static inline void tcg_gen_shri_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2)
514{
515 if (arg2 == 0) {
516 tcg_gen_mov_i32(ret, arg1);
517 } else {
518 TCGv_i32 t0 = tcg_const_i32(arg2);
519 tcg_gen_shr_i32(ret, arg1, t0);
520 tcg_temp_free_i32(t0);
521 }
522}
523
524static inline void tcg_gen_sar_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
525{
526 tcg_gen_op3_i32(INDEX_op_sar_i32, ret, arg1, arg2);
527}
528
529static inline void tcg_gen_sari_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2)
530{
531 if (arg2 == 0) {
532 tcg_gen_mov_i32(ret, arg1);
533 } else {
534 TCGv_i32 t0 = tcg_const_i32(arg2);
535 tcg_gen_sar_i32(ret, arg1, t0);
536 tcg_temp_free_i32(t0);
537 }
538}
539
540static inline void tcg_gen_brcond_i32(int cond, TCGv_i32 arg1, TCGv_i32 arg2,
541 int label_index)
542{
543 tcg_gen_op4ii_i32(INDEX_op_brcond_i32, arg1, arg2, cond, label_index);
544}
545
546static inline void tcg_gen_brcondi_i32(int cond, TCGv_i32 arg1, int32_t arg2,
547 int label_index)
548{
549 TCGv_i32 t0 = tcg_const_i32(arg2);
550 tcg_gen_brcond_i32(cond, arg1, t0, label_index);
551 tcg_temp_free_i32(t0);
552}
553
554static inline void tcg_gen_mul_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
555{
556 tcg_gen_op3_i32(INDEX_op_mul_i32, ret, arg1, arg2);
557}
558
559static inline void tcg_gen_muli_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2)
560{
561 TCGv_i32 t0 = tcg_const_i32(arg2);
562 tcg_gen_mul_i32(ret, arg1, t0);
563 tcg_temp_free_i32(t0);
564}
565
566#ifdef TCG_TARGET_HAS_div_i32
567static inline void tcg_gen_div_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
568{
569 tcg_gen_op3_i32(INDEX_op_div_i32, ret, arg1, arg2);
570}
571
572static inline void tcg_gen_rem_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
573{
574 tcg_gen_op3_i32(INDEX_op_rem_i32, ret, arg1, arg2);
575}
576
577static inline void tcg_gen_divu_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
578{
579 tcg_gen_op3_i32(INDEX_op_divu_i32, ret, arg1, arg2);
580}
581
582static inline void tcg_gen_remu_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
583{
584 tcg_gen_op3_i32(INDEX_op_remu_i32, ret, arg1, arg2);
585}
586#else
587static inline void tcg_gen_div_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
588{
589 TCGv_i32 t0;
590 t0 = tcg_temp_new_i32();
591 tcg_gen_sari_i32(t0, arg1, 31);
592 tcg_gen_op5_i32(INDEX_op_div2_i32, ret, t0, arg1, t0, arg2);
593 tcg_temp_free_i32(t0);
594}
595
596static inline void tcg_gen_rem_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
597{
598 TCGv_i32 t0;
599 t0 = tcg_temp_new_i32();
600 tcg_gen_sari_i32(t0, arg1, 31);
601 tcg_gen_op5_i32(INDEX_op_div2_i32, t0, ret, arg1, t0, arg2);
602 tcg_temp_free_i32(t0);
603}
604
605static inline void tcg_gen_divu_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
606{
607 TCGv_i32 t0;
608 t0 = tcg_temp_new_i32();
609 tcg_gen_movi_i32(t0, 0);
610 tcg_gen_op5_i32(INDEX_op_divu2_i32, ret, t0, arg1, t0, arg2);
611 tcg_temp_free_i32(t0);
612}
613
614static inline void tcg_gen_remu_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
615{
616 TCGv_i32 t0;
617 t0 = tcg_temp_new_i32();
618 tcg_gen_movi_i32(t0, 0);
619 tcg_gen_op5_i32(INDEX_op_divu2_i32, t0, ret, arg1, t0, arg2);
620 tcg_temp_free_i32(t0);
621}
622#endif
623
624#if TCG_TARGET_REG_BITS == 32
625
626static inline void tcg_gen_mov_i64(TCGv_i64 ret, TCGv_i64 arg)
627{
628 if (GET_TCGV_I64(ret) != GET_TCGV_I64(arg)) {
629 tcg_gen_mov_i32(TCGV_LOW(ret), TCGV_LOW(arg));
630 tcg_gen_mov_i32(TCGV_HIGH(ret), TCGV_HIGH(arg));
631 }
632}
633
634static inline void tcg_gen_movi_i64(TCGv_i64 ret, int64_t arg)
635{
636 tcg_gen_movi_i32(TCGV_LOW(ret), arg);
637 tcg_gen_movi_i32(TCGV_HIGH(ret), arg >> 32);
638}
639
640static inline void tcg_gen_ld8u_i64(TCGv_i64 ret, TCGv_ptr arg2,
641 tcg_target_long offset)
642{
643 tcg_gen_ld8u_i32(TCGV_LOW(ret), arg2, offset);
644 tcg_gen_movi_i32(TCGV_HIGH(ret), 0);
645}
646
647static inline void tcg_gen_ld8s_i64(TCGv_i64 ret, TCGv_ptr arg2,
648 tcg_target_long offset)
649{
650 tcg_gen_ld8s_i32(TCGV_LOW(ret), arg2, offset);
651 tcg_gen_sari_i32(TCGV_HIGH(ret), TCGV_HIGH(ret), 31);
652}
653
654static inline void tcg_gen_ld16u_i64(TCGv_i64 ret, TCGv_ptr arg2,
655 tcg_target_long offset)
656{
657 tcg_gen_ld16u_i32(TCGV_LOW(ret), arg2, offset);
658 tcg_gen_movi_i32(TCGV_HIGH(ret), 0);
659}
660
661static inline void tcg_gen_ld16s_i64(TCGv_i64 ret, TCGv_ptr arg2,
662 tcg_target_long offset)
663{
664 tcg_gen_ld16s_i32(TCGV_LOW(ret), arg2, offset);
665 tcg_gen_sari_i32(TCGV_HIGH(ret), TCGV_LOW(ret), 31);
666}
667
668static inline void tcg_gen_ld32u_i64(TCGv_i64 ret, TCGv_ptr arg2,
669 tcg_target_long offset)
670{
671 tcg_gen_ld_i32(TCGV_LOW(ret), arg2, offset);
672 tcg_gen_movi_i32(TCGV_HIGH(ret), 0);
673}
674
675static inline void tcg_gen_ld32s_i64(TCGv_i64 ret, TCGv_ptr arg2,
676 tcg_target_long offset)
677{
678 tcg_gen_ld_i32(TCGV_LOW(ret), arg2, offset);
679 tcg_gen_sari_i32(TCGV_HIGH(ret), TCGV_LOW(ret), 31);
680}
681
682static inline void tcg_gen_ld_i64(TCGv_i64 ret, TCGv_ptr arg2,
683 tcg_target_long offset)
684{
685 /* since arg2 and ret have different types, they cannot be the
686 same temporary */
687#ifdef TCG_TARGET_WORDS_BIGENDIAN
688 tcg_gen_ld_i32(TCGV_HIGH(ret), arg2, offset);
689 tcg_gen_ld_i32(TCGV_LOW(ret), arg2, offset + 4);
690#else
691 tcg_gen_ld_i32(TCGV_LOW(ret), arg2, offset);
692 tcg_gen_ld_i32(TCGV_HIGH(ret), arg2, offset + 4);
693#endif
694}
695
696static inline void tcg_gen_st8_i64(TCGv_i64 arg1, TCGv_ptr arg2,
697 tcg_target_long offset)
698{
699 tcg_gen_st8_i32(TCGV_LOW(arg1), arg2, offset);
700}
701
702static inline void tcg_gen_st16_i64(TCGv_i64 arg1, TCGv_ptr arg2,
703 tcg_target_long offset)
704{
705 tcg_gen_st16_i32(TCGV_LOW(arg1), arg2, offset);
706}
707
708static inline void tcg_gen_st32_i64(TCGv_i64 arg1, TCGv_ptr arg2,
709 tcg_target_long offset)
710{
711 tcg_gen_st_i32(TCGV_LOW(arg1), arg2, offset);
712}
713
714static inline void tcg_gen_st_i64(TCGv_i64 arg1, TCGv_ptr arg2,
715 tcg_target_long offset)
716{
717#ifdef TCG_TARGET_WORDS_BIGENDIAN
718 tcg_gen_st_i32(TCGV_HIGH(arg1), arg2, offset);
719 tcg_gen_st_i32(TCGV_LOW(arg1), arg2, offset + 4);
720#else
721 tcg_gen_st_i32(TCGV_LOW(arg1), arg2, offset);
722 tcg_gen_st_i32(TCGV_HIGH(arg1), arg2, offset + 4);
723#endif
724}
725
726static inline void tcg_gen_add_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
727{
728 tcg_gen_op6_i32(INDEX_op_add2_i32, TCGV_LOW(ret), TCGV_HIGH(ret),
729 TCGV_LOW(arg1), TCGV_HIGH(arg1), TCGV_LOW(arg2),
730 TCGV_HIGH(arg2));
731}
732
733static inline void tcg_gen_sub_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
734{
735 tcg_gen_op6_i32(INDEX_op_sub2_i32, TCGV_LOW(ret), TCGV_HIGH(ret),
736 TCGV_LOW(arg1), TCGV_HIGH(arg1), TCGV_LOW(arg2),
737 TCGV_HIGH(arg2));
738}
739
740static inline void tcg_gen_and_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
741{
742 tcg_gen_and_i32(TCGV_LOW(ret), TCGV_LOW(arg1), TCGV_LOW(arg2));
743 tcg_gen_and_i32(TCGV_HIGH(ret), TCGV_HIGH(arg1), TCGV_HIGH(arg2));
744}
745
746static inline void tcg_gen_andi_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
747{
748 tcg_gen_andi_i32(TCGV_LOW(ret), TCGV_LOW(arg1), arg2);
749 tcg_gen_andi_i32(TCGV_HIGH(ret), TCGV_HIGH(arg1), arg2 >> 32);
750}
751
752static inline void tcg_gen_or_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
753{
754 tcg_gen_or_i32(TCGV_LOW(ret), TCGV_LOW(arg1), TCGV_LOW(arg2));
755 tcg_gen_or_i32(TCGV_HIGH(ret), TCGV_HIGH(arg1), TCGV_HIGH(arg2));
756}
757
758static inline void tcg_gen_ori_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
759{
760 tcg_gen_ori_i32(TCGV_LOW(ret), TCGV_LOW(arg1), arg2);
761 tcg_gen_ori_i32(TCGV_HIGH(ret), TCGV_HIGH(arg1), arg2 >> 32);
762}
763
764static inline void tcg_gen_xor_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
765{
766 tcg_gen_xor_i32(TCGV_LOW(ret), TCGV_LOW(arg1), TCGV_LOW(arg2));
767 tcg_gen_xor_i32(TCGV_HIGH(ret), TCGV_HIGH(arg1), TCGV_HIGH(arg2));
768}
769
770static inline void tcg_gen_xori_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
771{
772 tcg_gen_xori_i32(TCGV_LOW(ret), TCGV_LOW(arg1), arg2);
773 tcg_gen_xori_i32(TCGV_HIGH(ret), TCGV_HIGH(arg1), arg2 >> 32);
774}
775
776/* XXX: use generic code when basic block handling is OK or CPU
777 specific code (x86) */
778static inline void tcg_gen_shl_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
779{
780 tcg_gen_helper64(tcg_helper_shl_i64, ret, arg1, arg2);
781}
782
783static inline void tcg_gen_shli_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
784{
785 tcg_gen_shifti_i64(ret, arg1, arg2, 0, 0);
786}
787
788static inline void tcg_gen_shr_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
789{
790 tcg_gen_helper64(tcg_helper_shr_i64, ret, arg1, arg2);
791}
792
793static inline void tcg_gen_shri_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
794{
795 tcg_gen_shifti_i64(ret, arg1, arg2, 1, 0);
796}
797
798static inline void tcg_gen_sar_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
799{
800 tcg_gen_helper64(tcg_helper_sar_i64, ret, arg1, arg2);
801}
802
803static inline void tcg_gen_sari_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
804{
805 tcg_gen_shifti_i64(ret, arg1, arg2, 1, 1);
806}
807
808static inline void tcg_gen_brcond_i64(int cond, TCGv_i64 arg1, TCGv_i64 arg2,
809 int label_index)
810{
811 tcg_gen_op6ii_i32(INDEX_op_brcond2_i32,
812 TCGV_LOW(arg1), TCGV_HIGH(arg1), TCGV_LOW(arg2),
813 TCGV_HIGH(arg2), cond, label_index);
814}
815
816static inline void tcg_gen_mul_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
817{
818 TCGv_i64 t0;
819 TCGv_i32 t1;
820
821 t0 = tcg_temp_new_i64();
822 t1 = tcg_temp_new_i32();
823
824 tcg_gen_op4_i32(INDEX_op_mulu2_i32, TCGV_LOW(t0), TCGV_HIGH(t0),
825 TCGV_LOW(arg1), TCGV_LOW(arg2));
826
827 tcg_gen_mul_i32(t1, TCGV_LOW(arg1), TCGV_HIGH(arg2));
828 tcg_gen_add_i32(TCGV_HIGH(t0), TCGV_HIGH(t0), t1);
829 tcg_gen_mul_i32(t1, TCGV_HIGH(arg1), TCGV_LOW(arg2));
830 tcg_gen_add_i32(TCGV_HIGH(t0), TCGV_HIGH(t0), t1);
831
832 tcg_gen_mov_i64(ret, t0);
833 tcg_temp_free_i64(t0);
834 tcg_temp_free_i32(t1);
835}
836
837static inline void tcg_gen_div_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
838{
839 tcg_gen_helper64(tcg_helper_div_i64, ret, arg1, arg2);
840}
841
842static inline void tcg_gen_rem_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
843{
844 tcg_gen_helper64(tcg_helper_rem_i64, ret, arg1, arg2);
845}
846
847static inline void tcg_gen_divu_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
848{
849 tcg_gen_helper64(tcg_helper_divu_i64, ret, arg1, arg2);
850}
851
852static inline void tcg_gen_remu_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
853{
854 tcg_gen_helper64(tcg_helper_remu_i64, ret, arg1, arg2);
855}
856
857#else
858
859static inline void tcg_gen_mov_i64(TCGv_i64 ret, TCGv_i64 arg)
860{
861 if (GET_TCGV_I64(ret) != GET_TCGV_I64(arg))
862 tcg_gen_op2_i64(INDEX_op_mov_i64, ret, arg);
863}
864
865static inline void tcg_gen_movi_i64(TCGv_i64 ret, int64_t arg)
866{
867 tcg_gen_op2i_i64(INDEX_op_movi_i64, ret, arg);
868}
869
870static inline void tcg_gen_ld8u_i64(TCGv_i64 ret, TCGv_i64 arg2,
871 tcg_target_long offset)
872{
873 tcg_gen_ldst_op_i64(INDEX_op_ld8u_i64, ret, arg2, offset);
874}
875
876static inline void tcg_gen_ld8s_i64(TCGv_i64 ret, TCGv_i64 arg2,
877 tcg_target_long offset)
878{
879 tcg_gen_ldst_op_i64(INDEX_op_ld8s_i64, ret, arg2, offset);
880}
881
882static inline void tcg_gen_ld16u_i64(TCGv_i64 ret, TCGv_i64 arg2,
883 tcg_target_long offset)
884{
885 tcg_gen_ldst_op_i64(INDEX_op_ld16u_i64, ret, arg2, offset);
886}
887
888static inline void tcg_gen_ld16s_i64(TCGv_i64 ret, TCGv_i64 arg2,
889 tcg_target_long offset)
890{
891 tcg_gen_ldst_op_i64(INDEX_op_ld16s_i64, ret, arg2, offset);
892}
893
894static inline void tcg_gen_ld32u_i64(TCGv_i64 ret, TCGv_i64 arg2,
895 tcg_target_long offset)
896{
897 tcg_gen_ldst_op_i64(INDEX_op_ld32u_i64, ret, arg2, offset);
898}
899
900static inline void tcg_gen_ld32s_i64(TCGv_i64 ret, TCGv_i64 arg2,
901 tcg_target_long offset)
902{
903 tcg_gen_ldst_op_i64(INDEX_op_ld32s_i64, ret, arg2, offset);
904}
905
906static inline void tcg_gen_ld_i64(TCGv_i64 ret, TCGv_i64 arg2, tcg_target_long offset)
907{
908 tcg_gen_ldst_op_i64(INDEX_op_ld_i64, ret, arg2, offset);
909}
910
911static inline void tcg_gen_st8_i64(TCGv_i64 arg1, TCGv_i64 arg2,
912 tcg_target_long offset)
913{
914 tcg_gen_ldst_op_i64(INDEX_op_st8_i64, arg1, arg2, offset);
915}
916
917static inline void tcg_gen_st16_i64(TCGv_i64 arg1, TCGv_i64 arg2,
918 tcg_target_long offset)
919{
920 tcg_gen_ldst_op_i64(INDEX_op_st16_i64, arg1, arg2, offset);
921}
922
923static inline void tcg_gen_st32_i64(TCGv_i64 arg1, TCGv_i64 arg2,
924 tcg_target_long offset)
925{
926 tcg_gen_ldst_op_i64(INDEX_op_st32_i64, arg1, arg2, offset);
927}
928
929static inline void tcg_gen_st_i64(TCGv_i64 arg1, TCGv_i64 arg2, tcg_target_long offset)
930{
931 tcg_gen_ldst_op_i64(INDEX_op_st_i64, arg1, arg2, offset);
932}
933
934static inline void tcg_gen_add_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
935{
936 tcg_gen_op3_i64(INDEX_op_add_i64, ret, arg1, arg2);
937}
938
939static inline void tcg_gen_sub_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
940{
941 tcg_gen_op3_i64(INDEX_op_sub_i64, ret, arg1, arg2);
942}
943
944static inline void tcg_gen_and_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
945{
946 tcg_gen_op3_i64(INDEX_op_and_i64, ret, arg1, arg2);
947}
948
949static inline void tcg_gen_andi_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
950{
951 TCGv_i64 t0 = tcg_const_i64(arg2);
952 tcg_gen_and_i64(ret, arg1, t0);
953 tcg_temp_free_i64(t0);
954}
955
956static inline void tcg_gen_or_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
957{
958 tcg_gen_op3_i64(INDEX_op_or_i64, ret, arg1, arg2);
959}
960
961static inline void tcg_gen_ori_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
962{
963 TCGv_i64 t0 = tcg_const_i64(arg2);
964 tcg_gen_or_i64(ret, arg1, t0);
965 tcg_temp_free_i64(t0);
966}
967
968static inline void tcg_gen_xor_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
969{
970 tcg_gen_op3_i64(INDEX_op_xor_i64, ret, arg1, arg2);
971}
972
973static inline void tcg_gen_xori_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
974{
975 TCGv_i64 t0 = tcg_const_i64(arg2);
976 tcg_gen_xor_i64(ret, arg1, t0);
977 tcg_temp_free_i64(t0);
978}
979
980static inline void tcg_gen_shl_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
981{
982 tcg_gen_op3_i64(INDEX_op_shl_i64, ret, arg1, arg2);
983}
984
985static inline void tcg_gen_shli_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
986{
987 if (arg2 == 0) {
988 tcg_gen_mov_i64(ret, arg1);
989 } else {
990 TCGv_i64 t0 = tcg_const_i64(arg2);
991 tcg_gen_shl_i64(ret, arg1, t0);
992 tcg_temp_free_i64(t0);
993 }
994}
995
996static inline void tcg_gen_shr_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
997{
998 tcg_gen_op3_i64(INDEX_op_shr_i64, ret, arg1, arg2);
999}
1000
1001static inline void tcg_gen_shri_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
1002{
1003 if (arg2 == 0) {
1004 tcg_gen_mov_i64(ret, arg1);
1005 } else {
1006 TCGv_i64 t0 = tcg_const_i64(arg2);
1007 tcg_gen_shr_i64(ret, arg1, t0);
1008 tcg_temp_free_i64(t0);
1009 }
1010}
1011
1012static inline void tcg_gen_sar_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1013{
1014 tcg_gen_op3_i64(INDEX_op_sar_i64, ret, arg1, arg2);
1015}
1016
1017static inline void tcg_gen_sari_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
1018{
1019 if (arg2 == 0) {
1020 tcg_gen_mov_i64(ret, arg1);
1021 } else {
1022 TCGv_i64 t0 = tcg_const_i64(arg2);
1023 tcg_gen_sar_i64(ret, arg1, t0);
1024 tcg_temp_free_i64(t0);
1025 }
1026}
1027
1028static inline void tcg_gen_brcond_i64(int cond, TCGv_i64 arg1, TCGv_i64 arg2,
1029 int label_index)
1030{
1031 tcg_gen_op4ii_i64(INDEX_op_brcond_i64, arg1, arg2, cond, label_index);
1032}
1033
1034static inline void tcg_gen_mul_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1035{
1036 tcg_gen_op3_i64(INDEX_op_mul_i64, ret, arg1, arg2);
1037}
1038
1039#ifdef TCG_TARGET_HAS_div_i64
1040static inline void tcg_gen_div_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1041{
1042 tcg_gen_op3_i64(INDEX_op_div_i64, ret, arg1, arg2);
1043}
1044
1045static inline void tcg_gen_rem_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1046{
1047 tcg_gen_op3_i64(INDEX_op_rem_i64, ret, arg1, arg2);
1048}
1049
1050static inline void tcg_gen_divu_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1051{
1052 tcg_gen_op3_i64(INDEX_op_divu_i64, ret, arg1, arg2);
1053}
1054
1055static inline void tcg_gen_remu_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1056{
1057 tcg_gen_op3_i64(INDEX_op_remu_i64, ret, arg1, arg2);
1058}
1059#else
1060static inline void tcg_gen_div_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1061{
1062 TCGv_i64 t0;
1063 t0 = tcg_temp_new_i64();
1064 tcg_gen_sari_i64(t0, arg1, 63);
1065 tcg_gen_op5_i64(INDEX_op_div2_i64, ret, t0, arg1, t0, arg2);
1066 tcg_temp_free_i64(t0);
1067}
1068
1069static inline void tcg_gen_rem_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1070{
1071 TCGv_i64 t0;
1072 t0 = tcg_temp_new_i64();
1073 tcg_gen_sari_i64(t0, arg1, 63);
1074 tcg_gen_op5_i64(INDEX_op_div2_i64, t0, ret, arg1, t0, arg2);
1075 tcg_temp_free_i64(t0);
1076}
1077
1078static inline void tcg_gen_divu_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1079{
1080 TCGv_i64 t0;
1081 t0 = tcg_temp_new_i64();
1082 tcg_gen_movi_i64(t0, 0);
1083 tcg_gen_op5_i64(INDEX_op_divu2_i64, ret, t0, arg1, t0, arg2);
1084 tcg_temp_free_i64(t0);
1085}
1086
1087static inline void tcg_gen_remu_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1088{
1089 TCGv_i64 t0;
1090 t0 = tcg_temp_new_i64();
1091 tcg_gen_movi_i64(t0, 0);
1092 tcg_gen_op5_i64(INDEX_op_divu2_i64, t0, ret, arg1, t0, arg2);
1093 tcg_temp_free_i64(t0);
1094}
1095#endif
1096
1097#endif
1098
1099static inline void tcg_gen_addi_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
1100{
1101 /* some cases can be optimized here */
1102 if (arg2 == 0) {
1103 tcg_gen_mov_i64(ret, arg1);
1104 } else {
1105 TCGv_i64 t0 = tcg_const_i64(arg2);
1106 tcg_gen_add_i64(ret, arg1, t0);
1107 tcg_temp_free_i64(t0);
1108 }
1109}
1110
1111static inline void tcg_gen_subfi_i64(TCGv_i64 ret, int64_t arg1, TCGv_i64 arg2)
1112{
1113 TCGv_i64 t0 = tcg_const_i64(arg1);
1114 tcg_gen_sub_i64(ret, t0, arg2);
1115 tcg_temp_free_i64(t0);
1116}
1117
1118static inline void tcg_gen_subi_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
1119{
1120 /* some cases can be optimized here */
1121 if (arg2 == 0) {
1122 tcg_gen_mov_i64(ret, arg1);
1123 } else {
1124 TCGv_i64 t0 = tcg_const_i64(arg2);
1125 tcg_gen_sub_i64(ret, arg1, t0);
1126 tcg_temp_free_i64(t0);
1127 }
1128}
1129static inline void tcg_gen_brcondi_i64(int cond, TCGv_i64 arg1, int64_t arg2,
1130 int label_index)
1131{
1132 TCGv_i64 t0 = tcg_const_i64(arg2);
1133 tcg_gen_brcond_i64(cond, arg1, t0, label_index);
1134 tcg_temp_free_i64(t0);
1135}
1136
1137static inline void tcg_gen_muli_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
1138{
1139 TCGv_i64 t0 = tcg_const_i64(arg2);
1140 tcg_gen_mul_i64(ret, arg1, t0);
1141 tcg_temp_free_i64(t0);
1142}
1143
1144
1145/***************************************/
1146/* optional operations */
1147
1148static inline void tcg_gen_ext8s_i32(TCGv_i32 ret, TCGv_i32 arg)
1149{
1150#ifdef TCG_TARGET_HAS_ext8s_i32
1151 tcg_gen_op2_i32(INDEX_op_ext8s_i32, ret, arg);
1152#else
1153 tcg_gen_shli_i32(ret, arg, 24);
1154 tcg_gen_sari_i32(ret, ret, 24);
1155#endif
1156}
1157
1158static inline void tcg_gen_ext16s_i32(TCGv_i32 ret, TCGv_i32 arg)
1159{
1160#ifdef TCG_TARGET_HAS_ext16s_i32
1161 tcg_gen_op2_i32(INDEX_op_ext16s_i32, ret, arg);
1162#else
1163 tcg_gen_shli_i32(ret, arg, 16);
1164 tcg_gen_sari_i32(ret, ret, 16);
1165#endif
1166}
1167
1168/* These are currently just for convenience.
1169 We assume a target will recognise these automatically . */
1170static inline void tcg_gen_ext8u_i32(TCGv_i32 ret, TCGv_i32 arg)
1171{
1172 tcg_gen_andi_i32(ret, arg, 0xffu);
1173}
1174
1175static inline void tcg_gen_ext16u_i32(TCGv_i32 ret, TCGv_i32 arg)
1176{
1177 tcg_gen_andi_i32(ret, arg, 0xffffu);
1178}
1179
1180/* Note: we assume the two high bytes are set to zero */
1181static inline void tcg_gen_bswap16_i32(TCGv_i32 ret, TCGv_i32 arg)
1182{
1183#ifdef TCG_TARGET_HAS_bswap16_i32
1184 tcg_gen_op2_i32(INDEX_op_bswap16_i32, ret, arg);
1185#else
1186 TCGv_i32 t0, t1;
1187 t0 = tcg_temp_new_i32();
1188 t1 = tcg_temp_new_i32();
1189
1190 tcg_gen_shri_i32(t0, arg, 8);
1191 tcg_gen_andi_i32(t1, arg, 0x000000ff);
1192 tcg_gen_shli_i32(t1, t1, 8);
1193 tcg_gen_or_i32(ret, t0, t1);
1194 tcg_temp_free_i32(t0);
1195 tcg_temp_free_i32(t1);
1196#endif
1197}
1198
1199static inline void tcg_gen_bswap_i32(TCGv_i32 ret, TCGv_i32 arg)
1200{
1201#ifdef TCG_TARGET_HAS_bswap_i32
1202 tcg_gen_op2_i32(INDEX_op_bswap_i32, ret, arg);
1203#else
1204 TCGv_i32 t0, t1;
1205 t0 = tcg_temp_new_i32();
1206 t1 = tcg_temp_new_i32();
1207
1208 tcg_gen_shli_i32(t0, arg, 24);
1209
1210 tcg_gen_andi_i32(t1, arg, 0x0000ff00);
1211 tcg_gen_shli_i32(t1, t1, 8);
1212 tcg_gen_or_i32(t0, t0, t1);
1213
1214 tcg_gen_shri_i32(t1, arg, 8);
1215 tcg_gen_andi_i32(t1, t1, 0x0000ff00);
1216 tcg_gen_or_i32(t0, t0, t1);
1217
1218 tcg_gen_shri_i32(t1, arg, 24);
1219 tcg_gen_or_i32(ret, t0, t1);
1220 tcg_temp_free_i32(t0);
1221 tcg_temp_free_i32(t1);
1222#endif
1223}
1224
1225#if TCG_TARGET_REG_BITS == 32
1226static inline void tcg_gen_ext8s_i64(TCGv_i64 ret, TCGv_i64 arg)
1227{
1228 tcg_gen_ext8s_i32(TCGV_LOW(ret), TCGV_LOW(arg));
1229 tcg_gen_sari_i32(TCGV_HIGH(ret), TCGV_LOW(ret), 31);
1230}
1231
1232static inline void tcg_gen_ext16s_i64(TCGv_i64 ret, TCGv_i64 arg)
1233{
1234 tcg_gen_ext16s_i32(TCGV_LOW(ret), TCGV_LOW(arg));
1235 tcg_gen_sari_i32(TCGV_HIGH(ret), TCGV_LOW(ret), 31);
1236}
1237
1238static inline void tcg_gen_ext32s_i64(TCGv_i64 ret, TCGv_i64 arg)
1239{
1240 tcg_gen_mov_i32(TCGV_LOW(ret), TCGV_LOW(arg));
1241 tcg_gen_sari_i32(TCGV_HIGH(ret), TCGV_LOW(ret), 31);
1242}
1243
1244static inline void tcg_gen_ext8u_i64(TCGv_i64 ret, TCGv_i64 arg)
1245{
1246 tcg_gen_ext8u_i32(TCGV_LOW(ret), TCGV_LOW(arg));
1247 tcg_gen_movi_i32(TCGV_HIGH(ret), 0);
1248}
1249
1250static inline void tcg_gen_ext16u_i64(TCGv_i64 ret, TCGv_i64 arg)
1251{
1252 tcg_gen_ext16u_i32(TCGV_LOW(ret), TCGV_LOW(arg));
1253 tcg_gen_movi_i32(TCGV_HIGH(ret), 0);
1254}
1255
1256static inline void tcg_gen_ext32u_i64(TCGv_i64 ret, TCGv_i64 arg)
1257{
1258 tcg_gen_mov_i32(TCGV_LOW(ret), TCGV_LOW(arg));
1259 tcg_gen_movi_i32(TCGV_HIGH(ret), 0);
1260}
1261
1262static inline void tcg_gen_trunc_i64_i32(TCGv_i32 ret, TCGv_i64 arg)
1263{
1264 tcg_gen_mov_i32(ret, TCGV_LOW(arg));
1265}
1266
1267static inline void tcg_gen_extu_i32_i64(TCGv_i64 ret, TCGv_i32 arg)
1268{
1269 tcg_gen_mov_i32(TCGV_LOW(ret), arg);
1270 tcg_gen_movi_i32(TCGV_HIGH(ret), 0);
1271}
1272
1273static inline void tcg_gen_ext_i32_i64(TCGv_i64 ret, TCGv_i32 arg)
1274{
1275 tcg_gen_mov_i32(TCGV_LOW(ret), arg);
1276 tcg_gen_sari_i32(TCGV_HIGH(ret), TCGV_LOW(ret), 31);
1277}
1278
1279static inline void tcg_gen_bswap_i64(TCGv_i64 ret, TCGv_i64 arg)
1280{
1281 TCGv_i32 t0, t1;
1282 t0 = tcg_temp_new_i32();
1283 t1 = tcg_temp_new_i32();
1284
1285 tcg_gen_bswap_i32(t0, TCGV_LOW(arg));
1286 tcg_gen_bswap_i32(t1, TCGV_HIGH(arg));
1287 tcg_gen_mov_i32(TCGV_LOW(ret), t1);
1288 tcg_gen_mov_i32(TCGV_HIGH(ret), t0);
1289 tcg_temp_free_i32(t0);
1290 tcg_temp_free_i32(t1);
1291}
1292#else
1293
1294static inline void tcg_gen_ext8s_i64(TCGv_i64 ret, TCGv_i64 arg)
1295{
1296#ifdef TCG_TARGET_HAS_ext8s_i64
1297 tcg_gen_op2_i64(INDEX_op_ext8s_i64, ret, arg);
1298#else
1299 tcg_gen_shli_i64(ret, arg, 56);
1300 tcg_gen_sari_i64(ret, ret, 56);
1301#endif
1302}
1303
1304static inline void tcg_gen_ext16s_i64(TCGv_i64 ret, TCGv_i64 arg)
1305{
1306#ifdef TCG_TARGET_HAS_ext16s_i64
1307 tcg_gen_op2_i64(INDEX_op_ext16s_i64, ret, arg);
1308#else
1309 tcg_gen_shli_i64(ret, arg, 48);
1310 tcg_gen_sari_i64(ret, ret, 48);
1311#endif
1312}
1313
1314static inline void tcg_gen_ext32s_i64(TCGv_i64 ret, TCGv_i64 arg)
1315{
1316#ifdef TCG_TARGET_HAS_ext32s_i64
1317 tcg_gen_op2_i64(INDEX_op_ext32s_i64, ret, arg);
1318#else
1319 tcg_gen_shli_i64(ret, arg, 32);
1320 tcg_gen_sari_i64(ret, ret, 32);
1321#endif
1322}
1323
1324static inline void tcg_gen_ext8u_i64(TCGv_i64 ret, TCGv_i64 arg)
1325{
1326 tcg_gen_andi_i64(ret, arg, 0xffu);
1327}
1328
1329static inline void tcg_gen_ext16u_i64(TCGv_i64 ret, TCGv_i64 arg)
1330{
1331 tcg_gen_andi_i64(ret, arg, 0xffffu);
1332}
1333
1334static inline void tcg_gen_ext32u_i64(TCGv_i64 ret, TCGv_i64 arg)
1335{
1336 tcg_gen_andi_i64(ret, arg, 0xffffffffu);
1337}
1338
1339/* Note: we assume the target supports move between 32 and 64 bit
1340 registers. This will probably break MIPS64 targets. */
1341static inline void tcg_gen_trunc_i64_i32(TCGv_i32 ret, TCGv_i64 arg)
1342{
1343 tcg_gen_mov_i32(ret, MAKE_TCGV_I32(GET_TCGV_I64(arg)));
1344}
1345
1346/* Note: we assume the target supports move between 32 and 64 bit
1347 registers */
1348static inline void tcg_gen_extu_i32_i64(TCGv_i64 ret, TCGv_i32 arg)
1349{
1350 tcg_gen_andi_i64(ret, MAKE_TCGV_I64(GET_TCGV_I32(arg)), 0xffffffffu);
1351}
1352
1353/* Note: we assume the target supports move between 32 and 64 bit
1354 registers */
1355static inline void tcg_gen_ext_i32_i64(TCGv_i64 ret, TCGv_i32 arg)
1356{
1357 tcg_gen_ext32s_i64(ret, MAKE_TCGV_I64(GET_TCGV_I32(arg)));
1358}
1359
1360static inline void tcg_gen_bswap_i64(TCGv_i64 ret, TCGv_i64 arg)
1361{
1362#ifdef TCG_TARGET_HAS_bswap_i64
1363 tcg_gen_op2_i64(INDEX_op_bswap_i64, ret, arg);
1364#else
1365 TCGv_i32 t0, t1;
1366 t0 = tcg_temp_new_i32();
1367 t1 = tcg_temp_new_i32();
1368
1369 tcg_gen_shli_i64(t0, arg, 56);
1370
1371 tcg_gen_andi_i64(t1, arg, 0x0000ff00);
1372 tcg_gen_shli_i64(t1, t1, 40);
1373 tcg_gen_or_i64(t0, t0, t1);
1374
1375 tcg_gen_andi_i64(t1, arg, 0x00ff0000);
1376 tcg_gen_shli_i64(t1, t1, 24);
1377 tcg_gen_or_i64(t0, t0, t1);
1378
1379 tcg_gen_andi_i64(t1, arg, 0xff000000);
1380 tcg_gen_shli_i64(t1, t1, 8);
1381 tcg_gen_or_i64(t0, t0, t1);
1382
1383 tcg_gen_shri_i64(t1, arg, 8);
1384 tcg_gen_andi_i64(t1, t1, 0xff000000);
1385 tcg_gen_or_i64(t0, t0, t1);
1386
1387 tcg_gen_shri_i64(t1, arg, 24);
1388 tcg_gen_andi_i64(t1, t1, 0x00ff0000);
1389 tcg_gen_or_i64(t0, t0, t1);
1390
1391 tcg_gen_shri_i64(t1, arg, 40);
1392 tcg_gen_andi_i64(t1, t1, 0x0000ff00);
1393 tcg_gen_or_i64(t0, t0, t1);
1394
1395 tcg_gen_shri_i64(t1, arg, 56);
1396 tcg_gen_or_i64(ret, t0, t1);
1397 tcg_temp_free_i32(t0);
1398 tcg_temp_free_i32(t1);
1399#endif
1400}
1401
1402#endif
1403
1404static inline void tcg_gen_neg_i32(TCGv_i32 ret, TCGv_i32 arg)
1405{
1406#ifdef TCG_TARGET_HAS_neg_i32
1407 tcg_gen_op2_i32(INDEX_op_neg_i32, ret, arg);
1408#else
1409 TCGv_i32 t0 = tcg_const_i32(0);
1410 tcg_gen_sub_i32(ret, t0, arg);
1411 tcg_temp_free_i32(t0);
1412#endif
1413}
1414
1415static inline void tcg_gen_neg_i64(TCGv_i64 ret, TCGv_i64 arg)
1416{
1417#ifdef TCG_TARGET_HAS_neg_i64
1418 tcg_gen_op2_i64(INDEX_op_neg_i64, ret, arg);
1419#else
1420 TCGv_i64 t0 = tcg_const_i64(0);
1421 tcg_gen_sub_i64(ret, t0, arg);
1422 tcg_temp_free_i64(t0);
1423#endif
1424}
1425
1426static inline void tcg_gen_not_i32(TCGv_i32 ret, TCGv_i32 arg)
1427{
1428 tcg_gen_xori_i32(ret, arg, -1);
1429}
1430
1431static inline void tcg_gen_not_i64(TCGv_i64 ret, TCGv_i64 arg)
1432{
1433 tcg_gen_xori_i64(ret, arg, -1);
1434}
1435
1436static inline void tcg_gen_discard_i32(TCGv_i32 arg)
1437{
1438 tcg_gen_op1_i32(INDEX_op_discard, arg);
1439}
1440
1441#if TCG_TARGET_REG_BITS == 32
1442static inline void tcg_gen_discard_i64(TCGv_i64 arg)
1443{
1444 tcg_gen_discard_i32(TCGV_LOW(arg));
1445 tcg_gen_discard_i32(TCGV_HIGH(arg));
1446}
1447#else
1448static inline void tcg_gen_discard_i64(TCGv_i64 arg)
1449{
1450 tcg_gen_op1_i64(INDEX_op_discard, arg);
1451}
1452#endif
1453
1454static inline void tcg_gen_concat_i32_i64(TCGv_i64 dest, TCGv_i32 low, TCGv_i32 high)
1455{
1456#if TCG_TARGET_REG_BITS == 32
1457 tcg_gen_mov_i32(TCGV_LOW(dest), low);
1458 tcg_gen_mov_i32(TCGV_HIGH(dest), high);
1459#else
1460 TCGv_i64 tmp = tcg_temp_new_i64();
1461 /* This extension is only needed for type correctness.
1462 We may be able to do better given target specific information. */
1463 tcg_gen_extu_i32_i64(tmp, high);
1464 tcg_gen_shli_i64(tmp, tmp, 32);
1465 tcg_gen_extu_i32_i64(dest, low);
1466 tcg_gen_or_i64(dest, dest, tmp);
1467 tcg_temp_free_i64(tmp);
1468#endif
1469}
1470
1471static inline void tcg_gen_concat32_i64(TCGv_i64 dest, TCGv_i64 low, TCGv_i64 high)
1472{
1473#if TCG_TARGET_REG_BITS == 32
1474 tcg_gen_concat_i32_i64(dest, TCGV_LOW(low), TCGV_LOW(high));
1475#else
1476 TCGv_i64 tmp = tcg_temp_new_i64();
1477 tcg_gen_ext32u_i64(dest, low);
1478 tcg_gen_shli_i64(tmp, high, 32);
1479 tcg_gen_or_i64(dest, dest, tmp);
1480 tcg_temp_free_i64(tmp);
1481#endif
1482}
1483
1484static inline void tcg_gen_andc_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
1485{
1486 TCGv_i32 t0;
1487 t0 = tcg_temp_new_i32();
1488 tcg_gen_not_i32(t0, arg2);
1489 tcg_gen_and_i32(ret, arg1, t0);
1490 tcg_temp_free_i32(t0);
1491}
1492
1493static inline void tcg_gen_andc_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1494{
1495 TCGv_i64 t0;
1496 t0 = tcg_temp_new_i64();
1497 tcg_gen_not_i64(t0, arg2);
1498 tcg_gen_and_i64(ret, arg1, t0);
1499 tcg_temp_free_i64(t0);
1500}
1501
1502static inline void tcg_gen_eqv_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
1503{
1504 TCGv_i32 t0;
1505 t0 = tcg_temp_new_i32();
1506 tcg_gen_xor_i32(t0, arg1, arg2);
1507 tcg_gen_not_i32(ret, t0);
1508 tcg_temp_free_i32(t0);
1509}
1510
1511static inline void tcg_gen_eqv_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1512{
1513 TCGv_i64 t0;
1514 t0 = tcg_temp_new_i64();
1515 tcg_gen_xor_i64(t0, arg1, arg2);
1516 tcg_gen_not_i64(ret, t0);
1517 tcg_temp_free_i64(t0);
1518}
1519
1520static inline void tcg_gen_nand_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
1521{
1522 TCGv_i32 t0;
1523 t0 = tcg_temp_new_i32();
1524 tcg_gen_and_i32(t0, arg1, arg2);
1525 tcg_gen_not_i32(ret, t0);
1526 tcg_temp_free_i32(t0);
1527}
1528
1529static inline void tcg_gen_nand_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1530{
1531 TCGv_i64 t0;
1532 t0 = tcg_temp_new_i64();
1533 tcg_gen_and_i64(t0, arg1, arg2);
1534 tcg_gen_not_i64(ret, t0);
1535 tcg_temp_free_i64(t0);
1536}
1537
1538static inline void tcg_gen_nor_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
1539{
1540 TCGv_i32 t0;
1541 t0 = tcg_temp_new_i32();
1542 tcg_gen_or_i32(t0, arg1, arg2);
1543 tcg_gen_not_i32(ret, t0);
1544 tcg_temp_free_i32(t0);
1545}
1546
1547static inline void tcg_gen_nor_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1548{
1549 TCGv_i64 t0;
1550 t0 = tcg_temp_new_i64();
1551 tcg_gen_or_i64(t0, arg1, arg2);
1552 tcg_gen_not_i64(ret, t0);
1553 tcg_temp_free_i64(t0);
1554}
1555
1556static inline void tcg_gen_orc_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
1557{
1558 TCGv_i32 t0;
1559 t0 = tcg_temp_new_i32();
1560 tcg_gen_not_i32(t0, arg2);
1561 tcg_gen_or_i32(ret, arg1, t0);
1562 tcg_temp_free_i32(t0);
1563}
1564
1565static inline void tcg_gen_orc_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1566{
1567 TCGv_i64 t0;
1568 t0 = tcg_temp_new_i64();
1569 tcg_gen_not_i64(t0, arg2);
1570 tcg_gen_or_i64(ret, arg1, t0);
1571 tcg_temp_free_i64(t0);
1572}
1573
1574static inline void tcg_gen_rotl_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
1575{
1576 TCGv_i32 t0, t1;
1577
1578 t0 = tcg_temp_new_i32();
1579 t1 = tcg_temp_new_i32();
1580 tcg_gen_shl_i32(t0, arg1, arg2);
1581 tcg_gen_subfi_i32(t1, 32, arg2);
1582 tcg_gen_shr_i32(t1, arg1, t1);
1583 tcg_gen_or_i32(ret, t0, t1);
1584 tcg_temp_free_i32(t0);
1585 tcg_temp_free_i32(t1);
1586}
1587
1588static inline void tcg_gen_rotl_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1589{
1590 TCGv_i64 t0, t1;
1591
1592 t0 = tcg_temp_new_i64();
1593 t1 = tcg_temp_new_i64();
1594 tcg_gen_shl_i64(t0, arg1, arg2);
1595 tcg_gen_subfi_i64(t1, 64, arg2);
1596 tcg_gen_shr_i64(t1, arg1, t1);
1597 tcg_gen_or_i64(ret, t0, t1);
1598 tcg_temp_free_i64(t0);
1599 tcg_temp_free_i64(t1);
1600}
1601
1602static inline void tcg_gen_rotli_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2)
1603{
1604 /* some cases can be optimized here */
1605 if (arg2 == 0) {
1606 tcg_gen_mov_i32(ret, arg1);
1607 } else {
1608 TCGv_i32 t0, t1;
1609 t0 = tcg_temp_new_i32();
1610 t1 = tcg_temp_new_i32();
1611 tcg_gen_shli_i32(t0, arg1, arg2);
1612 tcg_gen_shri_i32(t1, arg1, 32 - arg2);
1613 tcg_gen_or_i32(ret, t0, t1);
1614 tcg_temp_free_i32(t0);
1615 tcg_temp_free_i32(t1);
1616 }
1617}
1618
1619static inline void tcg_gen_rotli_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
1620{
1621 /* some cases can be optimized here */
1622 if (arg2 == 0) {
1623 tcg_gen_mov_i64(ret, arg1);
1624 } else {
1625 TCGv_i64 t0, t1;
1626 t0 = tcg_temp_new_i64();
1627 t1 = tcg_temp_new_i64();
1628 tcg_gen_shli_i64(t0, arg1, arg2);
1629 tcg_gen_shri_i64(t1, arg1, 64 - arg2);
1630 tcg_gen_or_i64(ret, t0, t1);
1631 tcg_temp_free_i64(t0);
1632 tcg_temp_free_i64(t1);
1633 }
1634}
1635
1636static inline void tcg_gen_rotr_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
1637{
1638 TCGv_i32 t0, t1;
1639
1640 t0 = tcg_temp_new_i32();
1641 t1 = tcg_temp_new_i32();
1642 tcg_gen_shr_i32(t0, arg1, arg2);
1643 tcg_gen_subfi_i32(t1, 32, arg2);
1644 tcg_gen_shl_i32(t1, arg1, t1);
1645 tcg_gen_or_i32(ret, t0, t1);
1646 tcg_temp_free_i32(t0);
1647 tcg_temp_free_i32(t1);
1648}
1649
1650static inline void tcg_gen_rotr_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1651{
1652 TCGv_i64 t0, t1;
1653
1654 t0 = tcg_temp_new_i64();
1655 t1 = tcg_temp_new_i64();
1656 tcg_gen_shl_i64(t0, arg1, arg2);
1657 tcg_gen_subfi_i64(t1, 64, arg2);
1658 tcg_gen_shl_i64(t1, arg1, t1);
1659 tcg_gen_or_i64(ret, t0, t1);
1660 tcg_temp_free_i64(t0);
1661 tcg_temp_free_i64(t1);
1662}
1663
1664static inline void tcg_gen_rotri_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2)
1665{
1666 /* some cases can be optimized here */
1667 if (arg2 == 0) {
1668 tcg_gen_mov_i32(ret, arg1);
1669 } else {
1670 tcg_gen_rotli_i32(ret, arg1, 32 - arg2);
1671 }
1672}
1673
1674static inline void tcg_gen_rotri_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
1675{
1676 /* some cases can be optimized here */
1677 if (arg2 == 0) {
1678 tcg_gen_mov_i64(ret, arg1);
1679 } else {
1680 tcg_gen_rotli_i64(ret, arg1, 64 - arg2);
1681 }
1682}
1683
1684/***************************************/
1685/* QEMU specific operations. Their type depend on the QEMU CPU
1686 type. */
1687#ifndef TARGET_LONG_BITS
1688#error must include QEMU headers
1689#endif
1690
1691#if TARGET_LONG_BITS == 32
1692#define TCGv TCGv_i32
1693#define tcg_temp_new() tcg_temp_new_i32()
1694#define tcg_global_reg_new tcg_global_reg_new_i32
1695#define tcg_global_mem_new tcg_global_mem_new_i32
1696#define tcg_temp_local_new() tcg_temp_local_new_i32()
1697#define tcg_temp_free tcg_temp_free_i32
1698#define tcg_gen_qemu_ldst_op tcg_gen_op3i_i32
1699#define tcg_gen_qemu_ldst_op_i64 tcg_gen_qemu_ldst_op_i64_i32
1700#define TCGV_UNUSED(x) TCGV_UNUSED_I32(x)
1701#define TCGV_EQUAL(a, b) (GET_TCGV_I32(a) == GET_TCGV_I32(b))
1702#else
1703#define TCGv TCGv_i64
1704#define tcg_temp_new() tcg_temp_new_i64()
1705#define tcg_global_reg_new tcg_global_reg_new_i64
1706#define tcg_global_mem_new tcg_global_mem_new_i64
1707#define tcg_temp_local_new() tcg_temp_local_new_i64()
1708#define tcg_temp_free tcg_temp_free_i64
1709#define tcg_gen_qemu_ldst_op tcg_gen_op3i_i64
1710#define tcg_gen_qemu_ldst_op_i64 tcg_gen_qemu_ldst_op_i64_i64
1711#define TCGV_UNUSED(x) TCGV_UNUSED_I64(x)
1712#define TCGV_EQUAL(a, b) (GET_TCGV_I64(a) == GET_TCGV_I64(b))
1713#endif
1714
1715/* debug info: write the PC of the corresponding QEMU CPU instruction */
1716static inline void tcg_gen_debug_insn_start(uint64_t pc)
1717{
1718 /* XXX: must really use a 32 bit size for TCGArg in all cases */
1719#if TARGET_LONG_BITS > TCG_TARGET_REG_BITS
1720 tcg_gen_op2ii(INDEX_op_debug_insn_start,
1721 (uint32_t)(pc), (uint32_t)(pc >> 32));
1722#else
1723 tcg_gen_op1i(INDEX_op_debug_insn_start, pc);
1724#endif
1725}
1726
1727static inline void tcg_gen_exit_tb(tcg_target_long val)
1728{
1729 tcg_gen_op1i(INDEX_op_exit_tb, val);
1730}
1731
1732static inline void tcg_gen_goto_tb(int idx)
1733{
1734 tcg_gen_op1i(INDEX_op_goto_tb, idx);
1735}
1736
1737#if TCG_TARGET_REG_BITS == 32
1738static inline void tcg_gen_qemu_ld8u(TCGv ret, TCGv addr, int mem_index)
1739{
1740#if TARGET_LONG_BITS == 32
1741 tcg_gen_op3i_i32(INDEX_op_qemu_ld8u, ret, addr, mem_index);
1742#else
1743 tcg_gen_op4i_i32(INDEX_op_qemu_ld8u, TCGV_LOW(ret), TCGV_LOW(addr),
1744 TCGV_HIGH(addr), mem_index);
1745 tcg_gen_movi_i32(TCGV_HIGH(ret), 0);
1746#endif
1747}
1748
1749static inline void tcg_gen_qemu_ld8s(TCGv ret, TCGv addr, int mem_index)
1750{
1751#if TARGET_LONG_BITS == 32
1752 tcg_gen_op3i_i32(INDEX_op_qemu_ld8s, ret, addr, mem_index);
1753#else
1754 tcg_gen_op4i_i32(INDEX_op_qemu_ld8s, TCGV_LOW(ret), TCGV_LOW(addr),
1755 TCGV_HIGH(addr), mem_index);
1756 tcg_gen_sari_i32(TCGV_HIGH(ret), TCGV_LOW(ret), 31);
1757#endif
1758}
1759
1760static inline void tcg_gen_qemu_ld16u(TCGv ret, TCGv addr, int mem_index)
1761{
1762#if TARGET_LONG_BITS == 32
1763 tcg_gen_op3i_i32(INDEX_op_qemu_ld16u, ret, addr, mem_index);
1764#else
1765 tcg_gen_op4i_i32(INDEX_op_qemu_ld16u, TCGV_LOW(ret), TCGV_LOW(addr),
1766 TCGV_HIGH(addr), mem_index);
1767 tcg_gen_movi_i32(TCGV_HIGH(ret), 0);
1768#endif
1769}
1770
1771static inline void tcg_gen_qemu_ld16s(TCGv ret, TCGv addr, int mem_index)
1772{
1773#if TARGET_LONG_BITS == 32
1774 tcg_gen_op3i_i32(INDEX_op_qemu_ld16s, ret, addr, mem_index);
1775#else
1776 tcg_gen_op4i_i32(INDEX_op_qemu_ld16s, TCGV_LOW(ret), TCGV_LOW(addr),
1777 TCGV_HIGH(addr), mem_index);
1778 tcg_gen_sari_i32(TCGV_HIGH(ret), TCGV_LOW(ret), 31);
1779#endif
1780}
1781
1782static inline void tcg_gen_qemu_ld32u(TCGv ret, TCGv addr, int mem_index)
1783{
1784#if TARGET_LONG_BITS == 32
1785 tcg_gen_op3i_i32(INDEX_op_qemu_ld32u, ret, addr, mem_index);
1786#else
1787 tcg_gen_op4i_i32(INDEX_op_qemu_ld32u, TCGV_LOW(ret), TCGV_LOW(addr),
1788 TCGV_HIGH(addr), mem_index);
1789 tcg_gen_movi_i32(TCGV_HIGH(ret), 0);
1790#endif
1791}
1792
1793static inline void tcg_gen_qemu_ld32s(TCGv ret, TCGv addr, int mem_index)
1794{
1795#if TARGET_LONG_BITS == 32
1796 tcg_gen_op3i_i32(INDEX_op_qemu_ld32u, ret, addr, mem_index);
1797#else
1798 tcg_gen_op4i_i32(INDEX_op_qemu_ld32u, TCGV_LOW(ret), TCGV_LOW(addr),
1799 TCGV_HIGH(addr), mem_index);
1800 tcg_gen_sari_i32(TCGV_HIGH(ret), TCGV_LOW(ret), 31);
1801#endif
1802}
1803
1804static inline void tcg_gen_qemu_ld64(TCGv_i64 ret, TCGv addr, int mem_index)
1805{
1806#if TARGET_LONG_BITS == 32
1807 tcg_gen_op4i_i32(INDEX_op_qemu_ld64, TCGV_LOW(ret), TCGV_HIGH(ret), addr, mem_index);
1808#else
1809 tcg_gen_op5i_i32(INDEX_op_qemu_ld64, TCGV_LOW(ret), TCGV_HIGH(ret),
1810 TCGV_LOW(addr), TCGV_HIGH(addr), mem_index);
1811#endif
1812}
1813
1814static inline void tcg_gen_qemu_st8(TCGv arg, TCGv addr, int mem_index)
1815{
1816#if TARGET_LONG_BITS == 32
1817 tcg_gen_op3i_i32(INDEX_op_qemu_st8, arg, addr, mem_index);
1818#else
1819 tcg_gen_op4i_i32(INDEX_op_qemu_st8, TCGV_LOW(arg), TCGV_LOW(addr),
1820 TCGV_HIGH(addr), mem_index);
1821#endif
1822}
1823
1824static inline void tcg_gen_qemu_st16(TCGv arg, TCGv addr, int mem_index)
1825{
1826#if TARGET_LONG_BITS == 32
1827 tcg_gen_op3i_i32(INDEX_op_qemu_st16, arg, addr, mem_index);
1828#else
1829 tcg_gen_op4i_i32(INDEX_op_qemu_st16, TCGV_LOW(arg), TCGV_LOW(addr),
1830 TCGV_HIGH(addr), mem_index);
1831#endif
1832}
1833
1834static inline void tcg_gen_qemu_st32(TCGv arg, TCGv addr, int mem_index)
1835{
1836#if TARGET_LONG_BITS == 32
1837 tcg_gen_op3i_i32(INDEX_op_qemu_st32, arg, addr, mem_index);
1838#else
1839 tcg_gen_op4i_i32(INDEX_op_qemu_st32, TCGV_LOW(arg), TCGV_LOW(addr),
1840 TCGV_HIGH(addr), mem_index);
1841#endif
1842}
1843
1844static inline void tcg_gen_qemu_st64(TCGv_i64 arg, TCGv addr, int mem_index)
1845{
1846#if TARGET_LONG_BITS == 32
1847 tcg_gen_op4i_i32(INDEX_op_qemu_st64, TCGV_LOW(arg), TCGV_HIGH(arg), addr,
1848 mem_index);
1849#else
1850 tcg_gen_op5i_i32(INDEX_op_qemu_st64, TCGV_LOW(arg), TCGV_HIGH(arg),
1851 TCGV_LOW(addr), TCGV_HIGH(addr), mem_index);
1852#endif
1853}
1854
1855#define tcg_gen_ld_ptr tcg_gen_ld_i32
1856#define tcg_gen_discard_ptr tcg_gen_discard_i32
1857
1858#else /* TCG_TARGET_REG_BITS == 32 */
1859
1860static inline void tcg_gen_qemu_ld8u(TCGv ret, TCGv addr, int mem_index)
1861{
1862 tcg_gen_qemu_ldst_op(INDEX_op_qemu_ld8u, ret, addr, mem_index);
1863}
1864
1865static inline void tcg_gen_qemu_ld8s(TCGv ret, TCGv addr, int mem_index)
1866{
1867 tcg_gen_qemu_ldst_op(INDEX_op_qemu_ld8s, ret, addr, mem_index);
1868}
1869
1870static inline void tcg_gen_qemu_ld16u(TCGv ret, TCGv addr, int mem_index)
1871{
1872 tcg_gen_qemu_ldst_op(INDEX_op_qemu_ld16u, ret, addr, mem_index);
1873}
1874
1875static inline void tcg_gen_qemu_ld16s(TCGv ret, TCGv addr, int mem_index)
1876{
1877 tcg_gen_qemu_ldst_op(INDEX_op_qemu_ld16s, ret, addr, mem_index);
1878}
1879
1880static inline void tcg_gen_qemu_ld32u(TCGv ret, TCGv addr, int mem_index)
1881{
1882 tcg_gen_qemu_ldst_op(INDEX_op_qemu_ld32u, ret, addr, mem_index);
1883}
1884
1885static inline void tcg_gen_qemu_ld32s(TCGv ret, TCGv addr, int mem_index)
1886{
1887 tcg_gen_qemu_ldst_op(INDEX_op_qemu_ld32s, ret, addr, mem_index);
1888}
1889
1890static inline void tcg_gen_qemu_ld64(TCGv_i64 ret, TCGv addr, int mem_index)
1891{
1892 tcg_gen_qemu_ldst_op_i64(INDEX_op_qemu_ld64, ret, addr, mem_index);
1893}
1894
1895static inline void tcg_gen_qemu_st8(TCGv arg, TCGv addr, int mem_index)
1896{
1897 tcg_gen_qemu_ldst_op(INDEX_op_qemu_st8, arg, addr, mem_index);
1898}
1899
1900static inline void tcg_gen_qemu_st16(TCGv arg, TCGv addr, int mem_index)
1901{
1902 tcg_gen_qemu_ldst_op(INDEX_op_qemu_st16, arg, addr, mem_index);
1903}
1904
1905static inline void tcg_gen_qemu_st32(TCGv arg, TCGv addr, int mem_index)
1906{
1907 tcg_gen_qemu_ldst_op(INDEX_op_qemu_st32, arg, addr, mem_index);
1908}
1909
1910static inline void tcg_gen_qemu_st64(TCGv_i64 arg, TCGv addr, int mem_index)
1911{
1912 tcg_gen_qemu_ldst_op_i64(INDEX_op_qemu_st64, arg, addr, mem_index);
1913}
1914
1915#define tcg_gen_ld_ptr tcg_gen_ld_i64
1916#define tcg_gen_discard_ptr tcg_gen_discard_i64
1917
1918#endif /* TCG_TARGET_REG_BITS != 32 */
1919
1920#if TARGET_LONG_BITS == 64
1921#define TCG_TYPE_TL TCG_TYPE_I64
1922#define tcg_gen_movi_tl tcg_gen_movi_i64
1923#define tcg_gen_mov_tl tcg_gen_mov_i64
1924#define tcg_gen_ld8u_tl tcg_gen_ld8u_i64
1925#define tcg_gen_ld8s_tl tcg_gen_ld8s_i64
1926#define tcg_gen_ld16u_tl tcg_gen_ld16u_i64
1927#define tcg_gen_ld16s_tl tcg_gen_ld16s_i64
1928#define tcg_gen_ld32u_tl tcg_gen_ld32u_i64
1929#define tcg_gen_ld32s_tl tcg_gen_ld32s_i64
1930#define tcg_gen_ld_tl tcg_gen_ld_i64
1931#define tcg_gen_st8_tl tcg_gen_st8_i64
1932#define tcg_gen_st16_tl tcg_gen_st16_i64
1933#define tcg_gen_st32_tl tcg_gen_st32_i64
1934#define tcg_gen_st_tl tcg_gen_st_i64
1935#define tcg_gen_add_tl tcg_gen_add_i64
1936#define tcg_gen_addi_tl tcg_gen_addi_i64
1937#define tcg_gen_sub_tl tcg_gen_sub_i64
1938#define tcg_gen_neg_tl tcg_gen_neg_i64
1939#define tcg_gen_subfi_tl tcg_gen_subfi_i64
1940#define tcg_gen_subi_tl tcg_gen_subi_i64
1941#define tcg_gen_and_tl tcg_gen_and_i64
1942#define tcg_gen_andi_tl tcg_gen_andi_i64
1943#define tcg_gen_or_tl tcg_gen_or_i64
1944#define tcg_gen_ori_tl tcg_gen_ori_i64
1945#define tcg_gen_xor_tl tcg_gen_xor_i64
1946#define tcg_gen_xori_tl tcg_gen_xori_i64
1947#define tcg_gen_not_tl tcg_gen_not_i64
1948#define tcg_gen_shl_tl tcg_gen_shl_i64
1949#define tcg_gen_shli_tl tcg_gen_shli_i64
1950#define tcg_gen_shr_tl tcg_gen_shr_i64
1951#define tcg_gen_shri_tl tcg_gen_shri_i64
1952#define tcg_gen_sar_tl tcg_gen_sar_i64
1953#define tcg_gen_sari_tl tcg_gen_sari_i64
1954#define tcg_gen_brcond_tl tcg_gen_brcond_i64
1955#define tcg_gen_brcondi_tl tcg_gen_brcondi_i64
1956#define tcg_gen_mul_tl tcg_gen_mul_i64
1957#define tcg_gen_muli_tl tcg_gen_muli_i64
1958#define tcg_gen_discard_tl tcg_gen_discard_i64
1959#define tcg_gen_trunc_tl_i32 tcg_gen_trunc_i64_i32
1960#define tcg_gen_trunc_i64_tl tcg_gen_mov_i64
1961#define tcg_gen_extu_i32_tl tcg_gen_extu_i32_i64
1962#define tcg_gen_ext_i32_tl tcg_gen_ext_i32_i64
1963#define tcg_gen_extu_tl_i64 tcg_gen_mov_i64
1964#define tcg_gen_ext_tl_i64 tcg_gen_mov_i64
1965#define tcg_gen_ext8u_tl tcg_gen_ext8u_i64
1966#define tcg_gen_ext8s_tl tcg_gen_ext8s_i64
1967#define tcg_gen_ext16u_tl tcg_gen_ext16u_i64
1968#define tcg_gen_ext16s_tl tcg_gen_ext16s_i64
1969#define tcg_gen_ext32u_tl tcg_gen_ext32u_i64
1970#define tcg_gen_ext32s_tl tcg_gen_ext32s_i64
1971#define tcg_gen_concat_tl_i64 tcg_gen_concat32_i64
1972#define tcg_gen_andc_tl tcg_gen_andc_i64
1973#define tcg_gen_eqv_tl tcg_gen_eqv_i64
1974#define tcg_gen_nand_tl tcg_gen_nand_i64
1975#define tcg_gen_nor_tl tcg_gen_nor_i64
1976#define tcg_gen_orc_tl tcg_gen_orc_i64
1977#define tcg_gen_rotl_tl tcg_gen_rotl_i64
1978#define tcg_gen_rotli_tl tcg_gen_rotli_i64
1979#define tcg_gen_rotr_tl tcg_gen_rotr_i64
1980#define tcg_gen_rotri_tl tcg_gen_rotri_i64
1981#define tcg_const_tl tcg_const_i64
1982#define tcg_const_local_tl tcg_const_local_i64
1983#else
1984#define TCG_TYPE_TL TCG_TYPE_I32
1985#define tcg_gen_movi_tl tcg_gen_movi_i32
1986#define tcg_gen_mov_tl tcg_gen_mov_i32
1987#define tcg_gen_ld8u_tl tcg_gen_ld8u_i32
1988#define tcg_gen_ld8s_tl tcg_gen_ld8s_i32
1989#define tcg_gen_ld16u_tl tcg_gen_ld16u_i32
1990#define tcg_gen_ld16s_tl tcg_gen_ld16s_i32
1991#define tcg_gen_ld32u_tl tcg_gen_ld_i32
1992#define tcg_gen_ld32s_tl tcg_gen_ld_i32
1993#define tcg_gen_ld_tl tcg_gen_ld_i32
1994#define tcg_gen_st8_tl tcg_gen_st8_i32
1995#define tcg_gen_st16_tl tcg_gen_st16_i32
1996#define tcg_gen_st32_tl tcg_gen_st_i32
1997#define tcg_gen_st_tl tcg_gen_st_i32
1998#define tcg_gen_add_tl tcg_gen_add_i32
1999#define tcg_gen_addi_tl tcg_gen_addi_i32
2000#define tcg_gen_sub_tl tcg_gen_sub_i32
2001#define tcg_gen_neg_tl tcg_gen_neg_i32
2002#define tcg_gen_subfi_tl tcg_gen_subfi_i32
2003#define tcg_gen_subi_tl tcg_gen_subi_i32
2004#define tcg_gen_and_tl tcg_gen_and_i32
2005#define tcg_gen_andi_tl tcg_gen_andi_i32
2006#define tcg_gen_or_tl tcg_gen_or_i32
2007#define tcg_gen_ori_tl tcg_gen_ori_i32
2008#define tcg_gen_xor_tl tcg_gen_xor_i32
2009#define tcg_gen_xori_tl tcg_gen_xori_i32
2010#define tcg_gen_not_tl tcg_gen_not_i32
2011#define tcg_gen_shl_tl tcg_gen_shl_i32
2012#define tcg_gen_shli_tl tcg_gen_shli_i32
2013#define tcg_gen_shr_tl tcg_gen_shr_i32
2014#define tcg_gen_shri_tl tcg_gen_shri_i32
2015#define tcg_gen_sar_tl tcg_gen_sar_i32
2016#define tcg_gen_sari_tl tcg_gen_sari_i32
2017#define tcg_gen_brcond_tl tcg_gen_brcond_i32
2018#define tcg_gen_brcondi_tl tcg_gen_brcondi_i32
2019#define tcg_gen_mul_tl tcg_gen_mul_i32
2020#define tcg_gen_muli_tl tcg_gen_muli_i32
2021#define tcg_gen_discard_tl tcg_gen_discard_i32
2022#define tcg_gen_trunc_tl_i32 tcg_gen_mov_i32
2023#define tcg_gen_trunc_i64_tl tcg_gen_trunc_i64_i32
2024#define tcg_gen_extu_i32_tl tcg_gen_mov_i32
2025#define tcg_gen_ext_i32_tl tcg_gen_mov_i32
2026#define tcg_gen_extu_tl_i64 tcg_gen_extu_i32_i64
2027#define tcg_gen_ext_tl_i64 tcg_gen_ext_i32_i64
2028#define tcg_gen_ext8u_tl tcg_gen_ext8u_i32
2029#define tcg_gen_ext8s_tl tcg_gen_ext8s_i32
2030#define tcg_gen_ext16u_tl tcg_gen_ext16u_i32
2031#define tcg_gen_ext16s_tl tcg_gen_ext16s_i32
2032#define tcg_gen_ext32u_tl tcg_gen_mov_i32
2033#define tcg_gen_ext32s_tl tcg_gen_mov_i32
2034#define tcg_gen_concat_tl_i64 tcg_gen_concat_i32_i64
2035#define tcg_gen_andc_tl tcg_gen_andc_i32
2036#define tcg_gen_eqv_tl tcg_gen_eqv_i32
2037#define tcg_gen_nand_tl tcg_gen_nand_i32
2038#define tcg_gen_nor_tl tcg_gen_nor_i32
2039#define tcg_gen_orc_tl tcg_gen_orc_i32
2040#define tcg_gen_rotl_tl tcg_gen_rotl_i32
2041#define tcg_gen_rotli_tl tcg_gen_rotli_i32
2042#define tcg_gen_rotr_tl tcg_gen_rotr_i32
2043#define tcg_gen_rotri_tl tcg_gen_rotri_i32
2044#define tcg_const_tl tcg_const_i32
2045#define tcg_const_local_tl tcg_const_local_i32
2046#endif
2047
2048#if TCG_TARGET_REG_BITS == 32
2049#define tcg_gen_add_ptr tcg_gen_add_i32
2050#define tcg_gen_addi_ptr tcg_gen_addi_i32
2051#define tcg_gen_ext_i32_ptr tcg_gen_mov_i32
2052#else /* TCG_TARGET_REG_BITS == 32 */
2053#define tcg_gen_add_ptr tcg_gen_add_i64
2054#define tcg_gen_addi_ptr tcg_gen_addi_i64
2055#define tcg_gen_ext_i32_ptr tcg_gen_ext_i32_i64
2056#endif /* TCG_TARGET_REG_BITS != 32 */
Note: See TracBrowser for help on using the repository browser.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette