|
|
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: {
1.1.1.2 root 321: if (!TCGV_EQUAL_I32(ret, arg))
1.1 root 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: {
1.1.1.2 root 439: if (TCGV_EQUAL_I32(arg1, arg2)) {
440: tcg_gen_mov_i32(ret, arg1);
441: } else {
442: tcg_gen_op3_i32(INDEX_op_and_i32, ret, arg1, arg2);
443: }
1.1 root 444: }
445:
446: static inline void tcg_gen_andi_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2)
447: {
448: /* some cases can be optimized here */
449: if (arg2 == 0) {
450: tcg_gen_movi_i32(ret, 0);
451: } else if (arg2 == 0xffffffff) {
452: tcg_gen_mov_i32(ret, arg1);
453: } else {
454: TCGv_i32 t0 = tcg_const_i32(arg2);
455: tcg_gen_and_i32(ret, arg1, t0);
456: tcg_temp_free_i32(t0);
457: }
458: }
459:
460: static inline void tcg_gen_or_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
461: {
1.1.1.2 root 462: if (TCGV_EQUAL_I32(arg1, arg2)) {
463: tcg_gen_mov_i32(ret, arg1);
464: } else {
465: tcg_gen_op3_i32(INDEX_op_or_i32, ret, arg1, arg2);
466: }
1.1 root 467: }
468:
469: static inline void tcg_gen_ori_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2)
470: {
471: /* some cases can be optimized here */
472: if (arg2 == 0xffffffff) {
473: tcg_gen_movi_i32(ret, 0xffffffff);
474: } else if (arg2 == 0) {
475: tcg_gen_mov_i32(ret, arg1);
476: } else {
477: TCGv_i32 t0 = tcg_const_i32(arg2);
478: tcg_gen_or_i32(ret, arg1, t0);
479: tcg_temp_free_i32(t0);
480: }
481: }
482:
483: static inline void tcg_gen_xor_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
484: {
1.1.1.2 root 485: if (TCGV_EQUAL_I32(arg1, arg2)) {
486: tcg_gen_movi_i32(ret, 0);
487: } else {
488: tcg_gen_op3_i32(INDEX_op_xor_i32, ret, arg1, arg2);
489: }
1.1 root 490: }
491:
492: static inline void tcg_gen_xori_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2)
493: {
494: /* some cases can be optimized here */
495: if (arg2 == 0) {
496: tcg_gen_mov_i32(ret, arg1);
497: } else {
498: TCGv_i32 t0 = tcg_const_i32(arg2);
499: tcg_gen_xor_i32(ret, arg1, t0);
500: tcg_temp_free_i32(t0);
501: }
502: }
503:
504: static inline void tcg_gen_shl_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
505: {
506: tcg_gen_op3_i32(INDEX_op_shl_i32, ret, arg1, arg2);
507: }
508:
509: static inline void tcg_gen_shli_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2)
510: {
511: if (arg2 == 0) {
512: tcg_gen_mov_i32(ret, arg1);
513: } else {
514: TCGv_i32 t0 = tcg_const_i32(arg2);
515: tcg_gen_shl_i32(ret, arg1, t0);
516: tcg_temp_free_i32(t0);
517: }
518: }
519:
520: static inline void tcg_gen_shr_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
521: {
522: tcg_gen_op3_i32(INDEX_op_shr_i32, ret, arg1, arg2);
523: }
524:
525: static inline void tcg_gen_shri_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2)
526: {
527: if (arg2 == 0) {
528: tcg_gen_mov_i32(ret, arg1);
529: } else {
530: TCGv_i32 t0 = tcg_const_i32(arg2);
531: tcg_gen_shr_i32(ret, arg1, t0);
532: tcg_temp_free_i32(t0);
533: }
534: }
535:
536: static inline void tcg_gen_sar_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
537: {
538: tcg_gen_op3_i32(INDEX_op_sar_i32, ret, arg1, arg2);
539: }
540:
541: static inline void tcg_gen_sari_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2)
542: {
543: if (arg2 == 0) {
544: tcg_gen_mov_i32(ret, arg1);
545: } else {
546: TCGv_i32 t0 = tcg_const_i32(arg2);
547: tcg_gen_sar_i32(ret, arg1, t0);
548: tcg_temp_free_i32(t0);
549: }
550: }
551:
552: static inline void tcg_gen_brcond_i32(int cond, TCGv_i32 arg1, TCGv_i32 arg2,
553: int label_index)
554: {
555: tcg_gen_op4ii_i32(INDEX_op_brcond_i32, arg1, arg2, cond, label_index);
556: }
557:
558: static inline void tcg_gen_brcondi_i32(int cond, TCGv_i32 arg1, int32_t arg2,
559: int label_index)
560: {
561: TCGv_i32 t0 = tcg_const_i32(arg2);
562: tcg_gen_brcond_i32(cond, arg1, t0, label_index);
563: tcg_temp_free_i32(t0);
564: }
565:
566: static inline void tcg_gen_mul_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
567: {
568: tcg_gen_op3_i32(INDEX_op_mul_i32, ret, arg1, arg2);
569: }
570:
571: static inline void tcg_gen_muli_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2)
572: {
573: TCGv_i32 t0 = tcg_const_i32(arg2);
574: tcg_gen_mul_i32(ret, arg1, t0);
575: tcg_temp_free_i32(t0);
576: }
577:
578: #ifdef TCG_TARGET_HAS_div_i32
579: static inline void tcg_gen_div_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
580: {
581: tcg_gen_op3_i32(INDEX_op_div_i32, ret, arg1, arg2);
582: }
583:
584: static inline void tcg_gen_rem_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
585: {
586: tcg_gen_op3_i32(INDEX_op_rem_i32, ret, arg1, arg2);
587: }
588:
589: static inline void tcg_gen_divu_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
590: {
591: tcg_gen_op3_i32(INDEX_op_divu_i32, ret, arg1, arg2);
592: }
593:
594: static inline void tcg_gen_remu_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
595: {
596: tcg_gen_op3_i32(INDEX_op_remu_i32, ret, arg1, arg2);
597: }
598: #else
599: static inline void tcg_gen_div_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
600: {
601: TCGv_i32 t0;
602: t0 = tcg_temp_new_i32();
603: tcg_gen_sari_i32(t0, arg1, 31);
604: tcg_gen_op5_i32(INDEX_op_div2_i32, ret, t0, arg1, t0, arg2);
605: tcg_temp_free_i32(t0);
606: }
607:
608: static inline void tcg_gen_rem_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
609: {
610: TCGv_i32 t0;
611: t0 = tcg_temp_new_i32();
612: tcg_gen_sari_i32(t0, arg1, 31);
613: tcg_gen_op5_i32(INDEX_op_div2_i32, t0, ret, arg1, t0, arg2);
614: tcg_temp_free_i32(t0);
615: }
616:
617: static inline void tcg_gen_divu_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
618: {
619: TCGv_i32 t0;
620: t0 = tcg_temp_new_i32();
621: tcg_gen_movi_i32(t0, 0);
622: tcg_gen_op5_i32(INDEX_op_divu2_i32, ret, t0, arg1, t0, arg2);
623: tcg_temp_free_i32(t0);
624: }
625:
626: static inline void tcg_gen_remu_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
627: {
628: TCGv_i32 t0;
629: t0 = tcg_temp_new_i32();
630: tcg_gen_movi_i32(t0, 0);
631: tcg_gen_op5_i32(INDEX_op_divu2_i32, t0, ret, arg1, t0, arg2);
632: tcg_temp_free_i32(t0);
633: }
634: #endif
635:
636: #if TCG_TARGET_REG_BITS == 32
637:
638: static inline void tcg_gen_mov_i64(TCGv_i64 ret, TCGv_i64 arg)
639: {
1.1.1.2 root 640: if (!TCGV_EQUAL_I64(ret, arg)) {
1.1 root 641: tcg_gen_mov_i32(TCGV_LOW(ret), TCGV_LOW(arg));
642: tcg_gen_mov_i32(TCGV_HIGH(ret), TCGV_HIGH(arg));
643: }
644: }
645:
646: static inline void tcg_gen_movi_i64(TCGv_i64 ret, int64_t arg)
647: {
648: tcg_gen_movi_i32(TCGV_LOW(ret), arg);
649: tcg_gen_movi_i32(TCGV_HIGH(ret), arg >> 32);
650: }
651:
652: static inline void tcg_gen_ld8u_i64(TCGv_i64 ret, TCGv_ptr arg2,
653: tcg_target_long offset)
654: {
655: tcg_gen_ld8u_i32(TCGV_LOW(ret), arg2, offset);
656: tcg_gen_movi_i32(TCGV_HIGH(ret), 0);
657: }
658:
659: static inline void tcg_gen_ld8s_i64(TCGv_i64 ret, TCGv_ptr arg2,
660: tcg_target_long offset)
661: {
662: tcg_gen_ld8s_i32(TCGV_LOW(ret), arg2, offset);
663: tcg_gen_sari_i32(TCGV_HIGH(ret), TCGV_HIGH(ret), 31);
664: }
665:
666: static inline void tcg_gen_ld16u_i64(TCGv_i64 ret, TCGv_ptr arg2,
667: tcg_target_long offset)
668: {
669: tcg_gen_ld16u_i32(TCGV_LOW(ret), arg2, offset);
670: tcg_gen_movi_i32(TCGV_HIGH(ret), 0);
671: }
672:
673: static inline void tcg_gen_ld16s_i64(TCGv_i64 ret, TCGv_ptr arg2,
674: tcg_target_long offset)
675: {
676: tcg_gen_ld16s_i32(TCGV_LOW(ret), arg2, offset);
677: tcg_gen_sari_i32(TCGV_HIGH(ret), TCGV_LOW(ret), 31);
678: }
679:
680: static inline void tcg_gen_ld32u_i64(TCGv_i64 ret, TCGv_ptr arg2,
681: tcg_target_long offset)
682: {
683: tcg_gen_ld_i32(TCGV_LOW(ret), arg2, offset);
684: tcg_gen_movi_i32(TCGV_HIGH(ret), 0);
685: }
686:
687: static inline void tcg_gen_ld32s_i64(TCGv_i64 ret, TCGv_ptr arg2,
688: tcg_target_long offset)
689: {
690: tcg_gen_ld_i32(TCGV_LOW(ret), arg2, offset);
691: tcg_gen_sari_i32(TCGV_HIGH(ret), TCGV_LOW(ret), 31);
692: }
693:
694: static inline void tcg_gen_ld_i64(TCGv_i64 ret, TCGv_ptr arg2,
695: tcg_target_long offset)
696: {
697: /* since arg2 and ret have different types, they cannot be the
698: same temporary */
699: #ifdef TCG_TARGET_WORDS_BIGENDIAN
700: tcg_gen_ld_i32(TCGV_HIGH(ret), arg2, offset);
701: tcg_gen_ld_i32(TCGV_LOW(ret), arg2, offset + 4);
702: #else
703: tcg_gen_ld_i32(TCGV_LOW(ret), arg2, offset);
704: tcg_gen_ld_i32(TCGV_HIGH(ret), arg2, offset + 4);
705: #endif
706: }
707:
708: static inline void tcg_gen_st8_i64(TCGv_i64 arg1, TCGv_ptr arg2,
709: tcg_target_long offset)
710: {
711: tcg_gen_st8_i32(TCGV_LOW(arg1), arg2, offset);
712: }
713:
714: static inline void tcg_gen_st16_i64(TCGv_i64 arg1, TCGv_ptr arg2,
715: tcg_target_long offset)
716: {
717: tcg_gen_st16_i32(TCGV_LOW(arg1), arg2, offset);
718: }
719:
720: static inline void tcg_gen_st32_i64(TCGv_i64 arg1, TCGv_ptr arg2,
721: tcg_target_long offset)
722: {
723: tcg_gen_st_i32(TCGV_LOW(arg1), arg2, offset);
724: }
725:
726: static inline void tcg_gen_st_i64(TCGv_i64 arg1, TCGv_ptr arg2,
727: tcg_target_long offset)
728: {
729: #ifdef TCG_TARGET_WORDS_BIGENDIAN
730: tcg_gen_st_i32(TCGV_HIGH(arg1), arg2, offset);
731: tcg_gen_st_i32(TCGV_LOW(arg1), arg2, offset + 4);
732: #else
733: tcg_gen_st_i32(TCGV_LOW(arg1), arg2, offset);
734: tcg_gen_st_i32(TCGV_HIGH(arg1), arg2, offset + 4);
735: #endif
736: }
737:
738: static inline void tcg_gen_add_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
739: {
740: tcg_gen_op6_i32(INDEX_op_add2_i32, TCGV_LOW(ret), TCGV_HIGH(ret),
741: TCGV_LOW(arg1), TCGV_HIGH(arg1), TCGV_LOW(arg2),
742: TCGV_HIGH(arg2));
743: }
744:
745: static inline void tcg_gen_sub_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
746: {
747: tcg_gen_op6_i32(INDEX_op_sub2_i32, TCGV_LOW(ret), TCGV_HIGH(ret),
748: TCGV_LOW(arg1), TCGV_HIGH(arg1), TCGV_LOW(arg2),
749: TCGV_HIGH(arg2));
750: }
751:
752: static inline void tcg_gen_and_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
753: {
754: tcg_gen_and_i32(TCGV_LOW(ret), TCGV_LOW(arg1), TCGV_LOW(arg2));
755: tcg_gen_and_i32(TCGV_HIGH(ret), TCGV_HIGH(arg1), TCGV_HIGH(arg2));
756: }
757:
758: static inline void tcg_gen_andi_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
759: {
760: tcg_gen_andi_i32(TCGV_LOW(ret), TCGV_LOW(arg1), arg2);
761: tcg_gen_andi_i32(TCGV_HIGH(ret), TCGV_HIGH(arg1), arg2 >> 32);
762: }
763:
764: static inline void tcg_gen_or_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
765: {
766: tcg_gen_or_i32(TCGV_LOW(ret), TCGV_LOW(arg1), TCGV_LOW(arg2));
767: tcg_gen_or_i32(TCGV_HIGH(ret), TCGV_HIGH(arg1), TCGV_HIGH(arg2));
768: }
769:
770: static inline void tcg_gen_ori_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
771: {
772: tcg_gen_ori_i32(TCGV_LOW(ret), TCGV_LOW(arg1), arg2);
773: tcg_gen_ori_i32(TCGV_HIGH(ret), TCGV_HIGH(arg1), arg2 >> 32);
774: }
775:
776: static inline void tcg_gen_xor_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
777: {
778: tcg_gen_xor_i32(TCGV_LOW(ret), TCGV_LOW(arg1), TCGV_LOW(arg2));
779: tcg_gen_xor_i32(TCGV_HIGH(ret), TCGV_HIGH(arg1), TCGV_HIGH(arg2));
780: }
781:
782: static inline void tcg_gen_xori_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
783: {
784: tcg_gen_xori_i32(TCGV_LOW(ret), TCGV_LOW(arg1), arg2);
785: tcg_gen_xori_i32(TCGV_HIGH(ret), TCGV_HIGH(arg1), arg2 >> 32);
786: }
787:
788: /* XXX: use generic code when basic block handling is OK or CPU
789: specific code (x86) */
790: static inline void tcg_gen_shl_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
791: {
792: tcg_gen_helper64(tcg_helper_shl_i64, ret, arg1, arg2);
793: }
794:
795: static inline void tcg_gen_shli_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
796: {
797: tcg_gen_shifti_i64(ret, arg1, arg2, 0, 0);
798: }
799:
800: static inline void tcg_gen_shr_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
801: {
802: tcg_gen_helper64(tcg_helper_shr_i64, ret, arg1, arg2);
803: }
804:
805: static inline void tcg_gen_shri_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
806: {
807: tcg_gen_shifti_i64(ret, arg1, arg2, 1, 0);
808: }
809:
810: static inline void tcg_gen_sar_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
811: {
812: tcg_gen_helper64(tcg_helper_sar_i64, ret, arg1, arg2);
813: }
814:
815: static inline void tcg_gen_sari_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
816: {
817: tcg_gen_shifti_i64(ret, arg1, arg2, 1, 1);
818: }
819:
820: static inline void tcg_gen_brcond_i64(int cond, TCGv_i64 arg1, TCGv_i64 arg2,
821: int label_index)
822: {
823: tcg_gen_op6ii_i32(INDEX_op_brcond2_i32,
824: TCGV_LOW(arg1), TCGV_HIGH(arg1), TCGV_LOW(arg2),
825: TCGV_HIGH(arg2), cond, label_index);
826: }
827:
828: static inline void tcg_gen_mul_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
829: {
830: TCGv_i64 t0;
831: TCGv_i32 t1;
832:
833: t0 = tcg_temp_new_i64();
834: t1 = tcg_temp_new_i32();
835:
836: tcg_gen_op4_i32(INDEX_op_mulu2_i32, TCGV_LOW(t0), TCGV_HIGH(t0),
837: TCGV_LOW(arg1), TCGV_LOW(arg2));
838:
839: tcg_gen_mul_i32(t1, TCGV_LOW(arg1), TCGV_HIGH(arg2));
840: tcg_gen_add_i32(TCGV_HIGH(t0), TCGV_HIGH(t0), t1);
841: tcg_gen_mul_i32(t1, TCGV_HIGH(arg1), TCGV_LOW(arg2));
842: tcg_gen_add_i32(TCGV_HIGH(t0), TCGV_HIGH(t0), t1);
843:
844: tcg_gen_mov_i64(ret, t0);
845: tcg_temp_free_i64(t0);
846: tcg_temp_free_i32(t1);
847: }
848:
849: static inline void tcg_gen_div_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
850: {
851: tcg_gen_helper64(tcg_helper_div_i64, ret, arg1, arg2);
852: }
853:
854: static inline void tcg_gen_rem_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
855: {
856: tcg_gen_helper64(tcg_helper_rem_i64, ret, arg1, arg2);
857: }
858:
859: static inline void tcg_gen_divu_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
860: {
861: tcg_gen_helper64(tcg_helper_divu_i64, ret, arg1, arg2);
862: }
863:
864: static inline void tcg_gen_remu_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
865: {
866: tcg_gen_helper64(tcg_helper_remu_i64, ret, arg1, arg2);
867: }
868:
869: #else
870:
871: static inline void tcg_gen_mov_i64(TCGv_i64 ret, TCGv_i64 arg)
872: {
1.1.1.2 root 873: if (!TCGV_EQUAL_I64(ret, arg))
1.1 root 874: tcg_gen_op2_i64(INDEX_op_mov_i64, ret, arg);
875: }
876:
877: static inline void tcg_gen_movi_i64(TCGv_i64 ret, int64_t arg)
878: {
879: tcg_gen_op2i_i64(INDEX_op_movi_i64, ret, arg);
880: }
881:
882: static inline void tcg_gen_ld8u_i64(TCGv_i64 ret, TCGv_i64 arg2,
883: tcg_target_long offset)
884: {
885: tcg_gen_ldst_op_i64(INDEX_op_ld8u_i64, ret, arg2, offset);
886: }
887:
888: static inline void tcg_gen_ld8s_i64(TCGv_i64 ret, TCGv_i64 arg2,
889: tcg_target_long offset)
890: {
891: tcg_gen_ldst_op_i64(INDEX_op_ld8s_i64, ret, arg2, offset);
892: }
893:
894: static inline void tcg_gen_ld16u_i64(TCGv_i64 ret, TCGv_i64 arg2,
895: tcg_target_long offset)
896: {
897: tcg_gen_ldst_op_i64(INDEX_op_ld16u_i64, ret, arg2, offset);
898: }
899:
900: static inline void tcg_gen_ld16s_i64(TCGv_i64 ret, TCGv_i64 arg2,
901: tcg_target_long offset)
902: {
903: tcg_gen_ldst_op_i64(INDEX_op_ld16s_i64, ret, arg2, offset);
904: }
905:
906: static inline void tcg_gen_ld32u_i64(TCGv_i64 ret, TCGv_i64 arg2,
907: tcg_target_long offset)
908: {
909: tcg_gen_ldst_op_i64(INDEX_op_ld32u_i64, ret, arg2, offset);
910: }
911:
912: static inline void tcg_gen_ld32s_i64(TCGv_i64 ret, TCGv_i64 arg2,
913: tcg_target_long offset)
914: {
915: tcg_gen_ldst_op_i64(INDEX_op_ld32s_i64, ret, arg2, offset);
916: }
917:
918: static inline void tcg_gen_ld_i64(TCGv_i64 ret, TCGv_i64 arg2, tcg_target_long offset)
919: {
920: tcg_gen_ldst_op_i64(INDEX_op_ld_i64, ret, arg2, offset);
921: }
922:
923: static inline void tcg_gen_st8_i64(TCGv_i64 arg1, TCGv_i64 arg2,
924: tcg_target_long offset)
925: {
926: tcg_gen_ldst_op_i64(INDEX_op_st8_i64, arg1, arg2, offset);
927: }
928:
929: static inline void tcg_gen_st16_i64(TCGv_i64 arg1, TCGv_i64 arg2,
930: tcg_target_long offset)
931: {
932: tcg_gen_ldst_op_i64(INDEX_op_st16_i64, arg1, arg2, offset);
933: }
934:
935: static inline void tcg_gen_st32_i64(TCGv_i64 arg1, TCGv_i64 arg2,
936: tcg_target_long offset)
937: {
938: tcg_gen_ldst_op_i64(INDEX_op_st32_i64, arg1, arg2, offset);
939: }
940:
941: static inline void tcg_gen_st_i64(TCGv_i64 arg1, TCGv_i64 arg2, tcg_target_long offset)
942: {
943: tcg_gen_ldst_op_i64(INDEX_op_st_i64, arg1, arg2, offset);
944: }
945:
946: static inline void tcg_gen_add_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
947: {
948: tcg_gen_op3_i64(INDEX_op_add_i64, ret, arg1, arg2);
949: }
950:
951: static inline void tcg_gen_sub_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
952: {
953: tcg_gen_op3_i64(INDEX_op_sub_i64, ret, arg1, arg2);
954: }
955:
956: static inline void tcg_gen_and_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
957: {
1.1.1.2 root 958: if (TCGV_EQUAL_I64(arg1, arg2)) {
959: tcg_gen_mov_i64(ret, arg1);
960: } else {
961: tcg_gen_op3_i64(INDEX_op_and_i64, ret, arg1, arg2);
962: }
1.1 root 963: }
964:
965: static inline void tcg_gen_andi_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
966: {
967: TCGv_i64 t0 = tcg_const_i64(arg2);
968: tcg_gen_and_i64(ret, arg1, t0);
969: tcg_temp_free_i64(t0);
970: }
971:
972: static inline void tcg_gen_or_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
973: {
1.1.1.2 root 974: if (TCGV_EQUAL_I64(arg1, arg2)) {
975: tcg_gen_mov_i64(ret, arg1);
976: } else {
977: tcg_gen_op3_i64(INDEX_op_or_i64, ret, arg1, arg2);
978: }
1.1 root 979: }
980:
981: static inline void tcg_gen_ori_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
982: {
983: TCGv_i64 t0 = tcg_const_i64(arg2);
984: tcg_gen_or_i64(ret, arg1, t0);
985: tcg_temp_free_i64(t0);
986: }
987:
988: static inline void tcg_gen_xor_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
989: {
1.1.1.2 root 990: if (TCGV_EQUAL_I64(arg1, arg2)) {
991: tcg_gen_movi_i64(ret, 0);
992: } else {
993: tcg_gen_op3_i64(INDEX_op_xor_i64, ret, arg1, arg2);
994: }
1.1 root 995: }
996:
997: static inline void tcg_gen_xori_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
998: {
999: TCGv_i64 t0 = tcg_const_i64(arg2);
1000: tcg_gen_xor_i64(ret, arg1, t0);
1001: tcg_temp_free_i64(t0);
1002: }
1003:
1004: static inline void tcg_gen_shl_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1005: {
1006: tcg_gen_op3_i64(INDEX_op_shl_i64, ret, arg1, arg2);
1007: }
1008:
1009: static inline void tcg_gen_shli_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
1010: {
1011: if (arg2 == 0) {
1012: tcg_gen_mov_i64(ret, arg1);
1013: } else {
1014: TCGv_i64 t0 = tcg_const_i64(arg2);
1015: tcg_gen_shl_i64(ret, arg1, t0);
1016: tcg_temp_free_i64(t0);
1017: }
1018: }
1019:
1020: static inline void tcg_gen_shr_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1021: {
1022: tcg_gen_op3_i64(INDEX_op_shr_i64, ret, arg1, arg2);
1023: }
1024:
1025: static inline void tcg_gen_shri_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
1026: {
1027: if (arg2 == 0) {
1028: tcg_gen_mov_i64(ret, arg1);
1029: } else {
1030: TCGv_i64 t0 = tcg_const_i64(arg2);
1031: tcg_gen_shr_i64(ret, arg1, t0);
1032: tcg_temp_free_i64(t0);
1033: }
1034: }
1035:
1036: static inline void tcg_gen_sar_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1037: {
1038: tcg_gen_op3_i64(INDEX_op_sar_i64, ret, arg1, arg2);
1039: }
1040:
1041: static inline void tcg_gen_sari_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
1042: {
1043: if (arg2 == 0) {
1044: tcg_gen_mov_i64(ret, arg1);
1045: } else {
1046: TCGv_i64 t0 = tcg_const_i64(arg2);
1047: tcg_gen_sar_i64(ret, arg1, t0);
1048: tcg_temp_free_i64(t0);
1049: }
1050: }
1051:
1052: static inline void tcg_gen_brcond_i64(int cond, TCGv_i64 arg1, TCGv_i64 arg2,
1053: int label_index)
1054: {
1055: tcg_gen_op4ii_i64(INDEX_op_brcond_i64, arg1, arg2, cond, label_index);
1056: }
1057:
1058: static inline void tcg_gen_mul_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1059: {
1060: tcg_gen_op3_i64(INDEX_op_mul_i64, ret, arg1, arg2);
1061: }
1062:
1063: #ifdef TCG_TARGET_HAS_div_i64
1064: static inline void tcg_gen_div_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1065: {
1066: tcg_gen_op3_i64(INDEX_op_div_i64, ret, arg1, arg2);
1067: }
1068:
1069: static inline void tcg_gen_rem_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1070: {
1071: tcg_gen_op3_i64(INDEX_op_rem_i64, ret, arg1, arg2);
1072: }
1073:
1074: static inline void tcg_gen_divu_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1075: {
1076: tcg_gen_op3_i64(INDEX_op_divu_i64, ret, arg1, arg2);
1077: }
1078:
1079: static inline void tcg_gen_remu_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1080: {
1081: tcg_gen_op3_i64(INDEX_op_remu_i64, ret, arg1, arg2);
1082: }
1083: #else
1084: static inline void tcg_gen_div_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1085: {
1086: TCGv_i64 t0;
1087: t0 = tcg_temp_new_i64();
1088: tcg_gen_sari_i64(t0, arg1, 63);
1089: tcg_gen_op5_i64(INDEX_op_div2_i64, ret, t0, arg1, t0, arg2);
1090: tcg_temp_free_i64(t0);
1091: }
1092:
1093: static inline void tcg_gen_rem_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1094: {
1095: TCGv_i64 t0;
1096: t0 = tcg_temp_new_i64();
1097: tcg_gen_sari_i64(t0, arg1, 63);
1098: tcg_gen_op5_i64(INDEX_op_div2_i64, t0, ret, arg1, t0, arg2);
1099: tcg_temp_free_i64(t0);
1100: }
1101:
1102: static inline void tcg_gen_divu_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1103: {
1104: TCGv_i64 t0;
1105: t0 = tcg_temp_new_i64();
1106: tcg_gen_movi_i64(t0, 0);
1107: tcg_gen_op5_i64(INDEX_op_divu2_i64, ret, t0, arg1, t0, arg2);
1108: tcg_temp_free_i64(t0);
1109: }
1110:
1111: static inline void tcg_gen_remu_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1112: {
1113: TCGv_i64 t0;
1114: t0 = tcg_temp_new_i64();
1115: tcg_gen_movi_i64(t0, 0);
1116: tcg_gen_op5_i64(INDEX_op_divu2_i64, t0, ret, arg1, t0, arg2);
1117: tcg_temp_free_i64(t0);
1118: }
1119: #endif
1120:
1121: #endif
1122:
1123: static inline void tcg_gen_addi_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
1124: {
1125: /* some cases can be optimized here */
1126: if (arg2 == 0) {
1127: tcg_gen_mov_i64(ret, arg1);
1128: } else {
1129: TCGv_i64 t0 = tcg_const_i64(arg2);
1130: tcg_gen_add_i64(ret, arg1, t0);
1131: tcg_temp_free_i64(t0);
1132: }
1133: }
1134:
1135: static inline void tcg_gen_subfi_i64(TCGv_i64 ret, int64_t arg1, TCGv_i64 arg2)
1136: {
1137: TCGv_i64 t0 = tcg_const_i64(arg1);
1138: tcg_gen_sub_i64(ret, t0, arg2);
1139: tcg_temp_free_i64(t0);
1140: }
1141:
1142: static inline void tcg_gen_subi_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
1143: {
1144: /* some cases can be optimized here */
1145: if (arg2 == 0) {
1146: tcg_gen_mov_i64(ret, arg1);
1147: } else {
1148: TCGv_i64 t0 = tcg_const_i64(arg2);
1149: tcg_gen_sub_i64(ret, arg1, t0);
1150: tcg_temp_free_i64(t0);
1151: }
1152: }
1153: static inline void tcg_gen_brcondi_i64(int cond, TCGv_i64 arg1, int64_t arg2,
1154: int label_index)
1155: {
1156: TCGv_i64 t0 = tcg_const_i64(arg2);
1157: tcg_gen_brcond_i64(cond, arg1, t0, label_index);
1158: tcg_temp_free_i64(t0);
1159: }
1160:
1161: static inline void tcg_gen_muli_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
1162: {
1163: TCGv_i64 t0 = tcg_const_i64(arg2);
1164: tcg_gen_mul_i64(ret, arg1, t0);
1165: tcg_temp_free_i64(t0);
1166: }
1167:
1168:
1169: /***************************************/
1170: /* optional operations */
1171:
1172: static inline void tcg_gen_ext8s_i32(TCGv_i32 ret, TCGv_i32 arg)
1173: {
1174: #ifdef TCG_TARGET_HAS_ext8s_i32
1175: tcg_gen_op2_i32(INDEX_op_ext8s_i32, ret, arg);
1176: #else
1177: tcg_gen_shli_i32(ret, arg, 24);
1178: tcg_gen_sari_i32(ret, ret, 24);
1179: #endif
1180: }
1181:
1182: static inline void tcg_gen_ext16s_i32(TCGv_i32 ret, TCGv_i32 arg)
1183: {
1184: #ifdef TCG_TARGET_HAS_ext16s_i32
1185: tcg_gen_op2_i32(INDEX_op_ext16s_i32, ret, arg);
1186: #else
1187: tcg_gen_shli_i32(ret, arg, 16);
1188: tcg_gen_sari_i32(ret, ret, 16);
1189: #endif
1190: }
1191:
1192: static inline void tcg_gen_ext8u_i32(TCGv_i32 ret, TCGv_i32 arg)
1193: {
1.1.1.3 ! root 1194: #ifdef TCG_TARGET_HAS_ext8u_i32
! 1195: tcg_gen_op2_i32(INDEX_op_ext8u_i32, ret, arg);
! 1196: #else
1.1 root 1197: tcg_gen_andi_i32(ret, arg, 0xffu);
1.1.1.3 ! root 1198: #endif
1.1 root 1199: }
1200:
1201: static inline void tcg_gen_ext16u_i32(TCGv_i32 ret, TCGv_i32 arg)
1202: {
1.1.1.3 ! root 1203: #ifdef TCG_TARGET_HAS_ext16u_i32
! 1204: tcg_gen_op2_i32(INDEX_op_ext16u_i32, ret, arg);
! 1205: #else
1.1 root 1206: tcg_gen_andi_i32(ret, arg, 0xffffu);
1.1.1.3 ! root 1207: #endif
1.1 root 1208: }
1209:
1210: /* Note: we assume the two high bytes are set to zero */
1211: static inline void tcg_gen_bswap16_i32(TCGv_i32 ret, TCGv_i32 arg)
1212: {
1213: #ifdef TCG_TARGET_HAS_bswap16_i32
1214: tcg_gen_op2_i32(INDEX_op_bswap16_i32, ret, arg);
1215: #else
1.1.1.2 root 1216: TCGv_i32 t0 = tcg_temp_new_i32();
1.1 root 1217:
1.1.1.2 root 1218: tcg_gen_ext8u_i32(t0, arg);
1219: tcg_gen_shli_i32(t0, t0, 8);
1220: tcg_gen_shri_i32(ret, arg, 8);
1221: tcg_gen_or_i32(ret, ret, t0);
1.1 root 1222: tcg_temp_free_i32(t0);
1223: #endif
1224: }
1225:
1.1.1.2 root 1226: static inline void tcg_gen_bswap32_i32(TCGv_i32 ret, TCGv_i32 arg)
1.1 root 1227: {
1.1.1.2 root 1228: #ifdef TCG_TARGET_HAS_bswap32_i32
1229: tcg_gen_op2_i32(INDEX_op_bswap32_i32, ret, arg);
1.1 root 1230: #else
1231: TCGv_i32 t0, t1;
1232: t0 = tcg_temp_new_i32();
1233: t1 = tcg_temp_new_i32();
1234:
1235: tcg_gen_shli_i32(t0, arg, 24);
1236:
1237: tcg_gen_andi_i32(t1, arg, 0x0000ff00);
1238: tcg_gen_shli_i32(t1, t1, 8);
1239: tcg_gen_or_i32(t0, t0, t1);
1240:
1241: tcg_gen_shri_i32(t1, arg, 8);
1242: tcg_gen_andi_i32(t1, t1, 0x0000ff00);
1243: tcg_gen_or_i32(t0, t0, t1);
1244:
1245: tcg_gen_shri_i32(t1, arg, 24);
1246: tcg_gen_or_i32(ret, t0, t1);
1247: tcg_temp_free_i32(t0);
1248: tcg_temp_free_i32(t1);
1249: #endif
1250: }
1251:
1252: #if TCG_TARGET_REG_BITS == 32
1253: static inline void tcg_gen_ext8s_i64(TCGv_i64 ret, TCGv_i64 arg)
1254: {
1255: tcg_gen_ext8s_i32(TCGV_LOW(ret), TCGV_LOW(arg));
1256: tcg_gen_sari_i32(TCGV_HIGH(ret), TCGV_LOW(ret), 31);
1257: }
1258:
1259: static inline void tcg_gen_ext16s_i64(TCGv_i64 ret, TCGv_i64 arg)
1260: {
1261: tcg_gen_ext16s_i32(TCGV_LOW(ret), TCGV_LOW(arg));
1262: tcg_gen_sari_i32(TCGV_HIGH(ret), TCGV_LOW(ret), 31);
1263: }
1264:
1265: static inline void tcg_gen_ext32s_i64(TCGv_i64 ret, TCGv_i64 arg)
1266: {
1267: tcg_gen_mov_i32(TCGV_LOW(ret), TCGV_LOW(arg));
1268: tcg_gen_sari_i32(TCGV_HIGH(ret), TCGV_LOW(ret), 31);
1269: }
1270:
1271: static inline void tcg_gen_ext8u_i64(TCGv_i64 ret, TCGv_i64 arg)
1272: {
1273: tcg_gen_ext8u_i32(TCGV_LOW(ret), TCGV_LOW(arg));
1274: tcg_gen_movi_i32(TCGV_HIGH(ret), 0);
1275: }
1276:
1277: static inline void tcg_gen_ext16u_i64(TCGv_i64 ret, TCGv_i64 arg)
1278: {
1279: tcg_gen_ext16u_i32(TCGV_LOW(ret), TCGV_LOW(arg));
1280: tcg_gen_movi_i32(TCGV_HIGH(ret), 0);
1281: }
1282:
1283: static inline void tcg_gen_ext32u_i64(TCGv_i64 ret, TCGv_i64 arg)
1284: {
1285: tcg_gen_mov_i32(TCGV_LOW(ret), TCGV_LOW(arg));
1286: tcg_gen_movi_i32(TCGV_HIGH(ret), 0);
1287: }
1288:
1289: static inline void tcg_gen_trunc_i64_i32(TCGv_i32 ret, TCGv_i64 arg)
1290: {
1291: tcg_gen_mov_i32(ret, TCGV_LOW(arg));
1292: }
1293:
1294: static inline void tcg_gen_extu_i32_i64(TCGv_i64 ret, TCGv_i32 arg)
1295: {
1296: tcg_gen_mov_i32(TCGV_LOW(ret), arg);
1297: tcg_gen_movi_i32(TCGV_HIGH(ret), 0);
1298: }
1299:
1300: static inline void tcg_gen_ext_i32_i64(TCGv_i64 ret, TCGv_i32 arg)
1301: {
1302: tcg_gen_mov_i32(TCGV_LOW(ret), arg);
1303: tcg_gen_sari_i32(TCGV_HIGH(ret), TCGV_LOW(ret), 31);
1304: }
1305:
1.1.1.2 root 1306: /* Note: we assume the six high bytes are set to zero */
1307: static inline void tcg_gen_bswap16_i64(TCGv_i64 ret, TCGv_i64 arg)
1308: {
1309: tcg_gen_mov_i32(TCGV_HIGH(ret), TCGV_HIGH(arg));
1310: tcg_gen_bswap16_i32(TCGV_LOW(ret), TCGV_LOW(arg));
1311: }
1312:
1313: /* Note: we assume the four high bytes are set to zero */
1314: static inline void tcg_gen_bswap32_i64(TCGv_i64 ret, TCGv_i64 arg)
1315: {
1316: tcg_gen_mov_i32(TCGV_HIGH(ret), TCGV_HIGH(arg));
1317: tcg_gen_bswap32_i32(TCGV_LOW(ret), TCGV_LOW(arg));
1318: }
1319:
1320: static inline void tcg_gen_bswap64_i64(TCGv_i64 ret, TCGv_i64 arg)
1.1 root 1321: {
1322: TCGv_i32 t0, t1;
1323: t0 = tcg_temp_new_i32();
1324: t1 = tcg_temp_new_i32();
1325:
1.1.1.2 root 1326: tcg_gen_bswap32_i32(t0, TCGV_LOW(arg));
1327: tcg_gen_bswap32_i32(t1, TCGV_HIGH(arg));
1.1 root 1328: tcg_gen_mov_i32(TCGV_LOW(ret), t1);
1329: tcg_gen_mov_i32(TCGV_HIGH(ret), t0);
1330: tcg_temp_free_i32(t0);
1331: tcg_temp_free_i32(t1);
1332: }
1333: #else
1334:
1335: static inline void tcg_gen_ext8s_i64(TCGv_i64 ret, TCGv_i64 arg)
1336: {
1337: #ifdef TCG_TARGET_HAS_ext8s_i64
1338: tcg_gen_op2_i64(INDEX_op_ext8s_i64, ret, arg);
1339: #else
1340: tcg_gen_shli_i64(ret, arg, 56);
1341: tcg_gen_sari_i64(ret, ret, 56);
1342: #endif
1343: }
1344:
1345: static inline void tcg_gen_ext16s_i64(TCGv_i64 ret, TCGv_i64 arg)
1346: {
1347: #ifdef TCG_TARGET_HAS_ext16s_i64
1348: tcg_gen_op2_i64(INDEX_op_ext16s_i64, ret, arg);
1349: #else
1350: tcg_gen_shli_i64(ret, arg, 48);
1351: tcg_gen_sari_i64(ret, ret, 48);
1352: #endif
1353: }
1354:
1355: static inline void tcg_gen_ext32s_i64(TCGv_i64 ret, TCGv_i64 arg)
1356: {
1357: #ifdef TCG_TARGET_HAS_ext32s_i64
1358: tcg_gen_op2_i64(INDEX_op_ext32s_i64, ret, arg);
1359: #else
1360: tcg_gen_shli_i64(ret, arg, 32);
1361: tcg_gen_sari_i64(ret, ret, 32);
1362: #endif
1363: }
1364:
1365: static inline void tcg_gen_ext8u_i64(TCGv_i64 ret, TCGv_i64 arg)
1366: {
1.1.1.3 ! root 1367: #ifdef TCG_TARGET_HAS_ext8u_i64
! 1368: tcg_gen_op2_i64(INDEX_op_ext8u_i64, ret, arg);
! 1369: #else
1.1 root 1370: tcg_gen_andi_i64(ret, arg, 0xffu);
1.1.1.3 ! root 1371: #endif
1.1 root 1372: }
1373:
1374: static inline void tcg_gen_ext16u_i64(TCGv_i64 ret, TCGv_i64 arg)
1375: {
1.1.1.3 ! root 1376: #ifdef TCG_TARGET_HAS_ext16u_i64
! 1377: tcg_gen_op2_i64(INDEX_op_ext16u_i64, ret, arg);
! 1378: #else
1.1 root 1379: tcg_gen_andi_i64(ret, arg, 0xffffu);
1.1.1.3 ! root 1380: #endif
1.1 root 1381: }
1382:
1383: static inline void tcg_gen_ext32u_i64(TCGv_i64 ret, TCGv_i64 arg)
1384: {
1.1.1.3 ! root 1385: #ifdef TCG_TARGET_HAS_ext32u_i64
! 1386: tcg_gen_op2_i64(INDEX_op_ext32u_i64, ret, arg);
! 1387: #else
1.1 root 1388: tcg_gen_andi_i64(ret, arg, 0xffffffffu);
1.1.1.3 ! root 1389: #endif
1.1 root 1390: }
1391:
1392: /* Note: we assume the target supports move between 32 and 64 bit
1393: registers. This will probably break MIPS64 targets. */
1394: static inline void tcg_gen_trunc_i64_i32(TCGv_i32 ret, TCGv_i64 arg)
1395: {
1396: tcg_gen_mov_i32(ret, MAKE_TCGV_I32(GET_TCGV_I64(arg)));
1397: }
1398:
1399: /* Note: we assume the target supports move between 32 and 64 bit
1400: registers */
1401: static inline void tcg_gen_extu_i32_i64(TCGv_i64 ret, TCGv_i32 arg)
1402: {
1.1.1.3 ! root 1403: tcg_gen_ext32u_i64(ret, MAKE_TCGV_I64(GET_TCGV_I32(arg)));
1.1 root 1404: }
1405:
1406: /* Note: we assume the target supports move between 32 and 64 bit
1407: registers */
1408: static inline void tcg_gen_ext_i32_i64(TCGv_i64 ret, TCGv_i32 arg)
1409: {
1410: tcg_gen_ext32s_i64(ret, MAKE_TCGV_I64(GET_TCGV_I32(arg)));
1411: }
1412:
1.1.1.2 root 1413: /* Note: we assume the six high bytes are set to zero */
1414: static inline void tcg_gen_bswap16_i64(TCGv_i64 ret, TCGv_i64 arg)
1.1 root 1415: {
1.1.1.2 root 1416: #ifdef TCG_TARGET_HAS_bswap16_i64
1417: tcg_gen_op2_i64(INDEX_op_bswap16_i64, ret, arg);
1.1 root 1418: #else
1.1.1.2 root 1419: TCGv_i64 t0 = tcg_temp_new_i64();
1420:
1421: tcg_gen_ext8u_i64(t0, arg);
1422: tcg_gen_shli_i64(t0, t0, 8);
1423: tcg_gen_shri_i64(ret, arg, 8);
1424: tcg_gen_or_i64(ret, ret, t0);
1425: tcg_temp_free_i64(t0);
1426: #endif
1427: }
1428:
1429: /* Note: we assume the four high bytes are set to zero */
1430: static inline void tcg_gen_bswap32_i64(TCGv_i64 ret, TCGv_i64 arg)
1431: {
1432: #ifdef TCG_TARGET_HAS_bswap32_i64
1433: tcg_gen_op2_i64(INDEX_op_bswap32_i64, ret, arg);
1434: #else
1435: TCGv_i64 t0, t1;
1436: t0 = tcg_temp_new_i64();
1437: t1 = tcg_temp_new_i64();
1438:
1439: tcg_gen_shli_i64(t0, arg, 24);
1440: tcg_gen_ext32u_i64(t0, t0);
1441:
1442: tcg_gen_andi_i64(t1, arg, 0x0000ff00);
1443: tcg_gen_shli_i64(t1, t1, 8);
1444: tcg_gen_or_i64(t0, t0, t1);
1445:
1446: tcg_gen_shri_i64(t1, arg, 8);
1447: tcg_gen_andi_i64(t1, t1, 0x0000ff00);
1448: tcg_gen_or_i64(t0, t0, t1);
1449:
1450: tcg_gen_shri_i64(t1, arg, 24);
1451: tcg_gen_or_i64(ret, t0, t1);
1452: tcg_temp_free_i64(t0);
1453: tcg_temp_free_i64(t1);
1454: #endif
1455: }
1456:
1457: static inline void tcg_gen_bswap64_i64(TCGv_i64 ret, TCGv_i64 arg)
1458: {
1459: #ifdef TCG_TARGET_HAS_bswap64_i64
1460: tcg_gen_op2_i64(INDEX_op_bswap64_i64, ret, arg);
1461: #else
1462: TCGv_i64 t0 = tcg_temp_new_i64();
1463: TCGv_i64 t1 = tcg_temp_new_i64();
1.1 root 1464:
1465: tcg_gen_shli_i64(t0, arg, 56);
1466:
1467: tcg_gen_andi_i64(t1, arg, 0x0000ff00);
1468: tcg_gen_shli_i64(t1, t1, 40);
1469: tcg_gen_or_i64(t0, t0, t1);
1470:
1471: tcg_gen_andi_i64(t1, arg, 0x00ff0000);
1472: tcg_gen_shli_i64(t1, t1, 24);
1473: tcg_gen_or_i64(t0, t0, t1);
1474:
1475: tcg_gen_andi_i64(t1, arg, 0xff000000);
1476: tcg_gen_shli_i64(t1, t1, 8);
1477: tcg_gen_or_i64(t0, t0, t1);
1478:
1479: tcg_gen_shri_i64(t1, arg, 8);
1480: tcg_gen_andi_i64(t1, t1, 0xff000000);
1481: tcg_gen_or_i64(t0, t0, t1);
1482:
1483: tcg_gen_shri_i64(t1, arg, 24);
1484: tcg_gen_andi_i64(t1, t1, 0x00ff0000);
1485: tcg_gen_or_i64(t0, t0, t1);
1486:
1487: tcg_gen_shri_i64(t1, arg, 40);
1488: tcg_gen_andi_i64(t1, t1, 0x0000ff00);
1489: tcg_gen_or_i64(t0, t0, t1);
1490:
1491: tcg_gen_shri_i64(t1, arg, 56);
1492: tcg_gen_or_i64(ret, t0, t1);
1.1.1.2 root 1493: tcg_temp_free_i64(t0);
1494: tcg_temp_free_i64(t1);
1.1 root 1495: #endif
1496: }
1497:
1498: #endif
1499:
1500: static inline void tcg_gen_neg_i32(TCGv_i32 ret, TCGv_i32 arg)
1501: {
1502: #ifdef TCG_TARGET_HAS_neg_i32
1503: tcg_gen_op2_i32(INDEX_op_neg_i32, ret, arg);
1504: #else
1505: TCGv_i32 t0 = tcg_const_i32(0);
1506: tcg_gen_sub_i32(ret, t0, arg);
1507: tcg_temp_free_i32(t0);
1508: #endif
1509: }
1510:
1511: static inline void tcg_gen_neg_i64(TCGv_i64 ret, TCGv_i64 arg)
1512: {
1513: #ifdef TCG_TARGET_HAS_neg_i64
1514: tcg_gen_op2_i64(INDEX_op_neg_i64, ret, arg);
1515: #else
1516: TCGv_i64 t0 = tcg_const_i64(0);
1517: tcg_gen_sub_i64(ret, t0, arg);
1518: tcg_temp_free_i64(t0);
1519: #endif
1520: }
1521:
1522: static inline void tcg_gen_not_i32(TCGv_i32 ret, TCGv_i32 arg)
1523: {
1.1.1.2 root 1524: #ifdef TCG_TARGET_HAS_not_i32
1525: tcg_gen_op2_i32(INDEX_op_not_i32, ret, arg);
1526: #else
1.1 root 1527: tcg_gen_xori_i32(ret, arg, -1);
1.1.1.2 root 1528: #endif
1.1 root 1529: }
1530:
1531: static inline void tcg_gen_not_i64(TCGv_i64 ret, TCGv_i64 arg)
1532: {
1.1.1.2 root 1533: #ifdef TCG_TARGET_HAS_not_i64
1534: tcg_gen_op2_i64(INDEX_op_not_i64, ret, arg);
1535: #else
1.1 root 1536: tcg_gen_xori_i64(ret, arg, -1);
1.1.1.2 root 1537: #endif
1.1 root 1538: }
1539:
1540: static inline void tcg_gen_discard_i32(TCGv_i32 arg)
1541: {
1542: tcg_gen_op1_i32(INDEX_op_discard, arg);
1543: }
1544:
1545: #if TCG_TARGET_REG_BITS == 32
1546: static inline void tcg_gen_discard_i64(TCGv_i64 arg)
1547: {
1548: tcg_gen_discard_i32(TCGV_LOW(arg));
1549: tcg_gen_discard_i32(TCGV_HIGH(arg));
1550: }
1551: #else
1552: static inline void tcg_gen_discard_i64(TCGv_i64 arg)
1553: {
1554: tcg_gen_op1_i64(INDEX_op_discard, arg);
1555: }
1556: #endif
1557:
1558: static inline void tcg_gen_concat_i32_i64(TCGv_i64 dest, TCGv_i32 low, TCGv_i32 high)
1559: {
1560: #if TCG_TARGET_REG_BITS == 32
1561: tcg_gen_mov_i32(TCGV_LOW(dest), low);
1562: tcg_gen_mov_i32(TCGV_HIGH(dest), high);
1563: #else
1564: TCGv_i64 tmp = tcg_temp_new_i64();
1565: /* This extension is only needed for type correctness.
1566: We may be able to do better given target specific information. */
1567: tcg_gen_extu_i32_i64(tmp, high);
1568: tcg_gen_shli_i64(tmp, tmp, 32);
1569: tcg_gen_extu_i32_i64(dest, low);
1570: tcg_gen_or_i64(dest, dest, tmp);
1571: tcg_temp_free_i64(tmp);
1572: #endif
1573: }
1574:
1575: static inline void tcg_gen_concat32_i64(TCGv_i64 dest, TCGv_i64 low, TCGv_i64 high)
1576: {
1577: #if TCG_TARGET_REG_BITS == 32
1578: tcg_gen_concat_i32_i64(dest, TCGV_LOW(low), TCGV_LOW(high));
1579: #else
1580: TCGv_i64 tmp = tcg_temp_new_i64();
1581: tcg_gen_ext32u_i64(dest, low);
1582: tcg_gen_shli_i64(tmp, high, 32);
1583: tcg_gen_or_i64(dest, dest, tmp);
1584: tcg_temp_free_i64(tmp);
1585: #endif
1586: }
1587:
1588: static inline void tcg_gen_andc_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
1589: {
1590: TCGv_i32 t0;
1591: t0 = tcg_temp_new_i32();
1592: tcg_gen_not_i32(t0, arg2);
1593: tcg_gen_and_i32(ret, arg1, t0);
1594: tcg_temp_free_i32(t0);
1595: }
1596:
1597: static inline void tcg_gen_andc_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1598: {
1599: TCGv_i64 t0;
1600: t0 = tcg_temp_new_i64();
1601: tcg_gen_not_i64(t0, arg2);
1602: tcg_gen_and_i64(ret, arg1, t0);
1603: tcg_temp_free_i64(t0);
1604: }
1605:
1606: static inline void tcg_gen_eqv_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
1607: {
1.1.1.2 root 1608: tcg_gen_xor_i32(ret, arg1, arg2);
1609: tcg_gen_not_i32(ret, ret);
1.1 root 1610: }
1611:
1612: static inline void tcg_gen_eqv_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1613: {
1.1.1.2 root 1614: tcg_gen_xor_i64(ret, arg1, arg2);
1615: tcg_gen_not_i64(ret, ret);
1.1 root 1616: }
1617:
1618: static inline void tcg_gen_nand_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
1619: {
1.1.1.2 root 1620: tcg_gen_and_i32(ret, arg1, arg2);
1621: tcg_gen_not_i32(ret, ret);
1.1 root 1622: }
1623:
1624: static inline void tcg_gen_nand_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1625: {
1.1.1.2 root 1626: tcg_gen_and_i64(ret, arg1, arg2);
1627: tcg_gen_not_i64(ret, ret);
1.1 root 1628: }
1629:
1630: static inline void tcg_gen_nor_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
1631: {
1.1.1.2 root 1632: tcg_gen_or_i32(ret, arg1, arg2);
1633: tcg_gen_not_i32(ret, ret);
1.1 root 1634: }
1635:
1636: static inline void tcg_gen_nor_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1637: {
1.1.1.2 root 1638: tcg_gen_or_i64(ret, arg1, arg2);
1639: tcg_gen_not_i64(ret, ret);
1.1 root 1640: }
1641:
1642: static inline void tcg_gen_orc_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
1643: {
1644: TCGv_i32 t0;
1645: t0 = tcg_temp_new_i32();
1646: tcg_gen_not_i32(t0, arg2);
1647: tcg_gen_or_i32(ret, arg1, t0);
1648: tcg_temp_free_i32(t0);
1649: }
1650:
1651: static inline void tcg_gen_orc_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1652: {
1653: TCGv_i64 t0;
1654: t0 = tcg_temp_new_i64();
1655: tcg_gen_not_i64(t0, arg2);
1656: tcg_gen_or_i64(ret, arg1, t0);
1657: tcg_temp_free_i64(t0);
1658: }
1659:
1660: static inline void tcg_gen_rotl_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
1661: {
1.1.1.2 root 1662: #ifdef TCG_TARGET_HAS_rot_i32
1663: tcg_gen_op3_i32(INDEX_op_rotl_i32, ret, arg1, arg2);
1664: #else
1.1 root 1665: TCGv_i32 t0, t1;
1666:
1667: t0 = tcg_temp_new_i32();
1668: t1 = tcg_temp_new_i32();
1669: tcg_gen_shl_i32(t0, arg1, arg2);
1670: tcg_gen_subfi_i32(t1, 32, arg2);
1671: tcg_gen_shr_i32(t1, arg1, t1);
1672: tcg_gen_or_i32(ret, t0, t1);
1673: tcg_temp_free_i32(t0);
1674: tcg_temp_free_i32(t1);
1.1.1.2 root 1675: #endif
1.1 root 1676: }
1677:
1678: static inline void tcg_gen_rotl_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1679: {
1.1.1.2 root 1680: #ifdef TCG_TARGET_HAS_rot_i64
1681: tcg_gen_op3_i64(INDEX_op_rotl_i64, ret, arg1, arg2);
1682: #else
1.1 root 1683: TCGv_i64 t0, t1;
1684:
1685: t0 = tcg_temp_new_i64();
1686: t1 = tcg_temp_new_i64();
1687: tcg_gen_shl_i64(t0, arg1, arg2);
1688: tcg_gen_subfi_i64(t1, 64, arg2);
1689: tcg_gen_shr_i64(t1, arg1, t1);
1690: tcg_gen_or_i64(ret, t0, t1);
1691: tcg_temp_free_i64(t0);
1692: tcg_temp_free_i64(t1);
1.1.1.2 root 1693: #endif
1.1 root 1694: }
1695:
1696: static inline void tcg_gen_rotli_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2)
1697: {
1698: /* some cases can be optimized here */
1699: if (arg2 == 0) {
1700: tcg_gen_mov_i32(ret, arg1);
1701: } else {
1.1.1.2 root 1702: #ifdef TCG_TARGET_HAS_rot_i32
1703: TCGv_i32 t0 = tcg_const_i32(arg2);
1704: tcg_gen_rotl_i32(ret, arg1, t0);
1705: tcg_temp_free_i32(t0);
1706: #else
1.1 root 1707: TCGv_i32 t0, t1;
1708: t0 = tcg_temp_new_i32();
1709: t1 = tcg_temp_new_i32();
1710: tcg_gen_shli_i32(t0, arg1, arg2);
1711: tcg_gen_shri_i32(t1, arg1, 32 - arg2);
1712: tcg_gen_or_i32(ret, t0, t1);
1713: tcg_temp_free_i32(t0);
1714: tcg_temp_free_i32(t1);
1.1.1.2 root 1715: #endif
1.1 root 1716: }
1717: }
1718:
1719: static inline void tcg_gen_rotli_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
1720: {
1721: /* some cases can be optimized here */
1722: if (arg2 == 0) {
1723: tcg_gen_mov_i64(ret, arg1);
1724: } else {
1.1.1.2 root 1725: #ifdef TCG_TARGET_HAS_rot_i64
1726: TCGv_i64 t0 = tcg_const_i64(arg2);
1727: tcg_gen_rotl_i64(ret, arg1, t0);
1728: tcg_temp_free_i64(t0);
1729: #else
1.1 root 1730: TCGv_i64 t0, t1;
1731: t0 = tcg_temp_new_i64();
1732: t1 = tcg_temp_new_i64();
1733: tcg_gen_shli_i64(t0, arg1, arg2);
1734: tcg_gen_shri_i64(t1, arg1, 64 - arg2);
1735: tcg_gen_or_i64(ret, t0, t1);
1736: tcg_temp_free_i64(t0);
1737: tcg_temp_free_i64(t1);
1.1.1.2 root 1738: #endif
1.1 root 1739: }
1740: }
1741:
1742: static inline void tcg_gen_rotr_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
1743: {
1.1.1.2 root 1744: #ifdef TCG_TARGET_HAS_rot_i32
1745: tcg_gen_op3_i32(INDEX_op_rotr_i32, ret, arg1, arg2);
1746: #else
1.1 root 1747: TCGv_i32 t0, t1;
1748:
1749: t0 = tcg_temp_new_i32();
1750: t1 = tcg_temp_new_i32();
1751: tcg_gen_shr_i32(t0, arg1, arg2);
1752: tcg_gen_subfi_i32(t1, 32, arg2);
1753: tcg_gen_shl_i32(t1, arg1, t1);
1754: tcg_gen_or_i32(ret, t0, t1);
1755: tcg_temp_free_i32(t0);
1756: tcg_temp_free_i32(t1);
1.1.1.2 root 1757: #endif
1.1 root 1758: }
1759:
1760: static inline void tcg_gen_rotr_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1761: {
1.1.1.2 root 1762: #ifdef TCG_TARGET_HAS_rot_i64
1763: tcg_gen_op3_i64(INDEX_op_rotr_i64, ret, arg1, arg2);
1764: #else
1.1 root 1765: TCGv_i64 t0, t1;
1766:
1767: t0 = tcg_temp_new_i64();
1768: t1 = tcg_temp_new_i64();
1.1.1.2 root 1769: tcg_gen_shr_i64(t0, arg1, arg2);
1.1 root 1770: tcg_gen_subfi_i64(t1, 64, arg2);
1771: tcg_gen_shl_i64(t1, arg1, t1);
1772: tcg_gen_or_i64(ret, t0, t1);
1773: tcg_temp_free_i64(t0);
1774: tcg_temp_free_i64(t1);
1.1.1.2 root 1775: #endif
1.1 root 1776: }
1777:
1778: static inline void tcg_gen_rotri_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2)
1779: {
1780: /* some cases can be optimized here */
1781: if (arg2 == 0) {
1782: tcg_gen_mov_i32(ret, arg1);
1783: } else {
1784: tcg_gen_rotli_i32(ret, arg1, 32 - arg2);
1785: }
1786: }
1787:
1788: static inline void tcg_gen_rotri_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
1789: {
1790: /* some cases can be optimized here */
1791: if (arg2 == 0) {
1792: tcg_gen_mov_i64(ret, arg1);
1793: } else {
1794: tcg_gen_rotli_i64(ret, arg1, 64 - arg2);
1795: }
1796: }
1797:
1798: /***************************************/
1799: /* QEMU specific operations. Their type depend on the QEMU CPU
1800: type. */
1801: #ifndef TARGET_LONG_BITS
1802: #error must include QEMU headers
1803: #endif
1804:
1805: #if TARGET_LONG_BITS == 32
1806: #define TCGv TCGv_i32
1807: #define tcg_temp_new() tcg_temp_new_i32()
1808: #define tcg_global_reg_new tcg_global_reg_new_i32
1809: #define tcg_global_mem_new tcg_global_mem_new_i32
1810: #define tcg_temp_local_new() tcg_temp_local_new_i32()
1811: #define tcg_temp_free tcg_temp_free_i32
1812: #define tcg_gen_qemu_ldst_op tcg_gen_op3i_i32
1813: #define tcg_gen_qemu_ldst_op_i64 tcg_gen_qemu_ldst_op_i64_i32
1814: #define TCGV_UNUSED(x) TCGV_UNUSED_I32(x)
1.1.1.2 root 1815: #define TCGV_EQUAL(a, b) TCGV_EQUAL_I32(a, b)
1.1 root 1816: #else
1817: #define TCGv TCGv_i64
1818: #define tcg_temp_new() tcg_temp_new_i64()
1819: #define tcg_global_reg_new tcg_global_reg_new_i64
1820: #define tcg_global_mem_new tcg_global_mem_new_i64
1821: #define tcg_temp_local_new() tcg_temp_local_new_i64()
1822: #define tcg_temp_free tcg_temp_free_i64
1823: #define tcg_gen_qemu_ldst_op tcg_gen_op3i_i64
1824: #define tcg_gen_qemu_ldst_op_i64 tcg_gen_qemu_ldst_op_i64_i64
1825: #define TCGV_UNUSED(x) TCGV_UNUSED_I64(x)
1.1.1.2 root 1826: #define TCGV_EQUAL(a, b) TCGV_EQUAL_I64(a, b)
1.1 root 1827: #endif
1828:
1829: /* debug info: write the PC of the corresponding QEMU CPU instruction */
1830: static inline void tcg_gen_debug_insn_start(uint64_t pc)
1831: {
1832: /* XXX: must really use a 32 bit size for TCGArg in all cases */
1833: #if TARGET_LONG_BITS > TCG_TARGET_REG_BITS
1834: tcg_gen_op2ii(INDEX_op_debug_insn_start,
1835: (uint32_t)(pc), (uint32_t)(pc >> 32));
1836: #else
1837: tcg_gen_op1i(INDEX_op_debug_insn_start, pc);
1838: #endif
1839: }
1840:
1841: static inline void tcg_gen_exit_tb(tcg_target_long val)
1842: {
1843: tcg_gen_op1i(INDEX_op_exit_tb, val);
1844: }
1845:
1846: static inline void tcg_gen_goto_tb(int idx)
1847: {
1848: tcg_gen_op1i(INDEX_op_goto_tb, idx);
1849: }
1850:
1851: #if TCG_TARGET_REG_BITS == 32
1852: static inline void tcg_gen_qemu_ld8u(TCGv ret, TCGv addr, int mem_index)
1853: {
1854: #if TARGET_LONG_BITS == 32
1855: tcg_gen_op3i_i32(INDEX_op_qemu_ld8u, ret, addr, mem_index);
1856: #else
1857: tcg_gen_op4i_i32(INDEX_op_qemu_ld8u, TCGV_LOW(ret), TCGV_LOW(addr),
1858: TCGV_HIGH(addr), mem_index);
1859: tcg_gen_movi_i32(TCGV_HIGH(ret), 0);
1860: #endif
1861: }
1862:
1863: static inline void tcg_gen_qemu_ld8s(TCGv ret, TCGv addr, int mem_index)
1864: {
1865: #if TARGET_LONG_BITS == 32
1866: tcg_gen_op3i_i32(INDEX_op_qemu_ld8s, ret, addr, mem_index);
1867: #else
1868: tcg_gen_op4i_i32(INDEX_op_qemu_ld8s, TCGV_LOW(ret), TCGV_LOW(addr),
1869: TCGV_HIGH(addr), mem_index);
1870: tcg_gen_sari_i32(TCGV_HIGH(ret), TCGV_LOW(ret), 31);
1871: #endif
1872: }
1873:
1874: static inline void tcg_gen_qemu_ld16u(TCGv ret, TCGv addr, int mem_index)
1875: {
1876: #if TARGET_LONG_BITS == 32
1877: tcg_gen_op3i_i32(INDEX_op_qemu_ld16u, ret, addr, mem_index);
1878: #else
1879: tcg_gen_op4i_i32(INDEX_op_qemu_ld16u, TCGV_LOW(ret), TCGV_LOW(addr),
1880: TCGV_HIGH(addr), mem_index);
1881: tcg_gen_movi_i32(TCGV_HIGH(ret), 0);
1882: #endif
1883: }
1884:
1885: static inline void tcg_gen_qemu_ld16s(TCGv ret, TCGv addr, int mem_index)
1886: {
1887: #if TARGET_LONG_BITS == 32
1888: tcg_gen_op3i_i32(INDEX_op_qemu_ld16s, ret, addr, mem_index);
1889: #else
1890: tcg_gen_op4i_i32(INDEX_op_qemu_ld16s, TCGV_LOW(ret), TCGV_LOW(addr),
1891: TCGV_HIGH(addr), mem_index);
1892: tcg_gen_sari_i32(TCGV_HIGH(ret), TCGV_LOW(ret), 31);
1893: #endif
1894: }
1895:
1896: static inline void tcg_gen_qemu_ld32u(TCGv ret, TCGv addr, int mem_index)
1897: {
1898: #if TARGET_LONG_BITS == 32
1899: tcg_gen_op3i_i32(INDEX_op_qemu_ld32u, ret, addr, mem_index);
1900: #else
1901: tcg_gen_op4i_i32(INDEX_op_qemu_ld32u, TCGV_LOW(ret), TCGV_LOW(addr),
1902: TCGV_HIGH(addr), mem_index);
1903: tcg_gen_movi_i32(TCGV_HIGH(ret), 0);
1904: #endif
1905: }
1906:
1907: static inline void tcg_gen_qemu_ld32s(TCGv ret, TCGv addr, int mem_index)
1908: {
1909: #if TARGET_LONG_BITS == 32
1910: tcg_gen_op3i_i32(INDEX_op_qemu_ld32u, ret, addr, mem_index);
1911: #else
1912: tcg_gen_op4i_i32(INDEX_op_qemu_ld32u, TCGV_LOW(ret), TCGV_LOW(addr),
1913: TCGV_HIGH(addr), mem_index);
1914: tcg_gen_sari_i32(TCGV_HIGH(ret), TCGV_LOW(ret), 31);
1915: #endif
1916: }
1917:
1918: static inline void tcg_gen_qemu_ld64(TCGv_i64 ret, TCGv addr, int mem_index)
1919: {
1920: #if TARGET_LONG_BITS == 32
1921: tcg_gen_op4i_i32(INDEX_op_qemu_ld64, TCGV_LOW(ret), TCGV_HIGH(ret), addr, mem_index);
1922: #else
1923: tcg_gen_op5i_i32(INDEX_op_qemu_ld64, TCGV_LOW(ret), TCGV_HIGH(ret),
1924: TCGV_LOW(addr), TCGV_HIGH(addr), mem_index);
1925: #endif
1926: }
1927:
1928: static inline void tcg_gen_qemu_st8(TCGv arg, TCGv addr, int mem_index)
1929: {
1930: #if TARGET_LONG_BITS == 32
1931: tcg_gen_op3i_i32(INDEX_op_qemu_st8, arg, addr, mem_index);
1932: #else
1933: tcg_gen_op4i_i32(INDEX_op_qemu_st8, TCGV_LOW(arg), TCGV_LOW(addr),
1934: TCGV_HIGH(addr), mem_index);
1935: #endif
1936: }
1937:
1938: static inline void tcg_gen_qemu_st16(TCGv arg, TCGv addr, int mem_index)
1939: {
1940: #if TARGET_LONG_BITS == 32
1941: tcg_gen_op3i_i32(INDEX_op_qemu_st16, arg, addr, mem_index);
1942: #else
1943: tcg_gen_op4i_i32(INDEX_op_qemu_st16, TCGV_LOW(arg), TCGV_LOW(addr),
1944: TCGV_HIGH(addr), mem_index);
1945: #endif
1946: }
1947:
1948: static inline void tcg_gen_qemu_st32(TCGv arg, TCGv addr, int mem_index)
1949: {
1950: #if TARGET_LONG_BITS == 32
1951: tcg_gen_op3i_i32(INDEX_op_qemu_st32, arg, addr, mem_index);
1952: #else
1953: tcg_gen_op4i_i32(INDEX_op_qemu_st32, TCGV_LOW(arg), TCGV_LOW(addr),
1954: TCGV_HIGH(addr), mem_index);
1955: #endif
1956: }
1957:
1958: static inline void tcg_gen_qemu_st64(TCGv_i64 arg, TCGv addr, int mem_index)
1959: {
1960: #if TARGET_LONG_BITS == 32
1961: tcg_gen_op4i_i32(INDEX_op_qemu_st64, TCGV_LOW(arg), TCGV_HIGH(arg), addr,
1962: mem_index);
1963: #else
1964: tcg_gen_op5i_i32(INDEX_op_qemu_st64, TCGV_LOW(arg), TCGV_HIGH(arg),
1965: TCGV_LOW(addr), TCGV_HIGH(addr), mem_index);
1966: #endif
1967: }
1968:
1969: #define tcg_gen_ld_ptr tcg_gen_ld_i32
1970: #define tcg_gen_discard_ptr tcg_gen_discard_i32
1971:
1972: #else /* TCG_TARGET_REG_BITS == 32 */
1973:
1974: static inline void tcg_gen_qemu_ld8u(TCGv ret, TCGv addr, int mem_index)
1975: {
1976: tcg_gen_qemu_ldst_op(INDEX_op_qemu_ld8u, ret, addr, mem_index);
1977: }
1978:
1979: static inline void tcg_gen_qemu_ld8s(TCGv ret, TCGv addr, int mem_index)
1980: {
1981: tcg_gen_qemu_ldst_op(INDEX_op_qemu_ld8s, ret, addr, mem_index);
1982: }
1983:
1984: static inline void tcg_gen_qemu_ld16u(TCGv ret, TCGv addr, int mem_index)
1985: {
1986: tcg_gen_qemu_ldst_op(INDEX_op_qemu_ld16u, ret, addr, mem_index);
1987: }
1988:
1989: static inline void tcg_gen_qemu_ld16s(TCGv ret, TCGv addr, int mem_index)
1990: {
1991: tcg_gen_qemu_ldst_op(INDEX_op_qemu_ld16s, ret, addr, mem_index);
1992: }
1993:
1994: static inline void tcg_gen_qemu_ld32u(TCGv ret, TCGv addr, int mem_index)
1995: {
1996: tcg_gen_qemu_ldst_op(INDEX_op_qemu_ld32u, ret, addr, mem_index);
1997: }
1998:
1999: static inline void tcg_gen_qemu_ld32s(TCGv ret, TCGv addr, int mem_index)
2000: {
2001: tcg_gen_qemu_ldst_op(INDEX_op_qemu_ld32s, ret, addr, mem_index);
2002: }
2003:
2004: static inline void tcg_gen_qemu_ld64(TCGv_i64 ret, TCGv addr, int mem_index)
2005: {
2006: tcg_gen_qemu_ldst_op_i64(INDEX_op_qemu_ld64, ret, addr, mem_index);
2007: }
2008:
2009: static inline void tcg_gen_qemu_st8(TCGv arg, TCGv addr, int mem_index)
2010: {
2011: tcg_gen_qemu_ldst_op(INDEX_op_qemu_st8, arg, addr, mem_index);
2012: }
2013:
2014: static inline void tcg_gen_qemu_st16(TCGv arg, TCGv addr, int mem_index)
2015: {
2016: tcg_gen_qemu_ldst_op(INDEX_op_qemu_st16, arg, addr, mem_index);
2017: }
2018:
2019: static inline void tcg_gen_qemu_st32(TCGv arg, TCGv addr, int mem_index)
2020: {
2021: tcg_gen_qemu_ldst_op(INDEX_op_qemu_st32, arg, addr, mem_index);
2022: }
2023:
2024: static inline void tcg_gen_qemu_st64(TCGv_i64 arg, TCGv addr, int mem_index)
2025: {
2026: tcg_gen_qemu_ldst_op_i64(INDEX_op_qemu_st64, arg, addr, mem_index);
2027: }
2028:
2029: #define tcg_gen_ld_ptr tcg_gen_ld_i64
2030: #define tcg_gen_discard_ptr tcg_gen_discard_i64
2031:
2032: #endif /* TCG_TARGET_REG_BITS != 32 */
2033:
2034: #if TARGET_LONG_BITS == 64
2035: #define TCG_TYPE_TL TCG_TYPE_I64
2036: #define tcg_gen_movi_tl tcg_gen_movi_i64
2037: #define tcg_gen_mov_tl tcg_gen_mov_i64
2038: #define tcg_gen_ld8u_tl tcg_gen_ld8u_i64
2039: #define tcg_gen_ld8s_tl tcg_gen_ld8s_i64
2040: #define tcg_gen_ld16u_tl tcg_gen_ld16u_i64
2041: #define tcg_gen_ld16s_tl tcg_gen_ld16s_i64
2042: #define tcg_gen_ld32u_tl tcg_gen_ld32u_i64
2043: #define tcg_gen_ld32s_tl tcg_gen_ld32s_i64
2044: #define tcg_gen_ld_tl tcg_gen_ld_i64
2045: #define tcg_gen_st8_tl tcg_gen_st8_i64
2046: #define tcg_gen_st16_tl tcg_gen_st16_i64
2047: #define tcg_gen_st32_tl tcg_gen_st32_i64
2048: #define tcg_gen_st_tl tcg_gen_st_i64
2049: #define tcg_gen_add_tl tcg_gen_add_i64
2050: #define tcg_gen_addi_tl tcg_gen_addi_i64
2051: #define tcg_gen_sub_tl tcg_gen_sub_i64
2052: #define tcg_gen_neg_tl tcg_gen_neg_i64
2053: #define tcg_gen_subfi_tl tcg_gen_subfi_i64
2054: #define tcg_gen_subi_tl tcg_gen_subi_i64
2055: #define tcg_gen_and_tl tcg_gen_and_i64
2056: #define tcg_gen_andi_tl tcg_gen_andi_i64
2057: #define tcg_gen_or_tl tcg_gen_or_i64
2058: #define tcg_gen_ori_tl tcg_gen_ori_i64
2059: #define tcg_gen_xor_tl tcg_gen_xor_i64
2060: #define tcg_gen_xori_tl tcg_gen_xori_i64
2061: #define tcg_gen_not_tl tcg_gen_not_i64
2062: #define tcg_gen_shl_tl tcg_gen_shl_i64
2063: #define tcg_gen_shli_tl tcg_gen_shli_i64
2064: #define tcg_gen_shr_tl tcg_gen_shr_i64
2065: #define tcg_gen_shri_tl tcg_gen_shri_i64
2066: #define tcg_gen_sar_tl tcg_gen_sar_i64
2067: #define tcg_gen_sari_tl tcg_gen_sari_i64
2068: #define tcg_gen_brcond_tl tcg_gen_brcond_i64
2069: #define tcg_gen_brcondi_tl tcg_gen_brcondi_i64
2070: #define tcg_gen_mul_tl tcg_gen_mul_i64
2071: #define tcg_gen_muli_tl tcg_gen_muli_i64
1.1.1.2 root 2072: #define tcg_gen_div_tl tcg_gen_div_i64
2073: #define tcg_gen_rem_tl tcg_gen_rem_i64
2074: #define tcg_gen_divu_tl tcg_gen_divu_i64
2075: #define tcg_gen_remu_tl tcg_gen_remu_i64
1.1 root 2076: #define tcg_gen_discard_tl tcg_gen_discard_i64
2077: #define tcg_gen_trunc_tl_i32 tcg_gen_trunc_i64_i32
2078: #define tcg_gen_trunc_i64_tl tcg_gen_mov_i64
2079: #define tcg_gen_extu_i32_tl tcg_gen_extu_i32_i64
2080: #define tcg_gen_ext_i32_tl tcg_gen_ext_i32_i64
2081: #define tcg_gen_extu_tl_i64 tcg_gen_mov_i64
2082: #define tcg_gen_ext_tl_i64 tcg_gen_mov_i64
2083: #define tcg_gen_ext8u_tl tcg_gen_ext8u_i64
2084: #define tcg_gen_ext8s_tl tcg_gen_ext8s_i64
2085: #define tcg_gen_ext16u_tl tcg_gen_ext16u_i64
2086: #define tcg_gen_ext16s_tl tcg_gen_ext16s_i64
2087: #define tcg_gen_ext32u_tl tcg_gen_ext32u_i64
2088: #define tcg_gen_ext32s_tl tcg_gen_ext32s_i64
1.1.1.2 root 2089: #define tcg_gen_bswap16_tl tcg_gen_bswap16_i64
2090: #define tcg_gen_bswap32_tl tcg_gen_bswap32_i64
2091: #define tcg_gen_bswap64_tl tcg_gen_bswap64_i64
1.1 root 2092: #define tcg_gen_concat_tl_i64 tcg_gen_concat32_i64
2093: #define tcg_gen_andc_tl tcg_gen_andc_i64
2094: #define tcg_gen_eqv_tl tcg_gen_eqv_i64
2095: #define tcg_gen_nand_tl tcg_gen_nand_i64
2096: #define tcg_gen_nor_tl tcg_gen_nor_i64
2097: #define tcg_gen_orc_tl tcg_gen_orc_i64
2098: #define tcg_gen_rotl_tl tcg_gen_rotl_i64
2099: #define tcg_gen_rotli_tl tcg_gen_rotli_i64
2100: #define tcg_gen_rotr_tl tcg_gen_rotr_i64
2101: #define tcg_gen_rotri_tl tcg_gen_rotri_i64
2102: #define tcg_const_tl tcg_const_i64
2103: #define tcg_const_local_tl tcg_const_local_i64
2104: #else
2105: #define TCG_TYPE_TL TCG_TYPE_I32
2106: #define tcg_gen_movi_tl tcg_gen_movi_i32
2107: #define tcg_gen_mov_tl tcg_gen_mov_i32
2108: #define tcg_gen_ld8u_tl tcg_gen_ld8u_i32
2109: #define tcg_gen_ld8s_tl tcg_gen_ld8s_i32
2110: #define tcg_gen_ld16u_tl tcg_gen_ld16u_i32
2111: #define tcg_gen_ld16s_tl tcg_gen_ld16s_i32
2112: #define tcg_gen_ld32u_tl tcg_gen_ld_i32
2113: #define tcg_gen_ld32s_tl tcg_gen_ld_i32
2114: #define tcg_gen_ld_tl tcg_gen_ld_i32
2115: #define tcg_gen_st8_tl tcg_gen_st8_i32
2116: #define tcg_gen_st16_tl tcg_gen_st16_i32
2117: #define tcg_gen_st32_tl tcg_gen_st_i32
2118: #define tcg_gen_st_tl tcg_gen_st_i32
2119: #define tcg_gen_add_tl tcg_gen_add_i32
2120: #define tcg_gen_addi_tl tcg_gen_addi_i32
2121: #define tcg_gen_sub_tl tcg_gen_sub_i32
2122: #define tcg_gen_neg_tl tcg_gen_neg_i32
2123: #define tcg_gen_subfi_tl tcg_gen_subfi_i32
2124: #define tcg_gen_subi_tl tcg_gen_subi_i32
2125: #define tcg_gen_and_tl tcg_gen_and_i32
2126: #define tcg_gen_andi_tl tcg_gen_andi_i32
2127: #define tcg_gen_or_tl tcg_gen_or_i32
2128: #define tcg_gen_ori_tl tcg_gen_ori_i32
2129: #define tcg_gen_xor_tl tcg_gen_xor_i32
2130: #define tcg_gen_xori_tl tcg_gen_xori_i32
2131: #define tcg_gen_not_tl tcg_gen_not_i32
2132: #define tcg_gen_shl_tl tcg_gen_shl_i32
2133: #define tcg_gen_shli_tl tcg_gen_shli_i32
2134: #define tcg_gen_shr_tl tcg_gen_shr_i32
2135: #define tcg_gen_shri_tl tcg_gen_shri_i32
2136: #define tcg_gen_sar_tl tcg_gen_sar_i32
2137: #define tcg_gen_sari_tl tcg_gen_sari_i32
2138: #define tcg_gen_brcond_tl tcg_gen_brcond_i32
2139: #define tcg_gen_brcondi_tl tcg_gen_brcondi_i32
2140: #define tcg_gen_mul_tl tcg_gen_mul_i32
2141: #define tcg_gen_muli_tl tcg_gen_muli_i32
1.1.1.2 root 2142: #define tcg_gen_div_tl tcg_gen_div_i32
2143: #define tcg_gen_rem_tl tcg_gen_rem_i32
2144: #define tcg_gen_divu_tl tcg_gen_divu_i32
2145: #define tcg_gen_remu_tl tcg_gen_remu_i32
1.1 root 2146: #define tcg_gen_discard_tl tcg_gen_discard_i32
2147: #define tcg_gen_trunc_tl_i32 tcg_gen_mov_i32
2148: #define tcg_gen_trunc_i64_tl tcg_gen_trunc_i64_i32
2149: #define tcg_gen_extu_i32_tl tcg_gen_mov_i32
2150: #define tcg_gen_ext_i32_tl tcg_gen_mov_i32
2151: #define tcg_gen_extu_tl_i64 tcg_gen_extu_i32_i64
2152: #define tcg_gen_ext_tl_i64 tcg_gen_ext_i32_i64
2153: #define tcg_gen_ext8u_tl tcg_gen_ext8u_i32
2154: #define tcg_gen_ext8s_tl tcg_gen_ext8s_i32
2155: #define tcg_gen_ext16u_tl tcg_gen_ext16u_i32
2156: #define tcg_gen_ext16s_tl tcg_gen_ext16s_i32
2157: #define tcg_gen_ext32u_tl tcg_gen_mov_i32
2158: #define tcg_gen_ext32s_tl tcg_gen_mov_i32
1.1.1.2 root 2159: #define tcg_gen_bswap16_tl tcg_gen_bswap16_i32
2160: #define tcg_gen_bswap32_tl tcg_gen_bswap32_i32
1.1 root 2161: #define tcg_gen_concat_tl_i64 tcg_gen_concat_i32_i64
2162: #define tcg_gen_andc_tl tcg_gen_andc_i32
2163: #define tcg_gen_eqv_tl tcg_gen_eqv_i32
2164: #define tcg_gen_nand_tl tcg_gen_nand_i32
2165: #define tcg_gen_nor_tl tcg_gen_nor_i32
2166: #define tcg_gen_orc_tl tcg_gen_orc_i32
2167: #define tcg_gen_rotl_tl tcg_gen_rotl_i32
2168: #define tcg_gen_rotli_tl tcg_gen_rotli_i32
2169: #define tcg_gen_rotr_tl tcg_gen_rotr_i32
2170: #define tcg_gen_rotri_tl tcg_gen_rotri_i32
2171: #define tcg_const_tl tcg_const_i32
2172: #define tcg_const_local_tl tcg_const_local_i32
2173: #endif
2174:
2175: #if TCG_TARGET_REG_BITS == 32
2176: #define tcg_gen_add_ptr tcg_gen_add_i32
2177: #define tcg_gen_addi_ptr tcg_gen_addi_i32
2178: #define tcg_gen_ext_i32_ptr tcg_gen_mov_i32
2179: #else /* TCG_TARGET_REG_BITS == 32 */
2180: #define tcg_gen_add_ptr tcg_gen_add_i64
2181: #define tcg_gen_addi_ptr tcg_gen_addi_i64
2182: #define tcg_gen_ext_i32_ptr tcg_gen_ext_i32_i64
2183: #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.