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