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