Implement the bus structure for PAPR virtual IO
[qemu/qmp-unstable.git] / tcg / tcg-op.h
blob207a89fd9741283b39ac24317d66011af43996b0
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(TCGOpcode 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(TCGOpcode opc, TCGv_i64 arg1)
36 *gen_opc_ptr++ = opc;
37 *gen_opparam_ptr++ = GET_TCGV_I64(arg1);
40 static inline void tcg_gen_op1i(TCGOpcode opc, TCGArg arg1)
42 *gen_opc_ptr++ = opc;
43 *gen_opparam_ptr++ = arg1;
46 static inline void tcg_gen_op2_i32(TCGOpcode 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(TCGOpcode 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(TCGOpcode 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(TCGOpcode 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(TCGOpcode 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(TCGOpcode 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(TCGOpcode 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(TCGOpcode opc, TCGv_i32 arg1,
100 TCGv_i32 arg2, 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(TCGOpcode opc, TCGv_i64 arg1,
109 TCGv_i64 arg2, 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(TCGOpcode opc, TCGv_i32 val,
118 TCGv_ptr base, 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(TCGOpcode opc, TCGv_i64 val,
127 TCGv_ptr base, 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(TCGOpcode opc, TCGv_i64 val,
136 TCGv_i32 addr, 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(TCGOpcode opc, TCGv_i64 val,
145 TCGv_i64 addr, 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(TCGOpcode 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(TCGOpcode 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(TCGOpcode 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(TCGOpcode 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(TCGOpcode 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(TCGOpcode 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(TCGOpcode 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(TCGOpcode 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(TCGOpcode 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(TCGOpcode 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_op5ii_i32(TCGOpcode opc, TCGv_i32 arg1,
258 TCGv_i32 arg2, TCGv_i32 arg3,
259 TCGArg arg4, TCGArg arg5)
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++ = arg4;
266 *gen_opparam_ptr++ = arg5;
269 static inline void tcg_gen_op5ii_i64(TCGOpcode opc, TCGv_i64 arg1,
270 TCGv_i64 arg2, TCGv_i64 arg3,
271 TCGArg arg4, TCGArg arg5)
273 *gen_opc_ptr++ = opc;
274 *gen_opparam_ptr++ = GET_TCGV_I64(arg1);
275 *gen_opparam_ptr++ = GET_TCGV_I64(arg2);
276 *gen_opparam_ptr++ = GET_TCGV_I64(arg3);
277 *gen_opparam_ptr++ = arg4;
278 *gen_opparam_ptr++ = arg5;
281 static inline void tcg_gen_op6_i32(TCGOpcode opc, TCGv_i32 arg1, TCGv_i32 arg2,
282 TCGv_i32 arg3, TCGv_i32 arg4, TCGv_i32 arg5,
283 TCGv_i32 arg6)
285 *gen_opc_ptr++ = opc;
286 *gen_opparam_ptr++ = GET_TCGV_I32(arg1);
287 *gen_opparam_ptr++ = GET_TCGV_I32(arg2);
288 *gen_opparam_ptr++ = GET_TCGV_I32(arg3);
289 *gen_opparam_ptr++ = GET_TCGV_I32(arg4);
290 *gen_opparam_ptr++ = GET_TCGV_I32(arg5);
291 *gen_opparam_ptr++ = GET_TCGV_I32(arg6);
294 static inline void tcg_gen_op6_i64(TCGOpcode opc, TCGv_i64 arg1, TCGv_i64 arg2,
295 TCGv_i64 arg3, TCGv_i64 arg4, TCGv_i64 arg5,
296 TCGv_i64 arg6)
298 *gen_opc_ptr++ = opc;
299 *gen_opparam_ptr++ = GET_TCGV_I64(arg1);
300 *gen_opparam_ptr++ = GET_TCGV_I64(arg2);
301 *gen_opparam_ptr++ = GET_TCGV_I64(arg3);
302 *gen_opparam_ptr++ = GET_TCGV_I64(arg4);
303 *gen_opparam_ptr++ = GET_TCGV_I64(arg5);
304 *gen_opparam_ptr++ = GET_TCGV_I64(arg6);
307 static inline void tcg_gen_op6i_i32(TCGOpcode opc, TCGv_i32 arg1, TCGv_i32 arg2,
308 TCGv_i32 arg3, TCGv_i32 arg4,
309 TCGv_i32 arg5, TCGArg arg6)
311 *gen_opc_ptr++ = opc;
312 *gen_opparam_ptr++ = GET_TCGV_I32(arg1);
313 *gen_opparam_ptr++ = GET_TCGV_I32(arg2);
314 *gen_opparam_ptr++ = GET_TCGV_I32(arg3);
315 *gen_opparam_ptr++ = GET_TCGV_I32(arg4);
316 *gen_opparam_ptr++ = GET_TCGV_I32(arg5);
317 *gen_opparam_ptr++ = arg6;
320 static inline void tcg_gen_op6i_i64(TCGOpcode opc, TCGv_i64 arg1, TCGv_i64 arg2,
321 TCGv_i64 arg3, TCGv_i64 arg4,
322 TCGv_i64 arg5, TCGArg arg6)
324 *gen_opc_ptr++ = opc;
325 *gen_opparam_ptr++ = GET_TCGV_I64(arg1);
326 *gen_opparam_ptr++ = GET_TCGV_I64(arg2);
327 *gen_opparam_ptr++ = GET_TCGV_I64(arg3);
328 *gen_opparam_ptr++ = GET_TCGV_I64(arg4);
329 *gen_opparam_ptr++ = GET_TCGV_I64(arg5);
330 *gen_opparam_ptr++ = arg6;
333 static inline void tcg_gen_op6ii_i32(TCGOpcode opc, TCGv_i32 arg1,
334 TCGv_i32 arg2, TCGv_i32 arg3,
335 TCGv_i32 arg4, TCGArg arg5, TCGArg arg6)
337 *gen_opc_ptr++ = opc;
338 *gen_opparam_ptr++ = GET_TCGV_I32(arg1);
339 *gen_opparam_ptr++ = GET_TCGV_I32(arg2);
340 *gen_opparam_ptr++ = GET_TCGV_I32(arg3);
341 *gen_opparam_ptr++ = GET_TCGV_I32(arg4);
342 *gen_opparam_ptr++ = arg5;
343 *gen_opparam_ptr++ = arg6;
346 static inline void tcg_gen_op6ii_i64(TCGOpcode opc, TCGv_i64 arg1,
347 TCGv_i64 arg2, TCGv_i64 arg3,
348 TCGv_i64 arg4, TCGArg arg5, TCGArg arg6)
350 *gen_opc_ptr++ = opc;
351 *gen_opparam_ptr++ = GET_TCGV_I64(arg1);
352 *gen_opparam_ptr++ = GET_TCGV_I64(arg2);
353 *gen_opparam_ptr++ = GET_TCGV_I64(arg3);
354 *gen_opparam_ptr++ = GET_TCGV_I64(arg4);
355 *gen_opparam_ptr++ = arg5;
356 *gen_opparam_ptr++ = arg6;
359 static inline void gen_set_label(int n)
361 tcg_gen_op1i(INDEX_op_set_label, n);
364 static inline void tcg_gen_br(int label)
366 tcg_gen_op1i(INDEX_op_br, label);
369 static inline void tcg_gen_mov_i32(TCGv_i32 ret, TCGv_i32 arg)
371 if (!TCGV_EQUAL_I32(ret, arg))
372 tcg_gen_op2_i32(INDEX_op_mov_i32, ret, arg);
375 static inline void tcg_gen_movi_i32(TCGv_i32 ret, int32_t arg)
377 tcg_gen_op2i_i32(INDEX_op_movi_i32, ret, arg);
380 /* A version of dh_sizemask from def-helper.h that doesn't rely on
381 preprocessor magic. */
382 static inline int tcg_gen_sizemask(int n, int is_64bit, int is_signed)
384 return (is_64bit << n*2) | (is_signed << (n*2 + 1));
387 /* helper calls */
388 static inline void tcg_gen_helperN(void *func, int flags, int sizemask,
389 TCGArg ret, int nargs, TCGArg *args)
391 TCGv_ptr fn;
392 fn = tcg_const_ptr((tcg_target_long)func);
393 tcg_gen_callN(&tcg_ctx, fn, flags, sizemask, ret,
394 nargs, args);
395 tcg_temp_free_ptr(fn);
398 /* Note: Both tcg_gen_helper32() and tcg_gen_helper64() are currently
399 reserved for helpers in tcg-runtime.c. These helpers are all const
400 and pure, hence the call to tcg_gen_callN() with TCG_CALL_CONST |
401 TCG_CALL_PURE. This may need to be adjusted if these functions
402 start to be used with other helpers. */
403 static inline void tcg_gen_helper32(void *func, int sizemask, TCGv_i32 ret,
404 TCGv_i32 a, TCGv_i32 b)
406 TCGv_ptr fn;
407 TCGArg args[2];
408 fn = tcg_const_ptr((tcg_target_long)func);
409 args[0] = GET_TCGV_I32(a);
410 args[1] = GET_TCGV_I32(b);
411 tcg_gen_callN(&tcg_ctx, fn, TCG_CALL_CONST | TCG_CALL_PURE, sizemask,
412 GET_TCGV_I32(ret), 2, args);
413 tcg_temp_free_ptr(fn);
416 static inline void tcg_gen_helper64(void *func, int sizemask, TCGv_i64 ret,
417 TCGv_i64 a, TCGv_i64 b)
419 TCGv_ptr fn;
420 TCGArg args[2];
421 fn = tcg_const_ptr((tcg_target_long)func);
422 args[0] = GET_TCGV_I64(a);
423 args[1] = GET_TCGV_I64(b);
424 tcg_gen_callN(&tcg_ctx, fn, TCG_CALL_CONST | TCG_CALL_PURE, sizemask,
425 GET_TCGV_I64(ret), 2, args);
426 tcg_temp_free_ptr(fn);
429 /* 32 bit ops */
431 static inline void tcg_gen_ld8u_i32(TCGv_i32 ret, TCGv_ptr arg2, tcg_target_long offset)
433 tcg_gen_ldst_op_i32(INDEX_op_ld8u_i32, ret, arg2, offset);
436 static inline void tcg_gen_ld8s_i32(TCGv_i32 ret, TCGv_ptr arg2, tcg_target_long offset)
438 tcg_gen_ldst_op_i32(INDEX_op_ld8s_i32, ret, arg2, offset);
441 static inline void tcg_gen_ld16u_i32(TCGv_i32 ret, TCGv_ptr arg2, tcg_target_long offset)
443 tcg_gen_ldst_op_i32(INDEX_op_ld16u_i32, ret, arg2, offset);
446 static inline void tcg_gen_ld16s_i32(TCGv_i32 ret, TCGv_ptr arg2, tcg_target_long offset)
448 tcg_gen_ldst_op_i32(INDEX_op_ld16s_i32, ret, arg2, offset);
451 static inline void tcg_gen_ld_i32(TCGv_i32 ret, TCGv_ptr arg2, tcg_target_long offset)
453 tcg_gen_ldst_op_i32(INDEX_op_ld_i32, ret, arg2, offset);
456 static inline void tcg_gen_st8_i32(TCGv_i32 arg1, TCGv_ptr arg2, tcg_target_long offset)
458 tcg_gen_ldst_op_i32(INDEX_op_st8_i32, arg1, arg2, offset);
461 static inline void tcg_gen_st16_i32(TCGv_i32 arg1, TCGv_ptr arg2, tcg_target_long offset)
463 tcg_gen_ldst_op_i32(INDEX_op_st16_i32, arg1, arg2, offset);
466 static inline void tcg_gen_st_i32(TCGv_i32 arg1, TCGv_ptr arg2, tcg_target_long offset)
468 tcg_gen_ldst_op_i32(INDEX_op_st_i32, arg1, arg2, offset);
471 static inline void tcg_gen_add_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
473 tcg_gen_op3_i32(INDEX_op_add_i32, ret, arg1, arg2);
476 static inline void tcg_gen_addi_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2)
478 /* some cases can be optimized here */
479 if (arg2 == 0) {
480 tcg_gen_mov_i32(ret, arg1);
481 } else {
482 TCGv_i32 t0 = tcg_const_i32(arg2);
483 tcg_gen_add_i32(ret, arg1, t0);
484 tcg_temp_free_i32(t0);
488 static inline void tcg_gen_sub_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
490 tcg_gen_op3_i32(INDEX_op_sub_i32, ret, arg1, arg2);
493 static inline void tcg_gen_subfi_i32(TCGv_i32 ret, int32_t arg1, TCGv_i32 arg2)
495 TCGv_i32 t0 = tcg_const_i32(arg1);
496 tcg_gen_sub_i32(ret, t0, arg2);
497 tcg_temp_free_i32(t0);
500 static inline void tcg_gen_subi_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2)
502 /* some cases can be optimized here */
503 if (arg2 == 0) {
504 tcg_gen_mov_i32(ret, arg1);
505 } else {
506 TCGv_i32 t0 = tcg_const_i32(arg2);
507 tcg_gen_sub_i32(ret, arg1, t0);
508 tcg_temp_free_i32(t0);
512 static inline void tcg_gen_and_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
514 if (TCGV_EQUAL_I32(arg1, arg2)) {
515 tcg_gen_mov_i32(ret, arg1);
516 } else {
517 tcg_gen_op3_i32(INDEX_op_and_i32, ret, arg1, arg2);
521 static inline void tcg_gen_andi_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2)
523 /* some cases can be optimized here */
524 if (arg2 == 0) {
525 tcg_gen_movi_i32(ret, 0);
526 } else if (arg2 == 0xffffffff) {
527 tcg_gen_mov_i32(ret, arg1);
528 } else {
529 TCGv_i32 t0 = tcg_const_i32(arg2);
530 tcg_gen_and_i32(ret, arg1, t0);
531 tcg_temp_free_i32(t0);
535 static inline void tcg_gen_or_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
537 if (TCGV_EQUAL_I32(arg1, arg2)) {
538 tcg_gen_mov_i32(ret, arg1);
539 } else {
540 tcg_gen_op3_i32(INDEX_op_or_i32, ret, arg1, arg2);
544 static inline void tcg_gen_ori_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2)
546 /* some cases can be optimized here */
547 if (arg2 == 0xffffffff) {
548 tcg_gen_movi_i32(ret, 0xffffffff);
549 } else if (arg2 == 0) {
550 tcg_gen_mov_i32(ret, arg1);
551 } else {
552 TCGv_i32 t0 = tcg_const_i32(arg2);
553 tcg_gen_or_i32(ret, arg1, t0);
554 tcg_temp_free_i32(t0);
558 static inline void tcg_gen_xor_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
560 if (TCGV_EQUAL_I32(arg1, arg2)) {
561 tcg_gen_movi_i32(ret, 0);
562 } else {
563 tcg_gen_op3_i32(INDEX_op_xor_i32, ret, arg1, arg2);
567 static inline void tcg_gen_xori_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2)
569 /* some cases can be optimized here */
570 if (arg2 == 0) {
571 tcg_gen_mov_i32(ret, arg1);
572 } else {
573 TCGv_i32 t0 = tcg_const_i32(arg2);
574 tcg_gen_xor_i32(ret, arg1, t0);
575 tcg_temp_free_i32(t0);
579 static inline void tcg_gen_shl_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
581 tcg_gen_op3_i32(INDEX_op_shl_i32, ret, arg1, arg2);
584 static inline void tcg_gen_shli_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2)
586 if (arg2 == 0) {
587 tcg_gen_mov_i32(ret, arg1);
588 } else {
589 TCGv_i32 t0 = tcg_const_i32(arg2);
590 tcg_gen_shl_i32(ret, arg1, t0);
591 tcg_temp_free_i32(t0);
595 static inline void tcg_gen_shr_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
597 tcg_gen_op3_i32(INDEX_op_shr_i32, ret, arg1, arg2);
600 static inline void tcg_gen_shri_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2)
602 if (arg2 == 0) {
603 tcg_gen_mov_i32(ret, arg1);
604 } else {
605 TCGv_i32 t0 = tcg_const_i32(arg2);
606 tcg_gen_shr_i32(ret, arg1, t0);
607 tcg_temp_free_i32(t0);
611 static inline void tcg_gen_sar_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
613 tcg_gen_op3_i32(INDEX_op_sar_i32, ret, arg1, arg2);
616 static inline void tcg_gen_sari_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2)
618 if (arg2 == 0) {
619 tcg_gen_mov_i32(ret, arg1);
620 } else {
621 TCGv_i32 t0 = tcg_const_i32(arg2);
622 tcg_gen_sar_i32(ret, arg1, t0);
623 tcg_temp_free_i32(t0);
627 static inline void tcg_gen_brcond_i32(TCGCond cond, TCGv_i32 arg1,
628 TCGv_i32 arg2, int label_index)
630 tcg_gen_op4ii_i32(INDEX_op_brcond_i32, arg1, arg2, cond, label_index);
633 static inline void tcg_gen_brcondi_i32(TCGCond cond, TCGv_i32 arg1,
634 int32_t arg2, int label_index)
636 TCGv_i32 t0 = tcg_const_i32(arg2);
637 tcg_gen_brcond_i32(cond, arg1, t0, label_index);
638 tcg_temp_free_i32(t0);
641 static inline void tcg_gen_setcond_i32(TCGCond cond, TCGv_i32 ret,
642 TCGv_i32 arg1, TCGv_i32 arg2)
644 tcg_gen_op4i_i32(INDEX_op_setcond_i32, ret, arg1, arg2, cond);
647 static inline void tcg_gen_setcondi_i32(TCGCond cond, TCGv_i32 ret,
648 TCGv_i32 arg1, int32_t arg2)
650 TCGv_i32 t0 = tcg_const_i32(arg2);
651 tcg_gen_setcond_i32(cond, ret, arg1, t0);
652 tcg_temp_free_i32(t0);
655 static inline void tcg_gen_mul_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
657 tcg_gen_op3_i32(INDEX_op_mul_i32, ret, arg1, arg2);
660 static inline void tcg_gen_muli_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2)
662 TCGv_i32 t0 = tcg_const_i32(arg2);
663 tcg_gen_mul_i32(ret, arg1, t0);
664 tcg_temp_free_i32(t0);
667 #ifdef TCG_TARGET_HAS_div_i32
668 static inline void tcg_gen_div_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
670 tcg_gen_op3_i32(INDEX_op_div_i32, ret, arg1, arg2);
673 static inline void tcg_gen_rem_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
675 tcg_gen_op3_i32(INDEX_op_rem_i32, ret, arg1, arg2);
678 static inline void tcg_gen_divu_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
680 tcg_gen_op3_i32(INDEX_op_divu_i32, ret, arg1, arg2);
683 static inline void tcg_gen_remu_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
685 tcg_gen_op3_i32(INDEX_op_remu_i32, ret, arg1, arg2);
687 #elif defined(TCG_TARGET_HAS_div2_i32)
688 static inline void tcg_gen_div_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
690 TCGv_i32 t0;
691 t0 = tcg_temp_new_i32();
692 tcg_gen_sari_i32(t0, arg1, 31);
693 tcg_gen_op5_i32(INDEX_op_div2_i32, ret, t0, arg1, t0, arg2);
694 tcg_temp_free_i32(t0);
697 static inline void tcg_gen_rem_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
699 TCGv_i32 t0;
700 t0 = tcg_temp_new_i32();
701 tcg_gen_sari_i32(t0, arg1, 31);
702 tcg_gen_op5_i32(INDEX_op_div2_i32, t0, ret, arg1, t0, arg2);
703 tcg_temp_free_i32(t0);
706 static inline void tcg_gen_divu_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
708 TCGv_i32 t0;
709 t0 = tcg_temp_new_i32();
710 tcg_gen_movi_i32(t0, 0);
711 tcg_gen_op5_i32(INDEX_op_divu2_i32, ret, t0, arg1, t0, arg2);
712 tcg_temp_free_i32(t0);
715 static inline void tcg_gen_remu_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
717 TCGv_i32 t0;
718 t0 = tcg_temp_new_i32();
719 tcg_gen_movi_i32(t0, 0);
720 tcg_gen_op5_i32(INDEX_op_divu2_i32, t0, ret, arg1, t0, arg2);
721 tcg_temp_free_i32(t0);
723 #else
724 static inline void tcg_gen_div_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
726 int sizemask = 0;
727 /* Return value and both arguments are 32-bit and signed. */
728 sizemask |= tcg_gen_sizemask(0, 0, 1);
729 sizemask |= tcg_gen_sizemask(1, 0, 1);
730 sizemask |= tcg_gen_sizemask(2, 0, 1);
732 tcg_gen_helper32(tcg_helper_div_i32, sizemask, ret, arg1, arg2);
735 static inline void tcg_gen_rem_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
737 int sizemask = 0;
738 /* Return value and both arguments are 32-bit and signed. */
739 sizemask |= tcg_gen_sizemask(0, 0, 1);
740 sizemask |= tcg_gen_sizemask(1, 0, 1);
741 sizemask |= tcg_gen_sizemask(2, 0, 1);
743 tcg_gen_helper32(tcg_helper_rem_i32, sizemask, ret, arg1, arg2);
746 static inline void tcg_gen_divu_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
748 int sizemask = 0;
749 /* Return value and both arguments are 32-bit and unsigned. */
750 sizemask |= tcg_gen_sizemask(0, 0, 0);
751 sizemask |= tcg_gen_sizemask(1, 0, 0);
752 sizemask |= tcg_gen_sizemask(2, 0, 0);
754 tcg_gen_helper32(tcg_helper_divu_i32, sizemask, ret, arg1, arg2);
757 static inline void tcg_gen_remu_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
759 int sizemask = 0;
760 /* Return value and both arguments are 32-bit and unsigned. */
761 sizemask |= tcg_gen_sizemask(0, 0, 0);
762 sizemask |= tcg_gen_sizemask(1, 0, 0);
763 sizemask |= tcg_gen_sizemask(2, 0, 0);
765 tcg_gen_helper32(tcg_helper_remu_i32, sizemask, ret, arg1, arg2);
767 #endif
769 #if TCG_TARGET_REG_BITS == 32
771 static inline void tcg_gen_mov_i64(TCGv_i64 ret, TCGv_i64 arg)
773 if (!TCGV_EQUAL_I64(ret, arg)) {
774 tcg_gen_mov_i32(TCGV_LOW(ret), TCGV_LOW(arg));
775 tcg_gen_mov_i32(TCGV_HIGH(ret), TCGV_HIGH(arg));
779 static inline void tcg_gen_movi_i64(TCGv_i64 ret, int64_t arg)
781 tcg_gen_movi_i32(TCGV_LOW(ret), arg);
782 tcg_gen_movi_i32(TCGV_HIGH(ret), arg >> 32);
785 static inline void tcg_gen_ld8u_i64(TCGv_i64 ret, TCGv_ptr arg2,
786 tcg_target_long offset)
788 tcg_gen_ld8u_i32(TCGV_LOW(ret), arg2, offset);
789 tcg_gen_movi_i32(TCGV_HIGH(ret), 0);
792 static inline void tcg_gen_ld8s_i64(TCGv_i64 ret, TCGv_ptr arg2,
793 tcg_target_long offset)
795 tcg_gen_ld8s_i32(TCGV_LOW(ret), arg2, offset);
796 tcg_gen_sari_i32(TCGV_HIGH(ret), TCGV_HIGH(ret), 31);
799 static inline void tcg_gen_ld16u_i64(TCGv_i64 ret, TCGv_ptr arg2,
800 tcg_target_long offset)
802 tcg_gen_ld16u_i32(TCGV_LOW(ret), arg2, offset);
803 tcg_gen_movi_i32(TCGV_HIGH(ret), 0);
806 static inline void tcg_gen_ld16s_i64(TCGv_i64 ret, TCGv_ptr arg2,
807 tcg_target_long offset)
809 tcg_gen_ld16s_i32(TCGV_LOW(ret), arg2, offset);
810 tcg_gen_sari_i32(TCGV_HIGH(ret), TCGV_LOW(ret), 31);
813 static inline void tcg_gen_ld32u_i64(TCGv_i64 ret, TCGv_ptr arg2,
814 tcg_target_long offset)
816 tcg_gen_ld_i32(TCGV_LOW(ret), arg2, offset);
817 tcg_gen_movi_i32(TCGV_HIGH(ret), 0);
820 static inline void tcg_gen_ld32s_i64(TCGv_i64 ret, TCGv_ptr arg2,
821 tcg_target_long offset)
823 tcg_gen_ld_i32(TCGV_LOW(ret), arg2, offset);
824 tcg_gen_sari_i32(TCGV_HIGH(ret), TCGV_LOW(ret), 31);
827 static inline void tcg_gen_ld_i64(TCGv_i64 ret, TCGv_ptr arg2,
828 tcg_target_long offset)
830 /* since arg2 and ret have different types, they cannot be the
831 same temporary */
832 #ifdef TCG_TARGET_WORDS_BIGENDIAN
833 tcg_gen_ld_i32(TCGV_HIGH(ret), arg2, offset);
834 tcg_gen_ld_i32(TCGV_LOW(ret), arg2, offset + 4);
835 #else
836 tcg_gen_ld_i32(TCGV_LOW(ret), arg2, offset);
837 tcg_gen_ld_i32(TCGV_HIGH(ret), arg2, offset + 4);
838 #endif
841 static inline void tcg_gen_st8_i64(TCGv_i64 arg1, TCGv_ptr arg2,
842 tcg_target_long offset)
844 tcg_gen_st8_i32(TCGV_LOW(arg1), arg2, offset);
847 static inline void tcg_gen_st16_i64(TCGv_i64 arg1, TCGv_ptr arg2,
848 tcg_target_long offset)
850 tcg_gen_st16_i32(TCGV_LOW(arg1), arg2, offset);
853 static inline void tcg_gen_st32_i64(TCGv_i64 arg1, TCGv_ptr arg2,
854 tcg_target_long offset)
856 tcg_gen_st_i32(TCGV_LOW(arg1), arg2, offset);
859 static inline void tcg_gen_st_i64(TCGv_i64 arg1, TCGv_ptr arg2,
860 tcg_target_long offset)
862 #ifdef TCG_TARGET_WORDS_BIGENDIAN
863 tcg_gen_st_i32(TCGV_HIGH(arg1), arg2, offset);
864 tcg_gen_st_i32(TCGV_LOW(arg1), arg2, offset + 4);
865 #else
866 tcg_gen_st_i32(TCGV_LOW(arg1), arg2, offset);
867 tcg_gen_st_i32(TCGV_HIGH(arg1), arg2, offset + 4);
868 #endif
871 static inline void tcg_gen_add_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
873 tcg_gen_op6_i32(INDEX_op_add2_i32, TCGV_LOW(ret), TCGV_HIGH(ret),
874 TCGV_LOW(arg1), TCGV_HIGH(arg1), TCGV_LOW(arg2),
875 TCGV_HIGH(arg2));
878 static inline void tcg_gen_sub_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
880 tcg_gen_op6_i32(INDEX_op_sub2_i32, TCGV_LOW(ret), TCGV_HIGH(ret),
881 TCGV_LOW(arg1), TCGV_HIGH(arg1), TCGV_LOW(arg2),
882 TCGV_HIGH(arg2));
885 static inline void tcg_gen_and_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
887 tcg_gen_and_i32(TCGV_LOW(ret), TCGV_LOW(arg1), TCGV_LOW(arg2));
888 tcg_gen_and_i32(TCGV_HIGH(ret), TCGV_HIGH(arg1), TCGV_HIGH(arg2));
891 static inline void tcg_gen_andi_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
893 tcg_gen_andi_i32(TCGV_LOW(ret), TCGV_LOW(arg1), arg2);
894 tcg_gen_andi_i32(TCGV_HIGH(ret), TCGV_HIGH(arg1), arg2 >> 32);
897 static inline void tcg_gen_or_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
899 tcg_gen_or_i32(TCGV_LOW(ret), TCGV_LOW(arg1), TCGV_LOW(arg2));
900 tcg_gen_or_i32(TCGV_HIGH(ret), TCGV_HIGH(arg1), TCGV_HIGH(arg2));
903 static inline void tcg_gen_ori_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
905 tcg_gen_ori_i32(TCGV_LOW(ret), TCGV_LOW(arg1), arg2);
906 tcg_gen_ori_i32(TCGV_HIGH(ret), TCGV_HIGH(arg1), arg2 >> 32);
909 static inline void tcg_gen_xor_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
911 tcg_gen_xor_i32(TCGV_LOW(ret), TCGV_LOW(arg1), TCGV_LOW(arg2));
912 tcg_gen_xor_i32(TCGV_HIGH(ret), TCGV_HIGH(arg1), TCGV_HIGH(arg2));
915 static inline void tcg_gen_xori_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
917 tcg_gen_xori_i32(TCGV_LOW(ret), TCGV_LOW(arg1), arg2);
918 tcg_gen_xori_i32(TCGV_HIGH(ret), TCGV_HIGH(arg1), arg2 >> 32);
921 /* XXX: use generic code when basic block handling is OK or CPU
922 specific code (x86) */
923 static inline void tcg_gen_shl_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
925 int sizemask = 0;
926 /* Return value and both arguments are 64-bit and signed. */
927 sizemask |= tcg_gen_sizemask(0, 1, 1);
928 sizemask |= tcg_gen_sizemask(1, 1, 1);
929 sizemask |= tcg_gen_sizemask(2, 1, 1);
931 tcg_gen_helper64(tcg_helper_shl_i64, sizemask, ret, arg1, arg2);
934 static inline void tcg_gen_shli_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
936 tcg_gen_shifti_i64(ret, arg1, arg2, 0, 0);
939 static inline void tcg_gen_shr_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
941 int sizemask = 0;
942 /* Return value and both arguments are 64-bit and signed. */
943 sizemask |= tcg_gen_sizemask(0, 1, 1);
944 sizemask |= tcg_gen_sizemask(1, 1, 1);
945 sizemask |= tcg_gen_sizemask(2, 1, 1);
947 tcg_gen_helper64(tcg_helper_shr_i64, sizemask, ret, arg1, arg2);
950 static inline void tcg_gen_shri_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
952 tcg_gen_shifti_i64(ret, arg1, arg2, 1, 0);
955 static inline void tcg_gen_sar_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
957 int sizemask = 0;
958 /* Return value and both arguments are 64-bit and signed. */
959 sizemask |= tcg_gen_sizemask(0, 1, 1);
960 sizemask |= tcg_gen_sizemask(1, 1, 1);
961 sizemask |= tcg_gen_sizemask(2, 1, 1);
963 tcg_gen_helper64(tcg_helper_sar_i64, sizemask, ret, arg1, arg2);
966 static inline void tcg_gen_sari_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
968 tcg_gen_shifti_i64(ret, arg1, arg2, 1, 1);
971 static inline void tcg_gen_brcond_i64(TCGCond cond, TCGv_i64 arg1,
972 TCGv_i64 arg2, int label_index)
974 tcg_gen_op6ii_i32(INDEX_op_brcond2_i32,
975 TCGV_LOW(arg1), TCGV_HIGH(arg1), TCGV_LOW(arg2),
976 TCGV_HIGH(arg2), cond, label_index);
979 static inline void tcg_gen_setcond_i64(TCGCond cond, TCGv_i64 ret,
980 TCGv_i64 arg1, TCGv_i64 arg2)
982 tcg_gen_op6i_i32(INDEX_op_setcond2_i32, TCGV_LOW(ret),
983 TCGV_LOW(arg1), TCGV_HIGH(arg1),
984 TCGV_LOW(arg2), TCGV_HIGH(arg2), cond);
985 tcg_gen_movi_i32(TCGV_HIGH(ret), 0);
988 static inline void tcg_gen_mul_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
990 TCGv_i64 t0;
991 TCGv_i32 t1;
993 t0 = tcg_temp_new_i64();
994 t1 = tcg_temp_new_i32();
996 tcg_gen_op4_i32(INDEX_op_mulu2_i32, TCGV_LOW(t0), TCGV_HIGH(t0),
997 TCGV_LOW(arg1), TCGV_LOW(arg2));
999 tcg_gen_mul_i32(t1, TCGV_LOW(arg1), TCGV_HIGH(arg2));
1000 tcg_gen_add_i32(TCGV_HIGH(t0), TCGV_HIGH(t0), t1);
1001 tcg_gen_mul_i32(t1, TCGV_HIGH(arg1), TCGV_LOW(arg2));
1002 tcg_gen_add_i32(TCGV_HIGH(t0), TCGV_HIGH(t0), t1);
1004 tcg_gen_mov_i64(ret, t0);
1005 tcg_temp_free_i64(t0);
1006 tcg_temp_free_i32(t1);
1009 static inline void tcg_gen_div_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1011 int sizemask = 0;
1012 /* Return value and both arguments are 64-bit and signed. */
1013 sizemask |= tcg_gen_sizemask(0, 1, 1);
1014 sizemask |= tcg_gen_sizemask(1, 1, 1);
1015 sizemask |= tcg_gen_sizemask(2, 1, 1);
1017 tcg_gen_helper64(tcg_helper_div_i64, sizemask, ret, arg1, arg2);
1020 static inline void tcg_gen_rem_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1022 int sizemask = 0;
1023 /* Return value and both arguments are 64-bit and signed. */
1024 sizemask |= tcg_gen_sizemask(0, 1, 1);
1025 sizemask |= tcg_gen_sizemask(1, 1, 1);
1026 sizemask |= tcg_gen_sizemask(2, 1, 1);
1028 tcg_gen_helper64(tcg_helper_rem_i64, sizemask, ret, arg1, arg2);
1031 static inline void tcg_gen_divu_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1033 int sizemask = 0;
1034 /* Return value and both arguments are 64-bit and unsigned. */
1035 sizemask |= tcg_gen_sizemask(0, 1, 0);
1036 sizemask |= tcg_gen_sizemask(1, 1, 0);
1037 sizemask |= tcg_gen_sizemask(2, 1, 0);
1039 tcg_gen_helper64(tcg_helper_divu_i64, sizemask, ret, arg1, arg2);
1042 static inline void tcg_gen_remu_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1044 int sizemask = 0;
1045 /* Return value and both arguments are 64-bit and unsigned. */
1046 sizemask |= tcg_gen_sizemask(0, 1, 0);
1047 sizemask |= tcg_gen_sizemask(1, 1, 0);
1048 sizemask |= tcg_gen_sizemask(2, 1, 0);
1050 tcg_gen_helper64(tcg_helper_remu_i64, sizemask, ret, arg1, arg2);
1053 #else
1055 static inline void tcg_gen_mov_i64(TCGv_i64 ret, TCGv_i64 arg)
1057 if (!TCGV_EQUAL_I64(ret, arg))
1058 tcg_gen_op2_i64(INDEX_op_mov_i64, ret, arg);
1061 static inline void tcg_gen_movi_i64(TCGv_i64 ret, int64_t arg)
1063 tcg_gen_op2i_i64(INDEX_op_movi_i64, ret, arg);
1066 static inline void tcg_gen_ld8u_i64(TCGv_i64 ret, TCGv_i64 arg2,
1067 tcg_target_long offset)
1069 tcg_gen_ldst_op_i64(INDEX_op_ld8u_i64, ret, arg2, offset);
1072 static inline void tcg_gen_ld8s_i64(TCGv_i64 ret, TCGv_i64 arg2,
1073 tcg_target_long offset)
1075 tcg_gen_ldst_op_i64(INDEX_op_ld8s_i64, ret, arg2, offset);
1078 static inline void tcg_gen_ld16u_i64(TCGv_i64 ret, TCGv_i64 arg2,
1079 tcg_target_long offset)
1081 tcg_gen_ldst_op_i64(INDEX_op_ld16u_i64, ret, arg2, offset);
1084 static inline void tcg_gen_ld16s_i64(TCGv_i64 ret, TCGv_i64 arg2,
1085 tcg_target_long offset)
1087 tcg_gen_ldst_op_i64(INDEX_op_ld16s_i64, ret, arg2, offset);
1090 static inline void tcg_gen_ld32u_i64(TCGv_i64 ret, TCGv_i64 arg2,
1091 tcg_target_long offset)
1093 tcg_gen_ldst_op_i64(INDEX_op_ld32u_i64, ret, arg2, offset);
1096 static inline void tcg_gen_ld32s_i64(TCGv_i64 ret, TCGv_i64 arg2,
1097 tcg_target_long offset)
1099 tcg_gen_ldst_op_i64(INDEX_op_ld32s_i64, ret, arg2, offset);
1102 static inline void tcg_gen_ld_i64(TCGv_i64 ret, TCGv_i64 arg2, tcg_target_long offset)
1104 tcg_gen_ldst_op_i64(INDEX_op_ld_i64, ret, arg2, offset);
1107 static inline void tcg_gen_st8_i64(TCGv_i64 arg1, TCGv_i64 arg2,
1108 tcg_target_long offset)
1110 tcg_gen_ldst_op_i64(INDEX_op_st8_i64, arg1, arg2, offset);
1113 static inline void tcg_gen_st16_i64(TCGv_i64 arg1, TCGv_i64 arg2,
1114 tcg_target_long offset)
1116 tcg_gen_ldst_op_i64(INDEX_op_st16_i64, arg1, arg2, offset);
1119 static inline void tcg_gen_st32_i64(TCGv_i64 arg1, TCGv_i64 arg2,
1120 tcg_target_long offset)
1122 tcg_gen_ldst_op_i64(INDEX_op_st32_i64, arg1, arg2, offset);
1125 static inline void tcg_gen_st_i64(TCGv_i64 arg1, TCGv_i64 arg2, tcg_target_long offset)
1127 tcg_gen_ldst_op_i64(INDEX_op_st_i64, arg1, arg2, offset);
1130 static inline void tcg_gen_add_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1132 tcg_gen_op3_i64(INDEX_op_add_i64, ret, arg1, arg2);
1135 static inline void tcg_gen_sub_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1137 tcg_gen_op3_i64(INDEX_op_sub_i64, ret, arg1, arg2);
1140 static inline void tcg_gen_and_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1142 if (TCGV_EQUAL_I64(arg1, arg2)) {
1143 tcg_gen_mov_i64(ret, arg1);
1144 } else {
1145 tcg_gen_op3_i64(INDEX_op_and_i64, ret, arg1, arg2);
1149 static inline void tcg_gen_andi_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
1151 TCGv_i64 t0 = tcg_const_i64(arg2);
1152 tcg_gen_and_i64(ret, arg1, t0);
1153 tcg_temp_free_i64(t0);
1156 static inline void tcg_gen_or_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1158 if (TCGV_EQUAL_I64(arg1, arg2)) {
1159 tcg_gen_mov_i64(ret, arg1);
1160 } else {
1161 tcg_gen_op3_i64(INDEX_op_or_i64, ret, arg1, arg2);
1165 static inline void tcg_gen_ori_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
1167 TCGv_i64 t0 = tcg_const_i64(arg2);
1168 tcg_gen_or_i64(ret, arg1, t0);
1169 tcg_temp_free_i64(t0);
1172 static inline void tcg_gen_xor_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1174 if (TCGV_EQUAL_I64(arg1, arg2)) {
1175 tcg_gen_movi_i64(ret, 0);
1176 } else {
1177 tcg_gen_op3_i64(INDEX_op_xor_i64, ret, arg1, arg2);
1181 static inline void tcg_gen_xori_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
1183 TCGv_i64 t0 = tcg_const_i64(arg2);
1184 tcg_gen_xor_i64(ret, arg1, t0);
1185 tcg_temp_free_i64(t0);
1188 static inline void tcg_gen_shl_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1190 tcg_gen_op3_i64(INDEX_op_shl_i64, ret, arg1, arg2);
1193 static inline void tcg_gen_shli_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
1195 if (arg2 == 0) {
1196 tcg_gen_mov_i64(ret, arg1);
1197 } else {
1198 TCGv_i64 t0 = tcg_const_i64(arg2);
1199 tcg_gen_shl_i64(ret, arg1, t0);
1200 tcg_temp_free_i64(t0);
1204 static inline void tcg_gen_shr_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1206 tcg_gen_op3_i64(INDEX_op_shr_i64, ret, arg1, arg2);
1209 static inline void tcg_gen_shri_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
1211 if (arg2 == 0) {
1212 tcg_gen_mov_i64(ret, arg1);
1213 } else {
1214 TCGv_i64 t0 = tcg_const_i64(arg2);
1215 tcg_gen_shr_i64(ret, arg1, t0);
1216 tcg_temp_free_i64(t0);
1220 static inline void tcg_gen_sar_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1222 tcg_gen_op3_i64(INDEX_op_sar_i64, ret, arg1, arg2);
1225 static inline void tcg_gen_sari_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
1227 if (arg2 == 0) {
1228 tcg_gen_mov_i64(ret, arg1);
1229 } else {
1230 TCGv_i64 t0 = tcg_const_i64(arg2);
1231 tcg_gen_sar_i64(ret, arg1, t0);
1232 tcg_temp_free_i64(t0);
1236 static inline void tcg_gen_brcond_i64(TCGCond cond, TCGv_i64 arg1,
1237 TCGv_i64 arg2, int label_index)
1239 tcg_gen_op4ii_i64(INDEX_op_brcond_i64, arg1, arg2, cond, label_index);
1242 static inline void tcg_gen_setcond_i64(TCGCond cond, TCGv_i64 ret,
1243 TCGv_i64 arg1, TCGv_i64 arg2)
1245 tcg_gen_op4i_i64(INDEX_op_setcond_i64, ret, arg1, arg2, cond);
1248 static inline void tcg_gen_mul_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1250 tcg_gen_op3_i64(INDEX_op_mul_i64, ret, arg1, arg2);
1253 #ifdef TCG_TARGET_HAS_div_i64
1254 static inline void tcg_gen_div_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1256 tcg_gen_op3_i64(INDEX_op_div_i64, ret, arg1, arg2);
1259 static inline void tcg_gen_rem_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1261 tcg_gen_op3_i64(INDEX_op_rem_i64, ret, arg1, arg2);
1264 static inline void tcg_gen_divu_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1266 tcg_gen_op3_i64(INDEX_op_divu_i64, ret, arg1, arg2);
1269 static inline void tcg_gen_remu_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1271 tcg_gen_op3_i64(INDEX_op_remu_i64, ret, arg1, arg2);
1273 #elif defined(TCG_TARGET_HAS_div2_i64)
1274 static inline void tcg_gen_div_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1276 TCGv_i64 t0;
1277 t0 = tcg_temp_new_i64();
1278 tcg_gen_sari_i64(t0, arg1, 63);
1279 tcg_gen_op5_i64(INDEX_op_div2_i64, ret, t0, arg1, t0, arg2);
1280 tcg_temp_free_i64(t0);
1283 static inline void tcg_gen_rem_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1285 TCGv_i64 t0;
1286 t0 = tcg_temp_new_i64();
1287 tcg_gen_sari_i64(t0, arg1, 63);
1288 tcg_gen_op5_i64(INDEX_op_div2_i64, t0, ret, arg1, t0, arg2);
1289 tcg_temp_free_i64(t0);
1292 static inline void tcg_gen_divu_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1294 TCGv_i64 t0;
1295 t0 = tcg_temp_new_i64();
1296 tcg_gen_movi_i64(t0, 0);
1297 tcg_gen_op5_i64(INDEX_op_divu2_i64, ret, t0, arg1, t0, arg2);
1298 tcg_temp_free_i64(t0);
1301 static inline void tcg_gen_remu_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1303 TCGv_i64 t0;
1304 t0 = tcg_temp_new_i64();
1305 tcg_gen_movi_i64(t0, 0);
1306 tcg_gen_op5_i64(INDEX_op_divu2_i64, t0, ret, arg1, t0, arg2);
1307 tcg_temp_free_i64(t0);
1309 #else
1310 static inline void tcg_gen_div_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1312 int sizemask = 0;
1313 /* Return value and both arguments are 64-bit and signed. */
1314 sizemask |= tcg_gen_sizemask(0, 1, 1);
1315 sizemask |= tcg_gen_sizemask(1, 1, 1);
1316 sizemask |= tcg_gen_sizemask(2, 1, 1);
1318 tcg_gen_helper64(tcg_helper_div_i64, sizemask, ret, arg1, arg2);
1321 static inline void tcg_gen_rem_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1323 int sizemask = 0;
1324 /* Return value and both arguments are 64-bit and signed. */
1325 sizemask |= tcg_gen_sizemask(0, 1, 1);
1326 sizemask |= tcg_gen_sizemask(1, 1, 1);
1327 sizemask |= tcg_gen_sizemask(2, 1, 1);
1329 tcg_gen_helper64(tcg_helper_rem_i64, sizemask, ret, arg1, arg2);
1332 static inline void tcg_gen_divu_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1334 int sizemask = 0;
1335 /* Return value and both arguments are 64-bit and unsigned. */
1336 sizemask |= tcg_gen_sizemask(0, 1, 0);
1337 sizemask |= tcg_gen_sizemask(1, 1, 0);
1338 sizemask |= tcg_gen_sizemask(2, 1, 0);
1340 tcg_gen_helper64(tcg_helper_divu_i64, sizemask, ret, arg1, arg2);
1343 static inline void tcg_gen_remu_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1345 int sizemask = 0;
1346 /* Return value and both arguments are 64-bit and unsigned. */
1347 sizemask |= tcg_gen_sizemask(0, 1, 0);
1348 sizemask |= tcg_gen_sizemask(1, 1, 0);
1349 sizemask |= tcg_gen_sizemask(2, 1, 0);
1351 tcg_gen_helper64(tcg_helper_remu_i64, sizemask, ret, arg1, arg2);
1353 #endif
1355 #endif
1357 static inline void tcg_gen_addi_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
1359 /* some cases can be optimized here */
1360 if (arg2 == 0) {
1361 tcg_gen_mov_i64(ret, arg1);
1362 } else {
1363 TCGv_i64 t0 = tcg_const_i64(arg2);
1364 tcg_gen_add_i64(ret, arg1, t0);
1365 tcg_temp_free_i64(t0);
1369 static inline void tcg_gen_subfi_i64(TCGv_i64 ret, int64_t arg1, TCGv_i64 arg2)
1371 TCGv_i64 t0 = tcg_const_i64(arg1);
1372 tcg_gen_sub_i64(ret, t0, arg2);
1373 tcg_temp_free_i64(t0);
1376 static inline void tcg_gen_subi_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
1378 /* some cases can be optimized here */
1379 if (arg2 == 0) {
1380 tcg_gen_mov_i64(ret, arg1);
1381 } else {
1382 TCGv_i64 t0 = tcg_const_i64(arg2);
1383 tcg_gen_sub_i64(ret, arg1, t0);
1384 tcg_temp_free_i64(t0);
1387 static inline void tcg_gen_brcondi_i64(TCGCond cond, TCGv_i64 arg1,
1388 int64_t arg2, int label_index)
1390 TCGv_i64 t0 = tcg_const_i64(arg2);
1391 tcg_gen_brcond_i64(cond, arg1, t0, label_index);
1392 tcg_temp_free_i64(t0);
1395 static inline void tcg_gen_setcondi_i64(TCGCond cond, TCGv_i64 ret,
1396 TCGv_i64 arg1, int64_t arg2)
1398 TCGv_i64 t0 = tcg_const_i64(arg2);
1399 tcg_gen_setcond_i64(cond, ret, arg1, t0);
1400 tcg_temp_free_i64(t0);
1403 static inline void tcg_gen_muli_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
1405 TCGv_i64 t0 = tcg_const_i64(arg2);
1406 tcg_gen_mul_i64(ret, arg1, t0);
1407 tcg_temp_free_i64(t0);
1411 /***************************************/
1412 /* optional operations */
1414 static inline void tcg_gen_ext8s_i32(TCGv_i32 ret, TCGv_i32 arg)
1416 #ifdef TCG_TARGET_HAS_ext8s_i32
1417 tcg_gen_op2_i32(INDEX_op_ext8s_i32, ret, arg);
1418 #else
1419 tcg_gen_shli_i32(ret, arg, 24);
1420 tcg_gen_sari_i32(ret, ret, 24);
1421 #endif
1424 static inline void tcg_gen_ext16s_i32(TCGv_i32 ret, TCGv_i32 arg)
1426 #ifdef TCG_TARGET_HAS_ext16s_i32
1427 tcg_gen_op2_i32(INDEX_op_ext16s_i32, ret, arg);
1428 #else
1429 tcg_gen_shli_i32(ret, arg, 16);
1430 tcg_gen_sari_i32(ret, ret, 16);
1431 #endif
1434 static inline void tcg_gen_ext8u_i32(TCGv_i32 ret, TCGv_i32 arg)
1436 #ifdef TCG_TARGET_HAS_ext8u_i32
1437 tcg_gen_op2_i32(INDEX_op_ext8u_i32, ret, arg);
1438 #else
1439 tcg_gen_andi_i32(ret, arg, 0xffu);
1440 #endif
1443 static inline void tcg_gen_ext16u_i32(TCGv_i32 ret, TCGv_i32 arg)
1445 #ifdef TCG_TARGET_HAS_ext16u_i32
1446 tcg_gen_op2_i32(INDEX_op_ext16u_i32, ret, arg);
1447 #else
1448 tcg_gen_andi_i32(ret, arg, 0xffffu);
1449 #endif
1452 /* Note: we assume the two high bytes are set to zero */
1453 static inline void tcg_gen_bswap16_i32(TCGv_i32 ret, TCGv_i32 arg)
1455 #ifdef TCG_TARGET_HAS_bswap16_i32
1456 tcg_gen_op2_i32(INDEX_op_bswap16_i32, ret, arg);
1457 #else
1458 TCGv_i32 t0 = tcg_temp_new_i32();
1460 tcg_gen_ext8u_i32(t0, arg);
1461 tcg_gen_shli_i32(t0, t0, 8);
1462 tcg_gen_shri_i32(ret, arg, 8);
1463 tcg_gen_or_i32(ret, ret, t0);
1464 tcg_temp_free_i32(t0);
1465 #endif
1468 static inline void tcg_gen_bswap32_i32(TCGv_i32 ret, TCGv_i32 arg)
1470 #ifdef TCG_TARGET_HAS_bswap32_i32
1471 tcg_gen_op2_i32(INDEX_op_bswap32_i32, ret, arg);
1472 #else
1473 TCGv_i32 t0, t1;
1474 t0 = tcg_temp_new_i32();
1475 t1 = tcg_temp_new_i32();
1477 tcg_gen_shli_i32(t0, arg, 24);
1479 tcg_gen_andi_i32(t1, arg, 0x0000ff00);
1480 tcg_gen_shli_i32(t1, t1, 8);
1481 tcg_gen_or_i32(t0, t0, t1);
1483 tcg_gen_shri_i32(t1, arg, 8);
1484 tcg_gen_andi_i32(t1, t1, 0x0000ff00);
1485 tcg_gen_or_i32(t0, t0, t1);
1487 tcg_gen_shri_i32(t1, arg, 24);
1488 tcg_gen_or_i32(ret, t0, t1);
1489 tcg_temp_free_i32(t0);
1490 tcg_temp_free_i32(t1);
1491 #endif
1494 #if TCG_TARGET_REG_BITS == 32
1495 static inline void tcg_gen_ext8s_i64(TCGv_i64 ret, TCGv_i64 arg)
1497 tcg_gen_ext8s_i32(TCGV_LOW(ret), TCGV_LOW(arg));
1498 tcg_gen_sari_i32(TCGV_HIGH(ret), TCGV_LOW(ret), 31);
1501 static inline void tcg_gen_ext16s_i64(TCGv_i64 ret, TCGv_i64 arg)
1503 tcg_gen_ext16s_i32(TCGV_LOW(ret), TCGV_LOW(arg));
1504 tcg_gen_sari_i32(TCGV_HIGH(ret), TCGV_LOW(ret), 31);
1507 static inline void tcg_gen_ext32s_i64(TCGv_i64 ret, TCGv_i64 arg)
1509 tcg_gen_mov_i32(TCGV_LOW(ret), TCGV_LOW(arg));
1510 tcg_gen_sari_i32(TCGV_HIGH(ret), TCGV_LOW(ret), 31);
1513 static inline void tcg_gen_ext8u_i64(TCGv_i64 ret, TCGv_i64 arg)
1515 tcg_gen_ext8u_i32(TCGV_LOW(ret), TCGV_LOW(arg));
1516 tcg_gen_movi_i32(TCGV_HIGH(ret), 0);
1519 static inline void tcg_gen_ext16u_i64(TCGv_i64 ret, TCGv_i64 arg)
1521 tcg_gen_ext16u_i32(TCGV_LOW(ret), TCGV_LOW(arg));
1522 tcg_gen_movi_i32(TCGV_HIGH(ret), 0);
1525 static inline void tcg_gen_ext32u_i64(TCGv_i64 ret, TCGv_i64 arg)
1527 tcg_gen_mov_i32(TCGV_LOW(ret), TCGV_LOW(arg));
1528 tcg_gen_movi_i32(TCGV_HIGH(ret), 0);
1531 static inline void tcg_gen_trunc_i64_i32(TCGv_i32 ret, TCGv_i64 arg)
1533 tcg_gen_mov_i32(ret, TCGV_LOW(arg));
1536 static inline void tcg_gen_extu_i32_i64(TCGv_i64 ret, TCGv_i32 arg)
1538 tcg_gen_mov_i32(TCGV_LOW(ret), arg);
1539 tcg_gen_movi_i32(TCGV_HIGH(ret), 0);
1542 static inline void tcg_gen_ext_i32_i64(TCGv_i64 ret, TCGv_i32 arg)
1544 tcg_gen_mov_i32(TCGV_LOW(ret), arg);
1545 tcg_gen_sari_i32(TCGV_HIGH(ret), TCGV_LOW(ret), 31);
1548 /* Note: we assume the six high bytes are set to zero */
1549 static inline void tcg_gen_bswap16_i64(TCGv_i64 ret, TCGv_i64 arg)
1551 tcg_gen_mov_i32(TCGV_HIGH(ret), TCGV_HIGH(arg));
1552 tcg_gen_bswap16_i32(TCGV_LOW(ret), TCGV_LOW(arg));
1555 /* Note: we assume the four high bytes are set to zero */
1556 static inline void tcg_gen_bswap32_i64(TCGv_i64 ret, TCGv_i64 arg)
1558 tcg_gen_mov_i32(TCGV_HIGH(ret), TCGV_HIGH(arg));
1559 tcg_gen_bswap32_i32(TCGV_LOW(ret), TCGV_LOW(arg));
1562 static inline void tcg_gen_bswap64_i64(TCGv_i64 ret, TCGv_i64 arg)
1564 TCGv_i32 t0, t1;
1565 t0 = tcg_temp_new_i32();
1566 t1 = tcg_temp_new_i32();
1568 tcg_gen_bswap32_i32(t0, TCGV_LOW(arg));
1569 tcg_gen_bswap32_i32(t1, TCGV_HIGH(arg));
1570 tcg_gen_mov_i32(TCGV_LOW(ret), t1);
1571 tcg_gen_mov_i32(TCGV_HIGH(ret), t0);
1572 tcg_temp_free_i32(t0);
1573 tcg_temp_free_i32(t1);
1575 #else
1577 static inline void tcg_gen_ext8s_i64(TCGv_i64 ret, TCGv_i64 arg)
1579 #ifdef TCG_TARGET_HAS_ext8s_i64
1580 tcg_gen_op2_i64(INDEX_op_ext8s_i64, ret, arg);
1581 #else
1582 tcg_gen_shli_i64(ret, arg, 56);
1583 tcg_gen_sari_i64(ret, ret, 56);
1584 #endif
1587 static inline void tcg_gen_ext16s_i64(TCGv_i64 ret, TCGv_i64 arg)
1589 #ifdef TCG_TARGET_HAS_ext16s_i64
1590 tcg_gen_op2_i64(INDEX_op_ext16s_i64, ret, arg);
1591 #else
1592 tcg_gen_shli_i64(ret, arg, 48);
1593 tcg_gen_sari_i64(ret, ret, 48);
1594 #endif
1597 static inline void tcg_gen_ext32s_i64(TCGv_i64 ret, TCGv_i64 arg)
1599 #ifdef TCG_TARGET_HAS_ext32s_i64
1600 tcg_gen_op2_i64(INDEX_op_ext32s_i64, ret, arg);
1601 #else
1602 tcg_gen_shli_i64(ret, arg, 32);
1603 tcg_gen_sari_i64(ret, ret, 32);
1604 #endif
1607 static inline void tcg_gen_ext8u_i64(TCGv_i64 ret, TCGv_i64 arg)
1609 #ifdef TCG_TARGET_HAS_ext8u_i64
1610 tcg_gen_op2_i64(INDEX_op_ext8u_i64, ret, arg);
1611 #else
1612 tcg_gen_andi_i64(ret, arg, 0xffu);
1613 #endif
1616 static inline void tcg_gen_ext16u_i64(TCGv_i64 ret, TCGv_i64 arg)
1618 #ifdef TCG_TARGET_HAS_ext16u_i64
1619 tcg_gen_op2_i64(INDEX_op_ext16u_i64, ret, arg);
1620 #else
1621 tcg_gen_andi_i64(ret, arg, 0xffffu);
1622 #endif
1625 static inline void tcg_gen_ext32u_i64(TCGv_i64 ret, TCGv_i64 arg)
1627 #ifdef TCG_TARGET_HAS_ext32u_i64
1628 tcg_gen_op2_i64(INDEX_op_ext32u_i64, ret, arg);
1629 #else
1630 tcg_gen_andi_i64(ret, arg, 0xffffffffu);
1631 #endif
1634 /* Note: we assume the target supports move between 32 and 64 bit
1635 registers. This will probably break MIPS64 targets. */
1636 static inline void tcg_gen_trunc_i64_i32(TCGv_i32 ret, TCGv_i64 arg)
1638 tcg_gen_mov_i32(ret, MAKE_TCGV_I32(GET_TCGV_I64(arg)));
1641 /* Note: we assume the target supports move between 32 and 64 bit
1642 registers */
1643 static inline void tcg_gen_extu_i32_i64(TCGv_i64 ret, TCGv_i32 arg)
1645 tcg_gen_ext32u_i64(ret, MAKE_TCGV_I64(GET_TCGV_I32(arg)));
1648 /* Note: we assume the target supports move between 32 and 64 bit
1649 registers */
1650 static inline void tcg_gen_ext_i32_i64(TCGv_i64 ret, TCGv_i32 arg)
1652 tcg_gen_ext32s_i64(ret, MAKE_TCGV_I64(GET_TCGV_I32(arg)));
1655 /* Note: we assume the six high bytes are set to zero */
1656 static inline void tcg_gen_bswap16_i64(TCGv_i64 ret, TCGv_i64 arg)
1658 #ifdef TCG_TARGET_HAS_bswap16_i64
1659 tcg_gen_op2_i64(INDEX_op_bswap16_i64, ret, arg);
1660 #else
1661 TCGv_i64 t0 = tcg_temp_new_i64();
1663 tcg_gen_ext8u_i64(t0, arg);
1664 tcg_gen_shli_i64(t0, t0, 8);
1665 tcg_gen_shri_i64(ret, arg, 8);
1666 tcg_gen_or_i64(ret, ret, t0);
1667 tcg_temp_free_i64(t0);
1668 #endif
1671 /* Note: we assume the four high bytes are set to zero */
1672 static inline void tcg_gen_bswap32_i64(TCGv_i64 ret, TCGv_i64 arg)
1674 #ifdef TCG_TARGET_HAS_bswap32_i64
1675 tcg_gen_op2_i64(INDEX_op_bswap32_i64, ret, arg);
1676 #else
1677 TCGv_i64 t0, t1;
1678 t0 = tcg_temp_new_i64();
1679 t1 = tcg_temp_new_i64();
1681 tcg_gen_shli_i64(t0, arg, 24);
1682 tcg_gen_ext32u_i64(t0, t0);
1684 tcg_gen_andi_i64(t1, arg, 0x0000ff00);
1685 tcg_gen_shli_i64(t1, t1, 8);
1686 tcg_gen_or_i64(t0, t0, t1);
1688 tcg_gen_shri_i64(t1, arg, 8);
1689 tcg_gen_andi_i64(t1, t1, 0x0000ff00);
1690 tcg_gen_or_i64(t0, t0, t1);
1692 tcg_gen_shri_i64(t1, arg, 24);
1693 tcg_gen_or_i64(ret, t0, t1);
1694 tcg_temp_free_i64(t0);
1695 tcg_temp_free_i64(t1);
1696 #endif
1699 static inline void tcg_gen_bswap64_i64(TCGv_i64 ret, TCGv_i64 arg)
1701 #ifdef TCG_TARGET_HAS_bswap64_i64
1702 tcg_gen_op2_i64(INDEX_op_bswap64_i64, ret, arg);
1703 #else
1704 TCGv_i64 t0 = tcg_temp_new_i64();
1705 TCGv_i64 t1 = tcg_temp_new_i64();
1707 tcg_gen_shli_i64(t0, arg, 56);
1709 tcg_gen_andi_i64(t1, arg, 0x0000ff00);
1710 tcg_gen_shli_i64(t1, t1, 40);
1711 tcg_gen_or_i64(t0, t0, t1);
1713 tcg_gen_andi_i64(t1, arg, 0x00ff0000);
1714 tcg_gen_shli_i64(t1, t1, 24);
1715 tcg_gen_or_i64(t0, t0, t1);
1717 tcg_gen_andi_i64(t1, arg, 0xff000000);
1718 tcg_gen_shli_i64(t1, t1, 8);
1719 tcg_gen_or_i64(t0, t0, t1);
1721 tcg_gen_shri_i64(t1, arg, 8);
1722 tcg_gen_andi_i64(t1, t1, 0xff000000);
1723 tcg_gen_or_i64(t0, t0, t1);
1725 tcg_gen_shri_i64(t1, arg, 24);
1726 tcg_gen_andi_i64(t1, t1, 0x00ff0000);
1727 tcg_gen_or_i64(t0, t0, t1);
1729 tcg_gen_shri_i64(t1, arg, 40);
1730 tcg_gen_andi_i64(t1, t1, 0x0000ff00);
1731 tcg_gen_or_i64(t0, t0, t1);
1733 tcg_gen_shri_i64(t1, arg, 56);
1734 tcg_gen_or_i64(ret, t0, t1);
1735 tcg_temp_free_i64(t0);
1736 tcg_temp_free_i64(t1);
1737 #endif
1740 #endif
1742 static inline void tcg_gen_neg_i32(TCGv_i32 ret, TCGv_i32 arg)
1744 #ifdef TCG_TARGET_HAS_neg_i32
1745 tcg_gen_op2_i32(INDEX_op_neg_i32, ret, arg);
1746 #else
1747 TCGv_i32 t0 = tcg_const_i32(0);
1748 tcg_gen_sub_i32(ret, t0, arg);
1749 tcg_temp_free_i32(t0);
1750 #endif
1753 static inline void tcg_gen_neg_i64(TCGv_i64 ret, TCGv_i64 arg)
1755 #ifdef TCG_TARGET_HAS_neg_i64
1756 tcg_gen_op2_i64(INDEX_op_neg_i64, ret, arg);
1757 #else
1758 TCGv_i64 t0 = tcg_const_i64(0);
1759 tcg_gen_sub_i64(ret, t0, arg);
1760 tcg_temp_free_i64(t0);
1761 #endif
1764 static inline void tcg_gen_not_i32(TCGv_i32 ret, TCGv_i32 arg)
1766 #ifdef TCG_TARGET_HAS_not_i32
1767 tcg_gen_op2_i32(INDEX_op_not_i32, ret, arg);
1768 #else
1769 tcg_gen_xori_i32(ret, arg, -1);
1770 #endif
1773 static inline void tcg_gen_not_i64(TCGv_i64 ret, TCGv_i64 arg)
1775 #ifdef TCG_TARGET_HAS_not_i64
1776 tcg_gen_op2_i64(INDEX_op_not_i64, ret, arg);
1777 #elif defined(TCG_TARGET_HAS_not_i32) && TCG_TARGET_REG_BITS == 32
1778 tcg_gen_not_i32(TCGV_LOW(ret), TCGV_LOW(arg));
1779 tcg_gen_not_i32(TCGV_HIGH(ret), TCGV_HIGH(arg));
1780 #else
1781 tcg_gen_xori_i64(ret, arg, -1);
1782 #endif
1785 static inline void tcg_gen_discard_i32(TCGv_i32 arg)
1787 tcg_gen_op1_i32(INDEX_op_discard, arg);
1790 #if TCG_TARGET_REG_BITS == 32
1791 static inline void tcg_gen_discard_i64(TCGv_i64 arg)
1793 tcg_gen_discard_i32(TCGV_LOW(arg));
1794 tcg_gen_discard_i32(TCGV_HIGH(arg));
1796 #else
1797 static inline void tcg_gen_discard_i64(TCGv_i64 arg)
1799 tcg_gen_op1_i64(INDEX_op_discard, arg);
1801 #endif
1803 static inline void tcg_gen_concat_i32_i64(TCGv_i64 dest, TCGv_i32 low, TCGv_i32 high)
1805 #if TCG_TARGET_REG_BITS == 32
1806 tcg_gen_mov_i32(TCGV_LOW(dest), low);
1807 tcg_gen_mov_i32(TCGV_HIGH(dest), high);
1808 #else
1809 TCGv_i64 tmp = tcg_temp_new_i64();
1810 /* This extension is only needed for type correctness.
1811 We may be able to do better given target specific information. */
1812 tcg_gen_extu_i32_i64(tmp, high);
1813 tcg_gen_shli_i64(tmp, tmp, 32);
1814 tcg_gen_extu_i32_i64(dest, low);
1815 tcg_gen_or_i64(dest, dest, tmp);
1816 tcg_temp_free_i64(tmp);
1817 #endif
1820 static inline void tcg_gen_concat32_i64(TCGv_i64 dest, TCGv_i64 low, TCGv_i64 high)
1822 #if TCG_TARGET_REG_BITS == 32
1823 tcg_gen_concat_i32_i64(dest, TCGV_LOW(low), TCGV_LOW(high));
1824 #else
1825 TCGv_i64 tmp = tcg_temp_new_i64();
1826 tcg_gen_ext32u_i64(dest, low);
1827 tcg_gen_shli_i64(tmp, high, 32);
1828 tcg_gen_or_i64(dest, dest, tmp);
1829 tcg_temp_free_i64(tmp);
1830 #endif
1833 static inline void tcg_gen_andc_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
1835 #ifdef TCG_TARGET_HAS_andc_i32
1836 tcg_gen_op3_i32(INDEX_op_andc_i32, ret, arg1, arg2);
1837 #else
1838 TCGv_i32 t0;
1839 t0 = tcg_temp_new_i32();
1840 tcg_gen_not_i32(t0, arg2);
1841 tcg_gen_and_i32(ret, arg1, t0);
1842 tcg_temp_free_i32(t0);
1843 #endif
1846 static inline void tcg_gen_andc_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1848 #ifdef TCG_TARGET_HAS_andc_i64
1849 tcg_gen_op3_i64(INDEX_op_andc_i64, ret, arg1, arg2);
1850 #elif defined(TCG_TARGET_HAS_andc_i32) && TCG_TARGET_REG_BITS == 32
1851 tcg_gen_andc_i32(TCGV_LOW(ret), TCGV_LOW(arg1), TCGV_LOW(arg2));
1852 tcg_gen_andc_i32(TCGV_HIGH(ret), TCGV_HIGH(arg1), TCGV_HIGH(arg2));
1853 #else
1854 TCGv_i64 t0;
1855 t0 = tcg_temp_new_i64();
1856 tcg_gen_not_i64(t0, arg2);
1857 tcg_gen_and_i64(ret, arg1, t0);
1858 tcg_temp_free_i64(t0);
1859 #endif
1862 static inline void tcg_gen_eqv_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
1864 #ifdef TCG_TARGET_HAS_eqv_i32
1865 tcg_gen_op3_i32(INDEX_op_eqv_i32, ret, arg1, arg2);
1866 #else
1867 tcg_gen_xor_i32(ret, arg1, arg2);
1868 tcg_gen_not_i32(ret, ret);
1869 #endif
1872 static inline void tcg_gen_eqv_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1874 #ifdef TCG_TARGET_HAS_eqv_i64
1875 tcg_gen_op3_i64(INDEX_op_eqv_i64, ret, arg1, arg2);
1876 #elif defined(TCG_TARGET_HAS_eqv_i32) && TCG_TARGET_REG_BITS == 32
1877 tcg_gen_eqv_i32(TCGV_LOW(ret), TCGV_LOW(arg1), TCGV_LOW(arg2));
1878 tcg_gen_eqv_i32(TCGV_HIGH(ret), TCGV_HIGH(arg1), TCGV_HIGH(arg2));
1879 #else
1880 tcg_gen_xor_i64(ret, arg1, arg2);
1881 tcg_gen_not_i64(ret, ret);
1882 #endif
1885 static inline void tcg_gen_nand_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
1887 #ifdef TCG_TARGET_HAS_nand_i32
1888 tcg_gen_op3_i32(INDEX_op_nand_i32, ret, arg1, arg2);
1889 #else
1890 tcg_gen_and_i32(ret, arg1, arg2);
1891 tcg_gen_not_i32(ret, ret);
1892 #endif
1895 static inline void tcg_gen_nand_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1897 #ifdef TCG_TARGET_HAS_nand_i64
1898 tcg_gen_op3_i64(INDEX_op_nand_i64, ret, arg1, arg2);
1899 #elif defined(TCG_TARGET_HAS_nand_i32) && TCG_TARGET_REG_BITS == 32
1900 tcg_gen_nand_i32(TCGV_LOW(ret), TCGV_LOW(arg1), TCGV_LOW(arg2));
1901 tcg_gen_nand_i32(TCGV_HIGH(ret), TCGV_HIGH(arg1), TCGV_HIGH(arg2));
1902 #else
1903 tcg_gen_and_i64(ret, arg1, arg2);
1904 tcg_gen_not_i64(ret, ret);
1905 #endif
1908 static inline void tcg_gen_nor_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
1910 #ifdef TCG_TARGET_HAS_nor_i32
1911 tcg_gen_op3_i32(INDEX_op_nor_i32, ret, arg1, arg2);
1912 #else
1913 tcg_gen_or_i32(ret, arg1, arg2);
1914 tcg_gen_not_i32(ret, ret);
1915 #endif
1918 static inline void tcg_gen_nor_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1920 #ifdef TCG_TARGET_HAS_nor_i64
1921 tcg_gen_op3_i64(INDEX_op_nor_i64, ret, arg1, arg2);
1922 #elif defined(TCG_TARGET_HAS_nor_i32) && TCG_TARGET_REG_BITS == 32
1923 tcg_gen_nor_i32(TCGV_LOW(ret), TCGV_LOW(arg1), TCGV_LOW(arg2));
1924 tcg_gen_nor_i32(TCGV_HIGH(ret), TCGV_HIGH(arg1), TCGV_HIGH(arg2));
1925 #else
1926 tcg_gen_or_i64(ret, arg1, arg2);
1927 tcg_gen_not_i64(ret, ret);
1928 #endif
1931 static inline void tcg_gen_orc_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
1933 #ifdef TCG_TARGET_HAS_orc_i32
1934 tcg_gen_op3_i32(INDEX_op_orc_i32, ret, arg1, arg2);
1935 #else
1936 TCGv_i32 t0;
1937 t0 = tcg_temp_new_i32();
1938 tcg_gen_not_i32(t0, arg2);
1939 tcg_gen_or_i32(ret, arg1, t0);
1940 tcg_temp_free_i32(t0);
1941 #endif
1944 static inline void tcg_gen_orc_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1946 #ifdef TCG_TARGET_HAS_orc_i64
1947 tcg_gen_op3_i64(INDEX_op_orc_i64, ret, arg1, arg2);
1948 #elif defined(TCG_TARGET_HAS_orc_i32) && TCG_TARGET_REG_BITS == 32
1949 tcg_gen_orc_i32(TCGV_LOW(ret), TCGV_LOW(arg1), TCGV_LOW(arg2));
1950 tcg_gen_orc_i32(TCGV_HIGH(ret), TCGV_HIGH(arg1), TCGV_HIGH(arg2));
1951 #else
1952 TCGv_i64 t0;
1953 t0 = tcg_temp_new_i64();
1954 tcg_gen_not_i64(t0, arg2);
1955 tcg_gen_or_i64(ret, arg1, t0);
1956 tcg_temp_free_i64(t0);
1957 #endif
1960 static inline void tcg_gen_rotl_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
1962 #ifdef TCG_TARGET_HAS_rot_i32
1963 tcg_gen_op3_i32(INDEX_op_rotl_i32, ret, arg1, arg2);
1964 #else
1965 TCGv_i32 t0, t1;
1967 t0 = tcg_temp_new_i32();
1968 t1 = tcg_temp_new_i32();
1969 tcg_gen_shl_i32(t0, arg1, arg2);
1970 tcg_gen_subfi_i32(t1, 32, arg2);
1971 tcg_gen_shr_i32(t1, arg1, t1);
1972 tcg_gen_or_i32(ret, t0, t1);
1973 tcg_temp_free_i32(t0);
1974 tcg_temp_free_i32(t1);
1975 #endif
1978 static inline void tcg_gen_rotl_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1980 #ifdef TCG_TARGET_HAS_rot_i64
1981 tcg_gen_op3_i64(INDEX_op_rotl_i64, ret, arg1, arg2);
1982 #else
1983 TCGv_i64 t0, t1;
1985 t0 = tcg_temp_new_i64();
1986 t1 = tcg_temp_new_i64();
1987 tcg_gen_shl_i64(t0, arg1, arg2);
1988 tcg_gen_subfi_i64(t1, 64, arg2);
1989 tcg_gen_shr_i64(t1, arg1, t1);
1990 tcg_gen_or_i64(ret, t0, t1);
1991 tcg_temp_free_i64(t0);
1992 tcg_temp_free_i64(t1);
1993 #endif
1996 static inline void tcg_gen_rotli_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2)
1998 /* some cases can be optimized here */
1999 if (arg2 == 0) {
2000 tcg_gen_mov_i32(ret, arg1);
2001 } else {
2002 #ifdef TCG_TARGET_HAS_rot_i32
2003 TCGv_i32 t0 = tcg_const_i32(arg2);
2004 tcg_gen_rotl_i32(ret, arg1, t0);
2005 tcg_temp_free_i32(t0);
2006 #else
2007 TCGv_i32 t0, t1;
2008 t0 = tcg_temp_new_i32();
2009 t1 = tcg_temp_new_i32();
2010 tcg_gen_shli_i32(t0, arg1, arg2);
2011 tcg_gen_shri_i32(t1, arg1, 32 - arg2);
2012 tcg_gen_or_i32(ret, t0, t1);
2013 tcg_temp_free_i32(t0);
2014 tcg_temp_free_i32(t1);
2015 #endif
2019 static inline void tcg_gen_rotli_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
2021 /* some cases can be optimized here */
2022 if (arg2 == 0) {
2023 tcg_gen_mov_i64(ret, arg1);
2024 } else {
2025 #ifdef TCG_TARGET_HAS_rot_i64
2026 TCGv_i64 t0 = tcg_const_i64(arg2);
2027 tcg_gen_rotl_i64(ret, arg1, t0);
2028 tcg_temp_free_i64(t0);
2029 #else
2030 TCGv_i64 t0, t1;
2031 t0 = tcg_temp_new_i64();
2032 t1 = tcg_temp_new_i64();
2033 tcg_gen_shli_i64(t0, arg1, arg2);
2034 tcg_gen_shri_i64(t1, arg1, 64 - arg2);
2035 tcg_gen_or_i64(ret, t0, t1);
2036 tcg_temp_free_i64(t0);
2037 tcg_temp_free_i64(t1);
2038 #endif
2042 static inline void tcg_gen_rotr_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
2044 #ifdef TCG_TARGET_HAS_rot_i32
2045 tcg_gen_op3_i32(INDEX_op_rotr_i32, ret, arg1, arg2);
2046 #else
2047 TCGv_i32 t0, t1;
2049 t0 = tcg_temp_new_i32();
2050 t1 = tcg_temp_new_i32();
2051 tcg_gen_shr_i32(t0, arg1, arg2);
2052 tcg_gen_subfi_i32(t1, 32, arg2);
2053 tcg_gen_shl_i32(t1, arg1, t1);
2054 tcg_gen_or_i32(ret, t0, t1);
2055 tcg_temp_free_i32(t0);
2056 tcg_temp_free_i32(t1);
2057 #endif
2060 static inline void tcg_gen_rotr_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
2062 #ifdef TCG_TARGET_HAS_rot_i64
2063 tcg_gen_op3_i64(INDEX_op_rotr_i64, ret, arg1, arg2);
2064 #else
2065 TCGv_i64 t0, t1;
2067 t0 = tcg_temp_new_i64();
2068 t1 = tcg_temp_new_i64();
2069 tcg_gen_shr_i64(t0, arg1, arg2);
2070 tcg_gen_subfi_i64(t1, 64, arg2);
2071 tcg_gen_shl_i64(t1, arg1, t1);
2072 tcg_gen_or_i64(ret, t0, t1);
2073 tcg_temp_free_i64(t0);
2074 tcg_temp_free_i64(t1);
2075 #endif
2078 static inline void tcg_gen_rotri_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2)
2080 /* some cases can be optimized here */
2081 if (arg2 == 0) {
2082 tcg_gen_mov_i32(ret, arg1);
2083 } else {
2084 tcg_gen_rotli_i32(ret, arg1, 32 - arg2);
2088 static inline void tcg_gen_rotri_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
2090 /* some cases can be optimized here */
2091 if (arg2 == 0) {
2092 tcg_gen_mov_i64(ret, arg1);
2093 } else {
2094 tcg_gen_rotli_i64(ret, arg1, 64 - arg2);
2098 static inline void tcg_gen_deposit_i32(TCGv_i32 ret, TCGv_i32 arg1,
2099 TCGv_i32 arg2, unsigned int ofs,
2100 unsigned int len)
2102 #ifdef TCG_TARGET_HAS_deposit_i32
2103 tcg_gen_op5ii_i32(INDEX_op_deposit_i32, ret, arg1, arg2, ofs, len);
2104 #else
2105 uint32_t mask = (1u << len) - 1;
2106 TCGv_i32 t1 = tcg_temp_new_i32 ();
2108 tcg_gen_andi_i32(t1, arg2, mask);
2109 tcg_gen_shli_i32(t1, t1, ofs);
2110 tcg_gen_andi_i32(ret, arg1, ~(mask << ofs));
2111 tcg_gen_or_i32(ret, ret, t1);
2113 tcg_temp_free_i32(t1);
2114 #endif
2117 static inline void tcg_gen_deposit_i64(TCGv_i64 ret, TCGv_i64 arg1,
2118 TCGv_i64 arg2, unsigned int ofs,
2119 unsigned int len)
2121 #ifdef TCG_TARGET_HAS_deposit_i64
2122 tcg_gen_op5ii_i64(INDEX_op_deposit_i64, ret, arg1, arg2, ofs, len);
2123 #else
2124 uint64_t mask = (1ull << len) - 1;
2125 TCGv_i64 t1 = tcg_temp_new_i64 ();
2127 tcg_gen_andi_i64(t1, arg2, mask);
2128 tcg_gen_shli_i64(t1, t1, ofs);
2129 tcg_gen_andi_i64(ret, arg1, ~(mask << ofs));
2130 tcg_gen_or_i64(ret, ret, t1);
2132 tcg_temp_free_i64(t1);
2133 #endif
2136 /***************************************/
2137 /* QEMU specific operations. Their type depend on the QEMU CPU
2138 type. */
2139 #ifndef TARGET_LONG_BITS
2140 #error must include QEMU headers
2141 #endif
2143 #if TARGET_LONG_BITS == 32
2144 #define TCGv TCGv_i32
2145 #define tcg_temp_new() tcg_temp_new_i32()
2146 #define tcg_global_reg_new tcg_global_reg_new_i32
2147 #define tcg_global_mem_new tcg_global_mem_new_i32
2148 #define tcg_temp_local_new() tcg_temp_local_new_i32()
2149 #define tcg_temp_free tcg_temp_free_i32
2150 #define tcg_gen_qemu_ldst_op tcg_gen_op3i_i32
2151 #define tcg_gen_qemu_ldst_op_i64 tcg_gen_qemu_ldst_op_i64_i32
2152 #define TCGV_UNUSED(x) TCGV_UNUSED_I32(x)
2153 #define TCGV_EQUAL(a, b) TCGV_EQUAL_I32(a, b)
2154 #else
2155 #define TCGv TCGv_i64
2156 #define tcg_temp_new() tcg_temp_new_i64()
2157 #define tcg_global_reg_new tcg_global_reg_new_i64
2158 #define tcg_global_mem_new tcg_global_mem_new_i64
2159 #define tcg_temp_local_new() tcg_temp_local_new_i64()
2160 #define tcg_temp_free tcg_temp_free_i64
2161 #define tcg_gen_qemu_ldst_op tcg_gen_op3i_i64
2162 #define tcg_gen_qemu_ldst_op_i64 tcg_gen_qemu_ldst_op_i64_i64
2163 #define TCGV_UNUSED(x) TCGV_UNUSED_I64(x)
2164 #define TCGV_EQUAL(a, b) TCGV_EQUAL_I64(a, b)
2165 #endif
2167 /* debug info: write the PC of the corresponding QEMU CPU instruction */
2168 static inline void tcg_gen_debug_insn_start(uint64_t pc)
2170 /* XXX: must really use a 32 bit size for TCGArg in all cases */
2171 #if TARGET_LONG_BITS > TCG_TARGET_REG_BITS
2172 tcg_gen_op2ii(INDEX_op_debug_insn_start,
2173 (uint32_t)(pc), (uint32_t)(pc >> 32));
2174 #else
2175 tcg_gen_op1i(INDEX_op_debug_insn_start, pc);
2176 #endif
2179 static inline void tcg_gen_exit_tb(tcg_target_long val)
2181 tcg_gen_op1i(INDEX_op_exit_tb, val);
2184 static inline void tcg_gen_goto_tb(int idx)
2186 tcg_gen_op1i(INDEX_op_goto_tb, idx);
2189 #if TCG_TARGET_REG_BITS == 32
2190 static inline void tcg_gen_qemu_ld8u(TCGv ret, TCGv addr, int mem_index)
2192 #if TARGET_LONG_BITS == 32
2193 tcg_gen_op3i_i32(INDEX_op_qemu_ld8u, ret, addr, mem_index);
2194 #else
2195 tcg_gen_op4i_i32(INDEX_op_qemu_ld8u, TCGV_LOW(ret), TCGV_LOW(addr),
2196 TCGV_HIGH(addr), mem_index);
2197 tcg_gen_movi_i32(TCGV_HIGH(ret), 0);
2198 #endif
2201 static inline void tcg_gen_qemu_ld8s(TCGv ret, TCGv addr, int mem_index)
2203 #if TARGET_LONG_BITS == 32
2204 tcg_gen_op3i_i32(INDEX_op_qemu_ld8s, ret, addr, mem_index);
2205 #else
2206 tcg_gen_op4i_i32(INDEX_op_qemu_ld8s, TCGV_LOW(ret), TCGV_LOW(addr),
2207 TCGV_HIGH(addr), mem_index);
2208 tcg_gen_sari_i32(TCGV_HIGH(ret), TCGV_LOW(ret), 31);
2209 #endif
2212 static inline void tcg_gen_qemu_ld16u(TCGv ret, TCGv addr, int mem_index)
2214 #if TARGET_LONG_BITS == 32
2215 tcg_gen_op3i_i32(INDEX_op_qemu_ld16u, ret, addr, mem_index);
2216 #else
2217 tcg_gen_op4i_i32(INDEX_op_qemu_ld16u, TCGV_LOW(ret), TCGV_LOW(addr),
2218 TCGV_HIGH(addr), mem_index);
2219 tcg_gen_movi_i32(TCGV_HIGH(ret), 0);
2220 #endif
2223 static inline void tcg_gen_qemu_ld16s(TCGv ret, TCGv addr, int mem_index)
2225 #if TARGET_LONG_BITS == 32
2226 tcg_gen_op3i_i32(INDEX_op_qemu_ld16s, ret, addr, mem_index);
2227 #else
2228 tcg_gen_op4i_i32(INDEX_op_qemu_ld16s, TCGV_LOW(ret), TCGV_LOW(addr),
2229 TCGV_HIGH(addr), mem_index);
2230 tcg_gen_sari_i32(TCGV_HIGH(ret), TCGV_LOW(ret), 31);
2231 #endif
2234 static inline void tcg_gen_qemu_ld32u(TCGv ret, TCGv addr, int mem_index)
2236 #if TARGET_LONG_BITS == 32
2237 tcg_gen_op3i_i32(INDEX_op_qemu_ld32, ret, addr, mem_index);
2238 #else
2239 tcg_gen_op4i_i32(INDEX_op_qemu_ld32, TCGV_LOW(ret), TCGV_LOW(addr),
2240 TCGV_HIGH(addr), mem_index);
2241 tcg_gen_movi_i32(TCGV_HIGH(ret), 0);
2242 #endif
2245 static inline void tcg_gen_qemu_ld32s(TCGv ret, TCGv addr, int mem_index)
2247 #if TARGET_LONG_BITS == 32
2248 tcg_gen_op3i_i32(INDEX_op_qemu_ld32, ret, addr, mem_index);
2249 #else
2250 tcg_gen_op4i_i32(INDEX_op_qemu_ld32, TCGV_LOW(ret), TCGV_LOW(addr),
2251 TCGV_HIGH(addr), mem_index);
2252 tcg_gen_sari_i32(TCGV_HIGH(ret), TCGV_LOW(ret), 31);
2253 #endif
2256 static inline void tcg_gen_qemu_ld64(TCGv_i64 ret, TCGv addr, int mem_index)
2258 #if TARGET_LONG_BITS == 32
2259 tcg_gen_op4i_i32(INDEX_op_qemu_ld64, TCGV_LOW(ret), TCGV_HIGH(ret), addr, mem_index);
2260 #else
2261 tcg_gen_op5i_i32(INDEX_op_qemu_ld64, TCGV_LOW(ret), TCGV_HIGH(ret),
2262 TCGV_LOW(addr), TCGV_HIGH(addr), mem_index);
2263 #endif
2266 static inline void tcg_gen_qemu_st8(TCGv arg, TCGv addr, int mem_index)
2268 #if TARGET_LONG_BITS == 32
2269 tcg_gen_op3i_i32(INDEX_op_qemu_st8, arg, addr, mem_index);
2270 #else
2271 tcg_gen_op4i_i32(INDEX_op_qemu_st8, TCGV_LOW(arg), TCGV_LOW(addr),
2272 TCGV_HIGH(addr), mem_index);
2273 #endif
2276 static inline void tcg_gen_qemu_st16(TCGv arg, TCGv addr, int mem_index)
2278 #if TARGET_LONG_BITS == 32
2279 tcg_gen_op3i_i32(INDEX_op_qemu_st16, arg, addr, mem_index);
2280 #else
2281 tcg_gen_op4i_i32(INDEX_op_qemu_st16, TCGV_LOW(arg), TCGV_LOW(addr),
2282 TCGV_HIGH(addr), mem_index);
2283 #endif
2286 static inline void tcg_gen_qemu_st32(TCGv arg, TCGv addr, int mem_index)
2288 #if TARGET_LONG_BITS == 32
2289 tcg_gen_op3i_i32(INDEX_op_qemu_st32, arg, addr, mem_index);
2290 #else
2291 tcg_gen_op4i_i32(INDEX_op_qemu_st32, TCGV_LOW(arg), TCGV_LOW(addr),
2292 TCGV_HIGH(addr), mem_index);
2293 #endif
2296 static inline void tcg_gen_qemu_st64(TCGv_i64 arg, TCGv addr, int mem_index)
2298 #if TARGET_LONG_BITS == 32
2299 tcg_gen_op4i_i32(INDEX_op_qemu_st64, TCGV_LOW(arg), TCGV_HIGH(arg), addr,
2300 mem_index);
2301 #else
2302 tcg_gen_op5i_i32(INDEX_op_qemu_st64, TCGV_LOW(arg), TCGV_HIGH(arg),
2303 TCGV_LOW(addr), TCGV_HIGH(addr), mem_index);
2304 #endif
2307 #define tcg_gen_ld_ptr tcg_gen_ld_i32
2308 #define tcg_gen_discard_ptr tcg_gen_discard_i32
2310 #else /* TCG_TARGET_REG_BITS == 32 */
2312 static inline void tcg_gen_qemu_ld8u(TCGv ret, TCGv addr, int mem_index)
2314 tcg_gen_qemu_ldst_op(INDEX_op_qemu_ld8u, ret, addr, mem_index);
2317 static inline void tcg_gen_qemu_ld8s(TCGv ret, TCGv addr, int mem_index)
2319 tcg_gen_qemu_ldst_op(INDEX_op_qemu_ld8s, ret, addr, mem_index);
2322 static inline void tcg_gen_qemu_ld16u(TCGv ret, TCGv addr, int mem_index)
2324 tcg_gen_qemu_ldst_op(INDEX_op_qemu_ld16u, ret, addr, mem_index);
2327 static inline void tcg_gen_qemu_ld16s(TCGv ret, TCGv addr, int mem_index)
2329 tcg_gen_qemu_ldst_op(INDEX_op_qemu_ld16s, ret, addr, mem_index);
2332 static inline void tcg_gen_qemu_ld32u(TCGv ret, TCGv addr, int mem_index)
2334 #if TARGET_LONG_BITS == 32
2335 tcg_gen_qemu_ldst_op(INDEX_op_qemu_ld32, ret, addr, mem_index);
2336 #else
2337 tcg_gen_qemu_ldst_op(INDEX_op_qemu_ld32u, ret, addr, mem_index);
2338 #endif
2341 static inline void tcg_gen_qemu_ld32s(TCGv ret, TCGv addr, int mem_index)
2343 #if TARGET_LONG_BITS == 32
2344 tcg_gen_qemu_ldst_op(INDEX_op_qemu_ld32, ret, addr, mem_index);
2345 #else
2346 tcg_gen_qemu_ldst_op(INDEX_op_qemu_ld32s, ret, addr, mem_index);
2347 #endif
2350 static inline void tcg_gen_qemu_ld64(TCGv_i64 ret, TCGv addr, int mem_index)
2352 tcg_gen_qemu_ldst_op_i64(INDEX_op_qemu_ld64, ret, addr, mem_index);
2355 static inline void tcg_gen_qemu_st8(TCGv arg, TCGv addr, int mem_index)
2357 tcg_gen_qemu_ldst_op(INDEX_op_qemu_st8, arg, addr, mem_index);
2360 static inline void tcg_gen_qemu_st16(TCGv arg, TCGv addr, int mem_index)
2362 tcg_gen_qemu_ldst_op(INDEX_op_qemu_st16, arg, addr, mem_index);
2365 static inline void tcg_gen_qemu_st32(TCGv arg, TCGv addr, int mem_index)
2367 tcg_gen_qemu_ldst_op(INDEX_op_qemu_st32, arg, addr, mem_index);
2370 static inline void tcg_gen_qemu_st64(TCGv_i64 arg, TCGv addr, int mem_index)
2372 tcg_gen_qemu_ldst_op_i64(INDEX_op_qemu_st64, arg, addr, mem_index);
2375 #define tcg_gen_ld_ptr tcg_gen_ld_i64
2376 #define tcg_gen_discard_ptr tcg_gen_discard_i64
2378 #endif /* TCG_TARGET_REG_BITS != 32 */
2380 #if TARGET_LONG_BITS == 64
2381 #define tcg_gen_movi_tl tcg_gen_movi_i64
2382 #define tcg_gen_mov_tl tcg_gen_mov_i64
2383 #define tcg_gen_ld8u_tl tcg_gen_ld8u_i64
2384 #define tcg_gen_ld8s_tl tcg_gen_ld8s_i64
2385 #define tcg_gen_ld16u_tl tcg_gen_ld16u_i64
2386 #define tcg_gen_ld16s_tl tcg_gen_ld16s_i64
2387 #define tcg_gen_ld32u_tl tcg_gen_ld32u_i64
2388 #define tcg_gen_ld32s_tl tcg_gen_ld32s_i64
2389 #define tcg_gen_ld_tl tcg_gen_ld_i64
2390 #define tcg_gen_st8_tl tcg_gen_st8_i64
2391 #define tcg_gen_st16_tl tcg_gen_st16_i64
2392 #define tcg_gen_st32_tl tcg_gen_st32_i64
2393 #define tcg_gen_st_tl tcg_gen_st_i64
2394 #define tcg_gen_add_tl tcg_gen_add_i64
2395 #define tcg_gen_addi_tl tcg_gen_addi_i64
2396 #define tcg_gen_sub_tl tcg_gen_sub_i64
2397 #define tcg_gen_neg_tl tcg_gen_neg_i64
2398 #define tcg_gen_subfi_tl tcg_gen_subfi_i64
2399 #define tcg_gen_subi_tl tcg_gen_subi_i64
2400 #define tcg_gen_and_tl tcg_gen_and_i64
2401 #define tcg_gen_andi_tl tcg_gen_andi_i64
2402 #define tcg_gen_or_tl tcg_gen_or_i64
2403 #define tcg_gen_ori_tl tcg_gen_ori_i64
2404 #define tcg_gen_xor_tl tcg_gen_xor_i64
2405 #define tcg_gen_xori_tl tcg_gen_xori_i64
2406 #define tcg_gen_not_tl tcg_gen_not_i64
2407 #define tcg_gen_shl_tl tcg_gen_shl_i64
2408 #define tcg_gen_shli_tl tcg_gen_shli_i64
2409 #define tcg_gen_shr_tl tcg_gen_shr_i64
2410 #define tcg_gen_shri_tl tcg_gen_shri_i64
2411 #define tcg_gen_sar_tl tcg_gen_sar_i64
2412 #define tcg_gen_sari_tl tcg_gen_sari_i64
2413 #define tcg_gen_brcond_tl tcg_gen_brcond_i64
2414 #define tcg_gen_brcondi_tl tcg_gen_brcondi_i64
2415 #define tcg_gen_setcond_tl tcg_gen_setcond_i64
2416 #define tcg_gen_setcondi_tl tcg_gen_setcondi_i64
2417 #define tcg_gen_mul_tl tcg_gen_mul_i64
2418 #define tcg_gen_muli_tl tcg_gen_muli_i64
2419 #define tcg_gen_div_tl tcg_gen_div_i64
2420 #define tcg_gen_rem_tl tcg_gen_rem_i64
2421 #define tcg_gen_divu_tl tcg_gen_divu_i64
2422 #define tcg_gen_remu_tl tcg_gen_remu_i64
2423 #define tcg_gen_discard_tl tcg_gen_discard_i64
2424 #define tcg_gen_trunc_tl_i32 tcg_gen_trunc_i64_i32
2425 #define tcg_gen_trunc_i64_tl tcg_gen_mov_i64
2426 #define tcg_gen_extu_i32_tl tcg_gen_extu_i32_i64
2427 #define tcg_gen_ext_i32_tl tcg_gen_ext_i32_i64
2428 #define tcg_gen_extu_tl_i64 tcg_gen_mov_i64
2429 #define tcg_gen_ext_tl_i64 tcg_gen_mov_i64
2430 #define tcg_gen_ext8u_tl tcg_gen_ext8u_i64
2431 #define tcg_gen_ext8s_tl tcg_gen_ext8s_i64
2432 #define tcg_gen_ext16u_tl tcg_gen_ext16u_i64
2433 #define tcg_gen_ext16s_tl tcg_gen_ext16s_i64
2434 #define tcg_gen_ext32u_tl tcg_gen_ext32u_i64
2435 #define tcg_gen_ext32s_tl tcg_gen_ext32s_i64
2436 #define tcg_gen_bswap16_tl tcg_gen_bswap16_i64
2437 #define tcg_gen_bswap32_tl tcg_gen_bswap32_i64
2438 #define tcg_gen_bswap64_tl tcg_gen_bswap64_i64
2439 #define tcg_gen_concat_tl_i64 tcg_gen_concat32_i64
2440 #define tcg_gen_andc_tl tcg_gen_andc_i64
2441 #define tcg_gen_eqv_tl tcg_gen_eqv_i64
2442 #define tcg_gen_nand_tl tcg_gen_nand_i64
2443 #define tcg_gen_nor_tl tcg_gen_nor_i64
2444 #define tcg_gen_orc_tl tcg_gen_orc_i64
2445 #define tcg_gen_rotl_tl tcg_gen_rotl_i64
2446 #define tcg_gen_rotli_tl tcg_gen_rotli_i64
2447 #define tcg_gen_rotr_tl tcg_gen_rotr_i64
2448 #define tcg_gen_rotri_tl tcg_gen_rotri_i64
2449 #define tcg_gen_deposit_tl tcg_gen_deposit_i64
2450 #define tcg_const_tl tcg_const_i64
2451 #define tcg_const_local_tl tcg_const_local_i64
2452 #else
2453 #define tcg_gen_movi_tl tcg_gen_movi_i32
2454 #define tcg_gen_mov_tl tcg_gen_mov_i32
2455 #define tcg_gen_ld8u_tl tcg_gen_ld8u_i32
2456 #define tcg_gen_ld8s_tl tcg_gen_ld8s_i32
2457 #define tcg_gen_ld16u_tl tcg_gen_ld16u_i32
2458 #define tcg_gen_ld16s_tl tcg_gen_ld16s_i32
2459 #define tcg_gen_ld32u_tl tcg_gen_ld_i32
2460 #define tcg_gen_ld32s_tl tcg_gen_ld_i32
2461 #define tcg_gen_ld_tl tcg_gen_ld_i32
2462 #define tcg_gen_st8_tl tcg_gen_st8_i32
2463 #define tcg_gen_st16_tl tcg_gen_st16_i32
2464 #define tcg_gen_st32_tl tcg_gen_st_i32
2465 #define tcg_gen_st_tl tcg_gen_st_i32
2466 #define tcg_gen_add_tl tcg_gen_add_i32
2467 #define tcg_gen_addi_tl tcg_gen_addi_i32
2468 #define tcg_gen_sub_tl tcg_gen_sub_i32
2469 #define tcg_gen_neg_tl tcg_gen_neg_i32
2470 #define tcg_gen_subfi_tl tcg_gen_subfi_i32
2471 #define tcg_gen_subi_tl tcg_gen_subi_i32
2472 #define tcg_gen_and_tl tcg_gen_and_i32
2473 #define tcg_gen_andi_tl tcg_gen_andi_i32
2474 #define tcg_gen_or_tl tcg_gen_or_i32
2475 #define tcg_gen_ori_tl tcg_gen_ori_i32
2476 #define tcg_gen_xor_tl tcg_gen_xor_i32
2477 #define tcg_gen_xori_tl tcg_gen_xori_i32
2478 #define tcg_gen_not_tl tcg_gen_not_i32
2479 #define tcg_gen_shl_tl tcg_gen_shl_i32
2480 #define tcg_gen_shli_tl tcg_gen_shli_i32
2481 #define tcg_gen_shr_tl tcg_gen_shr_i32
2482 #define tcg_gen_shri_tl tcg_gen_shri_i32
2483 #define tcg_gen_sar_tl tcg_gen_sar_i32
2484 #define tcg_gen_sari_tl tcg_gen_sari_i32
2485 #define tcg_gen_brcond_tl tcg_gen_brcond_i32
2486 #define tcg_gen_brcondi_tl tcg_gen_brcondi_i32
2487 #define tcg_gen_setcond_tl tcg_gen_setcond_i32
2488 #define tcg_gen_setcondi_tl tcg_gen_setcondi_i32
2489 #define tcg_gen_mul_tl tcg_gen_mul_i32
2490 #define tcg_gen_muli_tl tcg_gen_muli_i32
2491 #define tcg_gen_div_tl tcg_gen_div_i32
2492 #define tcg_gen_rem_tl tcg_gen_rem_i32
2493 #define tcg_gen_divu_tl tcg_gen_divu_i32
2494 #define tcg_gen_remu_tl tcg_gen_remu_i32
2495 #define tcg_gen_discard_tl tcg_gen_discard_i32
2496 #define tcg_gen_trunc_tl_i32 tcg_gen_mov_i32
2497 #define tcg_gen_trunc_i64_tl tcg_gen_trunc_i64_i32
2498 #define tcg_gen_extu_i32_tl tcg_gen_mov_i32
2499 #define tcg_gen_ext_i32_tl tcg_gen_mov_i32
2500 #define tcg_gen_extu_tl_i64 tcg_gen_extu_i32_i64
2501 #define tcg_gen_ext_tl_i64 tcg_gen_ext_i32_i64
2502 #define tcg_gen_ext8u_tl tcg_gen_ext8u_i32
2503 #define tcg_gen_ext8s_tl tcg_gen_ext8s_i32
2504 #define tcg_gen_ext16u_tl tcg_gen_ext16u_i32
2505 #define tcg_gen_ext16s_tl tcg_gen_ext16s_i32
2506 #define tcg_gen_ext32u_tl tcg_gen_mov_i32
2507 #define tcg_gen_ext32s_tl tcg_gen_mov_i32
2508 #define tcg_gen_bswap16_tl tcg_gen_bswap16_i32
2509 #define tcg_gen_bswap32_tl tcg_gen_bswap32_i32
2510 #define tcg_gen_concat_tl_i64 tcg_gen_concat_i32_i64
2511 #define tcg_gen_andc_tl tcg_gen_andc_i32
2512 #define tcg_gen_eqv_tl tcg_gen_eqv_i32
2513 #define tcg_gen_nand_tl tcg_gen_nand_i32
2514 #define tcg_gen_nor_tl tcg_gen_nor_i32
2515 #define tcg_gen_orc_tl tcg_gen_orc_i32
2516 #define tcg_gen_rotl_tl tcg_gen_rotl_i32
2517 #define tcg_gen_rotli_tl tcg_gen_rotli_i32
2518 #define tcg_gen_rotr_tl tcg_gen_rotr_i32
2519 #define tcg_gen_rotri_tl tcg_gen_rotri_i32
2520 #define tcg_gen_deposit_tl tcg_gen_deposit_i32
2521 #define tcg_const_tl tcg_const_i32
2522 #define tcg_const_local_tl tcg_const_local_i32
2523 #endif
2525 #if TCG_TARGET_REG_BITS == 32
2526 #define tcg_gen_add_ptr tcg_gen_add_i32
2527 #define tcg_gen_addi_ptr tcg_gen_addi_i32
2528 #define tcg_gen_ext_i32_ptr tcg_gen_mov_i32
2529 #else /* TCG_TARGET_REG_BITS == 32 */
2530 #define tcg_gen_add_ptr tcg_gen_add_i64
2531 #define tcg_gen_addi_ptr tcg_gen_addi_i64
2532 #define tcg_gen_ext_i32_ptr tcg_gen_ext_i32_i64
2533 #endif /* TCG_TARGET_REG_BITS != 32 */