Annotation of qemu/tcg/ia64/tcg-target.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Tiny Code Generator for QEMU
                      3:  *
                      4:  * Copyright (c) 2009-2010 Aurelien Jarno <[email protected]>
                      5:  * Based on i386/tcg-target.c - Copyright (c) 2008 Fabrice Bellard
                      6:  *
                      7:  * Permission is hereby granted, free of charge, to any person obtaining a copy
                      8:  * of this software and associated documentation files (the "Software"), to deal
                      9:  * in the Software without restriction, including without limitation the rights
                     10:  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
                     11:  * copies of the Software, and to permit persons to whom the Software is
                     12:  * furnished to do so, subject to the following conditions:
                     13:  *
                     14:  * The above copyright notice and this permission notice shall be included in
                     15:  * all copies or substantial portions of the Software.
                     16:  *
                     17:  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
                     18:  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
                     19:  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
                     20:  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
                     21:  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
                     22:  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
                     23:  * THE SOFTWARE.
                     24:  */
                     25: 
                     26: /*
                     27:  * Register definitions
                     28:  */
                     29: 
                     30: #ifndef NDEBUG
                     31: static const char * const tcg_target_reg_names[TCG_TARGET_NB_REGS] = {
                     32:      "r0",  "r1",  "r2",  "r3",  "r4",  "r5",  "r6",  "r7",
                     33:      "r8",  "r9", "r10", "r11", "r12", "r13", "r14", "r15",
                     34:     "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
                     35:     "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
                     36:     "r32", "r33", "r34", "r35", "r36", "r37", "r38", "r39",
                     37:     "r40", "r41", "r42", "r43", "r44", "r45", "r46", "r47",
                     38:     "r48", "r49", "r50", "r51", "r52", "r53", "r54", "r55",
                     39:     "r56", "r57", "r58", "r59", "r60", "r61", "r62", "r63",
                     40: };
                     41: #endif
                     42: 
                     43: #ifdef CONFIG_USE_GUEST_BASE
                     44: #define TCG_GUEST_BASE_REG TCG_REG_R55
                     45: #else
                     46: #define TCG_GUEST_BASE_REG TCG_REG_R0
                     47: #endif
                     48: 
                     49: /* Branch registers */
                     50: enum {
                     51:     TCG_REG_B0 = 0,
                     52:     TCG_REG_B1,
                     53:     TCG_REG_B2,
                     54:     TCG_REG_B3,
                     55:     TCG_REG_B4,
                     56:     TCG_REG_B5,
                     57:     TCG_REG_B6,
                     58:     TCG_REG_B7,
                     59: };
                     60: 
                     61: /* Floating point registers */
                     62: enum {
                     63:     TCG_REG_F0 = 0,
                     64:     TCG_REG_F1,
                     65:     TCG_REG_F2,
                     66:     TCG_REG_F3,
                     67:     TCG_REG_F4,
                     68:     TCG_REG_F5,
                     69:     TCG_REG_F6,
                     70:     TCG_REG_F7,
                     71:     TCG_REG_F8,
                     72:     TCG_REG_F9,
                     73:     TCG_REG_F10,
                     74:     TCG_REG_F11,
                     75:     TCG_REG_F12,
                     76:     TCG_REG_F13,
                     77:     TCG_REG_F14,
                     78:     TCG_REG_F15,
                     79: };
                     80: 
                     81: /* Predicate registers */
                     82: enum {
                     83:     TCG_REG_P0 = 0,
                     84:     TCG_REG_P1,
                     85:     TCG_REG_P2,
                     86:     TCG_REG_P3,
                     87:     TCG_REG_P4,
                     88:     TCG_REG_P5,
                     89:     TCG_REG_P6,
                     90:     TCG_REG_P7,
                     91:     TCG_REG_P8,
                     92:     TCG_REG_P9,
                     93:     TCG_REG_P10,
                     94:     TCG_REG_P11,
                     95:     TCG_REG_P12,
                     96:     TCG_REG_P13,
                     97:     TCG_REG_P14,
                     98:     TCG_REG_P15,
                     99: };
                    100: 
                    101: /* Application registers */
                    102: enum {
                    103:     TCG_REG_PFS = 64,
                    104: };
                    105: 
                    106: static const int tcg_target_reg_alloc_order[] = {
                    107:     TCG_REG_R34,
                    108:     TCG_REG_R35,
                    109:     TCG_REG_R36,
                    110:     TCG_REG_R37,
                    111:     TCG_REG_R38,
                    112:     TCG_REG_R39,
                    113:     TCG_REG_R40,
                    114:     TCG_REG_R41,
                    115:     TCG_REG_R42,
                    116:     TCG_REG_R43,
                    117:     TCG_REG_R44,
                    118:     TCG_REG_R45,
                    119:     TCG_REG_R46,
                    120:     TCG_REG_R47,
                    121:     TCG_REG_R48,
                    122:     TCG_REG_R49,
                    123:     TCG_REG_R50,
                    124:     TCG_REG_R51,
                    125:     TCG_REG_R52,
                    126:     TCG_REG_R53,
                    127:     TCG_REG_R54,
                    128:     TCG_REG_R55,
                    129:     TCG_REG_R14,
                    130:     TCG_REG_R15,
                    131:     TCG_REG_R16,
                    132:     TCG_REG_R17,
                    133:     TCG_REG_R18,
                    134:     TCG_REG_R19,
                    135:     TCG_REG_R20,
                    136:     TCG_REG_R21,
                    137:     TCG_REG_R22,
                    138:     TCG_REG_R23,
                    139:     TCG_REG_R24,
                    140:     TCG_REG_R25,
                    141:     TCG_REG_R26,
                    142:     TCG_REG_R27,
                    143:     TCG_REG_R28,
                    144:     TCG_REG_R29,
                    145:     TCG_REG_R30,
                    146:     TCG_REG_R31,
                    147:     TCG_REG_R56,
                    148:     TCG_REG_R57,
                    149:     TCG_REG_R58,
                    150:     TCG_REG_R59,
                    151:     TCG_REG_R60,
                    152:     TCG_REG_R61,
                    153:     TCG_REG_R62,
                    154:     TCG_REG_R63,
                    155:     TCG_REG_R8,
                    156:     TCG_REG_R9,
                    157:     TCG_REG_R10,
                    158:     TCG_REG_R11
                    159: };
                    160: 
                    161: static const int tcg_target_call_iarg_regs[8] = {
                    162:     TCG_REG_R56,
                    163:     TCG_REG_R57,
                    164:     TCG_REG_R58,
                    165:     TCG_REG_R59,
                    166:     TCG_REG_R60,
                    167:     TCG_REG_R61,
                    168:     TCG_REG_R62,
                    169:     TCG_REG_R63,
                    170: };
                    171: 
                    172: static const int tcg_target_call_oarg_regs[2] = {
                    173:     TCG_REG_R8,
                    174:     TCG_REG_R9
                    175: };
                    176: 
                    177: /* maximum number of register used for input function arguments */
                    178: static inline int tcg_target_get_call_iarg_regs_count(int flags)
                    179: {
                    180:     return 8;
                    181: }
                    182: 
                    183: /*
                    184:  * opcode formation
                    185:  */
                    186: 
                    187: /* bundle templates: stops (double bar in the IA64 manual) are marked with
                    188:    an uppercase letter. */
                    189: enum {
                    190:     mii = 0x00,
                    191:     miI = 0x01,
                    192:     mIi = 0x02,
                    193:     mII = 0x03,
                    194:     mlx = 0x04,
                    195:     mLX = 0x05,
                    196:     mmi = 0x08,
                    197:     mmI = 0x09,
                    198:     Mmi = 0x0a,
                    199:     MmI = 0x0b,
                    200:     mfi = 0x0c,
                    201:     mfI = 0x0d,
                    202:     mmf = 0x0e,
                    203:     mmF = 0x0f,
                    204:     mib = 0x10,
                    205:     miB = 0x11,
                    206:     mbb = 0x12,
                    207:     mbB = 0x13,
                    208:     bbb = 0x16,
                    209:     bbB = 0x17,
                    210:     mmb = 0x18,
                    211:     mmB = 0x19,
                    212:     mfb = 0x1c,
                    213:     mfB = 0x1d,
                    214: };
                    215: 
                    216: enum {
                    217:     OPC_ADD_A1                = 0x10000000000ull,
                    218:     OPC_AND_A1                = 0x10060000000ull,
                    219:     OPC_AND_A3                = 0x10160000000ull,
                    220:     OPC_ANDCM_A1              = 0x10068000000ull,
                    221:     OPC_ANDCM_A3              = 0x10168000000ull,
                    222:     OPC_ADDS_A4               = 0x10800000000ull,
                    223:     OPC_ADDL_A5               = 0x12000000000ull,
                    224:     OPC_ALLOC_M34             = 0x02c00000000ull,
                    225:     OPC_BR_DPTK_FEW_B1        = 0x08400000000ull,
                    226:     OPC_BR_SPTK_MANY_B1       = 0x08000001000ull,
                    227:     OPC_BR_SPTK_MANY_B4       = 0x00100001000ull,
                    228:     OPC_BR_CALL_SPTK_MANY_B5  = 0x02100001000ull,
                    229:     OPC_BR_RET_SPTK_MANY_B4   = 0x00108001100ull,
                    230:     OPC_BRL_SPTK_MANY_X3      = 0x18000001000ull,
                    231:     OPC_CMP_LT_A6             = 0x18000000000ull,
                    232:     OPC_CMP_LTU_A6            = 0x1a000000000ull,
                    233:     OPC_CMP_EQ_A6             = 0x1c000000000ull,
                    234:     OPC_CMP4_LT_A6            = 0x18400000000ull,
                    235:     OPC_CMP4_LTU_A6           = 0x1a400000000ull,
                    236:     OPC_CMP4_EQ_A6            = 0x1c400000000ull,
                    237:     OPC_DEP_Z_I12             = 0x0a600000000ull,
                    238:     OPC_EXTR_I11              = 0x0a400002000ull,
                    239:     OPC_EXTR_U_I11            = 0x0a400000000ull,
                    240:     OPC_FCVT_FX_TRUNC_S1_F10  = 0x004d0000000ull,
                    241:     OPC_FCVT_FXU_TRUNC_S1_F10 = 0x004d8000000ull,
                    242:     OPC_FCVT_XF_F11           = 0x000e0000000ull,
                    243:     OPC_FMA_S1_F1             = 0x10400000000ull,
                    244:     OPC_FNMA_S1_F1            = 0x18400000000ull,
                    245:     OPC_FRCPA_S1_F6           = 0x00600000000ull,
                    246:     OPC_GETF_SIG_M19          = 0x08708000000ull,
                    247:     OPC_LD1_M1                = 0x08000000000ull,
                    248:     OPC_LD1_M3                = 0x0a000000000ull,
                    249:     OPC_LD2_M1                = 0x08040000000ull,
                    250:     OPC_LD2_M3                = 0x0a040000000ull,
                    251:     OPC_LD4_M1                = 0x08080000000ull,
                    252:     OPC_LD4_M3                = 0x0a080000000ull,
                    253:     OPC_LD8_M1                = 0x080c0000000ull,
                    254:     OPC_LD8_M3                = 0x0a0c0000000ull,
                    255:     OPC_MUX1_I3               = 0x0eca0000000ull,
                    256:     OPC_NOP_B9                = 0x04008000000ull,
                    257:     OPC_NOP_F16               = 0x00008000000ull,
                    258:     OPC_NOP_I18               = 0x00008000000ull,
                    259:     OPC_NOP_M48               = 0x00008000000ull,
                    260:     OPC_MOV_I21               = 0x00e00100000ull,
                    261:     OPC_MOV_RET_I21           = 0x00e00500000ull,
                    262:     OPC_MOV_I22               = 0x00188000000ull,
                    263:     OPC_MOV_I_I26             = 0x00150000000ull,
                    264:     OPC_MOVL_X2               = 0x0c000000000ull,
                    265:     OPC_OR_A1                 = 0x10070000000ull,
                    266:     OPC_SETF_EXP_M18          = 0x0c748000000ull,
                    267:     OPC_SETF_SIG_M18          = 0x0c708000000ull,
                    268:     OPC_SHL_I7                = 0x0f240000000ull,
                    269:     OPC_SHR_I5                = 0x0f220000000ull,
                    270:     OPC_SHR_U_I5              = 0x0f200000000ull,
                    271:     OPC_SHRP_I10              = 0x0ac00000000ull,
                    272:     OPC_SXT1_I29              = 0x000a0000000ull,
                    273:     OPC_SXT2_I29              = 0x000a8000000ull,
                    274:     OPC_SXT4_I29              = 0x000b0000000ull,
                    275:     OPC_ST1_M4                = 0x08c00000000ull,
                    276:     OPC_ST2_M4                = 0x08c40000000ull,
                    277:     OPC_ST4_M4                = 0x08c80000000ull,
                    278:     OPC_ST8_M4                = 0x08cc0000000ull,
                    279:     OPC_SUB_A1                = 0x10028000000ull,
                    280:     OPC_SUB_A3                = 0x10128000000ull,
                    281:     OPC_UNPACK4_L_I2          = 0x0f860000000ull,
                    282:     OPC_XMA_L_F2              = 0x1d000000000ull,
                    283:     OPC_XOR_A1                = 0x10078000000ull,
                    284:     OPC_ZXT1_I29              = 0x00080000000ull,
                    285:     OPC_ZXT2_I29              = 0x00088000000ull,
                    286:     OPC_ZXT4_I29              = 0x00090000000ull,
                    287: };
                    288: 
                    289: static inline uint64_t tcg_opc_a1(int qp, uint64_t opc, int r1,
                    290:                                   int r2, int r3)
                    291: {
                    292:     return opc
                    293:            | ((r3 & 0x7f) << 20)
                    294:            | ((r2 & 0x7f) << 13)
                    295:            | ((r1 & 0x7f) << 6)
                    296:            | (qp & 0x3f);
                    297: }
                    298: 
                    299: static inline uint64_t tcg_opc_a3(int qp, uint64_t opc, int r1,
                    300:                                   uint64_t imm, int r3)
                    301: {
                    302:     return opc
                    303:            | ((imm & 0x80) << 29) /* s */
                    304:            | ((imm & 0x7f) << 13) /* imm7b */
                    305:            | ((r3 & 0x7f) << 20)
                    306:            | ((r1 & 0x7f) << 6)
                    307:            | (qp & 0x3f);
                    308: }
                    309: 
                    310: static inline uint64_t tcg_opc_a4(int qp, uint64_t opc, int r1,
                    311:                                   uint64_t imm, int r3)
                    312: {
                    313:     return opc
                    314:            | ((imm & 0x2000) << 23) /* s */
                    315:            | ((imm & 0x1f80) << 20) /* imm6d */
                    316:            | ((imm & 0x007f) << 13) /* imm7b */
                    317:            | ((r3 & 0x7f) << 20)
                    318:            | ((r1 & 0x7f) << 6)
                    319:            | (qp & 0x3f);
                    320: }
                    321: 
                    322: static inline uint64_t tcg_opc_a5(int qp, uint64_t opc, int r1,
                    323:                                   uint64_t imm, int r3)
                    324: {
                    325:     return opc
                    326:            | ((imm & 0x200000) << 15) /* s */
                    327:            | ((imm & 0x1f0000) <<  6) /* imm5c */
                    328:            | ((imm & 0x00ff80) << 20) /* imm9d */
                    329:            | ((imm & 0x00007f) << 13) /* imm7b */
                    330:            | ((r3 & 0x03) << 20)
                    331:            | ((r1 & 0x7f) << 6)
                    332:            | (qp & 0x3f);
                    333: }
                    334: 
                    335: static inline uint64_t tcg_opc_a6(int qp, uint64_t opc, int p1,
                    336:                                   int p2, int r2, int r3)
                    337: {
                    338:     return opc
                    339:            | ((p2 & 0x3f) << 27)
                    340:            | ((r3 & 0x7f) << 20)
                    341:            | ((r2 & 0x7f) << 13)
                    342:            | ((p1 & 0x3f) << 6)
                    343:            | (qp & 0x3f);
                    344: }
                    345: 
                    346: static inline uint64_t tcg_opc_b1(int qp, uint64_t opc, uint64_t imm)
                    347: {
                    348:     return opc
                    349:            | ((imm & 0x100000) << 16) /* s */
                    350:            | ((imm & 0x0fffff) << 13) /* imm20b */
                    351:            | (qp & 0x3f);
                    352: }
                    353: 
                    354: static inline uint64_t tcg_opc_b4(int qp, uint64_t opc, int b2)
                    355: {
                    356:     return opc
                    357:            | ((b2 & 0x7) << 13)
                    358:            | (qp & 0x3f);
                    359: }
                    360: 
                    361: static inline uint64_t tcg_opc_b5(int qp, uint64_t opc, int b1, int b2)
                    362: {
                    363:     return opc
                    364:            | ((b2 & 0x7) << 13)
                    365:            | ((b1 & 0x7) << 6)
                    366:            | (qp & 0x3f);
                    367: }
                    368: 
                    369: 
                    370: static inline uint64_t tcg_opc_b9(int qp, uint64_t opc, uint64_t imm)
                    371: {
                    372:     return opc
                    373:            | ((imm & 0x100000) << 16) /* i */
                    374:            | ((imm & 0x0fffff) << 6)  /* imm20a */
                    375:            | (qp & 0x3f);
                    376: }
                    377: 
                    378: static inline uint64_t tcg_opc_f1(int qp, uint64_t opc, int f1,
                    379:                                   int f3, int f4, int f2)
                    380: {
                    381:     return opc
                    382:            | ((f4 & 0x7f) << 27)
                    383:            | ((f3 & 0x7f) << 20)
                    384:            | ((f2 & 0x7f) << 13)
                    385:            | ((f1 & 0x7f) << 6)
                    386:            | (qp & 0x3f);
                    387: }
                    388: 
                    389: static inline uint64_t tcg_opc_f2(int qp, uint64_t opc, int f1,
                    390:                                   int f3, int f4, int f2)
                    391: {
                    392:     return opc
                    393:            | ((f4 & 0x7f) << 27)
                    394:            | ((f3 & 0x7f) << 20)
                    395:            | ((f2 & 0x7f) << 13)
                    396:            | ((f1 & 0x7f) << 6)
                    397:            | (qp & 0x3f);
                    398: }
                    399: 
                    400: static inline uint64_t tcg_opc_f6(int qp, uint64_t opc, int f1,
                    401:                                   int p2, int f2, int f3)
                    402: {
                    403:     return opc
                    404:            | ((p2 & 0x3f) << 27)
                    405:            | ((f3 & 0x7f) << 20)
                    406:            | ((f2 & 0x7f) << 13)
                    407:            | ((f1 & 0x7f) << 6)
                    408:            | (qp & 0x3f);
                    409: }
                    410: 
                    411: static inline uint64_t tcg_opc_f10(int qp, uint64_t opc, int f1, int f2)
                    412: {
                    413:     return opc
                    414:            | ((f2 & 0x7f) << 13)
                    415:            | ((f1 & 0x7f) << 6)
                    416:            | (qp & 0x3f);
                    417: }
                    418: 
                    419: static inline uint64_t tcg_opc_f11(int qp, uint64_t opc, int f1, int f2)
                    420: {
                    421:     return opc
                    422:            | ((f2 & 0x7f) << 13)
                    423:            | ((f1 & 0x7f) << 6)
                    424:            | (qp & 0x3f);
                    425: }
                    426: 
                    427: static inline uint64_t tcg_opc_f16(int qp, uint64_t opc, uint64_t imm)
                    428: {
                    429:     return opc
                    430:            | ((imm & 0x100000) << 16) /* i */
                    431:            | ((imm & 0x0fffff) << 6)  /* imm20a */
                    432:            | (qp & 0x3f);
                    433: }
                    434: 
                    435: static inline uint64_t tcg_opc_i2(int qp, uint64_t opc, int r1,
                    436:                                   int r2, int r3)
                    437: {
                    438:     return opc
                    439:            | ((r3 & 0x7f) << 20)
                    440:            | ((r2 & 0x7f) << 13)
                    441:            | ((r1 & 0x7f) << 6)
                    442:            | (qp & 0x3f);
                    443: }
                    444: 
                    445: static inline uint64_t tcg_opc_i3(int qp, uint64_t opc, int r1,
                    446:                                   int r2, int mbtype)
                    447: {
                    448:     return opc
                    449:            | ((mbtype & 0x0f) << 20)
                    450:            | ((r2 & 0x7f) << 13)
                    451:            | ((r1 & 0x7f) << 6)
                    452:            | (qp & 0x3f);
                    453: }
                    454: 
                    455: static inline uint64_t tcg_opc_i5(int qp, uint64_t opc, int r1,
                    456:                                   int r3, int r2)
                    457: {
                    458:     return opc
                    459:            | ((r3 & 0x7f) << 20)
                    460:            | ((r2 & 0x7f) << 13)
                    461:            | ((r1 & 0x7f) << 6)
                    462:            | (qp & 0x3f);
                    463: }
                    464: 
                    465: static inline uint64_t tcg_opc_i7(int qp, uint64_t opc, int r1,
                    466:                                   int r2, int r3)
                    467: {
                    468:     return opc
                    469:            | ((r3 & 0x7f) << 20)
                    470:            | ((r2 & 0x7f) << 13)
                    471:            | ((r1 & 0x7f) << 6)
                    472:            | (qp & 0x3f);
                    473: }
                    474: 
                    475: static inline uint64_t tcg_opc_i10(int qp, uint64_t opc, int r1,
                    476:                                    int r2, int r3, uint64_t count)
                    477: {
                    478:     return opc
                    479:            | ((count & 0x3f) << 27)
                    480:            | ((r3 & 0x7f) << 20)
                    481:            | ((r2 & 0x7f) << 13)
                    482:            | ((r1 & 0x7f) << 6)
                    483:            | (qp & 0x3f);
                    484: }
                    485: 
                    486: static inline uint64_t tcg_opc_i11(int qp, uint64_t opc, int r1,
                    487:                                    int r3, uint64_t pos, uint64_t len)
                    488: {
                    489:     return opc
                    490:            | ((len & 0x3f) << 27)
                    491:            | ((r3 & 0x7f) << 20)
                    492:            | ((pos & 0x3f) << 14)
                    493:            | ((r1 & 0x7f) << 6)
                    494:            | (qp & 0x3f);
                    495: }
                    496: 
                    497: static inline uint64_t tcg_opc_i12(int qp, uint64_t opc, int r1,
                    498:                                    int r2, uint64_t pos, uint64_t len)
                    499: {
                    500:     return opc
                    501:            | ((len & 0x3f) << 27)
                    502:            | ((pos & 0x3f) << 20)
                    503:            | ((r2 & 0x7f) << 13)
                    504:            | ((r1 & 0x7f) << 6)
                    505:            | (qp & 0x3f);
                    506: }
                    507: 
                    508: static inline uint64_t tcg_opc_i18(int qp, uint64_t opc, uint64_t imm)
                    509: {
                    510:     return opc
                    511:            | ((imm & 0x100000) << 16) /* i */
                    512:            | ((imm & 0x0fffff) << 6)  /* imm20a */
                    513:            | (qp & 0x3f);
                    514: }
                    515: 
                    516: static inline uint64_t tcg_opc_i21(int qp, uint64_t opc, int b1,
                    517:                                    int r2, uint64_t imm)
                    518: {
                    519:     return opc
                    520:            | ((imm & 0x1ff) << 24)
                    521:            | ((r2 & 0x7f) << 13)
                    522:            | ((b1 & 0x7) << 6)
                    523:            | (qp & 0x3f);
                    524: }
                    525: 
                    526: static inline uint64_t tcg_opc_i22(int qp, uint64_t opc, int r1, int b2)
                    527: {
                    528:     return opc
                    529:            | ((b2 & 0x7) << 13)
                    530:            | ((r1 & 0x7f) << 6)
                    531:            | (qp & 0x3f);
                    532: }
                    533: 
                    534: static inline uint64_t tcg_opc_i26(int qp, uint64_t opc, int ar3, int r2)
                    535: {
                    536:     return opc
                    537:            | ((ar3 & 0x7f) << 20)
                    538:            | ((r2 & 0x7f) << 13)
                    539:            | (qp & 0x3f);
                    540: }
                    541: 
                    542: static inline uint64_t tcg_opc_i29(int qp, uint64_t opc, int r1, int r3)
                    543: {
                    544:     return opc
                    545:            | ((r3 & 0x7f) << 20)
                    546:            | ((r1 & 0x7f) << 6)
                    547:            | (qp & 0x3f);
                    548: }
                    549: 
                    550: static inline uint64_t tcg_opc_l2(uint64_t imm)
                    551: {
                    552:     return (imm & 0x7fffffffffc00000ull) >> 22;
                    553: }
                    554: 
                    555: static inline uint64_t tcg_opc_l3(uint64_t imm)
                    556: {
                    557:     return (imm & 0x07fffffffff00000ull) >> 18;
                    558: }
                    559: 
                    560: static inline uint64_t tcg_opc_m1(int qp, uint64_t opc, int r1, int r3)
                    561: {
                    562:     return opc
                    563:            | ((r3 & 0x7f) << 20)
                    564:            | ((r1 & 0x7f) << 6)
                    565:            | (qp & 0x3f);
                    566: }
                    567: 
                    568: static inline uint64_t tcg_opc_m3(int qp, uint64_t opc, int r1,
                    569:                                   int r3, uint64_t imm)
                    570: {
                    571:     return opc
                    572:            | ((imm & 0x100) << 28) /* s */
                    573:            | ((imm & 0x080) << 20) /* i */
                    574:            | ((imm & 0x07f) << 13) /* imm7b */
                    575:            | ((r3 & 0x7f) << 20)
                    576:            | ((r1 & 0x7f) << 6)
                    577:            | (qp & 0x3f);
                    578: }
                    579: 
                    580: static inline uint64_t tcg_opc_m4(int qp, uint64_t opc, int r2, int r3)
                    581: {
                    582:     return opc
                    583:            | ((r3 & 0x7f) << 20)
                    584:            | ((r2 & 0x7f) << 13)
                    585:            | (qp & 0x3f);
                    586: }
                    587: 
                    588: static inline uint64_t tcg_opc_m18(int qp, uint64_t opc, int f1, int r2)
                    589: {
                    590:     return opc
                    591:            | ((r2 & 0x7f) << 13)
                    592:            | ((f1 & 0x7f) << 6)
                    593:            | (qp & 0x3f);
                    594: }
                    595: 
                    596: static inline uint64_t tcg_opc_m19(int qp, uint64_t opc, int r1, int f2)
                    597: {
                    598:     return opc
                    599:            | ((f2 & 0x7f) << 13)
                    600:            | ((r1 & 0x7f) << 6)
                    601:            | (qp & 0x3f);
                    602: }
                    603: 
                    604: static inline uint64_t tcg_opc_m34(int qp, uint64_t opc, int r1,
                    605:                                    int sof, int sol, int sor)
                    606: {
                    607:     return opc
                    608:            | ((sor & 0x0f) << 27)
                    609:            | ((sol & 0x7f) << 20)
                    610:            | ((sof & 0x7f) << 13)
                    611:            | ((r1 & 0x7f) << 6)
                    612:            | (qp & 0x3f);
                    613: }
                    614: 
                    615: static inline uint64_t tcg_opc_m48(int qp, uint64_t opc, uint64_t imm)
                    616: {
                    617:     return opc
                    618:            | ((imm & 0x100000) << 16) /* i */
                    619:            | ((imm & 0x0fffff) << 6)  /* imm20a */
                    620:            | (qp & 0x3f);
                    621: }
                    622: 
                    623: static inline uint64_t tcg_opc_x2(int qp, uint64_t opc,
                    624:                                   int r1, uint64_t imm)
                    625: {
                    626:     return opc
                    627:            | ((imm & 0x8000000000000000ull) >> 27) /* i */
                    628:            |  (imm & 0x0000000000200000ull)        /* ic */
                    629:            | ((imm & 0x00000000001f0000ull) << 6)  /* imm5c */
                    630:            | ((imm & 0x000000000000ff80ull) << 20) /* imm9d */
                    631:            | ((imm & 0x000000000000007full) << 13) /* imm7b */
                    632:            | ((r1 & 0x7f) << 6)
                    633:            | (qp & 0x3f);
                    634: }
                    635: 
                    636: static inline uint64_t tcg_opc_x3(int qp, uint64_t opc, uint64_t imm)
                    637: {
                    638:     return opc
                    639:            | ((imm & 0x0800000000000000ull) >> 23) /* i */
                    640:            | ((imm & 0x00000000000fffffull) << 13) /* imm20b */
                    641:            | (qp & 0x3f);
                    642: }
                    643: 
                    644: 
                    645: /*
                    646:  * Relocations
                    647:  */
                    648: 
                    649: static inline void reloc_pcrel21b (void *pc, tcg_target_long target)
                    650: {
                    651:     uint64_t imm;
                    652:     int64_t disp;
                    653:     int slot;
                    654: 
                    655:     slot = (tcg_target_long) pc & 3;
                    656:     pc = (void *)((tcg_target_long) pc & ~3);
                    657: 
                    658:     disp = target - (tcg_target_long) pc;
                    659:     imm = (uint64_t) disp >> 4;
                    660: 
                    661:     switch(slot) {
                    662:     case 0:
                    663:         *(uint64_t *)(pc + 0) = (*(uint64_t *)(pc + 8) & 0xfffffdc00003ffffull)
                    664:                                 | ((imm & 0x100000) << 21)  /* s */
                    665:                                 | ((imm & 0x0fffff) << 18); /* imm20b */
                    666:         break;
                    667:     case 1:
                    668:         *(uint64_t *)(pc + 8) = (*(uint64_t *)(pc + 8) & 0xfffffffffffb8000ull)
                    669:                                 | ((imm & 0x100000) >> 2)   /* s */
                    670:                                 | ((imm & 0x0fffe0) >> 5);  /* imm20b */
                    671:         *(uint64_t *)(pc + 0) = (*(uint64_t *)(pc + 0) & 0x07ffffffffffffffull)
                    672:                                 | ((imm & 0x00001f) << 59); /* imm20b */
                    673:         break;
                    674:     case 2:
                    675:         *(uint64_t *)(pc + 8) = (*(uint64_t *)(pc + 8) & 0xf700000fffffffffull)
                    676:                                 | ((imm & 0x100000) << 39)  /* s */
                    677:                                 | ((imm & 0x0fffff) << 36); /* imm20b */
                    678:         break;
                    679:     }
                    680: }
                    681: 
                    682: static inline uint64_t get_reloc_pcrel21b (void *pc)
                    683: {
                    684:     int64_t low, high;
                    685:     int slot;
                    686: 
                    687:     slot = (tcg_target_long) pc & 3;
                    688:     pc = (void *)((tcg_target_long) pc & ~3);
                    689: 
                    690:     low  = (*(uint64_t *)(pc + 0));
                    691:     high = (*(uint64_t *)(pc + 8));
                    692: 
                    693:     switch(slot) {
                    694:     case 0:
                    695:         return ((low >> 21) & 0x100000) + /* s */
                    696:                ((low >> 18) & 0x0fffff);  /* imm20b */
                    697:     case 1:
                    698:         return ((high << 2) & 0x100000) + /* s */
                    699:                ((high << 5) & 0x0fffe0) + /* imm20b */
                    700:                ((low >> 59) & 0x00001f);  /* imm20b */
                    701:     case 2:
                    702:         return ((high >> 39) & 0x100000) + /* s */
                    703:                ((high >> 36) & 0x0fffff);  /* imm20b */
                    704:     default:
                    705:         tcg_abort();
                    706:     }
                    707: }
                    708: 
                    709: static inline void reloc_pcrel60b (void *pc, tcg_target_long target)
                    710: {
                    711:     int64_t disp;
                    712:     uint64_t imm;
                    713: 
                    714:     disp = target - (tcg_target_long) pc;
                    715:     imm = (uint64_t) disp >> 4;
                    716: 
                    717:     *(uint64_t *)(pc + 8) = (*(uint64_t *)(pc + 8) & 0xf700000fff800000ull)
                    718:                              |  (imm & 0x0800000000000000ull)         /* s */
                    719:                              | ((imm & 0x07fffff000000000ull) >> 36)  /* imm39 */
                    720:                              | ((imm & 0x00000000000fffffull) << 36); /* imm20b */
                    721:     *(uint64_t *)(pc + 0) = (*(uint64_t *)(pc + 0) & 0x00003fffffffffffull)
                    722:                              | ((imm & 0x0000000ffff00000ull) << 28); /* imm39 */
                    723: }
                    724: 
                    725: static inline uint64_t get_reloc_pcrel60b (void *pc)
                    726: {
                    727:     int64_t low, high;
                    728: 
                    729:     low  = (*(uint64_t *)(pc + 0));
                    730:     high = (*(uint64_t *)(pc + 8));
                    731: 
                    732:     return ((high)       & 0x0800000000000000ull) + /* s */
                    733:            ((high >> 36) & 0x00000000000fffffull) + /* imm20b */
                    734:            ((high << 36) & 0x07fffff000000000ull) + /* imm39 */
                    735:            ((low >> 28)  & 0x0000000ffff00000ull);  /* imm39 */
                    736: }
                    737: 
                    738: 
                    739: static void patch_reloc(uint8_t *code_ptr, int type,
                    740:                         tcg_target_long value, tcg_target_long addend)
                    741: {
                    742:     value += addend;
                    743:     switch (type) {
                    744:     case R_IA64_PCREL21B:
                    745:         reloc_pcrel21b(code_ptr, value);
                    746:         break;
                    747:     case R_IA64_PCREL60B:
                    748:         reloc_pcrel60b(code_ptr, value);
                    749:     default:
                    750:         tcg_abort();
                    751:     }
                    752: }
                    753: 
                    754: /*
                    755:  * Constraints
                    756:  */
                    757: 
                    758: /* parse target specific constraints */
                    759: static int target_parse_constraint(TCGArgConstraint *ct, const char **pct_str)
                    760: {
                    761:     const char *ct_str;
                    762: 
                    763:     ct_str = *pct_str;
                    764:     switch(ct_str[0]) {
                    765:     case 'r':
                    766:         ct->ct |= TCG_CT_REG;
                    767:         tcg_regset_set(ct->u.regs, 0xffffffffffffffffull);
                    768:         break;
                    769:     case 'I':
                    770:         ct->ct |= TCG_CT_CONST_S22;
                    771:         break;
                    772:     case 'S':
                    773:         ct->ct |= TCG_CT_REG;
                    774:         tcg_regset_set(ct->u.regs, 0xffffffffffffffffull);
                    775: #if defined(CONFIG_SOFTMMU)
                    776:         tcg_regset_reset_reg(ct->u.regs, TCG_REG_R56);
                    777:         tcg_regset_reset_reg(ct->u.regs, TCG_REG_R57);
                    778: #endif
                    779:         break;
                    780:     case 'Z':
                    781:         /* We are cheating a bit here, using the fact that the register
                    782:            r0 is also the register number 0. Hence there is no need
                    783:            to check for const_args in each instruction. */
                    784:         ct->ct |= TCG_CT_CONST_ZERO;
                    785:         break;
                    786:     default:
                    787:         return -1;
                    788:     }
                    789:     ct_str++;
                    790:     *pct_str = ct_str;
                    791:     return 0;
                    792: }
                    793: 
                    794: /* test if a constant matches the constraint */
                    795: static inline int tcg_target_const_match(tcg_target_long val,
                    796:                                          const TCGArgConstraint *arg_ct)
                    797: {
                    798:     int ct;
                    799:     ct = arg_ct->ct;
                    800:     if (ct & TCG_CT_CONST)
                    801:         return 1;
                    802:     else if ((ct & TCG_CT_CONST_ZERO) && val == 0)
                    803:         return 1;
                    804:     else if ((ct & TCG_CT_CONST_S22) && val == ((int32_t)val << 10) >> 10)
                    805:         return 1;
                    806:     else
                    807:         return 0;
                    808: }
                    809: 
                    810: /*
                    811:  * Code generation
                    812:  */
                    813: 
                    814: static uint8_t *tb_ret_addr;
                    815: 
                    816: static inline void tcg_out_bundle(TCGContext *s, int template,
                    817:                                   uint64_t slot0, uint64_t slot1,
                    818:                                   uint64_t slot2)
                    819: {
                    820:     template &= 0x1f;          /* 5 bits */
                    821:     slot0 &= 0x1ffffffffffull; /* 41 bits */
                    822:     slot1 &= 0x1ffffffffffull; /* 41 bits */
                    823:     slot2 &= 0x1ffffffffffull; /* 41 bits */
                    824: 
                    825:     *(uint64_t *)(s->code_ptr + 0) = (slot1 << 46) | (slot0 << 5) | template;
                    826:     *(uint64_t *)(s->code_ptr + 8) = (slot2 << 23) | (slot1 >> 18);
                    827:     s->code_ptr += 16;
                    828: }
                    829: 
                    830: static inline void tcg_out_mov(TCGContext *s, TCGType type,
                    831:                                TCGArg ret, TCGArg arg)
                    832: {
                    833:     tcg_out_bundle(s, mmI,
                    834:                    tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
                    835:                    tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
                    836:                    tcg_opc_a4(TCG_REG_P0, OPC_ADDS_A4, ret, 0, arg));
                    837: }
                    838: 
                    839: static inline void tcg_out_movi(TCGContext *s, TCGType type,
                    840:                                 TCGArg reg, tcg_target_long arg)
                    841: {
                    842:     tcg_out_bundle(s, mLX,
                    843:                    tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
                    844:                    tcg_opc_l2 (arg),
                    845:                    tcg_opc_x2 (TCG_REG_P0, OPC_MOVL_X2, reg, arg));
                    846: }
                    847: 
                    848: static inline void tcg_out_addi(TCGContext *s, TCGArg reg, tcg_target_long val)
                    849: {
                    850:     if (val == ((int32_t)val << 10) >> 10) {
                    851:         tcg_out_bundle(s, MmI,
                    852:                        tcg_opc_a5(TCG_REG_P0, OPC_ADDL_A5,
                    853:                                   TCG_REG_R2, val, TCG_REG_R0),
                    854:                        tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
                    855:                        tcg_opc_a1 (TCG_REG_P0, OPC_ADD_A1, reg,
                    856:                                    reg, TCG_REG_R2));
                    857:     } else {
                    858:         tcg_out_movi(s, TCG_TYPE_PTR, TCG_REG_R2, val);
                    859:         tcg_out_bundle(s, mmI,
                    860:                        tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
                    861:                        tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
                    862:                        tcg_opc_a1 (TCG_REG_P0, OPC_ADD_A1, reg,
                    863:                                    reg, TCG_REG_R2));
                    864:     }
                    865: }
                    866: 
                    867: static void tcg_out_br(TCGContext *s, int label_index)
                    868: {
                    869:     TCGLabel *l = &s->labels[label_index];
                    870: 
                    871:     tcg_out_bundle(s, mmB,
                    872:                    tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
                    873:                    tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
                    874:                    tcg_opc_b1 (TCG_REG_P0, OPC_BR_SPTK_MANY_B1,
                    875:                                get_reloc_pcrel21b(s->code_ptr + 2)));
                    876: 
                    877:     if (l->has_value) {
                    878:         reloc_pcrel21b((s->code_ptr - 16) + 2, l->u.value);
                    879:     } else {
                    880:         tcg_out_reloc(s, (s->code_ptr - 16) + 2,
                    881:                       R_IA64_PCREL21B, label_index, 0);
                    882:     }
                    883: }
                    884: 
                    885: static inline void tcg_out_call(TCGContext *s, TCGArg addr)
                    886: {
                    887:     tcg_out_bundle(s, MmI,
                    888:                    tcg_opc_m1 (TCG_REG_P0, OPC_LD8_M1, TCG_REG_R2, addr),
                    889:                    tcg_opc_a4 (TCG_REG_P0, OPC_ADDS_A4, TCG_REG_R3, 8, addr),
                    890:                    tcg_opc_i21(TCG_REG_P0, OPC_MOV_I21,
                    891:                                TCG_REG_B6, TCG_REG_R2, 0));
                    892:     tcg_out_bundle(s, mmB,
                    893:                    tcg_opc_m1 (TCG_REG_P0, OPC_LD8_M1, TCG_REG_R1, TCG_REG_R3),
                    894:                    tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
                    895:                    tcg_opc_b5 (TCG_REG_P0, OPC_BR_CALL_SPTK_MANY_B5,
                    896:                                TCG_REG_B0, TCG_REG_B6));
                    897: }
                    898: 
                    899: static void tcg_out_exit_tb(TCGContext *s, tcg_target_long arg)
                    900: {
                    901:     int64_t disp;
                    902:     uint64_t imm;
                    903: 
                    904:     tcg_out_movi(s, TCG_TYPE_PTR, TCG_REG_R8, arg);
                    905: 
                    906:     disp = tb_ret_addr - s->code_ptr;
                    907:     imm = (uint64_t)disp >> 4;
                    908: 
                    909:     tcg_out_bundle(s, mLX,
                    910:                    tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
                    911:                    tcg_opc_l3 (imm),
                    912:                    tcg_opc_x3 (TCG_REG_P0, OPC_BRL_SPTK_MANY_X3, imm));
                    913: }
                    914: 
                    915: static inline void tcg_out_goto_tb(TCGContext *s, TCGArg arg)
                    916: {
                    917:     if (s->tb_jmp_offset) {
                    918:         /* direct jump method */
                    919:         tcg_abort();
                    920:     } else {
                    921:         /* indirect jump method */
                    922:         tcg_out_movi(s, TCG_TYPE_PTR, TCG_REG_R2,
                    923:                      (tcg_target_long)(s->tb_next + arg));
                    924:         tcg_out_bundle(s, MmI,
                    925:                        tcg_opc_m1 (TCG_REG_P0, OPC_LD8_M1,
                    926:                                    TCG_REG_R2, TCG_REG_R2),
                    927:                        tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
                    928:                        tcg_opc_i21(TCG_REG_P0, OPC_MOV_I21, TCG_REG_B6,
                    929:                                    TCG_REG_R2, 0));
                    930:         tcg_out_bundle(s, mmB,
                    931:                        tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
                    932:                        tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
                    933:                        tcg_opc_b4 (TCG_REG_P0, OPC_BR_SPTK_MANY_B4,
                    934:                                    TCG_REG_B6));
                    935:     }
                    936:     s->tb_next_offset[arg] = s->code_ptr - s->code_buf;
                    937: }
                    938: 
                    939: static inline void tcg_out_jmp(TCGContext *s, TCGArg addr)
                    940: {
                    941:     tcg_out_bundle(s, mmI,
                    942:                    tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
                    943:                    tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
                    944:                    tcg_opc_i21(TCG_REG_P0, OPC_MOV_I21, TCG_REG_B6, addr, 0));
                    945:     tcg_out_bundle(s, mmB,
                    946:                    tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
                    947:                    tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
                    948:                    tcg_opc_b4(TCG_REG_P0, OPC_BR_SPTK_MANY_B4, TCG_REG_B6));
                    949: }
                    950: 
                    951: static inline void tcg_out_ld_rel(TCGContext *s, uint64_t opc_m4, TCGArg arg,
                    952:                                   TCGArg arg1, tcg_target_long arg2)
                    953: {
                    954:     if (arg2 == ((int16_t)arg2 >> 2) << 2) {
                    955:         tcg_out_bundle(s, MmI,
                    956:                        tcg_opc_a4(TCG_REG_P0, OPC_ADDS_A4,
                    957:                                   TCG_REG_R2, arg2, arg1),
                    958:                        tcg_opc_m1 (TCG_REG_P0, opc_m4, arg, TCG_REG_R2),
                    959:                        tcg_opc_i18(TCG_REG_P0, OPC_NOP_I18, 0));
                    960:     } else {
                    961:         tcg_out_movi(s, TCG_TYPE_PTR, TCG_REG_R2, arg2);
                    962:         tcg_out_bundle(s, MmI,
                    963:                        tcg_opc_a1 (TCG_REG_P0, OPC_ADD_A1,
                    964:                                    TCG_REG_R2, TCG_REG_R2, arg1),
                    965:                        tcg_opc_m1 (TCG_REG_P0, opc_m4, arg, TCG_REG_R2),
                    966:                        tcg_opc_i18(TCG_REG_P0, OPC_NOP_I18, 0));
                    967:     }
                    968: }
                    969: 
                    970: static inline void tcg_out_st_rel(TCGContext *s, uint64_t opc_m4, TCGArg arg,
                    971:                                   TCGArg arg1, tcg_target_long arg2)
                    972: {
                    973:     if (arg2 == ((int16_t)arg2 >> 2) << 2) {
                    974:         tcg_out_bundle(s, MmI,
                    975:                        tcg_opc_a4(TCG_REG_P0, OPC_ADDS_A4,
                    976:                                   TCG_REG_R2, arg2, arg1),
                    977:                        tcg_opc_m4 (TCG_REG_P0, opc_m4, arg, TCG_REG_R2),
                    978:                        tcg_opc_i18(TCG_REG_P0, OPC_NOP_I18, 0));
                    979:     } else {
                    980:         tcg_out_movi(s, TCG_TYPE_PTR, TCG_REG_R2, arg2);
                    981:         tcg_out_bundle(s, MmI,
                    982:                        tcg_opc_a1 (TCG_REG_P0, OPC_ADD_A1,
                    983:                                    TCG_REG_R2, TCG_REG_R2, arg1),
                    984:                        tcg_opc_m4 (TCG_REG_P0, opc_m4, arg, TCG_REG_R2),
                    985:                        tcg_opc_i18(TCG_REG_P0, OPC_NOP_I18, 0));
                    986:     }
                    987: }
                    988: 
                    989: static inline void tcg_out_ld(TCGContext *s, TCGType type, TCGArg arg,
                    990:                               TCGArg arg1, tcg_target_long arg2)
                    991: {
                    992:     if (type == TCG_TYPE_I32) {
                    993:         tcg_out_ld_rel(s, OPC_LD4_M1, arg, arg1, arg2);
                    994:     } else {
                    995:         tcg_out_ld_rel(s, OPC_LD8_M1, arg, arg1, arg2);
                    996:     }
                    997: }
                    998: 
                    999: static inline void tcg_out_st(TCGContext *s, TCGType type, TCGArg arg,
                   1000:                               TCGArg arg1, tcg_target_long arg2)
                   1001: {
                   1002:     if (type == TCG_TYPE_I32) {
                   1003:         tcg_out_st_rel(s, OPC_ST4_M4, arg, arg1, arg2);
                   1004:     } else {
                   1005:         tcg_out_st_rel(s, OPC_ST8_M4, arg, arg1, arg2);
                   1006:     }
                   1007: }
                   1008: 
                   1009: static inline void tcg_out_alu(TCGContext *s, uint64_t opc_a1, TCGArg ret,
                   1010:                                TCGArg arg1, int const_arg1,
                   1011:                                TCGArg arg2, int const_arg2)
                   1012: {
                   1013:     uint64_t opc1, opc2;
                   1014: 
                   1015:     if (const_arg1 && arg1 != 0) {
                   1016:         opc1 = tcg_opc_a5(TCG_REG_P0, OPC_ADDL_A5,
                   1017:                           TCG_REG_R2, arg1, TCG_REG_R0);
                   1018:         arg1 = TCG_REG_R2;
                   1019:     } else {
                   1020:         opc1 = tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0);
                   1021:     }
                   1022: 
                   1023:     if (const_arg2 && arg2 != 0) {
                   1024:         opc2 = tcg_opc_a5(TCG_REG_P0, OPC_ADDL_A5,
                   1025:                           TCG_REG_R3, arg2, TCG_REG_R0);
                   1026:         arg2 = TCG_REG_R3;
                   1027:     } else {
                   1028:         opc2 = tcg_opc_i18(TCG_REG_P0, OPC_NOP_I18, 0);
                   1029:     }
                   1030: 
                   1031:     tcg_out_bundle(s, mII,
                   1032:                    opc1,
                   1033:                    opc2,
                   1034:                    tcg_opc_a1(TCG_REG_P0, opc_a1, ret, arg1, arg2));
                   1035: }
                   1036: 
                   1037: static inline void tcg_out_eqv(TCGContext *s, TCGArg ret,
                   1038:                                TCGArg arg1, int const_arg1,
                   1039:                                TCGArg arg2, int const_arg2)
                   1040: {
                   1041:     tcg_out_bundle(s, mII,
                   1042:                    tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
                   1043:                    tcg_opc_a1 (TCG_REG_P0, OPC_XOR_A1, ret, arg1, arg2),
                   1044:                    tcg_opc_a3 (TCG_REG_P0, OPC_ANDCM_A3, ret, -1, ret));
                   1045: }
                   1046: 
                   1047: static inline void tcg_out_nand(TCGContext *s, TCGArg ret,
                   1048:                                 TCGArg arg1, int const_arg1,
                   1049:                                 TCGArg arg2, int const_arg2)
                   1050: {
                   1051:     tcg_out_bundle(s, mII,
                   1052:                    tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
                   1053:                    tcg_opc_a1 (TCG_REG_P0, OPC_AND_A1, ret, arg1, arg2),
                   1054:                    tcg_opc_a3 (TCG_REG_P0, OPC_ANDCM_A3, ret, -1, ret));
                   1055: }
                   1056: 
                   1057: static inline void tcg_out_nor(TCGContext *s, TCGArg ret,
                   1058:                                TCGArg arg1, int const_arg1,
                   1059:                                TCGArg arg2, int const_arg2)
                   1060: {
                   1061:     tcg_out_bundle(s, mII,
                   1062:                    tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
                   1063:                    tcg_opc_a1 (TCG_REG_P0, OPC_OR_A1, ret, arg1, arg2),
                   1064:                    tcg_opc_a3 (TCG_REG_P0, OPC_ANDCM_A3, ret, -1, ret));
                   1065: }
                   1066: 
                   1067: static inline void tcg_out_orc(TCGContext *s, TCGArg ret,
                   1068:                                TCGArg arg1, int const_arg1,
                   1069:                                TCGArg arg2, int const_arg2)
                   1070: {
                   1071:     tcg_out_bundle(s, mII,
                   1072:                    tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
                   1073:                    tcg_opc_a3 (TCG_REG_P0, OPC_ANDCM_A3, TCG_REG_R2, -1, arg2),
                   1074:                    tcg_opc_a1 (TCG_REG_P0, OPC_OR_A1, ret, arg1, TCG_REG_R2));
                   1075: }
                   1076: 
                   1077: static inline void tcg_out_mul(TCGContext *s, TCGArg ret,
                   1078:                                TCGArg arg1, TCGArg arg2)
                   1079: {
                   1080:     tcg_out_bundle(s, mmI,
                   1081:                    tcg_opc_m18(TCG_REG_P0, OPC_SETF_SIG_M18, TCG_REG_F6, arg1),
                   1082:                    tcg_opc_m18(TCG_REG_P0, OPC_SETF_SIG_M18, TCG_REG_F7, arg2),
                   1083:                    tcg_opc_i18(TCG_REG_P0, OPC_NOP_I18, 0));
                   1084:     tcg_out_bundle(s, mmF,
                   1085:                    tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
                   1086:                    tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
                   1087:                    tcg_opc_f2 (TCG_REG_P0, OPC_XMA_L_F2, TCG_REG_F6, TCG_REG_F6,
                   1088:                                TCG_REG_F7, TCG_REG_F0));
                   1089:     tcg_out_bundle(s, miI,
                   1090:                    tcg_opc_m19(TCG_REG_P0, OPC_GETF_SIG_M19, ret, TCG_REG_F6),
                   1091:                    tcg_opc_i18(TCG_REG_P0, OPC_NOP_I18, 0),
                   1092:                    tcg_opc_i18(TCG_REG_P0, OPC_NOP_I18, 0));
                   1093: }
                   1094: 
                   1095: static inline void tcg_out_sar_i32(TCGContext *s, TCGArg ret, TCGArg arg1,
                   1096:                                    TCGArg arg2, int const_arg2)
                   1097: {
                   1098:     if (const_arg2) {
                   1099:         tcg_out_bundle(s, miI,
                   1100:                        tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
                   1101:                        tcg_opc_i18(TCG_REG_P0, OPC_NOP_I18, 0),
                   1102:                        tcg_opc_i11(TCG_REG_P0, OPC_EXTR_I11,
                   1103:                                    ret, arg1, arg2, 31 - arg2));
                   1104:     } else {
                   1105:         tcg_out_bundle(s, mII,
                   1106:                        tcg_opc_a3 (TCG_REG_P0, OPC_AND_A3,
                   1107:                                    TCG_REG_R3, 0x1f, arg2),
                   1108:                        tcg_opc_i29(TCG_REG_P0, OPC_SXT4_I29, TCG_REG_R2, arg1),
                   1109:                        tcg_opc_i5 (TCG_REG_P0, OPC_SHR_I5, ret,
                   1110:                                    TCG_REG_R2, TCG_REG_R3));
                   1111:     }
                   1112: }
                   1113: 
                   1114: static inline void tcg_out_sar_i64(TCGContext *s, TCGArg ret, TCGArg arg1,
                   1115:                                    TCGArg arg2, int const_arg2)
                   1116: {
                   1117:     if (const_arg2) {
                   1118:         tcg_out_bundle(s, miI,
                   1119:                        tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
                   1120:                        tcg_opc_i18(TCG_REG_P0, OPC_NOP_I18, 0),
                   1121:                        tcg_opc_i11(TCG_REG_P0, OPC_EXTR_I11,
                   1122:                                    ret, arg1, arg2, 63 - arg2));
                   1123:     } else {
                   1124:         tcg_out_bundle(s, miI,
                   1125:                        tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
                   1126:                        tcg_opc_i18(TCG_REG_P0, OPC_NOP_I18, 0),
                   1127:                        tcg_opc_i5 (TCG_REG_P0, OPC_SHR_I5, ret, arg1, arg2));
                   1128:     }
                   1129: }
                   1130: 
                   1131: static inline void tcg_out_shl_i32(TCGContext *s, TCGArg ret, TCGArg arg1,
                   1132:                                    TCGArg arg2, int const_arg2)
                   1133: {
                   1134:     if (const_arg2) {
                   1135:         tcg_out_bundle(s, miI,
                   1136:                        tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
                   1137:                        tcg_opc_i18(TCG_REG_P0, OPC_NOP_I18, 0),
                   1138:                        tcg_opc_i12(TCG_REG_P0, OPC_DEP_Z_I12, ret,
                   1139:                                    arg1, 63 - arg2, 31 - arg2));
                   1140:     } else {
                   1141:         tcg_out_bundle(s, mII,
                   1142:                        tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
                   1143:                        tcg_opc_a3 (TCG_REG_P0, OPC_AND_A3, TCG_REG_R2,
                   1144:                                    0x1f, arg2),
                   1145:                        tcg_opc_i7 (TCG_REG_P0, OPC_SHL_I7, ret,
                   1146:                                    arg1, TCG_REG_R2));
                   1147:     }
                   1148: }
                   1149: 
                   1150: static inline void tcg_out_shl_i64(TCGContext *s, TCGArg ret, TCGArg arg1,
                   1151:                                    TCGArg arg2, int const_arg2)
                   1152: {
                   1153:     if (const_arg2) {
                   1154:         tcg_out_bundle(s, miI,
                   1155:                        tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
                   1156:                        tcg_opc_i18(TCG_REG_P0, OPC_NOP_I18, 0),
                   1157:                        tcg_opc_i12(TCG_REG_P0, OPC_DEP_Z_I12, ret,
                   1158:                                    arg1, 63 - arg2, 63 - arg2));
                   1159:     } else {
                   1160:         tcg_out_bundle(s, miI,
                   1161:                        tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
                   1162:                        tcg_opc_i18(TCG_REG_P0, OPC_NOP_I18, 0),
                   1163:                        tcg_opc_i7 (TCG_REG_P0, OPC_SHL_I7, ret,
                   1164:                                    arg1, arg2));
                   1165:     }
                   1166: }
                   1167: 
                   1168: static inline void tcg_out_shr_i32(TCGContext *s, TCGArg ret, TCGArg arg1,
                   1169:                                    TCGArg arg2, int const_arg2)
                   1170: {
                   1171:     if (const_arg2) {
                   1172:         tcg_out_bundle(s, miI,
                   1173:                        tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
                   1174:                        tcg_opc_i18(TCG_REG_P0, OPC_NOP_I18, 0),
                   1175:                        tcg_opc_i11(TCG_REG_P0, OPC_EXTR_U_I11, ret,
                   1176:                                    arg1, arg2, 31 - arg2));
                   1177:     } else {
                   1178:         tcg_out_bundle(s, mII,
                   1179:                        tcg_opc_a3 (TCG_REG_P0, OPC_AND_A3, TCG_REG_R3,
                   1180:                                    0x1f, arg2),
                   1181:                        tcg_opc_i29(TCG_REG_P0, OPC_ZXT4_I29, TCG_REG_R2, arg1),
                   1182:                        tcg_opc_i5 (TCG_REG_P0, OPC_SHR_U_I5, ret,
                   1183:                                    TCG_REG_R2, TCG_REG_R3));
                   1184:     }
                   1185: }
                   1186: 
                   1187: static inline void tcg_out_shr_i64(TCGContext *s, TCGArg ret, TCGArg arg1,
                   1188:                                    TCGArg arg2, int const_arg2)
                   1189: {
                   1190:     if (const_arg2) {
                   1191:         tcg_out_bundle(s, miI,
                   1192:                        tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
                   1193:                        tcg_opc_i18(TCG_REG_P0, OPC_NOP_I18, 0),
                   1194:                        tcg_opc_i11(TCG_REG_P0, OPC_EXTR_U_I11, ret,
                   1195:                                    arg1, arg2, 63 - arg2));
                   1196:     } else {
                   1197:         tcg_out_bundle(s, miI,
                   1198:                        tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
                   1199:                        tcg_opc_i18(TCG_REG_P0, OPC_NOP_I18, 0),
                   1200:                        tcg_opc_i5 (TCG_REG_P0, OPC_SHR_U_I5, ret,
                   1201:                                    arg1, arg2));
                   1202:     }
                   1203: }
                   1204: 
                   1205: static inline void tcg_out_rotl_i32(TCGContext *s, TCGArg ret, TCGArg arg1,
                   1206:                                     TCGArg arg2, int const_arg2)
                   1207: {
                   1208:     if (const_arg2) {
                   1209:         tcg_out_bundle(s, mII,
                   1210:                        tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
                   1211:                        tcg_opc_i2 (TCG_REG_P0, OPC_UNPACK4_L_I2,
                   1212:                                    TCG_REG_R2, arg1, arg1),
                   1213:                        tcg_opc_i11(TCG_REG_P0, OPC_EXTR_U_I11, ret,
                   1214:                                    TCG_REG_R2, 32 - arg2, 31));
                   1215:     } else {
                   1216:         tcg_out_bundle(s, miI,
                   1217:                        tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
                   1218:                        tcg_opc_i2 (TCG_REG_P0, OPC_UNPACK4_L_I2,
                   1219:                                    TCG_REG_R2, arg1, arg1),
                   1220:                        tcg_opc_a3 (TCG_REG_P0, OPC_AND_A3, TCG_REG_R3,
                   1221:                                    0x1f, arg2));
                   1222:         tcg_out_bundle(s, mII,
                   1223:                        tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
                   1224:                        tcg_opc_a3 (TCG_REG_P0, OPC_SUB_A3, TCG_REG_R3,
                   1225:                                    0x20, TCG_REG_R3),
                   1226:                        tcg_opc_i5 (TCG_REG_P0, OPC_SHR_U_I5, ret,
                   1227:                                    TCG_REG_R2, TCG_REG_R3));
                   1228:     }
                   1229: }
                   1230: 
                   1231: static inline void tcg_out_rotl_i64(TCGContext *s, TCGArg ret, TCGArg arg1,
                   1232:                                     TCGArg arg2, int const_arg2)
                   1233: {
                   1234:     if (const_arg2) {
                   1235:         tcg_out_bundle(s, miI,
                   1236:                        tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
                   1237:                        tcg_opc_i18(TCG_REG_P0, OPC_NOP_I18, 0),
                   1238:                        tcg_opc_i10(TCG_REG_P0, OPC_SHRP_I10, ret, arg1,
                   1239:                                    arg1, 0x40 - arg2));
                   1240:     } else {
                   1241:         tcg_out_bundle(s, mII,
                   1242:                        tcg_opc_a3 (TCG_REG_P0, OPC_SUB_A3, TCG_REG_R2,
                   1243:                                    0x40, arg2),
                   1244:                        tcg_opc_i7 (TCG_REG_P0, OPC_SHL_I7, TCG_REG_R3,
                   1245:                                    arg1, arg2),
                   1246:                        tcg_opc_i5 (TCG_REG_P0, OPC_SHR_U_I5, TCG_REG_R2,
                   1247:                                    arg1, TCG_REG_R2));
                   1248:         tcg_out_bundle(s, miI,
                   1249:                        tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
                   1250:                        tcg_opc_i18(TCG_REG_P0, OPC_NOP_I18, 0),
                   1251:                        tcg_opc_a1 (TCG_REG_P0, OPC_OR_A1, ret,
                   1252:                                    TCG_REG_R2, TCG_REG_R3));
                   1253:     }
                   1254: }
                   1255: 
                   1256: static inline void tcg_out_rotr_i32(TCGContext *s, TCGArg ret, TCGArg arg1,
                   1257:                                     TCGArg arg2, int const_arg2)
                   1258: {
                   1259:     if (const_arg2) {
                   1260:         tcg_out_bundle(s, mII,
                   1261:                        tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
                   1262:                        tcg_opc_i2 (TCG_REG_P0, OPC_UNPACK4_L_I2,
                   1263:                                    TCG_REG_R2, arg1, arg1),
                   1264:                        tcg_opc_i11(TCG_REG_P0, OPC_EXTR_U_I11, ret,
                   1265:                                    TCG_REG_R2, arg2, 31));
                   1266:     } else {
                   1267:         tcg_out_bundle(s, mII,
                   1268:                        tcg_opc_a3 (TCG_REG_P0, OPC_AND_A3, TCG_REG_R3,
                   1269:                                    0x1f, arg2),
                   1270:                        tcg_opc_i2 (TCG_REG_P0, OPC_UNPACK4_L_I2,
                   1271:                                    TCG_REG_R2, arg1, arg1),
                   1272:                        tcg_opc_i5 (TCG_REG_P0, OPC_SHR_U_I5, ret,
                   1273:                                    TCG_REG_R2, TCG_REG_R3));
                   1274:     }
                   1275: }
                   1276: 
                   1277: static inline void tcg_out_rotr_i64(TCGContext *s, TCGArg ret, TCGArg arg1,
                   1278:                                     TCGArg arg2, int const_arg2)
                   1279: {
                   1280:     if (const_arg2) {
                   1281:         tcg_out_bundle(s, miI,
                   1282:                        tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
                   1283:                        tcg_opc_i18(TCG_REG_P0, OPC_NOP_I18, 0),
                   1284:                        tcg_opc_i10(TCG_REG_P0, OPC_SHRP_I10, ret, arg1,
                   1285:                                    arg1, arg2));
                   1286:     } else {
                   1287:         tcg_out_bundle(s, mII,
                   1288:                        tcg_opc_a3 (TCG_REG_P0, OPC_SUB_A3, TCG_REG_R2,
                   1289:                                    0x40, arg2),
                   1290:                        tcg_opc_i5 (TCG_REG_P0, OPC_SHR_U_I5, TCG_REG_R3,
                   1291:                                    arg1, arg2),
                   1292:                        tcg_opc_i7 (TCG_REG_P0, OPC_SHL_I7, TCG_REG_R2,
                   1293:                                    arg1, TCG_REG_R2));
                   1294:         tcg_out_bundle(s, miI,
                   1295:                        tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
                   1296:                        tcg_opc_i18(TCG_REG_P0, OPC_NOP_I18, 0),
                   1297:                        tcg_opc_a1 (TCG_REG_P0, OPC_OR_A1, ret,
                   1298:                                    TCG_REG_R2, TCG_REG_R3));
                   1299:     }
                   1300: }
                   1301: 
                   1302: static inline void tcg_out_ext(TCGContext *s, uint64_t opc_i29,
                   1303:                                TCGArg ret, TCGArg arg)
                   1304: {
                   1305:     tcg_out_bundle(s, miI,
                   1306:                    tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
                   1307:                    tcg_opc_i18(TCG_REG_P0, OPC_NOP_I18, 0),
                   1308:                    tcg_opc_i29(TCG_REG_P0, opc_i29, ret, arg));
                   1309: }
                   1310: 
                   1311: static inline void tcg_out_bswap16(TCGContext *s, TCGArg ret, TCGArg arg)
                   1312: {
                   1313:     tcg_out_bundle(s, mII,
                   1314:                    tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
                   1315:                    tcg_opc_i12(TCG_REG_P0, OPC_DEP_Z_I12, ret, arg, 15, 15),
                   1316:                    tcg_opc_i3 (TCG_REG_P0, OPC_MUX1_I3, ret, ret, 0xb));
                   1317: }
                   1318: 
                   1319: static inline void tcg_out_bswap32(TCGContext *s, TCGArg ret, TCGArg arg)
                   1320: {
                   1321:     tcg_out_bundle(s, mII,
                   1322:                    tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
                   1323:                    tcg_opc_i12(TCG_REG_P0, OPC_DEP_Z_I12, ret, arg, 31, 31),
                   1324:                    tcg_opc_i3 (TCG_REG_P0, OPC_MUX1_I3, ret, ret, 0xb));
                   1325: }
                   1326: 
                   1327: static inline void tcg_out_bswap64(TCGContext *s, TCGArg ret, TCGArg arg)
                   1328: {
                   1329:     tcg_out_bundle(s, mII,
                   1330:                    tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
                   1331:                    tcg_opc_i18(TCG_REG_P0, OPC_NOP_I18, 0),
                   1332:                    tcg_opc_i3 (TCG_REG_P0, OPC_MUX1_I3, ret, arg, 0xb));
                   1333: }
                   1334: 
                   1335: static inline uint64_t tcg_opc_cmp_a(int qp, TCGCond cond, TCGArg arg1,
                   1336:                                      TCGArg arg2, int cmp4)
                   1337: {
                   1338:     uint64_t opc_eq_a6, opc_lt_a6, opc_ltu_a6;
                   1339: 
                   1340:     if (cmp4) {
                   1341:         opc_eq_a6 = OPC_CMP4_EQ_A6;
                   1342:         opc_lt_a6 = OPC_CMP4_LT_A6;
                   1343:         opc_ltu_a6 = OPC_CMP4_LTU_A6;
                   1344:     } else {
                   1345:         opc_eq_a6 = OPC_CMP_EQ_A6;
                   1346:         opc_lt_a6 = OPC_CMP_LT_A6;
                   1347:         opc_ltu_a6 = OPC_CMP_LTU_A6;
                   1348:     }
                   1349: 
                   1350:     switch (cond) {
                   1351:     case TCG_COND_EQ:
                   1352:         return tcg_opc_a6 (qp, opc_eq_a6,  TCG_REG_P6, TCG_REG_P7, arg1, arg2);
                   1353:     case TCG_COND_NE:
                   1354:         return tcg_opc_a6 (qp, opc_eq_a6,  TCG_REG_P7, TCG_REG_P6, arg1, arg2);
                   1355:     case TCG_COND_LT:
                   1356:         return tcg_opc_a6 (qp, opc_lt_a6,  TCG_REG_P6, TCG_REG_P7, arg1, arg2);
                   1357:     case TCG_COND_LTU:
                   1358:         return tcg_opc_a6 (qp, opc_ltu_a6, TCG_REG_P6, TCG_REG_P7, arg1, arg2);
                   1359:     case TCG_COND_GE:
                   1360:         return tcg_opc_a6 (qp, opc_lt_a6,  TCG_REG_P7, TCG_REG_P6, arg1, arg2);
                   1361:     case TCG_COND_GEU:
                   1362:         return tcg_opc_a6 (qp, opc_ltu_a6, TCG_REG_P7, TCG_REG_P6, arg1, arg2);
                   1363:     case TCG_COND_LE:
                   1364:         return tcg_opc_a6 (qp, opc_lt_a6,  TCG_REG_P7, TCG_REG_P6, arg2, arg1);
                   1365:     case TCG_COND_LEU:
                   1366:         return tcg_opc_a6 (qp, opc_ltu_a6, TCG_REG_P7, TCG_REG_P6, arg2, arg1);
                   1367:     case TCG_COND_GT:
                   1368:         return tcg_opc_a6 (qp, opc_lt_a6,  TCG_REG_P6, TCG_REG_P7, arg2, arg1);
                   1369:     case TCG_COND_GTU:
                   1370:         return tcg_opc_a6 (qp, opc_ltu_a6, TCG_REG_P6, TCG_REG_P7, arg2, arg1);
                   1371:     default:
                   1372:         tcg_abort();
                   1373:         break;
                   1374:     }
                   1375: }
                   1376: 
                   1377: static inline void tcg_out_brcond(TCGContext *s, TCGCond cond, TCGArg arg1,
                   1378:                                   int const_arg1, TCGArg arg2, int const_arg2,
                   1379:                                   int label_index, int cmp4)
                   1380: {
                   1381:     TCGLabel *l = &s->labels[label_index];
                   1382:     uint64_t opc1, opc2;
                   1383: 
                   1384:     if (const_arg1 && arg1 != 0) {
                   1385:         opc1 = tcg_opc_a5(TCG_REG_P0, OPC_ADDL_A5, TCG_REG_R2,
                   1386:                           arg1, TCG_REG_R0);
                   1387:         arg1 = TCG_REG_R2;
                   1388:     } else {
                   1389:         opc1 = tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0);
                   1390:     }
                   1391: 
                   1392:     if (const_arg2 && arg2 != 0) {
                   1393:         opc2 = tcg_opc_a5(TCG_REG_P0, OPC_ADDL_A5, TCG_REG_R3,
                   1394:                           arg2, TCG_REG_R0);
                   1395:         arg2 = TCG_REG_R3;
                   1396:     } else {
                   1397:         opc2 = tcg_opc_i18(TCG_REG_P0, OPC_NOP_I18, 0);
                   1398:     }
                   1399: 
                   1400:     tcg_out_bundle(s, mII,
                   1401:                    opc1,
                   1402:                    opc2,
                   1403:                    tcg_opc_cmp_a(TCG_REG_P0, cond, arg1, arg2, cmp4));
                   1404:     tcg_out_bundle(s, mmB,
                   1405:                    tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
                   1406:                    tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
                   1407:                    tcg_opc_b1 (TCG_REG_P6, OPC_BR_DPTK_FEW_B1,
                   1408:                                get_reloc_pcrel21b(s->code_ptr + 2)));
                   1409: 
                   1410:     if (l->has_value) {
                   1411:         reloc_pcrel21b((s->code_ptr - 16) + 2, l->u.value);
                   1412:     } else {
                   1413:         tcg_out_reloc(s, (s->code_ptr - 16) + 2,
                   1414:                       R_IA64_PCREL21B, label_index, 0);
                   1415:     }
                   1416: }
                   1417: 
                   1418: static inline void tcg_out_setcond(TCGContext *s, TCGCond cond, TCGArg ret,
                   1419:                                    TCGArg arg1, TCGArg arg2, int cmp4)
                   1420: {
                   1421:     tcg_out_bundle(s, MmI,
                   1422:                    tcg_opc_cmp_a(TCG_REG_P0, cond, arg1, arg2, cmp4),
                   1423:                    tcg_opc_a5(TCG_REG_P6, OPC_ADDL_A5, ret, 1, TCG_REG_R0),
                   1424:                    tcg_opc_a5(TCG_REG_P7, OPC_ADDL_A5, ret, 0, TCG_REG_R0));
                   1425: }
                   1426: 
                   1427: #if defined(CONFIG_SOFTMMU)
                   1428: 
                   1429: #include "../../softmmu_defs.h"
                   1430: 
                   1431: /* Load and compare a TLB entry, and return the result in (p6, p7).
                   1432:    R2 is loaded with the address of the addend TLB entry.
                   1433:    R56 is loaded with the address, zero extented on 32-bit targets. */
                   1434: static inline void tcg_out_qemu_tlb(TCGContext *s, TCGArg addr_reg,
                   1435:                                     int s_bits, uint64_t offset_rw,
                   1436:                                     uint64_t offset_addend)
                   1437: {
                   1438:     tcg_out_bundle(s, mII,
                   1439:                    tcg_opc_a5 (TCG_REG_P0, OPC_ADDL_A5, TCG_REG_R3,
                   1440:                                TARGET_PAGE_MASK | ((1 << s_bits) - 1),
                   1441:                                TCG_REG_R0),
                   1442:                    tcg_opc_i11(TCG_REG_P0, OPC_EXTR_U_I11, TCG_REG_R2,
                   1443:                                addr_reg, TARGET_PAGE_BITS, CPU_TLB_BITS - 1),
                   1444:                    tcg_opc_i12(TCG_REG_P0, OPC_DEP_Z_I12, TCG_REG_R2,
                   1445:                                TCG_REG_R2, 63 - CPU_TLB_ENTRY_BITS,
                   1446:                                63 - CPU_TLB_ENTRY_BITS));
                   1447:     tcg_out_bundle(s, mII,
                   1448:                    tcg_opc_a5 (TCG_REG_P0, OPC_ADDL_A5, TCG_REG_R2,
                   1449:                                offset_rw, TCG_REG_R2),
                   1450: #if TARGET_LONG_BITS == 32
                   1451:                    tcg_opc_i29(TCG_REG_P0, OPC_ZXT4_I29, TCG_REG_R56, addr_reg),
                   1452: #else
                   1453:                    tcg_opc_a4(TCG_REG_P0, OPC_ADDS_A4, TCG_REG_R56,
                   1454:                               0, addr_reg),
                   1455: #endif
                   1456:                    tcg_opc_a1 (TCG_REG_P0, OPC_ADD_A1, TCG_REG_R2,
                   1457:                                TCG_REG_R2, TCG_AREG0));
                   1458:     tcg_out_bundle(s, mII,
                   1459:                    tcg_opc_m3 (TCG_REG_P0, OPC_LD8_M3, TCG_REG_R57,
                   1460:                                TCG_REG_R2, offset_addend - offset_rw),
                   1461:                    tcg_opc_a1 (TCG_REG_P0, OPC_AND_A1, TCG_REG_R3,
                   1462:                                TCG_REG_R3, TCG_REG_R56),
                   1463:                    tcg_opc_a6 (TCG_REG_P0, OPC_CMP_EQ_A6, TCG_REG_P6,
                   1464:                                TCG_REG_P7, TCG_REG_R3, TCG_REG_R57));
                   1465: }
                   1466: 
                   1467: static void *qemu_ld_helpers[4] = {
                   1468:     __ldb_mmu,
                   1469:     __ldw_mmu,
                   1470:     __ldl_mmu,
                   1471:     __ldq_mmu,
                   1472: };
                   1473: 
                   1474: static inline void tcg_out_qemu_ld(TCGContext *s, const TCGArg *args, int opc)
                   1475: {
                   1476:     int addr_reg, data_reg, mem_index, s_bits, bswap;
                   1477:     uint64_t opc_ld_m1[4] = { OPC_LD1_M1, OPC_LD2_M1, OPC_LD4_M1, OPC_LD8_M1 };
                   1478:     uint64_t opc_ext_i29[8] = { OPC_ZXT1_I29, OPC_ZXT2_I29, OPC_ZXT4_I29, 0,
                   1479:                                 OPC_SXT1_I29, OPC_SXT2_I29, OPC_SXT4_I29, 0 };
                   1480: 
                   1481:     data_reg = *args++;
                   1482:     addr_reg = *args++;
                   1483:     mem_index = *args;
                   1484:     s_bits = opc & 3;
                   1485: 
                   1486: #ifdef TARGET_WORDS_BIGENDIAN
                   1487:     bswap = 1;
                   1488: #else
                   1489:     bswap = 0;
                   1490: #endif
                   1491: 
                   1492:     /* Read the TLB entry */
                   1493:     tcg_out_qemu_tlb(s, addr_reg, s_bits,
                   1494:                      offsetof(CPUState, tlb_table[mem_index][0].addr_read),
                   1495:                      offsetof(CPUState, tlb_table[mem_index][0].addend));
                   1496: 
                   1497:     /* P6 is the fast path, and P7 the slow path */
                   1498:     tcg_out_bundle(s, mLX,
                   1499:                    tcg_opc_a5 (TCG_REG_P7, OPC_ADDL_A5, TCG_REG_R57,
                   1500:                                mem_index, TCG_REG_R0),
                   1501:                    tcg_opc_l2 ((tcg_target_long) qemu_ld_helpers[s_bits]),
                   1502:                    tcg_opc_x2 (TCG_REG_P7, OPC_MOVL_X2, TCG_REG_R2,
                   1503:                                (tcg_target_long) qemu_ld_helpers[s_bits]));
                   1504:     tcg_out_bundle(s, MmI,
                   1505:                    tcg_opc_m3 (TCG_REG_P0, OPC_LD8_M3, TCG_REG_R3,
                   1506:                                TCG_REG_R2, 8),
                   1507:                    tcg_opc_a1 (TCG_REG_P6, OPC_ADD_A1, TCG_REG_R3,
                   1508:                                TCG_REG_R3, TCG_REG_R56),
                   1509:                    tcg_opc_i21(TCG_REG_P7, OPC_MOV_I21, TCG_REG_B6,
                   1510:                                TCG_REG_R3, 0));
                   1511:     if (bswap && s_bits == 1) {
                   1512:         tcg_out_bundle(s, MmI,
                   1513:                        tcg_opc_m1 (TCG_REG_P6, opc_ld_m1[s_bits],
                   1514:                                    TCG_REG_R8, TCG_REG_R3),
                   1515:                        tcg_opc_m1 (TCG_REG_P7, OPC_LD8_M1, TCG_REG_R1, TCG_REG_R2),
                   1516:                        tcg_opc_i12(TCG_REG_P6, OPC_DEP_Z_I12,
                   1517:                                    TCG_REG_R8, TCG_REG_R8, 15, 15));
                   1518:     } else if (bswap && s_bits == 2) {
                   1519:         tcg_out_bundle(s, MmI,
                   1520:                        tcg_opc_m1 (TCG_REG_P6, opc_ld_m1[s_bits],
                   1521:                                    TCG_REG_R8, TCG_REG_R3),
                   1522:                        tcg_opc_m1 (TCG_REG_P7, OPC_LD8_M1, TCG_REG_R1, TCG_REG_R2),
                   1523:                        tcg_opc_i12(TCG_REG_P6, OPC_DEP_Z_I12,
                   1524:                                    TCG_REG_R8, TCG_REG_R8, 31, 31));
                   1525:     } else {
                   1526:         tcg_out_bundle(s, mmI,
                   1527:                        tcg_opc_m1 (TCG_REG_P6, opc_ld_m1[s_bits],
                   1528:                                    TCG_REG_R8, TCG_REG_R3),
                   1529:                        tcg_opc_m1 (TCG_REG_P7, OPC_LD8_M1, TCG_REG_R1, TCG_REG_R2),
                   1530:                        tcg_opc_i18(TCG_REG_P0, OPC_NOP_I18, 0));
                   1531:     }
                   1532:     if (!bswap || s_bits == 0) {
                   1533:         tcg_out_bundle(s, miB,
                   1534:                        tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
                   1535:                        tcg_opc_i18(TCG_REG_P0, OPC_NOP_I18, 0),
                   1536:                        tcg_opc_b5 (TCG_REG_P7, OPC_BR_CALL_SPTK_MANY_B5,
                   1537:                                    TCG_REG_B0, TCG_REG_B6));
                   1538:     } else {
                   1539:         tcg_out_bundle(s, miB,
                   1540:                        tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
                   1541:                        tcg_opc_i3 (TCG_REG_P6, OPC_MUX1_I3,
                   1542:                                    TCG_REG_R8, TCG_REG_R8, 0xb),
                   1543:                        tcg_opc_b5 (TCG_REG_P7, OPC_BR_CALL_SPTK_MANY_B5,
                   1544:                                    TCG_REG_B0, TCG_REG_B6));
                   1545:     }
                   1546: 
                   1547:     if (opc == 3) {
                   1548:         tcg_out_bundle(s, miI,
                   1549:                        tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
                   1550:                        tcg_opc_i18(TCG_REG_P0, OPC_NOP_I18, 0),
                   1551:                        tcg_opc_a4 (TCG_REG_P0, OPC_ADDS_A4,
                   1552:                                    data_reg, 0, TCG_REG_R8));
                   1553:     } else {
                   1554:         tcg_out_bundle(s, miI,
                   1555:                        tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
                   1556:                        tcg_opc_i18(TCG_REG_P0, OPC_NOP_I18, 0),
                   1557:                        tcg_opc_i29(TCG_REG_P0, opc_ext_i29[opc],
                   1558:                                    data_reg, TCG_REG_R8));
                   1559:     }
                   1560: }
                   1561: 
                   1562: static void *qemu_st_helpers[4] = {
                   1563:     __stb_mmu,
                   1564:     __stw_mmu,
                   1565:     __stl_mmu,
                   1566:     __stq_mmu,
                   1567: };
                   1568: 
                   1569: static inline void tcg_out_qemu_st(TCGContext *s, const TCGArg *args, int opc)
                   1570: {
                   1571:     int addr_reg, data_reg, mem_index, bswap;
                   1572:     uint64_t opc_st_m4[4] = { OPC_ST1_M4, OPC_ST2_M4, OPC_ST4_M4, OPC_ST8_M4 };
                   1573: 
                   1574:     data_reg = *args++;
                   1575:     addr_reg = *args++;
                   1576:     mem_index = *args;
                   1577: 
                   1578: #ifdef TARGET_WORDS_BIGENDIAN
                   1579:     bswap = 1;
                   1580: #else
                   1581:     bswap = 0;
                   1582: #endif
                   1583: 
                   1584:     tcg_out_qemu_tlb(s, addr_reg, opc,
                   1585:                      offsetof(CPUState, tlb_table[mem_index][0].addr_write),
                   1586:                      offsetof(CPUState, tlb_table[mem_index][0].addend));
                   1587: 
                   1588:     /* P6 is the fast path, and P7 the slow path */
                   1589:     tcg_out_bundle(s, mLX,
                   1590:                    tcg_opc_a4(TCG_REG_P7, OPC_ADDS_A4, TCG_REG_R57,
                   1591:                               0, data_reg),
                   1592:                    tcg_opc_l2 ((tcg_target_long) qemu_st_helpers[opc]),
                   1593:                    tcg_opc_x2 (TCG_REG_P7, OPC_MOVL_X2, TCG_REG_R2,
                   1594:                                (tcg_target_long) qemu_st_helpers[opc]));
                   1595:     tcg_out_bundle(s, MmI,
                   1596:                    tcg_opc_m3 (TCG_REG_P0, OPC_LD8_M3, TCG_REG_R3,
                   1597:                                TCG_REG_R2, 8),
                   1598:                    tcg_opc_a1 (TCG_REG_P6, OPC_ADD_A1, TCG_REG_R3,
                   1599:                                TCG_REG_R3, TCG_REG_R56),
                   1600:                    tcg_opc_i21(TCG_REG_P7, OPC_MOV_I21, TCG_REG_B6,
                   1601:                                TCG_REG_R3, 0));
                   1602: 
                   1603:     if (!bswap || opc == 0) {
                   1604:         tcg_out_bundle(s, mII,
                   1605:                        tcg_opc_m1 (TCG_REG_P7, OPC_LD8_M1,
                   1606:                                    TCG_REG_R1, TCG_REG_R2),
                   1607:                        tcg_opc_i18(TCG_REG_P0, OPC_NOP_I18, 0),
                   1608:                        tcg_opc_i18(TCG_REG_P0, OPC_NOP_I18, 0));
                   1609:     } else if (opc == 1) {
                   1610:         tcg_out_bundle(s, mII,
                   1611:                        tcg_opc_m1 (TCG_REG_P7, OPC_LD8_M1,
                   1612:                                    TCG_REG_R1, TCG_REG_R2),
                   1613:                        tcg_opc_i12(TCG_REG_P6, OPC_DEP_Z_I12,
                   1614:                                    TCG_REG_R2, data_reg, 15, 15),
                   1615:                        tcg_opc_i3 (TCG_REG_P6, OPC_MUX1_I3,
                   1616:                                    TCG_REG_R2, TCG_REG_R2, 0xb));
                   1617:         data_reg = TCG_REG_R2;
                   1618:     } else if (opc == 2) {
                   1619:         tcg_out_bundle(s, mII,
                   1620:                        tcg_opc_m1 (TCG_REG_P7, OPC_LD8_M1,
                   1621:                                    TCG_REG_R1, TCG_REG_R2),
                   1622:                        tcg_opc_i12(TCG_REG_P6, OPC_DEP_Z_I12,
                   1623:                                    TCG_REG_R2, data_reg, 31, 31),
                   1624:                        tcg_opc_i3 (TCG_REG_P6, OPC_MUX1_I3,
                   1625:                                    TCG_REG_R2, TCG_REG_R2, 0xb));
                   1626:         data_reg = TCG_REG_R2;
                   1627:     } else if (opc == 3) {
                   1628:         tcg_out_bundle(s, miI,
                   1629:                        tcg_opc_m1 (TCG_REG_P7, OPC_LD8_M1,
                   1630:                                    TCG_REG_R1, TCG_REG_R2),
                   1631:                        tcg_opc_i18(TCG_REG_P0, OPC_NOP_I18, 0),
                   1632:                        tcg_opc_i3 (TCG_REG_P6, OPC_MUX1_I3,
                   1633:                                    TCG_REG_R2, data_reg, 0xb));
                   1634:         data_reg = TCG_REG_R2;
                   1635:     }
                   1636: 
                   1637:     tcg_out_bundle(s, miB,
                   1638:                    tcg_opc_m4 (TCG_REG_P6, opc_st_m4[opc],
                   1639:                                data_reg, TCG_REG_R3),
                   1640:                    tcg_opc_a5 (TCG_REG_P7, OPC_ADDL_A5, TCG_REG_R58,
                   1641:                                mem_index, TCG_REG_R0),
                   1642:                    tcg_opc_b5 (TCG_REG_P7, OPC_BR_CALL_SPTK_MANY_B5,
                   1643:                                TCG_REG_B0, TCG_REG_B6));
                   1644: }
                   1645: 
                   1646: #else /* !CONFIG_SOFTMMU */
                   1647: 
                   1648: static inline void tcg_out_qemu_ld(TCGContext *s, const TCGArg *args, int opc)
                   1649: {
                   1650:     static uint64_t const opc_ld_m1[4] = {
                   1651:         OPC_LD1_M1, OPC_LD2_M1, OPC_LD4_M1, OPC_LD8_M1
                   1652:     };
                   1653:     static uint64_t const opc_sxt_i29[4] = {
                   1654:         OPC_SXT1_I29, OPC_SXT2_I29, OPC_SXT4_I29, 0
                   1655:     };
                   1656:     int addr_reg, data_reg, mem_index, s_bits, bswap;
                   1657: 
                   1658:     data_reg = *args++;
                   1659:     addr_reg = *args++;
                   1660:     mem_index = *args;
                   1661:     s_bits = opc & 3;
                   1662: 
                   1663: #ifdef TARGET_WORDS_BIGENDIAN
                   1664:     bswap = 1;
                   1665: #else
                   1666:     bswap = 0;
                   1667: #endif
                   1668: 
                   1669: #if TARGET_LONG_BITS == 32
                   1670:     if (GUEST_BASE != 0) {
                   1671:         tcg_out_bundle(s, mII,
                   1672:                        tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
                   1673:                        tcg_opc_i29(TCG_REG_P0, OPC_ZXT4_I29,
                   1674:                                    TCG_REG_R3, addr_reg),
                   1675:                        tcg_opc_a1 (TCG_REG_P0, OPC_ADD_A1, TCG_REG_R2,
                   1676:                                    TCG_GUEST_BASE_REG, TCG_REG_R3));
                   1677:     } else {
                   1678:         tcg_out_bundle(s, miI,
                   1679:                        tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
                   1680:                        tcg_opc_i29(TCG_REG_P0, OPC_ZXT4_I29,
                   1681:                                    TCG_REG_R2, addr_reg),
                   1682:                        tcg_opc_i18(TCG_REG_P0, OPC_NOP_I18, 0));
                   1683:     }
                   1684: 
                   1685:     if (!bswap || s_bits == 0) {
                   1686:         if (s_bits == opc) {
                   1687:             tcg_out_bundle(s, miI,
                   1688:                            tcg_opc_m1 (TCG_REG_P0, opc_ld_m1[s_bits],
                   1689:                                        data_reg, TCG_REG_R2),
                   1690:                            tcg_opc_i18(TCG_REG_P0, OPC_NOP_I18, 0),
                   1691:                            tcg_opc_i18(TCG_REG_P0, OPC_NOP_I18, 0));
                   1692:         } else {
                   1693:             tcg_out_bundle(s, mII,
                   1694:                            tcg_opc_m1 (TCG_REG_P0, opc_ld_m1[s_bits],
                   1695:                                        data_reg, TCG_REG_R2),
                   1696:                            tcg_opc_i18(TCG_REG_P0, OPC_NOP_I18, 0),
                   1697:                            tcg_opc_i29(TCG_REG_P0, opc_sxt_i29[s_bits],
                   1698:                                        data_reg, data_reg));
                   1699:         }
                   1700:     } else if (s_bits == 3) {
                   1701:             tcg_out_bundle(s, mII,
                   1702:                            tcg_opc_m1 (TCG_REG_P0, opc_ld_m1[s_bits],
                   1703:                                        data_reg, TCG_REG_R2),
                   1704:                            tcg_opc_i18(TCG_REG_P0, OPC_NOP_I18, 0),
                   1705:                            tcg_opc_i3 (TCG_REG_P0, OPC_MUX1_I3,
                   1706:                                        data_reg, data_reg, 0xb));
                   1707:     } else {
                   1708:         if (s_bits == 1) {
                   1709:             tcg_out_bundle(s, mII,
                   1710:                            tcg_opc_m1 (TCG_REG_P0, opc_ld_m1[s_bits],
                   1711:                                        data_reg, TCG_REG_R2),
                   1712:                            tcg_opc_i18(TCG_REG_P0, OPC_NOP_I18, 0),
                   1713:                            tcg_opc_i12(TCG_REG_P0, OPC_DEP_Z_I12,
                   1714:                                       data_reg, data_reg, 15, 15));
                   1715:         } else {
                   1716:             tcg_out_bundle(s, mII,
                   1717:                            tcg_opc_m1 (TCG_REG_P0, opc_ld_m1[s_bits],
                   1718:                                        data_reg, TCG_REG_R2),
                   1719:                            tcg_opc_i18(TCG_REG_P0, OPC_NOP_I18, 0),
                   1720:                            tcg_opc_i12(TCG_REG_P0, OPC_DEP_Z_I12,
                   1721:                                       data_reg, data_reg, 31, 31));
                   1722:         }
                   1723:         if (opc == s_bits) {
                   1724:             tcg_out_bundle(s, miI,
                   1725:                            tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
                   1726:                            tcg_opc_i18(TCG_REG_P0, OPC_NOP_I18, 0),
                   1727:                            tcg_opc_i3 (TCG_REG_P0, OPC_MUX1_I3,
                   1728:                                        data_reg, data_reg, 0xb));
                   1729:         } else {
                   1730:             tcg_out_bundle(s, mII,
                   1731:                            tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
                   1732:                            tcg_opc_i3 (TCG_REG_P0, OPC_MUX1_I3,
                   1733:                                        data_reg, data_reg, 0xb),
                   1734:                            tcg_opc_i29(TCG_REG_P0, opc_sxt_i29[s_bits],
                   1735:                                        data_reg, data_reg));
                   1736:         }
                   1737:     }
                   1738: #else
                   1739:     if (GUEST_BASE != 0) {
                   1740:         tcg_out_bundle(s, MmI,
                   1741:                        tcg_opc_a1 (TCG_REG_P0, OPC_ADD_A1, TCG_REG_R2,
                   1742:                                    TCG_GUEST_BASE_REG, addr_reg),
                   1743:                        tcg_opc_m1 (TCG_REG_P0, opc_ld_m1[s_bits],
                   1744:                                    data_reg, TCG_REG_R2),
                   1745:                        tcg_opc_i18(TCG_REG_P0, OPC_NOP_I18, 0));
                   1746:     } else {
                   1747:         tcg_out_bundle(s, mmI,
                   1748:                        tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
                   1749:                        tcg_opc_m1 (TCG_REG_P0, opc_ld_m1[s_bits],
                   1750:                                    data_reg, addr_reg),
                   1751:                        tcg_opc_i18(TCG_REG_P0, OPC_NOP_I18, 0));
                   1752:     }
                   1753: 
                   1754:     if (bswap && s_bits == 1) {
                   1755:         tcg_out_bundle(s, mII,
                   1756:                        tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
                   1757:                        tcg_opc_i12(TCG_REG_P0, OPC_DEP_Z_I12,
                   1758:                                    data_reg, data_reg, 15, 15),
                   1759:                        tcg_opc_i3 (TCG_REG_P0, OPC_MUX1_I3,
                   1760:                                    data_reg, data_reg, 0xb));
                   1761:     } else if (bswap && s_bits == 2) {
                   1762:         tcg_out_bundle(s, mII,
                   1763:                        tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
                   1764:                        tcg_opc_i12(TCG_REG_P0, OPC_DEP_Z_I12,
                   1765:                                    data_reg, data_reg, 31, 31),
                   1766:                        tcg_opc_i3 (TCG_REG_P0, OPC_MUX1_I3,
                   1767:                                    data_reg, data_reg, 0xb));
                   1768:     } else if (bswap && s_bits == 3) {
                   1769:         tcg_out_bundle(s, miI,
                   1770:                        tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
                   1771:                        tcg_opc_i18(TCG_REG_P0, OPC_NOP_I18, 0),
                   1772:                        tcg_opc_i3 (TCG_REG_P0, OPC_MUX1_I3,
                   1773:                                    data_reg, data_reg, 0xb));
                   1774:     }
                   1775:     if (s_bits != opc) {
                   1776:         tcg_out_bundle(s, miI,
                   1777:                        tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
                   1778:                        tcg_opc_i18(TCG_REG_P0, OPC_NOP_I18, 0),
                   1779:                        tcg_opc_i29(TCG_REG_P0, opc_sxt_i29[s_bits],
                   1780:                                    data_reg, data_reg));
                   1781:     }
                   1782: #endif
                   1783: }
                   1784: 
                   1785: static inline void tcg_out_qemu_st(TCGContext *s, const TCGArg *args, int opc)
                   1786: {
                   1787:     static uint64_t const opc_st_m4[4] = {
                   1788:         OPC_ST1_M4, OPC_ST2_M4, OPC_ST4_M4, OPC_ST8_M4
                   1789:     };
                   1790:     int addr_reg, data_reg, bswap;
                   1791: #if TARGET_LONG_BITS == 64
                   1792:     uint64_t add_guest_base;
                   1793: #endif
                   1794: 
                   1795:     data_reg = *args++;
                   1796:     addr_reg = *args++;
                   1797: 
                   1798: #ifdef TARGET_WORDS_BIGENDIAN
                   1799:     bswap = 1;
                   1800: #else
                   1801:     bswap = 0;
                   1802: #endif
                   1803: 
                   1804: #if TARGET_LONG_BITS == 32
                   1805:     if (GUEST_BASE != 0) {
                   1806:         tcg_out_bundle(s, mII,
                   1807:                        tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
                   1808:                        tcg_opc_i29(TCG_REG_P0, OPC_ZXT4_I29,
                   1809:                                    TCG_REG_R3, addr_reg),
                   1810:                        tcg_opc_a1 (TCG_REG_P0, OPC_ADD_A1, TCG_REG_R2,
                   1811:                                    TCG_GUEST_BASE_REG, TCG_REG_R3));
                   1812:     } else {
                   1813:         tcg_out_bundle(s, miI,
                   1814:                        tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
                   1815:                        tcg_opc_i29(TCG_REG_P0, OPC_ZXT4_I29,
                   1816:                                    TCG_REG_R3, addr_reg),
                   1817:                        tcg_opc_i18(TCG_REG_P0, OPC_NOP_I18, 0));
                   1818:     }
                   1819: 
                   1820:     if (bswap) {
                   1821:         if (opc == 1) {
                   1822:             tcg_out_bundle(s, mII,
                   1823:                            tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
                   1824:                            tcg_opc_i12(TCG_REG_P0, OPC_DEP_Z_I12,
                   1825:                                        TCG_REG_R3, data_reg, 15, 15),
                   1826:                            tcg_opc_i3 (TCG_REG_P0, OPC_MUX1_I3,
                   1827:                                        TCG_REG_R3, TCG_REG_R3, 0xb));
                   1828:             data_reg = TCG_REG_R3;
                   1829:         } else if (opc == 2) {
                   1830:             tcg_out_bundle(s, mII,
                   1831:                            tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
                   1832:                            tcg_opc_i12(TCG_REG_P0, OPC_DEP_Z_I12,
                   1833:                                        TCG_REG_R3, data_reg, 31, 31),
                   1834:                            tcg_opc_i3 (TCG_REG_P0, OPC_MUX1_I3,
                   1835:                                        TCG_REG_R3, TCG_REG_R3, 0xb));
                   1836:             data_reg = TCG_REG_R3;
                   1837:         } else if (opc == 3) {
                   1838:             tcg_out_bundle(s, miI,
                   1839:                            tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
                   1840:                            tcg_opc_i18(TCG_REG_P0, OPC_NOP_I18, 0),
                   1841:                            tcg_opc_i3 (TCG_REG_P0, OPC_MUX1_I3,
                   1842:                                        TCG_REG_R3, data_reg, 0xb));
                   1843:             data_reg = TCG_REG_R3;
                   1844:         }
                   1845:     }
                   1846:     tcg_out_bundle(s, mmI,
                   1847:                    tcg_opc_m4 (TCG_REG_P0, opc_st_m4[opc],
                   1848:                                data_reg, TCG_REG_R2),
                   1849:                    tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
                   1850:                    tcg_opc_i18(TCG_REG_P0, OPC_NOP_I18, 0));
                   1851: #else
                   1852:     if (GUEST_BASE != 0) {
                   1853:         add_guest_base = tcg_opc_a1 (TCG_REG_P0, OPC_ADD_A1, TCG_REG_R2,
                   1854:                                      TCG_GUEST_BASE_REG, addr_reg);
                   1855:         addr_reg = TCG_REG_R2;
                   1856:     } else {
                   1857:         add_guest_base = tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0);
                   1858:     }
                   1859: 
                   1860:     if (!bswap || opc == 0) {
                   1861:         tcg_out_bundle(s, (GUEST_BASE ? MmI : mmI),
                   1862:                        add_guest_base,
                   1863:                        tcg_opc_m4 (TCG_REG_P0, opc_st_m4[opc],
                   1864:                                    data_reg, addr_reg),
                   1865:                        tcg_opc_i18(TCG_REG_P0, OPC_NOP_I18, 0));
                   1866:     } else {
                   1867:         if (opc == 1) {
                   1868:             tcg_out_bundle(s, mII,
                   1869:                            add_guest_base,
                   1870:                            tcg_opc_i12(TCG_REG_P0, OPC_DEP_Z_I12,
                   1871:                                        TCG_REG_R3, data_reg, 15, 15),
                   1872:                            tcg_opc_i3 (TCG_REG_P0, OPC_MUX1_I3,
                   1873:                                        TCG_REG_R3, TCG_REG_R3, 0xb));
                   1874:             data_reg = TCG_REG_R3;
                   1875:         } else if (opc == 2) {
                   1876:             tcg_out_bundle(s, mII,
                   1877:                            add_guest_base,
                   1878:                            tcg_opc_i12(TCG_REG_P0, OPC_DEP_Z_I12,
                   1879:                                        TCG_REG_R3, data_reg, 31, 31),
                   1880:                            tcg_opc_i3 (TCG_REG_P0, OPC_MUX1_I3,
                   1881:                                        TCG_REG_R3, TCG_REG_R3, 0xb));
                   1882:             data_reg = TCG_REG_R3;
                   1883:         } else if (opc == 3) {
                   1884:             tcg_out_bundle(s, miI,
                   1885:                            add_guest_base,
                   1886:                            tcg_opc_i18(TCG_REG_P0, OPC_NOP_I18, 0),
                   1887:                            tcg_opc_i3 (TCG_REG_P0, OPC_MUX1_I3,
                   1888:                                        TCG_REG_R3, data_reg, 0xb));
                   1889:             data_reg = TCG_REG_R3;
                   1890:         }
                   1891:         tcg_out_bundle(s, miI,
                   1892:                        tcg_opc_m4 (TCG_REG_P0, opc_st_m4[opc],
                   1893:                                    data_reg, addr_reg),
                   1894:                        tcg_opc_i18(TCG_REG_P0, OPC_NOP_I18, 0),
                   1895:                        tcg_opc_i18(TCG_REG_P0, OPC_NOP_I18, 0));
                   1896:     }
                   1897: #endif
                   1898: }
                   1899: 
                   1900: #endif
                   1901: 
                   1902: static inline void tcg_out_op(TCGContext *s, TCGOpcode opc,
                   1903:                               const TCGArg *args, const int *const_args)
                   1904: {
                   1905:     switch(opc) {
                   1906:     case INDEX_op_exit_tb:
                   1907:         tcg_out_exit_tb(s, args[0]);
                   1908:         break;
                   1909:     case INDEX_op_br:
                   1910:         tcg_out_br(s, args[0]);
                   1911:         break;
                   1912:     case INDEX_op_call:
                   1913:         tcg_out_call(s, args[0]);
                   1914:         break;
                   1915:     case INDEX_op_goto_tb:
                   1916:         tcg_out_goto_tb(s, args[0]);
                   1917:         break;
                   1918:     case INDEX_op_jmp:
                   1919:         tcg_out_jmp(s, args[0]);
                   1920:         break;
                   1921: 
                   1922:     case INDEX_op_movi_i32:
                   1923:         tcg_out_movi(s, TCG_TYPE_I32, args[0], args[1]);
                   1924:         break;
                   1925:     case INDEX_op_movi_i64:
                   1926:         tcg_out_movi(s, TCG_TYPE_I64, args[0], args[1]);
                   1927:         break;
                   1928: 
                   1929:     case INDEX_op_ld8u_i32:
                   1930:     case INDEX_op_ld8u_i64:
                   1931:         tcg_out_ld_rel(s, OPC_LD1_M1, args[0], args[1], args[2]);
                   1932:         break;
                   1933:     case INDEX_op_ld8s_i32:
                   1934:     case INDEX_op_ld8s_i64:
                   1935:         tcg_out_ld_rel(s, OPC_LD1_M1, args[0], args[1], args[2]);
                   1936:         tcg_out_ext(s, OPC_SXT1_I29, args[0], args[0]);
                   1937:         break;
                   1938:     case INDEX_op_ld16u_i32:
                   1939:     case INDEX_op_ld16u_i64:
                   1940:         tcg_out_ld_rel(s, OPC_LD2_M1, args[0], args[1], args[2]);
                   1941:         break;
                   1942:     case INDEX_op_ld16s_i32:
                   1943:     case INDEX_op_ld16s_i64:
                   1944:         tcg_out_ld_rel(s, OPC_LD2_M1, args[0], args[1], args[2]);
                   1945:         tcg_out_ext(s, OPC_SXT2_I29, args[0], args[0]);
                   1946:         break;
                   1947:     case INDEX_op_ld_i32:
                   1948:     case INDEX_op_ld32u_i64:
                   1949:         tcg_out_ld_rel(s, OPC_LD4_M1, args[0], args[1], args[2]);
                   1950:         break;
                   1951:     case INDEX_op_ld32s_i64:
                   1952:         tcg_out_ld_rel(s, OPC_LD4_M1, args[0], args[1], args[2]);
                   1953:         tcg_out_ext(s, OPC_SXT4_I29, args[0], args[0]);
                   1954:         break;
                   1955:     case INDEX_op_ld_i64:
                   1956:         tcg_out_ld_rel(s, OPC_LD8_M1, args[0], args[1], args[2]);
                   1957:         break;
                   1958:     case INDEX_op_st8_i32:
                   1959:     case INDEX_op_st8_i64:
                   1960:         tcg_out_st_rel(s, OPC_ST1_M4, args[0], args[1], args[2]);
                   1961:         break;
                   1962:     case INDEX_op_st16_i32:
                   1963:     case INDEX_op_st16_i64:
                   1964:         tcg_out_st_rel(s, OPC_ST2_M4, args[0], args[1], args[2]);
                   1965:         break;
                   1966:     case INDEX_op_st_i32:
                   1967:     case INDEX_op_st32_i64:
                   1968:         tcg_out_st_rel(s, OPC_ST4_M4, args[0], args[1], args[2]);
                   1969:         break;
                   1970:     case INDEX_op_st_i64:
                   1971:         tcg_out_st_rel(s, OPC_ST8_M4, args[0], args[1], args[2]);
                   1972:         break;
                   1973: 
                   1974:     case INDEX_op_add_i32:
                   1975:     case INDEX_op_add_i64:
                   1976:         tcg_out_alu(s, OPC_ADD_A1, args[0], args[1], const_args[1],
                   1977:                     args[2], const_args[2]);
                   1978:         break;
                   1979:     case INDEX_op_sub_i32:
                   1980:     case INDEX_op_sub_i64:
                   1981:         tcg_out_alu(s, OPC_SUB_A1, args[0], args[1], const_args[1],
                   1982:                     args[2], const_args[2]);
                   1983:         break;
                   1984: 
                   1985:     case INDEX_op_and_i32:
                   1986:     case INDEX_op_and_i64:
                   1987:         tcg_out_alu(s, OPC_AND_A1, args[0], args[1], const_args[1],
                   1988:                     args[2], const_args[2]);
                   1989:         break;
                   1990:     case INDEX_op_andc_i32:
                   1991:     case INDEX_op_andc_i64:
                   1992:         tcg_out_alu(s, OPC_ANDCM_A1, args[0], args[1], const_args[1],
                   1993:                     args[2], const_args[2]);
                   1994:         break;
                   1995:     case INDEX_op_eqv_i32:
                   1996:     case INDEX_op_eqv_i64:
                   1997:         tcg_out_eqv(s, args[0], args[1], const_args[1],
                   1998:                     args[2], const_args[2]);
                   1999:         break;
                   2000:     case INDEX_op_nand_i32:
                   2001:     case INDEX_op_nand_i64:
                   2002:         tcg_out_nand(s, args[0], args[1], const_args[1],
                   2003:                      args[2], const_args[2]);
                   2004:         break;
                   2005:     case INDEX_op_nor_i32:
                   2006:     case INDEX_op_nor_i64:
                   2007:         tcg_out_nor(s, args[0], args[1], const_args[1],
                   2008:                     args[2], const_args[2]);
                   2009:         break;
                   2010:     case INDEX_op_or_i32:
                   2011:     case INDEX_op_or_i64:
                   2012:         tcg_out_alu(s, OPC_OR_A1, args[0], args[1], const_args[1],
                   2013:                     args[2], const_args[2]);
                   2014:         break;
                   2015:     case INDEX_op_orc_i32:
                   2016:     case INDEX_op_orc_i64:
                   2017:         tcg_out_orc(s, args[0], args[1], const_args[1],
                   2018:                     args[2], const_args[2]);
                   2019:         break;
                   2020:     case INDEX_op_xor_i32:
                   2021:     case INDEX_op_xor_i64:
                   2022:         tcg_out_alu(s, OPC_XOR_A1, args[0], args[1], const_args[1],
                   2023:                     args[2], const_args[2]);
                   2024:         break;
                   2025: 
                   2026:     case INDEX_op_mul_i32:
                   2027:     case INDEX_op_mul_i64:
                   2028:         tcg_out_mul(s, args[0], args[1], args[2]);
                   2029:         break;
                   2030: 
                   2031:     case INDEX_op_sar_i32:
                   2032:         tcg_out_sar_i32(s, args[0], args[1], args[2], const_args[2]);
                   2033:         break;
                   2034:     case INDEX_op_sar_i64:
                   2035:         tcg_out_sar_i64(s, args[0], args[1], args[2], const_args[2]);
                   2036:         break;
                   2037:     case INDEX_op_shl_i32:
                   2038:         tcg_out_shl_i32(s, args[0], args[1], args[2], const_args[2]);
                   2039:         break;
                   2040:     case INDEX_op_shl_i64:
                   2041:         tcg_out_shl_i64(s, args[0], args[1], args[2], const_args[2]);
                   2042:         break;
                   2043:     case INDEX_op_shr_i32:
                   2044:         tcg_out_shr_i32(s, args[0], args[1], args[2], const_args[2]);
                   2045:         break;
                   2046:     case INDEX_op_shr_i64:
                   2047:         tcg_out_shr_i64(s, args[0], args[1], args[2], const_args[2]);
                   2048:         break;
                   2049:     case INDEX_op_rotl_i32:
                   2050:         tcg_out_rotl_i32(s, args[0], args[1], args[2], const_args[2]);
                   2051:         break;
                   2052:     case INDEX_op_rotl_i64:
                   2053:         tcg_out_rotl_i64(s, args[0], args[1], args[2], const_args[2]);
                   2054:         break;
                   2055:     case INDEX_op_rotr_i32:
                   2056:         tcg_out_rotr_i32(s, args[0], args[1], args[2], const_args[2]);
                   2057:         break;
                   2058:     case INDEX_op_rotr_i64:
                   2059:         tcg_out_rotr_i64(s, args[0], args[1], args[2], const_args[2]);
                   2060:         break;
                   2061: 
                   2062:     case INDEX_op_ext8s_i32:
                   2063:     case INDEX_op_ext8s_i64:
                   2064:         tcg_out_ext(s, OPC_SXT1_I29, args[0], args[1]);
                   2065:         break;
                   2066:     case INDEX_op_ext8u_i32:
                   2067:     case INDEX_op_ext8u_i64:
                   2068:         tcg_out_ext(s, OPC_ZXT1_I29, args[0], args[1]);
                   2069:         break;
                   2070:     case INDEX_op_ext16s_i32:
                   2071:     case INDEX_op_ext16s_i64:
                   2072:         tcg_out_ext(s, OPC_SXT2_I29, args[0], args[1]);
                   2073:         break;
                   2074:     case INDEX_op_ext16u_i32:
                   2075:     case INDEX_op_ext16u_i64:
                   2076:         tcg_out_ext(s, OPC_ZXT2_I29, args[0], args[1]);
                   2077:         break;
                   2078:     case INDEX_op_ext32s_i64:
                   2079:         tcg_out_ext(s, OPC_SXT4_I29, args[0], args[1]);
                   2080:         break;
                   2081:     case INDEX_op_ext32u_i64:
                   2082:         tcg_out_ext(s, OPC_ZXT4_I29, args[0], args[1]);
                   2083:         break;
                   2084: 
                   2085:     case INDEX_op_bswap16_i32:
                   2086:     case INDEX_op_bswap16_i64:
                   2087:         tcg_out_bswap16(s, args[0], args[1]);
                   2088:         break;
                   2089:     case INDEX_op_bswap32_i32:
                   2090:     case INDEX_op_bswap32_i64:
                   2091:         tcg_out_bswap32(s, args[0], args[1]);
                   2092:         break;
                   2093:     case INDEX_op_bswap64_i64:
                   2094:         tcg_out_bswap64(s, args[0], args[1]);
                   2095:         break;
                   2096: 
                   2097:     case INDEX_op_brcond_i32:
                   2098:         tcg_out_brcond(s, args[2], args[0], const_args[0],
                   2099:                        args[1], const_args[1], args[3], 1);
                   2100:         break;
                   2101:     case INDEX_op_brcond_i64:
                   2102:         tcg_out_brcond(s, args[2], args[0], const_args[0],
                   2103:                        args[1], const_args[1], args[3], 0);
                   2104:         break;
                   2105:     case INDEX_op_setcond_i32:
                   2106:         tcg_out_setcond(s, args[3], args[0], args[1], args[2], 1);
                   2107:         break;
                   2108:     case INDEX_op_setcond_i64:
                   2109:         tcg_out_setcond(s, args[3], args[0], args[1], args[2], 0);
                   2110:         break;
                   2111: 
                   2112:     case INDEX_op_qemu_ld8u:
                   2113:         tcg_out_qemu_ld(s, args, 0);
                   2114:         break;
                   2115:     case INDEX_op_qemu_ld8s:
                   2116:         tcg_out_qemu_ld(s, args, 0 | 4);
                   2117:         break;
                   2118:     case INDEX_op_qemu_ld16u:
                   2119:         tcg_out_qemu_ld(s, args, 1);
                   2120:         break;
                   2121:     case INDEX_op_qemu_ld16s:
                   2122:         tcg_out_qemu_ld(s, args, 1 | 4);
                   2123:         break;
                   2124:     case INDEX_op_qemu_ld32u:
                   2125:         tcg_out_qemu_ld(s, args, 2);
                   2126:         break;
                   2127:     case INDEX_op_qemu_ld32s:
                   2128:         tcg_out_qemu_ld(s, args, 2 | 4);
                   2129:         break;
                   2130:     case INDEX_op_qemu_ld64:
                   2131:         tcg_out_qemu_ld(s, args, 3);
                   2132:         break;
                   2133: 
                   2134:     case INDEX_op_qemu_st8:
                   2135:         tcg_out_qemu_st(s, args, 0);
                   2136:         break;
                   2137:     case INDEX_op_qemu_st16:
                   2138:         tcg_out_qemu_st(s, args, 1);
                   2139:         break;
                   2140:     case INDEX_op_qemu_st32:
                   2141:         tcg_out_qemu_st(s, args, 2);
                   2142:         break;
                   2143:     case INDEX_op_qemu_st64:
                   2144:         tcg_out_qemu_st(s, args, 3);
                   2145:         break;
                   2146: 
                   2147:     default:
                   2148:         tcg_abort();
                   2149:     }
                   2150: }
                   2151: 
                   2152: static const TCGTargetOpDef ia64_op_defs[] = {
                   2153:     { INDEX_op_br, { } },
                   2154:     { INDEX_op_call, { "r" } },
                   2155:     { INDEX_op_exit_tb, { } },
                   2156:     { INDEX_op_goto_tb, { } },
                   2157:     { INDEX_op_jmp, { "r" } },
                   2158: 
                   2159:     { INDEX_op_mov_i32, { "r", "r" } },
                   2160:     { INDEX_op_movi_i32, { "r" } },
                   2161: 
                   2162:     { INDEX_op_ld8u_i32, { "r", "r" } },
                   2163:     { INDEX_op_ld8s_i32, { "r", "r" } },
                   2164:     { INDEX_op_ld16u_i32, { "r", "r" } },
                   2165:     { INDEX_op_ld16s_i32, { "r", "r" } },
                   2166:     { INDEX_op_ld_i32, { "r", "r" } },
                   2167:     { INDEX_op_st8_i32, { "rZ", "r" } },
                   2168:     { INDEX_op_st16_i32, { "rZ", "r" } },
                   2169:     { INDEX_op_st_i32, { "rZ", "r" } },
                   2170: 
                   2171:     { INDEX_op_add_i32, { "r", "rI", "rI" } },
                   2172:     { INDEX_op_sub_i32, { "r", "rI", "rI" } },
                   2173: 
                   2174:     { INDEX_op_and_i32, { "r", "rI", "rI" } },
                   2175:     { INDEX_op_andc_i32, { "r", "rI", "rI" } },
                   2176:     { INDEX_op_eqv_i32, { "r", "rZ", "rZ" } },
                   2177:     { INDEX_op_nand_i32, { "r", "rZ", "rZ" } },
                   2178:     { INDEX_op_nor_i32, { "r", "rZ", "rZ" } },
                   2179:     { INDEX_op_or_i32, { "r", "rI", "rI" } },
                   2180:     { INDEX_op_orc_i32, { "r", "rZ", "rZ" } },
                   2181:     { INDEX_op_xor_i32, { "r", "rI", "rI" } },
                   2182: 
                   2183:     { INDEX_op_mul_i32, { "r", "rZ", "rZ" } },
                   2184: 
                   2185:     { INDEX_op_sar_i32, { "r", "rZ", "ri" } },
                   2186:     { INDEX_op_shl_i32, { "r", "rZ", "ri" } },
                   2187:     { INDEX_op_shr_i32, { "r", "rZ", "ri" } },
                   2188:     { INDEX_op_rotl_i32, { "r", "rZ", "ri" } },
                   2189:     { INDEX_op_rotr_i32, { "r", "rZ", "ri" } },
                   2190: 
                   2191:     { INDEX_op_ext8s_i32, { "r", "rZ"} },
                   2192:     { INDEX_op_ext8u_i32, { "r", "rZ"} },
                   2193:     { INDEX_op_ext16s_i32, { "r", "rZ"} },
                   2194:     { INDEX_op_ext16u_i32, { "r", "rZ"} },
                   2195: 
                   2196:     { INDEX_op_bswap16_i32, { "r", "rZ" } },
                   2197:     { INDEX_op_bswap32_i32, { "r", "rZ" } },
                   2198: 
                   2199:     { INDEX_op_brcond_i32, { "rI", "rI" } },
                   2200:     { INDEX_op_setcond_i32, { "r", "rZ", "rZ" } },
                   2201: 
                   2202:     { INDEX_op_mov_i64, { "r", "r" } },
                   2203:     { INDEX_op_movi_i64, { "r" } },
                   2204: 
                   2205:     { INDEX_op_ld8u_i64, { "r", "r" } },
                   2206:     { INDEX_op_ld8s_i64, { "r", "r" } },
                   2207:     { INDEX_op_ld16u_i64, { "r", "r" } },
                   2208:     { INDEX_op_ld16s_i64, { "r", "r" } },
                   2209:     { INDEX_op_ld32u_i64, { "r", "r" } },
                   2210:     { INDEX_op_ld32s_i64, { "r", "r" } },
                   2211:     { INDEX_op_ld_i64, { "r", "r" } },
                   2212:     { INDEX_op_st8_i64, { "rZ", "r" } },
                   2213:     { INDEX_op_st16_i64, { "rZ", "r" } },
                   2214:     { INDEX_op_st32_i64, { "rZ", "r" } },
                   2215:     { INDEX_op_st_i64, { "rZ", "r" } },
                   2216: 
                   2217:     { INDEX_op_add_i64, { "r", "rI", "rI" } },
                   2218:     { INDEX_op_sub_i64, { "r", "rI", "rI" } },
                   2219: 
                   2220:     { INDEX_op_and_i64, { "r", "rI", "rI" } },
                   2221:     { INDEX_op_andc_i64, { "r", "rI", "rI" } },
                   2222:     { INDEX_op_eqv_i64, { "r", "rZ", "rZ" } },
                   2223:     { INDEX_op_nand_i64, { "r", "rZ", "rZ" } },
                   2224:     { INDEX_op_nor_i64, { "r", "rZ", "rZ" } },
                   2225:     { INDEX_op_or_i64, { "r", "rI", "rI" } },
                   2226:     { INDEX_op_orc_i64, { "r", "rZ", "rZ" } },
                   2227:     { INDEX_op_xor_i64, { "r", "rI", "rI" } },
                   2228: 
                   2229:     { INDEX_op_mul_i64, { "r", "rZ", "rZ" } },
                   2230: 
                   2231:     { INDEX_op_sar_i64, { "r", "rZ", "ri" } },
                   2232:     { INDEX_op_shl_i64, { "r", "rZ", "ri" } },
                   2233:     { INDEX_op_shr_i64, { "r", "rZ", "ri" } },
                   2234:     { INDEX_op_rotl_i64, { "r", "rZ", "ri" } },
                   2235:     { INDEX_op_rotr_i64, { "r", "rZ", "ri" } },
                   2236: 
                   2237:     { INDEX_op_ext8s_i64, { "r", "rZ"} },
                   2238:     { INDEX_op_ext8u_i64, { "r", "rZ"} },
                   2239:     { INDEX_op_ext16s_i64, { "r", "rZ"} },
                   2240:     { INDEX_op_ext16u_i64, { "r", "rZ"} },
                   2241:     { INDEX_op_ext32s_i64, { "r", "rZ"} },
                   2242:     { INDEX_op_ext32u_i64, { "r", "rZ"} },
                   2243: 
                   2244:     { INDEX_op_bswap16_i64, { "r", "rZ" } },
                   2245:     { INDEX_op_bswap32_i64, { "r", "rZ" } },
                   2246:     { INDEX_op_bswap64_i64, { "r", "rZ" } },
                   2247: 
                   2248:     { INDEX_op_brcond_i64, { "rI", "rI" } },
                   2249:     { INDEX_op_setcond_i64, { "r", "rZ", "rZ" } },
                   2250: 
                   2251:     { INDEX_op_qemu_ld8u, { "r", "r" } },
                   2252:     { INDEX_op_qemu_ld8s, { "r", "r" } },
                   2253:     { INDEX_op_qemu_ld16u, { "r", "r" } },
                   2254:     { INDEX_op_qemu_ld16s, { "r", "r" } },
                   2255:     { INDEX_op_qemu_ld32, { "r", "r" } },
                   2256:     { INDEX_op_qemu_ld32u, { "r", "r" } },
                   2257:     { INDEX_op_qemu_ld32s, { "r", "r" } },
                   2258:     { INDEX_op_qemu_ld64, { "r", "r" } },
                   2259: 
                   2260:     { INDEX_op_qemu_st8, { "SZ", "r" } },
                   2261:     { INDEX_op_qemu_st16, { "SZ", "r" } },
                   2262:     { INDEX_op_qemu_st32, { "SZ", "r" } },
                   2263:     { INDEX_op_qemu_st64, { "SZ", "r" } },
                   2264: 
                   2265:     { -1 },
                   2266: };
                   2267: 
                   2268: /* Generate global QEMU prologue and epilogue code */
                   2269: static void tcg_target_qemu_prologue(TCGContext *s)
                   2270: {
                   2271:     int frame_size;
                   2272: 
                   2273:     /* reserve some stack space */
                   2274:     frame_size = TCG_STATIC_CALL_ARGS_SIZE;
                   2275:     frame_size = (frame_size + TCG_TARGET_STACK_ALIGN - 1) &
                   2276:                  ~(TCG_TARGET_STACK_ALIGN - 1);
                   2277: 
                   2278:     /* First emit adhoc function descriptor */
                   2279:     *(uint64_t *)(s->code_ptr) = (uint64_t)s->code_ptr + 16; /* entry point */
                   2280:     s->code_ptr += 16; /* skip GP */
                   2281: 
                   2282:     /* prologue */
                   2283:     tcg_out_bundle(s, mII,
                   2284:                    tcg_opc_m34(TCG_REG_P0, OPC_ALLOC_M34,
                   2285:                                TCG_REG_R33, 32, 24, 0),
                   2286:                    tcg_opc_i21(TCG_REG_P0, OPC_MOV_I21,
                   2287:                                TCG_REG_B6, TCG_REG_R32, 0),
                   2288:                    tcg_opc_i22(TCG_REG_P0, OPC_MOV_I22,
                   2289:                                TCG_REG_R32, TCG_REG_B0));
                   2290: 
                   2291:     /* ??? If GUEST_BASE < 0x200000, we could load the register via
                   2292:        an ADDL in the M slot of the next bundle.  */
                   2293:     if (GUEST_BASE != 0) {
                   2294:         tcg_out_bundle(s, mlx,
                   2295:                        tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
                   2296:                        tcg_opc_l2 (GUEST_BASE),
                   2297:                        tcg_opc_x2 (TCG_REG_P0, OPC_MOVL_X2,
                   2298:                                    TCG_GUEST_BASE_REG, GUEST_BASE));
                   2299:         tcg_regset_set_reg(s->reserved_regs, TCG_GUEST_BASE_REG);
                   2300:     }
                   2301: 
                   2302:     tcg_out_bundle(s, miB,
                   2303:                    tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
                   2304:                    tcg_opc_a4 (TCG_REG_P0, OPC_ADDS_A4,
                   2305:                                TCG_REG_R12, -frame_size, TCG_REG_R12),
                   2306:                    tcg_opc_b4 (TCG_REG_P0, OPC_BR_SPTK_MANY_B4, TCG_REG_B6));
                   2307: 
                   2308:     /* epilogue */
                   2309:     tb_ret_addr = s->code_ptr;
                   2310:     tcg_out_bundle(s, miI,
                   2311:                    tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
                   2312:                    tcg_opc_i21(TCG_REG_P0, OPC_MOV_I21,
                   2313:                                TCG_REG_B0, TCG_REG_R32, 0),
                   2314:                    tcg_opc_a4 (TCG_REG_P0, OPC_ADDS_A4,
                   2315:                                TCG_REG_R12, frame_size, TCG_REG_R12));
                   2316:     tcg_out_bundle(s, miB,
                   2317:                    tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0),
                   2318:                    tcg_opc_i26(TCG_REG_P0, OPC_MOV_I_I26,
                   2319:                                TCG_REG_PFS, TCG_REG_R33),
                   2320:                    tcg_opc_b4 (TCG_REG_P0, OPC_BR_RET_SPTK_MANY_B4,
                   2321:                                TCG_REG_B0));
                   2322: }
                   2323: 
                   2324: static void tcg_target_init(TCGContext *s)
                   2325: {
                   2326:     tcg_regset_set(tcg_target_available_regs[TCG_TYPE_I32],
                   2327:                    0xffffffffffffffffull);
                   2328:     tcg_regset_set(tcg_target_available_regs[TCG_TYPE_I64],
                   2329:                    0xffffffffffffffffull);
                   2330: 
                   2331:     tcg_regset_clear(tcg_target_call_clobber_regs);
                   2332:     tcg_regset_set_reg(tcg_target_call_clobber_regs, TCG_REG_R8);
                   2333:     tcg_regset_set_reg(tcg_target_call_clobber_regs, TCG_REG_R9);
                   2334:     tcg_regset_set_reg(tcg_target_call_clobber_regs, TCG_REG_R10);
                   2335:     tcg_regset_set_reg(tcg_target_call_clobber_regs, TCG_REG_R11);
                   2336:     tcg_regset_set_reg(tcg_target_call_clobber_regs, TCG_REG_R14);
                   2337:     tcg_regset_set_reg(tcg_target_call_clobber_regs, TCG_REG_R15);
                   2338:     tcg_regset_set_reg(tcg_target_call_clobber_regs, TCG_REG_R16);
                   2339:     tcg_regset_set_reg(tcg_target_call_clobber_regs, TCG_REG_R17);
                   2340:     tcg_regset_set_reg(tcg_target_call_clobber_regs, TCG_REG_R18);
                   2341:     tcg_regset_set_reg(tcg_target_call_clobber_regs, TCG_REG_R19);
                   2342:     tcg_regset_set_reg(tcg_target_call_clobber_regs, TCG_REG_R20);
                   2343:     tcg_regset_set_reg(tcg_target_call_clobber_regs, TCG_REG_R21);
                   2344:     tcg_regset_set_reg(tcg_target_call_clobber_regs, TCG_REG_R22);
                   2345:     tcg_regset_set_reg(tcg_target_call_clobber_regs, TCG_REG_R23);
                   2346:     tcg_regset_set_reg(tcg_target_call_clobber_regs, TCG_REG_R24);
                   2347:     tcg_regset_set_reg(tcg_target_call_clobber_regs, TCG_REG_R25);
                   2348:     tcg_regset_set_reg(tcg_target_call_clobber_regs, TCG_REG_R26);
                   2349:     tcg_regset_set_reg(tcg_target_call_clobber_regs, TCG_REG_R27);
                   2350:     tcg_regset_set_reg(tcg_target_call_clobber_regs, TCG_REG_R28);
                   2351:     tcg_regset_set_reg(tcg_target_call_clobber_regs, TCG_REG_R29);
                   2352:     tcg_regset_set_reg(tcg_target_call_clobber_regs, TCG_REG_R30);
                   2353:     tcg_regset_set_reg(tcg_target_call_clobber_regs, TCG_REG_R31);
                   2354:     tcg_regset_set_reg(tcg_target_call_clobber_regs, TCG_REG_R56);
                   2355:     tcg_regset_set_reg(tcg_target_call_clobber_regs, TCG_REG_R57);
                   2356:     tcg_regset_set_reg(tcg_target_call_clobber_regs, TCG_REG_R58);
                   2357:     tcg_regset_set_reg(tcg_target_call_clobber_regs, TCG_REG_R59);
                   2358:     tcg_regset_set_reg(tcg_target_call_clobber_regs, TCG_REG_R60);
                   2359:     tcg_regset_set_reg(tcg_target_call_clobber_regs, TCG_REG_R61);
                   2360:     tcg_regset_set_reg(tcg_target_call_clobber_regs, TCG_REG_R62);
                   2361:     tcg_regset_set_reg(tcg_target_call_clobber_regs, TCG_REG_R63);
                   2362: 
                   2363:     tcg_regset_clear(s->reserved_regs);
                   2364:     tcg_regset_set_reg(s->reserved_regs, TCG_REG_R0);   /* zero register */
                   2365:     tcg_regset_set_reg(s->reserved_regs, TCG_REG_R1);   /* global pointer */
                   2366:     tcg_regset_set_reg(s->reserved_regs, TCG_REG_R2);   /* internal use */
                   2367:     tcg_regset_set_reg(s->reserved_regs, TCG_REG_R3);   /* internal use */
                   2368:     tcg_regset_set_reg(s->reserved_regs, TCG_REG_R12);  /* stack pointer */
                   2369:     tcg_regset_set_reg(s->reserved_regs, TCG_REG_R13);  /* thread pointer */
                   2370:     tcg_regset_set_reg(s->reserved_regs, TCG_REG_R32);  /* return address */
                   2371:     tcg_regset_set_reg(s->reserved_regs, TCG_REG_R33);  /* PFS */
                   2372: 
                   2373:     /* The following 3 are not in use, are call-saved, but *not* saved
                   2374:        by the prologue.  Therefore we cannot use them without modifying
                   2375:        the prologue.  There doesn't seem to be any good reason to use
                   2376:        these as opposed to the windowed registers.  */
                   2377:     tcg_regset_set_reg(s->reserved_regs, TCG_REG_R4);
                   2378:     tcg_regset_set_reg(s->reserved_regs, TCG_REG_R5);
                   2379:     tcg_regset_set_reg(s->reserved_regs, TCG_REG_R6);
                   2380: 
                   2381:     tcg_add_target_add_op_defs(ia64_op_defs);
                   2382: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.