Commit e677137d996983b614c6612e9c09cb7742169045
1 parent
ad69471c
ARM TCG conversion 15/16.
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@4152 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
8 changed files
with
1124 additions
and
812 deletions
Makefile.target
... | ... | @@ -211,7 +211,7 @@ LIBOBJS+= op_helper.o helper.o |
211 | 211 | endif |
212 | 212 | |
213 | 213 | ifeq ($(TARGET_BASE_ARCH), arm) |
214 | -LIBOBJS+= op_helper.o helper.o neon_helper.o | |
214 | +LIBOBJS+= op_helper.o helper.o neon_helper.o iwmmxt_helper.o | |
215 | 215 | endif |
216 | 216 | |
217 | 217 | ifeq ($(TARGET_BASE_ARCH), sh4) | ... | ... |
target-arm/helpers.h
... | ... | @@ -431,6 +431,103 @@ DEF_HELPER_1_2(neon_cgt_f32, uint32_t, (uint32_t, uint32_t)) |
431 | 431 | DEF_HELPER_1_2(neon_acge_f32, uint32_t, (uint32_t, uint32_t)) |
432 | 432 | DEF_HELPER_1_2(neon_acgt_f32, uint32_t, (uint32_t, uint32_t)) |
433 | 433 | |
434 | +/* iwmmxt_helper.c */ | |
435 | +DEF_HELPER_1_2(iwmmxt_maddsq, uint64_t, (uint64_t, uint64_t)) | |
436 | +DEF_HELPER_1_2(iwmmxt_madduq, uint64_t, (uint64_t, uint64_t)) | |
437 | +DEF_HELPER_1_2(iwmmxt_sadb, uint64_t, (uint64_t, uint64_t)) | |
438 | +DEF_HELPER_1_2(iwmmxt_sadw, uint64_t, (uint64_t, uint64_t)) | |
439 | +DEF_HELPER_1_2(iwmmxt_mulslw, uint64_t, (uint64_t, uint64_t)) | |
440 | +DEF_HELPER_1_2(iwmmxt_mulshw, uint64_t, (uint64_t, uint64_t)) | |
441 | +DEF_HELPER_1_2(iwmmxt_mululw, uint64_t, (uint64_t, uint64_t)) | |
442 | +DEF_HELPER_1_2(iwmmxt_muluhw, uint64_t, (uint64_t, uint64_t)) | |
443 | +DEF_HELPER_1_2(iwmmxt_macsw, uint64_t, (uint64_t, uint64_t)) | |
444 | +DEF_HELPER_1_2(iwmmxt_macuw, uint64_t, (uint64_t, uint64_t)) | |
445 | +DEF_HELPER_1_1(iwmmxt_setpsr_nz, uint32_t, (uint64_t)) | |
446 | + | |
447 | +#define DEF_IWMMXT_HELPER_SIZE_ENV(name) \ | |
448 | +DEF_HELPER_1_3(iwmmxt_##name##b, uint64_t, (CPUState *, uint64_t, uint64_t)) \ | |
449 | +DEF_HELPER_1_3(iwmmxt_##name##w, uint64_t, (CPUState *, uint64_t, uint64_t)) \ | |
450 | +DEF_HELPER_1_3(iwmmxt_##name##l, uint64_t, (CPUState *, uint64_t, uint64_t)) \ | |
451 | + | |
452 | +DEF_IWMMXT_HELPER_SIZE_ENV(unpackl) | |
453 | +DEF_IWMMXT_HELPER_SIZE_ENV(unpackh) | |
454 | + | |
455 | +DEF_HELPER_1_2(iwmmxt_unpacklub, uint64_t, (CPUState *, uint64_t)) | |
456 | +DEF_HELPER_1_2(iwmmxt_unpackluw, uint64_t, (CPUState *, uint64_t)) | |
457 | +DEF_HELPER_1_2(iwmmxt_unpacklul, uint64_t, (CPUState *, uint64_t)) | |
458 | +DEF_HELPER_1_2(iwmmxt_unpackhub, uint64_t, (CPUState *, uint64_t)) | |
459 | +DEF_HELPER_1_2(iwmmxt_unpackhuw, uint64_t, (CPUState *, uint64_t)) | |
460 | +DEF_HELPER_1_2(iwmmxt_unpackhul, uint64_t, (CPUState *, uint64_t)) | |
461 | +DEF_HELPER_1_2(iwmmxt_unpacklsb, uint64_t, (CPUState *, uint64_t)) | |
462 | +DEF_HELPER_1_2(iwmmxt_unpacklsw, uint64_t, (CPUState *, uint64_t)) | |
463 | +DEF_HELPER_1_2(iwmmxt_unpacklsl, uint64_t, (CPUState *, uint64_t)) | |
464 | +DEF_HELPER_1_2(iwmmxt_unpackhsb, uint64_t, (CPUState *, uint64_t)) | |
465 | +DEF_HELPER_1_2(iwmmxt_unpackhsw, uint64_t, (CPUState *, uint64_t)) | |
466 | +DEF_HELPER_1_2(iwmmxt_unpackhsl, uint64_t, (CPUState *, uint64_t)) | |
467 | + | |
468 | +DEF_IWMMXT_HELPER_SIZE_ENV(cmpeq) | |
469 | +DEF_IWMMXT_HELPER_SIZE_ENV(cmpgtu) | |
470 | +DEF_IWMMXT_HELPER_SIZE_ENV(cmpgts) | |
471 | + | |
472 | +DEF_IWMMXT_HELPER_SIZE_ENV(mins) | |
473 | +DEF_IWMMXT_HELPER_SIZE_ENV(minu) | |
474 | +DEF_IWMMXT_HELPER_SIZE_ENV(maxs) | |
475 | +DEF_IWMMXT_HELPER_SIZE_ENV(maxu) | |
476 | + | |
477 | +DEF_IWMMXT_HELPER_SIZE_ENV(subn) | |
478 | +DEF_IWMMXT_HELPER_SIZE_ENV(addn) | |
479 | +DEF_IWMMXT_HELPER_SIZE_ENV(subu) | |
480 | +DEF_IWMMXT_HELPER_SIZE_ENV(addu) | |
481 | +DEF_IWMMXT_HELPER_SIZE_ENV(subs) | |
482 | +DEF_IWMMXT_HELPER_SIZE_ENV(adds) | |
483 | + | |
484 | +DEF_HELPER_1_3(iwmmxt_avgb0, uint64_t, (CPUState *, uint64_t, uint64_t)) | |
485 | +DEF_HELPER_1_3(iwmmxt_avgb1, uint64_t, (CPUState *, uint64_t, uint64_t)) | |
486 | +DEF_HELPER_1_3(iwmmxt_avgw0, uint64_t, (CPUState *, uint64_t, uint64_t)) | |
487 | +DEF_HELPER_1_3(iwmmxt_avgw1, uint64_t, (CPUState *, uint64_t, uint64_t)) | |
488 | + | |
489 | +DEF_HELPER_1_2(iwmmxt_msadb, uint64_t, (uint64_t, uint64_t)) | |
490 | + | |
491 | +DEF_HELPER_1_3(iwmmxt_align, uint64_t, (uint64_t, uint64_t, uint32_t)) | |
492 | +DEF_HELPER_1_4(iwmmxt_insr, uint64_t, (uint64_t, uint32_t, uint32_t, uint32_t)) | |
493 | + | |
494 | +DEF_HELPER_1_1(iwmmxt_bcstb, uint64_t, (uint32_t)) | |
495 | +DEF_HELPER_1_1(iwmmxt_bcstw, uint64_t, (uint32_t)) | |
496 | +DEF_HELPER_1_1(iwmmxt_bcstl, uint64_t, (uint32_t)) | |
497 | + | |
498 | +DEF_HELPER_1_1(iwmmxt_addcb, uint64_t, (uint64_t)) | |
499 | +DEF_HELPER_1_1(iwmmxt_addcw, uint64_t, (uint64_t)) | |
500 | +DEF_HELPER_1_1(iwmmxt_addcl, uint64_t, (uint64_t)) | |
501 | + | |
502 | +DEF_HELPER_1_1(iwmmxt_msbb, uint32_t, (uint64_t)) | |
503 | +DEF_HELPER_1_1(iwmmxt_msbw, uint32_t, (uint64_t)) | |
504 | +DEF_HELPER_1_1(iwmmxt_msbl, uint32_t, (uint64_t)) | |
505 | + | |
506 | +DEF_HELPER_1_3(iwmmxt_srlw, uint64_t, (CPUState *, uint64_t, uint32_t)) | |
507 | +DEF_HELPER_1_3(iwmmxt_srll, uint64_t, (CPUState *, uint64_t, uint32_t)) | |
508 | +DEF_HELPER_1_3(iwmmxt_srlq, uint64_t, (CPUState *, uint64_t, uint32_t)) | |
509 | +DEF_HELPER_1_3(iwmmxt_sllw, uint64_t, (CPUState *, uint64_t, uint32_t)) | |
510 | +DEF_HELPER_1_3(iwmmxt_slll, uint64_t, (CPUState *, uint64_t, uint32_t)) | |
511 | +DEF_HELPER_1_3(iwmmxt_sllq, uint64_t, (CPUState *, uint64_t, uint32_t)) | |
512 | +DEF_HELPER_1_3(iwmmxt_sraw, uint64_t, (CPUState *, uint64_t, uint32_t)) | |
513 | +DEF_HELPER_1_3(iwmmxt_sral, uint64_t, (CPUState *, uint64_t, uint32_t)) | |
514 | +DEF_HELPER_1_3(iwmmxt_sraq, uint64_t, (CPUState *, uint64_t, uint32_t)) | |
515 | +DEF_HELPER_1_3(iwmmxt_rorw, uint64_t, (CPUState *, uint64_t, uint32_t)) | |
516 | +DEF_HELPER_1_3(iwmmxt_rorl, uint64_t, (CPUState *, uint64_t, uint32_t)) | |
517 | +DEF_HELPER_1_3(iwmmxt_rorq, uint64_t, (CPUState *, uint64_t, uint32_t)) | |
518 | +DEF_HELPER_1_3(iwmmxt_shufh, uint64_t, (CPUState *, uint64_t, uint32_t)) | |
519 | + | |
520 | +DEF_HELPER_1_3(iwmmxt_packuw, uint64_t, (CPUState *, uint64_t, uint64_t)) | |
521 | +DEF_HELPER_1_3(iwmmxt_packul, uint64_t, (CPUState *, uint64_t, uint64_t)) | |
522 | +DEF_HELPER_1_3(iwmmxt_packuq, uint64_t, (CPUState *, uint64_t, uint64_t)) | |
523 | +DEF_HELPER_1_3(iwmmxt_packsw, uint64_t, (CPUState *, uint64_t, uint64_t)) | |
524 | +DEF_HELPER_1_3(iwmmxt_packsl, uint64_t, (CPUState *, uint64_t, uint64_t)) | |
525 | +DEF_HELPER_1_3(iwmmxt_packsq, uint64_t, (CPUState *, uint64_t, uint64_t)) | |
526 | + | |
527 | +DEF_HELPER_1_3(iwmmxt_muladdsl, uint64_t, (uint64_t, uint32_t, uint32_t)) | |
528 | +DEF_HELPER_1_3(iwmmxt_muladdsw, uint64_t, (uint64_t, uint32_t, uint32_t)) | |
529 | +DEF_HELPER_1_3(iwmmxt_muladdswl, uint64_t, (uint64_t, uint32_t, uint32_t)) | |
530 | + | |
434 | 531 | #undef DEF_HELPER |
435 | 532 | #undef DEF_HELPER_0_0 |
436 | 533 | #undef DEF_HELPER_0_1 | ... | ... |
target-arm/iwmmxt_helper.c
0 โ 100644
1 | +/* | |
2 | + * iwMMXt micro operations for XScale. | |
3 | + * | |
4 | + * Copyright (c) 2007 OpenedHand, Ltd. | |
5 | + * Written by Andrzej Zaborowski <andrew@openedhand.com> | |
6 | + * Copyright (c) 2008 CodeSourcery | |
7 | + * | |
8 | + * This library is free software; you can redistribute it and/or | |
9 | + * modify it under the terms of the GNU Lesser General Public | |
10 | + * License as published by the Free Software Foundation; either | |
11 | + * version 2 of the License, or (at your option) any later version. | |
12 | + * | |
13 | + * This library is distributed in the hope that it will be useful, | |
14 | + * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
15 | + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
16 | + * Lesser General Public License for more details. | |
17 | + * | |
18 | + * You should have received a copy of the GNU Lesser General Public | |
19 | + * License along with this library; if not, write to the Free Software | |
20 | + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
21 | + */ | |
22 | + | |
23 | +#include <stdlib.h> | |
24 | +#include <stdio.h> | |
25 | + | |
26 | +#include "cpu.h" | |
27 | +#include "exec-all.h" | |
28 | +#include "helpers.h" | |
29 | + | |
30 | +/* iwMMXt macros extracted from GNU gdb. */ | |
31 | + | |
32 | +/* Set the SIMD wCASF flags for 8, 16, 32 or 64-bit operations. */ | |
33 | +#define SIMD8_SET( v, n, b) ((v != 0) << ((((b) + 1) * 4) + (n))) | |
34 | +#define SIMD16_SET(v, n, h) ((v != 0) << ((((h) + 1) * 8) + (n))) | |
35 | +#define SIMD32_SET(v, n, w) ((v != 0) << ((((w) + 1) * 16) + (n))) | |
36 | +#define SIMD64_SET(v, n) ((v != 0) << (32 + (n))) | |
37 | +/* Flags to pass as "n" above. */ | |
38 | +#define SIMD_NBIT -1 | |
39 | +#define SIMD_ZBIT -2 | |
40 | +#define SIMD_CBIT -3 | |
41 | +#define SIMD_VBIT -4 | |
42 | +/* Various status bit macros. */ | |
43 | +#define NBIT8(x) ((x) & 0x80) | |
44 | +#define NBIT16(x) ((x) & 0x8000) | |
45 | +#define NBIT32(x) ((x) & 0x80000000) | |
46 | +#define NBIT64(x) ((x) & 0x8000000000000000ULL) | |
47 | +#define ZBIT8(x) (((x) & 0xff) == 0) | |
48 | +#define ZBIT16(x) (((x) & 0xffff) == 0) | |
49 | +#define ZBIT32(x) (((x) & 0xffffffff) == 0) | |
50 | +#define ZBIT64(x) (x == 0) | |
51 | +/* Sign extension macros. */ | |
52 | +#define EXTEND8H(a) ((uint16_t) (int8_t) (a)) | |
53 | +#define EXTEND8(a) ((uint32_t) (int8_t) (a)) | |
54 | +#define EXTEND16(a) ((uint32_t) (int16_t) (a)) | |
55 | +#define EXTEND16S(a) ((int32_t) (int16_t) (a)) | |
56 | +#define EXTEND32(a) ((uint64_t) (int32_t) (a)) | |
57 | + | |
58 | +uint64_t HELPER(iwmmxt_maddsq)(uint64_t a, uint64_t b) | |
59 | +{ | |
60 | + a = (( | |
61 | + EXTEND16S((a >> 0) & 0xffff) * EXTEND16S((b >> 0) & 0xffff) + | |
62 | + EXTEND16S((a >> 16) & 0xffff) * EXTEND16S((b >> 16) & 0xffff) | |
63 | + ) & 0xffffffff) | ((uint64_t) ( | |
64 | + EXTEND16S((a >> 32) & 0xffff) * EXTEND16S((b >> 32) & 0xffff) + | |
65 | + EXTEND16S((a >> 48) & 0xffff) * EXTEND16S((b >> 48) & 0xffff) | |
66 | + ) << 32); | |
67 | + return a; | |
68 | +} | |
69 | + | |
70 | +uint64_t HELPER(iwmmxt_madduq)(uint64_t a, uint64_t b) | |
71 | +{ | |
72 | + a = (( | |
73 | + ((a >> 0) & 0xffff) * ((b >> 0) & 0xffff) + | |
74 | + ((a >> 16) & 0xffff) * ((b >> 16) & 0xffff) | |
75 | + ) & 0xffffffff) | (( | |
76 | + ((a >> 32) & 0xffff) * ((b >> 32) & 0xffff) + | |
77 | + ((a >> 48) & 0xffff) * ((b >> 48) & 0xffff) | |
78 | + ) << 32); | |
79 | + return a; | |
80 | +} | |
81 | + | |
82 | +uint64_t HELPER(iwmmxt_sadb)(uint64_t a, uint64_t b) | |
83 | +{ | |
84 | +#define abs(x) (((x) >= 0) ? x : -x) | |
85 | +#define SADB(SHR) abs((int) ((a >> SHR) & 0xff) - (int) ((b >> SHR) & 0xff)) | |
86 | + return | |
87 | + SADB(0) + SADB(8) + SADB(16) + SADB(24) + | |
88 | + SADB(32) + SADB(40) + SADB(48) + SADB(56); | |
89 | +#undef SADB | |
90 | +} | |
91 | + | |
92 | +uint64_t HELPER(iwmmxt_sadw)(uint64_t a, uint64_t b) | |
93 | +{ | |
94 | +#define SADW(SHR) \ | |
95 | + abs((int) ((a >> SHR) & 0xffff) - (int) ((b >> SHR) & 0xffff)) | |
96 | + return SADW(0) + SADW(16) + SADW(32) + SADW(48); | |
97 | +#undef SADW | |
98 | +} | |
99 | + | |
100 | +uint64_t HELPER(iwmmxt_mulslw)(uint64_t a, uint64_t b) | |
101 | +{ | |
102 | +#define MULS(SHR) ((uint64_t) ((( \ | |
103 | + EXTEND16S((a >> SHR) & 0xffff) * EXTEND16S((b >> SHR) & 0xffff) \ | |
104 | + ) >> 0) & 0xffff) << SHR) | |
105 | + return MULS(0) | MULS(16) | MULS(32) | MULS(48); | |
106 | +#undef MULS | |
107 | +} | |
108 | + | |
109 | +uint64_t HELPER(iwmmxt_mulshw)(uint64_t a, uint64_t b) | |
110 | +{ | |
111 | +#define MULS(SHR) ((uint64_t) ((( \ | |
112 | + EXTEND16S((a >> SHR) & 0xffff) * EXTEND16S((b >> SHR) & 0xffff) \ | |
113 | + ) >> 16) & 0xffff) << SHR) | |
114 | + return MULS(0) | MULS(16) | MULS(32) | MULS(48); | |
115 | +#undef MULS | |
116 | +} | |
117 | + | |
118 | +uint64_t HELPER(iwmmxt_mululw)(uint64_t a, uint64_t b) | |
119 | +{ | |
120 | +#define MULU(SHR) ((uint64_t) ((( \ | |
121 | + ((a >> SHR) & 0xffff) * ((b >> SHR) & 0xffff) \ | |
122 | + ) >> 0) & 0xffff) << SHR) | |
123 | + return MULU(0) | MULU(16) | MULU(32) | MULU(48); | |
124 | +#undef MULU | |
125 | +} | |
126 | + | |
127 | +uint64_t HELPER(iwmmxt_muluhw)(uint64_t a, uint64_t b) | |
128 | +{ | |
129 | +#define MULU(SHR) ((uint64_t) ((( \ | |
130 | + ((a >> SHR) & 0xffff) * ((b >> SHR) & 0xffff) \ | |
131 | + ) >> 16) & 0xffff) << SHR) | |
132 | + return MULU(0) | MULU(16) | MULU(32) | MULU(48); | |
133 | +#undef MULU | |
134 | +} | |
135 | + | |
136 | +uint64_t HELPER(iwmmxt_macsw)(uint64_t a, uint64_t b) | |
137 | +{ | |
138 | +#define MACS(SHR) ( \ | |
139 | + EXTEND16((a >> SHR) & 0xffff) * EXTEND16S((b >> SHR) & 0xffff)) | |
140 | + return (int64_t) (MACS(0) + MACS(16) + MACS(32) + MACS(48)); | |
141 | +#undef MACS | |
142 | +} | |
143 | + | |
144 | +uint64_t HELPER(iwmmxt_macuw)(uint64_t a, uint64_t b) | |
145 | +{ | |
146 | +#define MACU(SHR) ( \ | |
147 | + (uint32_t) ((a >> SHR) & 0xffff) * \ | |
148 | + (uint32_t) ((b >> SHR) & 0xffff)) | |
149 | + return MACU(0) + MACU(16) + MACU(32) + MACU(48); | |
150 | +#undef MACU | |
151 | +} | |
152 | + | |
153 | +#define NZBIT8(x, i) \ | |
154 | + SIMD8_SET(NBIT8((x) & 0xff), SIMD_NBIT, i) | \ | |
155 | + SIMD8_SET(ZBIT8((x) & 0xff), SIMD_ZBIT, i) | |
156 | +#define NZBIT16(x, i) \ | |
157 | + SIMD16_SET(NBIT16((x) & 0xffff), SIMD_NBIT, i) | \ | |
158 | + SIMD16_SET(ZBIT16((x) & 0xffff), SIMD_ZBIT, i) | |
159 | +#define NZBIT32(x, i) \ | |
160 | + SIMD32_SET(NBIT32((x) & 0xffffffff), SIMD_NBIT, i) | \ | |
161 | + SIMD32_SET(ZBIT32((x) & 0xffffffff), SIMD_ZBIT, i) | |
162 | +#define NZBIT64(x) \ | |
163 | + SIMD64_SET(NBIT64(x), SIMD_NBIT) | \ | |
164 | + SIMD64_SET(ZBIT64(x), SIMD_ZBIT) | |
165 | +#define IWMMXT_OP_UNPACK(S, SH0, SH1, SH2, SH3) \ | |
166 | +uint64_t HELPER(glue(iwmmxt_unpack, glue(S, b)))(CPUState *env, \ | |
167 | + uint64_t a, uint64_t b) \ | |
168 | +{ \ | |
169 | + a = \ | |
170 | + (((a >> SH0) & 0xff) << 0) | (((b >> SH0) & 0xff) << 8) | \ | |
171 | + (((a >> SH1) & 0xff) << 16) | (((b >> SH1) & 0xff) << 24) | \ | |
172 | + (((a >> SH2) & 0xff) << 32) | (((b >> SH2) & 0xff) << 40) | \ | |
173 | + (((a >> SH3) & 0xff) << 48) | (((b >> SH3) & 0xff) << 56); \ | |
174 | + env->iwmmxt.cregs[ARM_IWMMXT_wCASF] = \ | |
175 | + NZBIT8(a >> 0, 0) | NZBIT8(a >> 8, 1) | \ | |
176 | + NZBIT8(a >> 16, 2) | NZBIT8(a >> 24, 3) | \ | |
177 | + NZBIT8(a >> 32, 4) | NZBIT8(a >> 40, 5) | \ | |
178 | + NZBIT8(a >> 48, 6) | NZBIT8(a >> 56, 7); \ | |
179 | + return a; \ | |
180 | +} \ | |
181 | +uint64_t HELPER(glue(iwmmxt_unpack, glue(S, w)))(CPUState *env, \ | |
182 | + uint64_t a, uint64_t b) \ | |
183 | +{ \ | |
184 | + a = \ | |
185 | + (((a >> SH0) & 0xffff) << 0) | \ | |
186 | + (((b >> SH0) & 0xffff) << 16) | \ | |
187 | + (((a >> SH2) & 0xffff) << 32) | \ | |
188 | + (((b >> SH2) & 0xffff) << 48); \ | |
189 | + env->iwmmxt.cregs[ARM_IWMMXT_wCASF] = \ | |
190 | + NZBIT8(a >> 0, 0) | NZBIT8(a >> 16, 1) | \ | |
191 | + NZBIT8(a >> 32, 2) | NZBIT8(a >> 48, 3); \ | |
192 | + return a; \ | |
193 | +} \ | |
194 | +uint64_t HELPER(glue(iwmmxt_unpack, glue(S, l)))(CPUState *env, \ | |
195 | + uint64_t a, uint64_t b) \ | |
196 | +{ \ | |
197 | + a = \ | |
198 | + (((a >> SH0) & 0xffffffff) << 0) | \ | |
199 | + (((b >> SH0) & 0xffffffff) << 32); \ | |
200 | + env->iwmmxt.cregs[ARM_IWMMXT_wCASF] = \ | |
201 | + NZBIT32(a >> 0, 0) | NZBIT32(a >> 32, 1); \ | |
202 | + return a; \ | |
203 | +} \ | |
204 | +uint64_t HELPER(glue(iwmmxt_unpack, glue(S, ub)))(CPUState *env, \ | |
205 | + uint64_t x) \ | |
206 | +{ \ | |
207 | + x = \ | |
208 | + (((x >> SH0) & 0xff) << 0) | \ | |
209 | + (((x >> SH1) & 0xff) << 16) | \ | |
210 | + (((x >> SH2) & 0xff) << 32) | \ | |
211 | + (((x >> SH3) & 0xff) << 48); \ | |
212 | + env->iwmmxt.cregs[ARM_IWMMXT_wCASF] = \ | |
213 | + NZBIT16(x >> 0, 0) | NZBIT16(x >> 16, 1) | \ | |
214 | + NZBIT16(x >> 32, 2) | NZBIT16(x >> 48, 3); \ | |
215 | + return x; \ | |
216 | +} \ | |
217 | +uint64_t HELPER(glue(iwmmxt_unpack, glue(S, uw)))(CPUState *env, \ | |
218 | + uint64_t x) \ | |
219 | +{ \ | |
220 | + x = \ | |
221 | + (((x >> SH0) & 0xffff) << 0) | \ | |
222 | + (((x >> SH2) & 0xffff) << 32); \ | |
223 | + env->iwmmxt.cregs[ARM_IWMMXT_wCASF] = \ | |
224 | + NZBIT32(x >> 0, 0) | NZBIT32(x >> 32, 1); \ | |
225 | + return x; \ | |
226 | +} \ | |
227 | +uint64_t HELPER(glue(iwmmxt_unpack, glue(S, ul)))(CPUState *env, \ | |
228 | + uint64_t x) \ | |
229 | +{ \ | |
230 | + x = (((x >> SH0) & 0xffffffff) << 0); \ | |
231 | + env->iwmmxt.cregs[ARM_IWMMXT_wCASF] = NZBIT64(x >> 0); \ | |
232 | + return x; \ | |
233 | +} \ | |
234 | +uint64_t HELPER(glue(iwmmxt_unpack, glue(S, sb)))(CPUState *env, \ | |
235 | + uint64_t x) \ | |
236 | +{ \ | |
237 | + x = \ | |
238 | + ((uint64_t) EXTEND8H((x >> SH0) & 0xff) << 0) | \ | |
239 | + ((uint64_t) EXTEND8H((x >> SH1) & 0xff) << 16) | \ | |
240 | + ((uint64_t) EXTEND8H((x >> SH2) & 0xff) << 32) | \ | |
241 | + ((uint64_t) EXTEND8H((x >> SH3) & 0xff) << 48); \ | |
242 | + env->iwmmxt.cregs[ARM_IWMMXT_wCASF] = \ | |
243 | + NZBIT16(x >> 0, 0) | NZBIT16(x >> 16, 1) | \ | |
244 | + NZBIT16(x >> 32, 2) | NZBIT16(x >> 48, 3); \ | |
245 | + return x; \ | |
246 | +} \ | |
247 | +uint64_t HELPER(glue(iwmmxt_unpack, glue(S, sw)))(CPUState *env, \ | |
248 | + uint64_t x) \ | |
249 | +{ \ | |
250 | + x = \ | |
251 | + ((uint64_t) EXTEND16((x >> SH0) & 0xffff) << 0) | \ | |
252 | + ((uint64_t) EXTEND16((x >> SH2) & 0xffff) << 32); \ | |
253 | + env->iwmmxt.cregs[ARM_IWMMXT_wCASF] = \ | |
254 | + NZBIT32(x >> 0, 0) | NZBIT32(x >> 32, 1); \ | |
255 | + return x; \ | |
256 | +} \ | |
257 | +uint64_t HELPER(glue(iwmmxt_unpack, glue(S, sl)))(CPUState *env, \ | |
258 | + uint64_t x) \ | |
259 | +{ \ | |
260 | + x = EXTEND32((x >> SH0) & 0xffffffff); \ | |
261 | + env->iwmmxt.cregs[ARM_IWMMXT_wCASF] = NZBIT64(x >> 0); \ | |
262 | + return x; \ | |
263 | +} | |
264 | +IWMMXT_OP_UNPACK(l, 0, 8, 16, 24) | |
265 | +IWMMXT_OP_UNPACK(h, 32, 40, 48, 56) | |
266 | + | |
267 | +#define IWMMXT_OP_CMP(SUFF, Tb, Tw, Tl, O) \ | |
268 | +uint64_t HELPER(glue(iwmmxt_, glue(SUFF, b)))(CPUState *env, \ | |
269 | + uint64_t a, uint64_t b) \ | |
270 | +{ \ | |
271 | + a = \ | |
272 | + CMP(0, Tb, O, 0xff) | CMP(8, Tb, O, 0xff) | \ | |
273 | + CMP(16, Tb, O, 0xff) | CMP(24, Tb, O, 0xff) | \ | |
274 | + CMP(32, Tb, O, 0xff) | CMP(40, Tb, O, 0xff) | \ | |
275 | + CMP(48, Tb, O, 0xff) | CMP(56, Tb, O, 0xff); \ | |
276 | + env->iwmmxt.cregs[ARM_IWMMXT_wCASF] = \ | |
277 | + NZBIT8(a >> 0, 0) | NZBIT8(a >> 8, 1) | \ | |
278 | + NZBIT8(a >> 16, 2) | NZBIT8(a >> 24, 3) | \ | |
279 | + NZBIT8(a >> 32, 4) | NZBIT8(a >> 40, 5) | \ | |
280 | + NZBIT8(a >> 48, 6) | NZBIT8(a >> 56, 7); \ | |
281 | + return a; \ | |
282 | +} \ | |
283 | +uint64_t HELPER(glue(iwmmxt_, glue(SUFF, w)))(CPUState *env, \ | |
284 | + uint64_t a, uint64_t b) \ | |
285 | +{ \ | |
286 | + a = CMP(0, Tw, O, 0xffff) | CMP(16, Tw, O, 0xffff) | \ | |
287 | + CMP(32, Tw, O, 0xffff) | CMP(48, Tw, O, 0xffff); \ | |
288 | + env->iwmmxt.cregs[ARM_IWMMXT_wCASF] = \ | |
289 | + NZBIT16(a >> 0, 0) | NZBIT16(a >> 16, 1) | \ | |
290 | + NZBIT16(a >> 32, 2) | NZBIT16(a >> 48, 3); \ | |
291 | + return a; \ | |
292 | +} \ | |
293 | +uint64_t HELPER(glue(iwmmxt_, glue(SUFF, l)))(CPUState *env, \ | |
294 | + uint64_t a, uint64_t b) \ | |
295 | +{ \ | |
296 | + a = CMP(0, Tl, O, 0xffffffff) | \ | |
297 | + CMP(32, Tl, O, 0xffffffff); \ | |
298 | + env->iwmmxt.cregs[ARM_IWMMXT_wCASF] = \ | |
299 | + NZBIT32(a >> 0, 0) | NZBIT32(a >> 32, 1); \ | |
300 | + return a; \ | |
301 | +} | |
302 | +#define CMP(SHR, TYPE, OPER, MASK) ((((TYPE) ((a >> SHR) & MASK) OPER \ | |
303 | + (TYPE) ((b >> SHR) & MASK)) ? (uint64_t) MASK : 0) << SHR) | |
304 | +IWMMXT_OP_CMP(cmpeq, uint8_t, uint16_t, uint32_t, ==) | |
305 | +IWMMXT_OP_CMP(cmpgts, int8_t, int16_t, int32_t, >) | |
306 | +IWMMXT_OP_CMP(cmpgtu, uint8_t, uint16_t, uint32_t, >) | |
307 | +#undef CMP | |
308 | +#define CMP(SHR, TYPE, OPER, MASK) ((((TYPE) ((a >> SHR) & MASK) OPER \ | |
309 | + (TYPE) ((b >> SHR) & MASK)) ? a : b) & ((uint64_t) MASK << SHR)) | |
310 | +IWMMXT_OP_CMP(mins, int8_t, int16_t, int32_t, <) | |
311 | +IWMMXT_OP_CMP(minu, uint8_t, uint16_t, uint32_t, <) | |
312 | +IWMMXT_OP_CMP(maxs, int8_t, int16_t, int32_t, >) | |
313 | +IWMMXT_OP_CMP(maxu, uint8_t, uint16_t, uint32_t, >) | |
314 | +#undef CMP | |
315 | +#define CMP(SHR, TYPE, OPER, MASK) ((uint64_t) (((TYPE) ((a >> SHR) & MASK) \ | |
316 | + OPER (TYPE) ((b >> SHR) & MASK)) & MASK) << SHR) | |
317 | +IWMMXT_OP_CMP(subn, uint8_t, uint16_t, uint32_t, -) | |
318 | +IWMMXT_OP_CMP(addn, uint8_t, uint16_t, uint32_t, +) | |
319 | +#undef CMP | |
320 | +/* TODO Signed- and Unsigned-Saturation */ | |
321 | +#define CMP(SHR, TYPE, OPER, MASK) ((uint64_t) (((TYPE) ((a >> SHR) & MASK) \ | |
322 | + OPER (TYPE) ((b >> SHR) & MASK)) & MASK) << SHR) | |
323 | +IWMMXT_OP_CMP(subu, uint8_t, uint16_t, uint32_t, -) | |
324 | +IWMMXT_OP_CMP(addu, uint8_t, uint16_t, uint32_t, +) | |
325 | +IWMMXT_OP_CMP(subs, int8_t, int16_t, int32_t, -) | |
326 | +IWMMXT_OP_CMP(adds, int8_t, int16_t, int32_t, +) | |
327 | +#undef CMP | |
328 | +#undef IWMMXT_OP_CMP | |
329 | + | |
330 | +#define AVGB(SHR) ((( \ | |
331 | + ((a >> SHR) & 0xff) + ((b >> SHR) & 0xff) + round) >> 1) << SHR) | |
332 | +#define IWMMXT_OP_AVGB(r) \ | |
333 | +uint64_t HELPER(iwmmxt_avgb##r)(CPUState *env, uint64_t a, uint64_t b) \ | |
334 | +{ \ | |
335 | + const int round = r; \ | |
336 | + a = AVGB(0) | AVGB(8) | AVGB(16) | AVGB(24) | \ | |
337 | + AVGB(32) | AVGB(40) | AVGB(48) | AVGB(56); \ | |
338 | + env->iwmmxt.cregs[ARM_IWMMXT_wCASF] = \ | |
339 | + SIMD8_SET(ZBIT8((a >> 0) & 0xff), SIMD_ZBIT, 0) | \ | |
340 | + SIMD8_SET(ZBIT8((a >> 8) & 0xff), SIMD_ZBIT, 1) | \ | |
341 | + SIMD8_SET(ZBIT8((a >> 16) & 0xff), SIMD_ZBIT, 2) | \ | |
342 | + SIMD8_SET(ZBIT8((a >> 24) & 0xff), SIMD_ZBIT, 3) | \ | |
343 | + SIMD8_SET(ZBIT8((a >> 32) & 0xff), SIMD_ZBIT, 4) | \ | |
344 | + SIMD8_SET(ZBIT8((a >> 40) & 0xff), SIMD_ZBIT, 5) | \ | |
345 | + SIMD8_SET(ZBIT8((a >> 48) & 0xff), SIMD_ZBIT, 6) | \ | |
346 | + SIMD8_SET(ZBIT8((a >> 56) & 0xff), SIMD_ZBIT, 7); \ | |
347 | + return a; \ | |
348 | +} | |
349 | +IWMMXT_OP_AVGB(0) | |
350 | +IWMMXT_OP_AVGB(1) | |
351 | +#undef IWMMXT_OP_AVGB | |
352 | +#undef AVGB | |
353 | + | |
354 | +#define AVGW(SHR) ((( \ | |
355 | + ((a >> SHR) & 0xffff) + ((b >> SHR) & 0xffff) + round) >> 1) << SHR) | |
356 | +#define IWMMXT_OP_AVGW(r) \ | |
357 | +uint64_t HELPER(iwmmxt_avgw##r)(CPUState *env, uint64_t a, uint64_t b) \ | |
358 | +{ \ | |
359 | + const int round = r; \ | |
360 | + a = AVGW(0) | AVGW(16) | AVGW(32) | AVGW(48); \ | |
361 | + env->iwmmxt.cregs[ARM_IWMMXT_wCASF] = \ | |
362 | + SIMD16_SET(ZBIT16((a >> 0) & 0xffff), SIMD_ZBIT, 0) | \ | |
363 | + SIMD16_SET(ZBIT16((a >> 16) & 0xffff), SIMD_ZBIT, 1) | \ | |
364 | + SIMD16_SET(ZBIT16((a >> 32) & 0xffff), SIMD_ZBIT, 2) | \ | |
365 | + SIMD16_SET(ZBIT16((a >> 48) & 0xffff), SIMD_ZBIT, 3); \ | |
366 | + return a; \ | |
367 | +} | |
368 | +IWMMXT_OP_AVGW(0) | |
369 | +IWMMXT_OP_AVGW(1) | |
370 | +#undef IWMMXT_OP_AVGW | |
371 | +#undef AVGW | |
372 | + | |
373 | +uint64_t HELPER(iwmmxt_msadb)(uint64_t a, uint64_t b) | |
374 | +{ | |
375 | + a = ((((a >> 0 ) & 0xffff) * ((b >> 0) & 0xffff) + | |
376 | + ((a >> 16) & 0xffff) * ((b >> 16) & 0xffff)) & 0xffffffff) | | |
377 | + ((((a >> 32) & 0xffff) * ((b >> 32) & 0xffff) + | |
378 | + ((a >> 48) & 0xffff) * ((b >> 48) & 0xffff)) << 32); | |
379 | + return a; | |
380 | +} | |
381 | + | |
382 | +uint64_t HELPER(iwmmxt_align)(uint64_t a, uint64_t b, uint32_t n) | |
383 | +{ | |
384 | + a >>= n << 3; | |
385 | + a |= b << (64 - (n << 3)); | |
386 | + return a; | |
387 | +} | |
388 | + | |
389 | +uint64_t HELPER(iwmmxt_insr)(uint64_t x, uint32_t a, uint32_t b, uint32_t n) | |
390 | +{ | |
391 | + x &= ~((uint64_t) b << n); | |
392 | + x |= (uint64_t) (a & b) << n; | |
393 | + return x; | |
394 | +} | |
395 | + | |
396 | +uint32_t HELPER(iwmmxt_setpsr_nz)(uint64_t x) | |
397 | +{ | |
398 | + return SIMD64_SET((x == 0), SIMD_ZBIT) | | |
399 | + SIMD64_SET((x & (1ULL << 63)), SIMD_NBIT); | |
400 | +} | |
401 | + | |
402 | +uint64_t HELPER(iwmmxt_bcstb)(uint32_t arg) | |
403 | +{ | |
404 | + arg &= 0xff; | |
405 | + return | |
406 | + ((uint64_t) arg << 0 ) | ((uint64_t) arg << 8 ) | | |
407 | + ((uint64_t) arg << 16) | ((uint64_t) arg << 24) | | |
408 | + ((uint64_t) arg << 32) | ((uint64_t) arg << 40) | | |
409 | + ((uint64_t) arg << 48) | ((uint64_t) arg << 56); | |
410 | +} | |
411 | + | |
412 | +uint64_t HELPER(iwmmxt_bcstw)(uint32_t arg) | |
413 | +{ | |
414 | + arg &= 0xffff; | |
415 | + return | |
416 | + ((uint64_t) arg << 0 ) | ((uint64_t) arg << 16) | | |
417 | + ((uint64_t) arg << 32) | ((uint64_t) arg << 48); | |
418 | +} | |
419 | + | |
420 | +uint64_t HELPER(iwmmxt_bcstl)(uint32_t arg) | |
421 | +{ | |
422 | + return arg | ((uint64_t) arg << 32); | |
423 | +} | |
424 | + | |
425 | +uint64_t HELPER(iwmmxt_addcb)(uint64_t x) | |
426 | +{ | |
427 | + return | |
428 | + ((x >> 0) & 0xff) + ((x >> 8) & 0xff) + | |
429 | + ((x >> 16) & 0xff) + ((x >> 24) & 0xff) + | |
430 | + ((x >> 32) & 0xff) + ((x >> 40) & 0xff) + | |
431 | + ((x >> 48) & 0xff) + ((x >> 56) & 0xff); | |
432 | +} | |
433 | + | |
434 | +uint64_t HELPER(iwmmxt_addcw)(uint64_t x) | |
435 | +{ | |
436 | + return | |
437 | + ((x >> 0) & 0xffff) + ((x >> 16) & 0xffff) + | |
438 | + ((x >> 32) & 0xffff) + ((x >> 48) & 0xffff); | |
439 | +} | |
440 | + | |
441 | +uint64_t HELPER(iwmmxt_addcl)(uint64_t x) | |
442 | +{ | |
443 | + return (x & 0xffffffff) + (x >> 32); | |
444 | +} | |
445 | + | |
446 | +uint32_t HELPER(iwmmxt_msbb)(uint64_t x) | |
447 | +{ | |
448 | + return | |
449 | + ((x >> 7) & 0x01) | ((x >> 14) & 0x02) | | |
450 | + ((x >> 21) & 0x04) | ((x >> 28) & 0x08) | | |
451 | + ((x >> 35) & 0x10) | ((x >> 42) & 0x20) | | |
452 | + ((x >> 49) & 0x40) | ((x >> 56) & 0x80); | |
453 | +} | |
454 | + | |
455 | +uint32_t HELPER(iwmmxt_msbw)(uint64_t x) | |
456 | +{ | |
457 | + return | |
458 | + ((x >> 15) & 0x01) | ((x >> 30) & 0x02) | | |
459 | + ((x >> 45) & 0x04) | ((x >> 52) & 0x08); | |
460 | +} | |
461 | + | |
462 | +uint32_t HELPER(iwmmxt_msbl)(uint64_t x) | |
463 | +{ | |
464 | + return ((x >> 31) & 0x01) | ((x >> 62) & 0x02); | |
465 | +} | |
466 | + | |
467 | +/* FIXME: Split wCASF setting into a separate op to avoid env use. */ | |
468 | +uint64_t HELPER(iwmmxt_srlw)(CPUState *env, uint64_t x, uint32_t n) | |
469 | +{ | |
470 | + x = (((x & (0xffffll << 0)) >> n) & (0xffffll << 0)) | | |
471 | + (((x & (0xffffll << 16)) >> n) & (0xffffll << 16)) | | |
472 | + (((x & (0xffffll << 32)) >> n) & (0xffffll << 32)) | | |
473 | + (((x & (0xffffll << 48)) >> n) & (0xffffll << 48)); | |
474 | + env->iwmmxt.cregs[ARM_IWMMXT_wCASF] = | |
475 | + NZBIT16(x >> 0, 0) | NZBIT16(x >> 16, 1) | | |
476 | + NZBIT16(x >> 32, 2) | NZBIT16(x >> 48, 3); | |
477 | + return x; | |
478 | +} | |
479 | + | |
480 | +uint64_t HELPER(iwmmxt_srll)(CPUState *env, uint64_t x, uint32_t n) | |
481 | +{ | |
482 | + x = ((x & (0xffffffffll << 0)) >> n) | | |
483 | + ((x >> n) & (0xffffffffll << 32)); | |
484 | + env->iwmmxt.cregs[ARM_IWMMXT_wCASF] = | |
485 | + NZBIT32(x >> 0, 0) | NZBIT32(x >> 32, 1); | |
486 | + return x; | |
487 | +} | |
488 | + | |
489 | +uint64_t HELPER(iwmmxt_srlq)(CPUState *env, uint64_t x, uint32_t n) | |
490 | +{ | |
491 | + x >>= n; | |
492 | + env->iwmmxt.cregs[ARM_IWMMXT_wCASF] = NZBIT64(x); | |
493 | + return x; | |
494 | +} | |
495 | + | |
496 | +uint64_t HELPER(iwmmxt_sllw)(CPUState *env, uint64_t x, uint32_t n) | |
497 | +{ | |
498 | + x = (((x & (0xffffll << 0)) << n) & (0xffffll << 0)) | | |
499 | + (((x & (0xffffll << 16)) << n) & (0xffffll << 16)) | | |
500 | + (((x & (0xffffll << 32)) << n) & (0xffffll << 32)) | | |
501 | + (((x & (0xffffll << 48)) << n) & (0xffffll << 48)); | |
502 | + env->iwmmxt.cregs[ARM_IWMMXT_wCASF] = | |
503 | + NZBIT16(x >> 0, 0) | NZBIT16(x >> 16, 1) | | |
504 | + NZBIT16(x >> 32, 2) | NZBIT16(x >> 48, 3); | |
505 | + return x; | |
506 | +} | |
507 | + | |
508 | +uint64_t HELPER(iwmmxt_slll)(CPUState *env, uint64_t x, uint32_t n) | |
509 | +{ | |
510 | + x = ((x << n) & (0xffffffffll << 0)) | | |
511 | + ((x & (0xffffffffll << 32)) << n); | |
512 | + env->iwmmxt.cregs[ARM_IWMMXT_wCASF] = | |
513 | + NZBIT32(x >> 0, 0) | NZBIT32(x >> 32, 1); | |
514 | + return x; | |
515 | +} | |
516 | + | |
517 | +uint64_t HELPER(iwmmxt_sllq)(CPUState *env, uint64_t x, uint32_t n) | |
518 | +{ | |
519 | + x <<= n; | |
520 | + env->iwmmxt.cregs[ARM_IWMMXT_wCASF] = NZBIT64(x); | |
521 | + return x; | |
522 | +} | |
523 | + | |
524 | +uint64_t HELPER(iwmmxt_sraw)(CPUState *env, uint64_t x, uint32_t n) | |
525 | +{ | |
526 | + x = ((uint64_t) ((EXTEND16(x >> 0) >> n) & 0xffff) << 0) | | |
527 | + ((uint64_t) ((EXTEND16(x >> 16) >> n) & 0xffff) << 16) | | |
528 | + ((uint64_t) ((EXTEND16(x >> 32) >> n) & 0xffff) << 32) | | |
529 | + ((uint64_t) ((EXTEND16(x >> 48) >> n) & 0xffff) << 48); | |
530 | + env->iwmmxt.cregs[ARM_IWMMXT_wCASF] = | |
531 | + NZBIT16(x >> 0, 0) | NZBIT16(x >> 16, 1) | | |
532 | + NZBIT16(x >> 32, 2) | NZBIT16(x >> 48, 3); | |
533 | + return x; | |
534 | +} | |
535 | + | |
536 | +uint64_t HELPER(iwmmxt_sral)(CPUState *env, uint64_t x, uint32_t n) | |
537 | +{ | |
538 | + x = (((EXTEND32(x >> 0) >> n) & 0xffffffff) << 0) | | |
539 | + (((EXTEND32(x >> 32) >> n) & 0xffffffff) << 32); | |
540 | + env->iwmmxt.cregs[ARM_IWMMXT_wCASF] = | |
541 | + NZBIT32(x >> 0, 0) | NZBIT32(x >> 32, 1); | |
542 | + return x; | |
543 | +} | |
544 | + | |
545 | +uint64_t HELPER(iwmmxt_sraq)(CPUState *env, uint64_t x, uint32_t n) | |
546 | +{ | |
547 | + x = (int64_t) x >> n; | |
548 | + env->iwmmxt.cregs[ARM_IWMMXT_wCASF] = NZBIT64(x); | |
549 | + return x; | |
550 | +} | |
551 | + | |
552 | +uint64_t HELPER(iwmmxt_rorw)(CPUState *env, uint64_t x, uint32_t n) | |
553 | +{ | |
554 | + x = ((((x & (0xffffll << 0)) >> n) | | |
555 | + ((x & (0xffffll << 0)) << (16 - n))) & (0xffffll << 0)) | | |
556 | + ((((x & (0xffffll << 16)) >> n) | | |
557 | + ((x & (0xffffll << 16)) << (16 - n))) & (0xffffll << 16)) | | |
558 | + ((((x & (0xffffll << 32)) >> n) | | |
559 | + ((x & (0xffffll << 32)) << (16 - n))) & (0xffffll << 32)) | | |
560 | + ((((x & (0xffffll << 48)) >> n) | | |
561 | + ((x & (0xffffll << 48)) << (16 - n))) & (0xffffll << 48)); | |
562 | + env->iwmmxt.cregs[ARM_IWMMXT_wCASF] = | |
563 | + NZBIT16(x >> 0, 0) | NZBIT16(x >> 16, 1) | | |
564 | + NZBIT16(x >> 32, 2) | NZBIT16(x >> 48, 3); | |
565 | + return x; | |
566 | +} | |
567 | + | |
568 | +uint64_t HELPER(iwmmxt_rorl)(CPUState *env, uint64_t x, uint32_t n) | |
569 | +{ | |
570 | + x = ((x & (0xffffffffll << 0)) >> n) | | |
571 | + ((x >> n) & (0xffffffffll << 32)) | | |
572 | + ((x << (32 - n)) & (0xffffffffll << 0)) | | |
573 | + ((x & (0xffffffffll << 32)) << (32 - n)); | |
574 | + env->iwmmxt.cregs[ARM_IWMMXT_wCASF] = | |
575 | + NZBIT32(x >> 0, 0) | NZBIT32(x >> 32, 1); | |
576 | + return x; | |
577 | +} | |
578 | + | |
579 | +uint64_t HELPER(iwmmxt_rorq)(CPUState *env, uint64_t x, uint32_t n) | |
580 | +{ | |
581 | + x = (x >> n) | (x << (64 - n)); | |
582 | + env->iwmmxt.cregs[ARM_IWMMXT_wCASF] = NZBIT64(x); | |
583 | + return x; | |
584 | +} | |
585 | + | |
586 | +uint64_t HELPER(iwmmxt_shufh)(CPUState *env, uint64_t x, uint32_t n) | |
587 | +{ | |
588 | + x = (((x >> ((n << 4) & 0x30)) & 0xffff) << 0) | | |
589 | + (((x >> ((n << 2) & 0x30)) & 0xffff) << 16) | | |
590 | + (((x >> ((n << 0) & 0x30)) & 0xffff) << 32) | | |
591 | + (((x >> ((n >> 2) & 0x30)) & 0xffff) << 48); | |
592 | + env->iwmmxt.cregs[ARM_IWMMXT_wCASF] = | |
593 | + NZBIT16(x >> 0, 0) | NZBIT16(x >> 16, 1) | | |
594 | + NZBIT16(x >> 32, 2) | NZBIT16(x >> 48, 3); | |
595 | + return x; | |
596 | +} | |
597 | + | |
598 | +/* TODO: Unsigned-Saturation */ | |
599 | +uint64_t HELPER(iwmmxt_packuw)(CPUState *env, uint64_t a, uint64_t b) | |
600 | +{ | |
601 | + a = (((a >> 0) & 0xff) << 0) | (((a >> 16) & 0xff) << 8) | | |
602 | + (((a >> 32) & 0xff) << 16) | (((a >> 48) & 0xff) << 24) | | |
603 | + (((b >> 0) & 0xff) << 32) | (((b >> 16) & 0xff) << 40) | | |
604 | + (((b >> 32) & 0xff) << 48) | (((b >> 48) & 0xff) << 56); | |
605 | + env->iwmmxt.cregs[ARM_IWMMXT_wCASF] = | |
606 | + NZBIT8(a >> 0, 0) | NZBIT8(a >> 8, 1) | | |
607 | + NZBIT8(a >> 16, 2) | NZBIT8(a >> 24, 3) | | |
608 | + NZBIT8(a >> 32, 4) | NZBIT8(a >> 40, 5) | | |
609 | + NZBIT8(a >> 48, 6) | NZBIT8(a >> 56, 7); | |
610 | + return a; | |
611 | +} | |
612 | + | |
613 | +uint64_t HELPER(iwmmxt_packul)(CPUState *env, uint64_t a, uint64_t b) | |
614 | +{ | |
615 | + a = (((a >> 0) & 0xffff) << 0) | (((a >> 32) & 0xffff) << 16) | | |
616 | + (((b >> 0) & 0xffff) << 32) | (((b >> 32) & 0xffff) << 48); | |
617 | + env->iwmmxt.cregs[ARM_IWMMXT_wCASF] = | |
618 | + NZBIT16(a >> 0, 0) | NZBIT16(a >> 16, 1) | | |
619 | + NZBIT16(a >> 32, 2) | NZBIT16(a >> 48, 3); | |
620 | + return a; | |
621 | +} | |
622 | + | |
623 | +uint64_t HELPER(iwmmxt_packuq)(CPUState *env, uint64_t a, uint64_t b) | |
624 | +{ | |
625 | + a = (a & 0xffffffff) | ((b & 0xffffffff) << 32); | |
626 | + env->iwmmxt.cregs[ARM_IWMMXT_wCASF] = | |
627 | + NZBIT32(a >> 0, 0) | NZBIT32(a >> 32, 1); | |
628 | + return a; | |
629 | +} | |
630 | + | |
631 | +/* TODO: Signed-Saturation */ | |
632 | +uint64_t HELPER(iwmmxt_packsw)(CPUState *env, uint64_t a, uint64_t b) | |
633 | +{ | |
634 | + a = (((a >> 0) & 0xff) << 0) | (((a >> 16) & 0xff) << 8) | | |
635 | + (((a >> 32) & 0xff) << 16) | (((a >> 48) & 0xff) << 24) | | |
636 | + (((b >> 0) & 0xff) << 32) | (((b >> 16) & 0xff) << 40) | | |
637 | + (((b >> 32) & 0xff) << 48) | (((b >> 48) & 0xff) << 56); | |
638 | + env->iwmmxt.cregs[ARM_IWMMXT_wCASF] = | |
639 | + NZBIT8(a >> 0, 0) | NZBIT8(a >> 8, 1) | | |
640 | + NZBIT8(a >> 16, 2) | NZBIT8(a >> 24, 3) | | |
641 | + NZBIT8(a >> 32, 4) | NZBIT8(a >> 40, 5) | | |
642 | + NZBIT8(a >> 48, 6) | NZBIT8(a >> 56, 7); | |
643 | + return a; | |
644 | +} | |
645 | + | |
646 | +uint64_t HELPER(iwmmxt_packsl)(CPUState *env, uint64_t a, uint64_t b) | |
647 | +{ | |
648 | + a = (((a >> 0) & 0xffff) << 0) | (((a >> 32) & 0xffff) << 16) | | |
649 | + (((b >> 0) & 0xffff) << 32) | (((b >> 32) & 0xffff) << 48); | |
650 | + env->iwmmxt.cregs[ARM_IWMMXT_wCASF] = | |
651 | + NZBIT16(a >> 0, 0) | NZBIT16(a >> 16, 1) | | |
652 | + NZBIT16(a >> 32, 2) | NZBIT16(a >> 48, 3); | |
653 | + return a; | |
654 | +} | |
655 | + | |
656 | +uint64_t HELPER(iwmmxt_packsq)(CPUState *env, uint64_t a, uint64_t b) | |
657 | +{ | |
658 | + a = (a & 0xffffffff) | ((b & 0xffffffff) << 32); | |
659 | + env->iwmmxt.cregs[ARM_IWMMXT_wCASF] = | |
660 | + NZBIT32(a >> 0, 0) | NZBIT32(a >> 32, 1); | |
661 | + return a; | |
662 | +} | |
663 | + | |
664 | +uint64_t HELPER(iwmmxt_muladdsl)(uint64_t c, uint32_t a, uint32_t b) | |
665 | +{ | |
666 | + return c + ((int32_t) EXTEND32(a) * (int32_t) EXTEND32(b)); | |
667 | +} | |
668 | + | |
669 | +uint64_t HELPER(iwmmxt_muladdsw)(uint64_t c, uint32_t a, uint32_t b) | |
670 | +{ | |
671 | + c += EXTEND32(EXTEND16S((a >> 0) & 0xffff) * | |
672 | + EXTEND16S((b >> 0) & 0xffff)); | |
673 | + c += EXTEND32(EXTEND16S((a >> 16) & 0xffff) * | |
674 | + EXTEND16S((b >> 16) & 0xffff)); | |
675 | + return c; | |
676 | +} | |
677 | + | |
678 | +uint64_t HELPER(iwmmxt_muladdswl)(uint64_t c, uint32_t a, uint32_t b) | |
679 | +{ | |
680 | + return c + (EXTEND32(EXTEND16S(a & 0xffff) * | |
681 | + EXTEND16S(b & 0xffff))); | |
682 | +} | ... | ... |
target-arm/neon_helper.c
target-arm/op.c
... | ... | @@ -20,17 +20,6 @@ |
20 | 20 | */ |
21 | 21 | #include "exec.h" |
22 | 22 | |
23 | -/* memory access */ | |
24 | - | |
25 | -#define MEMSUFFIX _raw | |
26 | -#include "op_mem.h" | |
27 | - | |
28 | -#if !defined(CONFIG_USER_ONLY) | |
29 | -#define MEMSUFFIX _user | |
30 | -#include "op_mem.h" | |
31 | -#define MEMSUFFIX _kernel | |
32 | -#include "op_mem.h" | |
33 | -#endif | |
34 | - | |
35 | -/* iwMMXt support */ | |
36 | -#include "op_iwmmxt.c" | |
23 | +void OPPROTO op_dummy(void) | |
24 | +{ | |
25 | +} | ... | ... |
target-arm/op_iwmmxt.c deleted
100644 โ 0
1 | -/* | |
2 | - * iwMMXt micro operations for XScale. | |
3 | - * | |
4 | - * Copyright (c) 2007 OpenedHand, Ltd. | |
5 | - * Written by Andrzej Zaborowski <andrew@openedhand.com> | |
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 | -} |
target-arm/op_mem.h deleted
100644 โ 0
1 | -/* ARM memory operations. */ | |
2 | - | |
3 | -/* iwMMXt load/store. Address is in T1 */ | |
4 | -#define MMX_MEM_OP(name, ldname) \ | |
5 | -void OPPROTO glue(op_iwmmxt_ld##name,MEMSUFFIX)(void) \ | |
6 | -{ \ | |
7 | - M0 = glue(ld##ldname,MEMSUFFIX)(T1); \ | |
8 | - FORCE_RET(); \ | |
9 | -} \ | |
10 | -void OPPROTO glue(op_iwmmxt_st##name,MEMSUFFIX)(void) \ | |
11 | -{ \ | |
12 | - glue(st##name,MEMSUFFIX)(T1, M0); \ | |
13 | - FORCE_RET(); \ | |
14 | -} | |
15 | - | |
16 | -MMX_MEM_OP(b, ub) | |
17 | -MMX_MEM_OP(w, uw) | |
18 | -MMX_MEM_OP(l, l) | |
19 | -MMX_MEM_OP(q, q) | |
20 | - | |
21 | -#undef MMX_MEM_OP | |
22 | - | |
23 | -#undef MEMSUFFIX |
target-arm/translate.c
... | ... | @@ -78,7 +78,7 @@ extern int loglevel; |
78 | 78 | |
79 | 79 | static TCGv cpu_env; |
80 | 80 | /* We reuse the same 64-bit temporaries for efficiency. */ |
81 | -static TCGv cpu_V0, cpu_V1; | |
81 | +static TCGv cpu_V0, cpu_V1, cpu_M0; | |
82 | 82 | |
83 | 83 | /* FIXME: These should be removed. */ |
84 | 84 | static TCGv cpu_T[2]; |
... | ... | @@ -456,6 +456,12 @@ static inline void tcg_gen_not_i32(TCGv t0, TCGv t1) |
456 | 456 | tcg_gen_xori_i32(t0, t1, ~0); |
457 | 457 | } |
458 | 458 | |
459 | +/* FIXME: Implement this natively. */ | |
460 | +static inline void tcg_gen_neg_i64(TCGv dest, TCGv src) | |
461 | +{ | |
462 | + tcg_gen_sub_i64(dest, tcg_const_i64(0), src); | |
463 | +} | |
464 | + | |
459 | 465 | /* T0 &= ~T1. Clobbers T1. */ |
460 | 466 | /* FIXME: Implement bic natively. */ |
461 | 467 | static inline void tcg_gen_bic_i32(TCGv dest, TCGv t0, TCGv t1) |
... | ... | @@ -1234,6 +1240,238 @@ static inline void gen_mov_vreg_F0(int dp, int reg) |
1234 | 1240 | |
1235 | 1241 | #define ARM_CP_RW_BIT (1 << 20) |
1236 | 1242 | |
1243 | +static inline void iwmmxt_load_reg(TCGv var, int reg) | |
1244 | +{ | |
1245 | + tcg_gen_ld_i64(var, cpu_env, offsetof(CPUState, iwmmxt.regs[reg])); | |
1246 | +} | |
1247 | + | |
1248 | +static inline void iwmmxt_store_reg(TCGv var, int reg) | |
1249 | +{ | |
1250 | + tcg_gen_st_i64(var, cpu_env, offsetof(CPUState, iwmmxt.regs[reg])); | |
1251 | +} | |
1252 | + | |
1253 | +static inline void gen_op_iwmmxt_movl_wCx_T0(int reg) | |
1254 | +{ | |
1255 | + tcg_gen_st_i32(cpu_T[0], cpu_env, offsetof(CPUState, iwmmxt.cregs[reg])); | |
1256 | +} | |
1257 | + | |
1258 | +static inline void gen_op_iwmmxt_movl_T0_wCx(int reg) | |
1259 | +{ | |
1260 | + tcg_gen_ld_i32(cpu_T[0], cpu_env, offsetof(CPUState, iwmmxt.cregs[reg])); | |
1261 | +} | |
1262 | + | |
1263 | +static inline void gen_op_iwmmxt_movl_T1_wCx(int reg) | |
1264 | +{ | |
1265 | + tcg_gen_ld_i32(cpu_T[1], cpu_env, offsetof(CPUState, iwmmxt.cregs[reg])); | |
1266 | +} | |
1267 | + | |
1268 | +static inline void gen_op_iwmmxt_movq_wRn_M0(int rn) | |
1269 | +{ | |
1270 | + iwmmxt_store_reg(cpu_M0, rn); | |
1271 | +} | |
1272 | + | |
1273 | +static inline void gen_op_iwmmxt_movq_M0_wRn(int rn) | |
1274 | +{ | |
1275 | + iwmmxt_load_reg(cpu_M0, rn); | |
1276 | +} | |
1277 | + | |
1278 | +static inline void gen_op_iwmmxt_orq_M0_wRn(int rn) | |
1279 | +{ | |
1280 | + iwmmxt_load_reg(cpu_V1, rn); | |
1281 | + tcg_gen_or_i64(cpu_M0, cpu_M0, cpu_V1); | |
1282 | +} | |
1283 | + | |
1284 | +static inline void gen_op_iwmmxt_andq_M0_wRn(int rn) | |
1285 | +{ | |
1286 | + iwmmxt_load_reg(cpu_V1, rn); | |
1287 | + tcg_gen_and_i64(cpu_M0, cpu_M0, cpu_V1); | |
1288 | +} | |
1289 | + | |
1290 | +static inline void gen_op_iwmmxt_xorq_M0_wRn(int rn) | |
1291 | +{ | |
1292 | + iwmmxt_load_reg(cpu_V1, rn); | |
1293 | + tcg_gen_xor_i64(cpu_M0, cpu_M0, cpu_V1); | |
1294 | +} | |
1295 | + | |
1296 | +#define IWMMXT_OP(name) \ | |
1297 | +static inline void gen_op_iwmmxt_##name##_M0_wRn(int rn) \ | |
1298 | +{ \ | |
1299 | + iwmmxt_load_reg(cpu_V1, rn); \ | |
1300 | + gen_helper_iwmmxt_##name(cpu_M0, cpu_M0, cpu_V1); \ | |
1301 | +} | |
1302 | + | |
1303 | +#define IWMMXT_OP_ENV(name) \ | |
1304 | +static inline void gen_op_iwmmxt_##name##_M0_wRn(int rn) \ | |
1305 | +{ \ | |
1306 | + iwmmxt_load_reg(cpu_V1, rn); \ | |
1307 | + gen_helper_iwmmxt_##name(cpu_M0, cpu_env, cpu_M0, cpu_V1); \ | |
1308 | +} | |
1309 | + | |
1310 | +#define IWMMXT_OP_ENV_SIZE(name) \ | |
1311 | +IWMMXT_OP_ENV(name##b) \ | |
1312 | +IWMMXT_OP_ENV(name##w) \ | |
1313 | +IWMMXT_OP_ENV(name##l) | |
1314 | + | |
1315 | +#define IWMMXT_OP_ENV1(name) \ | |
1316 | +static inline void gen_op_iwmmxt_##name##_M0(void) \ | |
1317 | +{ \ | |
1318 | + gen_helper_iwmmxt_##name(cpu_M0, cpu_env, cpu_M0); \ | |
1319 | +} | |
1320 | + | |
1321 | +IWMMXT_OP(maddsq) | |
1322 | +IWMMXT_OP(madduq) | |
1323 | +IWMMXT_OP(sadb) | |
1324 | +IWMMXT_OP(sadw) | |
1325 | +IWMMXT_OP(mulslw) | |
1326 | +IWMMXT_OP(mulshw) | |
1327 | +IWMMXT_OP(mululw) | |
1328 | +IWMMXT_OP(muluhw) | |
1329 | +IWMMXT_OP(macsw) | |
1330 | +IWMMXT_OP(macuw) | |
1331 | + | |
1332 | +IWMMXT_OP_ENV_SIZE(unpackl) | |
1333 | +IWMMXT_OP_ENV_SIZE(unpackh) | |
1334 | + | |
1335 | +IWMMXT_OP_ENV1(unpacklub) | |
1336 | +IWMMXT_OP_ENV1(unpackluw) | |
1337 | +IWMMXT_OP_ENV1(unpacklul) | |
1338 | +IWMMXT_OP_ENV1(unpackhub) | |
1339 | +IWMMXT_OP_ENV1(unpackhuw) | |
1340 | +IWMMXT_OP_ENV1(unpackhul) | |
1341 | +IWMMXT_OP_ENV1(unpacklsb) | |
1342 | +IWMMXT_OP_ENV1(unpacklsw) | |
1343 | +IWMMXT_OP_ENV1(unpacklsl) | |
1344 | +IWMMXT_OP_ENV1(unpackhsb) | |
1345 | +IWMMXT_OP_ENV1(unpackhsw) | |
1346 | +IWMMXT_OP_ENV1(unpackhsl) | |
1347 | + | |
1348 | +IWMMXT_OP_ENV_SIZE(cmpeq) | |
1349 | +IWMMXT_OP_ENV_SIZE(cmpgtu) | |
1350 | +IWMMXT_OP_ENV_SIZE(cmpgts) | |
1351 | + | |
1352 | +IWMMXT_OP_ENV_SIZE(mins) | |
1353 | +IWMMXT_OP_ENV_SIZE(minu) | |
1354 | +IWMMXT_OP_ENV_SIZE(maxs) | |
1355 | +IWMMXT_OP_ENV_SIZE(maxu) | |
1356 | + | |
1357 | +IWMMXT_OP_ENV_SIZE(subn) | |
1358 | +IWMMXT_OP_ENV_SIZE(addn) | |
1359 | +IWMMXT_OP_ENV_SIZE(subu) | |
1360 | +IWMMXT_OP_ENV_SIZE(addu) | |
1361 | +IWMMXT_OP_ENV_SIZE(subs) | |
1362 | +IWMMXT_OP_ENV_SIZE(adds) | |
1363 | + | |
1364 | +IWMMXT_OP_ENV(avgb0) | |
1365 | +IWMMXT_OP_ENV(avgb1) | |
1366 | +IWMMXT_OP_ENV(avgw0) | |
1367 | +IWMMXT_OP_ENV(avgw1) | |
1368 | + | |
1369 | +IWMMXT_OP(msadb) | |
1370 | + | |
1371 | +IWMMXT_OP_ENV(packuw) | |
1372 | +IWMMXT_OP_ENV(packul) | |
1373 | +IWMMXT_OP_ENV(packuq) | |
1374 | +IWMMXT_OP_ENV(packsw) | |
1375 | +IWMMXT_OP_ENV(packsl) | |
1376 | +IWMMXT_OP_ENV(packsq) | |
1377 | + | |
1378 | +static inline void gen_op_iwmmxt_muladdsl_M0_T0_T1(void) | |
1379 | +{ | |
1380 | + gen_helper_iwmmxt_muladdsl(cpu_M0, cpu_M0, cpu_T[0], cpu_T[1]); | |
1381 | +} | |
1382 | + | |
1383 | +static inline void gen_op_iwmmxt_muladdsw_M0_T0_T1(void) | |
1384 | +{ | |
1385 | + gen_helper_iwmmxt_muladdsw(cpu_M0, cpu_M0, cpu_T[0], cpu_T[1]); | |
1386 | +} | |
1387 | + | |
1388 | +static inline void gen_op_iwmmxt_muladdswl_M0_T0_T1(void) | |
1389 | +{ | |
1390 | + gen_helper_iwmmxt_muladdswl(cpu_M0, cpu_M0, cpu_T[0], cpu_T[1]); | |
1391 | +} | |
1392 | + | |
1393 | +static inline void gen_op_iwmmxt_align_M0_T0_wRn(int rn) | |
1394 | +{ | |
1395 | + iwmmxt_load_reg(cpu_V1, rn); | |
1396 | + gen_helper_iwmmxt_align(cpu_M0, cpu_M0, cpu_V1, cpu_T[0]); | |
1397 | +} | |
1398 | + | |
1399 | +static inline void gen_op_iwmmxt_insr_M0_T0_T1(int shift) | |
1400 | +{ | |
1401 | + TCGv tmp = tcg_const_i32(shift); | |
1402 | + gen_helper_iwmmxt_insr(cpu_M0, cpu_M0, cpu_T[0], cpu_T[1], tmp); | |
1403 | +} | |
1404 | + | |
1405 | +static inline void gen_op_iwmmxt_extrsb_T0_M0(int shift) | |
1406 | +{ | |
1407 | + tcg_gen_shri_i64(cpu_M0, cpu_M0, shift); | |
1408 | + tcg_gen_trunc_i64_i32(cpu_T[0], cpu_M0); | |
1409 | + tcg_gen_ext8s_i32(cpu_T[0], cpu_T[0]); | |
1410 | +} | |
1411 | + | |
1412 | +static inline void gen_op_iwmmxt_extrsw_T0_M0(int shift) | |
1413 | +{ | |
1414 | + tcg_gen_shri_i64(cpu_M0, cpu_M0, shift); | |
1415 | + tcg_gen_trunc_i64_i32(cpu_T[0], cpu_M0); | |
1416 | + tcg_gen_ext16s_i32(cpu_T[0], cpu_T[0]); | |
1417 | +} | |
1418 | + | |
1419 | +static inline void gen_op_iwmmxt_extru_T0_M0(int shift, uint32_t mask) | |
1420 | +{ | |
1421 | + tcg_gen_shri_i64(cpu_M0, cpu_M0, shift); | |
1422 | + tcg_gen_trunc_i64_i32(cpu_T[0], cpu_M0); | |
1423 | + if (mask != ~0u) | |
1424 | + tcg_gen_andi_i32(cpu_T[0], cpu_T[0], mask); | |
1425 | +} | |
1426 | + | |
1427 | +static void gen_op_iwmmxt_set_mup(void) | |
1428 | +{ | |
1429 | + TCGv tmp; | |
1430 | + tmp = load_cpu_field(iwmmxt.cregs[ARM_IWMMXT_wCon]); | |
1431 | + tcg_gen_ori_i32(tmp, tmp, 2); | |
1432 | + store_cpu_field(tmp, iwmmxt.cregs[ARM_IWMMXT_wCon]); | |
1433 | +} | |
1434 | + | |
1435 | +static void gen_op_iwmmxt_set_cup(void) | |
1436 | +{ | |
1437 | + TCGv tmp; | |
1438 | + tmp = load_cpu_field(iwmmxt.cregs[ARM_IWMMXT_wCon]); | |
1439 | + tcg_gen_ori_i32(tmp, tmp, 1); | |
1440 | + store_cpu_field(tmp, iwmmxt.cregs[ARM_IWMMXT_wCon]); | |
1441 | +} | |
1442 | + | |
1443 | +static void gen_op_iwmmxt_setpsr_nz(void) | |
1444 | +{ | |
1445 | + TCGv tmp = new_tmp(); | |
1446 | + gen_helper_iwmmxt_setpsr_nz(tmp, cpu_M0); | |
1447 | + store_cpu_field(tmp, iwmmxt.cregs[ARM_IWMMXT_wCASF]); | |
1448 | +} | |
1449 | + | |
1450 | +static inline void gen_op_iwmmxt_addl_M0_wRn(int rn) | |
1451 | +{ | |
1452 | + iwmmxt_load_reg(cpu_V1, rn); | |
1453 | + tcg_gen_andi_i64(cpu_V1, cpu_V1, 0xffffffffu); | |
1454 | + tcg_gen_add_i64(cpu_M0, cpu_M0, cpu_V1); | |
1455 | +} | |
1456 | + | |
1457 | + | |
1458 | +static void gen_iwmmxt_movl_T0_T1_wRn(int rn) | |
1459 | +{ | |
1460 | + iwmmxt_load_reg(cpu_V0, rn); | |
1461 | + tcg_gen_trunc_i64_i32(cpu_T[0], cpu_V0); | |
1462 | + tcg_gen_shri_i64(cpu_V0, cpu_V0, 32); | |
1463 | + tcg_gen_trunc_i64_i32(cpu_T[1], cpu_V0); | |
1464 | +} | |
1465 | + | |
1466 | +static void gen_iwmmxt_movl_wRn_T0_T1(int rn) | |
1467 | +{ | |
1468 | + tcg_gen_extu_i32_i64(cpu_V0, cpu_T[0]); | |
1469 | + tcg_gen_extu_i32_i64(cpu_V1, cpu_T[0]); | |
1470 | + tcg_gen_shli_i64(cpu_V1, cpu_V1, 32); | |
1471 | + tcg_gen_or_i64(cpu_V0, cpu_V0, cpu_V1); | |
1472 | + iwmmxt_store_reg(cpu_V0, rn); | |
1473 | +} | |
1474 | + | |
1237 | 1475 | static inline int gen_iwmmxt_address(DisasContext *s, uint32_t insn) |
1238 | 1476 | { |
1239 | 1477 | int rd; |
... | ... | @@ -1275,7 +1513,7 @@ static inline int gen_iwmmxt_shift(uint32_t insn, uint32_t mask) |
1275 | 1513 | else |
1276 | 1514 | gen_op_iwmmxt_movl_T0_wCx(rd); |
1277 | 1515 | else |
1278 | - gen_op_iwmmxt_movl_T0_T1_wRn(rd); | |
1516 | + gen_iwmmxt_movl_T0_T1_wRn(rd); | |
1279 | 1517 | |
1280 | 1518 | gen_op_movl_T1_im(mask); |
1281 | 1519 | gen_op_andl_T0_T1(); |
... | ... | @@ -1296,13 +1534,13 @@ static int disas_iwmmxt_insn(CPUState *env, DisasContext *s, uint32_t insn) |
1296 | 1534 | rdlo = (insn >> 12) & 0xf; |
1297 | 1535 | rdhi = (insn >> 16) & 0xf; |
1298 | 1536 | if (insn & ARM_CP_RW_BIT) { /* TMRRC */ |
1299 | - gen_op_iwmmxt_movl_T0_T1_wRn(wrd); | |
1537 | + gen_iwmmxt_movl_T0_T1_wRn(wrd); | |
1300 | 1538 | gen_movl_reg_T0(s, rdlo); |
1301 | 1539 | gen_movl_reg_T1(s, rdhi); |
1302 | 1540 | } else { /* TMCRR */ |
1303 | 1541 | gen_movl_T0_reg(s, rdlo); |
1304 | 1542 | gen_movl_T1_reg(s, rdhi); |
1305 | - gen_op_iwmmxt_movl_wRn_T0_T1(wrd); | |
1543 | + gen_iwmmxt_movl_wRn_T0_T1(wrd); | |
1306 | 1544 | gen_op_iwmmxt_set_mup(); |
1307 | 1545 | } |
1308 | 1546 | return 0; |
... | ... | @@ -1318,16 +1556,25 @@ static int disas_iwmmxt_insn(CPUState *env, DisasContext *s, uint32_t insn) |
1318 | 1556 | dead_tmp(tmp); |
1319 | 1557 | gen_op_iwmmxt_movl_wCx_T0(wrd); |
1320 | 1558 | } else { |
1321 | - if (insn & (1 << 8)) | |
1322 | - if (insn & (1 << 22)) /* WLDRD */ | |
1323 | - gen_ldst(iwmmxt_ldq, s); | |
1324 | - else /* WLDRW wRd */ | |
1325 | - gen_ldst(iwmmxt_ldl, s); | |
1326 | - else | |
1327 | - if (insn & (1 << 22)) /* WLDRH */ | |
1328 | - gen_ldst(iwmmxt_ldw, s); | |
1329 | - else /* WLDRB */ | |
1330 | - gen_ldst(iwmmxt_ldb, s); | |
1559 | + i = 1; | |
1560 | + if (insn & (1 << 8)) { | |
1561 | + if (insn & (1 << 22)) { /* WLDRD */ | |
1562 | + tcg_gen_qemu_ld64(cpu_M0, cpu_T[1], IS_USER(s)); | |
1563 | + i = 0; | |
1564 | + } else { /* WLDRW wRd */ | |
1565 | + tmp = gen_ld32(cpu_T[1], IS_USER(s)); | |
1566 | + } | |
1567 | + } else { | |
1568 | + if (insn & (1 << 22)) { /* WLDRH */ | |
1569 | + tmp = gen_ld16u(cpu_T[1], IS_USER(s)); | |
1570 | + } else { /* WLDRB */ | |
1571 | + tmp = gen_ld8u(cpu_T[1], IS_USER(s)); | |
1572 | + } | |
1573 | + } | |
1574 | + if (i) { | |
1575 | + tcg_gen_extu_i32_i64(cpu_M0, tmp); | |
1576 | + dead_tmp(tmp); | |
1577 | + } | |
1331 | 1578 | gen_op_iwmmxt_movq_wRn_M0(wrd); |
1332 | 1579 | } |
1333 | 1580 | } else { |
... | ... | @@ -1338,16 +1585,24 @@ static int disas_iwmmxt_insn(CPUState *env, DisasContext *s, uint32_t insn) |
1338 | 1585 | gen_st32(tmp, cpu_T[1], IS_USER(s)); |
1339 | 1586 | } else { |
1340 | 1587 | gen_op_iwmmxt_movq_M0_wRn(wrd); |
1341 | - if (insn & (1 << 8)) | |
1342 | - if (insn & (1 << 22)) /* WSTRD */ | |
1343 | - gen_ldst(iwmmxt_stq, s); | |
1344 | - else /* WSTRW wRd */ | |
1345 | - gen_ldst(iwmmxt_stl, s); | |
1346 | - else | |
1347 | - if (insn & (1 << 22)) /* WSTRH */ | |
1348 | - gen_ldst(iwmmxt_ldw, s); | |
1349 | - else /* WSTRB */ | |
1350 | - gen_ldst(iwmmxt_stb, s); | |
1588 | + tmp = new_tmp(); | |
1589 | + if (insn & (1 << 8)) { | |
1590 | + if (insn & (1 << 22)) { /* WSTRD */ | |
1591 | + dead_tmp(tmp); | |
1592 | + tcg_gen_qemu_st64(cpu_M0, cpu_T[1], IS_USER(s)); | |
1593 | + } else { /* WSTRW wRd */ | |
1594 | + tcg_gen_trunc_i64_i32(tmp, cpu_M0); | |
1595 | + gen_st32(tmp, cpu_T[1], IS_USER(s)); | |
1596 | + } | |
1597 | + } else { | |
1598 | + if (insn & (1 << 22)) { /* WSTRH */ | |
1599 | + tcg_gen_trunc_i64_i32(tmp, cpu_M0); | |
1600 | + gen_st16(tmp, cpu_T[1], IS_USER(s)); | |
1601 | + } else { /* WSTRB */ | |
1602 | + tcg_gen_trunc_i64_i32(tmp, cpu_M0); | |
1603 | + gen_st8(tmp, cpu_T[1], IS_USER(s)); | |
1604 | + } | |
1605 | + } | |
1351 | 1606 | } |
1352 | 1607 | } |
1353 | 1608 | return 0; |
... | ... | @@ -1422,7 +1677,7 @@ static int disas_iwmmxt_insn(CPUState *env, DisasContext *s, uint32_t insn) |
1422 | 1677 | rd0 = (insn >> 0) & 0xf; |
1423 | 1678 | rd1 = (insn >> 16) & 0xf; |
1424 | 1679 | gen_op_iwmmxt_movq_M0_wRn(rd0); |
1425 | - gen_op_iwmmxt_negq_M0(); | |
1680 | + tcg_gen_neg_i64(cpu_M0, cpu_M0); | |
1426 | 1681 | gen_op_iwmmxt_andq_M0_wRn(rd1); |
1427 | 1682 | gen_op_iwmmxt_setpsr_nz(); |
1428 | 1683 | gen_op_iwmmxt_movq_wRn_M0(wrd); |
... | ... | @@ -1515,10 +1770,17 @@ static int disas_iwmmxt_insn(CPUState *env, DisasContext *s, uint32_t insn) |
1515 | 1770 | rd0 = (insn >> 16) & 0xf; |
1516 | 1771 | rd1 = (insn >> 0) & 0xf; |
1517 | 1772 | gen_op_iwmmxt_movq_M0_wRn(rd0); |
1518 | - if (insn & (1 << 21)) | |
1519 | - gen_op_iwmmxt_mulsw_M0_wRn(rd1, (insn & (1 << 20)) ? 16 : 0); | |
1520 | - else | |
1521 | - gen_op_iwmmxt_muluw_M0_wRn(rd1, (insn & (1 << 20)) ? 16 : 0); | |
1773 | + if (insn & (1 << 21)) { | |
1774 | + if (insn & (1 << 20)) | |
1775 | + gen_op_iwmmxt_mulshw_M0_wRn(rd1); | |
1776 | + else | |
1777 | + gen_op_iwmmxt_mulslw_M0_wRn(rd1); | |
1778 | + } else { | |
1779 | + if (insn & (1 << 20)) | |
1780 | + gen_op_iwmmxt_muluhw_M0_wRn(rd1); | |
1781 | + else | |
1782 | + gen_op_iwmmxt_mululw_M0_wRn(rd1); | |
1783 | + } | |
1522 | 1784 | gen_op_iwmmxt_movq_wRn_M0(wrd); |
1523 | 1785 | gen_op_iwmmxt_set_mup(); |
1524 | 1786 | break; |
... | ... | @@ -1532,10 +1794,8 @@ static int disas_iwmmxt_insn(CPUState *env, DisasContext *s, uint32_t insn) |
1532 | 1794 | else |
1533 | 1795 | gen_op_iwmmxt_macuw_M0_wRn(rd1); |
1534 | 1796 | if (!(insn & (1 << 20))) { |
1535 | - if (insn & (1 << 21)) | |
1536 | - gen_op_iwmmxt_addsq_M0_wRn(wrd); | |
1537 | - else | |
1538 | - gen_op_iwmmxt_adduq_M0_wRn(wrd); | |
1797 | + iwmmxt_load_reg(cpu_V1, wrd); | |
1798 | + tcg_gen_add_i64(cpu_M0, cpu_M0, cpu_V1); | |
1539 | 1799 | } |
1540 | 1800 | gen_op_iwmmxt_movq_wRn_M0(wrd); |
1541 | 1801 | gen_op_iwmmxt_set_mup(); |
... | ... | @@ -1567,10 +1827,17 @@ static int disas_iwmmxt_insn(CPUState *env, DisasContext *s, uint32_t insn) |
1567 | 1827 | rd0 = (insn >> 16) & 0xf; |
1568 | 1828 | rd1 = (insn >> 0) & 0xf; |
1569 | 1829 | gen_op_iwmmxt_movq_M0_wRn(rd0); |
1570 | - if (insn & (1 << 22)) | |
1571 | - gen_op_iwmmxt_avgw_M0_wRn(rd1, (insn >> 20) & 1); | |
1572 | - else | |
1573 | - gen_op_iwmmxt_avgb_M0_wRn(rd1, (insn >> 20) & 1); | |
1830 | + if (insn & (1 << 22)) { | |
1831 | + if (insn & (1 << 20)) | |
1832 | + gen_op_iwmmxt_avgw1_M0_wRn(rd1); | |
1833 | + else | |
1834 | + gen_op_iwmmxt_avgw0_M0_wRn(rd1); | |
1835 | + } else { | |
1836 | + if (insn & (1 << 20)) | |
1837 | + gen_op_iwmmxt_avgb1_M0_wRn(rd1); | |
1838 | + else | |
1839 | + gen_op_iwmmxt_avgb0_M0_wRn(rd1); | |
1840 | + } | |
1574 | 1841 | gen_op_iwmmxt_movq_wRn_M0(wrd); |
1575 | 1842 | gen_op_iwmmxt_set_mup(); |
1576 | 1843 | gen_op_iwmmxt_set_cup(); |
... | ... | @@ -1622,21 +1889,18 @@ static int disas_iwmmxt_insn(CPUState *env, DisasContext *s, uint32_t insn) |
1622 | 1889 | if (insn & 8) |
1623 | 1890 | gen_op_iwmmxt_extrsb_T0_M0((insn & 7) << 3); |
1624 | 1891 | else { |
1625 | - gen_op_movl_T1_im(0xff); | |
1626 | - gen_op_iwmmxt_extru_T0_M0_T1((insn & 7) << 3); | |
1892 | + gen_op_iwmmxt_extru_T0_M0((insn & 7) << 3, 0xff); | |
1627 | 1893 | } |
1628 | 1894 | break; |
1629 | 1895 | case 1: |
1630 | 1896 | if (insn & 8) |
1631 | 1897 | gen_op_iwmmxt_extrsw_T0_M0((insn & 3) << 4); |
1632 | 1898 | else { |
1633 | - gen_op_movl_T1_im(0xffff); | |
1634 | - gen_op_iwmmxt_extru_T0_M0_T1((insn & 3) << 4); | |
1899 | + gen_op_iwmmxt_extru_T0_M0((insn & 3) << 4, 0xffff); | |
1635 | 1900 | } |
1636 | 1901 | break; |
1637 | 1902 | case 2: |
1638 | - gen_op_movl_T1_im(0xffffffff); | |
1639 | - gen_op_iwmmxt_extru_T0_M0_T1((insn & 1) << 5); | |
1903 | + gen_op_iwmmxt_extru_T0_M0((insn & 1) << 5, ~0u); | |
1640 | 1904 | break; |
1641 | 1905 | case 3: |
1642 | 1906 | return 1; |
... | ... | @@ -1669,13 +1933,13 @@ static int disas_iwmmxt_insn(CPUState *env, DisasContext *s, uint32_t insn) |
1669 | 1933 | gen_movl_T0_reg(s, rd); |
1670 | 1934 | switch ((insn >> 6) & 3) { |
1671 | 1935 | case 0: |
1672 | - gen_op_iwmmxt_bcstb_M0_T0(); | |
1936 | + gen_helper_iwmmxt_bcstb(cpu_M0, cpu_T[0]); | |
1673 | 1937 | break; |
1674 | 1938 | case 1: |
1675 | - gen_op_iwmmxt_bcstw_M0_T0(); | |
1939 | + gen_helper_iwmmxt_bcstw(cpu_M0, cpu_T[0]); | |
1676 | 1940 | break; |
1677 | 1941 | case 2: |
1678 | - gen_op_iwmmxt_bcstl_M0_T0(); | |
1942 | + gen_helper_iwmmxt_bcstl(cpu_M0, cpu_T[0]); | |
1679 | 1943 | break; |
1680 | 1944 | case 3: |
1681 | 1945 | return 1; |
... | ... | @@ -1715,13 +1979,13 @@ static int disas_iwmmxt_insn(CPUState *env, DisasContext *s, uint32_t insn) |
1715 | 1979 | gen_op_iwmmxt_movq_M0_wRn(rd0); |
1716 | 1980 | switch ((insn >> 22) & 3) { |
1717 | 1981 | case 0: |
1718 | - gen_op_iwmmxt_addcb_M0(); | |
1982 | + gen_helper_iwmmxt_addcb(cpu_M0, cpu_M0); | |
1719 | 1983 | break; |
1720 | 1984 | case 1: |
1721 | - gen_op_iwmmxt_addcw_M0(); | |
1985 | + gen_helper_iwmmxt_addcw(cpu_M0, cpu_M0); | |
1722 | 1986 | break; |
1723 | 1987 | case 2: |
1724 | - gen_op_iwmmxt_addcl_M0(); | |
1988 | + gen_helper_iwmmxt_addcl(cpu_M0, cpu_M0); | |
1725 | 1989 | break; |
1726 | 1990 | case 3: |
1727 | 1991 | return 1; |
... | ... | @@ -1763,13 +2027,13 @@ static int disas_iwmmxt_insn(CPUState *env, DisasContext *s, uint32_t insn) |
1763 | 2027 | gen_op_iwmmxt_movq_M0_wRn(rd0); |
1764 | 2028 | switch ((insn >> 22) & 3) { |
1765 | 2029 | case 0: |
1766 | - gen_op_iwmmxt_msbb_T0_M0(); | |
2030 | + gen_helper_iwmmxt_msbb(cpu_T[0], cpu_M0); | |
1767 | 2031 | break; |
1768 | 2032 | case 1: |
1769 | - gen_op_iwmmxt_msbw_T0_M0(); | |
2033 | + gen_helper_iwmmxt_msbw(cpu_T[0], cpu_M0); | |
1770 | 2034 | break; |
1771 | 2035 | case 2: |
1772 | - gen_op_iwmmxt_msbl_T0_M0(); | |
2036 | + gen_helper_iwmmxt_msbl(cpu_T[0], cpu_M0); | |
1773 | 2037 | break; |
1774 | 2038 | case 3: |
1775 | 2039 | return 1; |
... | ... | @@ -1881,13 +2145,13 @@ static int disas_iwmmxt_insn(CPUState *env, DisasContext *s, uint32_t insn) |
1881 | 2145 | case 0: |
1882 | 2146 | return 1; |
1883 | 2147 | case 1: |
1884 | - gen_op_iwmmxt_srlw_M0_T0(); | |
2148 | + gen_helper_iwmmxt_srlw(cpu_M0, cpu_env, cpu_M0, cpu_T[0]); | |
1885 | 2149 | break; |
1886 | 2150 | case 2: |
1887 | - gen_op_iwmmxt_srll_M0_T0(); | |
2151 | + gen_helper_iwmmxt_srll(cpu_M0, cpu_env, cpu_M0, cpu_T[0]); | |
1888 | 2152 | break; |
1889 | 2153 | case 3: |
1890 | - gen_op_iwmmxt_srlq_M0_T0(); | |
2154 | + gen_helper_iwmmxt_srlq(cpu_M0, cpu_env, cpu_M0, cpu_T[0]); | |
1891 | 2155 | break; |
1892 | 2156 | } |
1893 | 2157 | gen_op_iwmmxt_movq_wRn_M0(wrd); |
... | ... | @@ -1905,13 +2169,13 @@ static int disas_iwmmxt_insn(CPUState *env, DisasContext *s, uint32_t insn) |
1905 | 2169 | case 0: |
1906 | 2170 | return 1; |
1907 | 2171 | case 1: |
1908 | - gen_op_iwmmxt_sraw_M0_T0(); | |
2172 | + gen_helper_iwmmxt_sraw(cpu_M0, cpu_env, cpu_M0, cpu_T[0]); | |
1909 | 2173 | break; |
1910 | 2174 | case 2: |
1911 | - gen_op_iwmmxt_sral_M0_T0(); | |
2175 | + gen_helper_iwmmxt_sral(cpu_M0, cpu_env, cpu_M0, cpu_T[0]); | |
1912 | 2176 | break; |
1913 | 2177 | case 3: |
1914 | - gen_op_iwmmxt_sraq_M0_T0(); | |
2178 | + gen_helper_iwmmxt_sraq(cpu_M0, cpu_env, cpu_M0, cpu_T[0]); | |
1915 | 2179 | break; |
1916 | 2180 | } |
1917 | 2181 | gen_op_iwmmxt_movq_wRn_M0(wrd); |
... | ... | @@ -1929,13 +2193,13 @@ static int disas_iwmmxt_insn(CPUState *env, DisasContext *s, uint32_t insn) |
1929 | 2193 | case 0: |
1930 | 2194 | return 1; |
1931 | 2195 | case 1: |
1932 | - gen_op_iwmmxt_sllw_M0_T0(); | |
2196 | + gen_helper_iwmmxt_sllw(cpu_M0, cpu_env, cpu_M0, cpu_T[0]); | |
1933 | 2197 | break; |
1934 | 2198 | case 2: |
1935 | - gen_op_iwmmxt_slll_M0_T0(); | |
2199 | + gen_helper_iwmmxt_slll(cpu_M0, cpu_env, cpu_M0, cpu_T[0]); | |
1936 | 2200 | break; |
1937 | 2201 | case 3: |
1938 | - gen_op_iwmmxt_sllq_M0_T0(); | |
2202 | + gen_helper_iwmmxt_sllq(cpu_M0, cpu_env, cpu_M0, cpu_T[0]); | |
1939 | 2203 | break; |
1940 | 2204 | } |
1941 | 2205 | gen_op_iwmmxt_movq_wRn_M0(wrd); |
... | ... | @@ -1953,17 +2217,17 @@ static int disas_iwmmxt_insn(CPUState *env, DisasContext *s, uint32_t insn) |
1953 | 2217 | case 1: |
1954 | 2218 | if (gen_iwmmxt_shift(insn, 0xf)) |
1955 | 2219 | return 1; |
1956 | - gen_op_iwmmxt_rorw_M0_T0(); | |
2220 | + gen_helper_iwmmxt_rorw(cpu_M0, cpu_env, cpu_M0, cpu_T[0]); | |
1957 | 2221 | break; |
1958 | 2222 | case 2: |
1959 | 2223 | if (gen_iwmmxt_shift(insn, 0x1f)) |
1960 | 2224 | return 1; |
1961 | - gen_op_iwmmxt_rorl_M0_T0(); | |
2225 | + gen_helper_iwmmxt_rorl(cpu_M0, cpu_env, cpu_M0, cpu_T[0]); | |
1962 | 2226 | break; |
1963 | 2227 | case 3: |
1964 | 2228 | if (gen_iwmmxt_shift(insn, 0x3f)) |
1965 | 2229 | return 1; |
1966 | - gen_op_iwmmxt_rorq_M0_T0(); | |
2230 | + gen_helper_iwmmxt_rorq(cpu_M0, cpu_env, cpu_M0, cpu_T[0]); | |
1967 | 2231 | break; |
1968 | 2232 | } |
1969 | 2233 | gen_op_iwmmxt_movq_wRn_M0(wrd); |
... | ... | @@ -2094,7 +2358,7 @@ static int disas_iwmmxt_insn(CPUState *env, DisasContext *s, uint32_t insn) |
2094 | 2358 | rd0 = (insn >> 16) & 0xf; |
2095 | 2359 | gen_op_iwmmxt_movq_M0_wRn(rd0); |
2096 | 2360 | gen_op_movl_T0_im(((insn >> 16) & 0xf0) | (insn & 0x0f)); |
2097 | - gen_op_iwmmxt_shufh_M0_T0(); | |
2361 | + gen_helper_iwmmxt_shufh(cpu_M0, cpu_env, cpu_M0, cpu_T[0]); | |
2098 | 2362 | gen_op_iwmmxt_movq_wRn_M0(wrd); |
2099 | 2363 | gen_op_iwmmxt_set_mup(); |
2100 | 2364 | gen_op_iwmmxt_set_cup(); |
... | ... | @@ -2279,7 +2543,7 @@ static int disas_dsp_insn(CPUState *env, DisasContext *s, uint32_t insn) |
2279 | 2543 | return 1; |
2280 | 2544 | |
2281 | 2545 | if (insn & ARM_CP_RW_BIT) { /* MRA */ |
2282 | - gen_op_iwmmxt_movl_T0_T1_wRn(acc); | |
2546 | + gen_iwmmxt_movl_T0_T1_wRn(acc); | |
2283 | 2547 | gen_movl_reg_T0(s, rdlo); |
2284 | 2548 | gen_op_movl_T0_im((1 << (40 - 32)) - 1); |
2285 | 2549 | gen_op_andl_T0_T1(); |
... | ... | @@ -2287,7 +2551,7 @@ static int disas_dsp_insn(CPUState *env, DisasContext *s, uint32_t insn) |
2287 | 2551 | } else { /* MAR */ |
2288 | 2552 | gen_movl_T0_reg(s, rdlo); |
2289 | 2553 | gen_movl_T1_reg(s, rdhi); |
2290 | - gen_op_iwmmxt_movl_wRn_T0_T1(acc); | |
2554 | + gen_iwmmxt_movl_wRn_T0_T1(acc); | |
2291 | 2555 | } |
2292 | 2556 | return 0; |
2293 | 2557 | } |
... | ... | @@ -8322,6 +8586,8 @@ static inline int gen_intermediate_code_internal(CPUState *env, |
8322 | 8586 | cpu_F1d = tcg_temp_new(TCG_TYPE_I64); |
8323 | 8587 | cpu_V0 = cpu_F0d; |
8324 | 8588 | cpu_V1 = cpu_F1d; |
8589 | + /* FIXME: cpu_M0 can probably be the same as cpu_V0. */ | |
8590 | + cpu_M0 = tcg_temp_new(TCG_TYPE_I64); | |
8325 | 8591 | next_page_start = (pc_start & TARGET_PAGE_MASK) + TARGET_PAGE_SIZE; |
8326 | 8592 | lj = -1; |
8327 | 8593 | /* Reset the conditional execution bits immediately. This avoids | ... | ... |