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