|
|
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.