1// Copyright 2012 the V8 project authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef V8_CODEGEN_X64_SSE_INSTR_H_
6#define V8_CODEGEN_X64_SSE_INSTR_H_
7
8// SSE instructions whose AVX version has two operands.
9#define SSE_UNOP_INSTRUCTION_LIST(V) \
10  V(sqrtps, 0F, 51)                  \
11  V(rsqrtps, 0F, 52)                 \
12  V(rcpps, 0F, 53)                   \
13  V(cvtps2pd, 0F, 5A)                \
14  V(cvtdq2ps, 0F, 5B)
15
16// SSE instructions whose AVX version has three operands.
17#define SSE_BINOP_INSTRUCTION_LIST(V) \
18  V(unpcklps, 0F, 14)                 \
19  V(andps, 0F, 54)                    \
20  V(andnps, 0F, 55)                   \
21  V(orps, 0F, 56)                     \
22  V(xorps, 0F, 57)                    \
23  V(addps, 0F, 58)                    \
24  V(mulps, 0F, 59)                    \
25  V(subps, 0F, 5C)                    \
26  V(minps, 0F, 5D)                    \
27  V(divps, 0F, 5E)                    \
28  V(maxps, 0F, 5F)
29
30// Instructions dealing with scalar single-precision values.
31#define SSE_INSTRUCTION_LIST_SS(V) \
32  V(sqrtss, F3, 0F, 51)            \
33  V(addss, F3, 0F, 58)             \
34  V(mulss, F3, 0F, 59)             \
35  V(cvtss2sd, F3, 0F, 5A)          \
36  V(subss, F3, 0F, 5C)             \
37  V(minss, F3, 0F, 5D)             \
38  V(divss, F3, 0F, 5E)             \
39  V(maxss, F3, 0F, 5F)
40
41// Keep sorted by last code.
42// SSE2 Instructions dealing with packed double-precision values.
43#define SSE2_INSTRUCTION_LIST_PD(V) \
44  V(andpd, 66, 0F, 54)              \
45  V(andnpd, 66, 0F, 55)             \
46  V(orpd, 66, 0F, 56)               \
47  V(xorpd, 66, 0F, 57)              \
48  V(addpd, 66, 0F, 58)              \
49  V(mulpd, 66, 0F, 59)              \
50  V(subpd, 66, 0F, 5C)              \
51  V(minpd, 66, 0F, 5D)              \
52  V(divpd, 66, 0F, 5E)              \
53  V(maxpd, 66, 0F, 5F)
54
55// SSE2 Instructions dealing with packed integer values.
56#define SSE2_INSTRUCTION_LIST_PI(V) \
57  V(punpcklbw, 66, 0F, 60)          \
58  V(punpcklwd, 66, 0F, 61)          \
59  V(punpckldq, 66, 0F, 62)          \
60  V(packsswb, 66, 0F, 63)           \
61  V(pcmpgtb, 66, 0F, 64)            \
62  V(pcmpgtw, 66, 0F, 65)            \
63  V(pcmpgtd, 66, 0F, 66)            \
64  V(packuswb, 66, 0F, 67)           \
65  V(punpckhbw, 66, 0F, 68)          \
66  V(punpckhwd, 66, 0F, 69)          \
67  V(punpckhdq, 66, 0F, 6A)          \
68  V(packssdw, 66, 0F, 6B)           \
69  V(punpcklqdq, 66, 0F, 6C)         \
70  V(punpckhqdq, 66, 0F, 6D)         \
71  V(pcmpeqb, 66, 0F, 74)            \
72  V(pcmpeqw, 66, 0F, 75)            \
73  V(pcmpeqd, 66, 0F, 76)            \
74  V(paddq, 66, 0F, D4)              \
75  V(pmullw, 66, 0F, D5)             \
76  V(psubusb, 66, 0F, D8)            \
77  V(psubusw, 66, 0F, D9)            \
78  V(pminub, 66, 0F, DA)             \
79  V(pand, 66, 0F, DB)               \
80  V(paddusb, 66, 0F, DC)            \
81  V(paddusw, 66, 0F, DD)            \
82  V(pmaxub, 66, 0F, DE)             \
83  V(pandn, 66, 0F, DF)              \
84  V(pavgb, 66, 0F, E0)              \
85  V(pavgw, 66, 0F, E3)              \
86  V(pmulhuw, 66, 0F, E4)            \
87  V(pmulhw, 66, 0F, E5)             \
88  V(psubsb, 66, 0F, E8)             \
89  V(psubsw, 66, 0F, E9)             \
90  V(pminsw, 66, 0F, EA)             \
91  V(por, 66, 0F, EB)                \
92  V(paddsb, 66, 0F, EC)             \
93  V(paddsw, 66, 0F, ED)             \
94  V(pmaxsw, 66, 0F, EE)             \
95  V(pxor, 66, 0F, EF)               \
96  V(pmuludq, 66, 0F, F4)            \
97  V(pmaddwd, 66, 0F, F5)            \
98  V(psubb, 66, 0F, F8)              \
99  V(psubw, 66, 0F, F9)              \
100  V(psubd, 66, 0F, FA)              \
101  V(psubq, 66, 0F, FB)              \
102  V(paddb, 66, 0F, FC)              \
103  V(paddw, 66, 0F, FD)              \
104  V(paddd, 66, 0F, FE)
105
106// SSE2 shift instructions with XMM register or m128 operand
107#define SSE2_INSTRUCTION_LIST_SHIFT(V) \
108  V(psrlw, 66, 0F, D1)                 \
109  V(psrld, 66, 0F, D2)                 \
110  V(psrlq, 66, 0F, D3)                 \
111  V(psraw, 66, 0F, E1)                 \
112  V(psrad, 66, 0F, E2)                 \
113  V(psllw, 66, 0F, F1)                 \
114  V(pslld, 66, 0F, F2)                 \
115  V(psllq, 66, 0F, F3)
116
117#define SSE2_INSTRUCTION_LIST(V) \
118  SSE2_INSTRUCTION_LIST_PD(V)    \
119  SSE2_INSTRUCTION_LIST_PI(V)    \
120  SSE2_INSTRUCTION_LIST_SHIFT(V)
121
122// SSE2 instructions whose AVX version has two operands.
123#define SSE2_UNOP_INSTRUCTION_LIST(V) \
124  V(ucomisd, 66, 0F, 2E)              \
125  V(sqrtpd, 66, 0F, 51)               \
126  V(cvtpd2ps, 66, 0F, 5A)             \
127  V(cvtps2dq, 66, 0F, 5B)             \
128  V(cvttpd2dq, 66, 0F, E6)
129
130// SSE2 shift instructions with an immediate operand. The last element is the
131// extension to the opcode.
132#define SSE2_INSTRUCTION_LIST_SHIFT_IMM(V) \
133  V(psrlw, 66, 0F, 71, 2)                  \
134  V(psrld, 66, 0F, 72, 2)                  \
135  V(psrlq, 66, 0F, 73, 2)                  \
136  V(psraw, 66, 0F, 71, 4)                  \
137  V(psrad, 66, 0F, 72, 4)                  \
138  V(psllw, 66, 0F, 71, 6)                  \
139  V(pslld, 66, 0F, 72, 6)                  \
140  V(psllq, 66, 0F, 73, 6)
141
142// Instructions dealing with scalar double-precision values.
143#define SSE2_INSTRUCTION_LIST_SD(V) \
144  V(sqrtsd, F2, 0F, 51)             \
145  V(addsd, F2, 0F, 58)              \
146  V(mulsd, F2, 0F, 59)              \
147  V(cvtsd2ss, F2, 0F, 5A)           \
148  V(subsd, F2, 0F, 5C)              \
149  V(minsd, F2, 0F, 5D)              \
150  V(divsd, F2, 0F, 5E)              \
151  V(maxsd, F2, 0F, 5F)
152
153#define SSSE3_INSTRUCTION_LIST(V) \
154  V(pshufb, 66, 0F, 38, 00)       \
155  V(phaddw, 66, 0F, 38, 01)       \
156  V(phaddd, 66, 0F, 38, 02)       \
157  V(pmaddubsw, 66, 0F, 38, 04)    \
158  V(psignb, 66, 0F, 38, 08)       \
159  V(psignw, 66, 0F, 38, 09)       \
160  V(psignd, 66, 0F, 38, 0A)       \
161  V(pmulhrsw, 66, 0F, 38, 0B)
162
163// SSSE3 instructions whose AVX version has two operands.
164#define SSSE3_UNOP_INSTRUCTION_LIST(V) \
165  V(pabsb, 66, 0F, 38, 1C)             \
166  V(pabsw, 66, 0F, 38, 1D)             \
167  V(pabsd, 66, 0F, 38, 1E)
168
169#define SSE4_INSTRUCTION_LIST(V) \
170  V(pmuldq, 66, 0F, 38, 28)      \
171  V(pcmpeqq, 66, 0F, 38, 29)     \
172  V(packusdw, 66, 0F, 38, 2B)    \
173  V(pminsb, 66, 0F, 38, 38)      \
174  V(pminsd, 66, 0F, 38, 39)      \
175  V(pminuw, 66, 0F, 38, 3A)      \
176  V(pminud, 66, 0F, 38, 3B)      \
177  V(pmaxsb, 66, 0F, 38, 3C)      \
178  V(pmaxsd, 66, 0F, 38, 3D)      \
179  V(pmaxuw, 66, 0F, 38, 3E)      \
180  V(pmaxud, 66, 0F, 38, 3F)      \
181  V(pmulld, 66, 0F, 38, 40)
182
183// SSE instructions whose AVX version has two operands.
184#define SSE4_UNOP_INSTRUCTION_LIST(V) \
185  V(ptest, 66, 0F, 38, 17)            \
186  V(pmovsxbw, 66, 0F, 38, 20)         \
187  V(pmovsxwd, 66, 0F, 38, 23)         \
188  V(pmovsxdq, 66, 0F, 38, 25)         \
189  V(pmovzxbw, 66, 0F, 38, 30)         \
190  V(pmovzxwd, 66, 0F, 38, 33)         \
191  V(pmovzxdq, 66, 0F, 38, 35)
192
193#define SSE4_EXTRACT_INSTRUCTION_LIST(V) \
194  V(extractps, 66, 0F, 3A, 17)           \
195  V(pextrb, 66, 0F, 3A, 14)              \
196  V(pextrw, 66, 0F, 3A, 15)              \
197  V(pextrd, 66, 0F, 3A, 16)
198
199#define SSE4_2_INSTRUCTION_LIST(V) V(pcmpgtq, 66, 0F, 38, 37)
200
201// These require AVX2.
202#define AVX2_BROADCAST_LIST(V)    \
203  V(vpbroadcastd, 66, 0F, 38, 58) \
204  V(vpbroadcastb, 66, 0F, 38, 78) \
205  V(vpbroadcastw, 66, 0F, 38, 79)
206
207#endif  // V8_CODEGEN_X64_SSE_INSTR_H_
208