Annotation of qemu/tcg/tcg-op.h, revision 1.1

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

unix.superglobalmegacorp.com

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