Introduce a default qmp session
[qemu/aliguori-queue.git] / tcg / tcg-op.h
bloba58b17a655f98589040129ef0becf3bd9c595f36
1 /*
2 * Tiny Code Generator for QEMU
4 * Copyright (c) 2008 Fabrice Bellard
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:
13 * The above copyright notice and this permission notice shall be included in
14 * all copies or substantial portions of the Software.
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.
24 #include "tcg.h"
26 int gen_new_label(void);
28 static inline void tcg_gen_op1_i32(int opc, TCGv_i32 arg1)
30 *gen_opc_ptr++ = opc;
31 *gen_opparam_ptr++ = GET_TCGV_I32(arg1);
34 static inline void tcg_gen_op1_i64(int opc, TCGv_i64 arg1)
36 *gen_opc_ptr++ = opc;
37 *gen_opparam_ptr++ = GET_TCGV_I64(arg1);
40 static inline void tcg_gen_op1i(int opc, TCGArg arg1)
42 *gen_opc_ptr++ = opc;
43 *gen_opparam_ptr++ = arg1;
46 static inline void tcg_gen_op2_i32(int opc, TCGv_i32 arg1, TCGv_i32 arg2)
48 *gen_opc_ptr++ = opc;
49 *gen_opparam_ptr++ = GET_TCGV_I32(arg1);
50 *gen_opparam_ptr++ = GET_TCGV_I32(arg2);
53 static inline void tcg_gen_op2_i64(int opc, TCGv_i64 arg1, TCGv_i64 arg2)
55 *gen_opc_ptr++ = opc;
56 *gen_opparam_ptr++ = GET_TCGV_I64(arg1);
57 *gen_opparam_ptr++ = GET_TCGV_I64(arg2);
60 static inline void tcg_gen_op2i_i32(int opc, TCGv_i32 arg1, TCGArg arg2)
62 *gen_opc_ptr++ = opc;
63 *gen_opparam_ptr++ = GET_TCGV_I32(arg1);
64 *gen_opparam_ptr++ = arg2;
67 static inline void tcg_gen_op2i_i64(int opc, TCGv_i64 arg1, TCGArg arg2)
69 *gen_opc_ptr++ = opc;
70 *gen_opparam_ptr++ = GET_TCGV_I64(arg1);
71 *gen_opparam_ptr++ = arg2;
74 static inline void tcg_gen_op2ii(int opc, TCGArg arg1, TCGArg arg2)
76 *gen_opc_ptr++ = opc;
77 *gen_opparam_ptr++ = arg1;
78 *gen_opparam_ptr++ = arg2;
81 static inline void tcg_gen_op3_i32(int opc, TCGv_i32 arg1, TCGv_i32 arg2,
82 TCGv_i32 arg3)
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);
90 static inline void tcg_gen_op3_i64(int opc, TCGv_i64 arg1, TCGv_i64 arg2,
91 TCGv_i64 arg3)
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);
99 static inline void tcg_gen_op3i_i32(int opc, TCGv_i32 arg1, TCGv_i32 arg2,
100 TCGArg arg3)
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;
108 static inline void tcg_gen_op3i_i64(int opc, TCGv_i64 arg1, TCGv_i64 arg2,
109 TCGArg arg3)
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;
117 static inline void tcg_gen_ldst_op_i32(int opc, TCGv_i32 val, TCGv_ptr base,
118 TCGArg offset)
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;
126 static inline void tcg_gen_ldst_op_i64(int opc, TCGv_i64 val, TCGv_ptr base,
127 TCGArg offset)
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;
135 static inline void tcg_gen_qemu_ldst_op_i64_i32(int opc, TCGv_i64 val, TCGv_i32 addr,
136 TCGArg mem_index)
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;
144 static inline void tcg_gen_qemu_ldst_op_i64_i64(int opc, TCGv_i64 val, TCGv_i64 addr,
145 TCGArg mem_index)
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;
153 static inline void tcg_gen_op4_i32(int opc, TCGv_i32 arg1, TCGv_i32 arg2,
154 TCGv_i32 arg3, TCGv_i32 arg4)
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);
163 static inline void tcg_gen_op4_i64(int opc, TCGv_i64 arg1, TCGv_i64 arg2,
164 TCGv_i64 arg3, TCGv_i64 arg4)
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);
173 static inline void tcg_gen_op4i_i32(int opc, TCGv_i32 arg1, TCGv_i32 arg2,
174 TCGv_i32 arg3, TCGArg arg4)
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;
183 static inline void tcg_gen_op4i_i64(int opc, TCGv_i64 arg1, TCGv_i64 arg2,
184 TCGv_i64 arg3, TCGArg arg4)
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;
193 static inline void tcg_gen_op4ii_i32(int opc, TCGv_i32 arg1, TCGv_i32 arg2,
194 TCGArg arg3, TCGArg arg4)
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;
203 static inline void tcg_gen_op4ii_i64(int opc, TCGv_i64 arg1, TCGv_i64 arg2,
204 TCGArg arg3, TCGArg arg4)
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;
213 static inline void tcg_gen_op5_i32(int opc, TCGv_i32 arg1, TCGv_i32 arg2,
214 TCGv_i32 arg3, TCGv_i32 arg4, TCGv_i32 arg5)
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);
224 static inline void tcg_gen_op5_i64(int opc, TCGv_i64 arg1, TCGv_i64 arg2,
225 TCGv_i64 arg3, TCGv_i64 arg4, TCGv_i64 arg5)
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);
235 static inline void tcg_gen_op5i_i32(int opc, TCGv_i32 arg1, TCGv_i32 arg2,
236 TCGv_i32 arg3, TCGv_i32 arg4, TCGArg arg5)
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;
246 static inline void tcg_gen_op5i_i64(int opc, TCGv_i64 arg1, TCGv_i64 arg2,
247 TCGv_i64 arg3, TCGv_i64 arg4, TCGArg arg5)
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;
257 static 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)
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);
270 static 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)
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);
283 static inline void tcg_gen_op6i_i32(int opc, TCGv_i32 arg1, TCGv_i32 arg2,
284 TCGv_i32 arg3, TCGv_i32 arg4,
285 TCGv_i32 arg5, TCGArg arg6)
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++ = GET_TCGV_I32(arg5);
293 *gen_opparam_ptr++ = arg6;
296 static inline void tcg_gen_op6i_i64(int opc, TCGv_i64 arg1, TCGv_i64 arg2,
297 TCGv_i64 arg3, TCGv_i64 arg4,
298 TCGv_i64 arg5, TCGArg arg6)
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++ = GET_TCGV_I64(arg5);
306 *gen_opparam_ptr++ = arg6;
309 static inline void tcg_gen_op6ii_i32(int opc, TCGv_i32 arg1, TCGv_i32 arg2,
310 TCGv_i32 arg3, TCGv_i32 arg4, TCGArg arg5,
311 TCGArg arg6)
313 *gen_opc_ptr++ = opc;
314 *gen_opparam_ptr++ = GET_TCGV_I32(arg1);
315 *gen_opparam_ptr++ = GET_TCGV_I32(arg2);
316 *gen_opparam_ptr++ = GET_TCGV_I32(arg3);
317 *gen_opparam_ptr++ = GET_TCGV_I32(arg4);
318 *gen_opparam_ptr++ = arg5;
319 *gen_opparam_ptr++ = arg6;
322 static inline void tcg_gen_op6ii_i64(int opc, TCGv_i64 arg1, TCGv_i64 arg2,
323 TCGv_i64 arg3, TCGv_i64 arg4, TCGArg arg5,
324 TCGArg arg6)
326 *gen_opc_ptr++ = opc;
327 *gen_opparam_ptr++ = GET_TCGV_I64(arg1);
328 *gen_opparam_ptr++ = GET_TCGV_I64(arg2);
329 *gen_opparam_ptr++ = GET_TCGV_I64(arg3);
330 *gen_opparam_ptr++ = GET_TCGV_I64(arg4);
331 *gen_opparam_ptr++ = arg5;
332 *gen_opparam_ptr++ = arg6;
335 static inline void gen_set_label(int n)
337 tcg_gen_op1i(INDEX_op_set_label, n);
340 static inline void tcg_gen_br(int label)
342 tcg_gen_op1i(INDEX_op_br, label);
345 static inline void tcg_gen_mov_i32(TCGv_i32 ret, TCGv_i32 arg)
347 if (!TCGV_EQUAL_I32(ret, arg))
348 tcg_gen_op2_i32(INDEX_op_mov_i32, ret, arg);
351 static inline void tcg_gen_movi_i32(TCGv_i32 ret, int32_t arg)
353 tcg_gen_op2i_i32(INDEX_op_movi_i32, ret, arg);
356 /* helper calls */
357 static inline void tcg_gen_helperN(void *func, int flags, int sizemask,
358 TCGArg ret, int nargs, TCGArg *args)
360 TCGv_ptr fn;
361 fn = tcg_const_ptr((tcg_target_long)func);
362 tcg_gen_callN(&tcg_ctx, fn, flags, sizemask, ret,
363 nargs, args);
364 tcg_temp_free_ptr(fn);
367 /* Note: Both tcg_gen_helper32() and tcg_gen_helper64() are currently
368 reserved for helpers in tcg-runtime.c. These helpers are all const
369 and pure, hence the call to tcg_gen_callN() with TCG_CALL_CONST |
370 TCG_CALL_PURE. This may need to be adjusted if these functions
371 start to be used with other helpers. */
372 static inline void tcg_gen_helper32(void *func, TCGv_i32 ret,
373 TCGv_i32 a, TCGv_i32 b)
375 TCGv_ptr fn;
376 TCGArg args[2];
377 fn = tcg_const_ptr((tcg_target_long)func);
378 args[0] = GET_TCGV_I32(a);
379 args[1] = GET_TCGV_I32(b);
380 tcg_gen_callN(&tcg_ctx, fn, TCG_CALL_CONST | TCG_CALL_PURE,
381 0, GET_TCGV_I32(ret), 2, args);
382 tcg_temp_free_ptr(fn);
385 static inline void tcg_gen_helper64(void *func, TCGv_i64 ret,
386 TCGv_i64 a, TCGv_i64 b)
388 TCGv_ptr fn;
389 TCGArg args[2];
390 fn = tcg_const_ptr((tcg_target_long)func);
391 args[0] = GET_TCGV_I64(a);
392 args[1] = GET_TCGV_I64(b);
393 tcg_gen_callN(&tcg_ctx, fn, TCG_CALL_CONST | TCG_CALL_PURE,
394 7, GET_TCGV_I64(ret), 2, args);
395 tcg_temp_free_ptr(fn);
398 /* 32 bit ops */
400 static inline void tcg_gen_ld8u_i32(TCGv_i32 ret, TCGv_ptr arg2, tcg_target_long offset)
402 tcg_gen_ldst_op_i32(INDEX_op_ld8u_i32, ret, arg2, offset);
405 static inline void tcg_gen_ld8s_i32(TCGv_i32 ret, TCGv_ptr arg2, tcg_target_long offset)
407 tcg_gen_ldst_op_i32(INDEX_op_ld8s_i32, ret, arg2, offset);
410 static inline void tcg_gen_ld16u_i32(TCGv_i32 ret, TCGv_ptr arg2, tcg_target_long offset)
412 tcg_gen_ldst_op_i32(INDEX_op_ld16u_i32, ret, arg2, offset);
415 static inline void tcg_gen_ld16s_i32(TCGv_i32 ret, TCGv_ptr arg2, tcg_target_long offset)
417 tcg_gen_ldst_op_i32(INDEX_op_ld16s_i32, ret, arg2, offset);
420 static inline void tcg_gen_ld_i32(TCGv_i32 ret, TCGv_ptr arg2, tcg_target_long offset)
422 tcg_gen_ldst_op_i32(INDEX_op_ld_i32, ret, arg2, offset);
425 static inline void tcg_gen_st8_i32(TCGv_i32 arg1, TCGv_ptr arg2, tcg_target_long offset)
427 tcg_gen_ldst_op_i32(INDEX_op_st8_i32, arg1, arg2, offset);
430 static inline void tcg_gen_st16_i32(TCGv_i32 arg1, TCGv_ptr arg2, tcg_target_long offset)
432 tcg_gen_ldst_op_i32(INDEX_op_st16_i32, arg1, arg2, offset);
435 static inline void tcg_gen_st_i32(TCGv_i32 arg1, TCGv_ptr arg2, tcg_target_long offset)
437 tcg_gen_ldst_op_i32(INDEX_op_st_i32, arg1, arg2, offset);
440 static inline void tcg_gen_add_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
442 tcg_gen_op3_i32(INDEX_op_add_i32, ret, arg1, arg2);
445 static inline void tcg_gen_addi_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2)
447 /* some cases can be optimized here */
448 if (arg2 == 0) {
449 tcg_gen_mov_i32(ret, arg1);
450 } else {
451 TCGv_i32 t0 = tcg_const_i32(arg2);
452 tcg_gen_add_i32(ret, arg1, t0);
453 tcg_temp_free_i32(t0);
457 static inline void tcg_gen_sub_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
459 tcg_gen_op3_i32(INDEX_op_sub_i32, ret, arg1, arg2);
462 static inline void tcg_gen_subfi_i32(TCGv_i32 ret, int32_t arg1, TCGv_i32 arg2)
464 TCGv_i32 t0 = tcg_const_i32(arg1);
465 tcg_gen_sub_i32(ret, t0, arg2);
466 tcg_temp_free_i32(t0);
469 static inline void tcg_gen_subi_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2)
471 /* some cases can be optimized here */
472 if (arg2 == 0) {
473 tcg_gen_mov_i32(ret, arg1);
474 } else {
475 TCGv_i32 t0 = tcg_const_i32(arg2);
476 tcg_gen_sub_i32(ret, arg1, t0);
477 tcg_temp_free_i32(t0);
481 static inline void tcg_gen_and_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
483 if (TCGV_EQUAL_I32(arg1, arg2)) {
484 tcg_gen_mov_i32(ret, arg1);
485 } else {
486 tcg_gen_op3_i32(INDEX_op_and_i32, ret, arg1, arg2);
490 static inline void tcg_gen_andi_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2)
492 /* some cases can be optimized here */
493 if (arg2 == 0) {
494 tcg_gen_movi_i32(ret, 0);
495 } else if (arg2 == 0xffffffff) {
496 tcg_gen_mov_i32(ret, arg1);
497 } else {
498 TCGv_i32 t0 = tcg_const_i32(arg2);
499 tcg_gen_and_i32(ret, arg1, t0);
500 tcg_temp_free_i32(t0);
504 static inline void tcg_gen_or_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
506 if (TCGV_EQUAL_I32(arg1, arg2)) {
507 tcg_gen_mov_i32(ret, arg1);
508 } else {
509 tcg_gen_op3_i32(INDEX_op_or_i32, ret, arg1, arg2);
513 static inline void tcg_gen_ori_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2)
515 /* some cases can be optimized here */
516 if (arg2 == 0xffffffff) {
517 tcg_gen_movi_i32(ret, 0xffffffff);
518 } else if (arg2 == 0) {
519 tcg_gen_mov_i32(ret, arg1);
520 } else {
521 TCGv_i32 t0 = tcg_const_i32(arg2);
522 tcg_gen_or_i32(ret, arg1, t0);
523 tcg_temp_free_i32(t0);
527 static inline void tcg_gen_xor_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
529 if (TCGV_EQUAL_I32(arg1, arg2)) {
530 tcg_gen_movi_i32(ret, 0);
531 } else {
532 tcg_gen_op3_i32(INDEX_op_xor_i32, ret, arg1, arg2);
536 static inline void tcg_gen_xori_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2)
538 /* some cases can be optimized here */
539 if (arg2 == 0) {
540 tcg_gen_mov_i32(ret, arg1);
541 } else {
542 TCGv_i32 t0 = tcg_const_i32(arg2);
543 tcg_gen_xor_i32(ret, arg1, t0);
544 tcg_temp_free_i32(t0);
548 static inline void tcg_gen_shl_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
550 tcg_gen_op3_i32(INDEX_op_shl_i32, ret, arg1, arg2);
553 static inline void tcg_gen_shli_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2)
555 if (arg2 == 0) {
556 tcg_gen_mov_i32(ret, arg1);
557 } else {
558 TCGv_i32 t0 = tcg_const_i32(arg2);
559 tcg_gen_shl_i32(ret, arg1, t0);
560 tcg_temp_free_i32(t0);
564 static inline void tcg_gen_shr_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
566 tcg_gen_op3_i32(INDEX_op_shr_i32, ret, arg1, arg2);
569 static inline void tcg_gen_shri_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2)
571 if (arg2 == 0) {
572 tcg_gen_mov_i32(ret, arg1);
573 } else {
574 TCGv_i32 t0 = tcg_const_i32(arg2);
575 tcg_gen_shr_i32(ret, arg1, t0);
576 tcg_temp_free_i32(t0);
580 static inline void tcg_gen_sar_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
582 tcg_gen_op3_i32(INDEX_op_sar_i32, ret, arg1, arg2);
585 static inline void tcg_gen_sari_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2)
587 if (arg2 == 0) {
588 tcg_gen_mov_i32(ret, arg1);
589 } else {
590 TCGv_i32 t0 = tcg_const_i32(arg2);
591 tcg_gen_sar_i32(ret, arg1, t0);
592 tcg_temp_free_i32(t0);
596 static inline void tcg_gen_brcond_i32(int cond, TCGv_i32 arg1, TCGv_i32 arg2,
597 int label_index)
599 tcg_gen_op4ii_i32(INDEX_op_brcond_i32, arg1, arg2, cond, label_index);
602 static inline void tcg_gen_brcondi_i32(int cond, TCGv_i32 arg1, int32_t arg2,
603 int label_index)
605 TCGv_i32 t0 = tcg_const_i32(arg2);
606 tcg_gen_brcond_i32(cond, arg1, t0, label_index);
607 tcg_temp_free_i32(t0);
610 static inline void tcg_gen_setcond_i32(int cond, TCGv_i32 ret,
611 TCGv_i32 arg1, TCGv_i32 arg2)
613 tcg_gen_op4i_i32(INDEX_op_setcond_i32, ret, arg1, arg2, cond);
616 static inline void tcg_gen_setcondi_i32(int cond, TCGv_i32 ret, TCGv_i32 arg1,
617 int32_t arg2)
619 TCGv_i32 t0 = tcg_const_i32(arg2);
620 tcg_gen_setcond_i32(cond, ret, arg1, t0);
621 tcg_temp_free_i32(t0);
624 static inline void tcg_gen_mul_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
626 tcg_gen_op3_i32(INDEX_op_mul_i32, ret, arg1, arg2);
629 static inline void tcg_gen_muli_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2)
631 TCGv_i32 t0 = tcg_const_i32(arg2);
632 tcg_gen_mul_i32(ret, arg1, t0);
633 tcg_temp_free_i32(t0);
636 #ifdef TCG_TARGET_HAS_div_i32
637 static inline void tcg_gen_div_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
639 tcg_gen_op3_i32(INDEX_op_div_i32, ret, arg1, arg2);
642 static inline void tcg_gen_rem_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
644 tcg_gen_op3_i32(INDEX_op_rem_i32, ret, arg1, arg2);
647 static inline void tcg_gen_divu_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
649 tcg_gen_op3_i32(INDEX_op_divu_i32, ret, arg1, arg2);
652 static inline void tcg_gen_remu_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
654 tcg_gen_op3_i32(INDEX_op_remu_i32, ret, arg1, arg2);
656 #elif defined(TCG_TARGET_HAS_div2_i32)
657 static inline void tcg_gen_div_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
659 TCGv_i32 t0;
660 t0 = tcg_temp_new_i32();
661 tcg_gen_sari_i32(t0, arg1, 31);
662 tcg_gen_op5_i32(INDEX_op_div2_i32, ret, t0, arg1, t0, arg2);
663 tcg_temp_free_i32(t0);
666 static inline void tcg_gen_rem_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
668 TCGv_i32 t0;
669 t0 = tcg_temp_new_i32();
670 tcg_gen_sari_i32(t0, arg1, 31);
671 tcg_gen_op5_i32(INDEX_op_div2_i32, t0, ret, arg1, t0, arg2);
672 tcg_temp_free_i32(t0);
675 static inline void tcg_gen_divu_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
677 TCGv_i32 t0;
678 t0 = tcg_temp_new_i32();
679 tcg_gen_movi_i32(t0, 0);
680 tcg_gen_op5_i32(INDEX_op_divu2_i32, ret, t0, arg1, t0, arg2);
681 tcg_temp_free_i32(t0);
684 static inline void tcg_gen_remu_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
686 TCGv_i32 t0;
687 t0 = tcg_temp_new_i32();
688 tcg_gen_movi_i32(t0, 0);
689 tcg_gen_op5_i32(INDEX_op_divu2_i32, t0, ret, arg1, t0, arg2);
690 tcg_temp_free_i32(t0);
692 #else
693 static inline void tcg_gen_div_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
695 tcg_gen_helper32(tcg_helper_div_i32, ret, arg1, arg2);
698 static inline void tcg_gen_rem_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
700 tcg_gen_helper32(tcg_helper_rem_i32, ret, arg1, arg2);
703 static inline void tcg_gen_divu_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
705 tcg_gen_helper32(tcg_helper_divu_i32, ret, arg1, arg2);
708 static inline void tcg_gen_remu_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
710 tcg_gen_helper32(tcg_helper_remu_i32, ret, arg1, arg2);
712 #endif
714 #if TCG_TARGET_REG_BITS == 32
716 static inline void tcg_gen_mov_i64(TCGv_i64 ret, TCGv_i64 arg)
718 if (!TCGV_EQUAL_I64(ret, arg)) {
719 tcg_gen_mov_i32(TCGV_LOW(ret), TCGV_LOW(arg));
720 tcg_gen_mov_i32(TCGV_HIGH(ret), TCGV_HIGH(arg));
724 static inline void tcg_gen_movi_i64(TCGv_i64 ret, int64_t arg)
726 tcg_gen_movi_i32(TCGV_LOW(ret), arg);
727 tcg_gen_movi_i32(TCGV_HIGH(ret), arg >> 32);
730 static inline void tcg_gen_ld8u_i64(TCGv_i64 ret, TCGv_ptr arg2,
731 tcg_target_long offset)
733 tcg_gen_ld8u_i32(TCGV_LOW(ret), arg2, offset);
734 tcg_gen_movi_i32(TCGV_HIGH(ret), 0);
737 static inline void tcg_gen_ld8s_i64(TCGv_i64 ret, TCGv_ptr arg2,
738 tcg_target_long offset)
740 tcg_gen_ld8s_i32(TCGV_LOW(ret), arg2, offset);
741 tcg_gen_sari_i32(TCGV_HIGH(ret), TCGV_HIGH(ret), 31);
744 static inline void tcg_gen_ld16u_i64(TCGv_i64 ret, TCGv_ptr arg2,
745 tcg_target_long offset)
747 tcg_gen_ld16u_i32(TCGV_LOW(ret), arg2, offset);
748 tcg_gen_movi_i32(TCGV_HIGH(ret), 0);
751 static inline void tcg_gen_ld16s_i64(TCGv_i64 ret, TCGv_ptr arg2,
752 tcg_target_long offset)
754 tcg_gen_ld16s_i32(TCGV_LOW(ret), arg2, offset);
755 tcg_gen_sari_i32(TCGV_HIGH(ret), TCGV_LOW(ret), 31);
758 static inline void tcg_gen_ld32u_i64(TCGv_i64 ret, TCGv_ptr arg2,
759 tcg_target_long offset)
761 tcg_gen_ld_i32(TCGV_LOW(ret), arg2, offset);
762 tcg_gen_movi_i32(TCGV_HIGH(ret), 0);
765 static inline void tcg_gen_ld32s_i64(TCGv_i64 ret, TCGv_ptr arg2,
766 tcg_target_long offset)
768 tcg_gen_ld_i32(TCGV_LOW(ret), arg2, offset);
769 tcg_gen_sari_i32(TCGV_HIGH(ret), TCGV_LOW(ret), 31);
772 static inline void tcg_gen_ld_i64(TCGv_i64 ret, TCGv_ptr arg2,
773 tcg_target_long offset)
775 /* since arg2 and ret have different types, they cannot be the
776 same temporary */
777 #ifdef TCG_TARGET_WORDS_BIGENDIAN
778 tcg_gen_ld_i32(TCGV_HIGH(ret), arg2, offset);
779 tcg_gen_ld_i32(TCGV_LOW(ret), arg2, offset + 4);
780 #else
781 tcg_gen_ld_i32(TCGV_LOW(ret), arg2, offset);
782 tcg_gen_ld_i32(TCGV_HIGH(ret), arg2, offset + 4);
783 #endif
786 static inline void tcg_gen_st8_i64(TCGv_i64 arg1, TCGv_ptr arg2,
787 tcg_target_long offset)
789 tcg_gen_st8_i32(TCGV_LOW(arg1), arg2, offset);
792 static inline void tcg_gen_st16_i64(TCGv_i64 arg1, TCGv_ptr arg2,
793 tcg_target_long offset)
795 tcg_gen_st16_i32(TCGV_LOW(arg1), arg2, offset);
798 static inline void tcg_gen_st32_i64(TCGv_i64 arg1, TCGv_ptr arg2,
799 tcg_target_long offset)
801 tcg_gen_st_i32(TCGV_LOW(arg1), arg2, offset);
804 static inline void tcg_gen_st_i64(TCGv_i64 arg1, TCGv_ptr arg2,
805 tcg_target_long offset)
807 #ifdef TCG_TARGET_WORDS_BIGENDIAN
808 tcg_gen_st_i32(TCGV_HIGH(arg1), arg2, offset);
809 tcg_gen_st_i32(TCGV_LOW(arg1), arg2, offset + 4);
810 #else
811 tcg_gen_st_i32(TCGV_LOW(arg1), arg2, offset);
812 tcg_gen_st_i32(TCGV_HIGH(arg1), arg2, offset + 4);
813 #endif
816 static inline void tcg_gen_add_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
818 tcg_gen_op6_i32(INDEX_op_add2_i32, TCGV_LOW(ret), TCGV_HIGH(ret),
819 TCGV_LOW(arg1), TCGV_HIGH(arg1), TCGV_LOW(arg2),
820 TCGV_HIGH(arg2));
823 static inline void tcg_gen_sub_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
825 tcg_gen_op6_i32(INDEX_op_sub2_i32, TCGV_LOW(ret), TCGV_HIGH(ret),
826 TCGV_LOW(arg1), TCGV_HIGH(arg1), TCGV_LOW(arg2),
827 TCGV_HIGH(arg2));
830 static inline void tcg_gen_and_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
832 tcg_gen_and_i32(TCGV_LOW(ret), TCGV_LOW(arg1), TCGV_LOW(arg2));
833 tcg_gen_and_i32(TCGV_HIGH(ret), TCGV_HIGH(arg1), TCGV_HIGH(arg2));
836 static inline void tcg_gen_andi_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
838 tcg_gen_andi_i32(TCGV_LOW(ret), TCGV_LOW(arg1), arg2);
839 tcg_gen_andi_i32(TCGV_HIGH(ret), TCGV_HIGH(arg1), arg2 >> 32);
842 static inline void tcg_gen_or_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
844 tcg_gen_or_i32(TCGV_LOW(ret), TCGV_LOW(arg1), TCGV_LOW(arg2));
845 tcg_gen_or_i32(TCGV_HIGH(ret), TCGV_HIGH(arg1), TCGV_HIGH(arg2));
848 static inline void tcg_gen_ori_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
850 tcg_gen_ori_i32(TCGV_LOW(ret), TCGV_LOW(arg1), arg2);
851 tcg_gen_ori_i32(TCGV_HIGH(ret), TCGV_HIGH(arg1), arg2 >> 32);
854 static inline void tcg_gen_xor_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
856 tcg_gen_xor_i32(TCGV_LOW(ret), TCGV_LOW(arg1), TCGV_LOW(arg2));
857 tcg_gen_xor_i32(TCGV_HIGH(ret), TCGV_HIGH(arg1), TCGV_HIGH(arg2));
860 static inline void tcg_gen_xori_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
862 tcg_gen_xori_i32(TCGV_LOW(ret), TCGV_LOW(arg1), arg2);
863 tcg_gen_xori_i32(TCGV_HIGH(ret), TCGV_HIGH(arg1), arg2 >> 32);
866 /* XXX: use generic code when basic block handling is OK or CPU
867 specific code (x86) */
868 static inline void tcg_gen_shl_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
870 tcg_gen_helper64(tcg_helper_shl_i64, ret, arg1, arg2);
873 static inline void tcg_gen_shli_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
875 tcg_gen_shifti_i64(ret, arg1, arg2, 0, 0);
878 static inline void tcg_gen_shr_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
880 tcg_gen_helper64(tcg_helper_shr_i64, ret, arg1, arg2);
883 static inline void tcg_gen_shri_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
885 tcg_gen_shifti_i64(ret, arg1, arg2, 1, 0);
888 static inline void tcg_gen_sar_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
890 tcg_gen_helper64(tcg_helper_sar_i64, ret, arg1, arg2);
893 static inline void tcg_gen_sari_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
895 tcg_gen_shifti_i64(ret, arg1, arg2, 1, 1);
898 static inline void tcg_gen_brcond_i64(int cond, TCGv_i64 arg1, TCGv_i64 arg2,
899 int label_index)
901 tcg_gen_op6ii_i32(INDEX_op_brcond2_i32,
902 TCGV_LOW(arg1), TCGV_HIGH(arg1), TCGV_LOW(arg2),
903 TCGV_HIGH(arg2), cond, label_index);
906 static inline void tcg_gen_setcond_i64(int cond, TCGv_i64 ret,
907 TCGv_i64 arg1, TCGv_i64 arg2)
909 tcg_gen_op6i_i32(INDEX_op_setcond2_i32, TCGV_LOW(ret),
910 TCGV_LOW(arg1), TCGV_HIGH(arg1),
911 TCGV_LOW(arg2), TCGV_HIGH(arg2), cond);
912 tcg_gen_movi_i32(TCGV_HIGH(ret), 0);
915 static inline void tcg_gen_mul_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
917 TCGv_i64 t0;
918 TCGv_i32 t1;
920 t0 = tcg_temp_new_i64();
921 t1 = tcg_temp_new_i32();
923 tcg_gen_op4_i32(INDEX_op_mulu2_i32, TCGV_LOW(t0), TCGV_HIGH(t0),
924 TCGV_LOW(arg1), TCGV_LOW(arg2));
926 tcg_gen_mul_i32(t1, TCGV_LOW(arg1), TCGV_HIGH(arg2));
927 tcg_gen_add_i32(TCGV_HIGH(t0), TCGV_HIGH(t0), t1);
928 tcg_gen_mul_i32(t1, TCGV_HIGH(arg1), TCGV_LOW(arg2));
929 tcg_gen_add_i32(TCGV_HIGH(t0), TCGV_HIGH(t0), t1);
931 tcg_gen_mov_i64(ret, t0);
932 tcg_temp_free_i64(t0);
933 tcg_temp_free_i32(t1);
936 static inline void tcg_gen_div_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
938 tcg_gen_helper64(tcg_helper_div_i64, ret, arg1, arg2);
941 static inline void tcg_gen_rem_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
943 tcg_gen_helper64(tcg_helper_rem_i64, ret, arg1, arg2);
946 static inline void tcg_gen_divu_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
948 tcg_gen_helper64(tcg_helper_divu_i64, ret, arg1, arg2);
951 static inline void tcg_gen_remu_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
953 tcg_gen_helper64(tcg_helper_remu_i64, ret, arg1, arg2);
956 #else
958 static inline void tcg_gen_mov_i64(TCGv_i64 ret, TCGv_i64 arg)
960 if (!TCGV_EQUAL_I64(ret, arg))
961 tcg_gen_op2_i64(INDEX_op_mov_i64, ret, arg);
964 static inline void tcg_gen_movi_i64(TCGv_i64 ret, int64_t arg)
966 tcg_gen_op2i_i64(INDEX_op_movi_i64, ret, arg);
969 static inline void tcg_gen_ld8u_i64(TCGv_i64 ret, TCGv_i64 arg2,
970 tcg_target_long offset)
972 tcg_gen_ldst_op_i64(INDEX_op_ld8u_i64, ret, arg2, offset);
975 static inline void tcg_gen_ld8s_i64(TCGv_i64 ret, TCGv_i64 arg2,
976 tcg_target_long offset)
978 tcg_gen_ldst_op_i64(INDEX_op_ld8s_i64, ret, arg2, offset);
981 static inline void tcg_gen_ld16u_i64(TCGv_i64 ret, TCGv_i64 arg2,
982 tcg_target_long offset)
984 tcg_gen_ldst_op_i64(INDEX_op_ld16u_i64, ret, arg2, offset);
987 static inline void tcg_gen_ld16s_i64(TCGv_i64 ret, TCGv_i64 arg2,
988 tcg_target_long offset)
990 tcg_gen_ldst_op_i64(INDEX_op_ld16s_i64, ret, arg2, offset);
993 static inline void tcg_gen_ld32u_i64(TCGv_i64 ret, TCGv_i64 arg2,
994 tcg_target_long offset)
996 tcg_gen_ldst_op_i64(INDEX_op_ld32u_i64, ret, arg2, offset);
999 static inline void tcg_gen_ld32s_i64(TCGv_i64 ret, TCGv_i64 arg2,
1000 tcg_target_long offset)
1002 tcg_gen_ldst_op_i64(INDEX_op_ld32s_i64, ret, arg2, offset);
1005 static inline void tcg_gen_ld_i64(TCGv_i64 ret, TCGv_i64 arg2, tcg_target_long offset)
1007 tcg_gen_ldst_op_i64(INDEX_op_ld_i64, ret, arg2, offset);
1010 static inline void tcg_gen_st8_i64(TCGv_i64 arg1, TCGv_i64 arg2,
1011 tcg_target_long offset)
1013 tcg_gen_ldst_op_i64(INDEX_op_st8_i64, arg1, arg2, offset);
1016 static inline void tcg_gen_st16_i64(TCGv_i64 arg1, TCGv_i64 arg2,
1017 tcg_target_long offset)
1019 tcg_gen_ldst_op_i64(INDEX_op_st16_i64, arg1, arg2, offset);
1022 static inline void tcg_gen_st32_i64(TCGv_i64 arg1, TCGv_i64 arg2,
1023 tcg_target_long offset)
1025 tcg_gen_ldst_op_i64(INDEX_op_st32_i64, arg1, arg2, offset);
1028 static inline void tcg_gen_st_i64(TCGv_i64 arg1, TCGv_i64 arg2, tcg_target_long offset)
1030 tcg_gen_ldst_op_i64(INDEX_op_st_i64, arg1, arg2, offset);
1033 static inline void tcg_gen_add_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1035 tcg_gen_op3_i64(INDEX_op_add_i64, ret, arg1, arg2);
1038 static inline void tcg_gen_sub_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1040 tcg_gen_op3_i64(INDEX_op_sub_i64, ret, arg1, arg2);
1043 static inline void tcg_gen_and_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1045 if (TCGV_EQUAL_I64(arg1, arg2)) {
1046 tcg_gen_mov_i64(ret, arg1);
1047 } else {
1048 tcg_gen_op3_i64(INDEX_op_and_i64, ret, arg1, arg2);
1052 static inline void tcg_gen_andi_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
1054 TCGv_i64 t0 = tcg_const_i64(arg2);
1055 tcg_gen_and_i64(ret, arg1, t0);
1056 tcg_temp_free_i64(t0);
1059 static inline void tcg_gen_or_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1061 if (TCGV_EQUAL_I64(arg1, arg2)) {
1062 tcg_gen_mov_i64(ret, arg1);
1063 } else {
1064 tcg_gen_op3_i64(INDEX_op_or_i64, ret, arg1, arg2);
1068 static inline void tcg_gen_ori_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
1070 TCGv_i64 t0 = tcg_const_i64(arg2);
1071 tcg_gen_or_i64(ret, arg1, t0);
1072 tcg_temp_free_i64(t0);
1075 static inline void tcg_gen_xor_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1077 if (TCGV_EQUAL_I64(arg1, arg2)) {
1078 tcg_gen_movi_i64(ret, 0);
1079 } else {
1080 tcg_gen_op3_i64(INDEX_op_xor_i64, ret, arg1, arg2);
1084 static inline void tcg_gen_xori_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
1086 TCGv_i64 t0 = tcg_const_i64(arg2);
1087 tcg_gen_xor_i64(ret, arg1, t0);
1088 tcg_temp_free_i64(t0);
1091 static inline void tcg_gen_shl_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1093 tcg_gen_op3_i64(INDEX_op_shl_i64, ret, arg1, arg2);
1096 static inline void tcg_gen_shli_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
1098 if (arg2 == 0) {
1099 tcg_gen_mov_i64(ret, arg1);
1100 } else {
1101 TCGv_i64 t0 = tcg_const_i64(arg2);
1102 tcg_gen_shl_i64(ret, arg1, t0);
1103 tcg_temp_free_i64(t0);
1107 static inline void tcg_gen_shr_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1109 tcg_gen_op3_i64(INDEX_op_shr_i64, ret, arg1, arg2);
1112 static inline void tcg_gen_shri_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
1114 if (arg2 == 0) {
1115 tcg_gen_mov_i64(ret, arg1);
1116 } else {
1117 TCGv_i64 t0 = tcg_const_i64(arg2);
1118 tcg_gen_shr_i64(ret, arg1, t0);
1119 tcg_temp_free_i64(t0);
1123 static inline void tcg_gen_sar_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1125 tcg_gen_op3_i64(INDEX_op_sar_i64, ret, arg1, arg2);
1128 static inline void tcg_gen_sari_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
1130 if (arg2 == 0) {
1131 tcg_gen_mov_i64(ret, arg1);
1132 } else {
1133 TCGv_i64 t0 = tcg_const_i64(arg2);
1134 tcg_gen_sar_i64(ret, arg1, t0);
1135 tcg_temp_free_i64(t0);
1139 static inline void tcg_gen_brcond_i64(int cond, TCGv_i64 arg1, TCGv_i64 arg2,
1140 int label_index)
1142 tcg_gen_op4ii_i64(INDEX_op_brcond_i64, arg1, arg2, cond, label_index);
1145 static inline void tcg_gen_setcond_i64(int cond, TCGv_i64 ret,
1146 TCGv_i64 arg1, TCGv_i64 arg2)
1148 tcg_gen_op4i_i64(INDEX_op_setcond_i64, ret, arg1, arg2, cond);
1151 static inline void tcg_gen_mul_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1153 tcg_gen_op3_i64(INDEX_op_mul_i64, ret, arg1, arg2);
1156 #ifdef TCG_TARGET_HAS_div_i64
1157 static inline void tcg_gen_div_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1159 tcg_gen_op3_i64(INDEX_op_div_i64, ret, arg1, arg2);
1162 static inline void tcg_gen_rem_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1164 tcg_gen_op3_i64(INDEX_op_rem_i64, ret, arg1, arg2);
1167 static inline void tcg_gen_divu_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1169 tcg_gen_op3_i64(INDEX_op_divu_i64, ret, arg1, arg2);
1172 static inline void tcg_gen_remu_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1174 tcg_gen_op3_i64(INDEX_op_remu_i64, ret, arg1, arg2);
1176 #elif defined(TCG_TARGET_HAS_div2_i64)
1177 static inline void tcg_gen_div_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1179 TCGv_i64 t0;
1180 t0 = tcg_temp_new_i64();
1181 tcg_gen_sari_i64(t0, arg1, 63);
1182 tcg_gen_op5_i64(INDEX_op_div2_i64, ret, t0, arg1, t0, arg2);
1183 tcg_temp_free_i64(t0);
1186 static inline void tcg_gen_rem_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1188 TCGv_i64 t0;
1189 t0 = tcg_temp_new_i64();
1190 tcg_gen_sari_i64(t0, arg1, 63);
1191 tcg_gen_op5_i64(INDEX_op_div2_i64, t0, ret, arg1, t0, arg2);
1192 tcg_temp_free_i64(t0);
1195 static inline void tcg_gen_divu_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1197 TCGv_i64 t0;
1198 t0 = tcg_temp_new_i64();
1199 tcg_gen_movi_i64(t0, 0);
1200 tcg_gen_op5_i64(INDEX_op_divu2_i64, ret, t0, arg1, t0, arg2);
1201 tcg_temp_free_i64(t0);
1204 static inline void tcg_gen_remu_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1206 TCGv_i64 t0;
1207 t0 = tcg_temp_new_i64();
1208 tcg_gen_movi_i64(t0, 0);
1209 tcg_gen_op5_i64(INDEX_op_divu2_i64, t0, ret, arg1, t0, arg2);
1210 tcg_temp_free_i64(t0);
1212 #else
1213 static inline void tcg_gen_div_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1215 tcg_gen_helper64(tcg_helper_div_i64, ret, arg1, arg2);
1218 static inline void tcg_gen_rem_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1220 tcg_gen_helper64(tcg_helper_rem_i64, ret, arg1, arg2);
1223 static inline void tcg_gen_divu_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1225 tcg_gen_helper64(tcg_helper_divu_i64, ret, arg1, arg2);
1228 static inline void tcg_gen_remu_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1230 tcg_gen_helper64(tcg_helper_remu_i64, ret, arg1, arg2);
1232 #endif
1234 #endif
1236 static inline void tcg_gen_addi_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
1238 /* some cases can be optimized here */
1239 if (arg2 == 0) {
1240 tcg_gen_mov_i64(ret, arg1);
1241 } else {
1242 TCGv_i64 t0 = tcg_const_i64(arg2);
1243 tcg_gen_add_i64(ret, arg1, t0);
1244 tcg_temp_free_i64(t0);
1248 static inline void tcg_gen_subfi_i64(TCGv_i64 ret, int64_t arg1, TCGv_i64 arg2)
1250 TCGv_i64 t0 = tcg_const_i64(arg1);
1251 tcg_gen_sub_i64(ret, t0, arg2);
1252 tcg_temp_free_i64(t0);
1255 static inline void tcg_gen_subi_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
1257 /* some cases can be optimized here */
1258 if (arg2 == 0) {
1259 tcg_gen_mov_i64(ret, arg1);
1260 } else {
1261 TCGv_i64 t0 = tcg_const_i64(arg2);
1262 tcg_gen_sub_i64(ret, arg1, t0);
1263 tcg_temp_free_i64(t0);
1266 static inline void tcg_gen_brcondi_i64(int cond, TCGv_i64 arg1, int64_t arg2,
1267 int label_index)
1269 TCGv_i64 t0 = tcg_const_i64(arg2);
1270 tcg_gen_brcond_i64(cond, arg1, t0, label_index);
1271 tcg_temp_free_i64(t0);
1274 static inline void tcg_gen_setcondi_i64(int cond, TCGv_i64 ret, TCGv_i64 arg1,
1275 int64_t arg2)
1277 TCGv_i64 t0 = tcg_const_i64(arg2);
1278 tcg_gen_setcond_i64(cond, ret, arg1, t0);
1279 tcg_temp_free_i64(t0);
1282 static inline void tcg_gen_muli_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
1284 TCGv_i64 t0 = tcg_const_i64(arg2);
1285 tcg_gen_mul_i64(ret, arg1, t0);
1286 tcg_temp_free_i64(t0);
1290 /***************************************/
1291 /* optional operations */
1293 static inline void tcg_gen_ext8s_i32(TCGv_i32 ret, TCGv_i32 arg)
1295 #ifdef TCG_TARGET_HAS_ext8s_i32
1296 tcg_gen_op2_i32(INDEX_op_ext8s_i32, ret, arg);
1297 #else
1298 tcg_gen_shli_i32(ret, arg, 24);
1299 tcg_gen_sari_i32(ret, ret, 24);
1300 #endif
1303 static inline void tcg_gen_ext16s_i32(TCGv_i32 ret, TCGv_i32 arg)
1305 #ifdef TCG_TARGET_HAS_ext16s_i32
1306 tcg_gen_op2_i32(INDEX_op_ext16s_i32, ret, arg);
1307 #else
1308 tcg_gen_shli_i32(ret, arg, 16);
1309 tcg_gen_sari_i32(ret, ret, 16);
1310 #endif
1313 static inline void tcg_gen_ext8u_i32(TCGv_i32 ret, TCGv_i32 arg)
1315 #ifdef TCG_TARGET_HAS_ext8u_i32
1316 tcg_gen_op2_i32(INDEX_op_ext8u_i32, ret, arg);
1317 #else
1318 tcg_gen_andi_i32(ret, arg, 0xffu);
1319 #endif
1322 static inline void tcg_gen_ext16u_i32(TCGv_i32 ret, TCGv_i32 arg)
1324 #ifdef TCG_TARGET_HAS_ext16u_i32
1325 tcg_gen_op2_i32(INDEX_op_ext16u_i32, ret, arg);
1326 #else
1327 tcg_gen_andi_i32(ret, arg, 0xffffu);
1328 #endif
1331 /* Note: we assume the two high bytes are set to zero */
1332 static inline void tcg_gen_bswap16_i32(TCGv_i32 ret, TCGv_i32 arg)
1334 #ifdef TCG_TARGET_HAS_bswap16_i32
1335 tcg_gen_op2_i32(INDEX_op_bswap16_i32, ret, arg);
1336 #else
1337 TCGv_i32 t0 = tcg_temp_new_i32();
1339 tcg_gen_ext8u_i32(t0, arg);
1340 tcg_gen_shli_i32(t0, t0, 8);
1341 tcg_gen_shri_i32(ret, arg, 8);
1342 tcg_gen_or_i32(ret, ret, t0);
1343 tcg_temp_free_i32(t0);
1344 #endif
1347 static inline void tcg_gen_bswap32_i32(TCGv_i32 ret, TCGv_i32 arg)
1349 #ifdef TCG_TARGET_HAS_bswap32_i32
1350 tcg_gen_op2_i32(INDEX_op_bswap32_i32, ret, arg);
1351 #else
1352 TCGv_i32 t0, t1;
1353 t0 = tcg_temp_new_i32();
1354 t1 = tcg_temp_new_i32();
1356 tcg_gen_shli_i32(t0, arg, 24);
1358 tcg_gen_andi_i32(t1, arg, 0x0000ff00);
1359 tcg_gen_shli_i32(t1, t1, 8);
1360 tcg_gen_or_i32(t0, t0, t1);
1362 tcg_gen_shri_i32(t1, arg, 8);
1363 tcg_gen_andi_i32(t1, t1, 0x0000ff00);
1364 tcg_gen_or_i32(t0, t0, t1);
1366 tcg_gen_shri_i32(t1, arg, 24);
1367 tcg_gen_or_i32(ret, t0, t1);
1368 tcg_temp_free_i32(t0);
1369 tcg_temp_free_i32(t1);
1370 #endif
1373 #if TCG_TARGET_REG_BITS == 32
1374 static inline void tcg_gen_ext8s_i64(TCGv_i64 ret, TCGv_i64 arg)
1376 tcg_gen_ext8s_i32(TCGV_LOW(ret), TCGV_LOW(arg));
1377 tcg_gen_sari_i32(TCGV_HIGH(ret), TCGV_LOW(ret), 31);
1380 static inline void tcg_gen_ext16s_i64(TCGv_i64 ret, TCGv_i64 arg)
1382 tcg_gen_ext16s_i32(TCGV_LOW(ret), TCGV_LOW(arg));
1383 tcg_gen_sari_i32(TCGV_HIGH(ret), TCGV_LOW(ret), 31);
1386 static inline void tcg_gen_ext32s_i64(TCGv_i64 ret, TCGv_i64 arg)
1388 tcg_gen_mov_i32(TCGV_LOW(ret), TCGV_LOW(arg));
1389 tcg_gen_sari_i32(TCGV_HIGH(ret), TCGV_LOW(ret), 31);
1392 static inline void tcg_gen_ext8u_i64(TCGv_i64 ret, TCGv_i64 arg)
1394 tcg_gen_ext8u_i32(TCGV_LOW(ret), TCGV_LOW(arg));
1395 tcg_gen_movi_i32(TCGV_HIGH(ret), 0);
1398 static inline void tcg_gen_ext16u_i64(TCGv_i64 ret, TCGv_i64 arg)
1400 tcg_gen_ext16u_i32(TCGV_LOW(ret), TCGV_LOW(arg));
1401 tcg_gen_movi_i32(TCGV_HIGH(ret), 0);
1404 static inline void tcg_gen_ext32u_i64(TCGv_i64 ret, TCGv_i64 arg)
1406 tcg_gen_mov_i32(TCGV_LOW(ret), TCGV_LOW(arg));
1407 tcg_gen_movi_i32(TCGV_HIGH(ret), 0);
1410 static inline void tcg_gen_trunc_i64_i32(TCGv_i32 ret, TCGv_i64 arg)
1412 tcg_gen_mov_i32(ret, TCGV_LOW(arg));
1415 static inline void tcg_gen_extu_i32_i64(TCGv_i64 ret, TCGv_i32 arg)
1417 tcg_gen_mov_i32(TCGV_LOW(ret), arg);
1418 tcg_gen_movi_i32(TCGV_HIGH(ret), 0);
1421 static inline void tcg_gen_ext_i32_i64(TCGv_i64 ret, TCGv_i32 arg)
1423 tcg_gen_mov_i32(TCGV_LOW(ret), arg);
1424 tcg_gen_sari_i32(TCGV_HIGH(ret), TCGV_LOW(ret), 31);
1427 /* Note: we assume the six high bytes are set to zero */
1428 static inline void tcg_gen_bswap16_i64(TCGv_i64 ret, TCGv_i64 arg)
1430 tcg_gen_mov_i32(TCGV_HIGH(ret), TCGV_HIGH(arg));
1431 tcg_gen_bswap16_i32(TCGV_LOW(ret), TCGV_LOW(arg));
1434 /* Note: we assume the four high bytes are set to zero */
1435 static inline void tcg_gen_bswap32_i64(TCGv_i64 ret, TCGv_i64 arg)
1437 tcg_gen_mov_i32(TCGV_HIGH(ret), TCGV_HIGH(arg));
1438 tcg_gen_bswap32_i32(TCGV_LOW(ret), TCGV_LOW(arg));
1441 static inline void tcg_gen_bswap64_i64(TCGv_i64 ret, TCGv_i64 arg)
1443 TCGv_i32 t0, t1;
1444 t0 = tcg_temp_new_i32();
1445 t1 = tcg_temp_new_i32();
1447 tcg_gen_bswap32_i32(t0, TCGV_LOW(arg));
1448 tcg_gen_bswap32_i32(t1, TCGV_HIGH(arg));
1449 tcg_gen_mov_i32(TCGV_LOW(ret), t1);
1450 tcg_gen_mov_i32(TCGV_HIGH(ret), t0);
1451 tcg_temp_free_i32(t0);
1452 tcg_temp_free_i32(t1);
1454 #else
1456 static inline void tcg_gen_ext8s_i64(TCGv_i64 ret, TCGv_i64 arg)
1458 #ifdef TCG_TARGET_HAS_ext8s_i64
1459 tcg_gen_op2_i64(INDEX_op_ext8s_i64, ret, arg);
1460 #else
1461 tcg_gen_shli_i64(ret, arg, 56);
1462 tcg_gen_sari_i64(ret, ret, 56);
1463 #endif
1466 static inline void tcg_gen_ext16s_i64(TCGv_i64 ret, TCGv_i64 arg)
1468 #ifdef TCG_TARGET_HAS_ext16s_i64
1469 tcg_gen_op2_i64(INDEX_op_ext16s_i64, ret, arg);
1470 #else
1471 tcg_gen_shli_i64(ret, arg, 48);
1472 tcg_gen_sari_i64(ret, ret, 48);
1473 #endif
1476 static inline void tcg_gen_ext32s_i64(TCGv_i64 ret, TCGv_i64 arg)
1478 #ifdef TCG_TARGET_HAS_ext32s_i64
1479 tcg_gen_op2_i64(INDEX_op_ext32s_i64, ret, arg);
1480 #else
1481 tcg_gen_shli_i64(ret, arg, 32);
1482 tcg_gen_sari_i64(ret, ret, 32);
1483 #endif
1486 static inline void tcg_gen_ext8u_i64(TCGv_i64 ret, TCGv_i64 arg)
1488 #ifdef TCG_TARGET_HAS_ext8u_i64
1489 tcg_gen_op2_i64(INDEX_op_ext8u_i64, ret, arg);
1490 #else
1491 tcg_gen_andi_i64(ret, arg, 0xffu);
1492 #endif
1495 static inline void tcg_gen_ext16u_i64(TCGv_i64 ret, TCGv_i64 arg)
1497 #ifdef TCG_TARGET_HAS_ext16u_i64
1498 tcg_gen_op2_i64(INDEX_op_ext16u_i64, ret, arg);
1499 #else
1500 tcg_gen_andi_i64(ret, arg, 0xffffu);
1501 #endif
1504 static inline void tcg_gen_ext32u_i64(TCGv_i64 ret, TCGv_i64 arg)
1506 #ifdef TCG_TARGET_HAS_ext32u_i64
1507 tcg_gen_op2_i64(INDEX_op_ext32u_i64, ret, arg);
1508 #else
1509 tcg_gen_andi_i64(ret, arg, 0xffffffffu);
1510 #endif
1513 /* Note: we assume the target supports move between 32 and 64 bit
1514 registers. This will probably break MIPS64 targets. */
1515 static inline void tcg_gen_trunc_i64_i32(TCGv_i32 ret, TCGv_i64 arg)
1517 tcg_gen_mov_i32(ret, MAKE_TCGV_I32(GET_TCGV_I64(arg)));
1520 /* Note: we assume the target supports move between 32 and 64 bit
1521 registers */
1522 static inline void tcg_gen_extu_i32_i64(TCGv_i64 ret, TCGv_i32 arg)
1524 tcg_gen_ext32u_i64(ret, MAKE_TCGV_I64(GET_TCGV_I32(arg)));
1527 /* Note: we assume the target supports move between 32 and 64 bit
1528 registers */
1529 static inline void tcg_gen_ext_i32_i64(TCGv_i64 ret, TCGv_i32 arg)
1531 tcg_gen_ext32s_i64(ret, MAKE_TCGV_I64(GET_TCGV_I32(arg)));
1534 /* Note: we assume the six high bytes are set to zero */
1535 static inline void tcg_gen_bswap16_i64(TCGv_i64 ret, TCGv_i64 arg)
1537 #ifdef TCG_TARGET_HAS_bswap16_i64
1538 tcg_gen_op2_i64(INDEX_op_bswap16_i64, ret, arg);
1539 #else
1540 TCGv_i64 t0 = tcg_temp_new_i64();
1542 tcg_gen_ext8u_i64(t0, arg);
1543 tcg_gen_shli_i64(t0, t0, 8);
1544 tcg_gen_shri_i64(ret, arg, 8);
1545 tcg_gen_or_i64(ret, ret, t0);
1546 tcg_temp_free_i64(t0);
1547 #endif
1550 /* Note: we assume the four high bytes are set to zero */
1551 static inline void tcg_gen_bswap32_i64(TCGv_i64 ret, TCGv_i64 arg)
1553 #ifdef TCG_TARGET_HAS_bswap32_i64
1554 tcg_gen_op2_i64(INDEX_op_bswap32_i64, ret, arg);
1555 #else
1556 TCGv_i64 t0, t1;
1557 t0 = tcg_temp_new_i64();
1558 t1 = tcg_temp_new_i64();
1560 tcg_gen_shli_i64(t0, arg, 24);
1561 tcg_gen_ext32u_i64(t0, t0);
1563 tcg_gen_andi_i64(t1, arg, 0x0000ff00);
1564 tcg_gen_shli_i64(t1, t1, 8);
1565 tcg_gen_or_i64(t0, t0, t1);
1567 tcg_gen_shri_i64(t1, arg, 8);
1568 tcg_gen_andi_i64(t1, t1, 0x0000ff00);
1569 tcg_gen_or_i64(t0, t0, t1);
1571 tcg_gen_shri_i64(t1, arg, 24);
1572 tcg_gen_or_i64(ret, t0, t1);
1573 tcg_temp_free_i64(t0);
1574 tcg_temp_free_i64(t1);
1575 #endif
1578 static inline void tcg_gen_bswap64_i64(TCGv_i64 ret, TCGv_i64 arg)
1580 #ifdef TCG_TARGET_HAS_bswap64_i64
1581 tcg_gen_op2_i64(INDEX_op_bswap64_i64, ret, arg);
1582 #else
1583 TCGv_i64 t0 = tcg_temp_new_i64();
1584 TCGv_i64 t1 = tcg_temp_new_i64();
1586 tcg_gen_shli_i64(t0, arg, 56);
1588 tcg_gen_andi_i64(t1, arg, 0x0000ff00);
1589 tcg_gen_shli_i64(t1, t1, 40);
1590 tcg_gen_or_i64(t0, t0, t1);
1592 tcg_gen_andi_i64(t1, arg, 0x00ff0000);
1593 tcg_gen_shli_i64(t1, t1, 24);
1594 tcg_gen_or_i64(t0, t0, t1);
1596 tcg_gen_andi_i64(t1, arg, 0xff000000);
1597 tcg_gen_shli_i64(t1, t1, 8);
1598 tcg_gen_or_i64(t0, t0, t1);
1600 tcg_gen_shri_i64(t1, arg, 8);
1601 tcg_gen_andi_i64(t1, t1, 0xff000000);
1602 tcg_gen_or_i64(t0, t0, t1);
1604 tcg_gen_shri_i64(t1, arg, 24);
1605 tcg_gen_andi_i64(t1, t1, 0x00ff0000);
1606 tcg_gen_or_i64(t0, t0, t1);
1608 tcg_gen_shri_i64(t1, arg, 40);
1609 tcg_gen_andi_i64(t1, t1, 0x0000ff00);
1610 tcg_gen_or_i64(t0, t0, t1);
1612 tcg_gen_shri_i64(t1, arg, 56);
1613 tcg_gen_or_i64(ret, t0, t1);
1614 tcg_temp_free_i64(t0);
1615 tcg_temp_free_i64(t1);
1616 #endif
1619 #endif
1621 static inline void tcg_gen_neg_i32(TCGv_i32 ret, TCGv_i32 arg)
1623 #ifdef TCG_TARGET_HAS_neg_i32
1624 tcg_gen_op2_i32(INDEX_op_neg_i32, ret, arg);
1625 #else
1626 TCGv_i32 t0 = tcg_const_i32(0);
1627 tcg_gen_sub_i32(ret, t0, arg);
1628 tcg_temp_free_i32(t0);
1629 #endif
1632 static inline void tcg_gen_neg_i64(TCGv_i64 ret, TCGv_i64 arg)
1634 #ifdef TCG_TARGET_HAS_neg_i64
1635 tcg_gen_op2_i64(INDEX_op_neg_i64, ret, arg);
1636 #else
1637 TCGv_i64 t0 = tcg_const_i64(0);
1638 tcg_gen_sub_i64(ret, t0, arg);
1639 tcg_temp_free_i64(t0);
1640 #endif
1643 static inline void tcg_gen_not_i32(TCGv_i32 ret, TCGv_i32 arg)
1645 #ifdef TCG_TARGET_HAS_not_i32
1646 tcg_gen_op2_i32(INDEX_op_not_i32, ret, arg);
1647 #else
1648 tcg_gen_xori_i32(ret, arg, -1);
1649 #endif
1652 static inline void tcg_gen_not_i64(TCGv_i64 ret, TCGv_i64 arg)
1654 #ifdef TCG_TARGET_HAS_not_i64
1655 tcg_gen_op2_i64(INDEX_op_not_i64, ret, arg);
1656 #else
1657 tcg_gen_xori_i64(ret, arg, -1);
1658 #endif
1661 static inline void tcg_gen_discard_i32(TCGv_i32 arg)
1663 tcg_gen_op1_i32(INDEX_op_discard, arg);
1666 #if TCG_TARGET_REG_BITS == 32
1667 static inline void tcg_gen_discard_i64(TCGv_i64 arg)
1669 tcg_gen_discard_i32(TCGV_LOW(arg));
1670 tcg_gen_discard_i32(TCGV_HIGH(arg));
1672 #else
1673 static inline void tcg_gen_discard_i64(TCGv_i64 arg)
1675 tcg_gen_op1_i64(INDEX_op_discard, arg);
1677 #endif
1679 static inline void tcg_gen_concat_i32_i64(TCGv_i64 dest, TCGv_i32 low, TCGv_i32 high)
1681 #if TCG_TARGET_REG_BITS == 32
1682 tcg_gen_mov_i32(TCGV_LOW(dest), low);
1683 tcg_gen_mov_i32(TCGV_HIGH(dest), high);
1684 #else
1685 TCGv_i64 tmp = tcg_temp_new_i64();
1686 /* This extension is only needed for type correctness.
1687 We may be able to do better given target specific information. */
1688 tcg_gen_extu_i32_i64(tmp, high);
1689 tcg_gen_shli_i64(tmp, tmp, 32);
1690 tcg_gen_extu_i32_i64(dest, low);
1691 tcg_gen_or_i64(dest, dest, tmp);
1692 tcg_temp_free_i64(tmp);
1693 #endif
1696 static inline void tcg_gen_concat32_i64(TCGv_i64 dest, TCGv_i64 low, TCGv_i64 high)
1698 #if TCG_TARGET_REG_BITS == 32
1699 tcg_gen_concat_i32_i64(dest, TCGV_LOW(low), TCGV_LOW(high));
1700 #else
1701 TCGv_i64 tmp = tcg_temp_new_i64();
1702 tcg_gen_ext32u_i64(dest, low);
1703 tcg_gen_shli_i64(tmp, high, 32);
1704 tcg_gen_or_i64(dest, dest, tmp);
1705 tcg_temp_free_i64(tmp);
1706 #endif
1709 static inline void tcg_gen_andc_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
1711 #ifdef TCG_TARGET_HAS_andc_i32
1712 tcg_gen_op3_i32(INDEX_op_andc_i32, ret, arg1, arg2);
1713 #else
1714 TCGv_i32 t0;
1715 t0 = tcg_temp_new_i32();
1716 tcg_gen_not_i32(t0, arg2);
1717 tcg_gen_and_i32(ret, arg1, t0);
1718 tcg_temp_free_i32(t0);
1719 #endif
1722 static inline void tcg_gen_andc_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1724 #ifdef TCG_TARGET_HAS_andc_i64
1725 tcg_gen_op3_i64(INDEX_op_andc_i64, ret, arg1, arg2);
1726 #elif defined(TCG_TARGET_HAS_andc_i32) && TCG_TARGET_REG_BITS == 32
1727 tcg_gen_andc_i32(TCGV_LOW(ret), TCGV_LOW(arg1), TCGV_LOW(arg2));
1728 tcg_gen_andc_i32(TCGV_HIGH(ret), TCGV_HIGH(arg1), TCGV_HIGH(arg2));
1729 #else
1730 TCGv_i64 t0;
1731 t0 = tcg_temp_new_i64();
1732 tcg_gen_not_i64(t0, arg2);
1733 tcg_gen_and_i64(ret, arg1, t0);
1734 tcg_temp_free_i64(t0);
1735 #endif
1738 static inline void tcg_gen_eqv_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
1740 tcg_gen_xor_i32(ret, arg1, arg2);
1741 tcg_gen_not_i32(ret, ret);
1744 static inline void tcg_gen_eqv_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1746 tcg_gen_xor_i64(ret, arg1, arg2);
1747 tcg_gen_not_i64(ret, ret);
1750 static inline void tcg_gen_nand_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
1752 tcg_gen_and_i32(ret, arg1, arg2);
1753 tcg_gen_not_i32(ret, ret);
1756 static inline void tcg_gen_nand_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1758 tcg_gen_and_i64(ret, arg1, arg2);
1759 tcg_gen_not_i64(ret, ret);
1762 static inline void tcg_gen_nor_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
1764 tcg_gen_or_i32(ret, arg1, arg2);
1765 tcg_gen_not_i32(ret, ret);
1768 static inline void tcg_gen_nor_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1770 tcg_gen_or_i64(ret, arg1, arg2);
1771 tcg_gen_not_i64(ret, ret);
1774 static inline void tcg_gen_orc_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
1776 #ifdef TCG_TARGET_HAS_orc_i32
1777 tcg_gen_op3_i32(INDEX_op_orc_i32, ret, arg1, arg2);
1778 #else
1779 TCGv_i32 t0;
1780 t0 = tcg_temp_new_i32();
1781 tcg_gen_not_i32(t0, arg2);
1782 tcg_gen_or_i32(ret, arg1, t0);
1783 tcg_temp_free_i32(t0);
1784 #endif
1787 static inline void tcg_gen_orc_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1789 #ifdef TCG_TARGET_HAS_orc_i64
1790 tcg_gen_op3_i64(INDEX_op_orc_i64, ret, arg1, arg2);
1791 #elif defined(TCG_TARGET_HAS_orc_i32) && TCG_TARGET_REG_BITS == 32
1792 tcg_gen_orc_i32(TCGV_LOW(ret), TCGV_LOW(arg1), TCGV_LOW(arg2));
1793 tcg_gen_orc_i32(TCGV_HIGH(ret), TCGV_HIGH(arg1), TCGV_HIGH(arg2));
1794 #else
1795 TCGv_i64 t0;
1796 t0 = tcg_temp_new_i64();
1797 tcg_gen_not_i64(t0, arg2);
1798 tcg_gen_or_i64(ret, arg1, t0);
1799 tcg_temp_free_i64(t0);
1800 #endif
1803 static inline void tcg_gen_rotl_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
1805 #ifdef TCG_TARGET_HAS_rot_i32
1806 tcg_gen_op3_i32(INDEX_op_rotl_i32, ret, arg1, arg2);
1807 #else
1808 TCGv_i32 t0, t1;
1810 t0 = tcg_temp_new_i32();
1811 t1 = tcg_temp_new_i32();
1812 tcg_gen_shl_i32(t0, arg1, arg2);
1813 tcg_gen_subfi_i32(t1, 32, arg2);
1814 tcg_gen_shr_i32(t1, arg1, t1);
1815 tcg_gen_or_i32(ret, t0, t1);
1816 tcg_temp_free_i32(t0);
1817 tcg_temp_free_i32(t1);
1818 #endif
1821 static inline void tcg_gen_rotl_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1823 #ifdef TCG_TARGET_HAS_rot_i64
1824 tcg_gen_op3_i64(INDEX_op_rotl_i64, ret, arg1, arg2);
1825 #else
1826 TCGv_i64 t0, t1;
1828 t0 = tcg_temp_new_i64();
1829 t1 = tcg_temp_new_i64();
1830 tcg_gen_shl_i64(t0, arg1, arg2);
1831 tcg_gen_subfi_i64(t1, 64, arg2);
1832 tcg_gen_shr_i64(t1, arg1, t1);
1833 tcg_gen_or_i64(ret, t0, t1);
1834 tcg_temp_free_i64(t0);
1835 tcg_temp_free_i64(t1);
1836 #endif
1839 static inline void tcg_gen_rotli_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2)
1841 /* some cases can be optimized here */
1842 if (arg2 == 0) {
1843 tcg_gen_mov_i32(ret, arg1);
1844 } else {
1845 #ifdef TCG_TARGET_HAS_rot_i32
1846 TCGv_i32 t0 = tcg_const_i32(arg2);
1847 tcg_gen_rotl_i32(ret, arg1, t0);
1848 tcg_temp_free_i32(t0);
1849 #else
1850 TCGv_i32 t0, t1;
1851 t0 = tcg_temp_new_i32();
1852 t1 = tcg_temp_new_i32();
1853 tcg_gen_shli_i32(t0, arg1, arg2);
1854 tcg_gen_shri_i32(t1, arg1, 32 - arg2);
1855 tcg_gen_or_i32(ret, t0, t1);
1856 tcg_temp_free_i32(t0);
1857 tcg_temp_free_i32(t1);
1858 #endif
1862 static inline void tcg_gen_rotli_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
1864 /* some cases can be optimized here */
1865 if (arg2 == 0) {
1866 tcg_gen_mov_i64(ret, arg1);
1867 } else {
1868 #ifdef TCG_TARGET_HAS_rot_i64
1869 TCGv_i64 t0 = tcg_const_i64(arg2);
1870 tcg_gen_rotl_i64(ret, arg1, t0);
1871 tcg_temp_free_i64(t0);
1872 #else
1873 TCGv_i64 t0, t1;
1874 t0 = tcg_temp_new_i64();
1875 t1 = tcg_temp_new_i64();
1876 tcg_gen_shli_i64(t0, arg1, arg2);
1877 tcg_gen_shri_i64(t1, arg1, 64 - arg2);
1878 tcg_gen_or_i64(ret, t0, t1);
1879 tcg_temp_free_i64(t0);
1880 tcg_temp_free_i64(t1);
1881 #endif
1885 static inline void tcg_gen_rotr_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
1887 #ifdef TCG_TARGET_HAS_rot_i32
1888 tcg_gen_op3_i32(INDEX_op_rotr_i32, ret, arg1, arg2);
1889 #else
1890 TCGv_i32 t0, t1;
1892 t0 = tcg_temp_new_i32();
1893 t1 = tcg_temp_new_i32();
1894 tcg_gen_shr_i32(t0, arg1, arg2);
1895 tcg_gen_subfi_i32(t1, 32, arg2);
1896 tcg_gen_shl_i32(t1, arg1, t1);
1897 tcg_gen_or_i32(ret, t0, t1);
1898 tcg_temp_free_i32(t0);
1899 tcg_temp_free_i32(t1);
1900 #endif
1903 static inline void tcg_gen_rotr_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1905 #ifdef TCG_TARGET_HAS_rot_i64
1906 tcg_gen_op3_i64(INDEX_op_rotr_i64, ret, arg1, arg2);
1907 #else
1908 TCGv_i64 t0, t1;
1910 t0 = tcg_temp_new_i64();
1911 t1 = tcg_temp_new_i64();
1912 tcg_gen_shr_i64(t0, arg1, arg2);
1913 tcg_gen_subfi_i64(t1, 64, arg2);
1914 tcg_gen_shl_i64(t1, arg1, t1);
1915 tcg_gen_or_i64(ret, t0, t1);
1916 tcg_temp_free_i64(t0);
1917 tcg_temp_free_i64(t1);
1918 #endif
1921 static inline void tcg_gen_rotri_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2)
1923 /* some cases can be optimized here */
1924 if (arg2 == 0) {
1925 tcg_gen_mov_i32(ret, arg1);
1926 } else {
1927 tcg_gen_rotli_i32(ret, arg1, 32 - arg2);
1931 static inline void tcg_gen_rotri_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
1933 /* some cases can be optimized here */
1934 if (arg2 == 0) {
1935 tcg_gen_mov_i64(ret, arg1);
1936 } else {
1937 tcg_gen_rotli_i64(ret, arg1, 64 - arg2);
1941 /***************************************/
1942 /* QEMU specific operations. Their type depend on the QEMU CPU
1943 type. */
1944 #ifndef TARGET_LONG_BITS
1945 #error must include QEMU headers
1946 #endif
1948 #if TARGET_LONG_BITS == 32
1949 #define TCGv TCGv_i32
1950 #define tcg_temp_new() tcg_temp_new_i32()
1951 #define tcg_global_reg_new tcg_global_reg_new_i32
1952 #define tcg_global_mem_new tcg_global_mem_new_i32
1953 #define tcg_temp_local_new() tcg_temp_local_new_i32()
1954 #define tcg_temp_free tcg_temp_free_i32
1955 #define tcg_gen_qemu_ldst_op tcg_gen_op3i_i32
1956 #define tcg_gen_qemu_ldst_op_i64 tcg_gen_qemu_ldst_op_i64_i32
1957 #define TCGV_UNUSED(x) TCGV_UNUSED_I32(x)
1958 #define TCGV_EQUAL(a, b) TCGV_EQUAL_I32(a, b)
1959 #else
1960 #define TCGv TCGv_i64
1961 #define tcg_temp_new() tcg_temp_new_i64()
1962 #define tcg_global_reg_new tcg_global_reg_new_i64
1963 #define tcg_global_mem_new tcg_global_mem_new_i64
1964 #define tcg_temp_local_new() tcg_temp_local_new_i64()
1965 #define tcg_temp_free tcg_temp_free_i64
1966 #define tcg_gen_qemu_ldst_op tcg_gen_op3i_i64
1967 #define tcg_gen_qemu_ldst_op_i64 tcg_gen_qemu_ldst_op_i64_i64
1968 #define TCGV_UNUSED(x) TCGV_UNUSED_I64(x)
1969 #define TCGV_EQUAL(a, b) TCGV_EQUAL_I64(a, b)
1970 #endif
1972 /* debug info: write the PC of the corresponding QEMU CPU instruction */
1973 static inline void tcg_gen_debug_insn_start(uint64_t pc)
1975 /* XXX: must really use a 32 bit size for TCGArg in all cases */
1976 #if TARGET_LONG_BITS > TCG_TARGET_REG_BITS
1977 tcg_gen_op2ii(INDEX_op_debug_insn_start,
1978 (uint32_t)(pc), (uint32_t)(pc >> 32));
1979 #else
1980 tcg_gen_op1i(INDEX_op_debug_insn_start, pc);
1981 #endif
1984 static inline void tcg_gen_exit_tb(tcg_target_long val)
1986 tcg_gen_op1i(INDEX_op_exit_tb, val);
1989 static inline void tcg_gen_goto_tb(int idx)
1991 tcg_gen_op1i(INDEX_op_goto_tb, idx);
1994 #if TCG_TARGET_REG_BITS == 32
1995 static inline void tcg_gen_qemu_ld8u(TCGv ret, TCGv addr, int mem_index)
1997 #if TARGET_LONG_BITS == 32
1998 tcg_gen_op3i_i32(INDEX_op_qemu_ld8u, ret, addr, mem_index);
1999 #else
2000 tcg_gen_op4i_i32(INDEX_op_qemu_ld8u, TCGV_LOW(ret), TCGV_LOW(addr),
2001 TCGV_HIGH(addr), mem_index);
2002 tcg_gen_movi_i32(TCGV_HIGH(ret), 0);
2003 #endif
2006 static inline void tcg_gen_qemu_ld8s(TCGv ret, TCGv addr, int mem_index)
2008 #if TARGET_LONG_BITS == 32
2009 tcg_gen_op3i_i32(INDEX_op_qemu_ld8s, ret, addr, mem_index);
2010 #else
2011 tcg_gen_op4i_i32(INDEX_op_qemu_ld8s, TCGV_LOW(ret), TCGV_LOW(addr),
2012 TCGV_HIGH(addr), mem_index);
2013 tcg_gen_sari_i32(TCGV_HIGH(ret), TCGV_LOW(ret), 31);
2014 #endif
2017 static inline void tcg_gen_qemu_ld16u(TCGv ret, TCGv addr, int mem_index)
2019 #if TARGET_LONG_BITS == 32
2020 tcg_gen_op3i_i32(INDEX_op_qemu_ld16u, ret, addr, mem_index);
2021 #else
2022 tcg_gen_op4i_i32(INDEX_op_qemu_ld16u, TCGV_LOW(ret), TCGV_LOW(addr),
2023 TCGV_HIGH(addr), mem_index);
2024 tcg_gen_movi_i32(TCGV_HIGH(ret), 0);
2025 #endif
2028 static inline void tcg_gen_qemu_ld16s(TCGv ret, TCGv addr, int mem_index)
2030 #if TARGET_LONG_BITS == 32
2031 tcg_gen_op3i_i32(INDEX_op_qemu_ld16s, ret, addr, mem_index);
2032 #else
2033 tcg_gen_op4i_i32(INDEX_op_qemu_ld16s, TCGV_LOW(ret), TCGV_LOW(addr),
2034 TCGV_HIGH(addr), mem_index);
2035 tcg_gen_sari_i32(TCGV_HIGH(ret), TCGV_LOW(ret), 31);
2036 #endif
2039 static inline void tcg_gen_qemu_ld32u(TCGv ret, TCGv addr, int mem_index)
2041 #if TARGET_LONG_BITS == 32
2042 tcg_gen_op3i_i32(INDEX_op_qemu_ld32u, ret, addr, mem_index);
2043 #else
2044 tcg_gen_op4i_i32(INDEX_op_qemu_ld32u, TCGV_LOW(ret), TCGV_LOW(addr),
2045 TCGV_HIGH(addr), mem_index);
2046 tcg_gen_movi_i32(TCGV_HIGH(ret), 0);
2047 #endif
2050 static inline void tcg_gen_qemu_ld32s(TCGv ret, TCGv addr, int mem_index)
2052 #if TARGET_LONG_BITS == 32
2053 tcg_gen_op3i_i32(INDEX_op_qemu_ld32u, ret, addr, mem_index);
2054 #else
2055 tcg_gen_op4i_i32(INDEX_op_qemu_ld32u, TCGV_LOW(ret), TCGV_LOW(addr),
2056 TCGV_HIGH(addr), mem_index);
2057 tcg_gen_sari_i32(TCGV_HIGH(ret), TCGV_LOW(ret), 31);
2058 #endif
2061 static inline void tcg_gen_qemu_ld64(TCGv_i64 ret, TCGv addr, int mem_index)
2063 #if TARGET_LONG_BITS == 32
2064 tcg_gen_op4i_i32(INDEX_op_qemu_ld64, TCGV_LOW(ret), TCGV_HIGH(ret), addr, mem_index);
2065 #else
2066 tcg_gen_op5i_i32(INDEX_op_qemu_ld64, TCGV_LOW(ret), TCGV_HIGH(ret),
2067 TCGV_LOW(addr), TCGV_HIGH(addr), mem_index);
2068 #endif
2071 static inline void tcg_gen_qemu_st8(TCGv arg, TCGv addr, int mem_index)
2073 #if TARGET_LONG_BITS == 32
2074 tcg_gen_op3i_i32(INDEX_op_qemu_st8, arg, addr, mem_index);
2075 #else
2076 tcg_gen_op4i_i32(INDEX_op_qemu_st8, TCGV_LOW(arg), TCGV_LOW(addr),
2077 TCGV_HIGH(addr), mem_index);
2078 #endif
2081 static inline void tcg_gen_qemu_st16(TCGv arg, TCGv addr, int mem_index)
2083 #if TARGET_LONG_BITS == 32
2084 tcg_gen_op3i_i32(INDEX_op_qemu_st16, arg, addr, mem_index);
2085 #else
2086 tcg_gen_op4i_i32(INDEX_op_qemu_st16, TCGV_LOW(arg), TCGV_LOW(addr),
2087 TCGV_HIGH(addr), mem_index);
2088 #endif
2091 static inline void tcg_gen_qemu_st32(TCGv arg, TCGv addr, int mem_index)
2093 #if TARGET_LONG_BITS == 32
2094 tcg_gen_op3i_i32(INDEX_op_qemu_st32, arg, addr, mem_index);
2095 #else
2096 tcg_gen_op4i_i32(INDEX_op_qemu_st32, TCGV_LOW(arg), TCGV_LOW(addr),
2097 TCGV_HIGH(addr), mem_index);
2098 #endif
2101 static inline void tcg_gen_qemu_st64(TCGv_i64 arg, TCGv addr, int mem_index)
2103 #if TARGET_LONG_BITS == 32
2104 tcg_gen_op4i_i32(INDEX_op_qemu_st64, TCGV_LOW(arg), TCGV_HIGH(arg), addr,
2105 mem_index);
2106 #else
2107 tcg_gen_op5i_i32(INDEX_op_qemu_st64, TCGV_LOW(arg), TCGV_HIGH(arg),
2108 TCGV_LOW(addr), TCGV_HIGH(addr), mem_index);
2109 #endif
2112 #define tcg_gen_ld_ptr tcg_gen_ld_i32
2113 #define tcg_gen_discard_ptr tcg_gen_discard_i32
2115 #else /* TCG_TARGET_REG_BITS == 32 */
2117 static inline void tcg_gen_qemu_ld8u(TCGv ret, TCGv addr, int mem_index)
2119 tcg_gen_qemu_ldst_op(INDEX_op_qemu_ld8u, ret, addr, mem_index);
2122 static inline void tcg_gen_qemu_ld8s(TCGv ret, TCGv addr, int mem_index)
2124 tcg_gen_qemu_ldst_op(INDEX_op_qemu_ld8s, ret, addr, mem_index);
2127 static inline void tcg_gen_qemu_ld16u(TCGv ret, TCGv addr, int mem_index)
2129 tcg_gen_qemu_ldst_op(INDEX_op_qemu_ld16u, ret, addr, mem_index);
2132 static inline void tcg_gen_qemu_ld16s(TCGv ret, TCGv addr, int mem_index)
2134 tcg_gen_qemu_ldst_op(INDEX_op_qemu_ld16s, ret, addr, mem_index);
2137 static inline void tcg_gen_qemu_ld32u(TCGv ret, TCGv addr, int mem_index)
2139 tcg_gen_qemu_ldst_op(INDEX_op_qemu_ld32u, ret, addr, mem_index);
2142 static inline void tcg_gen_qemu_ld32s(TCGv ret, TCGv addr, int mem_index)
2144 tcg_gen_qemu_ldst_op(INDEX_op_qemu_ld32s, ret, addr, mem_index);
2147 static inline void tcg_gen_qemu_ld64(TCGv_i64 ret, TCGv addr, int mem_index)
2149 tcg_gen_qemu_ldst_op_i64(INDEX_op_qemu_ld64, ret, addr, mem_index);
2152 static inline void tcg_gen_qemu_st8(TCGv arg, TCGv addr, int mem_index)
2154 tcg_gen_qemu_ldst_op(INDEX_op_qemu_st8, arg, addr, mem_index);
2157 static inline void tcg_gen_qemu_st16(TCGv arg, TCGv addr, int mem_index)
2159 tcg_gen_qemu_ldst_op(INDEX_op_qemu_st16, arg, addr, mem_index);
2162 static inline void tcg_gen_qemu_st32(TCGv arg, TCGv addr, int mem_index)
2164 tcg_gen_qemu_ldst_op(INDEX_op_qemu_st32, arg, addr, mem_index);
2167 static inline void tcg_gen_qemu_st64(TCGv_i64 arg, TCGv addr, int mem_index)
2169 tcg_gen_qemu_ldst_op_i64(INDEX_op_qemu_st64, arg, addr, mem_index);
2172 #define tcg_gen_ld_ptr tcg_gen_ld_i64
2173 #define tcg_gen_discard_ptr tcg_gen_discard_i64
2175 #endif /* TCG_TARGET_REG_BITS != 32 */
2177 #if TARGET_LONG_BITS == 64
2178 #define TCG_TYPE_TL TCG_TYPE_I64
2179 #define tcg_gen_movi_tl tcg_gen_movi_i64
2180 #define tcg_gen_mov_tl tcg_gen_mov_i64
2181 #define tcg_gen_ld8u_tl tcg_gen_ld8u_i64
2182 #define tcg_gen_ld8s_tl tcg_gen_ld8s_i64
2183 #define tcg_gen_ld16u_tl tcg_gen_ld16u_i64
2184 #define tcg_gen_ld16s_tl tcg_gen_ld16s_i64
2185 #define tcg_gen_ld32u_tl tcg_gen_ld32u_i64
2186 #define tcg_gen_ld32s_tl tcg_gen_ld32s_i64
2187 #define tcg_gen_ld_tl tcg_gen_ld_i64
2188 #define tcg_gen_st8_tl tcg_gen_st8_i64
2189 #define tcg_gen_st16_tl tcg_gen_st16_i64
2190 #define tcg_gen_st32_tl tcg_gen_st32_i64
2191 #define tcg_gen_st_tl tcg_gen_st_i64
2192 #define tcg_gen_add_tl tcg_gen_add_i64
2193 #define tcg_gen_addi_tl tcg_gen_addi_i64
2194 #define tcg_gen_sub_tl tcg_gen_sub_i64
2195 #define tcg_gen_neg_tl tcg_gen_neg_i64
2196 #define tcg_gen_subfi_tl tcg_gen_subfi_i64
2197 #define tcg_gen_subi_tl tcg_gen_subi_i64
2198 #define tcg_gen_and_tl tcg_gen_and_i64
2199 #define tcg_gen_andi_tl tcg_gen_andi_i64
2200 #define tcg_gen_or_tl tcg_gen_or_i64
2201 #define tcg_gen_ori_tl tcg_gen_ori_i64
2202 #define tcg_gen_xor_tl tcg_gen_xor_i64
2203 #define tcg_gen_xori_tl tcg_gen_xori_i64
2204 #define tcg_gen_not_tl tcg_gen_not_i64
2205 #define tcg_gen_shl_tl tcg_gen_shl_i64
2206 #define tcg_gen_shli_tl tcg_gen_shli_i64
2207 #define tcg_gen_shr_tl tcg_gen_shr_i64
2208 #define tcg_gen_shri_tl tcg_gen_shri_i64
2209 #define tcg_gen_sar_tl tcg_gen_sar_i64
2210 #define tcg_gen_sari_tl tcg_gen_sari_i64
2211 #define tcg_gen_brcond_tl tcg_gen_brcond_i64
2212 #define tcg_gen_brcondi_tl tcg_gen_brcondi_i64
2213 #define tcg_gen_setcond_tl tcg_gen_setcond_i64
2214 #define tcg_gen_setcondi_tl tcg_gen_setcondi_i64
2215 #define tcg_gen_mul_tl tcg_gen_mul_i64
2216 #define tcg_gen_muli_tl tcg_gen_muli_i64
2217 #define tcg_gen_div_tl tcg_gen_div_i64
2218 #define tcg_gen_rem_tl tcg_gen_rem_i64
2219 #define tcg_gen_divu_tl tcg_gen_divu_i64
2220 #define tcg_gen_remu_tl tcg_gen_remu_i64
2221 #define tcg_gen_discard_tl tcg_gen_discard_i64
2222 #define tcg_gen_trunc_tl_i32 tcg_gen_trunc_i64_i32
2223 #define tcg_gen_trunc_i64_tl tcg_gen_mov_i64
2224 #define tcg_gen_extu_i32_tl tcg_gen_extu_i32_i64
2225 #define tcg_gen_ext_i32_tl tcg_gen_ext_i32_i64
2226 #define tcg_gen_extu_tl_i64 tcg_gen_mov_i64
2227 #define tcg_gen_ext_tl_i64 tcg_gen_mov_i64
2228 #define tcg_gen_ext8u_tl tcg_gen_ext8u_i64
2229 #define tcg_gen_ext8s_tl tcg_gen_ext8s_i64
2230 #define tcg_gen_ext16u_tl tcg_gen_ext16u_i64
2231 #define tcg_gen_ext16s_tl tcg_gen_ext16s_i64
2232 #define tcg_gen_ext32u_tl tcg_gen_ext32u_i64
2233 #define tcg_gen_ext32s_tl tcg_gen_ext32s_i64
2234 #define tcg_gen_bswap16_tl tcg_gen_bswap16_i64
2235 #define tcg_gen_bswap32_tl tcg_gen_bswap32_i64
2236 #define tcg_gen_bswap64_tl tcg_gen_bswap64_i64
2237 #define tcg_gen_concat_tl_i64 tcg_gen_concat32_i64
2238 #define tcg_gen_andc_tl tcg_gen_andc_i64
2239 #define tcg_gen_eqv_tl tcg_gen_eqv_i64
2240 #define tcg_gen_nand_tl tcg_gen_nand_i64
2241 #define tcg_gen_nor_tl tcg_gen_nor_i64
2242 #define tcg_gen_orc_tl tcg_gen_orc_i64
2243 #define tcg_gen_rotl_tl tcg_gen_rotl_i64
2244 #define tcg_gen_rotli_tl tcg_gen_rotli_i64
2245 #define tcg_gen_rotr_tl tcg_gen_rotr_i64
2246 #define tcg_gen_rotri_tl tcg_gen_rotri_i64
2247 #define tcg_const_tl tcg_const_i64
2248 #define tcg_const_local_tl tcg_const_local_i64
2249 #else
2250 #define TCG_TYPE_TL TCG_TYPE_I32
2251 #define tcg_gen_movi_tl tcg_gen_movi_i32
2252 #define tcg_gen_mov_tl tcg_gen_mov_i32
2253 #define tcg_gen_ld8u_tl tcg_gen_ld8u_i32
2254 #define tcg_gen_ld8s_tl tcg_gen_ld8s_i32
2255 #define tcg_gen_ld16u_tl tcg_gen_ld16u_i32
2256 #define tcg_gen_ld16s_tl tcg_gen_ld16s_i32
2257 #define tcg_gen_ld32u_tl tcg_gen_ld_i32
2258 #define tcg_gen_ld32s_tl tcg_gen_ld_i32
2259 #define tcg_gen_ld_tl tcg_gen_ld_i32
2260 #define tcg_gen_st8_tl tcg_gen_st8_i32
2261 #define tcg_gen_st16_tl tcg_gen_st16_i32
2262 #define tcg_gen_st32_tl tcg_gen_st_i32
2263 #define tcg_gen_st_tl tcg_gen_st_i32
2264 #define tcg_gen_add_tl tcg_gen_add_i32
2265 #define tcg_gen_addi_tl tcg_gen_addi_i32
2266 #define tcg_gen_sub_tl tcg_gen_sub_i32
2267 #define tcg_gen_neg_tl tcg_gen_neg_i32
2268 #define tcg_gen_subfi_tl tcg_gen_subfi_i32
2269 #define tcg_gen_subi_tl tcg_gen_subi_i32
2270 #define tcg_gen_and_tl tcg_gen_and_i32
2271 #define tcg_gen_andi_tl tcg_gen_andi_i32
2272 #define tcg_gen_or_tl tcg_gen_or_i32
2273 #define tcg_gen_ori_tl tcg_gen_ori_i32
2274 #define tcg_gen_xor_tl tcg_gen_xor_i32
2275 #define tcg_gen_xori_tl tcg_gen_xori_i32
2276 #define tcg_gen_not_tl tcg_gen_not_i32
2277 #define tcg_gen_shl_tl tcg_gen_shl_i32
2278 #define tcg_gen_shli_tl tcg_gen_shli_i32
2279 #define tcg_gen_shr_tl tcg_gen_shr_i32
2280 #define tcg_gen_shri_tl tcg_gen_shri_i32
2281 #define tcg_gen_sar_tl tcg_gen_sar_i32
2282 #define tcg_gen_sari_tl tcg_gen_sari_i32
2283 #define tcg_gen_brcond_tl tcg_gen_brcond_i32
2284 #define tcg_gen_brcondi_tl tcg_gen_brcondi_i32
2285 #define tcg_gen_setcond_tl tcg_gen_setcond_i32
2286 #define tcg_gen_setcondi_tl tcg_gen_setcondi_i32
2287 #define tcg_gen_mul_tl tcg_gen_mul_i32
2288 #define tcg_gen_muli_tl tcg_gen_muli_i32
2289 #define tcg_gen_div_tl tcg_gen_div_i32
2290 #define tcg_gen_rem_tl tcg_gen_rem_i32
2291 #define tcg_gen_divu_tl tcg_gen_divu_i32
2292 #define tcg_gen_remu_tl tcg_gen_remu_i32
2293 #define tcg_gen_discard_tl tcg_gen_discard_i32
2294 #define tcg_gen_trunc_tl_i32 tcg_gen_mov_i32
2295 #define tcg_gen_trunc_i64_tl tcg_gen_trunc_i64_i32
2296 #define tcg_gen_extu_i32_tl tcg_gen_mov_i32
2297 #define tcg_gen_ext_i32_tl tcg_gen_mov_i32
2298 #define tcg_gen_extu_tl_i64 tcg_gen_extu_i32_i64
2299 #define tcg_gen_ext_tl_i64 tcg_gen_ext_i32_i64
2300 #define tcg_gen_ext8u_tl tcg_gen_ext8u_i32
2301 #define tcg_gen_ext8s_tl tcg_gen_ext8s_i32
2302 #define tcg_gen_ext16u_tl tcg_gen_ext16u_i32
2303 #define tcg_gen_ext16s_tl tcg_gen_ext16s_i32
2304 #define tcg_gen_ext32u_tl tcg_gen_mov_i32
2305 #define tcg_gen_ext32s_tl tcg_gen_mov_i32
2306 #define tcg_gen_bswap16_tl tcg_gen_bswap16_i32
2307 #define tcg_gen_bswap32_tl tcg_gen_bswap32_i32
2308 #define tcg_gen_concat_tl_i64 tcg_gen_concat_i32_i64
2309 #define tcg_gen_andc_tl tcg_gen_andc_i32
2310 #define tcg_gen_eqv_tl tcg_gen_eqv_i32
2311 #define tcg_gen_nand_tl tcg_gen_nand_i32
2312 #define tcg_gen_nor_tl tcg_gen_nor_i32
2313 #define tcg_gen_orc_tl tcg_gen_orc_i32
2314 #define tcg_gen_rotl_tl tcg_gen_rotl_i32
2315 #define tcg_gen_rotli_tl tcg_gen_rotli_i32
2316 #define tcg_gen_rotr_tl tcg_gen_rotr_i32
2317 #define tcg_gen_rotri_tl tcg_gen_rotri_i32
2318 #define tcg_const_tl tcg_const_i32
2319 #define tcg_const_local_tl tcg_const_local_i32
2320 #endif
2322 #if TCG_TARGET_REG_BITS == 32
2323 #define tcg_gen_add_ptr tcg_gen_add_i32
2324 #define tcg_gen_addi_ptr tcg_gen_addi_i32
2325 #define tcg_gen_ext_i32_ptr tcg_gen_mov_i32
2326 #else /* TCG_TARGET_REG_BITS == 32 */
2327 #define tcg_gen_add_ptr tcg_gen_add_i64
2328 #define tcg_gen_addi_ptr tcg_gen_addi_i64
2329 #define tcg_gen_ext_i32_ptr tcg_gen_ext_i32_i64
2330 #endif /* TCG_TARGET_REG_BITS != 32 */