|
|
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:
1.1.1.4 root 28: static inline void tcg_gen_op1_i32(TCGOpcode opc, TCGv_i32 arg1)
1.1 root 29: {
30: *gen_opc_ptr++ = opc;
31: *gen_opparam_ptr++ = GET_TCGV_I32(arg1);
32: }
33:
1.1.1.4 root 34: static inline void tcg_gen_op1_i64(TCGOpcode opc, TCGv_i64 arg1)
1.1 root 35: {
36: *gen_opc_ptr++ = opc;
37: *gen_opparam_ptr++ = GET_TCGV_I64(arg1);
38: }
39:
1.1.1.4 root 40: static inline void tcg_gen_op1i(TCGOpcode opc, TCGArg arg1)
1.1 root 41: {
42: *gen_opc_ptr++ = opc;
43: *gen_opparam_ptr++ = arg1;
44: }
45:
1.1.1.4 root 46: static inline void tcg_gen_op2_i32(TCGOpcode opc, TCGv_i32 arg1, TCGv_i32 arg2)
1.1 root 47: {
48: *gen_opc_ptr++ = opc;
49: *gen_opparam_ptr++ = GET_TCGV_I32(arg1);
50: *gen_opparam_ptr++ = GET_TCGV_I32(arg2);
51: }
52:
1.1.1.4 root 53: static inline void tcg_gen_op2_i64(TCGOpcode opc, TCGv_i64 arg1, TCGv_i64 arg2)
1.1 root 54: {
55: *gen_opc_ptr++ = opc;
56: *gen_opparam_ptr++ = GET_TCGV_I64(arg1);
57: *gen_opparam_ptr++ = GET_TCGV_I64(arg2);
58: }
59:
1.1.1.4 root 60: static inline void tcg_gen_op2i_i32(TCGOpcode opc, TCGv_i32 arg1, TCGArg arg2)
1.1 root 61: {
62: *gen_opc_ptr++ = opc;
63: *gen_opparam_ptr++ = GET_TCGV_I32(arg1);
64: *gen_opparam_ptr++ = arg2;
65: }
66:
1.1.1.4 root 67: static inline void tcg_gen_op2i_i64(TCGOpcode opc, TCGv_i64 arg1, TCGArg arg2)
1.1 root 68: {
69: *gen_opc_ptr++ = opc;
70: *gen_opparam_ptr++ = GET_TCGV_I64(arg1);
71: *gen_opparam_ptr++ = arg2;
72: }
73:
1.1.1.4 root 74: static inline void tcg_gen_op2ii(TCGOpcode opc, TCGArg arg1, TCGArg arg2)
1.1 root 75: {
76: *gen_opc_ptr++ = opc;
77: *gen_opparam_ptr++ = arg1;
78: *gen_opparam_ptr++ = arg2;
79: }
80:
1.1.1.4 root 81: static inline void tcg_gen_op3_i32(TCGOpcode opc, TCGv_i32 arg1, TCGv_i32 arg2,
1.1 root 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:
1.1.1.4 root 90: static inline void tcg_gen_op3_i64(TCGOpcode opc, TCGv_i64 arg1, TCGv_i64 arg2,
1.1 root 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:
1.1.1.4 root 99: static inline void tcg_gen_op3i_i32(TCGOpcode opc, TCGv_i32 arg1,
100: TCGv_i32 arg2, TCGArg arg3)
1.1 root 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:
1.1.1.4 root 108: static inline void tcg_gen_op3i_i64(TCGOpcode opc, TCGv_i64 arg1,
109: TCGv_i64 arg2, TCGArg arg3)
1.1 root 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:
1.1.1.4 root 117: static inline void tcg_gen_ldst_op_i32(TCGOpcode opc, TCGv_i32 val,
118: TCGv_ptr base, TCGArg offset)
1.1 root 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:
1.1.1.4 root 126: static inline void tcg_gen_ldst_op_i64(TCGOpcode opc, TCGv_i64 val,
127: TCGv_ptr base, TCGArg offset)
1.1 root 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:
1.1.1.4 root 135: static inline void tcg_gen_qemu_ldst_op_i64_i32(TCGOpcode opc, TCGv_i64 val,
136: TCGv_i32 addr, TCGArg mem_index)
1.1 root 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:
1.1.1.4 root 144: static inline void tcg_gen_qemu_ldst_op_i64_i64(TCGOpcode opc, TCGv_i64 val,
145: TCGv_i64 addr, TCGArg mem_index)
1.1 root 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:
1.1.1.4 root 153: static inline void tcg_gen_op4_i32(TCGOpcode opc, TCGv_i32 arg1, TCGv_i32 arg2,
1.1 root 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:
1.1.1.4 root 163: static inline void tcg_gen_op4_i64(TCGOpcode opc, TCGv_i64 arg1, TCGv_i64 arg2,
1.1 root 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:
1.1.1.4 root 173: static inline void tcg_gen_op4i_i32(TCGOpcode opc, TCGv_i32 arg1, TCGv_i32 arg2,
1.1 root 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:
1.1.1.4 root 183: static inline void tcg_gen_op4i_i64(TCGOpcode opc, TCGv_i64 arg1, TCGv_i64 arg2,
1.1 root 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:
1.1.1.4 root 193: static inline void tcg_gen_op4ii_i32(TCGOpcode opc, TCGv_i32 arg1, TCGv_i32 arg2,
1.1 root 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:
1.1.1.4 root 203: static inline void tcg_gen_op4ii_i64(TCGOpcode opc, TCGv_i64 arg1, TCGv_i64 arg2,
1.1 root 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:
1.1.1.4 root 213: static inline void tcg_gen_op5_i32(TCGOpcode opc, TCGv_i32 arg1, TCGv_i32 arg2,
1.1 root 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:
1.1.1.4 root 224: static inline void tcg_gen_op5_i64(TCGOpcode opc, TCGv_i64 arg1, TCGv_i64 arg2,
1.1 root 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:
1.1.1.4 root 235: static inline void tcg_gen_op5i_i32(TCGOpcode opc, TCGv_i32 arg1, TCGv_i32 arg2,
1.1 root 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:
1.1.1.4 root 246: static inline void tcg_gen_op5i_i64(TCGOpcode opc, TCGv_i64 arg1, TCGv_i64 arg2,
1.1 root 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:
1.1.1.5 ! root 257: static inline void tcg_gen_op5ii_i32(TCGOpcode opc, TCGv_i32 arg1,
! 258: TCGv_i32 arg2, TCGv_i32 arg3,
! 259: TCGArg arg4, TCGArg arg5)
! 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++ = arg4;
! 266: *gen_opparam_ptr++ = arg5;
! 267: }
! 268:
! 269: static inline void tcg_gen_op5ii_i64(TCGOpcode opc, TCGv_i64 arg1,
! 270: TCGv_i64 arg2, TCGv_i64 arg3,
! 271: TCGArg arg4, TCGArg arg5)
! 272: {
! 273: *gen_opc_ptr++ = opc;
! 274: *gen_opparam_ptr++ = GET_TCGV_I64(arg1);
! 275: *gen_opparam_ptr++ = GET_TCGV_I64(arg2);
! 276: *gen_opparam_ptr++ = GET_TCGV_I64(arg3);
! 277: *gen_opparam_ptr++ = arg4;
! 278: *gen_opparam_ptr++ = arg5;
! 279: }
! 280:
1.1.1.4 root 281: static inline void tcg_gen_op6_i32(TCGOpcode opc, TCGv_i32 arg1, TCGv_i32 arg2,
1.1 root 282: TCGv_i32 arg3, TCGv_i32 arg4, TCGv_i32 arg5,
283: TCGv_i32 arg6)
284: {
285: *gen_opc_ptr++ = opc;
286: *gen_opparam_ptr++ = GET_TCGV_I32(arg1);
287: *gen_opparam_ptr++ = GET_TCGV_I32(arg2);
288: *gen_opparam_ptr++ = GET_TCGV_I32(arg3);
289: *gen_opparam_ptr++ = GET_TCGV_I32(arg4);
290: *gen_opparam_ptr++ = GET_TCGV_I32(arg5);
291: *gen_opparam_ptr++ = GET_TCGV_I32(arg6);
292: }
293:
1.1.1.4 root 294: static inline void tcg_gen_op6_i64(TCGOpcode opc, TCGv_i64 arg1, TCGv_i64 arg2,
1.1 root 295: TCGv_i64 arg3, TCGv_i64 arg4, TCGv_i64 arg5,
296: TCGv_i64 arg6)
297: {
298: *gen_opc_ptr++ = opc;
299: *gen_opparam_ptr++ = GET_TCGV_I64(arg1);
300: *gen_opparam_ptr++ = GET_TCGV_I64(arg2);
301: *gen_opparam_ptr++ = GET_TCGV_I64(arg3);
302: *gen_opparam_ptr++ = GET_TCGV_I64(arg4);
303: *gen_opparam_ptr++ = GET_TCGV_I64(arg5);
304: *gen_opparam_ptr++ = GET_TCGV_I64(arg6);
305: }
306:
1.1.1.4 root 307: static inline void tcg_gen_op6i_i32(TCGOpcode opc, TCGv_i32 arg1, TCGv_i32 arg2,
308: TCGv_i32 arg3, TCGv_i32 arg4,
309: TCGv_i32 arg5, TCGArg arg6)
310: {
311: *gen_opc_ptr++ = opc;
312: *gen_opparam_ptr++ = GET_TCGV_I32(arg1);
313: *gen_opparam_ptr++ = GET_TCGV_I32(arg2);
314: *gen_opparam_ptr++ = GET_TCGV_I32(arg3);
315: *gen_opparam_ptr++ = GET_TCGV_I32(arg4);
316: *gen_opparam_ptr++ = GET_TCGV_I32(arg5);
317: *gen_opparam_ptr++ = arg6;
318: }
319:
320: static inline void tcg_gen_op6i_i64(TCGOpcode opc, TCGv_i64 arg1, TCGv_i64 arg2,
321: TCGv_i64 arg3, TCGv_i64 arg4,
322: TCGv_i64 arg5, TCGArg arg6)
323: {
324: *gen_opc_ptr++ = opc;
325: *gen_opparam_ptr++ = GET_TCGV_I64(arg1);
326: *gen_opparam_ptr++ = GET_TCGV_I64(arg2);
327: *gen_opparam_ptr++ = GET_TCGV_I64(arg3);
328: *gen_opparam_ptr++ = GET_TCGV_I64(arg4);
329: *gen_opparam_ptr++ = GET_TCGV_I64(arg5);
330: *gen_opparam_ptr++ = arg6;
331: }
332:
333: static inline void tcg_gen_op6ii_i32(TCGOpcode opc, TCGv_i32 arg1,
334: TCGv_i32 arg2, TCGv_i32 arg3,
335: TCGv_i32 arg4, TCGArg arg5, TCGArg arg6)
1.1 root 336: {
337: *gen_opc_ptr++ = opc;
338: *gen_opparam_ptr++ = GET_TCGV_I32(arg1);
339: *gen_opparam_ptr++ = GET_TCGV_I32(arg2);
340: *gen_opparam_ptr++ = GET_TCGV_I32(arg3);
341: *gen_opparam_ptr++ = GET_TCGV_I32(arg4);
342: *gen_opparam_ptr++ = arg5;
343: *gen_opparam_ptr++ = arg6;
344: }
345:
1.1.1.4 root 346: static inline void tcg_gen_op6ii_i64(TCGOpcode opc, TCGv_i64 arg1,
347: TCGv_i64 arg2, TCGv_i64 arg3,
348: TCGv_i64 arg4, TCGArg arg5, TCGArg arg6)
1.1 root 349: {
350: *gen_opc_ptr++ = opc;
351: *gen_opparam_ptr++ = GET_TCGV_I64(arg1);
352: *gen_opparam_ptr++ = GET_TCGV_I64(arg2);
353: *gen_opparam_ptr++ = GET_TCGV_I64(arg3);
354: *gen_opparam_ptr++ = GET_TCGV_I64(arg4);
355: *gen_opparam_ptr++ = arg5;
356: *gen_opparam_ptr++ = arg6;
357: }
358:
359: static inline void gen_set_label(int n)
360: {
361: tcg_gen_op1i(INDEX_op_set_label, n);
362: }
363:
364: static inline void tcg_gen_br(int label)
365: {
366: tcg_gen_op1i(INDEX_op_br, label);
367: }
368:
369: static inline void tcg_gen_mov_i32(TCGv_i32 ret, TCGv_i32 arg)
370: {
1.1.1.2 root 371: if (!TCGV_EQUAL_I32(ret, arg))
1.1 root 372: tcg_gen_op2_i32(INDEX_op_mov_i32, ret, arg);
373: }
374:
375: static inline void tcg_gen_movi_i32(TCGv_i32 ret, int32_t arg)
376: {
377: tcg_gen_op2i_i32(INDEX_op_movi_i32, ret, arg);
378: }
379:
1.1.1.4 root 380: /* A version of dh_sizemask from def-helper.h that doesn't rely on
381: preprocessor magic. */
382: static inline int tcg_gen_sizemask(int n, int is_64bit, int is_signed)
383: {
384: return (is_64bit << n*2) | (is_signed << (n*2 + 1));
385: }
386:
1.1 root 387: /* helper calls */
388: static inline void tcg_gen_helperN(void *func, int flags, int sizemask,
389: TCGArg ret, int nargs, TCGArg *args)
390: {
391: TCGv_ptr fn;
392: fn = tcg_const_ptr((tcg_target_long)func);
393: tcg_gen_callN(&tcg_ctx, fn, flags, sizemask, ret,
394: nargs, args);
395: tcg_temp_free_ptr(fn);
396: }
397:
1.1.1.4 root 398: /* Note: Both tcg_gen_helper32() and tcg_gen_helper64() are currently
399: reserved for helpers in tcg-runtime.c. These helpers are all const
400: and pure, hence the call to tcg_gen_callN() with TCG_CALL_CONST |
401: TCG_CALL_PURE. This may need to be adjusted if these functions
402: start to be used with other helpers. */
403: static inline void tcg_gen_helper32(void *func, int sizemask, TCGv_i32 ret,
404: TCGv_i32 a, TCGv_i32 b)
405: {
406: TCGv_ptr fn;
407: TCGArg args[2];
408: fn = tcg_const_ptr((tcg_target_long)func);
409: args[0] = GET_TCGV_I32(a);
410: args[1] = GET_TCGV_I32(b);
411: tcg_gen_callN(&tcg_ctx, fn, TCG_CALL_CONST | TCG_CALL_PURE, sizemask,
412: GET_TCGV_I32(ret), 2, args);
413: tcg_temp_free_ptr(fn);
414: }
415:
416: static inline void tcg_gen_helper64(void *func, int sizemask, TCGv_i64 ret,
1.1 root 417: TCGv_i64 a, TCGv_i64 b)
418: {
419: TCGv_ptr fn;
420: TCGArg args[2];
421: fn = tcg_const_ptr((tcg_target_long)func);
422: args[0] = GET_TCGV_I64(a);
423: args[1] = GET_TCGV_I64(b);
1.1.1.4 root 424: tcg_gen_callN(&tcg_ctx, fn, TCG_CALL_CONST | TCG_CALL_PURE, sizemask,
425: GET_TCGV_I64(ret), 2, args);
1.1 root 426: tcg_temp_free_ptr(fn);
427: }
428:
429: /* 32 bit ops */
430:
431: static inline void tcg_gen_ld8u_i32(TCGv_i32 ret, TCGv_ptr arg2, tcg_target_long offset)
432: {
433: tcg_gen_ldst_op_i32(INDEX_op_ld8u_i32, ret, arg2, offset);
434: }
435:
436: static inline void tcg_gen_ld8s_i32(TCGv_i32 ret, TCGv_ptr arg2, tcg_target_long offset)
437: {
438: tcg_gen_ldst_op_i32(INDEX_op_ld8s_i32, ret, arg2, offset);
439: }
440:
441: static inline void tcg_gen_ld16u_i32(TCGv_i32 ret, TCGv_ptr arg2, tcg_target_long offset)
442: {
443: tcg_gen_ldst_op_i32(INDEX_op_ld16u_i32, ret, arg2, offset);
444: }
445:
446: static inline void tcg_gen_ld16s_i32(TCGv_i32 ret, TCGv_ptr arg2, tcg_target_long offset)
447: {
448: tcg_gen_ldst_op_i32(INDEX_op_ld16s_i32, ret, arg2, offset);
449: }
450:
451: static inline void tcg_gen_ld_i32(TCGv_i32 ret, TCGv_ptr arg2, tcg_target_long offset)
452: {
453: tcg_gen_ldst_op_i32(INDEX_op_ld_i32, ret, arg2, offset);
454: }
455:
456: static inline void tcg_gen_st8_i32(TCGv_i32 arg1, TCGv_ptr arg2, tcg_target_long offset)
457: {
458: tcg_gen_ldst_op_i32(INDEX_op_st8_i32, arg1, arg2, offset);
459: }
460:
461: static inline void tcg_gen_st16_i32(TCGv_i32 arg1, TCGv_ptr arg2, tcg_target_long offset)
462: {
463: tcg_gen_ldst_op_i32(INDEX_op_st16_i32, arg1, arg2, offset);
464: }
465:
466: static inline void tcg_gen_st_i32(TCGv_i32 arg1, TCGv_ptr arg2, tcg_target_long offset)
467: {
468: tcg_gen_ldst_op_i32(INDEX_op_st_i32, arg1, arg2, offset);
469: }
470:
471: static inline void tcg_gen_add_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
472: {
473: tcg_gen_op3_i32(INDEX_op_add_i32, ret, arg1, arg2);
474: }
475:
476: static inline void tcg_gen_addi_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2)
477: {
478: /* some cases can be optimized here */
479: if (arg2 == 0) {
480: tcg_gen_mov_i32(ret, arg1);
481: } else {
482: TCGv_i32 t0 = tcg_const_i32(arg2);
483: tcg_gen_add_i32(ret, arg1, t0);
484: tcg_temp_free_i32(t0);
485: }
486: }
487:
488: static inline void tcg_gen_sub_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
489: {
490: tcg_gen_op3_i32(INDEX_op_sub_i32, ret, arg1, arg2);
491: }
492:
493: static inline void tcg_gen_subfi_i32(TCGv_i32 ret, int32_t arg1, TCGv_i32 arg2)
494: {
495: TCGv_i32 t0 = tcg_const_i32(arg1);
496: tcg_gen_sub_i32(ret, t0, arg2);
497: tcg_temp_free_i32(t0);
498: }
499:
500: static inline void tcg_gen_subi_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2)
501: {
502: /* some cases can be optimized here */
503: if (arg2 == 0) {
504: tcg_gen_mov_i32(ret, arg1);
505: } else {
506: TCGv_i32 t0 = tcg_const_i32(arg2);
507: tcg_gen_sub_i32(ret, arg1, t0);
508: tcg_temp_free_i32(t0);
509: }
510: }
511:
512: static inline void tcg_gen_and_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
513: {
1.1.1.2 root 514: if (TCGV_EQUAL_I32(arg1, arg2)) {
515: tcg_gen_mov_i32(ret, arg1);
516: } else {
517: tcg_gen_op3_i32(INDEX_op_and_i32, ret, arg1, arg2);
518: }
1.1 root 519: }
520:
521: static inline void tcg_gen_andi_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2)
522: {
523: /* some cases can be optimized here */
524: if (arg2 == 0) {
525: tcg_gen_movi_i32(ret, 0);
526: } else if (arg2 == 0xffffffff) {
527: tcg_gen_mov_i32(ret, arg1);
528: } else {
529: TCGv_i32 t0 = tcg_const_i32(arg2);
530: tcg_gen_and_i32(ret, arg1, t0);
531: tcg_temp_free_i32(t0);
532: }
533: }
534:
535: static inline void tcg_gen_or_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
536: {
1.1.1.2 root 537: if (TCGV_EQUAL_I32(arg1, arg2)) {
538: tcg_gen_mov_i32(ret, arg1);
539: } else {
540: tcg_gen_op3_i32(INDEX_op_or_i32, ret, arg1, arg2);
541: }
1.1 root 542: }
543:
544: static inline void tcg_gen_ori_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2)
545: {
546: /* some cases can be optimized here */
547: if (arg2 == 0xffffffff) {
548: tcg_gen_movi_i32(ret, 0xffffffff);
549: } else if (arg2 == 0) {
550: tcg_gen_mov_i32(ret, arg1);
551: } else {
552: TCGv_i32 t0 = tcg_const_i32(arg2);
553: tcg_gen_or_i32(ret, arg1, t0);
554: tcg_temp_free_i32(t0);
555: }
556: }
557:
558: static inline void tcg_gen_xor_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
559: {
1.1.1.2 root 560: if (TCGV_EQUAL_I32(arg1, arg2)) {
561: tcg_gen_movi_i32(ret, 0);
562: } else {
563: tcg_gen_op3_i32(INDEX_op_xor_i32, ret, arg1, arg2);
564: }
1.1 root 565: }
566:
567: static inline void tcg_gen_xori_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2)
568: {
569: /* some cases can be optimized here */
570: if (arg2 == 0) {
571: tcg_gen_mov_i32(ret, arg1);
572: } else {
573: TCGv_i32 t0 = tcg_const_i32(arg2);
574: tcg_gen_xor_i32(ret, arg1, t0);
575: tcg_temp_free_i32(t0);
576: }
577: }
578:
579: static inline void tcg_gen_shl_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
580: {
581: tcg_gen_op3_i32(INDEX_op_shl_i32, ret, arg1, arg2);
582: }
583:
584: static inline void tcg_gen_shli_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2)
585: {
586: if (arg2 == 0) {
587: tcg_gen_mov_i32(ret, arg1);
588: } else {
589: TCGv_i32 t0 = tcg_const_i32(arg2);
590: tcg_gen_shl_i32(ret, arg1, t0);
591: tcg_temp_free_i32(t0);
592: }
593: }
594:
595: static inline void tcg_gen_shr_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
596: {
597: tcg_gen_op3_i32(INDEX_op_shr_i32, ret, arg1, arg2);
598: }
599:
600: static inline void tcg_gen_shri_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2)
601: {
602: if (arg2 == 0) {
603: tcg_gen_mov_i32(ret, arg1);
604: } else {
605: TCGv_i32 t0 = tcg_const_i32(arg2);
606: tcg_gen_shr_i32(ret, arg1, t0);
607: tcg_temp_free_i32(t0);
608: }
609: }
610:
611: static inline void tcg_gen_sar_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
612: {
613: tcg_gen_op3_i32(INDEX_op_sar_i32, ret, arg1, arg2);
614: }
615:
616: static inline void tcg_gen_sari_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2)
617: {
618: if (arg2 == 0) {
619: tcg_gen_mov_i32(ret, arg1);
620: } else {
621: TCGv_i32 t0 = tcg_const_i32(arg2);
622: tcg_gen_sar_i32(ret, arg1, t0);
623: tcg_temp_free_i32(t0);
624: }
625: }
626:
1.1.1.4 root 627: static inline void tcg_gen_brcond_i32(TCGCond cond, TCGv_i32 arg1,
628: TCGv_i32 arg2, int label_index)
1.1 root 629: {
630: tcg_gen_op4ii_i32(INDEX_op_brcond_i32, arg1, arg2, cond, label_index);
631: }
632:
1.1.1.4 root 633: static inline void tcg_gen_brcondi_i32(TCGCond cond, TCGv_i32 arg1,
634: int32_t arg2, int label_index)
1.1 root 635: {
636: TCGv_i32 t0 = tcg_const_i32(arg2);
637: tcg_gen_brcond_i32(cond, arg1, t0, label_index);
638: tcg_temp_free_i32(t0);
639: }
640:
1.1.1.4 root 641: static inline void tcg_gen_setcond_i32(TCGCond cond, TCGv_i32 ret,
642: TCGv_i32 arg1, TCGv_i32 arg2)
643: {
644: tcg_gen_op4i_i32(INDEX_op_setcond_i32, ret, arg1, arg2, cond);
645: }
646:
647: static inline void tcg_gen_setcondi_i32(TCGCond cond, TCGv_i32 ret,
648: TCGv_i32 arg1, int32_t arg2)
649: {
650: TCGv_i32 t0 = tcg_const_i32(arg2);
651: tcg_gen_setcond_i32(cond, ret, arg1, t0);
652: tcg_temp_free_i32(t0);
653: }
654:
1.1 root 655: static inline void tcg_gen_mul_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
656: {
657: tcg_gen_op3_i32(INDEX_op_mul_i32, ret, arg1, arg2);
658: }
659:
660: static inline void tcg_gen_muli_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2)
661: {
662: TCGv_i32 t0 = tcg_const_i32(arg2);
663: tcg_gen_mul_i32(ret, arg1, t0);
664: tcg_temp_free_i32(t0);
665: }
666:
667: #ifdef TCG_TARGET_HAS_div_i32
668: static inline void tcg_gen_div_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
669: {
670: tcg_gen_op3_i32(INDEX_op_div_i32, ret, arg1, arg2);
671: }
672:
673: static inline void tcg_gen_rem_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
674: {
675: tcg_gen_op3_i32(INDEX_op_rem_i32, ret, arg1, arg2);
676: }
677:
678: static inline void tcg_gen_divu_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
679: {
680: tcg_gen_op3_i32(INDEX_op_divu_i32, ret, arg1, arg2);
681: }
682:
683: static inline void tcg_gen_remu_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
684: {
685: tcg_gen_op3_i32(INDEX_op_remu_i32, ret, arg1, arg2);
686: }
1.1.1.4 root 687: #elif defined(TCG_TARGET_HAS_div2_i32)
1.1 root 688: static inline void tcg_gen_div_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
689: {
690: TCGv_i32 t0;
691: t0 = tcg_temp_new_i32();
692: tcg_gen_sari_i32(t0, arg1, 31);
693: tcg_gen_op5_i32(INDEX_op_div2_i32, ret, t0, arg1, t0, arg2);
694: tcg_temp_free_i32(t0);
695: }
696:
697: static inline void tcg_gen_rem_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
698: {
699: TCGv_i32 t0;
700: t0 = tcg_temp_new_i32();
701: tcg_gen_sari_i32(t0, arg1, 31);
702: tcg_gen_op5_i32(INDEX_op_div2_i32, t0, ret, arg1, t0, arg2);
703: tcg_temp_free_i32(t0);
704: }
705:
706: static inline void tcg_gen_divu_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
707: {
708: TCGv_i32 t0;
709: t0 = tcg_temp_new_i32();
710: tcg_gen_movi_i32(t0, 0);
711: tcg_gen_op5_i32(INDEX_op_divu2_i32, ret, t0, arg1, t0, arg2);
712: tcg_temp_free_i32(t0);
713: }
714:
715: static inline void tcg_gen_remu_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
716: {
717: TCGv_i32 t0;
718: t0 = tcg_temp_new_i32();
719: tcg_gen_movi_i32(t0, 0);
720: tcg_gen_op5_i32(INDEX_op_divu2_i32, t0, ret, arg1, t0, arg2);
721: tcg_temp_free_i32(t0);
722: }
1.1.1.4 root 723: #else
724: static inline void tcg_gen_div_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
725: {
726: int sizemask = 0;
727: /* Return value and both arguments are 32-bit and signed. */
728: sizemask |= tcg_gen_sizemask(0, 0, 1);
729: sizemask |= tcg_gen_sizemask(1, 0, 1);
730: sizemask |= tcg_gen_sizemask(2, 0, 1);
731:
732: tcg_gen_helper32(tcg_helper_div_i32, sizemask, ret, arg1, arg2);
733: }
734:
735: static inline void tcg_gen_rem_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
736: {
737: int sizemask = 0;
738: /* Return value and both arguments are 32-bit and signed. */
739: sizemask |= tcg_gen_sizemask(0, 0, 1);
740: sizemask |= tcg_gen_sizemask(1, 0, 1);
741: sizemask |= tcg_gen_sizemask(2, 0, 1);
742:
743: tcg_gen_helper32(tcg_helper_rem_i32, sizemask, ret, arg1, arg2);
744: }
745:
746: static inline void tcg_gen_divu_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
747: {
748: int sizemask = 0;
749: /* Return value and both arguments are 32-bit and unsigned. */
750: sizemask |= tcg_gen_sizemask(0, 0, 0);
751: sizemask |= tcg_gen_sizemask(1, 0, 0);
752: sizemask |= tcg_gen_sizemask(2, 0, 0);
753:
1.1.1.5 ! root 754: tcg_gen_helper32(tcg_helper_divu_i32, sizemask, ret, arg1, arg2);
1.1.1.4 root 755: }
756:
757: static inline void tcg_gen_remu_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
758: {
759: int sizemask = 0;
760: /* Return value and both arguments are 32-bit and unsigned. */
761: sizemask |= tcg_gen_sizemask(0, 0, 0);
762: sizemask |= tcg_gen_sizemask(1, 0, 0);
763: sizemask |= tcg_gen_sizemask(2, 0, 0);
764:
1.1.1.5 ! root 765: tcg_gen_helper32(tcg_helper_remu_i32, sizemask, ret, arg1, arg2);
1.1.1.4 root 766: }
1.1 root 767: #endif
768:
769: #if TCG_TARGET_REG_BITS == 32
770:
771: static inline void tcg_gen_mov_i64(TCGv_i64 ret, TCGv_i64 arg)
772: {
1.1.1.2 root 773: if (!TCGV_EQUAL_I64(ret, arg)) {
1.1 root 774: tcg_gen_mov_i32(TCGV_LOW(ret), TCGV_LOW(arg));
775: tcg_gen_mov_i32(TCGV_HIGH(ret), TCGV_HIGH(arg));
776: }
777: }
778:
779: static inline void tcg_gen_movi_i64(TCGv_i64 ret, int64_t arg)
780: {
781: tcg_gen_movi_i32(TCGV_LOW(ret), arg);
782: tcg_gen_movi_i32(TCGV_HIGH(ret), arg >> 32);
783: }
784:
785: static inline void tcg_gen_ld8u_i64(TCGv_i64 ret, TCGv_ptr arg2,
786: tcg_target_long offset)
787: {
788: tcg_gen_ld8u_i32(TCGV_LOW(ret), arg2, offset);
789: tcg_gen_movi_i32(TCGV_HIGH(ret), 0);
790: }
791:
792: static inline void tcg_gen_ld8s_i64(TCGv_i64 ret, TCGv_ptr arg2,
793: tcg_target_long offset)
794: {
795: tcg_gen_ld8s_i32(TCGV_LOW(ret), arg2, offset);
796: tcg_gen_sari_i32(TCGV_HIGH(ret), TCGV_HIGH(ret), 31);
797: }
798:
799: static inline void tcg_gen_ld16u_i64(TCGv_i64 ret, TCGv_ptr arg2,
800: tcg_target_long offset)
801: {
802: tcg_gen_ld16u_i32(TCGV_LOW(ret), arg2, offset);
803: tcg_gen_movi_i32(TCGV_HIGH(ret), 0);
804: }
805:
806: static inline void tcg_gen_ld16s_i64(TCGv_i64 ret, TCGv_ptr arg2,
807: tcg_target_long offset)
808: {
809: tcg_gen_ld16s_i32(TCGV_LOW(ret), arg2, offset);
810: tcg_gen_sari_i32(TCGV_HIGH(ret), TCGV_LOW(ret), 31);
811: }
812:
813: static inline void tcg_gen_ld32u_i64(TCGv_i64 ret, TCGv_ptr arg2,
814: tcg_target_long offset)
815: {
816: tcg_gen_ld_i32(TCGV_LOW(ret), arg2, offset);
817: tcg_gen_movi_i32(TCGV_HIGH(ret), 0);
818: }
819:
820: static inline void tcg_gen_ld32s_i64(TCGv_i64 ret, TCGv_ptr arg2,
821: tcg_target_long offset)
822: {
823: tcg_gen_ld_i32(TCGV_LOW(ret), arg2, offset);
824: tcg_gen_sari_i32(TCGV_HIGH(ret), TCGV_LOW(ret), 31);
825: }
826:
827: static inline void tcg_gen_ld_i64(TCGv_i64 ret, TCGv_ptr arg2,
828: tcg_target_long offset)
829: {
830: /* since arg2 and ret have different types, they cannot be the
831: same temporary */
832: #ifdef TCG_TARGET_WORDS_BIGENDIAN
833: tcg_gen_ld_i32(TCGV_HIGH(ret), arg2, offset);
834: tcg_gen_ld_i32(TCGV_LOW(ret), arg2, offset + 4);
835: #else
836: tcg_gen_ld_i32(TCGV_LOW(ret), arg2, offset);
837: tcg_gen_ld_i32(TCGV_HIGH(ret), arg2, offset + 4);
838: #endif
839: }
840:
841: static inline void tcg_gen_st8_i64(TCGv_i64 arg1, TCGv_ptr arg2,
842: tcg_target_long offset)
843: {
844: tcg_gen_st8_i32(TCGV_LOW(arg1), arg2, offset);
845: }
846:
847: static inline void tcg_gen_st16_i64(TCGv_i64 arg1, TCGv_ptr arg2,
848: tcg_target_long offset)
849: {
850: tcg_gen_st16_i32(TCGV_LOW(arg1), arg2, offset);
851: }
852:
853: static inline void tcg_gen_st32_i64(TCGv_i64 arg1, TCGv_ptr arg2,
854: tcg_target_long offset)
855: {
856: tcg_gen_st_i32(TCGV_LOW(arg1), arg2, offset);
857: }
858:
859: static inline void tcg_gen_st_i64(TCGv_i64 arg1, TCGv_ptr arg2,
860: tcg_target_long offset)
861: {
862: #ifdef TCG_TARGET_WORDS_BIGENDIAN
863: tcg_gen_st_i32(TCGV_HIGH(arg1), arg2, offset);
864: tcg_gen_st_i32(TCGV_LOW(arg1), arg2, offset + 4);
865: #else
866: tcg_gen_st_i32(TCGV_LOW(arg1), arg2, offset);
867: tcg_gen_st_i32(TCGV_HIGH(arg1), arg2, offset + 4);
868: #endif
869: }
870:
871: static inline void tcg_gen_add_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
872: {
873: tcg_gen_op6_i32(INDEX_op_add2_i32, TCGV_LOW(ret), TCGV_HIGH(ret),
874: TCGV_LOW(arg1), TCGV_HIGH(arg1), TCGV_LOW(arg2),
875: TCGV_HIGH(arg2));
876: }
877:
878: static inline void tcg_gen_sub_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
879: {
880: tcg_gen_op6_i32(INDEX_op_sub2_i32, TCGV_LOW(ret), TCGV_HIGH(ret),
881: TCGV_LOW(arg1), TCGV_HIGH(arg1), TCGV_LOW(arg2),
882: TCGV_HIGH(arg2));
883: }
884:
885: static inline void tcg_gen_and_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
886: {
887: tcg_gen_and_i32(TCGV_LOW(ret), TCGV_LOW(arg1), TCGV_LOW(arg2));
888: tcg_gen_and_i32(TCGV_HIGH(ret), TCGV_HIGH(arg1), TCGV_HIGH(arg2));
889: }
890:
891: static inline void tcg_gen_andi_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
892: {
893: tcg_gen_andi_i32(TCGV_LOW(ret), TCGV_LOW(arg1), arg2);
894: tcg_gen_andi_i32(TCGV_HIGH(ret), TCGV_HIGH(arg1), arg2 >> 32);
895: }
896:
897: static inline void tcg_gen_or_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
898: {
899: tcg_gen_or_i32(TCGV_LOW(ret), TCGV_LOW(arg1), TCGV_LOW(arg2));
900: tcg_gen_or_i32(TCGV_HIGH(ret), TCGV_HIGH(arg1), TCGV_HIGH(arg2));
901: }
902:
903: static inline void tcg_gen_ori_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
904: {
905: tcg_gen_ori_i32(TCGV_LOW(ret), TCGV_LOW(arg1), arg2);
906: tcg_gen_ori_i32(TCGV_HIGH(ret), TCGV_HIGH(arg1), arg2 >> 32);
907: }
908:
909: static inline void tcg_gen_xor_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
910: {
911: tcg_gen_xor_i32(TCGV_LOW(ret), TCGV_LOW(arg1), TCGV_LOW(arg2));
912: tcg_gen_xor_i32(TCGV_HIGH(ret), TCGV_HIGH(arg1), TCGV_HIGH(arg2));
913: }
914:
915: static inline void tcg_gen_xori_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
916: {
917: tcg_gen_xori_i32(TCGV_LOW(ret), TCGV_LOW(arg1), arg2);
918: tcg_gen_xori_i32(TCGV_HIGH(ret), TCGV_HIGH(arg1), arg2 >> 32);
919: }
920:
921: /* XXX: use generic code when basic block handling is OK or CPU
922: specific code (x86) */
923: static inline void tcg_gen_shl_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
924: {
1.1.1.4 root 925: int sizemask = 0;
926: /* Return value and both arguments are 64-bit and signed. */
927: sizemask |= tcg_gen_sizemask(0, 1, 1);
928: sizemask |= tcg_gen_sizemask(1, 1, 1);
929: sizemask |= tcg_gen_sizemask(2, 1, 1);
930:
931: tcg_gen_helper64(tcg_helper_shl_i64, sizemask, ret, arg1, arg2);
1.1 root 932: }
933:
934: static inline void tcg_gen_shli_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
935: {
936: tcg_gen_shifti_i64(ret, arg1, arg2, 0, 0);
937: }
938:
939: static inline void tcg_gen_shr_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
940: {
1.1.1.4 root 941: int sizemask = 0;
942: /* Return value and both arguments are 64-bit and signed. */
943: sizemask |= tcg_gen_sizemask(0, 1, 1);
944: sizemask |= tcg_gen_sizemask(1, 1, 1);
945: sizemask |= tcg_gen_sizemask(2, 1, 1);
946:
947: tcg_gen_helper64(tcg_helper_shr_i64, sizemask, ret, arg1, arg2);
1.1 root 948: }
949:
950: static inline void tcg_gen_shri_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
951: {
952: tcg_gen_shifti_i64(ret, arg1, arg2, 1, 0);
953: }
954:
955: static inline void tcg_gen_sar_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
956: {
1.1.1.4 root 957: int sizemask = 0;
958: /* Return value and both arguments are 64-bit and signed. */
959: sizemask |= tcg_gen_sizemask(0, 1, 1);
960: sizemask |= tcg_gen_sizemask(1, 1, 1);
961: sizemask |= tcg_gen_sizemask(2, 1, 1);
962:
963: tcg_gen_helper64(tcg_helper_sar_i64, sizemask, ret, arg1, arg2);
1.1 root 964: }
965:
966: static inline void tcg_gen_sari_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
967: {
968: tcg_gen_shifti_i64(ret, arg1, arg2, 1, 1);
969: }
970:
1.1.1.4 root 971: static inline void tcg_gen_brcond_i64(TCGCond cond, TCGv_i64 arg1,
972: TCGv_i64 arg2, int label_index)
1.1 root 973: {
974: tcg_gen_op6ii_i32(INDEX_op_brcond2_i32,
975: TCGV_LOW(arg1), TCGV_HIGH(arg1), TCGV_LOW(arg2),
976: TCGV_HIGH(arg2), cond, label_index);
977: }
978:
1.1.1.4 root 979: static inline void tcg_gen_setcond_i64(TCGCond cond, TCGv_i64 ret,
980: TCGv_i64 arg1, TCGv_i64 arg2)
981: {
982: tcg_gen_op6i_i32(INDEX_op_setcond2_i32, TCGV_LOW(ret),
983: TCGV_LOW(arg1), TCGV_HIGH(arg1),
984: TCGV_LOW(arg2), TCGV_HIGH(arg2), cond);
985: tcg_gen_movi_i32(TCGV_HIGH(ret), 0);
986: }
987:
1.1 root 988: static inline void tcg_gen_mul_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
989: {
990: TCGv_i64 t0;
991: TCGv_i32 t1;
992:
993: t0 = tcg_temp_new_i64();
994: t1 = tcg_temp_new_i32();
995:
996: tcg_gen_op4_i32(INDEX_op_mulu2_i32, TCGV_LOW(t0), TCGV_HIGH(t0),
997: TCGV_LOW(arg1), TCGV_LOW(arg2));
998:
999: tcg_gen_mul_i32(t1, TCGV_LOW(arg1), TCGV_HIGH(arg2));
1000: tcg_gen_add_i32(TCGV_HIGH(t0), TCGV_HIGH(t0), t1);
1001: tcg_gen_mul_i32(t1, TCGV_HIGH(arg1), TCGV_LOW(arg2));
1002: tcg_gen_add_i32(TCGV_HIGH(t0), TCGV_HIGH(t0), t1);
1003:
1004: tcg_gen_mov_i64(ret, t0);
1005: tcg_temp_free_i64(t0);
1006: tcg_temp_free_i32(t1);
1007: }
1008:
1009: static inline void tcg_gen_div_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1010: {
1.1.1.4 root 1011: int sizemask = 0;
1012: /* Return value and both arguments are 64-bit and signed. */
1013: sizemask |= tcg_gen_sizemask(0, 1, 1);
1014: sizemask |= tcg_gen_sizemask(1, 1, 1);
1015: sizemask |= tcg_gen_sizemask(2, 1, 1);
1016:
1017: tcg_gen_helper64(tcg_helper_div_i64, sizemask, ret, arg1, arg2);
1.1 root 1018: }
1019:
1020: static inline void tcg_gen_rem_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1021: {
1.1.1.4 root 1022: int sizemask = 0;
1023: /* Return value and both arguments are 64-bit and signed. */
1024: sizemask |= tcg_gen_sizemask(0, 1, 1);
1025: sizemask |= tcg_gen_sizemask(1, 1, 1);
1026: sizemask |= tcg_gen_sizemask(2, 1, 1);
1027:
1028: tcg_gen_helper64(tcg_helper_rem_i64, sizemask, ret, arg1, arg2);
1.1 root 1029: }
1030:
1031: static inline void tcg_gen_divu_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1032: {
1.1.1.4 root 1033: int sizemask = 0;
1034: /* Return value and both arguments are 64-bit and unsigned. */
1035: sizemask |= tcg_gen_sizemask(0, 1, 0);
1036: sizemask |= tcg_gen_sizemask(1, 1, 0);
1037: sizemask |= tcg_gen_sizemask(2, 1, 0);
1038:
1039: tcg_gen_helper64(tcg_helper_divu_i64, sizemask, ret, arg1, arg2);
1.1 root 1040: }
1041:
1042: static inline void tcg_gen_remu_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1043: {
1.1.1.4 root 1044: int sizemask = 0;
1045: /* Return value and both arguments are 64-bit and unsigned. */
1046: sizemask |= tcg_gen_sizemask(0, 1, 0);
1047: sizemask |= tcg_gen_sizemask(1, 1, 0);
1048: sizemask |= tcg_gen_sizemask(2, 1, 0);
1049:
1050: tcg_gen_helper64(tcg_helper_remu_i64, sizemask, ret, arg1, arg2);
1.1 root 1051: }
1052:
1053: #else
1054:
1055: static inline void tcg_gen_mov_i64(TCGv_i64 ret, TCGv_i64 arg)
1056: {
1.1.1.2 root 1057: if (!TCGV_EQUAL_I64(ret, arg))
1.1 root 1058: tcg_gen_op2_i64(INDEX_op_mov_i64, ret, arg);
1059: }
1060:
1061: static inline void tcg_gen_movi_i64(TCGv_i64 ret, int64_t arg)
1062: {
1063: tcg_gen_op2i_i64(INDEX_op_movi_i64, ret, arg);
1064: }
1065:
1066: static inline void tcg_gen_ld8u_i64(TCGv_i64 ret, TCGv_i64 arg2,
1067: tcg_target_long offset)
1068: {
1069: tcg_gen_ldst_op_i64(INDEX_op_ld8u_i64, ret, arg2, offset);
1070: }
1071:
1072: static inline void tcg_gen_ld8s_i64(TCGv_i64 ret, TCGv_i64 arg2,
1073: tcg_target_long offset)
1074: {
1075: tcg_gen_ldst_op_i64(INDEX_op_ld8s_i64, ret, arg2, offset);
1076: }
1077:
1078: static inline void tcg_gen_ld16u_i64(TCGv_i64 ret, TCGv_i64 arg2,
1079: tcg_target_long offset)
1080: {
1081: tcg_gen_ldst_op_i64(INDEX_op_ld16u_i64, ret, arg2, offset);
1082: }
1083:
1084: static inline void tcg_gen_ld16s_i64(TCGv_i64 ret, TCGv_i64 arg2,
1085: tcg_target_long offset)
1086: {
1087: tcg_gen_ldst_op_i64(INDEX_op_ld16s_i64, ret, arg2, offset);
1088: }
1089:
1090: static inline void tcg_gen_ld32u_i64(TCGv_i64 ret, TCGv_i64 arg2,
1091: tcg_target_long offset)
1092: {
1093: tcg_gen_ldst_op_i64(INDEX_op_ld32u_i64, ret, arg2, offset);
1094: }
1095:
1096: static inline void tcg_gen_ld32s_i64(TCGv_i64 ret, TCGv_i64 arg2,
1097: tcg_target_long offset)
1098: {
1099: tcg_gen_ldst_op_i64(INDEX_op_ld32s_i64, ret, arg2, offset);
1100: }
1101:
1102: static inline void tcg_gen_ld_i64(TCGv_i64 ret, TCGv_i64 arg2, tcg_target_long offset)
1103: {
1104: tcg_gen_ldst_op_i64(INDEX_op_ld_i64, ret, arg2, offset);
1105: }
1106:
1107: static inline void tcg_gen_st8_i64(TCGv_i64 arg1, TCGv_i64 arg2,
1108: tcg_target_long offset)
1109: {
1110: tcg_gen_ldst_op_i64(INDEX_op_st8_i64, arg1, arg2, offset);
1111: }
1112:
1113: static inline void tcg_gen_st16_i64(TCGv_i64 arg1, TCGv_i64 arg2,
1114: tcg_target_long offset)
1115: {
1116: tcg_gen_ldst_op_i64(INDEX_op_st16_i64, arg1, arg2, offset);
1117: }
1118:
1119: static inline void tcg_gen_st32_i64(TCGv_i64 arg1, TCGv_i64 arg2,
1120: tcg_target_long offset)
1121: {
1122: tcg_gen_ldst_op_i64(INDEX_op_st32_i64, arg1, arg2, offset);
1123: }
1124:
1125: static inline void tcg_gen_st_i64(TCGv_i64 arg1, TCGv_i64 arg2, tcg_target_long offset)
1126: {
1127: tcg_gen_ldst_op_i64(INDEX_op_st_i64, arg1, arg2, offset);
1128: }
1129:
1130: static inline void tcg_gen_add_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1131: {
1132: tcg_gen_op3_i64(INDEX_op_add_i64, ret, arg1, arg2);
1133: }
1134:
1135: static inline void tcg_gen_sub_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1136: {
1137: tcg_gen_op3_i64(INDEX_op_sub_i64, ret, arg1, arg2);
1138: }
1139:
1140: static inline void tcg_gen_and_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1141: {
1.1.1.2 root 1142: if (TCGV_EQUAL_I64(arg1, arg2)) {
1143: tcg_gen_mov_i64(ret, arg1);
1144: } else {
1145: tcg_gen_op3_i64(INDEX_op_and_i64, ret, arg1, arg2);
1146: }
1.1 root 1147: }
1148:
1149: static inline void tcg_gen_andi_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
1150: {
1151: TCGv_i64 t0 = tcg_const_i64(arg2);
1152: tcg_gen_and_i64(ret, arg1, t0);
1153: tcg_temp_free_i64(t0);
1154: }
1155:
1156: static inline void tcg_gen_or_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1157: {
1.1.1.2 root 1158: if (TCGV_EQUAL_I64(arg1, arg2)) {
1159: tcg_gen_mov_i64(ret, arg1);
1160: } else {
1161: tcg_gen_op3_i64(INDEX_op_or_i64, ret, arg1, arg2);
1162: }
1.1 root 1163: }
1164:
1165: static inline void tcg_gen_ori_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
1166: {
1167: TCGv_i64 t0 = tcg_const_i64(arg2);
1168: tcg_gen_or_i64(ret, arg1, t0);
1169: tcg_temp_free_i64(t0);
1170: }
1171:
1172: static inline void tcg_gen_xor_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1173: {
1.1.1.2 root 1174: if (TCGV_EQUAL_I64(arg1, arg2)) {
1175: tcg_gen_movi_i64(ret, 0);
1176: } else {
1177: tcg_gen_op3_i64(INDEX_op_xor_i64, ret, arg1, arg2);
1178: }
1.1 root 1179: }
1180:
1181: static inline void tcg_gen_xori_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
1182: {
1183: TCGv_i64 t0 = tcg_const_i64(arg2);
1184: tcg_gen_xor_i64(ret, arg1, t0);
1185: tcg_temp_free_i64(t0);
1186: }
1187:
1188: static inline void tcg_gen_shl_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1189: {
1190: tcg_gen_op3_i64(INDEX_op_shl_i64, ret, arg1, arg2);
1191: }
1192:
1193: static inline void tcg_gen_shli_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
1194: {
1195: if (arg2 == 0) {
1196: tcg_gen_mov_i64(ret, arg1);
1197: } else {
1198: TCGv_i64 t0 = tcg_const_i64(arg2);
1199: tcg_gen_shl_i64(ret, arg1, t0);
1200: tcg_temp_free_i64(t0);
1201: }
1202: }
1203:
1204: static inline void tcg_gen_shr_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1205: {
1206: tcg_gen_op3_i64(INDEX_op_shr_i64, ret, arg1, arg2);
1207: }
1208:
1209: static inline void tcg_gen_shri_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
1210: {
1211: if (arg2 == 0) {
1212: tcg_gen_mov_i64(ret, arg1);
1213: } else {
1214: TCGv_i64 t0 = tcg_const_i64(arg2);
1215: tcg_gen_shr_i64(ret, arg1, t0);
1216: tcg_temp_free_i64(t0);
1217: }
1218: }
1219:
1220: static inline void tcg_gen_sar_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1221: {
1222: tcg_gen_op3_i64(INDEX_op_sar_i64, ret, arg1, arg2);
1223: }
1224:
1225: static inline void tcg_gen_sari_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
1226: {
1227: if (arg2 == 0) {
1228: tcg_gen_mov_i64(ret, arg1);
1229: } else {
1230: TCGv_i64 t0 = tcg_const_i64(arg2);
1231: tcg_gen_sar_i64(ret, arg1, t0);
1232: tcg_temp_free_i64(t0);
1233: }
1234: }
1235:
1.1.1.4 root 1236: static inline void tcg_gen_brcond_i64(TCGCond cond, TCGv_i64 arg1,
1237: TCGv_i64 arg2, int label_index)
1.1 root 1238: {
1239: tcg_gen_op4ii_i64(INDEX_op_brcond_i64, arg1, arg2, cond, label_index);
1240: }
1241:
1.1.1.4 root 1242: static inline void tcg_gen_setcond_i64(TCGCond cond, TCGv_i64 ret,
1243: TCGv_i64 arg1, TCGv_i64 arg2)
1244: {
1245: tcg_gen_op4i_i64(INDEX_op_setcond_i64, ret, arg1, arg2, cond);
1246: }
1247:
1.1 root 1248: static inline void tcg_gen_mul_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1249: {
1250: tcg_gen_op3_i64(INDEX_op_mul_i64, ret, arg1, arg2);
1251: }
1252:
1253: #ifdef TCG_TARGET_HAS_div_i64
1254: static inline void tcg_gen_div_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1255: {
1256: tcg_gen_op3_i64(INDEX_op_div_i64, ret, arg1, arg2);
1257: }
1258:
1259: static inline void tcg_gen_rem_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1260: {
1261: tcg_gen_op3_i64(INDEX_op_rem_i64, ret, arg1, arg2);
1262: }
1263:
1264: static inline void tcg_gen_divu_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1265: {
1266: tcg_gen_op3_i64(INDEX_op_divu_i64, ret, arg1, arg2);
1267: }
1268:
1269: static inline void tcg_gen_remu_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1270: {
1271: tcg_gen_op3_i64(INDEX_op_remu_i64, ret, arg1, arg2);
1272: }
1.1.1.4 root 1273: #elif defined(TCG_TARGET_HAS_div2_i64)
1.1 root 1274: static inline void tcg_gen_div_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1275: {
1276: TCGv_i64 t0;
1277: t0 = tcg_temp_new_i64();
1278: tcg_gen_sari_i64(t0, arg1, 63);
1279: tcg_gen_op5_i64(INDEX_op_div2_i64, ret, t0, arg1, t0, arg2);
1280: tcg_temp_free_i64(t0);
1281: }
1282:
1283: static inline void tcg_gen_rem_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1284: {
1285: TCGv_i64 t0;
1286: t0 = tcg_temp_new_i64();
1287: tcg_gen_sari_i64(t0, arg1, 63);
1288: tcg_gen_op5_i64(INDEX_op_div2_i64, t0, ret, arg1, t0, arg2);
1289: tcg_temp_free_i64(t0);
1290: }
1291:
1292: static inline void tcg_gen_divu_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1293: {
1294: TCGv_i64 t0;
1295: t0 = tcg_temp_new_i64();
1296: tcg_gen_movi_i64(t0, 0);
1297: tcg_gen_op5_i64(INDEX_op_divu2_i64, ret, t0, arg1, t0, arg2);
1298: tcg_temp_free_i64(t0);
1299: }
1300:
1301: static inline void tcg_gen_remu_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1302: {
1303: TCGv_i64 t0;
1304: t0 = tcg_temp_new_i64();
1305: tcg_gen_movi_i64(t0, 0);
1306: tcg_gen_op5_i64(INDEX_op_divu2_i64, t0, ret, arg1, t0, arg2);
1307: tcg_temp_free_i64(t0);
1308: }
1.1.1.4 root 1309: #else
1310: static inline void tcg_gen_div_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1311: {
1312: int sizemask = 0;
1313: /* Return value and both arguments are 64-bit and signed. */
1314: sizemask |= tcg_gen_sizemask(0, 1, 1);
1315: sizemask |= tcg_gen_sizemask(1, 1, 1);
1316: sizemask |= tcg_gen_sizemask(2, 1, 1);
1317:
1318: tcg_gen_helper64(tcg_helper_div_i64, sizemask, ret, arg1, arg2);
1319: }
1320:
1321: static inline void tcg_gen_rem_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1322: {
1323: int sizemask = 0;
1324: /* Return value and both arguments are 64-bit and signed. */
1325: sizemask |= tcg_gen_sizemask(0, 1, 1);
1326: sizemask |= tcg_gen_sizemask(1, 1, 1);
1327: sizemask |= tcg_gen_sizemask(2, 1, 1);
1328:
1329: tcg_gen_helper64(tcg_helper_rem_i64, sizemask, ret, arg1, arg2);
1330: }
1331:
1332: static inline void tcg_gen_divu_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1333: {
1334: int sizemask = 0;
1335: /* Return value and both arguments are 64-bit and unsigned. */
1336: sizemask |= tcg_gen_sizemask(0, 1, 0);
1337: sizemask |= tcg_gen_sizemask(1, 1, 0);
1338: sizemask |= tcg_gen_sizemask(2, 1, 0);
1339:
1340: tcg_gen_helper64(tcg_helper_divu_i64, sizemask, ret, arg1, arg2);
1341: }
1342:
1343: static inline void tcg_gen_remu_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1344: {
1345: int sizemask = 0;
1346: /* Return value and both arguments are 64-bit and unsigned. */
1347: sizemask |= tcg_gen_sizemask(0, 1, 0);
1348: sizemask |= tcg_gen_sizemask(1, 1, 0);
1349: sizemask |= tcg_gen_sizemask(2, 1, 0);
1350:
1351: tcg_gen_helper64(tcg_helper_remu_i64, sizemask, ret, arg1, arg2);
1352: }
1.1 root 1353: #endif
1354:
1355: #endif
1356:
1357: static inline void tcg_gen_addi_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
1358: {
1359: /* some cases can be optimized here */
1360: if (arg2 == 0) {
1361: tcg_gen_mov_i64(ret, arg1);
1362: } else {
1363: TCGv_i64 t0 = tcg_const_i64(arg2);
1364: tcg_gen_add_i64(ret, arg1, t0);
1365: tcg_temp_free_i64(t0);
1366: }
1367: }
1368:
1369: static inline void tcg_gen_subfi_i64(TCGv_i64 ret, int64_t arg1, TCGv_i64 arg2)
1370: {
1371: TCGv_i64 t0 = tcg_const_i64(arg1);
1372: tcg_gen_sub_i64(ret, t0, arg2);
1373: tcg_temp_free_i64(t0);
1374: }
1375:
1376: static inline void tcg_gen_subi_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
1377: {
1378: /* some cases can be optimized here */
1379: if (arg2 == 0) {
1380: tcg_gen_mov_i64(ret, arg1);
1381: } else {
1382: TCGv_i64 t0 = tcg_const_i64(arg2);
1383: tcg_gen_sub_i64(ret, arg1, t0);
1384: tcg_temp_free_i64(t0);
1385: }
1386: }
1.1.1.4 root 1387: static inline void tcg_gen_brcondi_i64(TCGCond cond, TCGv_i64 arg1,
1388: int64_t arg2, int label_index)
1.1 root 1389: {
1390: TCGv_i64 t0 = tcg_const_i64(arg2);
1391: tcg_gen_brcond_i64(cond, arg1, t0, label_index);
1392: tcg_temp_free_i64(t0);
1393: }
1394:
1.1.1.4 root 1395: static inline void tcg_gen_setcondi_i64(TCGCond cond, TCGv_i64 ret,
1396: TCGv_i64 arg1, int64_t arg2)
1397: {
1398: TCGv_i64 t0 = tcg_const_i64(arg2);
1399: tcg_gen_setcond_i64(cond, ret, arg1, t0);
1400: tcg_temp_free_i64(t0);
1401: }
1402:
1.1 root 1403: static inline void tcg_gen_muli_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
1404: {
1405: TCGv_i64 t0 = tcg_const_i64(arg2);
1406: tcg_gen_mul_i64(ret, arg1, t0);
1407: tcg_temp_free_i64(t0);
1408: }
1409:
1410:
1411: /***************************************/
1412: /* optional operations */
1413:
1414: static inline void tcg_gen_ext8s_i32(TCGv_i32 ret, TCGv_i32 arg)
1415: {
1416: #ifdef TCG_TARGET_HAS_ext8s_i32
1417: tcg_gen_op2_i32(INDEX_op_ext8s_i32, ret, arg);
1418: #else
1419: tcg_gen_shli_i32(ret, arg, 24);
1420: tcg_gen_sari_i32(ret, ret, 24);
1421: #endif
1422: }
1423:
1424: static inline void tcg_gen_ext16s_i32(TCGv_i32 ret, TCGv_i32 arg)
1425: {
1426: #ifdef TCG_TARGET_HAS_ext16s_i32
1427: tcg_gen_op2_i32(INDEX_op_ext16s_i32, ret, arg);
1428: #else
1429: tcg_gen_shli_i32(ret, arg, 16);
1430: tcg_gen_sari_i32(ret, ret, 16);
1431: #endif
1432: }
1433:
1434: static inline void tcg_gen_ext8u_i32(TCGv_i32 ret, TCGv_i32 arg)
1435: {
1.1.1.3 root 1436: #ifdef TCG_TARGET_HAS_ext8u_i32
1437: tcg_gen_op2_i32(INDEX_op_ext8u_i32, ret, arg);
1438: #else
1.1 root 1439: tcg_gen_andi_i32(ret, arg, 0xffu);
1.1.1.3 root 1440: #endif
1.1 root 1441: }
1442:
1443: static inline void tcg_gen_ext16u_i32(TCGv_i32 ret, TCGv_i32 arg)
1444: {
1.1.1.3 root 1445: #ifdef TCG_TARGET_HAS_ext16u_i32
1446: tcg_gen_op2_i32(INDEX_op_ext16u_i32, ret, arg);
1447: #else
1.1 root 1448: tcg_gen_andi_i32(ret, arg, 0xffffu);
1.1.1.3 root 1449: #endif
1.1 root 1450: }
1451:
1452: /* Note: we assume the two high bytes are set to zero */
1453: static inline void tcg_gen_bswap16_i32(TCGv_i32 ret, TCGv_i32 arg)
1454: {
1455: #ifdef TCG_TARGET_HAS_bswap16_i32
1456: tcg_gen_op2_i32(INDEX_op_bswap16_i32, ret, arg);
1457: #else
1.1.1.2 root 1458: TCGv_i32 t0 = tcg_temp_new_i32();
1.1 root 1459:
1.1.1.2 root 1460: tcg_gen_ext8u_i32(t0, arg);
1461: tcg_gen_shli_i32(t0, t0, 8);
1462: tcg_gen_shri_i32(ret, arg, 8);
1463: tcg_gen_or_i32(ret, ret, t0);
1.1 root 1464: tcg_temp_free_i32(t0);
1465: #endif
1466: }
1467:
1.1.1.2 root 1468: static inline void tcg_gen_bswap32_i32(TCGv_i32 ret, TCGv_i32 arg)
1.1 root 1469: {
1.1.1.2 root 1470: #ifdef TCG_TARGET_HAS_bswap32_i32
1471: tcg_gen_op2_i32(INDEX_op_bswap32_i32, ret, arg);
1.1 root 1472: #else
1473: TCGv_i32 t0, t1;
1474: t0 = tcg_temp_new_i32();
1475: t1 = tcg_temp_new_i32();
1476:
1477: tcg_gen_shli_i32(t0, arg, 24);
1478:
1479: tcg_gen_andi_i32(t1, arg, 0x0000ff00);
1480: tcg_gen_shli_i32(t1, t1, 8);
1481: tcg_gen_or_i32(t0, t0, t1);
1482:
1483: tcg_gen_shri_i32(t1, arg, 8);
1484: tcg_gen_andi_i32(t1, t1, 0x0000ff00);
1485: tcg_gen_or_i32(t0, t0, t1);
1486:
1487: tcg_gen_shri_i32(t1, arg, 24);
1488: tcg_gen_or_i32(ret, t0, t1);
1489: tcg_temp_free_i32(t0);
1490: tcg_temp_free_i32(t1);
1491: #endif
1492: }
1493:
1494: #if TCG_TARGET_REG_BITS == 32
1495: static inline void tcg_gen_ext8s_i64(TCGv_i64 ret, TCGv_i64 arg)
1496: {
1497: tcg_gen_ext8s_i32(TCGV_LOW(ret), TCGV_LOW(arg));
1498: tcg_gen_sari_i32(TCGV_HIGH(ret), TCGV_LOW(ret), 31);
1499: }
1500:
1501: static inline void tcg_gen_ext16s_i64(TCGv_i64 ret, TCGv_i64 arg)
1502: {
1503: tcg_gen_ext16s_i32(TCGV_LOW(ret), TCGV_LOW(arg));
1504: tcg_gen_sari_i32(TCGV_HIGH(ret), TCGV_LOW(ret), 31);
1505: }
1506:
1507: static inline void tcg_gen_ext32s_i64(TCGv_i64 ret, TCGv_i64 arg)
1508: {
1509: tcg_gen_mov_i32(TCGV_LOW(ret), TCGV_LOW(arg));
1510: tcg_gen_sari_i32(TCGV_HIGH(ret), TCGV_LOW(ret), 31);
1511: }
1512:
1513: static inline void tcg_gen_ext8u_i64(TCGv_i64 ret, TCGv_i64 arg)
1514: {
1515: tcg_gen_ext8u_i32(TCGV_LOW(ret), TCGV_LOW(arg));
1516: tcg_gen_movi_i32(TCGV_HIGH(ret), 0);
1517: }
1518:
1519: static inline void tcg_gen_ext16u_i64(TCGv_i64 ret, TCGv_i64 arg)
1520: {
1521: tcg_gen_ext16u_i32(TCGV_LOW(ret), TCGV_LOW(arg));
1522: tcg_gen_movi_i32(TCGV_HIGH(ret), 0);
1523: }
1524:
1525: static inline void tcg_gen_ext32u_i64(TCGv_i64 ret, TCGv_i64 arg)
1526: {
1527: tcg_gen_mov_i32(TCGV_LOW(ret), TCGV_LOW(arg));
1528: tcg_gen_movi_i32(TCGV_HIGH(ret), 0);
1529: }
1530:
1531: static inline void tcg_gen_trunc_i64_i32(TCGv_i32 ret, TCGv_i64 arg)
1532: {
1533: tcg_gen_mov_i32(ret, TCGV_LOW(arg));
1534: }
1535:
1536: static inline void tcg_gen_extu_i32_i64(TCGv_i64 ret, TCGv_i32 arg)
1537: {
1538: tcg_gen_mov_i32(TCGV_LOW(ret), arg);
1539: tcg_gen_movi_i32(TCGV_HIGH(ret), 0);
1540: }
1541:
1542: static inline void tcg_gen_ext_i32_i64(TCGv_i64 ret, TCGv_i32 arg)
1543: {
1544: tcg_gen_mov_i32(TCGV_LOW(ret), arg);
1545: tcg_gen_sari_i32(TCGV_HIGH(ret), TCGV_LOW(ret), 31);
1546: }
1547:
1.1.1.2 root 1548: /* Note: we assume the six high bytes are set to zero */
1549: static inline void tcg_gen_bswap16_i64(TCGv_i64 ret, TCGv_i64 arg)
1550: {
1551: tcg_gen_mov_i32(TCGV_HIGH(ret), TCGV_HIGH(arg));
1552: tcg_gen_bswap16_i32(TCGV_LOW(ret), TCGV_LOW(arg));
1553: }
1554:
1555: /* Note: we assume the four high bytes are set to zero */
1556: static inline void tcg_gen_bswap32_i64(TCGv_i64 ret, TCGv_i64 arg)
1557: {
1558: tcg_gen_mov_i32(TCGV_HIGH(ret), TCGV_HIGH(arg));
1559: tcg_gen_bswap32_i32(TCGV_LOW(ret), TCGV_LOW(arg));
1560: }
1561:
1562: static inline void tcg_gen_bswap64_i64(TCGv_i64 ret, TCGv_i64 arg)
1.1 root 1563: {
1564: TCGv_i32 t0, t1;
1565: t0 = tcg_temp_new_i32();
1566: t1 = tcg_temp_new_i32();
1567:
1.1.1.2 root 1568: tcg_gen_bswap32_i32(t0, TCGV_LOW(arg));
1569: tcg_gen_bswap32_i32(t1, TCGV_HIGH(arg));
1.1 root 1570: tcg_gen_mov_i32(TCGV_LOW(ret), t1);
1571: tcg_gen_mov_i32(TCGV_HIGH(ret), t0);
1572: tcg_temp_free_i32(t0);
1573: tcg_temp_free_i32(t1);
1574: }
1575: #else
1576:
1577: static inline void tcg_gen_ext8s_i64(TCGv_i64 ret, TCGv_i64 arg)
1578: {
1579: #ifdef TCG_TARGET_HAS_ext8s_i64
1580: tcg_gen_op2_i64(INDEX_op_ext8s_i64, ret, arg);
1581: #else
1582: tcg_gen_shli_i64(ret, arg, 56);
1583: tcg_gen_sari_i64(ret, ret, 56);
1584: #endif
1585: }
1586:
1587: static inline void tcg_gen_ext16s_i64(TCGv_i64 ret, TCGv_i64 arg)
1588: {
1589: #ifdef TCG_TARGET_HAS_ext16s_i64
1590: tcg_gen_op2_i64(INDEX_op_ext16s_i64, ret, arg);
1591: #else
1592: tcg_gen_shli_i64(ret, arg, 48);
1593: tcg_gen_sari_i64(ret, ret, 48);
1594: #endif
1595: }
1596:
1597: static inline void tcg_gen_ext32s_i64(TCGv_i64 ret, TCGv_i64 arg)
1598: {
1599: #ifdef TCG_TARGET_HAS_ext32s_i64
1600: tcg_gen_op2_i64(INDEX_op_ext32s_i64, ret, arg);
1601: #else
1602: tcg_gen_shli_i64(ret, arg, 32);
1603: tcg_gen_sari_i64(ret, ret, 32);
1604: #endif
1605: }
1606:
1607: static inline void tcg_gen_ext8u_i64(TCGv_i64 ret, TCGv_i64 arg)
1608: {
1.1.1.3 root 1609: #ifdef TCG_TARGET_HAS_ext8u_i64
1610: tcg_gen_op2_i64(INDEX_op_ext8u_i64, ret, arg);
1611: #else
1.1 root 1612: tcg_gen_andi_i64(ret, arg, 0xffu);
1.1.1.3 root 1613: #endif
1.1 root 1614: }
1615:
1616: static inline void tcg_gen_ext16u_i64(TCGv_i64 ret, TCGv_i64 arg)
1617: {
1.1.1.3 root 1618: #ifdef TCG_TARGET_HAS_ext16u_i64
1619: tcg_gen_op2_i64(INDEX_op_ext16u_i64, ret, arg);
1620: #else
1.1 root 1621: tcg_gen_andi_i64(ret, arg, 0xffffu);
1.1.1.3 root 1622: #endif
1.1 root 1623: }
1624:
1625: static inline void tcg_gen_ext32u_i64(TCGv_i64 ret, TCGv_i64 arg)
1626: {
1.1.1.3 root 1627: #ifdef TCG_TARGET_HAS_ext32u_i64
1628: tcg_gen_op2_i64(INDEX_op_ext32u_i64, ret, arg);
1629: #else
1.1 root 1630: tcg_gen_andi_i64(ret, arg, 0xffffffffu);
1.1.1.3 root 1631: #endif
1.1 root 1632: }
1633:
1634: /* Note: we assume the target supports move between 32 and 64 bit
1635: registers. This will probably break MIPS64 targets. */
1636: static inline void tcg_gen_trunc_i64_i32(TCGv_i32 ret, TCGv_i64 arg)
1637: {
1638: tcg_gen_mov_i32(ret, MAKE_TCGV_I32(GET_TCGV_I64(arg)));
1639: }
1640:
1641: /* Note: we assume the target supports move between 32 and 64 bit
1642: registers */
1643: static inline void tcg_gen_extu_i32_i64(TCGv_i64 ret, TCGv_i32 arg)
1644: {
1.1.1.3 root 1645: tcg_gen_ext32u_i64(ret, MAKE_TCGV_I64(GET_TCGV_I32(arg)));
1.1 root 1646: }
1647:
1648: /* Note: we assume the target supports move between 32 and 64 bit
1649: registers */
1650: static inline void tcg_gen_ext_i32_i64(TCGv_i64 ret, TCGv_i32 arg)
1651: {
1652: tcg_gen_ext32s_i64(ret, MAKE_TCGV_I64(GET_TCGV_I32(arg)));
1653: }
1654:
1.1.1.2 root 1655: /* Note: we assume the six high bytes are set to zero */
1656: static inline void tcg_gen_bswap16_i64(TCGv_i64 ret, TCGv_i64 arg)
1.1 root 1657: {
1.1.1.2 root 1658: #ifdef TCG_TARGET_HAS_bswap16_i64
1659: tcg_gen_op2_i64(INDEX_op_bswap16_i64, ret, arg);
1.1 root 1660: #else
1.1.1.2 root 1661: TCGv_i64 t0 = tcg_temp_new_i64();
1662:
1663: tcg_gen_ext8u_i64(t0, arg);
1664: tcg_gen_shli_i64(t0, t0, 8);
1665: tcg_gen_shri_i64(ret, arg, 8);
1666: tcg_gen_or_i64(ret, ret, t0);
1667: tcg_temp_free_i64(t0);
1668: #endif
1669: }
1670:
1671: /* Note: we assume the four high bytes are set to zero */
1672: static inline void tcg_gen_bswap32_i64(TCGv_i64 ret, TCGv_i64 arg)
1673: {
1674: #ifdef TCG_TARGET_HAS_bswap32_i64
1675: tcg_gen_op2_i64(INDEX_op_bswap32_i64, ret, arg);
1676: #else
1677: TCGv_i64 t0, t1;
1678: t0 = tcg_temp_new_i64();
1679: t1 = tcg_temp_new_i64();
1680:
1681: tcg_gen_shli_i64(t0, arg, 24);
1682: tcg_gen_ext32u_i64(t0, t0);
1683:
1684: tcg_gen_andi_i64(t1, arg, 0x0000ff00);
1685: tcg_gen_shli_i64(t1, t1, 8);
1686: tcg_gen_or_i64(t0, t0, t1);
1687:
1688: tcg_gen_shri_i64(t1, arg, 8);
1689: tcg_gen_andi_i64(t1, t1, 0x0000ff00);
1690: tcg_gen_or_i64(t0, t0, t1);
1691:
1692: tcg_gen_shri_i64(t1, arg, 24);
1693: tcg_gen_or_i64(ret, t0, t1);
1694: tcg_temp_free_i64(t0);
1695: tcg_temp_free_i64(t1);
1696: #endif
1697: }
1698:
1699: static inline void tcg_gen_bswap64_i64(TCGv_i64 ret, TCGv_i64 arg)
1700: {
1701: #ifdef TCG_TARGET_HAS_bswap64_i64
1702: tcg_gen_op2_i64(INDEX_op_bswap64_i64, ret, arg);
1703: #else
1704: TCGv_i64 t0 = tcg_temp_new_i64();
1705: TCGv_i64 t1 = tcg_temp_new_i64();
1.1 root 1706:
1707: tcg_gen_shli_i64(t0, arg, 56);
1708:
1709: tcg_gen_andi_i64(t1, arg, 0x0000ff00);
1710: tcg_gen_shli_i64(t1, t1, 40);
1711: tcg_gen_or_i64(t0, t0, t1);
1712:
1713: tcg_gen_andi_i64(t1, arg, 0x00ff0000);
1714: tcg_gen_shli_i64(t1, t1, 24);
1715: tcg_gen_or_i64(t0, t0, t1);
1716:
1717: tcg_gen_andi_i64(t1, arg, 0xff000000);
1718: tcg_gen_shli_i64(t1, t1, 8);
1719: tcg_gen_or_i64(t0, t0, t1);
1720:
1721: tcg_gen_shri_i64(t1, arg, 8);
1722: tcg_gen_andi_i64(t1, t1, 0xff000000);
1723: tcg_gen_or_i64(t0, t0, t1);
1724:
1725: tcg_gen_shri_i64(t1, arg, 24);
1726: tcg_gen_andi_i64(t1, t1, 0x00ff0000);
1727: tcg_gen_or_i64(t0, t0, t1);
1728:
1729: tcg_gen_shri_i64(t1, arg, 40);
1730: tcg_gen_andi_i64(t1, t1, 0x0000ff00);
1731: tcg_gen_or_i64(t0, t0, t1);
1732:
1733: tcg_gen_shri_i64(t1, arg, 56);
1734: tcg_gen_or_i64(ret, t0, t1);
1.1.1.2 root 1735: tcg_temp_free_i64(t0);
1736: tcg_temp_free_i64(t1);
1.1 root 1737: #endif
1738: }
1739:
1740: #endif
1741:
1742: static inline void tcg_gen_neg_i32(TCGv_i32 ret, TCGv_i32 arg)
1743: {
1744: #ifdef TCG_TARGET_HAS_neg_i32
1745: tcg_gen_op2_i32(INDEX_op_neg_i32, ret, arg);
1746: #else
1747: TCGv_i32 t0 = tcg_const_i32(0);
1748: tcg_gen_sub_i32(ret, t0, arg);
1749: tcg_temp_free_i32(t0);
1750: #endif
1751: }
1752:
1753: static inline void tcg_gen_neg_i64(TCGv_i64 ret, TCGv_i64 arg)
1754: {
1755: #ifdef TCG_TARGET_HAS_neg_i64
1756: tcg_gen_op2_i64(INDEX_op_neg_i64, ret, arg);
1757: #else
1758: TCGv_i64 t0 = tcg_const_i64(0);
1759: tcg_gen_sub_i64(ret, t0, arg);
1760: tcg_temp_free_i64(t0);
1761: #endif
1762: }
1763:
1764: static inline void tcg_gen_not_i32(TCGv_i32 ret, TCGv_i32 arg)
1765: {
1.1.1.2 root 1766: #ifdef TCG_TARGET_HAS_not_i32
1767: tcg_gen_op2_i32(INDEX_op_not_i32, ret, arg);
1768: #else
1.1 root 1769: tcg_gen_xori_i32(ret, arg, -1);
1.1.1.2 root 1770: #endif
1.1 root 1771: }
1772:
1773: static inline void tcg_gen_not_i64(TCGv_i64 ret, TCGv_i64 arg)
1774: {
1.1.1.2 root 1775: #ifdef TCG_TARGET_HAS_not_i64
1776: tcg_gen_op2_i64(INDEX_op_not_i64, ret, arg);
1.1.1.4 root 1777: #elif defined(TCG_TARGET_HAS_not_i32) && TCG_TARGET_REG_BITS == 32
1778: tcg_gen_not_i32(TCGV_LOW(ret), TCGV_LOW(arg));
1779: tcg_gen_not_i32(TCGV_HIGH(ret), TCGV_HIGH(arg));
1.1.1.2 root 1780: #else
1.1 root 1781: tcg_gen_xori_i64(ret, arg, -1);
1.1.1.2 root 1782: #endif
1.1 root 1783: }
1784:
1785: static inline void tcg_gen_discard_i32(TCGv_i32 arg)
1786: {
1787: tcg_gen_op1_i32(INDEX_op_discard, arg);
1788: }
1789:
1790: #if TCG_TARGET_REG_BITS == 32
1791: static inline void tcg_gen_discard_i64(TCGv_i64 arg)
1792: {
1793: tcg_gen_discard_i32(TCGV_LOW(arg));
1794: tcg_gen_discard_i32(TCGV_HIGH(arg));
1795: }
1796: #else
1797: static inline void tcg_gen_discard_i64(TCGv_i64 arg)
1798: {
1799: tcg_gen_op1_i64(INDEX_op_discard, arg);
1800: }
1801: #endif
1802:
1803: static inline void tcg_gen_concat_i32_i64(TCGv_i64 dest, TCGv_i32 low, TCGv_i32 high)
1804: {
1805: #if TCG_TARGET_REG_BITS == 32
1806: tcg_gen_mov_i32(TCGV_LOW(dest), low);
1807: tcg_gen_mov_i32(TCGV_HIGH(dest), high);
1808: #else
1809: TCGv_i64 tmp = tcg_temp_new_i64();
1810: /* This extension is only needed for type correctness.
1811: We may be able to do better given target specific information. */
1812: tcg_gen_extu_i32_i64(tmp, high);
1813: tcg_gen_shli_i64(tmp, tmp, 32);
1814: tcg_gen_extu_i32_i64(dest, low);
1815: tcg_gen_or_i64(dest, dest, tmp);
1816: tcg_temp_free_i64(tmp);
1817: #endif
1818: }
1819:
1820: static inline void tcg_gen_concat32_i64(TCGv_i64 dest, TCGv_i64 low, TCGv_i64 high)
1821: {
1822: #if TCG_TARGET_REG_BITS == 32
1823: tcg_gen_concat_i32_i64(dest, TCGV_LOW(low), TCGV_LOW(high));
1824: #else
1825: TCGv_i64 tmp = tcg_temp_new_i64();
1826: tcg_gen_ext32u_i64(dest, low);
1827: tcg_gen_shli_i64(tmp, high, 32);
1828: tcg_gen_or_i64(dest, dest, tmp);
1829: tcg_temp_free_i64(tmp);
1830: #endif
1831: }
1832:
1833: static inline void tcg_gen_andc_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
1834: {
1.1.1.4 root 1835: #ifdef TCG_TARGET_HAS_andc_i32
1836: tcg_gen_op3_i32(INDEX_op_andc_i32, ret, arg1, arg2);
1837: #else
1.1 root 1838: TCGv_i32 t0;
1839: t0 = tcg_temp_new_i32();
1840: tcg_gen_not_i32(t0, arg2);
1841: tcg_gen_and_i32(ret, arg1, t0);
1842: tcg_temp_free_i32(t0);
1.1.1.4 root 1843: #endif
1.1 root 1844: }
1845:
1846: static inline void tcg_gen_andc_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1847: {
1.1.1.4 root 1848: #ifdef TCG_TARGET_HAS_andc_i64
1849: tcg_gen_op3_i64(INDEX_op_andc_i64, ret, arg1, arg2);
1850: #elif defined(TCG_TARGET_HAS_andc_i32) && TCG_TARGET_REG_BITS == 32
1851: tcg_gen_andc_i32(TCGV_LOW(ret), TCGV_LOW(arg1), TCGV_LOW(arg2));
1852: tcg_gen_andc_i32(TCGV_HIGH(ret), TCGV_HIGH(arg1), TCGV_HIGH(arg2));
1853: #else
1.1 root 1854: TCGv_i64 t0;
1855: t0 = tcg_temp_new_i64();
1856: tcg_gen_not_i64(t0, arg2);
1857: tcg_gen_and_i64(ret, arg1, t0);
1858: tcg_temp_free_i64(t0);
1.1.1.4 root 1859: #endif
1.1 root 1860: }
1861:
1862: static inline void tcg_gen_eqv_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
1863: {
1.1.1.4 root 1864: #ifdef TCG_TARGET_HAS_eqv_i32
1865: tcg_gen_op3_i32(INDEX_op_eqv_i32, ret, arg1, arg2);
1866: #else
1.1.1.2 root 1867: tcg_gen_xor_i32(ret, arg1, arg2);
1868: tcg_gen_not_i32(ret, ret);
1.1.1.4 root 1869: #endif
1.1 root 1870: }
1871:
1872: static inline void tcg_gen_eqv_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1873: {
1.1.1.4 root 1874: #ifdef TCG_TARGET_HAS_eqv_i64
1875: tcg_gen_op3_i64(INDEX_op_eqv_i64, ret, arg1, arg2);
1876: #elif defined(TCG_TARGET_HAS_eqv_i32) && TCG_TARGET_REG_BITS == 32
1877: tcg_gen_eqv_i32(TCGV_LOW(ret), TCGV_LOW(arg1), TCGV_LOW(arg2));
1878: tcg_gen_eqv_i32(TCGV_HIGH(ret), TCGV_HIGH(arg1), TCGV_HIGH(arg2));
1879: #else
1.1.1.2 root 1880: tcg_gen_xor_i64(ret, arg1, arg2);
1881: tcg_gen_not_i64(ret, ret);
1.1.1.4 root 1882: #endif
1.1 root 1883: }
1884:
1885: static inline void tcg_gen_nand_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
1886: {
1.1.1.4 root 1887: #ifdef TCG_TARGET_HAS_nand_i32
1888: tcg_gen_op3_i32(INDEX_op_nand_i32, ret, arg1, arg2);
1889: #else
1.1.1.2 root 1890: tcg_gen_and_i32(ret, arg1, arg2);
1891: tcg_gen_not_i32(ret, ret);
1.1.1.4 root 1892: #endif
1.1 root 1893: }
1894:
1895: static inline void tcg_gen_nand_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1896: {
1.1.1.4 root 1897: #ifdef TCG_TARGET_HAS_nand_i64
1898: tcg_gen_op3_i64(INDEX_op_nand_i64, ret, arg1, arg2);
1899: #elif defined(TCG_TARGET_HAS_nand_i32) && TCG_TARGET_REG_BITS == 32
1900: tcg_gen_nand_i32(TCGV_LOW(ret), TCGV_LOW(arg1), TCGV_LOW(arg2));
1901: tcg_gen_nand_i32(TCGV_HIGH(ret), TCGV_HIGH(arg1), TCGV_HIGH(arg2));
1902: #else
1.1.1.2 root 1903: tcg_gen_and_i64(ret, arg1, arg2);
1904: tcg_gen_not_i64(ret, ret);
1.1.1.4 root 1905: #endif
1.1 root 1906: }
1907:
1908: static inline void tcg_gen_nor_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
1909: {
1.1.1.4 root 1910: #ifdef TCG_TARGET_HAS_nor_i32
1911: tcg_gen_op3_i32(INDEX_op_nor_i32, ret, arg1, arg2);
1912: #else
1.1.1.2 root 1913: tcg_gen_or_i32(ret, arg1, arg2);
1914: tcg_gen_not_i32(ret, ret);
1.1.1.4 root 1915: #endif
1.1 root 1916: }
1917:
1918: static inline void tcg_gen_nor_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1919: {
1.1.1.4 root 1920: #ifdef TCG_TARGET_HAS_nor_i64
1921: tcg_gen_op3_i64(INDEX_op_nor_i64, ret, arg1, arg2);
1922: #elif defined(TCG_TARGET_HAS_nor_i32) && TCG_TARGET_REG_BITS == 32
1923: tcg_gen_nor_i32(TCGV_LOW(ret), TCGV_LOW(arg1), TCGV_LOW(arg2));
1924: tcg_gen_nor_i32(TCGV_HIGH(ret), TCGV_HIGH(arg1), TCGV_HIGH(arg2));
1925: #else
1.1.1.2 root 1926: tcg_gen_or_i64(ret, arg1, arg2);
1927: tcg_gen_not_i64(ret, ret);
1.1.1.4 root 1928: #endif
1.1 root 1929: }
1930:
1931: static inline void tcg_gen_orc_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
1932: {
1.1.1.4 root 1933: #ifdef TCG_TARGET_HAS_orc_i32
1934: tcg_gen_op3_i32(INDEX_op_orc_i32, ret, arg1, arg2);
1935: #else
1.1 root 1936: TCGv_i32 t0;
1937: t0 = tcg_temp_new_i32();
1938: tcg_gen_not_i32(t0, arg2);
1939: tcg_gen_or_i32(ret, arg1, t0);
1940: tcg_temp_free_i32(t0);
1.1.1.4 root 1941: #endif
1.1 root 1942: }
1943:
1944: static inline void tcg_gen_orc_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1945: {
1.1.1.4 root 1946: #ifdef TCG_TARGET_HAS_orc_i64
1947: tcg_gen_op3_i64(INDEX_op_orc_i64, ret, arg1, arg2);
1948: #elif defined(TCG_TARGET_HAS_orc_i32) && TCG_TARGET_REG_BITS == 32
1949: tcg_gen_orc_i32(TCGV_LOW(ret), TCGV_LOW(arg1), TCGV_LOW(arg2));
1950: tcg_gen_orc_i32(TCGV_HIGH(ret), TCGV_HIGH(arg1), TCGV_HIGH(arg2));
1951: #else
1.1 root 1952: TCGv_i64 t0;
1953: t0 = tcg_temp_new_i64();
1954: tcg_gen_not_i64(t0, arg2);
1955: tcg_gen_or_i64(ret, arg1, t0);
1956: tcg_temp_free_i64(t0);
1.1.1.4 root 1957: #endif
1.1 root 1958: }
1959:
1960: static inline void tcg_gen_rotl_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
1961: {
1.1.1.2 root 1962: #ifdef TCG_TARGET_HAS_rot_i32
1963: tcg_gen_op3_i32(INDEX_op_rotl_i32, ret, arg1, arg2);
1964: #else
1.1 root 1965: TCGv_i32 t0, t1;
1966:
1967: t0 = tcg_temp_new_i32();
1968: t1 = tcg_temp_new_i32();
1969: tcg_gen_shl_i32(t0, arg1, arg2);
1970: tcg_gen_subfi_i32(t1, 32, arg2);
1971: tcg_gen_shr_i32(t1, arg1, t1);
1972: tcg_gen_or_i32(ret, t0, t1);
1973: tcg_temp_free_i32(t0);
1974: tcg_temp_free_i32(t1);
1.1.1.2 root 1975: #endif
1.1 root 1976: }
1977:
1978: static inline void tcg_gen_rotl_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1979: {
1.1.1.2 root 1980: #ifdef TCG_TARGET_HAS_rot_i64
1981: tcg_gen_op3_i64(INDEX_op_rotl_i64, ret, arg1, arg2);
1982: #else
1.1 root 1983: TCGv_i64 t0, t1;
1984:
1985: t0 = tcg_temp_new_i64();
1986: t1 = tcg_temp_new_i64();
1987: tcg_gen_shl_i64(t0, arg1, arg2);
1988: tcg_gen_subfi_i64(t1, 64, arg2);
1989: tcg_gen_shr_i64(t1, arg1, t1);
1990: tcg_gen_or_i64(ret, t0, t1);
1991: tcg_temp_free_i64(t0);
1992: tcg_temp_free_i64(t1);
1.1.1.2 root 1993: #endif
1.1 root 1994: }
1995:
1996: static inline void tcg_gen_rotli_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2)
1997: {
1998: /* some cases can be optimized here */
1999: if (arg2 == 0) {
2000: tcg_gen_mov_i32(ret, arg1);
2001: } else {
1.1.1.2 root 2002: #ifdef TCG_TARGET_HAS_rot_i32
2003: TCGv_i32 t0 = tcg_const_i32(arg2);
2004: tcg_gen_rotl_i32(ret, arg1, t0);
2005: tcg_temp_free_i32(t0);
2006: #else
1.1 root 2007: TCGv_i32 t0, t1;
2008: t0 = tcg_temp_new_i32();
2009: t1 = tcg_temp_new_i32();
2010: tcg_gen_shli_i32(t0, arg1, arg2);
2011: tcg_gen_shri_i32(t1, arg1, 32 - arg2);
2012: tcg_gen_or_i32(ret, t0, t1);
2013: tcg_temp_free_i32(t0);
2014: tcg_temp_free_i32(t1);
1.1.1.2 root 2015: #endif
1.1 root 2016: }
2017: }
2018:
2019: static inline void tcg_gen_rotli_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
2020: {
2021: /* some cases can be optimized here */
2022: if (arg2 == 0) {
2023: tcg_gen_mov_i64(ret, arg1);
2024: } else {
1.1.1.2 root 2025: #ifdef TCG_TARGET_HAS_rot_i64
2026: TCGv_i64 t0 = tcg_const_i64(arg2);
2027: tcg_gen_rotl_i64(ret, arg1, t0);
2028: tcg_temp_free_i64(t0);
2029: #else
1.1 root 2030: TCGv_i64 t0, t1;
2031: t0 = tcg_temp_new_i64();
2032: t1 = tcg_temp_new_i64();
2033: tcg_gen_shli_i64(t0, arg1, arg2);
2034: tcg_gen_shri_i64(t1, arg1, 64 - arg2);
2035: tcg_gen_or_i64(ret, t0, t1);
2036: tcg_temp_free_i64(t0);
2037: tcg_temp_free_i64(t1);
1.1.1.2 root 2038: #endif
1.1 root 2039: }
2040: }
2041:
2042: static inline void tcg_gen_rotr_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
2043: {
1.1.1.2 root 2044: #ifdef TCG_TARGET_HAS_rot_i32
2045: tcg_gen_op3_i32(INDEX_op_rotr_i32, ret, arg1, arg2);
2046: #else
1.1 root 2047: TCGv_i32 t0, t1;
2048:
2049: t0 = tcg_temp_new_i32();
2050: t1 = tcg_temp_new_i32();
2051: tcg_gen_shr_i32(t0, arg1, arg2);
2052: tcg_gen_subfi_i32(t1, 32, arg2);
2053: tcg_gen_shl_i32(t1, arg1, t1);
2054: tcg_gen_or_i32(ret, t0, t1);
2055: tcg_temp_free_i32(t0);
2056: tcg_temp_free_i32(t1);
1.1.1.2 root 2057: #endif
1.1 root 2058: }
2059:
2060: static inline void tcg_gen_rotr_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
2061: {
1.1.1.2 root 2062: #ifdef TCG_TARGET_HAS_rot_i64
2063: tcg_gen_op3_i64(INDEX_op_rotr_i64, ret, arg1, arg2);
2064: #else
1.1 root 2065: TCGv_i64 t0, t1;
2066:
2067: t0 = tcg_temp_new_i64();
2068: t1 = tcg_temp_new_i64();
1.1.1.2 root 2069: tcg_gen_shr_i64(t0, arg1, arg2);
1.1 root 2070: tcg_gen_subfi_i64(t1, 64, arg2);
2071: tcg_gen_shl_i64(t1, arg1, t1);
2072: tcg_gen_or_i64(ret, t0, t1);
2073: tcg_temp_free_i64(t0);
2074: tcg_temp_free_i64(t1);
1.1.1.2 root 2075: #endif
1.1 root 2076: }
2077:
2078: static inline void tcg_gen_rotri_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2)
2079: {
2080: /* some cases can be optimized here */
2081: if (arg2 == 0) {
2082: tcg_gen_mov_i32(ret, arg1);
2083: } else {
2084: tcg_gen_rotli_i32(ret, arg1, 32 - arg2);
2085: }
2086: }
2087:
2088: static inline void tcg_gen_rotri_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
2089: {
2090: /* some cases can be optimized here */
2091: if (arg2 == 0) {
2092: tcg_gen_mov_i64(ret, arg1);
2093: } else {
2094: tcg_gen_rotli_i64(ret, arg1, 64 - arg2);
2095: }
2096: }
2097:
1.1.1.5 ! root 2098: static inline void tcg_gen_deposit_i32(TCGv_i32 ret, TCGv_i32 arg1,
! 2099: TCGv_i32 arg2, unsigned int ofs,
! 2100: unsigned int len)
! 2101: {
! 2102: #ifdef TCG_TARGET_HAS_deposit_i32
! 2103: tcg_gen_op5ii_i32(INDEX_op_deposit_i32, ret, arg1, arg2, ofs, len);
! 2104: #else
! 2105: uint32_t mask = (1u << len) - 1;
! 2106: TCGv_i32 t1 = tcg_temp_new_i32 ();
! 2107:
! 2108: tcg_gen_andi_i32(t1, arg2, mask);
! 2109: tcg_gen_shli_i32(t1, t1, ofs);
! 2110: tcg_gen_andi_i32(ret, arg1, ~(mask << ofs));
! 2111: tcg_gen_or_i32(ret, ret, t1);
! 2112:
! 2113: tcg_temp_free_i32(t1);
! 2114: #endif
! 2115: }
! 2116:
! 2117: static inline void tcg_gen_deposit_i64(TCGv_i64 ret, TCGv_i64 arg1,
! 2118: TCGv_i64 arg2, unsigned int ofs,
! 2119: unsigned int len)
! 2120: {
! 2121: #ifdef TCG_TARGET_HAS_deposit_i64
! 2122: tcg_gen_op5ii_i64(INDEX_op_deposit_i64, ret, arg1, arg2, ofs, len);
! 2123: #else
! 2124: uint64_t mask = (1ull << len) - 1;
! 2125: TCGv_i64 t1 = tcg_temp_new_i64 ();
! 2126:
! 2127: tcg_gen_andi_i64(t1, arg2, mask);
! 2128: tcg_gen_shli_i64(t1, t1, ofs);
! 2129: tcg_gen_andi_i64(ret, arg1, ~(mask << ofs));
! 2130: tcg_gen_or_i64(ret, ret, t1);
! 2131:
! 2132: tcg_temp_free_i64(t1);
! 2133: #endif
! 2134: }
! 2135:
1.1 root 2136: /***************************************/
2137: /* QEMU specific operations. Their type depend on the QEMU CPU
2138: type. */
2139: #ifndef TARGET_LONG_BITS
2140: #error must include QEMU headers
2141: #endif
2142:
2143: #if TARGET_LONG_BITS == 32
2144: #define TCGv TCGv_i32
2145: #define tcg_temp_new() tcg_temp_new_i32()
2146: #define tcg_global_reg_new tcg_global_reg_new_i32
2147: #define tcg_global_mem_new tcg_global_mem_new_i32
2148: #define tcg_temp_local_new() tcg_temp_local_new_i32()
2149: #define tcg_temp_free tcg_temp_free_i32
2150: #define tcg_gen_qemu_ldst_op tcg_gen_op3i_i32
2151: #define tcg_gen_qemu_ldst_op_i64 tcg_gen_qemu_ldst_op_i64_i32
2152: #define TCGV_UNUSED(x) TCGV_UNUSED_I32(x)
1.1.1.2 root 2153: #define TCGV_EQUAL(a, b) TCGV_EQUAL_I32(a, b)
1.1 root 2154: #else
2155: #define TCGv TCGv_i64
2156: #define tcg_temp_new() tcg_temp_new_i64()
2157: #define tcg_global_reg_new tcg_global_reg_new_i64
2158: #define tcg_global_mem_new tcg_global_mem_new_i64
2159: #define tcg_temp_local_new() tcg_temp_local_new_i64()
2160: #define tcg_temp_free tcg_temp_free_i64
2161: #define tcg_gen_qemu_ldst_op tcg_gen_op3i_i64
2162: #define tcg_gen_qemu_ldst_op_i64 tcg_gen_qemu_ldst_op_i64_i64
2163: #define TCGV_UNUSED(x) TCGV_UNUSED_I64(x)
1.1.1.2 root 2164: #define TCGV_EQUAL(a, b) TCGV_EQUAL_I64(a, b)
1.1 root 2165: #endif
2166:
2167: /* debug info: write the PC of the corresponding QEMU CPU instruction */
2168: static inline void tcg_gen_debug_insn_start(uint64_t pc)
2169: {
2170: /* XXX: must really use a 32 bit size for TCGArg in all cases */
2171: #if TARGET_LONG_BITS > TCG_TARGET_REG_BITS
2172: tcg_gen_op2ii(INDEX_op_debug_insn_start,
2173: (uint32_t)(pc), (uint32_t)(pc >> 32));
2174: #else
2175: tcg_gen_op1i(INDEX_op_debug_insn_start, pc);
2176: #endif
2177: }
2178:
2179: static inline void tcg_gen_exit_tb(tcg_target_long val)
2180: {
2181: tcg_gen_op1i(INDEX_op_exit_tb, val);
2182: }
2183:
2184: static inline void tcg_gen_goto_tb(int idx)
2185: {
2186: tcg_gen_op1i(INDEX_op_goto_tb, idx);
2187: }
2188:
2189: #if TCG_TARGET_REG_BITS == 32
2190: static inline void tcg_gen_qemu_ld8u(TCGv ret, TCGv addr, int mem_index)
2191: {
2192: #if TARGET_LONG_BITS == 32
2193: tcg_gen_op3i_i32(INDEX_op_qemu_ld8u, ret, addr, mem_index);
2194: #else
2195: tcg_gen_op4i_i32(INDEX_op_qemu_ld8u, TCGV_LOW(ret), TCGV_LOW(addr),
2196: TCGV_HIGH(addr), mem_index);
2197: tcg_gen_movi_i32(TCGV_HIGH(ret), 0);
2198: #endif
2199: }
2200:
2201: static inline void tcg_gen_qemu_ld8s(TCGv ret, TCGv addr, int mem_index)
2202: {
2203: #if TARGET_LONG_BITS == 32
2204: tcg_gen_op3i_i32(INDEX_op_qemu_ld8s, ret, addr, mem_index);
2205: #else
2206: tcg_gen_op4i_i32(INDEX_op_qemu_ld8s, TCGV_LOW(ret), TCGV_LOW(addr),
2207: TCGV_HIGH(addr), mem_index);
2208: tcg_gen_sari_i32(TCGV_HIGH(ret), TCGV_LOW(ret), 31);
2209: #endif
2210: }
2211:
2212: static inline void tcg_gen_qemu_ld16u(TCGv ret, TCGv addr, int mem_index)
2213: {
2214: #if TARGET_LONG_BITS == 32
2215: tcg_gen_op3i_i32(INDEX_op_qemu_ld16u, ret, addr, mem_index);
2216: #else
2217: tcg_gen_op4i_i32(INDEX_op_qemu_ld16u, TCGV_LOW(ret), TCGV_LOW(addr),
2218: TCGV_HIGH(addr), mem_index);
2219: tcg_gen_movi_i32(TCGV_HIGH(ret), 0);
2220: #endif
2221: }
2222:
2223: static inline void tcg_gen_qemu_ld16s(TCGv ret, TCGv addr, int mem_index)
2224: {
2225: #if TARGET_LONG_BITS == 32
2226: tcg_gen_op3i_i32(INDEX_op_qemu_ld16s, ret, addr, mem_index);
2227: #else
2228: tcg_gen_op4i_i32(INDEX_op_qemu_ld16s, TCGV_LOW(ret), TCGV_LOW(addr),
2229: TCGV_HIGH(addr), mem_index);
2230: tcg_gen_sari_i32(TCGV_HIGH(ret), TCGV_LOW(ret), 31);
2231: #endif
2232: }
2233:
2234: static inline void tcg_gen_qemu_ld32u(TCGv ret, TCGv addr, int mem_index)
2235: {
2236: #if TARGET_LONG_BITS == 32
1.1.1.4 root 2237: tcg_gen_op3i_i32(INDEX_op_qemu_ld32, ret, addr, mem_index);
1.1 root 2238: #else
1.1.1.4 root 2239: tcg_gen_op4i_i32(INDEX_op_qemu_ld32, TCGV_LOW(ret), TCGV_LOW(addr),
1.1 root 2240: TCGV_HIGH(addr), mem_index);
2241: tcg_gen_movi_i32(TCGV_HIGH(ret), 0);
2242: #endif
2243: }
2244:
2245: static inline void tcg_gen_qemu_ld32s(TCGv ret, TCGv addr, int mem_index)
2246: {
2247: #if TARGET_LONG_BITS == 32
1.1.1.4 root 2248: tcg_gen_op3i_i32(INDEX_op_qemu_ld32, ret, addr, mem_index);
1.1 root 2249: #else
1.1.1.4 root 2250: tcg_gen_op4i_i32(INDEX_op_qemu_ld32, TCGV_LOW(ret), TCGV_LOW(addr),
1.1 root 2251: TCGV_HIGH(addr), mem_index);
2252: tcg_gen_sari_i32(TCGV_HIGH(ret), TCGV_LOW(ret), 31);
2253: #endif
2254: }
2255:
2256: static inline void tcg_gen_qemu_ld64(TCGv_i64 ret, TCGv addr, int mem_index)
2257: {
2258: #if TARGET_LONG_BITS == 32
2259: tcg_gen_op4i_i32(INDEX_op_qemu_ld64, TCGV_LOW(ret), TCGV_HIGH(ret), addr, mem_index);
2260: #else
2261: tcg_gen_op5i_i32(INDEX_op_qemu_ld64, TCGV_LOW(ret), TCGV_HIGH(ret),
2262: TCGV_LOW(addr), TCGV_HIGH(addr), mem_index);
2263: #endif
2264: }
2265:
2266: static inline void tcg_gen_qemu_st8(TCGv arg, TCGv addr, int mem_index)
2267: {
2268: #if TARGET_LONG_BITS == 32
2269: tcg_gen_op3i_i32(INDEX_op_qemu_st8, arg, addr, mem_index);
2270: #else
2271: tcg_gen_op4i_i32(INDEX_op_qemu_st8, TCGV_LOW(arg), TCGV_LOW(addr),
2272: TCGV_HIGH(addr), mem_index);
2273: #endif
2274: }
2275:
2276: static inline void tcg_gen_qemu_st16(TCGv arg, TCGv addr, int mem_index)
2277: {
2278: #if TARGET_LONG_BITS == 32
2279: tcg_gen_op3i_i32(INDEX_op_qemu_st16, arg, addr, mem_index);
2280: #else
2281: tcg_gen_op4i_i32(INDEX_op_qemu_st16, TCGV_LOW(arg), TCGV_LOW(addr),
2282: TCGV_HIGH(addr), mem_index);
2283: #endif
2284: }
2285:
2286: static inline void tcg_gen_qemu_st32(TCGv arg, TCGv addr, int mem_index)
2287: {
2288: #if TARGET_LONG_BITS == 32
2289: tcg_gen_op3i_i32(INDEX_op_qemu_st32, arg, addr, mem_index);
2290: #else
2291: tcg_gen_op4i_i32(INDEX_op_qemu_st32, TCGV_LOW(arg), TCGV_LOW(addr),
2292: TCGV_HIGH(addr), mem_index);
2293: #endif
2294: }
2295:
2296: static inline void tcg_gen_qemu_st64(TCGv_i64 arg, TCGv addr, int mem_index)
2297: {
2298: #if TARGET_LONG_BITS == 32
2299: tcg_gen_op4i_i32(INDEX_op_qemu_st64, TCGV_LOW(arg), TCGV_HIGH(arg), addr,
2300: mem_index);
2301: #else
2302: tcg_gen_op5i_i32(INDEX_op_qemu_st64, TCGV_LOW(arg), TCGV_HIGH(arg),
2303: TCGV_LOW(addr), TCGV_HIGH(addr), mem_index);
2304: #endif
2305: }
2306:
2307: #define tcg_gen_ld_ptr tcg_gen_ld_i32
2308: #define tcg_gen_discard_ptr tcg_gen_discard_i32
2309:
2310: #else /* TCG_TARGET_REG_BITS == 32 */
2311:
2312: static inline void tcg_gen_qemu_ld8u(TCGv ret, TCGv addr, int mem_index)
2313: {
2314: tcg_gen_qemu_ldst_op(INDEX_op_qemu_ld8u, ret, addr, mem_index);
2315: }
2316:
2317: static inline void tcg_gen_qemu_ld8s(TCGv ret, TCGv addr, int mem_index)
2318: {
2319: tcg_gen_qemu_ldst_op(INDEX_op_qemu_ld8s, ret, addr, mem_index);
2320: }
2321:
2322: static inline void tcg_gen_qemu_ld16u(TCGv ret, TCGv addr, int mem_index)
2323: {
2324: tcg_gen_qemu_ldst_op(INDEX_op_qemu_ld16u, ret, addr, mem_index);
2325: }
2326:
2327: static inline void tcg_gen_qemu_ld16s(TCGv ret, TCGv addr, int mem_index)
2328: {
2329: tcg_gen_qemu_ldst_op(INDEX_op_qemu_ld16s, ret, addr, mem_index);
2330: }
2331:
2332: static inline void tcg_gen_qemu_ld32u(TCGv ret, TCGv addr, int mem_index)
2333: {
1.1.1.4 root 2334: #if TARGET_LONG_BITS == 32
2335: tcg_gen_qemu_ldst_op(INDEX_op_qemu_ld32, ret, addr, mem_index);
2336: #else
1.1 root 2337: tcg_gen_qemu_ldst_op(INDEX_op_qemu_ld32u, ret, addr, mem_index);
1.1.1.4 root 2338: #endif
1.1 root 2339: }
2340:
2341: static inline void tcg_gen_qemu_ld32s(TCGv ret, TCGv addr, int mem_index)
2342: {
1.1.1.4 root 2343: #if TARGET_LONG_BITS == 32
2344: tcg_gen_qemu_ldst_op(INDEX_op_qemu_ld32, ret, addr, mem_index);
2345: #else
1.1 root 2346: tcg_gen_qemu_ldst_op(INDEX_op_qemu_ld32s, ret, addr, mem_index);
1.1.1.4 root 2347: #endif
1.1 root 2348: }
2349:
2350: static inline void tcg_gen_qemu_ld64(TCGv_i64 ret, TCGv addr, int mem_index)
2351: {
2352: tcg_gen_qemu_ldst_op_i64(INDEX_op_qemu_ld64, ret, addr, mem_index);
2353: }
2354:
2355: static inline void tcg_gen_qemu_st8(TCGv arg, TCGv addr, int mem_index)
2356: {
2357: tcg_gen_qemu_ldst_op(INDEX_op_qemu_st8, arg, addr, mem_index);
2358: }
2359:
2360: static inline void tcg_gen_qemu_st16(TCGv arg, TCGv addr, int mem_index)
2361: {
2362: tcg_gen_qemu_ldst_op(INDEX_op_qemu_st16, arg, addr, mem_index);
2363: }
2364:
2365: static inline void tcg_gen_qemu_st32(TCGv arg, TCGv addr, int mem_index)
2366: {
2367: tcg_gen_qemu_ldst_op(INDEX_op_qemu_st32, arg, addr, mem_index);
2368: }
2369:
2370: static inline void tcg_gen_qemu_st64(TCGv_i64 arg, TCGv addr, int mem_index)
2371: {
2372: tcg_gen_qemu_ldst_op_i64(INDEX_op_qemu_st64, arg, addr, mem_index);
2373: }
2374:
2375: #define tcg_gen_ld_ptr tcg_gen_ld_i64
2376: #define tcg_gen_discard_ptr tcg_gen_discard_i64
2377:
2378: #endif /* TCG_TARGET_REG_BITS != 32 */
2379:
2380: #if TARGET_LONG_BITS == 64
2381: #define tcg_gen_movi_tl tcg_gen_movi_i64
2382: #define tcg_gen_mov_tl tcg_gen_mov_i64
2383: #define tcg_gen_ld8u_tl tcg_gen_ld8u_i64
2384: #define tcg_gen_ld8s_tl tcg_gen_ld8s_i64
2385: #define tcg_gen_ld16u_tl tcg_gen_ld16u_i64
2386: #define tcg_gen_ld16s_tl tcg_gen_ld16s_i64
2387: #define tcg_gen_ld32u_tl tcg_gen_ld32u_i64
2388: #define tcg_gen_ld32s_tl tcg_gen_ld32s_i64
2389: #define tcg_gen_ld_tl tcg_gen_ld_i64
2390: #define tcg_gen_st8_tl tcg_gen_st8_i64
2391: #define tcg_gen_st16_tl tcg_gen_st16_i64
2392: #define tcg_gen_st32_tl tcg_gen_st32_i64
2393: #define tcg_gen_st_tl tcg_gen_st_i64
2394: #define tcg_gen_add_tl tcg_gen_add_i64
2395: #define tcg_gen_addi_tl tcg_gen_addi_i64
2396: #define tcg_gen_sub_tl tcg_gen_sub_i64
2397: #define tcg_gen_neg_tl tcg_gen_neg_i64
2398: #define tcg_gen_subfi_tl tcg_gen_subfi_i64
2399: #define tcg_gen_subi_tl tcg_gen_subi_i64
2400: #define tcg_gen_and_tl tcg_gen_and_i64
2401: #define tcg_gen_andi_tl tcg_gen_andi_i64
2402: #define tcg_gen_or_tl tcg_gen_or_i64
2403: #define tcg_gen_ori_tl tcg_gen_ori_i64
2404: #define tcg_gen_xor_tl tcg_gen_xor_i64
2405: #define tcg_gen_xori_tl tcg_gen_xori_i64
2406: #define tcg_gen_not_tl tcg_gen_not_i64
2407: #define tcg_gen_shl_tl tcg_gen_shl_i64
2408: #define tcg_gen_shli_tl tcg_gen_shli_i64
2409: #define tcg_gen_shr_tl tcg_gen_shr_i64
2410: #define tcg_gen_shri_tl tcg_gen_shri_i64
2411: #define tcg_gen_sar_tl tcg_gen_sar_i64
2412: #define tcg_gen_sari_tl tcg_gen_sari_i64
2413: #define tcg_gen_brcond_tl tcg_gen_brcond_i64
2414: #define tcg_gen_brcondi_tl tcg_gen_brcondi_i64
1.1.1.4 root 2415: #define tcg_gen_setcond_tl tcg_gen_setcond_i64
2416: #define tcg_gen_setcondi_tl tcg_gen_setcondi_i64
1.1 root 2417: #define tcg_gen_mul_tl tcg_gen_mul_i64
2418: #define tcg_gen_muli_tl tcg_gen_muli_i64
1.1.1.2 root 2419: #define tcg_gen_div_tl tcg_gen_div_i64
2420: #define tcg_gen_rem_tl tcg_gen_rem_i64
2421: #define tcg_gen_divu_tl tcg_gen_divu_i64
2422: #define tcg_gen_remu_tl tcg_gen_remu_i64
1.1 root 2423: #define tcg_gen_discard_tl tcg_gen_discard_i64
2424: #define tcg_gen_trunc_tl_i32 tcg_gen_trunc_i64_i32
2425: #define tcg_gen_trunc_i64_tl tcg_gen_mov_i64
2426: #define tcg_gen_extu_i32_tl tcg_gen_extu_i32_i64
2427: #define tcg_gen_ext_i32_tl tcg_gen_ext_i32_i64
2428: #define tcg_gen_extu_tl_i64 tcg_gen_mov_i64
2429: #define tcg_gen_ext_tl_i64 tcg_gen_mov_i64
2430: #define tcg_gen_ext8u_tl tcg_gen_ext8u_i64
2431: #define tcg_gen_ext8s_tl tcg_gen_ext8s_i64
2432: #define tcg_gen_ext16u_tl tcg_gen_ext16u_i64
2433: #define tcg_gen_ext16s_tl tcg_gen_ext16s_i64
2434: #define tcg_gen_ext32u_tl tcg_gen_ext32u_i64
2435: #define tcg_gen_ext32s_tl tcg_gen_ext32s_i64
1.1.1.2 root 2436: #define tcg_gen_bswap16_tl tcg_gen_bswap16_i64
2437: #define tcg_gen_bswap32_tl tcg_gen_bswap32_i64
2438: #define tcg_gen_bswap64_tl tcg_gen_bswap64_i64
1.1 root 2439: #define tcg_gen_concat_tl_i64 tcg_gen_concat32_i64
2440: #define tcg_gen_andc_tl tcg_gen_andc_i64
2441: #define tcg_gen_eqv_tl tcg_gen_eqv_i64
2442: #define tcg_gen_nand_tl tcg_gen_nand_i64
2443: #define tcg_gen_nor_tl tcg_gen_nor_i64
2444: #define tcg_gen_orc_tl tcg_gen_orc_i64
2445: #define tcg_gen_rotl_tl tcg_gen_rotl_i64
2446: #define tcg_gen_rotli_tl tcg_gen_rotli_i64
2447: #define tcg_gen_rotr_tl tcg_gen_rotr_i64
2448: #define tcg_gen_rotri_tl tcg_gen_rotri_i64
1.1.1.5 ! root 2449: #define tcg_gen_deposit_tl tcg_gen_deposit_i64
1.1 root 2450: #define tcg_const_tl tcg_const_i64
2451: #define tcg_const_local_tl tcg_const_local_i64
2452: #else
2453: #define tcg_gen_movi_tl tcg_gen_movi_i32
2454: #define tcg_gen_mov_tl tcg_gen_mov_i32
2455: #define tcg_gen_ld8u_tl tcg_gen_ld8u_i32
2456: #define tcg_gen_ld8s_tl tcg_gen_ld8s_i32
2457: #define tcg_gen_ld16u_tl tcg_gen_ld16u_i32
2458: #define tcg_gen_ld16s_tl tcg_gen_ld16s_i32
2459: #define tcg_gen_ld32u_tl tcg_gen_ld_i32
2460: #define tcg_gen_ld32s_tl tcg_gen_ld_i32
2461: #define tcg_gen_ld_tl tcg_gen_ld_i32
2462: #define tcg_gen_st8_tl tcg_gen_st8_i32
2463: #define tcg_gen_st16_tl tcg_gen_st16_i32
2464: #define tcg_gen_st32_tl tcg_gen_st_i32
2465: #define tcg_gen_st_tl tcg_gen_st_i32
2466: #define tcg_gen_add_tl tcg_gen_add_i32
2467: #define tcg_gen_addi_tl tcg_gen_addi_i32
2468: #define tcg_gen_sub_tl tcg_gen_sub_i32
2469: #define tcg_gen_neg_tl tcg_gen_neg_i32
2470: #define tcg_gen_subfi_tl tcg_gen_subfi_i32
2471: #define tcg_gen_subi_tl tcg_gen_subi_i32
2472: #define tcg_gen_and_tl tcg_gen_and_i32
2473: #define tcg_gen_andi_tl tcg_gen_andi_i32
2474: #define tcg_gen_or_tl tcg_gen_or_i32
2475: #define tcg_gen_ori_tl tcg_gen_ori_i32
2476: #define tcg_gen_xor_tl tcg_gen_xor_i32
2477: #define tcg_gen_xori_tl tcg_gen_xori_i32
2478: #define tcg_gen_not_tl tcg_gen_not_i32
2479: #define tcg_gen_shl_tl tcg_gen_shl_i32
2480: #define tcg_gen_shli_tl tcg_gen_shli_i32
2481: #define tcg_gen_shr_tl tcg_gen_shr_i32
2482: #define tcg_gen_shri_tl tcg_gen_shri_i32
2483: #define tcg_gen_sar_tl tcg_gen_sar_i32
2484: #define tcg_gen_sari_tl tcg_gen_sari_i32
2485: #define tcg_gen_brcond_tl tcg_gen_brcond_i32
2486: #define tcg_gen_brcondi_tl tcg_gen_brcondi_i32
1.1.1.4 root 2487: #define tcg_gen_setcond_tl tcg_gen_setcond_i32
2488: #define tcg_gen_setcondi_tl tcg_gen_setcondi_i32
1.1 root 2489: #define tcg_gen_mul_tl tcg_gen_mul_i32
2490: #define tcg_gen_muli_tl tcg_gen_muli_i32
1.1.1.2 root 2491: #define tcg_gen_div_tl tcg_gen_div_i32
2492: #define tcg_gen_rem_tl tcg_gen_rem_i32
2493: #define tcg_gen_divu_tl tcg_gen_divu_i32
2494: #define tcg_gen_remu_tl tcg_gen_remu_i32
1.1 root 2495: #define tcg_gen_discard_tl tcg_gen_discard_i32
2496: #define tcg_gen_trunc_tl_i32 tcg_gen_mov_i32
2497: #define tcg_gen_trunc_i64_tl tcg_gen_trunc_i64_i32
2498: #define tcg_gen_extu_i32_tl tcg_gen_mov_i32
2499: #define tcg_gen_ext_i32_tl tcg_gen_mov_i32
2500: #define tcg_gen_extu_tl_i64 tcg_gen_extu_i32_i64
2501: #define tcg_gen_ext_tl_i64 tcg_gen_ext_i32_i64
2502: #define tcg_gen_ext8u_tl tcg_gen_ext8u_i32
2503: #define tcg_gen_ext8s_tl tcg_gen_ext8s_i32
2504: #define tcg_gen_ext16u_tl tcg_gen_ext16u_i32
2505: #define tcg_gen_ext16s_tl tcg_gen_ext16s_i32
2506: #define tcg_gen_ext32u_tl tcg_gen_mov_i32
2507: #define tcg_gen_ext32s_tl tcg_gen_mov_i32
1.1.1.2 root 2508: #define tcg_gen_bswap16_tl tcg_gen_bswap16_i32
2509: #define tcg_gen_bswap32_tl tcg_gen_bswap32_i32
1.1 root 2510: #define tcg_gen_concat_tl_i64 tcg_gen_concat_i32_i64
2511: #define tcg_gen_andc_tl tcg_gen_andc_i32
2512: #define tcg_gen_eqv_tl tcg_gen_eqv_i32
2513: #define tcg_gen_nand_tl tcg_gen_nand_i32
2514: #define tcg_gen_nor_tl tcg_gen_nor_i32
2515: #define tcg_gen_orc_tl tcg_gen_orc_i32
2516: #define tcg_gen_rotl_tl tcg_gen_rotl_i32
2517: #define tcg_gen_rotli_tl tcg_gen_rotli_i32
2518: #define tcg_gen_rotr_tl tcg_gen_rotr_i32
2519: #define tcg_gen_rotri_tl tcg_gen_rotri_i32
1.1.1.5 ! root 2520: #define tcg_gen_deposit_tl tcg_gen_deposit_i32
1.1 root 2521: #define tcg_const_tl tcg_const_i32
2522: #define tcg_const_local_tl tcg_const_local_i32
2523: #endif
2524:
2525: #if TCG_TARGET_REG_BITS == 32
2526: #define tcg_gen_add_ptr tcg_gen_add_i32
2527: #define tcg_gen_addi_ptr tcg_gen_addi_i32
2528: #define tcg_gen_ext_i32_ptr tcg_gen_mov_i32
2529: #else /* TCG_TARGET_REG_BITS == 32 */
2530: #define tcg_gen_add_ptr tcg_gen_add_i64
2531: #define tcg_gen_addi_ptr tcg_gen_addi_i64
2532: #define tcg_gen_ext_i32_ptr tcg_gen_ext_i32_i64
2533: #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.