]> git.proxmox.com Git - mirror_qemu.git/blob - tcg/tcg-op.h
Skip register moves when the target and the source are the same
[mirror_qemu.git] / tcg / tcg-op.h
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
26 #ifndef CONFIG_NO_DYNGEN_OP
27 /* legacy dyngen operations */
28 #include "gen-op.h"
29 #endif
30
31 int gen_new_label(void);
32
33 static inline void tcg_gen_op1(int opc, TCGv arg1)
34 {
35 *gen_opc_ptr++ = opc;
36 *gen_opparam_ptr++ = GET_TCGV(arg1);
37 }
38
39 static inline void tcg_gen_op1i(int opc, TCGArg arg1)
40 {
41 *gen_opc_ptr++ = opc;
42 *gen_opparam_ptr++ = arg1;
43 }
44
45 static inline void tcg_gen_op2(int opc, TCGv arg1, TCGv arg2)
46 {
47 *gen_opc_ptr++ = opc;
48 *gen_opparam_ptr++ = GET_TCGV(arg1);
49 *gen_opparam_ptr++ = GET_TCGV(arg2);
50 }
51
52 static inline void tcg_gen_op2i(int opc, TCGv arg1, TCGArg arg2)
53 {
54 *gen_opc_ptr++ = opc;
55 *gen_opparam_ptr++ = GET_TCGV(arg1);
56 *gen_opparam_ptr++ = arg2;
57 }
58
59 static inline void tcg_gen_op3(int opc, TCGv arg1, TCGv arg2, TCGv arg3)
60 {
61 *gen_opc_ptr++ = opc;
62 *gen_opparam_ptr++ = GET_TCGV(arg1);
63 *gen_opparam_ptr++ = GET_TCGV(arg2);
64 *gen_opparam_ptr++ = GET_TCGV(arg3);
65 }
66
67 static inline void tcg_gen_op3i(int opc, TCGv arg1, TCGv arg2, TCGArg arg3)
68 {
69 *gen_opc_ptr++ = opc;
70 *gen_opparam_ptr++ = GET_TCGV(arg1);
71 *gen_opparam_ptr++ = GET_TCGV(arg2);
72 *gen_opparam_ptr++ = arg3;
73 }
74
75 static inline void tcg_gen_op4(int opc, TCGv arg1, TCGv arg2, TCGv arg3,
76 TCGv arg4)
77 {
78 *gen_opc_ptr++ = opc;
79 *gen_opparam_ptr++ = GET_TCGV(arg1);
80 *gen_opparam_ptr++ = GET_TCGV(arg2);
81 *gen_opparam_ptr++ = GET_TCGV(arg3);
82 *gen_opparam_ptr++ = GET_TCGV(arg4);
83 }
84
85 static inline void tcg_gen_op4i(int opc, TCGv arg1, TCGv arg2, TCGv arg3,
86 TCGArg arg4)
87 {
88 *gen_opc_ptr++ = opc;
89 *gen_opparam_ptr++ = GET_TCGV(arg1);
90 *gen_opparam_ptr++ = GET_TCGV(arg2);
91 *gen_opparam_ptr++ = GET_TCGV(arg3);
92 *gen_opparam_ptr++ = arg4;
93 }
94
95 static inline void tcg_gen_op4ii(int opc, TCGv arg1, TCGv arg2, TCGArg arg3,
96 TCGArg arg4)
97 {
98 *gen_opc_ptr++ = opc;
99 *gen_opparam_ptr++ = GET_TCGV(arg1);
100 *gen_opparam_ptr++ = GET_TCGV(arg2);
101 *gen_opparam_ptr++ = arg3;
102 *gen_opparam_ptr++ = arg4;
103 }
104
105 static inline void tcg_gen_op5(int opc, TCGv arg1, TCGv arg2,
106 TCGv arg3, TCGv arg4,
107 TCGv arg5)
108 {
109 *gen_opc_ptr++ = opc;
110 *gen_opparam_ptr++ = GET_TCGV(arg1);
111 *gen_opparam_ptr++ = GET_TCGV(arg2);
112 *gen_opparam_ptr++ = GET_TCGV(arg3);
113 *gen_opparam_ptr++ = GET_TCGV(arg4);
114 *gen_opparam_ptr++ = GET_TCGV(arg5);
115 }
116
117 static inline void tcg_gen_op5i(int opc, TCGv arg1, TCGv arg2,
118 TCGv arg3, TCGv arg4,
119 TCGArg arg5)
120 {
121 *gen_opc_ptr++ = opc;
122 *gen_opparam_ptr++ = GET_TCGV(arg1);
123 *gen_opparam_ptr++ = GET_TCGV(arg2);
124 *gen_opparam_ptr++ = GET_TCGV(arg3);
125 *gen_opparam_ptr++ = GET_TCGV(arg4);
126 *gen_opparam_ptr++ = arg5;
127 }
128
129 static inline void tcg_gen_op6(int opc, TCGv arg1, TCGv arg2,
130 TCGv arg3, TCGv arg4,
131 TCGv arg5, TCGv arg6)
132 {
133 *gen_opc_ptr++ = opc;
134 *gen_opparam_ptr++ = GET_TCGV(arg1);
135 *gen_opparam_ptr++ = GET_TCGV(arg2);
136 *gen_opparam_ptr++ = GET_TCGV(arg3);
137 *gen_opparam_ptr++ = GET_TCGV(arg4);
138 *gen_opparam_ptr++ = GET_TCGV(arg5);
139 *gen_opparam_ptr++ = GET_TCGV(arg6);
140 }
141
142 static inline void tcg_gen_op6ii(int opc, TCGv arg1, TCGv arg2,
143 TCGv arg3, TCGv arg4,
144 TCGArg arg5, TCGArg arg6)
145 {
146 *gen_opc_ptr++ = opc;
147 *gen_opparam_ptr++ = GET_TCGV(arg1);
148 *gen_opparam_ptr++ = GET_TCGV(arg2);
149 *gen_opparam_ptr++ = GET_TCGV(arg3);
150 *gen_opparam_ptr++ = GET_TCGV(arg4);
151 *gen_opparam_ptr++ = arg5;
152 *gen_opparam_ptr++ = arg6;
153 }
154
155 static inline void gen_set_label(int n)
156 {
157 tcg_gen_op1i(INDEX_op_set_label, n);
158 }
159
160 static inline void tcg_gen_br(int label)
161 {
162 tcg_gen_op1i(INDEX_op_br, label);
163 }
164
165 static inline void tcg_gen_mov_i32(TCGv ret, TCGv arg)
166 {
167 if (ret != arg)
168 tcg_gen_op2(INDEX_op_mov_i32, ret, arg);
169 }
170
171 static inline void tcg_gen_movi_i32(TCGv ret, int32_t arg)
172 {
173 tcg_gen_op2i(INDEX_op_movi_i32, ret, arg);
174 }
175
176 /* helper calls */
177 #define TCG_HELPER_CALL_FLAGS 0
178
179 static inline void tcg_gen_helper_0_0(void *func)
180 {
181 tcg_gen_call(&tcg_ctx,
182 tcg_const_ptr((tcg_target_long)func), TCG_HELPER_CALL_FLAGS,
183 0, NULL, 0, NULL);
184 }
185
186 static inline void tcg_gen_helper_0_1(void *func, TCGv arg)
187 {
188 tcg_gen_call(&tcg_ctx,
189 tcg_const_ptr((tcg_target_long)func), TCG_HELPER_CALL_FLAGS,
190 0, NULL, 1, &arg);
191 }
192
193 static inline void tcg_gen_helper_0_2(void *func, TCGv arg1, TCGv arg2)
194 {
195 TCGv args[2];
196 args[0] = arg1;
197 args[1] = arg2;
198 tcg_gen_call(&tcg_ctx,
199 tcg_const_ptr((tcg_target_long)func), TCG_HELPER_CALL_FLAGS,
200 0, NULL, 2, args);
201 }
202
203 static inline void tcg_gen_helper_0_3(void *func,
204 TCGv arg1, TCGv arg2, TCGv arg3)
205 {
206 TCGv args[3];
207 args[0] = arg1;
208 args[1] = arg2;
209 args[2] = arg3;
210 tcg_gen_call(&tcg_ctx,
211 tcg_const_ptr((tcg_target_long)func), TCG_HELPER_CALL_FLAGS,
212 0, NULL, 3, args);
213 }
214
215 static inline void tcg_gen_helper_0_4(void *func, TCGv arg1, TCGv arg2,
216 TCGv arg3, TCGv arg4)
217 {
218 TCGv args[4];
219 args[0] = arg1;
220 args[1] = arg2;
221 args[2] = arg3;
222 args[3] = arg4;
223 tcg_gen_call(&tcg_ctx,
224 tcg_const_ptr((tcg_target_long)func), TCG_HELPER_CALL_FLAGS,
225 0, NULL, 4, args);
226 }
227
228 static inline void tcg_gen_helper_1_0(void *func, TCGv ret)
229 {
230 tcg_gen_call(&tcg_ctx,
231 tcg_const_ptr((tcg_target_long)func), TCG_HELPER_CALL_FLAGS,
232 1, &ret, 0, NULL);
233 }
234
235 static inline void tcg_gen_helper_1_1(void *func, TCGv ret, TCGv arg1)
236 {
237 tcg_gen_call(&tcg_ctx,
238 tcg_const_ptr((tcg_target_long)func), TCG_HELPER_CALL_FLAGS,
239 1, &ret, 1, &arg1);
240 }
241
242 static inline void tcg_gen_helper_1_2(void *func, TCGv ret,
243 TCGv arg1, TCGv arg2)
244 {
245 TCGv args[2];
246 args[0] = arg1;
247 args[1] = arg2;
248 tcg_gen_call(&tcg_ctx,
249 tcg_const_ptr((tcg_target_long)func), TCG_HELPER_CALL_FLAGS,
250 1, &ret, 2, args);
251 }
252
253 static inline void tcg_gen_helper_1_3(void *func, TCGv ret,
254 TCGv arg1, TCGv arg2, TCGv arg3)
255 {
256 TCGv args[3];
257 args[0] = arg1;
258 args[1] = arg2;
259 args[2] = arg3;
260 tcg_gen_call(&tcg_ctx,
261 tcg_const_ptr((tcg_target_long)func), TCG_HELPER_CALL_FLAGS,
262 1, &ret, 3, args);
263 }
264
265 static inline void tcg_gen_helper_1_4(void *func, TCGv ret,
266 TCGv arg1, TCGv arg2, TCGv arg3,
267 TCGv arg4)
268 {
269 TCGv args[4];
270 args[0] = arg1;
271 args[1] = arg2;
272 args[2] = arg3;
273 args[3] = arg4;
274 tcg_gen_call(&tcg_ctx,
275 tcg_const_ptr((tcg_target_long)func), TCG_HELPER_CALL_FLAGS,
276 1, &ret, 4, args);
277 }
278
279 /* 32 bit ops */
280
281 static inline void tcg_gen_ld8u_i32(TCGv ret, TCGv arg2, tcg_target_long offset)
282 {
283 tcg_gen_op3i(INDEX_op_ld8u_i32, ret, arg2, offset);
284 }
285
286 static inline void tcg_gen_ld8s_i32(TCGv ret, TCGv arg2, tcg_target_long offset)
287 {
288 tcg_gen_op3i(INDEX_op_ld8s_i32, ret, arg2, offset);
289 }
290
291 static inline void tcg_gen_ld16u_i32(TCGv ret, TCGv arg2, tcg_target_long offset)
292 {
293 tcg_gen_op3i(INDEX_op_ld16u_i32, ret, arg2, offset);
294 }
295
296 static inline void tcg_gen_ld16s_i32(TCGv ret, TCGv arg2, tcg_target_long offset)
297 {
298 tcg_gen_op3i(INDEX_op_ld16s_i32, ret, arg2, offset);
299 }
300
301 static inline void tcg_gen_ld_i32(TCGv ret, TCGv arg2, tcg_target_long offset)
302 {
303 tcg_gen_op3i(INDEX_op_ld_i32, ret, arg2, offset);
304 }
305
306 static inline void tcg_gen_st8_i32(TCGv arg1, TCGv arg2, tcg_target_long offset)
307 {
308 tcg_gen_op3i(INDEX_op_st8_i32, arg1, arg2, offset);
309 }
310
311 static inline void tcg_gen_st16_i32(TCGv arg1, TCGv arg2, tcg_target_long offset)
312 {
313 tcg_gen_op3i(INDEX_op_st16_i32, arg1, arg2, offset);
314 }
315
316 static inline void tcg_gen_st_i32(TCGv arg1, TCGv arg2, tcg_target_long offset)
317 {
318 tcg_gen_op3i(INDEX_op_st_i32, arg1, arg2, offset);
319 }
320
321 static inline void tcg_gen_add_i32(TCGv ret, TCGv arg1, TCGv arg2)
322 {
323 tcg_gen_op3(INDEX_op_add_i32, ret, arg1, arg2);
324 }
325
326 static inline void tcg_gen_addi_i32(TCGv ret, TCGv arg1, int32_t arg2)
327 {
328 /* some cases can be optimized here */
329 if (arg2 == 0) {
330 tcg_gen_mov_i32(ret, arg1);
331 } else {
332 tcg_gen_add_i32(ret, arg1, tcg_const_i32(arg2));
333 }
334 }
335
336 static inline void tcg_gen_sub_i32(TCGv ret, TCGv arg1, TCGv arg2)
337 {
338 tcg_gen_op3(INDEX_op_sub_i32, ret, arg1, arg2);
339 }
340
341 static inline void tcg_gen_subi_i32(TCGv ret, TCGv arg1, int32_t arg2)
342 {
343 /* some cases can be optimized here */
344 if (arg2 == 0) {
345 tcg_gen_mov_i32(ret, arg1);
346 } else {
347 tcg_gen_sub_i32(ret, arg1, tcg_const_i32(arg2));
348 }
349 }
350
351 static inline void tcg_gen_and_i32(TCGv ret, TCGv arg1, TCGv arg2)
352 {
353 tcg_gen_op3(INDEX_op_and_i32, ret, arg1, arg2);
354 }
355
356 static inline void tcg_gen_andi_i32(TCGv ret, TCGv arg1, int32_t arg2)
357 {
358 /* some cases can be optimized here */
359 if (arg2 == 0) {
360 tcg_gen_movi_i32(ret, 0);
361 } else if (arg2 == 0xffffffff) {
362 tcg_gen_mov_i32(ret, arg1);
363 } else {
364 tcg_gen_and_i32(ret, arg1, tcg_const_i32(arg2));
365 }
366 }
367
368 static inline void tcg_gen_or_i32(TCGv ret, TCGv arg1, TCGv arg2)
369 {
370 tcg_gen_op3(INDEX_op_or_i32, ret, arg1, arg2);
371 }
372
373 static inline void tcg_gen_ori_i32(TCGv ret, TCGv arg1, int32_t arg2)
374 {
375 /* some cases can be optimized here */
376 if (arg2 == 0xffffffff) {
377 tcg_gen_movi_i32(ret, 0xffffffff);
378 } else if (arg2 == 0) {
379 tcg_gen_mov_i32(ret, arg1);
380 } else {
381 tcg_gen_or_i32(ret, arg1, tcg_const_i32(arg2));
382 }
383 }
384
385 static inline void tcg_gen_xor_i32(TCGv ret, TCGv arg1, TCGv arg2)
386 {
387 tcg_gen_op3(INDEX_op_xor_i32, ret, arg1, arg2);
388 }
389
390 static inline void tcg_gen_xori_i32(TCGv ret, TCGv arg1, int32_t arg2)
391 {
392 /* some cases can be optimized here */
393 if (arg2 == 0) {
394 tcg_gen_mov_i32(ret, arg1);
395 } else {
396 tcg_gen_xor_i32(ret, arg1, tcg_const_i32(arg2));
397 }
398 }
399
400 static inline void tcg_gen_shl_i32(TCGv ret, TCGv arg1, TCGv arg2)
401 {
402 tcg_gen_op3(INDEX_op_shl_i32, ret, arg1, arg2);
403 }
404
405 static inline void tcg_gen_shli_i32(TCGv ret, TCGv arg1, int32_t arg2)
406 {
407 tcg_gen_shl_i32(ret, arg1, tcg_const_i32(arg2));
408 }
409
410 static inline void tcg_gen_shr_i32(TCGv ret, TCGv arg1, TCGv arg2)
411 {
412 tcg_gen_op3(INDEX_op_shr_i32, ret, arg1, arg2);
413 }
414
415 static inline void tcg_gen_shri_i32(TCGv ret, TCGv arg1, int32_t arg2)
416 {
417 tcg_gen_shr_i32(ret, arg1, tcg_const_i32(arg2));
418 }
419
420 static inline void tcg_gen_sar_i32(TCGv ret, TCGv arg1, TCGv arg2)
421 {
422 tcg_gen_op3(INDEX_op_sar_i32, ret, arg1, arg2);
423 }
424
425 static inline void tcg_gen_sari_i32(TCGv ret, TCGv arg1, int32_t arg2)
426 {
427 tcg_gen_sar_i32(ret, arg1, tcg_const_i32(arg2));
428 }
429
430 static inline void tcg_gen_brcond_i32(int cond, TCGv arg1, TCGv arg2,
431 int label_index)
432 {
433 tcg_gen_op4ii(INDEX_op_brcond_i32, arg1, arg2, cond, label_index);
434 }
435
436 static inline void tcg_gen_mul_i32(TCGv ret, TCGv arg1, TCGv arg2)
437 {
438 tcg_gen_op3(INDEX_op_mul_i32, ret, arg1, arg2);
439 }
440
441 #ifdef TCG_TARGET_HAS_div_i32
442 static inline void tcg_gen_div_i32(TCGv ret, TCGv arg1, TCGv arg2)
443 {
444 tcg_gen_op3(INDEX_op_div_i32, ret, arg1, arg2);
445 }
446
447 static inline void tcg_gen_rem_i32(TCGv ret, TCGv arg1, TCGv arg2)
448 {
449 tcg_gen_op3(INDEX_op_rem_i32, ret, arg1, arg2);
450 }
451
452 static inline void tcg_gen_divu_i32(TCGv ret, TCGv arg1, TCGv arg2)
453 {
454 tcg_gen_op3(INDEX_op_divu_i32, ret, arg1, arg2);
455 }
456
457 static inline void tcg_gen_remu_i32(TCGv ret, TCGv arg1, TCGv arg2)
458 {
459 tcg_gen_op3(INDEX_op_remu_i32, ret, arg1, arg2);
460 }
461 #else
462 static inline void tcg_gen_div_i32(TCGv ret, TCGv arg1, TCGv arg2)
463 {
464 TCGv t0;
465 t0 = tcg_temp_new(TCG_TYPE_I32);
466 tcg_gen_sari_i32(t0, arg1, 31);
467 tcg_gen_op5(INDEX_op_div2_i32, ret, t0, arg1, t0, arg2);
468 }
469
470 static inline void tcg_gen_rem_i32(TCGv ret, TCGv arg1, TCGv arg2)
471 {
472 TCGv t0;
473 t0 = tcg_temp_new(TCG_TYPE_I32);
474 tcg_gen_sari_i32(t0, arg1, 31);
475 tcg_gen_op5(INDEX_op_div2_i32, t0, ret, arg1, t0, arg2);
476 }
477
478 static inline void tcg_gen_divu_i32(TCGv ret, TCGv arg1, TCGv arg2)
479 {
480 TCGv t0;
481 t0 = tcg_temp_new(TCG_TYPE_I32);
482 tcg_gen_movi_i32(t0, 0);
483 tcg_gen_op5(INDEX_op_divu2_i32, ret, t0, arg1, t0, arg2);
484 }
485
486 static inline void tcg_gen_remu_i32(TCGv ret, TCGv arg1, TCGv arg2)
487 {
488 TCGv t0;
489 t0 = tcg_temp_new(TCG_TYPE_I32);
490 tcg_gen_movi_i32(t0, 0);
491 tcg_gen_op5(INDEX_op_divu2_i32, t0, ret, arg1, t0, arg2);
492 }
493 #endif
494
495 #if TCG_TARGET_REG_BITS == 32
496
497 static inline void tcg_gen_mov_i64(TCGv ret, TCGv arg)
498 {
499 if (ret != arg) {
500 tcg_gen_mov_i32(ret, arg);
501 tcg_gen_mov_i32(TCGV_HIGH(ret), TCGV_HIGH(arg));
502 }
503 }
504
505 static inline void tcg_gen_movi_i64(TCGv ret, int64_t arg)
506 {
507 tcg_gen_movi_i32(ret, arg);
508 tcg_gen_movi_i32(TCGV_HIGH(ret), arg >> 32);
509 }
510
511 static inline void tcg_gen_ld8u_i64(TCGv ret, TCGv arg2, tcg_target_long offset)
512 {
513 tcg_gen_ld8u_i32(ret, arg2, offset);
514 tcg_gen_movi_i32(TCGV_HIGH(ret), 0);
515 }
516
517 static inline void tcg_gen_ld8s_i64(TCGv ret, TCGv arg2, tcg_target_long offset)
518 {
519 tcg_gen_ld8s_i32(ret, arg2, offset);
520 tcg_gen_sari_i32(TCGV_HIGH(ret), ret, 31);
521 }
522
523 static inline void tcg_gen_ld16u_i64(TCGv ret, TCGv arg2, tcg_target_long offset)
524 {
525 tcg_gen_ld16u_i32(ret, arg2, offset);
526 tcg_gen_movi_i32(TCGV_HIGH(ret), 0);
527 }
528
529 static inline void tcg_gen_ld16s_i64(TCGv ret, TCGv arg2, tcg_target_long offset)
530 {
531 tcg_gen_ld16s_i32(ret, arg2, offset);
532 tcg_gen_sari_i32(TCGV_HIGH(ret), ret, 31);
533 }
534
535 static inline void tcg_gen_ld32u_i64(TCGv ret, TCGv arg2, tcg_target_long offset)
536 {
537 tcg_gen_ld_i32(ret, arg2, offset);
538 tcg_gen_movi_i32(TCGV_HIGH(ret), 0);
539 }
540
541 static inline void tcg_gen_ld32s_i64(TCGv ret, TCGv arg2, tcg_target_long offset)
542 {
543 tcg_gen_ld_i32(ret, arg2, offset);
544 tcg_gen_sari_i32(TCGV_HIGH(ret), ret, 31);
545 }
546
547 static inline void tcg_gen_ld_i64(TCGv ret, TCGv arg2, tcg_target_long offset)
548 {
549 /* since arg2 and ret have different types, they cannot be the
550 same temporary */
551 #ifdef TCG_TARGET_WORDS_BIGENDIAN
552 tcg_gen_ld_i32(TCGV_HIGH(ret), arg2, offset);
553 tcg_gen_ld_i32(ret, arg2, offset + 4);
554 #else
555 tcg_gen_ld_i32(ret, arg2, offset);
556 tcg_gen_ld_i32(TCGV_HIGH(ret), arg2, offset + 4);
557 #endif
558 }
559
560 static inline void tcg_gen_st8_i64(TCGv arg1, TCGv arg2, tcg_target_long offset)
561 {
562 tcg_gen_st8_i32(arg1, arg2, offset);
563 }
564
565 static inline void tcg_gen_st16_i64(TCGv arg1, TCGv arg2, tcg_target_long offset)
566 {
567 tcg_gen_st16_i32(arg1, arg2, offset);
568 }
569
570 static inline void tcg_gen_st32_i64(TCGv arg1, TCGv arg2, tcg_target_long offset)
571 {
572 tcg_gen_st_i32(arg1, arg2, offset);
573 }
574
575 static inline void tcg_gen_st_i64(TCGv arg1, TCGv arg2, tcg_target_long offset)
576 {
577 #ifdef TCG_TARGET_WORDS_BIGENDIAN
578 tcg_gen_st_i32(TCGV_HIGH(arg1), arg2, offset);
579 tcg_gen_st_i32(arg1, arg2, offset + 4);
580 #else
581 tcg_gen_st_i32(arg1, arg2, offset);
582 tcg_gen_st_i32(TCGV_HIGH(arg1), arg2, offset + 4);
583 #endif
584 }
585
586 static inline void tcg_gen_add_i64(TCGv ret, TCGv arg1, TCGv arg2)
587 {
588 tcg_gen_op6(INDEX_op_add2_i32, ret, TCGV_HIGH(ret),
589 arg1, TCGV_HIGH(arg1), arg2, TCGV_HIGH(arg2));
590 }
591
592 static inline void tcg_gen_addi_i64(TCGv ret, TCGv arg1, int64_t arg2)
593 {
594 tcg_gen_add_i64(ret, arg1, tcg_const_i64(arg2));
595 }
596
597 static inline void tcg_gen_sub_i64(TCGv ret, TCGv arg1, TCGv arg2)
598 {
599 tcg_gen_op6(INDEX_op_sub2_i32, ret, TCGV_HIGH(ret),
600 arg1, TCGV_HIGH(arg1), arg2, TCGV_HIGH(arg2));
601 }
602
603 static inline void tcg_gen_subi_i64(TCGv ret, TCGv arg1, int64_t arg2)
604 {
605 tcg_gen_sub_i64(ret, arg1, tcg_const_i64(arg2));
606 }
607
608 static inline void tcg_gen_and_i64(TCGv ret, TCGv arg1, TCGv arg2)
609 {
610 tcg_gen_and_i32(ret, arg1, arg2);
611 tcg_gen_and_i32(TCGV_HIGH(ret), TCGV_HIGH(arg1), TCGV_HIGH(arg2));
612 }
613
614 static inline void tcg_gen_andi_i64(TCGv ret, TCGv arg1, int64_t arg2)
615 {
616 tcg_gen_andi_i32(ret, arg1, arg2);
617 tcg_gen_andi_i32(TCGV_HIGH(ret), TCGV_HIGH(arg1), arg2 >> 32);
618 }
619
620 static inline void tcg_gen_or_i64(TCGv ret, TCGv arg1, TCGv arg2)
621 {
622 tcg_gen_or_i32(ret, arg1, arg2);
623 tcg_gen_or_i32(TCGV_HIGH(ret), TCGV_HIGH(arg1), TCGV_HIGH(arg2));
624 }
625
626 static inline void tcg_gen_ori_i64(TCGv ret, TCGv arg1, int64_t arg2)
627 {
628 tcg_gen_ori_i32(ret, arg1, arg2);
629 tcg_gen_ori_i32(TCGV_HIGH(ret), TCGV_HIGH(arg1), arg2 >> 32);
630 }
631
632 static inline void tcg_gen_xor_i64(TCGv ret, TCGv arg1, TCGv arg2)
633 {
634 tcg_gen_xor_i32(ret, arg1, arg2);
635 tcg_gen_xor_i32(TCGV_HIGH(ret), TCGV_HIGH(arg1), TCGV_HIGH(arg2));
636 }
637
638 static inline void tcg_gen_xori_i64(TCGv ret, TCGv arg1, int64_t arg2)
639 {
640 tcg_gen_xori_i32(ret, arg1, arg2);
641 tcg_gen_xori_i32(TCGV_HIGH(ret), TCGV_HIGH(arg1), arg2 >> 32);
642 }
643
644 /* XXX: use generic code when basic block handling is OK or CPU
645 specific code (x86) */
646 static inline void tcg_gen_shl_i64(TCGv ret, TCGv arg1, TCGv arg2)
647 {
648 tcg_gen_helper_1_2(tcg_helper_shl_i64, ret, arg1, arg2);
649 }
650
651 static inline void tcg_gen_shli_i64(TCGv ret, TCGv arg1, int64_t arg2)
652 {
653 tcg_gen_shifti_i64(ret, arg1, arg2, 0, 0);
654 }
655
656 static inline void tcg_gen_shr_i64(TCGv ret, TCGv arg1, TCGv arg2)
657 {
658 tcg_gen_helper_1_2(tcg_helper_shr_i64, ret, arg1, arg2);
659 }
660
661 static inline void tcg_gen_shri_i64(TCGv ret, TCGv arg1, int64_t arg2)
662 {
663 tcg_gen_shifti_i64(ret, arg1, arg2, 1, 0);
664 }
665
666 static inline void tcg_gen_sar_i64(TCGv ret, TCGv arg1, TCGv arg2)
667 {
668 tcg_gen_helper_1_2(tcg_helper_sar_i64, ret, arg1, arg2);
669 }
670
671 static inline void tcg_gen_sari_i64(TCGv ret, TCGv arg1, int64_t arg2)
672 {
673 tcg_gen_shifti_i64(ret, arg1, arg2, 1, 1);
674 }
675
676 static inline void tcg_gen_brcond_i64(int cond, TCGv arg1, TCGv arg2,
677 int label_index)
678 {
679 tcg_gen_op6ii(INDEX_op_brcond2_i32,
680 arg1, TCGV_HIGH(arg1), arg2, TCGV_HIGH(arg2),
681 cond, label_index);
682 }
683
684 static inline void tcg_gen_mul_i64(TCGv ret, TCGv arg1, TCGv arg2)
685 {
686 TCGv t0, t1;
687
688 t0 = tcg_temp_new(TCG_TYPE_I64);
689 t1 = tcg_temp_new(TCG_TYPE_I32);
690
691 tcg_gen_op4(INDEX_op_mulu2_i32, t0, TCGV_HIGH(t0), arg1, arg2);
692
693 tcg_gen_mul_i32(t1, arg1, TCGV_HIGH(arg2));
694 tcg_gen_add_i32(TCGV_HIGH(t0), TCGV_HIGH(t0), t1);
695 tcg_gen_mul_i32(t1, TCGV_HIGH(arg1), arg2);
696 tcg_gen_add_i32(TCGV_HIGH(t0), TCGV_HIGH(t0), t1);
697
698 tcg_gen_mov_i64(ret, t0);
699 }
700
701 static inline void tcg_gen_div_i64(TCGv ret, TCGv arg1, TCGv arg2)
702 {
703 tcg_gen_helper_1_2(tcg_helper_div_i64, ret, arg1, arg2);
704 }
705
706 static inline void tcg_gen_rem_i64(TCGv ret, TCGv arg1, TCGv arg2)
707 {
708 tcg_gen_helper_1_2(tcg_helper_rem_i64, ret, arg1, arg2);
709 }
710
711 static inline void tcg_gen_divu_i64(TCGv ret, TCGv arg1, TCGv arg2)
712 {
713 tcg_gen_helper_1_2(tcg_helper_divu_i64, ret, arg1, arg2);
714 }
715
716 static inline void tcg_gen_remu_i64(TCGv ret, TCGv arg1, TCGv arg2)
717 {
718 tcg_gen_helper_1_2(tcg_helper_remu_i64, ret, arg1, arg2);
719 }
720
721 #else
722
723 static inline void tcg_gen_mov_i64(TCGv ret, TCGv arg)
724 {
725 if (ret != arg)
726 tcg_gen_op2(INDEX_op_mov_i64, ret, arg);
727 }
728
729 static inline void tcg_gen_movi_i64(TCGv ret, int64_t arg)
730 {
731 tcg_gen_op2i(INDEX_op_movi_i64, ret, arg);
732 }
733
734 static inline void tcg_gen_ld8u_i64(TCGv ret, TCGv arg2,
735 tcg_target_long offset)
736 {
737 tcg_gen_op3i(INDEX_op_ld8u_i64, ret, arg2, offset);
738 }
739
740 static inline void tcg_gen_ld8s_i64(TCGv ret, TCGv arg2,
741 tcg_target_long offset)
742 {
743 tcg_gen_op3i(INDEX_op_ld8s_i64, ret, arg2, offset);
744 }
745
746 static inline void tcg_gen_ld16u_i64(TCGv ret, TCGv arg2,
747 tcg_target_long offset)
748 {
749 tcg_gen_op3i(INDEX_op_ld16u_i64, ret, arg2, offset);
750 }
751
752 static inline void tcg_gen_ld16s_i64(TCGv ret, TCGv arg2,
753 tcg_target_long offset)
754 {
755 tcg_gen_op3i(INDEX_op_ld16s_i64, ret, arg2, offset);
756 }
757
758 static inline void tcg_gen_ld32u_i64(TCGv ret, TCGv arg2,
759 tcg_target_long offset)
760 {
761 tcg_gen_op3i(INDEX_op_ld32u_i64, ret, arg2, offset);
762 }
763
764 static inline void tcg_gen_ld32s_i64(TCGv ret, TCGv arg2,
765 tcg_target_long offset)
766 {
767 tcg_gen_op3i(INDEX_op_ld32s_i64, ret, arg2, offset);
768 }
769
770 static inline void tcg_gen_ld_i64(TCGv ret, TCGv arg2, tcg_target_long offset)
771 {
772 tcg_gen_op3i(INDEX_op_ld_i64, ret, arg2, offset);
773 }
774
775 static inline void tcg_gen_st8_i64(TCGv arg1, TCGv arg2,
776 tcg_target_long offset)
777 {
778 tcg_gen_op3i(INDEX_op_st8_i64, arg1, arg2, offset);
779 }
780
781 static inline void tcg_gen_st16_i64(TCGv arg1, TCGv arg2,
782 tcg_target_long offset)
783 {
784 tcg_gen_op3i(INDEX_op_st16_i64, arg1, arg2, offset);
785 }
786
787 static inline void tcg_gen_st32_i64(TCGv arg1, TCGv arg2,
788 tcg_target_long offset)
789 {
790 tcg_gen_op3i(INDEX_op_st32_i64, arg1, arg2, offset);
791 }
792
793 static inline void tcg_gen_st_i64(TCGv arg1, TCGv arg2, tcg_target_long offset)
794 {
795 tcg_gen_op3i(INDEX_op_st_i64, arg1, arg2, offset);
796 }
797
798 static inline void tcg_gen_add_i64(TCGv ret, TCGv arg1, TCGv arg2)
799 {
800 tcg_gen_op3(INDEX_op_add_i64, ret, arg1, arg2);
801 }
802
803 static inline void tcg_gen_addi_i64(TCGv ret, TCGv arg1, int64_t arg2)
804 {
805 tcg_gen_add_i64(ret, arg1, tcg_const_i64(arg2));
806 }
807
808 static inline void tcg_gen_sub_i64(TCGv ret, TCGv arg1, TCGv arg2)
809 {
810 tcg_gen_op3(INDEX_op_sub_i64, ret, arg1, arg2);
811 }
812
813 static inline void tcg_gen_subi_i64(TCGv ret, TCGv arg1, int64_t arg2)
814 {
815 tcg_gen_sub_i64(ret, arg1, tcg_const_i64(arg2));
816 }
817
818 static inline void tcg_gen_and_i64(TCGv ret, TCGv arg1, TCGv arg2)
819 {
820 tcg_gen_op3(INDEX_op_and_i64, ret, arg1, arg2);
821 }
822
823 static inline void tcg_gen_andi_i64(TCGv ret, TCGv arg1, int64_t arg2)
824 {
825 tcg_gen_and_i64(ret, arg1, tcg_const_i64(arg2));
826 }
827
828 static inline void tcg_gen_or_i64(TCGv ret, TCGv arg1, TCGv arg2)
829 {
830 tcg_gen_op3(INDEX_op_or_i64, ret, arg1, arg2);
831 }
832
833 static inline void tcg_gen_ori_i64(TCGv ret, TCGv arg1, int64_t arg2)
834 {
835 tcg_gen_or_i64(ret, arg1, tcg_const_i64(arg2));
836 }
837
838 static inline void tcg_gen_xor_i64(TCGv ret, TCGv arg1, TCGv arg2)
839 {
840 tcg_gen_op3(INDEX_op_xor_i64, ret, arg1, arg2);
841 }
842
843 static inline void tcg_gen_xori_i64(TCGv ret, TCGv arg1, int64_t arg2)
844 {
845 tcg_gen_xor_i64(ret, arg1, tcg_const_i64(arg2));
846 }
847
848 static inline void tcg_gen_shl_i64(TCGv ret, TCGv arg1, TCGv arg2)
849 {
850 tcg_gen_op3(INDEX_op_shl_i64, ret, arg1, arg2);
851 }
852
853 static inline void tcg_gen_shli_i64(TCGv ret, TCGv arg1, int64_t arg2)
854 {
855 tcg_gen_shl_i64(ret, arg1, tcg_const_i64(arg2));
856 }
857
858 static inline void tcg_gen_shr_i64(TCGv ret, TCGv arg1, TCGv arg2)
859 {
860 tcg_gen_op3(INDEX_op_shr_i64, ret, arg1, arg2);
861 }
862
863 static inline void tcg_gen_shri_i64(TCGv ret, TCGv arg1, int64_t arg2)
864 {
865 tcg_gen_shr_i64(ret, arg1, tcg_const_i64(arg2));
866 }
867
868 static inline void tcg_gen_sar_i64(TCGv ret, TCGv arg1, TCGv arg2)
869 {
870 tcg_gen_op3(INDEX_op_sar_i64, ret, arg1, arg2);
871 }
872
873 static inline void tcg_gen_sari_i64(TCGv ret, TCGv arg1, int64_t arg2)
874 {
875 tcg_gen_sar_i64(ret, arg1, tcg_const_i64(arg2));
876 }
877
878 static inline void tcg_gen_brcond_i64(int cond, TCGv arg1, TCGv arg2,
879 int label_index)
880 {
881 tcg_gen_op4ii(INDEX_op_brcond_i64, arg1, arg2, cond, label_index);
882 }
883
884 static inline void tcg_gen_mul_i64(TCGv ret, TCGv arg1, TCGv arg2)
885 {
886 tcg_gen_op3(INDEX_op_mul_i64, ret, arg1, arg2);
887 }
888
889 #ifdef TCG_TARGET_HAS_div_i64
890 static inline void tcg_gen_div_i64(TCGv ret, TCGv arg1, TCGv arg2)
891 {
892 tcg_gen_op3(INDEX_op_div_i64, ret, arg1, arg2);
893 }
894
895 static inline void tcg_gen_rem_i64(TCGv ret, TCGv arg1, TCGv arg2)
896 {
897 tcg_gen_op3(INDEX_op_rem_i64, ret, arg1, arg2);
898 }
899
900 static inline void tcg_gen_divu_i64(TCGv ret, TCGv arg1, TCGv arg2)
901 {
902 tcg_gen_op3(INDEX_op_divu_i64, ret, arg1, arg2);
903 }
904
905 static inline void tcg_gen_remu_i64(TCGv ret, TCGv arg1, TCGv arg2)
906 {
907 tcg_gen_op3(INDEX_op_remu_i64, ret, arg1, arg2);
908 }
909 #else
910 static inline void tcg_gen_div_i64(TCGv ret, TCGv arg1, TCGv arg2)
911 {
912 TCGv t0;
913 t0 = tcg_temp_new(TCG_TYPE_I64);
914 tcg_gen_sari_i64(t0, arg1, 63);
915 tcg_gen_op5(INDEX_op_div2_i64, ret, t0, arg1, t0, arg2);
916 }
917
918 static inline void tcg_gen_rem_i64(TCGv ret, TCGv arg1, TCGv arg2)
919 {
920 TCGv t0;
921 t0 = tcg_temp_new(TCG_TYPE_I64);
922 tcg_gen_sari_i64(t0, arg1, 63);
923 tcg_gen_op5(INDEX_op_div2_i64, t0, ret, arg1, t0, arg2);
924 }
925
926 static inline void tcg_gen_divu_i64(TCGv ret, TCGv arg1, TCGv arg2)
927 {
928 TCGv t0;
929 t0 = tcg_temp_new(TCG_TYPE_I64);
930 tcg_gen_movi_i64(t0, 0);
931 tcg_gen_op5(INDEX_op_divu2_i64, ret, t0, arg1, t0, arg2);
932 }
933
934 static inline void tcg_gen_remu_i64(TCGv ret, TCGv arg1, TCGv arg2)
935 {
936 TCGv t0;
937 t0 = tcg_temp_new(TCG_TYPE_I64);
938 tcg_gen_movi_i64(t0, 0);
939 tcg_gen_op5(INDEX_op_divu2_i64, t0, ret, arg1, t0, arg2);
940 }
941 #endif
942
943 #endif
944
945 /***************************************/
946 /* optional operations */
947
948 static inline void tcg_gen_ext8s_i32(TCGv ret, TCGv arg)
949 {
950 #ifdef TCG_TARGET_HAS_ext8s_i32
951 tcg_gen_op2(INDEX_op_ext8s_i32, ret, arg);
952 #else
953 tcg_gen_shli_i32(ret, arg, 24);
954 tcg_gen_sari_i32(ret, ret, 24);
955 #endif
956 }
957
958 static inline void tcg_gen_ext16s_i32(TCGv ret, TCGv arg)
959 {
960 #ifdef TCG_TARGET_HAS_ext16s_i32
961 tcg_gen_op2(INDEX_op_ext16s_i32, ret, arg);
962 #else
963 tcg_gen_shli_i32(ret, arg, 16);
964 tcg_gen_sari_i32(ret, ret, 16);
965 #endif
966 }
967
968 /* Note: we assume the two high bytes are set to zero */
969 static inline void tcg_gen_bswap16_i32(TCGv ret, TCGv arg)
970 {
971 #ifdef TCG_TARGET_HAS_bswap16_i32
972 tcg_gen_op2(INDEX_op_bswap16_i32, ret, arg);
973 #else
974 TCGv t0, t1;
975 t0 = tcg_temp_new(TCG_TYPE_I32);
976 t1 = tcg_temp_new(TCG_TYPE_I32);
977
978 tcg_gen_shri_i32(t0, arg, 8);
979 tcg_gen_andi_i32(t1, arg, 0x000000ff);
980 tcg_gen_shli_i32(t1, t1, 8);
981 tcg_gen_or_i32(ret, t0, t1);
982 #endif
983 }
984
985 static inline void tcg_gen_bswap_i32(TCGv ret, TCGv arg)
986 {
987 #ifdef TCG_TARGET_HAS_bswap_i32
988 tcg_gen_op2(INDEX_op_bswap_i32, ret, arg);
989 #else
990 TCGv t0, t1;
991 t0 = tcg_temp_new(TCG_TYPE_I32);
992 t1 = tcg_temp_new(TCG_TYPE_I32);
993
994 tcg_gen_shli_i32(t0, arg, 24);
995
996 tcg_gen_andi_i32(t1, arg, 0x0000ff00);
997 tcg_gen_shli_i32(t1, t1, 8);
998 tcg_gen_or_i32(t0, t0, t1);
999
1000 tcg_gen_shri_i32(t1, arg, 8);
1001 tcg_gen_andi_i32(t1, t1, 0x0000ff00);
1002 tcg_gen_or_i32(t0, t0, t1);
1003
1004 tcg_gen_shri_i32(t1, arg, 24);
1005 tcg_gen_or_i32(ret, t0, t1);
1006 #endif
1007 }
1008
1009 #if TCG_TARGET_REG_BITS == 32
1010 static inline void tcg_gen_ext8s_i64(TCGv ret, TCGv arg)
1011 {
1012 tcg_gen_ext8s_i32(ret, arg);
1013 tcg_gen_sari_i32(TCGV_HIGH(ret), ret, 31);
1014 }
1015
1016 static inline void tcg_gen_ext16s_i64(TCGv ret, TCGv arg)
1017 {
1018 tcg_gen_ext16s_i32(ret, arg);
1019 tcg_gen_sari_i32(TCGV_HIGH(ret), ret, 31);
1020 }
1021
1022 static inline void tcg_gen_ext32s_i64(TCGv ret, TCGv arg)
1023 {
1024 tcg_gen_mov_i32(ret, arg);
1025 tcg_gen_sari_i32(TCGV_HIGH(ret), ret, 31);
1026 }
1027
1028 static inline void tcg_gen_trunc_i64_i32(TCGv ret, TCGv arg)
1029 {
1030 tcg_gen_mov_i32(ret, arg);
1031 }
1032
1033 static inline void tcg_gen_extu_i32_i64(TCGv ret, TCGv arg)
1034 {
1035 tcg_gen_mov_i32(ret, arg);
1036 tcg_gen_movi_i32(TCGV_HIGH(ret), 0);
1037 }
1038
1039 static inline void tcg_gen_ext_i32_i64(TCGv ret, TCGv arg)
1040 {
1041 tcg_gen_mov_i32(ret, arg);
1042 tcg_gen_sari_i32(TCGV_HIGH(ret), ret, 31);
1043 }
1044
1045 static inline void tcg_gen_bswap_i64(TCGv ret, TCGv arg)
1046 {
1047 TCGv t0, t1;
1048 t0 = tcg_temp_new(TCG_TYPE_I32);
1049 t1 = tcg_temp_new(TCG_TYPE_I32);
1050
1051 tcg_gen_bswap_i32(t0, arg);
1052 tcg_gen_bswap_i32(t1, TCGV_HIGH(arg));
1053 tcg_gen_mov_i32(ret, t1);
1054 tcg_gen_mov_i32(TCGV_HIGH(ret), t0);
1055 }
1056 #else
1057
1058 static inline void tcg_gen_ext8s_i64(TCGv ret, TCGv arg)
1059 {
1060 #ifdef TCG_TARGET_HAS_ext8s_i64
1061 tcg_gen_op2(INDEX_op_ext8s_i64, ret, arg);
1062 #else
1063 tcg_gen_shli_i64(ret, arg, 56);
1064 tcg_gen_sari_i64(ret, ret, 56);
1065 #endif
1066 }
1067
1068 static inline void tcg_gen_ext16s_i64(TCGv ret, TCGv arg)
1069 {
1070 #ifdef TCG_TARGET_HAS_ext16s_i64
1071 tcg_gen_op2(INDEX_op_ext16s_i64, ret, arg);
1072 #else
1073 tcg_gen_shli_i64(ret, arg, 48);
1074 tcg_gen_sari_i64(ret, ret, 48);
1075 #endif
1076 }
1077
1078 static inline void tcg_gen_ext32s_i64(TCGv ret, TCGv arg)
1079 {
1080 #ifdef TCG_TARGET_HAS_ext32s_i64
1081 tcg_gen_op2(INDEX_op_ext32s_i64, ret, arg);
1082 #else
1083 tcg_gen_shli_i64(ret, arg, 32);
1084 tcg_gen_sari_i64(ret, ret, 32);
1085 #endif
1086 }
1087
1088 /* Note: we assume the target supports move between 32 and 64 bit
1089 registers. This will probably break MIPS64 targets. */
1090 static inline void tcg_gen_trunc_i64_i32(TCGv ret, TCGv arg)
1091 {
1092 tcg_gen_mov_i32(ret, arg);
1093 }
1094
1095 /* Note: we assume the target supports move between 32 and 64 bit
1096 registers */
1097 static inline void tcg_gen_extu_i32_i64(TCGv ret, TCGv arg)
1098 {
1099 tcg_gen_andi_i64(ret, arg, 0xffffffff);
1100 }
1101
1102 /* Note: we assume the target supports move between 32 and 64 bit
1103 registers */
1104 static inline void tcg_gen_ext_i32_i64(TCGv ret, TCGv arg)
1105 {
1106 tcg_gen_ext32s_i64(ret, arg);
1107 }
1108
1109 static inline void tcg_gen_bswap_i64(TCGv ret, TCGv arg)
1110 {
1111 #ifdef TCG_TARGET_HAS_bswap_i64
1112 tcg_gen_op2(INDEX_op_bswap_i64, ret, arg);
1113 #else
1114 TCGv t0, t1;
1115 t0 = tcg_temp_new(TCG_TYPE_I32);
1116 t1 = tcg_temp_new(TCG_TYPE_I32);
1117
1118 tcg_gen_shli_i64(t0, arg, 56);
1119
1120 tcg_gen_andi_i64(t1, arg, 0x0000ff00);
1121 tcg_gen_shli_i64(t1, t1, 40);
1122 tcg_gen_or_i64(t0, t0, t1);
1123
1124 tcg_gen_andi_i64(t1, arg, 0x00ff0000);
1125 tcg_gen_shli_i64(t1, t1, 24);
1126 tcg_gen_or_i64(t0, t0, t1);
1127
1128 tcg_gen_andi_i64(t1, arg, 0xff000000);
1129 tcg_gen_shli_i64(t1, t1, 8);
1130 tcg_gen_or_i64(t0, t0, t1);
1131
1132 tcg_gen_shri_i64(t1, arg, 8);
1133 tcg_gen_andi_i64(t1, t1, 0xff000000);
1134 tcg_gen_or_i64(t0, t0, t1);
1135
1136 tcg_gen_shri_i64(t1, arg, 24);
1137 tcg_gen_andi_i64(t1, t1, 0x00ff0000);
1138 tcg_gen_or_i64(t0, t0, t1);
1139
1140 tcg_gen_shri_i64(t1, arg, 40);
1141 tcg_gen_andi_i64(t1, t1, 0x0000ff00);
1142 tcg_gen_or_i64(t0, t0, t1);
1143
1144 tcg_gen_shri_i64(t1, arg, 56);
1145 tcg_gen_or_i64(ret, t0, t1);
1146 #endif
1147 }
1148
1149 #endif
1150
1151
1152 static inline void tcg_gen_discard_i32(TCGv arg)
1153 {
1154 tcg_gen_op1(INDEX_op_discard, arg);
1155 }
1156
1157 #if TCG_TARGET_REG_BITS == 32
1158 static inline void tcg_gen_discard_i64(TCGv arg)
1159 {
1160 tcg_gen_discard_i32(arg);
1161 tcg_gen_discard_i32(TCGV_HIGH(arg));
1162 }
1163 #else
1164 static inline void tcg_gen_discard_i64(TCGv arg)
1165 {
1166 tcg_gen_op1(INDEX_op_discard, arg);
1167 }
1168 #endif
1169
1170 /***************************************/
1171 static inline void tcg_gen_macro_2(TCGv ret0, TCGv ret1, int macro_id)
1172 {
1173 tcg_gen_op3i(INDEX_op_macro_2, ret0, ret1, macro_id);
1174 }
1175
1176 /***************************************/
1177 /* QEMU specific operations. Their type depend on the QEMU CPU
1178 type. */
1179 #ifndef TARGET_LONG_BITS
1180 #error must include QEMU headers
1181 #endif
1182
1183 static inline void tcg_gen_exit_tb(tcg_target_long val)
1184 {
1185 tcg_gen_op1i(INDEX_op_exit_tb, val);
1186 }
1187
1188 static inline void tcg_gen_goto_tb(int idx)
1189 {
1190 tcg_gen_op1i(INDEX_op_goto_tb, idx);
1191 }
1192
1193 #if TCG_TARGET_REG_BITS == 32
1194 static inline void tcg_gen_qemu_ld8u(TCGv ret, TCGv addr, int mem_index)
1195 {
1196 #if TARGET_LONG_BITS == 32
1197 tcg_gen_op3i(INDEX_op_qemu_ld8u, ret, addr, mem_index);
1198 #else
1199 tcg_gen_op4i(INDEX_op_qemu_ld8u, ret, addr, TCGV_HIGH(addr), mem_index);
1200 tcg_gen_movi_i32(TCGV_HIGH(ret), 0);
1201 #endif
1202 }
1203
1204 static inline void tcg_gen_qemu_ld8s(TCGv ret, TCGv addr, int mem_index)
1205 {
1206 #if TARGET_LONG_BITS == 32
1207 tcg_gen_op3i(INDEX_op_qemu_ld8s, ret, addr, mem_index);
1208 #else
1209 tcg_gen_op4i(INDEX_op_qemu_ld8s, ret, addr, TCGV_HIGH(addr), mem_index);
1210 tcg_gen_sari_i32(TCGV_HIGH(ret), ret, 31);
1211 #endif
1212 }
1213
1214 static inline void tcg_gen_qemu_ld16u(TCGv ret, TCGv addr, int mem_index)
1215 {
1216 #if TARGET_LONG_BITS == 32
1217 tcg_gen_op3i(INDEX_op_qemu_ld16u, ret, addr, mem_index);
1218 #else
1219 tcg_gen_op4i(INDEX_op_qemu_ld16u, ret, addr, TCGV_HIGH(addr), mem_index);
1220 tcg_gen_movi_i32(TCGV_HIGH(ret), 0);
1221 #endif
1222 }
1223
1224 static inline void tcg_gen_qemu_ld16s(TCGv ret, TCGv addr, int mem_index)
1225 {
1226 #if TARGET_LONG_BITS == 32
1227 tcg_gen_op3i(INDEX_op_qemu_ld16s, ret, addr, mem_index);
1228 #else
1229 tcg_gen_op4i(INDEX_op_qemu_ld16s, ret, addr, TCGV_HIGH(addr), mem_index);
1230 tcg_gen_sari_i32(TCGV_HIGH(ret), ret, 31);
1231 #endif
1232 }
1233
1234 static inline void tcg_gen_qemu_ld32u(TCGv ret, TCGv addr, int mem_index)
1235 {
1236 #if TARGET_LONG_BITS == 32
1237 tcg_gen_op3i(INDEX_op_qemu_ld32u, ret, addr, mem_index);
1238 #else
1239 tcg_gen_op4i(INDEX_op_qemu_ld32u, ret, addr, TCGV_HIGH(addr), mem_index);
1240 tcg_gen_movi_i32(TCGV_HIGH(ret), 0);
1241 #endif
1242 }
1243
1244 static inline void tcg_gen_qemu_ld32s(TCGv ret, TCGv addr, int mem_index)
1245 {
1246 #if TARGET_LONG_BITS == 32
1247 tcg_gen_op3i(INDEX_op_qemu_ld32u, ret, addr, mem_index);
1248 #else
1249 tcg_gen_op4i(INDEX_op_qemu_ld32u, ret, addr, TCGV_HIGH(addr), mem_index);
1250 tcg_gen_sari_i32(TCGV_HIGH(ret), ret, 31);
1251 #endif
1252 }
1253
1254 static inline void tcg_gen_qemu_ld64(TCGv ret, TCGv addr, int mem_index)
1255 {
1256 #if TARGET_LONG_BITS == 32
1257 tcg_gen_op4i(INDEX_op_qemu_ld64, ret, TCGV_HIGH(ret), addr, mem_index);
1258 #else
1259 tcg_gen_op5i(INDEX_op_qemu_ld64, ret, TCGV_HIGH(ret),
1260 addr, TCGV_HIGH(addr), mem_index);
1261 #endif
1262 }
1263
1264 static inline void tcg_gen_qemu_st8(TCGv arg, TCGv addr, int mem_index)
1265 {
1266 #if TARGET_LONG_BITS == 32
1267 tcg_gen_op3i(INDEX_op_qemu_st8, arg, addr, mem_index);
1268 #else
1269 tcg_gen_op4i(INDEX_op_qemu_st8, arg, addr, TCGV_HIGH(addr), mem_index);
1270 #endif
1271 }
1272
1273 static inline void tcg_gen_qemu_st16(TCGv arg, TCGv addr, int mem_index)
1274 {
1275 #if TARGET_LONG_BITS == 32
1276 tcg_gen_op3i(INDEX_op_qemu_st16, arg, addr, mem_index);
1277 #else
1278 tcg_gen_op4i(INDEX_op_qemu_st16, arg, addr, TCGV_HIGH(addr), mem_index);
1279 #endif
1280 }
1281
1282 static inline void tcg_gen_qemu_st32(TCGv arg, TCGv addr, int mem_index)
1283 {
1284 #if TARGET_LONG_BITS == 32
1285 tcg_gen_op3i(INDEX_op_qemu_st32, arg, addr, mem_index);
1286 #else
1287 tcg_gen_op4i(INDEX_op_qemu_st32, arg, addr, TCGV_HIGH(addr), mem_index);
1288 #endif
1289 }
1290
1291 static inline void tcg_gen_qemu_st64(TCGv arg, TCGv addr, int mem_index)
1292 {
1293 #if TARGET_LONG_BITS == 32
1294 tcg_gen_op4i(INDEX_op_qemu_st64, arg, TCGV_HIGH(arg), addr, mem_index);
1295 #else
1296 tcg_gen_op5i(INDEX_op_qemu_st64, arg, TCGV_HIGH(arg),
1297 addr, TCGV_HIGH(addr), mem_index);
1298 #endif
1299 }
1300
1301 #define tcg_gen_ld_ptr tcg_gen_ld_i32
1302 #define tcg_gen_discard_ptr tcg_gen_discard_i32
1303
1304 #else /* TCG_TARGET_REG_BITS == 32 */
1305
1306 static inline void tcg_gen_qemu_ld8u(TCGv ret, TCGv addr, int mem_index)
1307 {
1308 tcg_gen_op3i(INDEX_op_qemu_ld8u, ret, addr, mem_index);
1309 }
1310
1311 static inline void tcg_gen_qemu_ld8s(TCGv ret, TCGv addr, int mem_index)
1312 {
1313 tcg_gen_op3i(INDEX_op_qemu_ld8s, ret, addr, mem_index);
1314 }
1315
1316 static inline void tcg_gen_qemu_ld16u(TCGv ret, TCGv addr, int mem_index)
1317 {
1318 tcg_gen_op3i(INDEX_op_qemu_ld16u, ret, addr, mem_index);
1319 }
1320
1321 static inline void tcg_gen_qemu_ld16s(TCGv ret, TCGv addr, int mem_index)
1322 {
1323 tcg_gen_op3i(INDEX_op_qemu_ld16s, ret, addr, mem_index);
1324 }
1325
1326 static inline void tcg_gen_qemu_ld32u(TCGv ret, TCGv addr, int mem_index)
1327 {
1328 tcg_gen_op3i(INDEX_op_qemu_ld32u, ret, addr, mem_index);
1329 }
1330
1331 static inline void tcg_gen_qemu_ld32s(TCGv ret, TCGv addr, int mem_index)
1332 {
1333 tcg_gen_op3i(INDEX_op_qemu_ld32s, ret, addr, mem_index);
1334 }
1335
1336 static inline void tcg_gen_qemu_ld64(TCGv ret, TCGv addr, int mem_index)
1337 {
1338 tcg_gen_op3i(INDEX_op_qemu_ld64, ret, addr, mem_index);
1339 }
1340
1341 static inline void tcg_gen_qemu_st8(TCGv arg, TCGv addr, int mem_index)
1342 {
1343 tcg_gen_op3i(INDEX_op_qemu_st8, arg, addr, mem_index);
1344 }
1345
1346 static inline void tcg_gen_qemu_st16(TCGv arg, TCGv addr, int mem_index)
1347 {
1348 tcg_gen_op3i(INDEX_op_qemu_st16, arg, addr, mem_index);
1349 }
1350
1351 static inline void tcg_gen_qemu_st32(TCGv arg, TCGv addr, int mem_index)
1352 {
1353 tcg_gen_op3i(INDEX_op_qemu_st32, arg, addr, mem_index);
1354 }
1355
1356 static inline void tcg_gen_qemu_st64(TCGv arg, TCGv addr, int mem_index)
1357 {
1358 tcg_gen_op3i(INDEX_op_qemu_st64, arg, addr, mem_index);
1359 }
1360
1361 #define tcg_gen_ld_ptr tcg_gen_ld_i64
1362 #define tcg_gen_discard_ptr tcg_gen_discard_i64
1363
1364 #endif /* TCG_TARGET_REG_BITS != 32 */
1365
1366 #if TARGET_LONG_BITS == 64
1367 #define TCG_TYPE_TL TCG_TYPE_I64
1368 #define tcg_gen_movi_tl tcg_gen_movi_i64
1369 #define tcg_gen_mov_tl tcg_gen_mov_i64
1370 #define tcg_gen_ld8u_tl tcg_gen_ld8u_i64
1371 #define tcg_gen_ld8s_tl tcg_gen_ld8s_i64
1372 #define tcg_gen_ld16u_tl tcg_gen_ld16u_i64
1373 #define tcg_gen_ld16s_tl tcg_gen_ld16s_i64
1374 #define tcg_gen_ld32u_tl tcg_gen_ld32u_i64
1375 #define tcg_gen_ld32s_tl tcg_gen_ld32s_i64
1376 #define tcg_gen_ld_tl tcg_gen_ld_i64
1377 #define tcg_gen_st8_tl tcg_gen_st8_i64
1378 #define tcg_gen_st16_tl tcg_gen_st16_i64
1379 #define tcg_gen_st32_tl tcg_gen_st32_i64
1380 #define tcg_gen_st_tl tcg_gen_st_i64
1381 #define tcg_gen_add_tl tcg_gen_add_i64
1382 #define tcg_gen_addi_tl tcg_gen_addi_i64
1383 #define tcg_gen_sub_tl tcg_gen_sub_i64
1384 #define tcg_gen_subi_tl tcg_gen_subi_i64
1385 #define tcg_gen_and_tl tcg_gen_and_i64
1386 #define tcg_gen_andi_tl tcg_gen_andi_i64
1387 #define tcg_gen_or_tl tcg_gen_or_i64
1388 #define tcg_gen_ori_tl tcg_gen_ori_i64
1389 #define tcg_gen_xor_tl tcg_gen_xor_i64
1390 #define tcg_gen_xori_tl tcg_gen_xori_i64
1391 #define tcg_gen_shl_tl tcg_gen_shl_i64
1392 #define tcg_gen_shli_tl tcg_gen_shli_i64
1393 #define tcg_gen_shr_tl tcg_gen_shr_i64
1394 #define tcg_gen_shri_tl tcg_gen_shri_i64
1395 #define tcg_gen_sar_tl tcg_gen_sar_i64
1396 #define tcg_gen_sari_tl tcg_gen_sari_i64
1397 #define tcg_gen_brcond_tl tcg_gen_brcond_i64
1398 #define tcg_gen_discard_tl tcg_gen_discard_i64
1399 #define tcg_gen_trunc_tl_i32 tcg_gen_trunc_i64_i32
1400 #define tcg_gen_trunc_i64_tl tcg_gen_mov_i64
1401 #define tcg_gen_extu_i32_tl tcg_gen_extu_i32_i64
1402 #define tcg_gen_ext_i32_tl tcg_gen_ext_i32_i64
1403 #define tcg_gen_extu_tl_i64 tcg_gen_mov_i64
1404 #define tcg_gen_ext_tl_i64 tcg_gen_mov_i64
1405 #define tcg_const_tl tcg_const_i64
1406 #else
1407 #define TCG_TYPE_TL TCG_TYPE_I32
1408 #define tcg_gen_movi_tl tcg_gen_movi_i32
1409 #define tcg_gen_mov_tl tcg_gen_mov_i32
1410 #define tcg_gen_ld8u_tl tcg_gen_ld8u_i32
1411 #define tcg_gen_ld8s_tl tcg_gen_ld8s_i32
1412 #define tcg_gen_ld16u_tl tcg_gen_ld16u_i32
1413 #define tcg_gen_ld16s_tl tcg_gen_ld16s_i32
1414 #define tcg_gen_ld32u_tl tcg_gen_ld_i32
1415 #define tcg_gen_ld32s_tl tcg_gen_ld_i32
1416 #define tcg_gen_ld_tl tcg_gen_ld_i32
1417 #define tcg_gen_st8_tl tcg_gen_st8_i32
1418 #define tcg_gen_st16_tl tcg_gen_st16_i32
1419 #define tcg_gen_st32_tl tcg_gen_st_i32
1420 #define tcg_gen_st_tl tcg_gen_st_i32
1421 #define tcg_gen_add_tl tcg_gen_add_i32
1422 #define tcg_gen_addi_tl tcg_gen_addi_i32
1423 #define tcg_gen_sub_tl tcg_gen_sub_i32
1424 #define tcg_gen_subi_tl tcg_gen_subi_i32
1425 #define tcg_gen_and_tl tcg_gen_and_i32
1426 #define tcg_gen_andi_tl tcg_gen_andi_i32
1427 #define tcg_gen_or_tl tcg_gen_or_i32
1428 #define tcg_gen_ori_tl tcg_gen_ori_i32
1429 #define tcg_gen_xor_tl tcg_gen_xor_i32
1430 #define tcg_gen_xori_tl tcg_gen_xori_i32
1431 #define tcg_gen_shl_tl tcg_gen_shl_i32
1432 #define tcg_gen_shli_tl tcg_gen_shli_i32
1433 #define tcg_gen_shr_tl tcg_gen_shr_i32
1434 #define tcg_gen_shri_tl tcg_gen_shri_i32
1435 #define tcg_gen_sar_tl tcg_gen_sar_i32
1436 #define tcg_gen_sari_tl tcg_gen_sari_i32
1437 #define tcg_gen_brcond_tl tcg_gen_brcond_i32
1438 #define tcg_gen_discard_tl tcg_gen_discard_i32
1439 #define tcg_gen_trunc_tl_i32 tcg_gen_mov_i32
1440 #define tcg_gen_trunc_i64_tl tcg_gen_trunc_i64_i32
1441 #define tcg_gen_extu_i32_tl tcg_gen_mov_i32
1442 #define tcg_gen_ext_i32_tl tcg_gen_mov_i32
1443 #define tcg_gen_extu_tl_i64 tcg_gen_extu_i32_i64
1444 #define tcg_gen_ext_tl_i64 tcg_gen_ext_i32_i64
1445 #define tcg_const_tl tcg_const_i32
1446 #endif
1447
1448 #if TCG_TARGET_REG_BITS == 32
1449 #define tcg_gen_addi_ptr tcg_gen_addi_i32
1450 #else /* TCG_TARGET_REG_BITS == 32 */
1451 #define tcg_gen_addi_ptr tcg_gen_addi_i64
1452 #endif /* TCG_TARGET_REG_BITS != 32 */
1453