]>
Commit | Line | Data |
---|---|---|
5af45186 | 1 | /* |
222a3336 | 2 | * MMX/3DNow!/SSE/SSE2/SSE3/SSSE3/SSE4/PNI support |
5af45186 FB |
3 | * |
4 | * Copyright (c) 2005 Fabrice Bellard | |
5 | * | |
6 | * This library is free software; you can redistribute it and/or | |
7 | * modify it under the terms of the GNU Lesser General Public | |
8 | * License as published by the Free Software Foundation; either | |
d9ff33ad | 9 | * version 2.1 of the License, or (at your option) any later version. |
5af45186 FB |
10 | * |
11 | * This library is distributed in the hope that it will be useful, | |
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
14 | * Lesser General Public License for more details. | |
15 | * | |
16 | * You should have received a copy of the GNU Lesser General Public | |
8167ee88 | 17 | * License along with this library; if not, see <http://www.gnu.org/licenses/>. |
5af45186 FB |
18 | */ |
19 | #if SHIFT == 0 | |
20 | #define Reg MMXReg | |
21 | #define SUFFIX _mmx | |
22 | #else | |
fa451874 | 23 | #define Reg ZMMReg |
b98f886c | 24 | #if SHIFT == 1 |
5af45186 | 25 | #define SUFFIX _xmm |
b98f886c PB |
26 | #else |
27 | #define SUFFIX _ymm | |
28 | #endif | |
5af45186 FB |
29 | #endif |
30 | ||
a7812ae4 | 31 | #define dh_alias_Reg ptr |
fa451874 | 32 | #define dh_alias_ZMMReg ptr |
a7812ae4 PB |
33 | #define dh_alias_MMXReg ptr |
34 | #define dh_ctype_Reg Reg * | |
fa451874 | 35 | #define dh_ctype_ZMMReg ZMMReg * |
a7812ae4 | 36 | #define dh_ctype_MMXReg MMXReg * |
8929906e RH |
37 | #define dh_typecode_Reg dh_typecode_ptr |
38 | #define dh_typecode_ZMMReg dh_typecode_ptr | |
39 | #define dh_typecode_MMXReg dh_typecode_ptr | |
a7812ae4 | 40 | |
f05f9789 PB |
41 | DEF_HELPER_4(glue(psrlw, SUFFIX), void, env, Reg, Reg, Reg) |
42 | DEF_HELPER_4(glue(psraw, SUFFIX), void, env, Reg, Reg, Reg) | |
43 | DEF_HELPER_4(glue(psllw, SUFFIX), void, env, Reg, Reg, Reg) | |
44 | DEF_HELPER_4(glue(psrld, SUFFIX), void, env, Reg, Reg, Reg) | |
45 | DEF_HELPER_4(glue(psrad, SUFFIX), void, env, Reg, Reg, Reg) | |
46 | DEF_HELPER_4(glue(pslld, SUFFIX), void, env, Reg, Reg, Reg) | |
47 | DEF_HELPER_4(glue(psrlq, SUFFIX), void, env, Reg, Reg, Reg) | |
48 | DEF_HELPER_4(glue(psllq, SUFFIX), void, env, Reg, Reg, Reg) | |
5af45186 | 49 | |
30f41921 | 50 | #if SHIFT >= 1 |
f05f9789 PB |
51 | DEF_HELPER_4(glue(psrldq, SUFFIX), void, env, Reg, Reg, Reg) |
52 | DEF_HELPER_4(glue(pslldq, SUFFIX), void, env, Reg, Reg, Reg) | |
5af45186 FB |
53 | #endif |
54 | ||
55 | #define SSE_HELPER_B(name, F)\ | |
f05f9789 | 56 | DEF_HELPER_4(glue(name, SUFFIX), void, env, Reg, Reg, Reg) |
5af45186 FB |
57 | |
58 | #define SSE_HELPER_W(name, F)\ | |
f05f9789 | 59 | DEF_HELPER_4(glue(name, SUFFIX), void, env, Reg, Reg, Reg) |
5af45186 FB |
60 | |
61 | #define SSE_HELPER_L(name, F)\ | |
f05f9789 | 62 | DEF_HELPER_4(glue(name, SUFFIX), void, env, Reg, Reg, Reg) |
5af45186 FB |
63 | |
64 | #define SSE_HELPER_Q(name, F)\ | |
f05f9789 | 65 | DEF_HELPER_4(glue(name, SUFFIX), void, env, Reg, Reg, Reg) |
5af45186 | 66 | |
5af45186 | 67 | #if SHIFT == 0 |
30f41921 | 68 | DEF_HELPER_3(glue(pmulhrw, SUFFIX), void, env, Reg, Reg) |
5af45186 | 69 | #endif |
a7812ae4 PB |
70 | SSE_HELPER_W(pmulhuw, FMULHUW) |
71 | SSE_HELPER_W(pmulhw, FMULHW) | |
5af45186 | 72 | |
a7812ae4 PB |
73 | SSE_HELPER_B(pavgb, FAVG) |
74 | SSE_HELPER_W(pavgw, FAVG) | |
5af45186 | 75 | |
f05f9789 PB |
76 | DEF_HELPER_4(glue(pmuludq, SUFFIX), void, env, Reg, Reg, Reg) |
77 | DEF_HELPER_4(glue(pmaddwd, SUFFIX), void, env, Reg, Reg, Reg) | |
5af45186 | 78 | |
f05f9789 | 79 | DEF_HELPER_4(glue(psadbw, SUFFIX), void, env, Reg, Reg, Reg) |
30f41921 | 80 | #if SHIFT < 2 |
d3eb5eae | 81 | DEF_HELPER_4(glue(maskmov, SUFFIX), void, env, Reg, Reg, tl) |
30f41921 | 82 | #endif |
5af45186 FB |
83 | |
84 | #if SHIFT == 0 | |
a7812ae4 | 85 | DEF_HELPER_3(glue(pshufw, SUFFIX), void, Reg, Reg, int) |
5af45186 | 86 | #else |
a7812ae4 PB |
87 | DEF_HELPER_3(glue(pshufd, SUFFIX), void, Reg, Reg, int) |
88 | DEF_HELPER_3(glue(pshuflw, SUFFIX), void, Reg, Reg, int) | |
89 | DEF_HELPER_3(glue(pshufhw, SUFFIX), void, Reg, Reg, int) | |
5af45186 FB |
90 | #endif |
91 | ||
30f41921 | 92 | #if SHIFT >= 1 |
5af45186 FB |
93 | /* FPU ops */ |
94 | /* XXX: not accurate */ | |
95 | ||
30f41921 | 96 | #define SSE_HELPER_P4(name) \ |
f05f9789 PB |
97 | DEF_HELPER_4(glue(name ## ps, SUFFIX), void, env, Reg, Reg, Reg) \ |
98 | DEF_HELPER_4(glue(name ## pd, SUFFIX), void, env, Reg, Reg, Reg) | |
30f41921 PB |
99 | |
100 | #define SSE_HELPER_P3(name, ...) \ | |
101 | DEF_HELPER_3(glue(name ## ps, SUFFIX), void, env, Reg, Reg) \ | |
102 | DEF_HELPER_3(glue(name ## pd, SUFFIX), void, env, Reg, Reg) | |
103 | ||
104 | #if SHIFT == 1 | |
105 | #define SSE_HELPER_S4(name) \ | |
106 | SSE_HELPER_P4(name) \ | |
f05f9789 PB |
107 | DEF_HELPER_4(name ## ss, void, env, Reg, Reg, Reg) \ |
108 | DEF_HELPER_4(name ## sd, void, env, Reg, Reg, Reg) | |
30f41921 PB |
109 | #define SSE_HELPER_S3(name) \ |
110 | SSE_HELPER_P3(name) \ | |
620f7556 PB |
111 | DEF_HELPER_4(name ## ss, void, env, Reg, Reg, Reg) \ |
112 | DEF_HELPER_4(name ## sd, void, env, Reg, Reg, Reg) | |
30f41921 PB |
113 | #else |
114 | #define SSE_HELPER_S4(name, ...) SSE_HELPER_P4(name) | |
115 | #define SSE_HELPER_S3(name, ...) SSE_HELPER_P3(name) | |
116 | #endif | |
117 | ||
f05f9789 PB |
118 | DEF_HELPER_4(glue(shufps, SUFFIX), void, Reg, Reg, Reg, int) |
119 | DEF_HELPER_4(glue(shufpd, SUFFIX), void, Reg, Reg, Reg, int) | |
437a88a5 | 120 | |
30f41921 PB |
121 | SSE_HELPER_S4(add) |
122 | SSE_HELPER_S4(sub) | |
123 | SSE_HELPER_S4(mul) | |
124 | SSE_HELPER_S4(div) | |
125 | SSE_HELPER_S4(min) | |
126 | SSE_HELPER_S4(max) | |
437a88a5 | 127 | |
30f41921 | 128 | SSE_HELPER_S3(sqrt) |
437a88a5 | 129 | |
ce4fa29f PB |
130 | DEF_HELPER_3(glue(cvtps2pd, SUFFIX), void, env, Reg, Reg) |
131 | DEF_HELPER_3(glue(cvtpd2ps, SUFFIX), void, env, Reg, Reg) | |
ce4fa29f PB |
132 | DEF_HELPER_3(glue(cvtdq2ps, SUFFIX), void, env, Reg, Reg) |
133 | DEF_HELPER_3(glue(cvtdq2pd, SUFFIX), void, env, Reg, Reg) | |
30f41921 PB |
134 | |
135 | DEF_HELPER_3(glue(cvtps2dq, SUFFIX), void, env, ZMMReg, ZMMReg) | |
136 | DEF_HELPER_3(glue(cvtpd2dq, SUFFIX), void, env, ZMMReg, ZMMReg) | |
137 | ||
138 | DEF_HELPER_3(glue(cvttps2dq, SUFFIX), void, env, ZMMReg, ZMMReg) | |
139 | DEF_HELPER_3(glue(cvttpd2dq, SUFFIX), void, env, ZMMReg, ZMMReg) | |
140 | ||
141 | #if SHIFT == 1 | |
620f7556 PB |
142 | DEF_HELPER_4(cvtss2sd, void, env, Reg, Reg, Reg) |
143 | DEF_HELPER_4(cvtsd2ss, void, env, Reg, Reg, Reg) | |
fa451874 EH |
144 | DEF_HELPER_3(cvtpi2ps, void, env, ZMMReg, MMXReg) |
145 | DEF_HELPER_3(cvtpi2pd, void, env, ZMMReg, MMXReg) | |
146 | DEF_HELPER_3(cvtsi2ss, void, env, ZMMReg, i32) | |
147 | DEF_HELPER_3(cvtsi2sd, void, env, ZMMReg, i32) | |
5af45186 FB |
148 | |
149 | #ifdef TARGET_X86_64 | |
fa451874 EH |
150 | DEF_HELPER_3(cvtsq2ss, void, env, ZMMReg, i64) |
151 | DEF_HELPER_3(cvtsq2sd, void, env, ZMMReg, i64) | |
5af45186 FB |
152 | #endif |
153 | ||
fa451874 EH |
154 | DEF_HELPER_3(cvtps2pi, void, env, MMXReg, ZMMReg) |
155 | DEF_HELPER_3(cvtpd2pi, void, env, MMXReg, ZMMReg) | |
156 | DEF_HELPER_2(cvtss2si, s32, env, ZMMReg) | |
157 | DEF_HELPER_2(cvtsd2si, s32, env, ZMMReg) | |
5af45186 | 158 | #ifdef TARGET_X86_64 |
fa451874 EH |
159 | DEF_HELPER_2(cvtss2sq, s64, env, ZMMReg) |
160 | DEF_HELPER_2(cvtsd2sq, s64, env, ZMMReg) | |
5af45186 FB |
161 | #endif |
162 | ||
fa451874 EH |
163 | DEF_HELPER_3(cvttps2pi, void, env, MMXReg, ZMMReg) |
164 | DEF_HELPER_3(cvttpd2pi, void, env, MMXReg, ZMMReg) | |
165 | DEF_HELPER_2(cvttss2si, s32, env, ZMMReg) | |
166 | DEF_HELPER_2(cvttsd2si, s32, env, ZMMReg) | |
5af45186 | 167 | #ifdef TARGET_X86_64 |
fa451874 EH |
168 | DEF_HELPER_2(cvttss2sq, s64, env, ZMMReg) |
169 | DEF_HELPER_2(cvttsd2sq, s64, env, ZMMReg) | |
5af45186 | 170 | #endif |
30f41921 | 171 | #endif |
5af45186 | 172 | |
ce4fa29f | 173 | DEF_HELPER_3(glue(rsqrtps, SUFFIX), void, env, ZMMReg, ZMMReg) |
ce4fa29f | 174 | DEF_HELPER_3(glue(rcpps, SUFFIX), void, env, ZMMReg, ZMMReg) |
f05f9789 | 175 | |
30f41921 | 176 | #if SHIFT == 1 |
620f7556 PB |
177 | DEF_HELPER_4(rsqrtss, void, env, ZMMReg, ZMMReg, ZMMReg) |
178 | DEF_HELPER_4(rcpss, void, env, ZMMReg, ZMMReg, ZMMReg) | |
fa451874 EH |
179 | DEF_HELPER_3(extrq_r, void, env, ZMMReg, ZMMReg) |
180 | DEF_HELPER_4(extrq_i, void, env, ZMMReg, int, int) | |
181 | DEF_HELPER_3(insertq_r, void, env, ZMMReg, ZMMReg) | |
ca4b1b43 | 182 | DEF_HELPER_5(insertq_i, void, env, ZMMReg, ZMMReg, int, int) |
30f41921 PB |
183 | #endif |
184 | ||
185 | SSE_HELPER_P4(hadd) | |
186 | SSE_HELPER_P4(hsub) | |
187 | SSE_HELPER_P4(addsub) | |
188 | ||
189 | #define SSE_HELPER_CMP(name, F, C) SSE_HELPER_S4(name) | |
437a88a5 | 190 | |
cbf4ad54 PB |
191 | SSE_HELPER_CMP(cmpeq, FPU_CMPQ, FPU_EQ) |
192 | SSE_HELPER_CMP(cmplt, FPU_CMPS, FPU_LT) | |
193 | SSE_HELPER_CMP(cmple, FPU_CMPS, FPU_LE) | |
194 | SSE_HELPER_CMP(cmpunord, FPU_CMPQ, FPU_UNORD) | |
195 | SSE_HELPER_CMP(cmpneq, FPU_CMPQ, !FPU_EQ) | |
196 | SSE_HELPER_CMP(cmpnlt, FPU_CMPS, !FPU_LT) | |
197 | SSE_HELPER_CMP(cmpnle, FPU_CMPS, !FPU_LE) | |
198 | SSE_HELPER_CMP(cmpord, FPU_CMPQ, !FPU_UNORD) | |
437a88a5 | 199 | |
6e0cac78 PB |
200 | SSE_HELPER_CMP(cmpequ, FPU_CMPQ, FPU_EQU) |
201 | SSE_HELPER_CMP(cmpnge, FPU_CMPS, !FPU_GE) | |
202 | SSE_HELPER_CMP(cmpngt, FPU_CMPS, !FPU_GT) | |
203 | SSE_HELPER_CMP(cmpfalse, FPU_CMPQ, FPU_FALSE) | |
204 | SSE_HELPER_CMP(cmpnequ, FPU_CMPQ, !FPU_EQU) | |
205 | SSE_HELPER_CMP(cmpge, FPU_CMPS, FPU_GE) | |
206 | SSE_HELPER_CMP(cmpgt, FPU_CMPS, FPU_GT) | |
207 | SSE_HELPER_CMP(cmptrue, FPU_CMPQ, !FPU_FALSE) | |
208 | ||
209 | SSE_HELPER_CMP(cmpeqs, FPU_CMPS, FPU_EQ) | |
210 | SSE_HELPER_CMP(cmpltq, FPU_CMPQ, FPU_LT) | |
211 | SSE_HELPER_CMP(cmpleq, FPU_CMPQ, FPU_LE) | |
212 | SSE_HELPER_CMP(cmpunords, FPU_CMPS, FPU_UNORD) | |
213 | SSE_HELPER_CMP(cmpneqq, FPU_CMPS, !FPU_EQ) | |
214 | SSE_HELPER_CMP(cmpnltq, FPU_CMPQ, !FPU_LT) | |
215 | SSE_HELPER_CMP(cmpnleq, FPU_CMPQ, !FPU_LE) | |
216 | SSE_HELPER_CMP(cmpords, FPU_CMPS, !FPU_UNORD) | |
217 | ||
218 | SSE_HELPER_CMP(cmpequs, FPU_CMPS, FPU_EQU) | |
219 | SSE_HELPER_CMP(cmpngeq, FPU_CMPQ, !FPU_GE) | |
220 | SSE_HELPER_CMP(cmpngtq, FPU_CMPQ, !FPU_GT) | |
221 | SSE_HELPER_CMP(cmpfalses, FPU_CMPS, FPU_FALSE) | |
222 | SSE_HELPER_CMP(cmpnequs, FPU_CMPS, !FPU_EQU) | |
223 | SSE_HELPER_CMP(cmpgeq, FPU_CMPQ, FPU_GE) | |
224 | SSE_HELPER_CMP(cmpgtq, FPU_CMPQ, FPU_GT) | |
225 | SSE_HELPER_CMP(cmptrues, FPU_CMPS, !FPU_FALSE) | |
226 | ||
30f41921 | 227 | #if SHIFT == 1 |
d3eb5eae BS |
228 | DEF_HELPER_3(ucomiss, void, env, Reg, Reg) |
229 | DEF_HELPER_3(comiss, void, env, Reg, Reg) | |
230 | DEF_HELPER_3(ucomisd, void, env, Reg, Reg) | |
231 | DEF_HELPER_3(comisd, void, env, Reg, Reg) | |
30f41921 PB |
232 | #endif |
233 | ||
ce4fa29f PB |
234 | DEF_HELPER_2(glue(movmskps, SUFFIX), i32, env, Reg) |
235 | DEF_HELPER_2(glue(movmskpd, SUFFIX), i32, env, Reg) | |
5af45186 FB |
236 | #endif |
237 | ||
f05f9789 PB |
238 | DEF_HELPER_4(glue(packsswb, SUFFIX), void, env, Reg, Reg, Reg) |
239 | DEF_HELPER_4(glue(packuswb, SUFFIX), void, env, Reg, Reg, Reg) | |
240 | DEF_HELPER_4(glue(packssdw, SUFFIX), void, env, Reg, Reg, Reg) | |
241 | #define UNPCK_OP(name, base) \ | |
242 | DEF_HELPER_4(glue(punpck ## name ## bw, SUFFIX), void, env, Reg, Reg, Reg) \ | |
243 | DEF_HELPER_4(glue(punpck ## name ## wd, SUFFIX), void, env, Reg, Reg, Reg) \ | |
244 | DEF_HELPER_4(glue(punpck ## name ## dq, SUFFIX), void, env, Reg, Reg, Reg) | |
5af45186 | 245 | |
437a88a5 FB |
246 | UNPCK_OP(l, 0) |
247 | UNPCK_OP(h, 1) | |
5af45186 | 248 | |
30f41921 | 249 | #if SHIFT >= 1 |
f05f9789 PB |
250 | DEF_HELPER_4(glue(punpcklqdq, SUFFIX), void, env, Reg, Reg, Reg) |
251 | DEF_HELPER_4(glue(punpckhqdq, SUFFIX), void, env, Reg, Reg, Reg) | |
5af45186 FB |
252 | #endif |
253 | ||
254 | /* 3DNow! float ops */ | |
255 | #if SHIFT == 0 | |
d3eb5eae BS |
256 | DEF_HELPER_3(pi2fd, void, env, MMXReg, MMXReg) |
257 | DEF_HELPER_3(pi2fw, void, env, MMXReg, MMXReg) | |
258 | DEF_HELPER_3(pf2id, void, env, MMXReg, MMXReg) | |
259 | DEF_HELPER_3(pf2iw, void, env, MMXReg, MMXReg) | |
260 | DEF_HELPER_3(pfacc, void, env, MMXReg, MMXReg) | |
261 | DEF_HELPER_3(pfadd, void, env, MMXReg, MMXReg) | |
262 | DEF_HELPER_3(pfcmpeq, void, env, MMXReg, MMXReg) | |
263 | DEF_HELPER_3(pfcmpge, void, env, MMXReg, MMXReg) | |
264 | DEF_HELPER_3(pfcmpgt, void, env, MMXReg, MMXReg) | |
265 | DEF_HELPER_3(pfmax, void, env, MMXReg, MMXReg) | |
266 | DEF_HELPER_3(pfmin, void, env, MMXReg, MMXReg) | |
267 | DEF_HELPER_3(pfmul, void, env, MMXReg, MMXReg) | |
268 | DEF_HELPER_3(pfnacc, void, env, MMXReg, MMXReg) | |
269 | DEF_HELPER_3(pfpnacc, void, env, MMXReg, MMXReg) | |
270 | DEF_HELPER_3(pfrcp, void, env, MMXReg, MMXReg) | |
271 | DEF_HELPER_3(pfrsqrt, void, env, MMXReg, MMXReg) | |
272 | DEF_HELPER_3(pfsub, void, env, MMXReg, MMXReg) | |
273 | DEF_HELPER_3(pfsubr, void, env, MMXReg, MMXReg) | |
274 | DEF_HELPER_3(pswapd, void, env, MMXReg, MMXReg) | |
5af45186 FB |
275 | #endif |
276 | ||
4242b1bd | 277 | /* SSSE3 op helpers */ |
f05f9789 PB |
278 | DEF_HELPER_4(glue(phaddw, SUFFIX), void, env, Reg, Reg, Reg) |
279 | DEF_HELPER_4(glue(phaddd, SUFFIX), void, env, Reg, Reg, Reg) | |
280 | DEF_HELPER_4(glue(phaddsw, SUFFIX), void, env, Reg, Reg, Reg) | |
281 | DEF_HELPER_4(glue(phsubw, SUFFIX), void, env, Reg, Reg, Reg) | |
282 | DEF_HELPER_4(glue(phsubd, SUFFIX), void, env, Reg, Reg, Reg) | |
283 | DEF_HELPER_4(glue(phsubsw, SUFFIX), void, env, Reg, Reg, Reg) | |
f05f9789 PB |
284 | DEF_HELPER_4(glue(pmaddubsw, SUFFIX), void, env, Reg, Reg, Reg) |
285 | DEF_HELPER_4(glue(pmulhrsw, SUFFIX), void, env, Reg, Reg, Reg) | |
286 | DEF_HELPER_4(glue(pshufb, SUFFIX), void, env, Reg, Reg, Reg) | |
287 | DEF_HELPER_4(glue(psignb, SUFFIX), void, env, Reg, Reg, Reg) | |
288 | DEF_HELPER_4(glue(psignw, SUFFIX), void, env, Reg, Reg, Reg) | |
289 | DEF_HELPER_4(glue(psignd, SUFFIX), void, env, Reg, Reg, Reg) | |
a64eee3a | 290 | DEF_HELPER_5(glue(palignr, SUFFIX), void, env, Reg, Reg, Reg, i32) |
4242b1bd | 291 | |
222a3336 | 292 | /* SSE4.1 op helpers */ |
30f41921 | 293 | #if SHIFT >= 1 |
f05f9789 PB |
294 | DEF_HELPER_5(glue(pblendvb, SUFFIX), void, env, Reg, Reg, Reg, Reg) |
295 | DEF_HELPER_5(glue(blendvps, SUFFIX), void, env, Reg, Reg, Reg, Reg) | |
296 | DEF_HELPER_5(glue(blendvpd, SUFFIX), void, env, Reg, Reg, Reg, Reg) | |
d3eb5eae BS |
297 | DEF_HELPER_3(glue(ptest, SUFFIX), void, env, Reg, Reg) |
298 | DEF_HELPER_3(glue(pmovsxbw, SUFFIX), void, env, Reg, Reg) | |
299 | DEF_HELPER_3(glue(pmovsxbd, SUFFIX), void, env, Reg, Reg) | |
300 | DEF_HELPER_3(glue(pmovsxbq, SUFFIX), void, env, Reg, Reg) | |
301 | DEF_HELPER_3(glue(pmovsxwd, SUFFIX), void, env, Reg, Reg) | |
302 | DEF_HELPER_3(glue(pmovsxwq, SUFFIX), void, env, Reg, Reg) | |
303 | DEF_HELPER_3(glue(pmovsxdq, SUFFIX), void, env, Reg, Reg) | |
304 | DEF_HELPER_3(glue(pmovzxbw, SUFFIX), void, env, Reg, Reg) | |
305 | DEF_HELPER_3(glue(pmovzxbd, SUFFIX), void, env, Reg, Reg) | |
306 | DEF_HELPER_3(glue(pmovzxbq, SUFFIX), void, env, Reg, Reg) | |
307 | DEF_HELPER_3(glue(pmovzxwd, SUFFIX), void, env, Reg, Reg) | |
308 | DEF_HELPER_3(glue(pmovzxwq, SUFFIX), void, env, Reg, Reg) | |
309 | DEF_HELPER_3(glue(pmovzxdq, SUFFIX), void, env, Reg, Reg) | |
7170a17e PB |
310 | DEF_HELPER_3(glue(pmovsldup, SUFFIX), void, env, Reg, Reg) |
311 | DEF_HELPER_3(glue(pmovshdup, SUFFIX), void, env, Reg, Reg) | |
312 | DEF_HELPER_3(glue(pmovdldup, SUFFIX), void, env, Reg, Reg) | |
f05f9789 | 313 | DEF_HELPER_4(glue(pmuldq, SUFFIX), void, env, Reg, Reg, Reg) |
f05f9789 | 314 | DEF_HELPER_4(glue(packusdw, SUFFIX), void, env, Reg, Reg, Reg) |
30f41921 | 315 | #if SHIFT == 1 |
d3eb5eae | 316 | DEF_HELPER_3(glue(phminposuw, SUFFIX), void, env, Reg, Reg) |
30f41921 | 317 | #endif |
d3eb5eae BS |
318 | DEF_HELPER_4(glue(roundps, SUFFIX), void, env, Reg, Reg, i32) |
319 | DEF_HELPER_4(glue(roundpd, SUFFIX), void, env, Reg, Reg, i32) | |
30f41921 | 320 | #if SHIFT == 1 |
620f7556 PB |
321 | DEF_HELPER_5(roundss_xmm, void, env, Reg, Reg, Reg, i32) |
322 | DEF_HELPER_5(roundsd_xmm, void, env, Reg, Reg, Reg, i32) | |
30f41921 | 323 | #endif |
f05f9789 PB |
324 | DEF_HELPER_5(glue(blendps, SUFFIX), void, env, Reg, Reg, Reg, i32) |
325 | DEF_HELPER_5(glue(blendpd, SUFFIX), void, env, Reg, Reg, Reg, i32) | |
326 | DEF_HELPER_5(glue(pblendw, SUFFIX), void, env, Reg, Reg, Reg, i32) | |
327 | DEF_HELPER_5(glue(dpps, SUFFIX), void, env, Reg, Reg, Reg, i32) | |
30f41921 | 328 | #if SHIFT == 1 |
f05f9789 | 329 | DEF_HELPER_5(glue(dppd, SUFFIX), void, env, Reg, Reg, Reg, i32) |
30f41921 | 330 | #endif |
f05f9789 | 331 | DEF_HELPER_5(glue(mpsadbw, SUFFIX), void, env, Reg, Reg, Reg, i32) |
222a3336 AZ |
332 | #endif |
333 | ||
334 | /* SSE4.2 op helpers */ | |
30f41921 | 335 | #if SHIFT == 1 |
d3eb5eae BS |
336 | DEF_HELPER_4(glue(pcmpestri, SUFFIX), void, env, Reg, Reg, i32) |
337 | DEF_HELPER_4(glue(pcmpestrm, SUFFIX), void, env, Reg, Reg, i32) | |
338 | DEF_HELPER_4(glue(pcmpistri, SUFFIX), void, env, Reg, Reg, i32) | |
339 | DEF_HELPER_4(glue(pcmpistrm, SUFFIX), void, env, Reg, Reg, i32) | |
a7812ae4 | 340 | DEF_HELPER_3(crc32, tl, i32, tl, i32) |
222a3336 AZ |
341 | #endif |
342 | ||
e71827bc | 343 | /* AES-NI op helpers */ |
30f41921 | 344 | #if SHIFT >= 1 |
f05f9789 PB |
345 | DEF_HELPER_4(glue(aesdec, SUFFIX), void, env, Reg, Reg, Reg) |
346 | DEF_HELPER_4(glue(aesdeclast, SUFFIX), void, env, Reg, Reg, Reg) | |
347 | DEF_HELPER_4(glue(aesenc, SUFFIX), void, env, Reg, Reg, Reg) | |
348 | DEF_HELPER_4(glue(aesenclast, SUFFIX), void, env, Reg, Reg, Reg) | |
30f41921 | 349 | #if SHIFT == 1 |
d640045a AJ |
350 | DEF_HELPER_3(glue(aesimc, SUFFIX), void, env, Reg, Reg) |
351 | DEF_HELPER_4(glue(aeskeygenassist, SUFFIX), void, env, Reg, Reg, i32) | |
30f41921 | 352 | #endif |
f05f9789 | 353 | DEF_HELPER_5(glue(pclmulqdq, SUFFIX), void, env, Reg, Reg, Reg, i32) |
e71827bc AJ |
354 | #endif |
355 | ||
cf5ec664 PB |
356 | /* F16C helpers */ |
357 | #if SHIFT >= 1 | |
358 | DEF_HELPER_3(glue(cvtph2ps, SUFFIX), void, env, Reg, Reg) | |
359 | DEF_HELPER_4(glue(cvtps2ph, SUFFIX), void, env, Reg, Reg, int) | |
360 | #endif | |
361 | ||
2872b0f3 PB |
362 | /* FMA3 helpers */ |
363 | #if SHIFT == 1 | |
364 | DEF_HELPER_6(fma4ss, void, env, Reg, Reg, Reg, Reg, int) | |
365 | DEF_HELPER_6(fma4sd, void, env, Reg, Reg, Reg, Reg, int) | |
366 | #endif | |
367 | ||
368 | #if SHIFT >= 1 | |
369 | DEF_HELPER_7(glue(fma4ps, SUFFIX), void, env, Reg, Reg, Reg, Reg, int, int) | |
370 | DEF_HELPER_7(glue(fma4pd, SUFFIX), void, env, Reg, Reg, Reg, Reg, int, int) | |
371 | #endif | |
372 | ||
79068477 PB |
373 | /* AVX helpers */ |
374 | #if SHIFT >= 1 | |
16fc5726 PB |
375 | DEF_HELPER_4(glue(vpermilpd, SUFFIX), void, env, Reg, Reg, Reg) |
376 | DEF_HELPER_4(glue(vpermilps, SUFFIX), void, env, Reg, Reg, Reg) | |
79068477 PB |
377 | DEF_HELPER_3(glue(vpermilpd_imm, SUFFIX), void, Reg, Reg, i32) |
378 | DEF_HELPER_3(glue(vpermilps_imm, SUFFIX), void, Reg, Reg, i32) | |
16fc5726 PB |
379 | DEF_HELPER_4(glue(vpsrlvd, SUFFIX), void, env, Reg, Reg, Reg) |
380 | DEF_HELPER_4(glue(vpsravd, SUFFIX), void, env, Reg, Reg, Reg) | |
381 | DEF_HELPER_4(glue(vpsllvd, SUFFIX), void, env, Reg, Reg, Reg) | |
382 | DEF_HELPER_4(glue(vpsrlvq, SUFFIX), void, env, Reg, Reg, Reg) | |
383 | DEF_HELPER_4(glue(vpsravq, SUFFIX), void, env, Reg, Reg, Reg) | |
384 | DEF_HELPER_4(glue(vpsllvq, SUFFIX), void, env, Reg, Reg, Reg) | |
385 | DEF_HELPER_3(glue(vtestps, SUFFIX), void, env, Reg, Reg) | |
386 | DEF_HELPER_3(glue(vtestpd, SUFFIX), void, env, Reg, Reg) | |
387 | DEF_HELPER_4(glue(vpmaskmovd_st, SUFFIX), void, env, Reg, Reg, tl) | |
388 | DEF_HELPER_4(glue(vpmaskmovq_st, SUFFIX), void, env, Reg, Reg, tl) | |
389 | DEF_HELPER_4(glue(vpmaskmovd, SUFFIX), void, env, Reg, Reg, Reg) | |
390 | DEF_HELPER_4(glue(vpmaskmovq, SUFFIX), void, env, Reg, Reg, Reg) | |
391 | DEF_HELPER_6(glue(vpgatherdd, SUFFIX), void, env, Reg, Reg, Reg, tl, i32) | |
392 | DEF_HELPER_6(glue(vpgatherdq, SUFFIX), void, env, Reg, Reg, Reg, tl, i32) | |
393 | DEF_HELPER_6(glue(vpgatherqd, SUFFIX), void, env, Reg, Reg, Reg, tl, i32) | |
394 | DEF_HELPER_6(glue(vpgatherqq, SUFFIX), void, env, Reg, Reg, Reg, tl, i32) | |
79068477 | 395 | #if SHIFT == 2 |
16fc5726 | 396 | DEF_HELPER_3(vpermd_ymm, void, Reg, Reg, Reg) |
79068477 PB |
397 | DEF_HELPER_4(vpermdq_ymm, void, Reg, Reg, Reg, i32) |
398 | DEF_HELPER_3(vpermq_ymm, void, Reg, Reg, i32) | |
399 | #endif | |
400 | #endif | |
401 | ||
5af45186 FB |
402 | #undef SHIFT |
403 | #undef Reg | |
404 | #undef SUFFIX | |
405 | ||
406 | #undef SSE_HELPER_B | |
407 | #undef SSE_HELPER_W | |
408 | #undef SSE_HELPER_L | |
409 | #undef SSE_HELPER_Q | |
30f41921 PB |
410 | #undef SSE_HELPER_S3 |
411 | #undef SSE_HELPER_S4 | |
412 | #undef SSE_HELPER_P3 | |
413 | #undef SSE_HELPER_P4 | |
5af45186 FB |
414 | #undef SSE_HELPER_CMP |
415 | #undef UNPCK_OP |