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