|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.