Annotation of qemu/target-arm/op_iwmmxt.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * iwMMXt micro operations for XScale.
                      3:  *
                      4:  * Copyright (c) 2007 OpenedHand, Ltd.
                      5:  * Written by Andrzej Zaborowski <[email protected]>
                      6:  *
                      7:  * This library is free software; you can redistribute it and/or
                      8:  * modify it under the terms of the GNU Lesser General Public
                      9:  * License as published by the Free Software Foundation; either
                     10:  * version 2 of the License, or (at your option) any later version.
                     11:  *
                     12:  * This library is distributed in the hope that it will be useful,
                     13:  * but WITHOUT ANY WARRANTY; without even the implied warranty of
                     14:  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
                     15:  * Lesser General Public License for more details.
                     16:  *
                     17:  * You should have received a copy of the GNU Lesser General Public
                     18:  * License along with this library; if not, write to the Free Software
                     19:  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
                     20:  */
                     21: 
                     22: #define M1     env->iwmmxt.regs[PARAM1]
                     23: 
                     24: /* iwMMXt macros extracted from GNU gdb.  */
                     25: 
                     26: /* Set the SIMD wCASF flags for 8, 16, 32 or 64-bit operations.  */
                     27: #define SIMD8_SET( v, n, b)    ((v != 0) << ((((b) + 1) * 4) + (n)))
                     28: #define SIMD16_SET(v, n, h)    ((v != 0) << ((((h) + 1) * 8) + (n)))
                     29: #define SIMD32_SET(v, n, w)    ((v != 0) << ((((w) + 1) * 16) + (n)))
                     30: #define SIMD64_SET(v, n)       ((v != 0) << (32 + (n)))
                     31: /* Flags to pass as "n" above.  */
                     32: #define SIMD_NBIT      -1
                     33: #define SIMD_ZBIT      -2
                     34: #define SIMD_CBIT      -3
                     35: #define SIMD_VBIT      -4
                     36: /* Various status bit macros.  */
                     37: #define NBIT8(x)       ((x) & 0x80)
                     38: #define NBIT16(x)      ((x) & 0x8000)
                     39: #define NBIT32(x)      ((x) & 0x80000000)
                     40: #define NBIT64(x)      ((x) & 0x8000000000000000ULL)
                     41: #define ZBIT8(x)       (((x) & 0xff) == 0)
                     42: #define ZBIT16(x)      (((x) & 0xffff) == 0)
                     43: #define ZBIT32(x)      (((x) & 0xffffffff) == 0)
                     44: #define ZBIT64(x)      (x == 0)
                     45: /* Sign extension macros.  */
                     46: #define EXTEND8H(a)    ((uint16_t) (int8_t) (a))
                     47: #define EXTEND8(a)     ((uint32_t) (int8_t) (a))
                     48: #define EXTEND16(a)    ((uint32_t) (int16_t) (a))
                     49: #define EXTEND16S(a)   ((int32_t) (int16_t) (a))
                     50: #define EXTEND32(a)    ((uint64_t) (int32_t) (a))
                     51: 
                     52: void OPPROTO op_iwmmxt_movl_T0_T1_wRn(void)
                     53: {
                     54:     T0 = M1 & ~(uint32_t) 0;
                     55:     T1 = M1 >> 32;
                     56: }
                     57: 
                     58: void OPPROTO op_iwmmxt_movl_wRn_T0_T1(void)
                     59: {
                     60:     M1 = ((uint64_t) T1 << 32) | T0;
                     61: }
                     62: 
                     63: void OPPROTO op_iwmmxt_movq_M0_wRn(void)
                     64: {
                     65:     M0 = M1;
                     66: }
                     67: 
                     68: void OPPROTO op_iwmmxt_orq_M0_wRn(void)
                     69: {
                     70:     M0 |= M1;
                     71: }
                     72: 
                     73: void OPPROTO op_iwmmxt_andq_M0_wRn(void)
                     74: {
                     75:     M0 &= M1;
                     76: }
                     77: 
                     78: void OPPROTO op_iwmmxt_xorq_M0_wRn(void)
                     79: {
                     80:     M0 ^= M1;
                     81: }
                     82: 
                     83: void OPPROTO op_iwmmxt_maddsq_M0_wRn(void)
                     84: {
                     85:     M0 = ((
                     86:             EXTEND16S((M0 >> 0) & 0xffff) * EXTEND16S((M1 >> 0) & 0xffff) +
                     87:             EXTEND16S((M0 >> 16) & 0xffff) * EXTEND16S((M1 >> 16) & 0xffff)
                     88:         ) & 0xffffffff) | ((uint64_t) (
                     89:             EXTEND16S((M0 >> 32) & 0xffff) * EXTEND16S((M1 >> 32) & 0xffff) +
                     90:             EXTEND16S((M0 >> 48) & 0xffff) * EXTEND16S((M1 >> 48) & 0xffff)
                     91:         ) << 32);
                     92: }
                     93: 
                     94: void OPPROTO op_iwmmxt_madduq_M0_wRn(void)
                     95: {
                     96:     M0 = ((
                     97:             ((M0 >> 0) & 0xffff) * ((M1 >> 0) & 0xffff) +
                     98:             ((M0 >> 16) & 0xffff) * ((M1 >> 16) & 0xffff)
                     99:         ) & 0xffffffff) | ((
                    100:             ((M0 >> 32) & 0xffff) * ((M1 >> 32) & 0xffff) +
                    101:             ((M0 >> 48) & 0xffff) * ((M1 >> 48) & 0xffff)
                    102:         ) << 32);
                    103: }
                    104: 
                    105: void OPPROTO op_iwmmxt_sadb_M0_wRn(void)
                    106: {
                    107: #define abs(x) (((x) >= 0) ? x : -x)
                    108: #define SADB(SHR) abs((int) ((M0 >> SHR) & 0xff) - (int) ((M1 >> SHR) & 0xff))
                    109:     M0 =
                    110:         SADB(0) + SADB(8) + SADB(16) + SADB(24) +
                    111:         SADB(32) + SADB(40) + SADB(48) + SADB(56);
                    112: #undef SADB
                    113: }
                    114: 
                    115: void OPPROTO op_iwmmxt_sadw_M0_wRn(void)
                    116: {
                    117: #define SADW(SHR) \
                    118:     abs((int) ((M0 >> SHR) & 0xffff) - (int) ((M1 >> SHR) & 0xffff))
                    119:     M0 = SADW(0) + SADW(16) + SADW(32) + SADW(48);
                    120: #undef SADW
                    121: }
                    122: 
                    123: void OPPROTO op_iwmmxt_addl_M0_wRn(void)
                    124: {
                    125:     M0 += env->iwmmxt.regs[PARAM1] & 0xffffffff;
                    126: }
                    127: 
                    128: void OPPROTO op_iwmmxt_mulsw_M0_wRn(void)
                    129: {
                    130: #define MULS(SHR) ((uint64_t) ((( \
                    131:         EXTEND16S((M0 >> SHR) & 0xffff) * EXTEND16S((M1 >> SHR) & 0xffff) \
                    132:     ) >> PARAM2) & 0xffff) << SHR)
                    133:     M0 = MULS(0) | MULS(16) | MULS(32) | MULS(48);
                    134: #undef MULS
                    135: }
                    136: 
                    137: void OPPROTO op_iwmmxt_muluw_M0_wRn(void)
                    138: {
                    139: #define MULU(SHR) ((uint64_t) ((( \
                    140:         ((M0 >> SHR) & 0xffff) * ((M1 >> SHR) & 0xffff) \
                    141:     ) >> PARAM2) & 0xffff) << SHR)
                    142:     M0 = MULU(0) | MULU(16) | MULU(32) | MULU(48);
                    143: #undef MULU
                    144: }
                    145: 
                    146: void OPPROTO op_iwmmxt_macsw_M0_wRn(void)
                    147: {
                    148: #define MACS(SHR) ( \
                    149:         EXTEND16((M0 >> SHR) & 0xffff) * EXTEND16S((M1 >> SHR) & 0xffff))
                    150:     M0 = (int64_t) (MACS(0) + MACS(16) + MACS(32) + MACS(48));
                    151: #undef MACS
                    152: }
                    153: 
                    154: void OPPROTO op_iwmmxt_macuw_M0_wRn(void)
                    155: {
                    156: #define MACU(SHR) ( \
                    157:         (uint32_t) ((M0 >> SHR) & 0xffff) * \
                    158:         (uint32_t) ((M1 >> SHR) & 0xffff))
                    159:     M0 = MACU(0) + MACU(16) + MACU(32) + MACU(48);
                    160: #undef MACU
                    161: }
                    162: 
                    163: void OPPROTO op_iwmmxt_addsq_M0_wRn(void)
                    164: {
                    165:     M0 = (int64_t) M0 + (int64_t) M1;
                    166: }
                    167: 
                    168: void OPPROTO op_iwmmxt_adduq_M0_wRn(void)
                    169: {
                    170:     M0 += M1;
                    171: }
                    172: 
                    173: void OPPROTO op_iwmmxt_movq_wRn_M0(void)
                    174: {
                    175:     M1 = M0;
                    176: }
                    177: 
                    178: void OPPROTO op_iwmmxt_movl_wCx_T0(void)
                    179: {
                    180:     env->iwmmxt.cregs[PARAM1] = T0;
                    181: }
                    182: 
                    183: void OPPROTO op_iwmmxt_movl_T0_wCx(void)
                    184: {
                    185:     T0 = env->iwmmxt.cregs[PARAM1];
                    186: }
                    187: 
                    188: void OPPROTO op_iwmmxt_movl_T1_wCx(void)
                    189: {
                    190:     T1 = env->iwmmxt.cregs[PARAM1];
                    191: }
                    192: 
                    193: void OPPROTO op_iwmmxt_set_mup(void)
                    194: {
                    195:     env->iwmmxt.cregs[ARM_IWMMXT_wCon] |= 2;
                    196: }
                    197: 
                    198: void OPPROTO op_iwmmxt_set_cup(void)
                    199: {
                    200:     env->iwmmxt.cregs[ARM_IWMMXT_wCon] |= 1;
                    201: }
                    202: 
                    203: void OPPROTO op_iwmmxt_setpsr_nz(void)
                    204: {
                    205:     env->iwmmxt.cregs[ARM_IWMMXT_wCASF] =
                    206:         SIMD64_SET((M0 == 0), SIMD_ZBIT) |
                    207:         SIMD64_SET((M0 & (1ULL << 63)), SIMD_NBIT);
                    208: }
                    209: 
                    210: void OPPROTO op_iwmmxt_negq_M0(void)
                    211: {
                    212:     M0 = ~M0;
                    213: }
                    214: 
                    215: #define NZBIT8(x, i) \
                    216:     SIMD8_SET(NBIT8((x) & 0xff), SIMD_NBIT, i) | \
                    217:     SIMD8_SET(ZBIT8((x) & 0xff), SIMD_ZBIT, i)
                    218: #define NZBIT16(x, i) \
                    219:     SIMD16_SET(NBIT16((x) & 0xffff), SIMD_NBIT, i) | \
                    220:     SIMD16_SET(ZBIT16((x) & 0xffff), SIMD_ZBIT, i)
                    221: #define NZBIT32(x, i) \
                    222:     SIMD32_SET(NBIT32((x) & 0xffffffff), SIMD_NBIT, i) | \
                    223:     SIMD32_SET(ZBIT32((x) & 0xffffffff), SIMD_ZBIT, i)
                    224: #define NZBIT64(x) \
                    225:     SIMD64_SET(NBIT64(x), SIMD_NBIT) | \
                    226:     SIMD64_SET(ZBIT64(x), SIMD_ZBIT)
                    227: #define IWMMXT_OP_UNPACK(S, SH0, SH1, SH2, SH3)                        \
                    228: void OPPROTO glue(op_iwmmxt_unpack, glue(S, b_M0_wRn))(void)   \
                    229: {                                                              \
                    230:     M0 =                                                       \
                    231:         (((M0 >> SH0) & 0xff) << 0) | (((M1 >> SH0) & 0xff) << 8) |    \
                    232:         (((M0 >> SH1) & 0xff) << 16) | (((M1 >> SH1) & 0xff) << 24) |  \
                    233:         (((M0 >> SH2) & 0xff) << 32) | (((M1 >> SH2) & 0xff) << 40) |  \
                    234:         (((M0 >> SH3) & 0xff) << 48) | (((M1 >> SH3) & 0xff) << 56);   \
                    235:     env->iwmmxt.cregs[ARM_IWMMXT_wCASF] =                      \
                    236:         NZBIT8(M0 >> 0, 0) | NZBIT8(M0 >> 8, 1) |              \
                    237:         NZBIT8(M0 >> 16, 2) | NZBIT8(M0 >> 24, 3) |            \
                    238:         NZBIT8(M0 >> 32, 4) | NZBIT8(M0 >> 40, 5) |            \
                    239:         NZBIT8(M0 >> 48, 6) | NZBIT8(M0 >> 56, 7);             \
                    240: }                                                              \
                    241: void OPPROTO glue(op_iwmmxt_unpack, glue(S, w_M0_wRn))(void)   \
                    242: {                                                              \
                    243:     M0 =                                                       \
                    244:         (((M0 >> SH0) & 0xffff) << 0) |                                \
                    245:         (((M1 >> SH0) & 0xffff) << 16) |                       \
                    246:         (((M0 >> SH2) & 0xffff) << 32) |                       \
                    247:         (((M1 >> SH2) & 0xffff) << 48);                                \
                    248:     env->iwmmxt.cregs[ARM_IWMMXT_wCASF] =                      \
                    249:         NZBIT8(M0 >> 0, 0) | NZBIT8(M0 >> 16, 1) |             \
                    250:         NZBIT8(M0 >> 32, 2) | NZBIT8(M0 >> 48, 3);             \
                    251: }                                                              \
                    252: void OPPROTO glue(op_iwmmxt_unpack, glue(S, l_M0_wRn))(void)   \
                    253: {                                                              \
                    254:     M0 =                                                       \
                    255:         (((M0 >> SH0) & 0xffffffff) << 0) |                    \
                    256:         (((M1 >> SH0) & 0xffffffff) << 32);                    \
                    257:     env->iwmmxt.cregs[ARM_IWMMXT_wCASF] =                      \
                    258:         NZBIT32(M0 >> 0, 0) | NZBIT32(M0 >> 32, 1);            \
                    259: }                                                              \
                    260: void OPPROTO glue(op_iwmmxt_unpack, glue(S, ub_M0))(void)      \
                    261: {                                                              \
                    262:     M0 =                                                       \
                    263:         (((M0 >> SH0) & 0xff) << 0) |                          \
                    264:         (((M0 >> SH1) & 0xff) << 16) |                         \
                    265:         (((M0 >> SH2) & 0xff) << 32) |                         \
                    266:         (((M0 >> SH3) & 0xff) << 48);                          \
                    267:     env->iwmmxt.cregs[ARM_IWMMXT_wCASF] =                      \
                    268:         NZBIT16(M0 >> 0, 0) | NZBIT16(M0 >> 16, 1) |           \
                    269:         NZBIT16(M0 >> 32, 2) | NZBIT16(M0 >> 48, 3);           \
                    270: }                                                              \
                    271: void OPPROTO glue(op_iwmmxt_unpack, glue(S, uw_M0))(void)      \
                    272: {                                                              \
                    273:     M0 =                                                       \
                    274:         (((M0 >> SH0) & 0xffff) << 0) |                                \
                    275:         (((M0 >> SH2) & 0xffff) << 32);                                \
                    276:     env->iwmmxt.cregs[ARM_IWMMXT_wCASF] =                      \
                    277:         NZBIT32(M0 >> 0, 0) | NZBIT32(M0 >> 32, 1);            \
                    278: }                                                              \
                    279: void OPPROTO glue(op_iwmmxt_unpack, glue(S, ul_M0))(void)      \
                    280: {                                                              \
                    281:     M0 = (((M0 >> SH0) & 0xffffffff) << 0);                    \
                    282:     env->iwmmxt.cregs[ARM_IWMMXT_wCASF] = NZBIT64(M0 >> 0);    \
                    283: }                                                              \
                    284: void OPPROTO glue(op_iwmmxt_unpack, glue(S, sb_M0))(void)      \
                    285: {                                                              \
                    286:     M0 =                                                       \
                    287:         ((uint64_t) EXTEND8H((M0 >> SH0) & 0xff) << 0) |       \
                    288:         ((uint64_t) EXTEND8H((M0 >> SH1) & 0xff) << 16) |      \
                    289:         ((uint64_t) EXTEND8H((M0 >> SH2) & 0xff) << 32) |      \
                    290:         ((uint64_t) EXTEND8H((M0 >> SH3) & 0xff) << 48);       \
                    291:     env->iwmmxt.cregs[ARM_IWMMXT_wCASF] =                      \
                    292:         NZBIT16(M0 >> 0, 0) | NZBIT16(M0 >> 16, 1) |           \
                    293:         NZBIT16(M0 >> 32, 2) | NZBIT16(M0 >> 48, 3);           \
                    294: }                                                              \
                    295: void OPPROTO glue(op_iwmmxt_unpack, glue(S, sw_M0))(void)      \
                    296: {                                                              \
                    297:     M0 =                                                       \
                    298:         ((uint64_t) EXTEND16((M0 >> SH0) & 0xffff) << 0) |     \
                    299:         ((uint64_t) EXTEND16((M0 >> SH2) & 0xffff) << 32);     \
                    300:     env->iwmmxt.cregs[ARM_IWMMXT_wCASF] =                      \
                    301:         NZBIT32(M0 >> 0, 0) | NZBIT32(M0 >> 32, 1);            \
                    302: }                                                              \
                    303: void OPPROTO glue(op_iwmmxt_unpack, glue(S, sl_M0))(void)      \
                    304: {                                                              \
                    305:     M0 = EXTEND32((M0 >> SH0) & 0xffffffff);                   \
                    306:     env->iwmmxt.cregs[ARM_IWMMXT_wCASF] = NZBIT64(M0 >> 0);    \
                    307: }
                    308: IWMMXT_OP_UNPACK(l, 0, 8, 16, 24)
                    309: IWMMXT_OP_UNPACK(h, 32, 40, 48, 56)
                    310: 
                    311: #define IWMMXT_OP_CMP(SUFF, Tb, Tw, Tl, O)                             \
                    312: void OPPROTO glue(op_iwmmxt_, glue(SUFF, b_M0_wRn))(void)      \
                    313: {                                                              \
                    314:     M0 =                                                       \
                    315:         CMP(0, Tb, O, 0xff) | CMP(8, Tb, O, 0xff) |            \
                    316:         CMP(16, Tb, O, 0xff) | CMP(24, Tb, O, 0xff) |          \
                    317:         CMP(32, Tb, O, 0xff) | CMP(40, Tb, O, 0xff) |          \
                    318:         CMP(48, Tb, O, 0xff) | CMP(56, Tb, O, 0xff);           \
                    319:     env->iwmmxt.cregs[ARM_IWMMXT_wCASF] =                      \
                    320:         NZBIT8(M0 >> 0, 0) | NZBIT8(M0 >> 8, 1) |              \
                    321:         NZBIT8(M0 >> 16, 2) | NZBIT8(M0 >> 24, 3) |            \
                    322:         NZBIT8(M0 >> 32, 4) | NZBIT8(M0 >> 40, 5) |            \
                    323:         NZBIT8(M0 >> 48, 6) | NZBIT8(M0 >> 56, 7);             \
                    324: }                                                              \
                    325: void OPPROTO glue(op_iwmmxt_, glue(SUFF, w_M0_wRn))(void)      \
                    326: {                                                              \
                    327:     M0 = CMP(0, Tw, O, 0xffff) | CMP(16, Tw, O, 0xffff) |      \
                    328:         CMP(32, Tw, O, 0xffff) | CMP(48, Tw, O, 0xffff);       \
                    329:     env->iwmmxt.cregs[ARM_IWMMXT_wCASF] =                      \
                    330:         NZBIT16(M0 >> 0, 0) | NZBIT16(M0 >> 16, 1) |           \
                    331:         NZBIT16(M0 >> 32, 2) | NZBIT16(M0 >> 48, 3);           \
                    332: }                                                              \
                    333: void OPPROTO glue(op_iwmmxt_, glue(SUFF, l_M0_wRn))(void)      \
                    334: {                                                              \
                    335:     M0 = CMP(0, Tl, O, 0xffffffff) |                           \
                    336:         CMP(32, Tl, O, 0xffffffff);                            \
                    337:     env->iwmmxt.cregs[ARM_IWMMXT_wCASF] =                      \
                    338:         NZBIT32(M0 >> 0, 0) | NZBIT32(M0 >> 32, 1);            \
                    339: }
                    340: #define CMP(SHR, TYPE, OPER, MASK) ((((TYPE) ((M0 >> SHR) & MASK) OPER \
                    341:             (TYPE) ((M1 >> SHR) & MASK)) ? (uint64_t) MASK : 0) << SHR)
                    342: IWMMXT_OP_CMP(cmpeq, uint8_t, uint16_t, uint32_t, ==)
                    343: IWMMXT_OP_CMP(cmpgts, int8_t, int16_t, int32_t, >)
                    344: IWMMXT_OP_CMP(cmpgtu, uint8_t, uint16_t, uint32_t, >)
                    345: #undef CMP
                    346: #define CMP(SHR, TYPE, OPER, MASK) ((((TYPE) ((M0 >> SHR) & MASK) OPER \
                    347:             (TYPE) ((M1 >> SHR) & MASK)) ? M0 : M1) & ((uint64_t) MASK << SHR))
                    348: IWMMXT_OP_CMP(mins, int8_t, int16_t, int32_t, <)
                    349: IWMMXT_OP_CMP(minu, uint8_t, uint16_t, uint32_t, <)
                    350: IWMMXT_OP_CMP(maxs, int8_t, int16_t, int32_t, >)
                    351: IWMMXT_OP_CMP(maxu, uint8_t, uint16_t, uint32_t, >)
                    352: #undef CMP
                    353: #define CMP(SHR, TYPE, OPER, MASK) ((uint64_t) (((TYPE) ((M0 >> SHR) & MASK) \
                    354:             OPER (TYPE) ((M1 >> SHR) & MASK)) & MASK) << SHR)
                    355: IWMMXT_OP_CMP(subn, uint8_t, uint16_t, uint32_t, -)
                    356: IWMMXT_OP_CMP(addn, uint8_t, uint16_t, uint32_t, +)
                    357: #undef CMP
                    358: /* TODO Signed- and Unsigned-Saturation */
                    359: #define CMP(SHR, TYPE, OPER, MASK) ((uint64_t) (((TYPE) ((M0 >> SHR) & MASK) \
                    360:             OPER (TYPE) ((M1 >> SHR) & MASK)) & MASK) << SHR)
                    361: IWMMXT_OP_CMP(subu, uint8_t, uint16_t, uint32_t, -)
                    362: IWMMXT_OP_CMP(addu, uint8_t, uint16_t, uint32_t, +)
                    363: IWMMXT_OP_CMP(subs, int8_t, int16_t, int32_t, -)
                    364: IWMMXT_OP_CMP(adds, int8_t, int16_t, int32_t, +)
                    365: #undef CMP
                    366: #undef IWMMXT_OP_CMP
                    367: 
                    368: void OPPROTO op_iwmmxt_avgb_M0_wRn(void)
                    369: {
                    370: #define AVGB(SHR) ((( \
                    371:         ((M0 >> SHR) & 0xff) + ((M1 >> SHR) & 0xff) + PARAM2) >> 1) << SHR)
                    372:     M0 =
                    373:         AVGB(0) | AVGB(8) | AVGB(16) | AVGB(24) |
                    374:         AVGB(32) | AVGB(40) | AVGB(48) | AVGB(56);
                    375:     env->iwmmxt.cregs[ARM_IWMMXT_wCASF] =
                    376:         SIMD8_SET(ZBIT8((M0 >> 0) & 0xff), SIMD_ZBIT, 0) |
                    377:         SIMD8_SET(ZBIT8((M0 >> 8) & 0xff), SIMD_ZBIT, 1) |
                    378:         SIMD8_SET(ZBIT8((M0 >> 16) & 0xff), SIMD_ZBIT, 2) |
                    379:         SIMD8_SET(ZBIT8((M0 >> 24) & 0xff), SIMD_ZBIT, 3) |
                    380:         SIMD8_SET(ZBIT8((M0 >> 32) & 0xff), SIMD_ZBIT, 4) |
                    381:         SIMD8_SET(ZBIT8((M0 >> 40) & 0xff), SIMD_ZBIT, 5) |
                    382:         SIMD8_SET(ZBIT8((M0 >> 48) & 0xff), SIMD_ZBIT, 6) |
                    383:         SIMD8_SET(ZBIT8((M0 >> 56) & 0xff), SIMD_ZBIT, 7);
                    384: #undef AVGB
                    385: }
                    386: 
                    387: void OPPROTO op_iwmmxt_avgw_M0_wRn(void)
                    388: {
                    389: #define AVGW(SHR) ((( \
                    390:         ((M0 >> SHR) & 0xffff) + ((M1 >> SHR) & 0xffff) + PARAM2) >> 1) << SHR)
                    391:     M0 = AVGW(0) | AVGW(16) | AVGW(32) | AVGW(48);
                    392:     env->iwmmxt.cregs[ARM_IWMMXT_wCASF] =
                    393:         SIMD16_SET(ZBIT16((M0 >> 0) & 0xffff), SIMD_ZBIT, 0) |
                    394:         SIMD16_SET(ZBIT16((M0 >> 16) & 0xffff), SIMD_ZBIT, 1) |
                    395:         SIMD16_SET(ZBIT16((M0 >> 32) & 0xffff), SIMD_ZBIT, 2) |
                    396:         SIMD16_SET(ZBIT16((M0 >> 48) & 0xffff), SIMD_ZBIT, 3);
                    397: #undef AVGW
                    398: }
                    399: 
                    400: void OPPROTO op_iwmmxt_msadb_M0_wRn(void)
                    401: {
                    402:     M0 = ((((M0 >> 0) & 0xffff) * ((M1 >> 0) & 0xffff) +
                    403:            ((M0 >> 16) & 0xffff) * ((M1 >> 16) & 0xffff)) & 0xffffffff) |
                    404:          ((((M0 >> 32) & 0xffff) * ((M1 >> 32) & 0xffff) +
                    405:            ((M0 >> 48) & 0xffff) * ((M1 >> 48) & 0xffff)) << 32);
                    406: }
                    407: 
                    408: void OPPROTO op_iwmmxt_align_M0_T0_wRn(void)
                    409: {
                    410:     M0 >>= T0 << 3;
                    411:     M0 |= M1 << (64 - (T0 << 3));
                    412: }
                    413: 
                    414: void OPPROTO op_iwmmxt_insr_M0_T0_T1(void)
                    415: {
                    416:     M0 &= ~((uint64_t) T1 << PARAM1);
                    417:     M0 |= (uint64_t) (T0 & T1) << PARAM1;
                    418: }
                    419: 
                    420: void OPPROTO op_iwmmxt_extrsb_T0_M0(void)
                    421: {
                    422:     T0 = EXTEND8((M0 >> PARAM1) & 0xff);
                    423: }
                    424: 
                    425: void OPPROTO op_iwmmxt_extrsw_T0_M0(void)
                    426: {
                    427:     T0 = EXTEND16((M0 >> PARAM1) & 0xffff);
                    428: }
                    429: 
                    430: void OPPROTO op_iwmmxt_extru_T0_M0_T1(void)
                    431: {
                    432:     T0 = (M0 >> PARAM1) & T1;
                    433: }
                    434: 
                    435: void OPPROTO op_iwmmxt_bcstb_M0_T0(void)
                    436: {
                    437:     T0 &= 0xff;
                    438:     M0 =
                    439:         ((uint64_t) T0 << 0) | ((uint64_t) T0 << 8) |
                    440:         ((uint64_t) T0 << 16) | ((uint64_t) T0 << 24) |
                    441:         ((uint64_t) T0 << 32) | ((uint64_t) T0 << 40) |
                    442:         ((uint64_t) T0 << 48) | ((uint64_t) T0 << 56);
                    443: }
                    444: 
                    445: void OPPROTO op_iwmmxt_bcstw_M0_T0(void)
                    446: {
                    447:     T0 &= 0xffff;
                    448:     M0 =
                    449:         ((uint64_t) T0 << 0) | ((uint64_t) T0 << 16) |
                    450:         ((uint64_t) T0 << 32) | ((uint64_t) T0 << 48);
                    451: }
                    452: 
                    453: void OPPROTO op_iwmmxt_bcstl_M0_T0(void)
                    454: {
                    455:     M0 = ((uint64_t) T0 << 0) | ((uint64_t) T0 << 32);
                    456: }
                    457: 
                    458: void OPPROTO op_iwmmxt_addcb_M0(void)
                    459: {
                    460:     M0 =
                    461:         ((M0 >> 0) & 0xff) + ((M0 >> 8) & 0xff) +
                    462:         ((M0 >> 16) & 0xff) + ((M0 >> 24) & 0xff) +
                    463:         ((M0 >> 32) & 0xff) + ((M0 >> 40) & 0xff) +
                    464:         ((M0 >> 48) & 0xff) + ((M0 >> 56) & 0xff);
                    465: }
                    466: 
                    467: void OPPROTO op_iwmmxt_addcw_M0(void)
                    468: {
                    469:     M0 =
                    470:         ((M0 >> 0) & 0xffff) + ((M0 >> 16) & 0xffff) +
                    471:         ((M0 >> 32) & 0xffff) + ((M0 >> 48) & 0xffff);
                    472: }
                    473: 
                    474: void OPPROTO op_iwmmxt_addcl_M0(void)
                    475: {
                    476:     M0 = (M0 & 0xffffffff) + (M0 >> 32);
                    477: }
                    478: 
                    479: void OPPROTO op_iwmmxt_msbb_T0_M0(void)
                    480: {
                    481:     T0 =
                    482:         ((M0 >> 7) & 0x01) | ((M0 >> 14) & 0x02) |
                    483:         ((M0 >> 21) & 0x04) | ((M0 >> 28) & 0x08) |
                    484:         ((M0 >> 35) & 0x10) | ((M0 >> 42) & 0x20) |
                    485:         ((M0 >> 49) & 0x40) | ((M0 >> 56) & 0x80);
                    486: }
                    487: 
                    488: void OPPROTO op_iwmmxt_msbw_T0_M0(void)
                    489: {
                    490:     T0 =
                    491:         ((M0 >> 15) & 0x01) | ((M0 >> 30) & 0x02) |
                    492:         ((M0 >> 45) & 0x04) | ((M0 >> 52) & 0x08);
                    493: }
                    494: 
                    495: void OPPROTO op_iwmmxt_msbl_T0_M0(void)
                    496: {
                    497:     T0 = ((M0 >> 31) & 0x01) | ((M0 >> 62) & 0x02);
                    498: }
                    499: 
                    500: void OPPROTO op_iwmmxt_srlw_M0_T0(void)
                    501: {
                    502:     M0 =
                    503:         (((M0 & (0xffffll << 0)) >> T0) & (0xffffll << 0)) |
                    504:         (((M0 & (0xffffll << 16)) >> T0) & (0xffffll << 16)) |
                    505:         (((M0 & (0xffffll << 32)) >> T0) & (0xffffll << 32)) |
                    506:         (((M0 & (0xffffll << 48)) >> T0) & (0xffffll << 48));
                    507:     env->iwmmxt.cregs[ARM_IWMMXT_wCASF] =
                    508:         NZBIT16(M0 >> 0, 0) | NZBIT16(M0 >> 16, 1) |
                    509:         NZBIT16(M0 >> 32, 2) | NZBIT16(M0 >> 48, 3);
                    510: }
                    511: 
                    512: void OPPROTO op_iwmmxt_srll_M0_T0(void)
                    513: {
                    514:     M0 =
                    515:         ((M0 & (0xffffffffll << 0)) >> T0) |
                    516:         ((M0 >> T0) & (0xffffffffll << 32));
                    517:     env->iwmmxt.cregs[ARM_IWMMXT_wCASF] =
                    518:         NZBIT32(M0 >> 0, 0) | NZBIT32(M0 >> 32, 1);
                    519: }
                    520: 
                    521: void OPPROTO op_iwmmxt_srlq_M0_T0(void)
                    522: {
                    523:     M0 >>= T0;
                    524:     env->iwmmxt.cregs[ARM_IWMMXT_wCASF] = NZBIT64(M0);
                    525: }
                    526: 
                    527: void OPPROTO op_iwmmxt_sllw_M0_T0(void)
                    528: {
                    529:     M0 =
                    530:         (((M0 & (0xffffll << 0)) << T0) & (0xffffll << 0)) |
                    531:         (((M0 & (0xffffll << 16)) << T0) & (0xffffll << 16)) |
                    532:         (((M0 & (0xffffll << 32)) << T0) & (0xffffll << 32)) |
                    533:         (((M0 & (0xffffll << 48)) << T0) & (0xffffll << 48));
                    534:     env->iwmmxt.cregs[ARM_IWMMXT_wCASF] =
                    535:         NZBIT16(M0 >> 0, 0) | NZBIT16(M0 >> 16, 1) |
                    536:         NZBIT16(M0 >> 32, 2) | NZBIT16(M0 >> 48, 3);
                    537: }
                    538: 
                    539: void OPPROTO op_iwmmxt_slll_M0_T0(void)
                    540: {
                    541:     M0 =
                    542:         ((M0 << T0) & (0xffffffffll << 0)) |
                    543:         ((M0 & (0xffffffffll << 32)) << T0);
                    544:     env->iwmmxt.cregs[ARM_IWMMXT_wCASF] =
                    545:         NZBIT32(M0 >> 0, 0) | NZBIT32(M0 >> 32, 1);
                    546: }
                    547: 
                    548: void OPPROTO op_iwmmxt_sllq_M0_T0(void)
                    549: {
                    550:     M0 <<= T0;
                    551:     env->iwmmxt.cregs[ARM_IWMMXT_wCASF] = NZBIT64(M0);
                    552: }
                    553: 
                    554: void OPPROTO op_iwmmxt_sraw_M0_T0(void)
                    555: {
                    556:     M0 =
                    557:         ((uint64_t) ((EXTEND16(M0 >> 0) >> T0) & 0xffff) << 0) |
                    558:         ((uint64_t) ((EXTEND16(M0 >> 16) >> T0) & 0xffff) << 16) |
                    559:         ((uint64_t) ((EXTEND16(M0 >> 32) >> T0) & 0xffff) << 32) |
                    560:         ((uint64_t) ((EXTEND16(M0 >> 48) >> T0) & 0xffff) << 48);
                    561:     env->iwmmxt.cregs[ARM_IWMMXT_wCASF] =
                    562:         NZBIT16(M0 >> 0, 0) | NZBIT16(M0 >> 16, 1) |
                    563:         NZBIT16(M0 >> 32, 2) | NZBIT16(M0 >> 48, 3);
                    564: }
                    565: 
                    566: void OPPROTO op_iwmmxt_sral_M0_T0(void)
                    567: {
                    568:     M0 =
                    569:         (((EXTEND32(M0 >> 0) >> T0) & 0xffffffff) << 0) |
                    570:         (((EXTEND32(M0 >> 32) >> T0) & 0xffffffff) << 32);
                    571:     env->iwmmxt.cregs[ARM_IWMMXT_wCASF] =
                    572:         NZBIT32(M0 >> 0, 0) | NZBIT32(M0 >> 32, 1);
                    573: }
                    574: 
                    575: void OPPROTO op_iwmmxt_sraq_M0_T0(void)
                    576: {
                    577:     M0 = (int64_t) M0 >> T0;
                    578:     env->iwmmxt.cregs[ARM_IWMMXT_wCASF] = NZBIT64(M0);
                    579: }
                    580: 
                    581: void OPPROTO op_iwmmxt_rorw_M0_T0(void)
                    582: {
                    583:     M0 =
                    584:         ((((M0 & (0xffffll << 0)) >> T0) |
                    585:           ((M0 & (0xffffll << 0)) << (16 - T0))) & (0xffffll << 0)) |
                    586:         ((((M0 & (0xffffll << 16)) >> T0) |
                    587:           ((M0 & (0xffffll << 16)) << (16 - T0))) & (0xffffll << 16)) |
                    588:         ((((M0 & (0xffffll << 32)) >> T0) |
                    589:           ((M0 & (0xffffll << 32)) << (16 - T0))) & (0xffffll << 32)) |
                    590:         ((((M0 & (0xffffll << 48)) >> T0) |
                    591:           ((M0 & (0xffffll << 48)) << (16 - T0))) & (0xffffll << 48));
                    592:     env->iwmmxt.cregs[ARM_IWMMXT_wCASF] =
                    593:         NZBIT16(M0 >> 0, 0) | NZBIT16(M0 >> 16, 1) |
                    594:         NZBIT16(M0 >> 32, 2) | NZBIT16(M0 >> 48, 3);
                    595: }
                    596: 
                    597: void OPPROTO op_iwmmxt_rorl_M0_T0(void)
                    598: {
                    599:     M0 =
                    600:         ((M0 & (0xffffffffll << 0)) >> T0) |
                    601:         ((M0 >> T0) & (0xffffffffll << 32)) |
                    602:         ((M0 << (32 - T0)) & (0xffffffffll << 0)) |
                    603:         ((M0 & (0xffffffffll << 32)) << (32 - T0));
                    604:     env->iwmmxt.cregs[ARM_IWMMXT_wCASF] =
                    605:         NZBIT32(M0 >> 0, 0) | NZBIT32(M0 >> 32, 1);
                    606: }
                    607: 
                    608: void OPPROTO op_iwmmxt_rorq_M0_T0(void)
                    609: {
                    610:     M0 = (M0 >> T0) | (M0 << (64 - T0));
                    611:     env->iwmmxt.cregs[ARM_IWMMXT_wCASF] = NZBIT64(M0);
                    612: }
                    613: 
                    614: void OPPROTO op_iwmmxt_shufh_M0_T0(void)
                    615: {
                    616:     M0 =
                    617:         (((M0 >> ((T0 << 4) & 0x30)) & 0xffff) << 0) |
                    618:         (((M0 >> ((T0 << 2) & 0x30)) & 0xffff) << 16) |
                    619:         (((M0 >> ((T0 << 0) & 0x30)) & 0xffff) << 32) |
                    620:         (((M0 >> ((T0 >> 2) & 0x30)) & 0xffff) << 48);
                    621:     env->iwmmxt.cregs[ARM_IWMMXT_wCASF] =
                    622:         NZBIT16(M0 >> 0, 0) | NZBIT16(M0 >> 16, 1) |
                    623:         NZBIT16(M0 >> 32, 2) | NZBIT16(M0 >> 48, 3);
                    624: }
                    625: 
                    626: /* TODO: Unsigned-Saturation */
                    627: void OPPROTO op_iwmmxt_packuw_M0_wRn(void)
                    628: {
                    629:     M0 =
                    630:         (((M0 >> 0) & 0xff) << 0) | (((M0 >> 16) & 0xff) << 8) |
                    631:         (((M0 >> 32) & 0xff) << 16) | (((M0 >> 48) & 0xff) << 24) |
                    632:         (((M1 >> 0) & 0xff) << 32) | (((M1 >> 16) & 0xff) << 40) |
                    633:         (((M1 >> 32) & 0xff) << 48) | (((M1 >> 48) & 0xff) << 56);
                    634:     env->iwmmxt.cregs[ARM_IWMMXT_wCASF] =
                    635:         NZBIT8(M0 >> 0, 0) | NZBIT8(M0 >> 8, 1) |
                    636:         NZBIT8(M0 >> 16, 2) | NZBIT8(M0 >> 24, 3) |
                    637:         NZBIT8(M0 >> 32, 4) | NZBIT8(M0 >> 40, 5) |
                    638:         NZBIT8(M0 >> 48, 6) | NZBIT8(M0 >> 56, 7);
                    639: }
                    640: 
                    641: void OPPROTO op_iwmmxt_packul_M0_wRn(void)
                    642: {
                    643:     M0 =
                    644:         (((M0 >> 0) & 0xffff) << 0) | (((M0 >> 32) & 0xffff) << 16) |
                    645:         (((M1 >> 0) & 0xffff) << 32) | (((M1 >> 32) & 0xffff) << 48);
                    646:     env->iwmmxt.cregs[ARM_IWMMXT_wCASF] =
                    647:         NZBIT16(M0 >> 0, 0) | NZBIT16(M0 >> 16, 1) |
                    648:         NZBIT16(M0 >> 32, 2) | NZBIT16(M0 >> 48, 3);
                    649: }
                    650: 
                    651: void OPPROTO op_iwmmxt_packuq_M0_wRn(void)
                    652: {
                    653:     M0 = (M0 & 0xffffffff) | ((M1 & 0xffffffff) << 32);
                    654:     env->iwmmxt.cregs[ARM_IWMMXT_wCASF] =
                    655:         NZBIT32(M0 >> 0, 0) | NZBIT32(M0 >> 32, 1);
                    656: }
                    657: 
                    658: /* TODO: Signed-Saturation */
                    659: void OPPROTO op_iwmmxt_packsw_M0_wRn(void)
                    660: {
                    661:     M0 =
                    662:         (((M0 >> 0) & 0xff) << 0) | (((M0 >> 16) & 0xff) << 8) |
                    663:         (((M0 >> 32) & 0xff) << 16) | (((M0 >> 48) & 0xff) << 24) |
                    664:         (((M1 >> 0) & 0xff) << 32) | (((M1 >> 16) & 0xff) << 40) |
                    665:         (((M1 >> 32) & 0xff) << 48) | (((M1 >> 48) & 0xff) << 56);
                    666:     env->iwmmxt.cregs[ARM_IWMMXT_wCASF] =
                    667:         NZBIT8(M0 >> 0, 0) | NZBIT8(M0 >> 8, 1) |
                    668:         NZBIT8(M0 >> 16, 2) | NZBIT8(M0 >> 24, 3) |
                    669:         NZBIT8(M0 >> 32, 4) | NZBIT8(M0 >> 40, 5) |
                    670:         NZBIT8(M0 >> 48, 6) | NZBIT8(M0 >> 56, 7);
                    671: }
                    672: 
                    673: void OPPROTO op_iwmmxt_packsl_M0_wRn(void)
                    674: {
                    675:     M0 =
                    676:         (((M0 >> 0) & 0xffff) << 0) | (((M0 >> 32) & 0xffff) << 16) |
                    677:         (((M1 >> 0) & 0xffff) << 32) | (((M1 >> 32) & 0xffff) << 48);
                    678:     env->iwmmxt.cregs[ARM_IWMMXT_wCASF] =
                    679:         NZBIT16(M0 >> 0, 0) | NZBIT16(M0 >> 16, 1) |
                    680:         NZBIT16(M0 >> 32, 2) | NZBIT16(M0 >> 48, 3);
                    681: }
                    682: 
                    683: void OPPROTO op_iwmmxt_packsq_M0_wRn(void)
                    684: {
                    685:     M0 = (M0 & 0xffffffff) | ((M1 & 0xffffffff) << 32);
                    686:     env->iwmmxt.cregs[ARM_IWMMXT_wCASF] =
                    687:         NZBIT32(M0 >> 0, 0) | NZBIT32(M0 >> 32, 1);
                    688: }
                    689: 
                    690: void OPPROTO op_iwmmxt_muladdsl_M0_T0_T1(void)
                    691: {
                    692:     M0 += (int32_t) EXTEND32(T0) * (int32_t) EXTEND32(T1);
                    693: }
                    694: 
                    695: void OPPROTO op_iwmmxt_muladdsw_M0_T0_T1(void)
                    696: {
                    697:     M0 += EXTEND32(EXTEND16S((T0 >> 0) & 0xffff) *
                    698:                    EXTEND16S((T1 >> 0) & 0xffff));
                    699:     M0 += EXTEND32(EXTEND16S((T0 >> 16) & 0xffff) *
                    700:                    EXTEND16S((T1 >> 16) & 0xffff));
                    701: }
                    702: 
                    703: void OPPROTO op_iwmmxt_muladdswl_M0_T0_T1(void)
                    704: {
                    705:     M0 += EXTEND32(EXTEND16S(T0 & 0xffff) *
                    706:                    EXTEND16S(T1 & 0xffff));
                    707: }

unix.superglobalmegacorp.com

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