]> git.proxmox.com Git - mirror_qemu.git/blame - target-i386/ops_sse_header.h
Improve pflash cfi01 debug messages (Thomas Petazzoni).
[mirror_qemu.git] / target-i386 / ops_sse_header.h
CommitLineData
5af45186 1/*
4242b1bd 2 * MMX/3DNow!/SSE/SSE2/SSE3/SSSE3/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
9 * version 2 of the License, or (at your option) any later version.
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
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19 */
20#if SHIFT == 0
21#define Reg MMXReg
22#define SUFFIX _mmx
23#else
24#define Reg XMMReg
25#define SUFFIX _xmm
26#endif
27
437a88a5
FB
28DEF_HELPER(void, glue(helper_psrlw, SUFFIX), (Reg *d, Reg *s))
29DEF_HELPER(void, glue(helper_psraw, SUFFIX), (Reg *d, Reg *s))
30DEF_HELPER(void, glue(helper_psllw, SUFFIX), (Reg *d, Reg *s))
31DEF_HELPER(void, glue(helper_psrld, SUFFIX), (Reg *d, Reg *s))
32DEF_HELPER(void, glue(helper_psrad, SUFFIX), (Reg *d, Reg *s))
33DEF_HELPER(void, glue(helper_pslld, SUFFIX), (Reg *d, Reg *s))
34DEF_HELPER(void, glue(helper_psrlq, SUFFIX), (Reg *d, Reg *s))
35DEF_HELPER(void, glue(helper_psllq, SUFFIX), (Reg *d, Reg *s))
5af45186
FB
36
37#if SHIFT == 1
437a88a5
FB
38DEF_HELPER(void, glue(helper_psrldq, SUFFIX), (Reg *d, Reg *s))
39DEF_HELPER(void, glue(helper_pslldq, SUFFIX), (Reg *d, Reg *s))
5af45186
FB
40#endif
41
42#define SSE_HELPER_B(name, F)\
437a88a5 43 DEF_HELPER(void, glue(name, SUFFIX), (Reg *d, Reg *s))
5af45186
FB
44
45#define SSE_HELPER_W(name, F)\
437a88a5 46 DEF_HELPER(void, glue(name, SUFFIX), (Reg *d, Reg *s))
5af45186
FB
47
48#define SSE_HELPER_L(name, F)\
437a88a5 49 DEF_HELPER(void, glue(name, SUFFIX), (Reg *d, Reg *s))
5af45186
FB
50
51#define SSE_HELPER_Q(name, F)\
437a88a5 52 DEF_HELPER(void, glue(name, SUFFIX), (Reg *d, Reg *s))
5af45186 53
437a88a5
FB
54SSE_HELPER_B(helper_paddb, FADD)
55SSE_HELPER_W(helper_paddw, FADD)
56SSE_HELPER_L(helper_paddl, FADD)
57SSE_HELPER_Q(helper_paddq, FADD)
5af45186 58
437a88a5
FB
59SSE_HELPER_B(helper_psubb, FSUB)
60SSE_HELPER_W(helper_psubw, FSUB)
61SSE_HELPER_L(helper_psubl, FSUB)
62SSE_HELPER_Q(helper_psubq, FSUB)
5af45186 63
437a88a5
FB
64SSE_HELPER_B(helper_paddusb, FADDUB)
65SSE_HELPER_B(helper_paddsb, FADDSB)
66SSE_HELPER_B(helper_psubusb, FSUBUB)
67SSE_HELPER_B(helper_psubsb, FSUBSB)
5af45186 68
437a88a5
FB
69SSE_HELPER_W(helper_paddusw, FADDUW)
70SSE_HELPER_W(helper_paddsw, FADDSW)
71SSE_HELPER_W(helper_psubusw, FSUBUW)
72SSE_HELPER_W(helper_psubsw, FSUBSW)
5af45186 73
437a88a5
FB
74SSE_HELPER_B(helper_pminub, FMINUB)
75SSE_HELPER_B(helper_pmaxub, FMAXUB)
5af45186 76
437a88a5
FB
77SSE_HELPER_W(helper_pminsw, FMINSW)
78SSE_HELPER_W(helper_pmaxsw, FMAXSW)
5af45186 79
437a88a5
FB
80SSE_HELPER_Q(helper_pand, FAND)
81SSE_HELPER_Q(helper_pandn, FANDN)
82SSE_HELPER_Q(helper_por, FOR)
83SSE_HELPER_Q(helper_pxor, FXOR)
5af45186 84
437a88a5
FB
85SSE_HELPER_B(helper_pcmpgtb, FCMPGTB)
86SSE_HELPER_W(helper_pcmpgtw, FCMPGTW)
87SSE_HELPER_L(helper_pcmpgtl, FCMPGTL)
5af45186 88
437a88a5
FB
89SSE_HELPER_B(helper_pcmpeqb, FCMPEQ)
90SSE_HELPER_W(helper_pcmpeqw, FCMPEQ)
91SSE_HELPER_L(helper_pcmpeql, FCMPEQ)
5af45186 92
437a88a5 93SSE_HELPER_W(helper_pmullw, FMULLW)
5af45186 94#if SHIFT == 0
437a88a5 95SSE_HELPER_W(helper_pmulhrw, FMULHRW)
5af45186 96#endif
437a88a5
FB
97SSE_HELPER_W(helper_pmulhuw, FMULHUW)
98SSE_HELPER_W(helper_pmulhw, FMULHW)
5af45186 99
437a88a5
FB
100SSE_HELPER_B(helper_pavgb, FAVG)
101SSE_HELPER_W(helper_pavgw, FAVG)
5af45186 102
437a88a5
FB
103DEF_HELPER(void, glue(helper_pmuludq, SUFFIX) , (Reg *d, Reg *s))
104DEF_HELPER(void, glue(helper_pmaddwd, SUFFIX) , (Reg *d, Reg *s))
5af45186 105
437a88a5
FB
106DEF_HELPER(void, glue(helper_psadbw, SUFFIX) , (Reg *d, Reg *s))
107DEF_HELPER(void, glue(helper_maskmov, SUFFIX) , (Reg *d, Reg *s, target_ulong a0))
108DEF_HELPER(void, glue(helper_movl_mm_T0, SUFFIX) , (Reg *d, uint32_t val))
5af45186 109#ifdef TARGET_X86_64
437a88a5 110DEF_HELPER(void, glue(helper_movq_mm_T0, SUFFIX) , (Reg *d, uint64_t val))
5af45186
FB
111#endif
112
113#if SHIFT == 0
437a88a5 114DEF_HELPER(void, glue(helper_pshufw, SUFFIX) , (Reg *d, Reg *s, int order))
5af45186 115#else
437a88a5
FB
116DEF_HELPER(void, helper_shufps, (Reg *d, Reg *s, int order))
117DEF_HELPER(void, helper_shufpd, (Reg *d, Reg *s, int order))
118DEF_HELPER(void, glue(helper_pshufd, SUFFIX) , (Reg *d, Reg *s, int order))
119DEF_HELPER(void, glue(helper_pshuflw, SUFFIX) , (Reg *d, Reg *s, int order))
120DEF_HELPER(void, glue(helper_pshufhw, SUFFIX) , (Reg *d, Reg *s, int order))
5af45186
FB
121#endif
122
123#if SHIFT == 1
124/* FPU ops */
125/* XXX: not accurate */
126
127#define SSE_HELPER_S(name, F)\
437a88a5
FB
128 DEF_HELPER(void, helper_ ## name ## ps , (Reg *d, Reg *s)) \
129 DEF_HELPER(void, helper_ ## name ## ss , (Reg *d, Reg *s)) \
130 DEF_HELPER(void, helper_ ## name ## pd , (Reg *d, Reg *s)) \
131 DEF_HELPER(void, helper_ ## name ## sd , (Reg *d, Reg *s))
132
133SSE_HELPER_S(add, FPU_ADD)
134SSE_HELPER_S(sub, FPU_SUB)
135SSE_HELPER_S(mul, FPU_MUL)
136SSE_HELPER_S(div, FPU_DIV)
137SSE_HELPER_S(min, FPU_MIN)
138SSE_HELPER_S(max, FPU_MAX)
139SSE_HELPER_S(sqrt, FPU_SQRT)
140
141
142DEF_HELPER(void, helper_cvtps2pd, (Reg *d, Reg *s))
143DEF_HELPER(void, helper_cvtpd2ps, (Reg *d, Reg *s))
144DEF_HELPER(void, helper_cvtss2sd, (Reg *d, Reg *s))
145DEF_HELPER(void, helper_cvtsd2ss, (Reg *d, Reg *s))
146DEF_HELPER(void, helper_cvtdq2ps, (Reg *d, Reg *s))
147DEF_HELPER(void, helper_cvtdq2pd, (Reg *d, Reg *s))
148DEF_HELPER(void, helper_cvtpi2ps, (XMMReg *d, MMXReg *s))
149DEF_HELPER(void, helper_cvtpi2pd, (XMMReg *d, MMXReg *s))
150DEF_HELPER(void, helper_cvtsi2ss, (XMMReg *d, uint32_t val))
151DEF_HELPER(void, helper_cvtsi2sd, (XMMReg *d, uint32_t val))
5af45186
FB
152
153#ifdef TARGET_X86_64
437a88a5
FB
154DEF_HELPER(void, helper_cvtsq2ss, (XMMReg *d, uint64_t val))
155DEF_HELPER(void, helper_cvtsq2sd, (XMMReg *d, uint64_t val))
5af45186
FB
156#endif
157
437a88a5
FB
158DEF_HELPER(void, helper_cvtps2dq, (XMMReg *d, XMMReg *s))
159DEF_HELPER(void, helper_cvtpd2dq, (XMMReg *d, XMMReg *s))
160DEF_HELPER(void, helper_cvtps2pi, (MMXReg *d, XMMReg *s))
161DEF_HELPER(void, helper_cvtpd2pi, (MMXReg *d, XMMReg *s))
162DEF_HELPER(int32_t, helper_cvtss2si, (XMMReg *s))
163DEF_HELPER(int32_t, helper_cvtsd2si, (XMMReg *s))
5af45186 164#ifdef TARGET_X86_64
437a88a5
FB
165DEF_HELPER(int64_t, helper_cvtss2sq, (XMMReg *s))
166DEF_HELPER(int64_t, helper_cvtsd2sq, (XMMReg *s))
5af45186
FB
167#endif
168
437a88a5
FB
169DEF_HELPER(void, helper_cvttps2dq, (XMMReg *d, XMMReg *s))
170DEF_HELPER(void, helper_cvttpd2dq, (XMMReg *d, XMMReg *s))
171DEF_HELPER(void, helper_cvttps2pi, (MMXReg *d, XMMReg *s))
172DEF_HELPER(void, helper_cvttpd2pi, (MMXReg *d, XMMReg *s))
173DEF_HELPER(int32_t, helper_cvttss2si, (XMMReg *s))
174DEF_HELPER(int32_t, helper_cvttsd2si, (XMMReg *s))
5af45186 175#ifdef TARGET_X86_64
437a88a5
FB
176DEF_HELPER(int64_t, helper_cvttss2sq, (XMMReg *s))
177DEF_HELPER(int64_t, helper_cvttsd2sq, (XMMReg *s))
5af45186
FB
178#endif
179
437a88a5
FB
180DEF_HELPER(void, helper_rsqrtps, (XMMReg *d, XMMReg *s))
181DEF_HELPER(void, helper_rsqrtss, (XMMReg *d, XMMReg *s))
182DEF_HELPER(void, helper_rcpps, (XMMReg *d, XMMReg *s))
183DEF_HELPER(void, helper_rcpss, (XMMReg *d, XMMReg *s))
184DEF_HELPER(void, helper_haddps, (XMMReg *d, XMMReg *s))
185DEF_HELPER(void, helper_haddpd, (XMMReg *d, XMMReg *s))
186DEF_HELPER(void, helper_hsubps, (XMMReg *d, XMMReg *s))
187DEF_HELPER(void, helper_hsubpd, (XMMReg *d, XMMReg *s))
188DEF_HELPER(void, helper_addsubps, (XMMReg *d, XMMReg *s))
189DEF_HELPER(void, helper_addsubpd, (XMMReg *d, XMMReg *s))
5af45186
FB
190
191#define SSE_HELPER_CMP(name, F)\
437a88a5
FB
192 DEF_HELPER(void, helper_ ## name ## ps , (Reg *d, Reg *s)) \
193 DEF_HELPER(void, helper_ ## name ## ss , (Reg *d, Reg *s)) \
194 DEF_HELPER(void, helper_ ## name ## pd , (Reg *d, Reg *s)) \
195 DEF_HELPER(void, helper_ ## name ## sd , (Reg *d, Reg *s))
196
197SSE_HELPER_CMP(cmpeq, FPU_CMPEQ)
198SSE_HELPER_CMP(cmplt, FPU_CMPLT)
199SSE_HELPER_CMP(cmple, FPU_CMPLE)
200SSE_HELPER_CMP(cmpunord, FPU_CMPUNORD)
201SSE_HELPER_CMP(cmpneq, FPU_CMPNEQ)
202SSE_HELPER_CMP(cmpnlt, FPU_CMPNLT)
203SSE_HELPER_CMP(cmpnle, FPU_CMPNLE)
204SSE_HELPER_CMP(cmpord, FPU_CMPORD)
205
206DEF_HELPER(void, helper_ucomiss, (Reg *d, Reg *s))
207DEF_HELPER(void, helper_comiss, (Reg *d, Reg *s))
208DEF_HELPER(void, helper_ucomisd, (Reg *d, Reg *s))
209DEF_HELPER(void, helper_comisd, (Reg *d, Reg *s))
210DEF_HELPER(uint32_t, helper_movmskps, (Reg *s))
211DEF_HELPER(uint32_t, helper_movmskpd, (Reg *s))
5af45186
FB
212#endif
213
437a88a5
FB
214DEF_HELPER(uint32_t, glue(helper_pmovmskb, SUFFIX), (Reg *s))
215DEF_HELPER(void, glue(helper_packsswb, SUFFIX) , (Reg *d, Reg *s))
216DEF_HELPER(void, glue(helper_packuswb, SUFFIX) , (Reg *d, Reg *s))
217DEF_HELPER(void, glue(helper_packssdw, SUFFIX) , (Reg *d, Reg *s))
5af45186 218#define UNPCK_OP(base_name, base) \
437a88a5
FB
219 DEF_HELPER(void, glue(helper_punpck ## base_name ## bw, SUFFIX) , (Reg *d, Reg *s)) \
220 DEF_HELPER(void, glue(helper_punpck ## base_name ## wd, SUFFIX) , (Reg *d, Reg *s)) \
221 DEF_HELPER(void, glue(helper_punpck ## base_name ## dq, SUFFIX) , (Reg *d, Reg *s))
5af45186 222
437a88a5
FB
223UNPCK_OP(l, 0)
224UNPCK_OP(h, 1)
5af45186
FB
225
226#if SHIFT == 1
437a88a5
FB
227DEF_HELPER(void, glue(helper_punpcklqdq, SUFFIX) , (Reg *d, Reg *s))
228DEF_HELPER(void, glue(helper_punpckhqdq, SUFFIX) , (Reg *d, Reg *s))
5af45186
FB
229#endif
230
231/* 3DNow! float ops */
232#if SHIFT == 0
437a88a5
FB
233DEF_HELPER(void, helper_pi2fd, (MMXReg *d, MMXReg *s))
234DEF_HELPER(void, helper_pi2fw, (MMXReg *d, MMXReg *s))
235DEF_HELPER(void, helper_pf2id, (MMXReg *d, MMXReg *s))
236DEF_HELPER(void, helper_pf2iw, (MMXReg *d, MMXReg *s))
237DEF_HELPER(void, helper_pfacc, (MMXReg *d, MMXReg *s))
238DEF_HELPER(void, helper_pfadd, (MMXReg *d, MMXReg *s))
239DEF_HELPER(void, helper_pfcmpeq, (MMXReg *d, MMXReg *s))
240DEF_HELPER(void, helper_pfcmpge, (MMXReg *d, MMXReg *s))
241DEF_HELPER(void, helper_pfcmpgt, (MMXReg *d, MMXReg *s))
242DEF_HELPER(void, helper_pfmax, (MMXReg *d, MMXReg *s))
243DEF_HELPER(void, helper_pfmin, (MMXReg *d, MMXReg *s))
244DEF_HELPER(void, helper_pfmul, (MMXReg *d, MMXReg *s))
245DEF_HELPER(void, helper_pfnacc, (MMXReg *d, MMXReg *s))
246DEF_HELPER(void, helper_pfpnacc, (MMXReg *d, MMXReg *s))
247DEF_HELPER(void, helper_pfrcp, (MMXReg *d, MMXReg *s))
248DEF_HELPER(void, helper_pfrsqrt, (MMXReg *d, MMXReg *s))
249DEF_HELPER(void, helper_pfsub, (MMXReg *d, MMXReg *s))
250DEF_HELPER(void, helper_pfsubr, (MMXReg *d, MMXReg *s))
251DEF_HELPER(void, helper_pswapd, (MMXReg *d, MMXReg *s))
5af45186
FB
252#endif
253
4242b1bd
AZ
254/* SSSE3 op helpers */
255DEF_HELPER(void, glue(helper_phaddw, SUFFIX), (Reg *d, Reg *s))
256DEF_HELPER(void, glue(helper_phaddd, SUFFIX), (Reg *d, Reg *s))
257DEF_HELPER(void, glue(helper_phaddsw, SUFFIX), (Reg *d, Reg *s))
258DEF_HELPER(void, glue(helper_phsubw, SUFFIX), (Reg *d, Reg *s))
259DEF_HELPER(void, glue(helper_phsubd, SUFFIX), (Reg *d, Reg *s))
260DEF_HELPER(void, glue(helper_phsubsw, SUFFIX), (Reg *d, Reg *s))
261DEF_HELPER(void, glue(helper_pabsb, SUFFIX), (Reg *d, Reg *s))
262DEF_HELPER(void, glue(helper_pabsw, SUFFIX), (Reg *d, Reg *s))
263DEF_HELPER(void, glue(helper_pabsd, SUFFIX), (Reg *d, Reg *s))
264DEF_HELPER(void, glue(helper_pmaddubsw, SUFFIX), (Reg *d, Reg *s))
265DEF_HELPER(void, glue(helper_pmulhrsw, SUFFIX), (Reg *d, Reg *s))
266DEF_HELPER(void, glue(helper_pshufb, SUFFIX), (Reg *d, Reg *s))
267DEF_HELPER(void, glue(helper_psignb, SUFFIX), (Reg *d, Reg *s))
268DEF_HELPER(void, glue(helper_psignw, SUFFIX), (Reg *d, Reg *s))
269DEF_HELPER(void, glue(helper_psignd, SUFFIX), (Reg *d, Reg *s))
270DEF_HELPER(void, glue(helper_palignr, SUFFIX), (Reg *d, Reg *s, int32_t shift))
271
5af45186
FB
272#undef SHIFT
273#undef Reg
274#undef SUFFIX
275
276#undef SSE_HELPER_B
277#undef SSE_HELPER_W
278#undef SSE_HELPER_L
279#undef SSE_HELPER_Q
280#undef SSE_HELPER_S
281#undef SSE_HELPER_CMP
282#undef UNPCK_OP