blob: 9632d5e9b790616c9941c5d8ef38bdfe9bea013f [file] [log] [blame]
Evan Chengffcb95b2006-02-21 19:13:53 +00001//====- X86InstrSSE.td - Describe the X86 Instruction Set -------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file was developed by the Evan Cheng and is distributed under
6// the University of Illinois Open Source License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file describes the X86 SSE instruction set, defining the instructions,
11// and properties of the instructions which are needed for code generation,
12// machine code emission, and analysis.
13//
14//===----------------------------------------------------------------------===//
15
Evan Cheng4e4c71e2006-02-21 20:00:20 +000016//===----------------------------------------------------------------------===//
Evan Cheng2246f842006-03-18 01:23:20 +000017// SSE specific DAG Nodes.
18//===----------------------------------------------------------------------===//
19
Evan Chengb9df0ca2006-03-22 02:53:00 +000020def X86loadp : SDNode<"X86ISD::LOAD_PACK", SDTLoad,
21 [SDNPHasChain]>;
Evan Cheng6be2c582006-04-05 23:38:46 +000022def X86fand : SDNode<"X86ISD::FAND", SDTFPBinOp,
Evan Chengb9df0ca2006-03-22 02:53:00 +000023 [SDNPCommutative, SDNPAssociative]>;
Evan Cheng6be2c582006-04-05 23:38:46 +000024def X86fxor : SDNode<"X86ISD::FXOR", SDTFPBinOp,
Evan Chengb9df0ca2006-03-22 02:53:00 +000025 [SDNPCommutative, SDNPAssociative]>;
Evan Cheng6be2c582006-04-05 23:38:46 +000026def X86comi : SDNode<"X86ISD::COMI", SDTX86CmpTest,
27 [SDNPOutFlag]>;
28def X86ucomi : SDNode<"X86ISD::UCOMI", SDTX86CmpTest,
29 [SDNPOutFlag]>;
Evan Chengbc4832b2006-03-24 23:15:12 +000030def X86s2vec : SDNode<"X86ISD::S2VEC",
Evan Chengb9df0ca2006-03-22 02:53:00 +000031 SDTypeProfile<1, 1, []>, []>;
Evan Chengbc4832b2006-03-24 23:15:12 +000032def X86zexts2vec : SDNode<"X86ISD::ZEXT_S2VEC",
33 SDTypeProfile<1, 1, []>, []>;
Evan Chengb067a1e2006-03-31 19:22:53 +000034def X86pextrw : SDNode<"X86ISD::PEXTRW",
35 SDTypeProfile<1, 2, []>, []>;
Evan Cheng653159f2006-03-31 21:55:24 +000036def X86pinsrw : SDNode<"X86ISD::PINSRW",
37 SDTypeProfile<1, 3, []>, []>;
Evan Chengc60bd972006-03-25 09:37:23 +000038
Evan Cheng2246f842006-03-18 01:23:20 +000039//===----------------------------------------------------------------------===//
Evan Cheng06a8aa12006-03-17 19:55:52 +000040// SSE pattern fragments
41//===----------------------------------------------------------------------===//
42
43def X86loadpf32 : PatFrag<(ops node:$ptr), (f32 (X86loadp node:$ptr))>;
44def X86loadpf64 : PatFrag<(ops node:$ptr), (f64 (X86loadp node:$ptr))>;
45
Evan Cheng2246f842006-03-18 01:23:20 +000046def loadv4f32 : PatFrag<(ops node:$ptr), (v4f32 (load node:$ptr))>;
47def loadv2f64 : PatFrag<(ops node:$ptr), (v2f64 (load node:$ptr))>;
Evan Cheng24dc1f52006-03-23 07:44:07 +000048def loadv16i8 : PatFrag<(ops node:$ptr), (v16i8 (load node:$ptr))>;
49def loadv8i16 : PatFrag<(ops node:$ptr), (v8i16 (load node:$ptr))>;
50def loadv4i32 : PatFrag<(ops node:$ptr), (v4i32 (load node:$ptr))>;
51def loadv2i64 : PatFrag<(ops node:$ptr), (v2i64 (load node:$ptr))>;
Evan Cheng06a8aa12006-03-17 19:55:52 +000052
Evan Cheng1b32f222006-03-30 07:33:32 +000053def bc_v4f32 : PatFrag<(ops node:$in), (v4f32 (bitconvert node:$in))>;
54def bc_v2f64 : PatFrag<(ops node:$in), (v2f64 (bitconvert node:$in))>;
Evan Cheng506d3df2006-03-29 23:07:14 +000055def bc_v16i8 : PatFrag<(ops node:$in), (v16i8 (bitconvert node:$in))>;
56def bc_v8i16 : PatFrag<(ops node:$in), (v8i16 (bitconvert node:$in))>;
Evan Cheng5aa97b22006-03-29 18:47:40 +000057def bc_v4i32 : PatFrag<(ops node:$in), (v4i32 (bitconvert node:$in))>;
58def bc_v2i64 : PatFrag<(ops node:$in), (v2i64 (bitconvert node:$in))>;
59
Evan Cheng386031a2006-03-24 07:29:27 +000060def fp32imm0 : PatLeaf<(f32 fpimm), [{
61 return N->isExactlyValue(+0.0);
62}]>;
63
Evan Chengff65e382006-04-04 21:49:39 +000064def PSxLDQ_imm : SDNodeXForm<imm, [{
65 // Transformation function: imm >> 3
66 return getI32Imm(N->getValue() >> 3);
67}]>;
68
Evan Cheng63d33002006-03-22 08:01:21 +000069// SHUFFLE_get_shuf_imm xform function: convert vector_shuffle mask to PSHUF*,
70// SHUFP* etc. imm.
71def SHUFFLE_get_shuf_imm : SDNodeXForm<build_vector, [{
72 return getI8Imm(X86::getShuffleSHUFImmediate(N));
Evan Chengb9df0ca2006-03-22 02:53:00 +000073}]>;
74
Evan Cheng506d3df2006-03-29 23:07:14 +000075// SHUFFLE_get_pshufhw_imm xform function: convert vector_shuffle mask to
76// PSHUFHW imm.
77def SHUFFLE_get_pshufhw_imm : SDNodeXForm<build_vector, [{
78 return getI8Imm(X86::getShufflePSHUFHWImmediate(N));
79}]>;
80
81// SHUFFLE_get_pshuflw_imm xform function: convert vector_shuffle mask to
82// PSHUFLW imm.
83def SHUFFLE_get_pshuflw_imm : SDNodeXForm<build_vector, [{
84 return getI8Imm(X86::getShufflePSHUFLWImmediate(N));
85}]>;
86
Evan Cheng691c9232006-03-29 19:02:40 +000087def SSE_splat_mask : PatLeaf<(build_vector), [{
Evan Cheng0188ecb2006-03-22 18:59:22 +000088 return X86::isSplatMask(N);
Evan Cheng691c9232006-03-29 19:02:40 +000089}], SHUFFLE_get_shuf_imm>;
Evan Cheng0188ecb2006-03-22 18:59:22 +000090
Evan Cheng2064a2b2006-03-28 06:50:32 +000091def MOVLHPS_shuffle_mask : PatLeaf<(build_vector), [{
92 return X86::isMOVLHPSMask(N);
93}]>;
94
Evan Cheng2c0dbd02006-03-24 02:58:06 +000095def MOVHLPS_shuffle_mask : PatLeaf<(build_vector), [{
96 return X86::isMOVHLPSMask(N);
Evan Cheng4fcb9222006-03-28 02:43:26 +000097}]>;
Evan Cheng2c0dbd02006-03-24 02:58:06 +000098
Evan Cheng0038e592006-03-28 00:39:58 +000099def UNPCKL_shuffle_mask : PatLeaf<(build_vector), [{
100 return X86::isUNPCKLMask(N);
101}]>;
102
Evan Cheng4fcb9222006-03-28 02:43:26 +0000103def UNPCKH_shuffle_mask : PatLeaf<(build_vector), [{
104 return X86::isUNPCKHMask(N);
105}]>;
106
Evan Cheng1d5a8cc2006-04-05 07:20:06 +0000107def UNPCKL_v_undef_shuffle_mask : PatLeaf<(build_vector), [{
108 return X86::isUNPCKL_v_undef_Mask(N);
109}]>;
110
Evan Cheng0188ecb2006-03-22 18:59:22 +0000111def PSHUFD_shuffle_mask : PatLeaf<(build_vector), [{
Evan Cheng4f563382006-03-29 01:30:51 +0000112 return X86::isPSHUFDMask(N);
Evan Cheng14aed5e2006-03-24 01:18:28 +0000113}], SHUFFLE_get_shuf_imm>;
Evan Cheng0188ecb2006-03-22 18:59:22 +0000114
Evan Cheng506d3df2006-03-29 23:07:14 +0000115def PSHUFHW_shuffle_mask : PatLeaf<(build_vector), [{
116 return X86::isPSHUFHWMask(N);
117}], SHUFFLE_get_pshufhw_imm>;
118
119def PSHUFLW_shuffle_mask : PatLeaf<(build_vector), [{
120 return X86::isPSHUFLWMask(N);
121}], SHUFFLE_get_pshuflw_imm>;
122
Evan Cheng7d9061e2006-03-30 19:54:57 +0000123// Only use PSHUF* for v4f32 if SHUFP does not match.
124def PSHUFD_fp_shuffle_mask : PatLeaf<(build_vector), [{
125 return !X86::isSHUFPMask(N) &&
126 X86::isPSHUFDMask(N);
127}], SHUFFLE_get_shuf_imm>;
128
129def PSHUFHW_fp_shuffle_mask : PatLeaf<(build_vector), [{
130 return !X86::isSHUFPMask(N) &&
131 X86::isPSHUFHWMask(N);
132}], SHUFFLE_get_pshufhw_imm>;
133
134def PSHUFLW_fp_shuffle_mask : PatLeaf<(build_vector), [{
135 return !X86::isSHUFPMask(N) &&
136 X86::isPSHUFLWMask(N);
137}], SHUFFLE_get_pshuflw_imm>;
138
Evan Cheng14aed5e2006-03-24 01:18:28 +0000139def SHUFP_shuffle_mask : PatLeaf<(build_vector), [{
140 return X86::isSHUFPMask(N);
141}], SHUFFLE_get_shuf_imm>;
Evan Chengb9df0ca2006-03-22 02:53:00 +0000142
Evan Cheng7d9061e2006-03-30 19:54:57 +0000143// Only use SHUFP for v4i32 if PSHUF* do not match.
144def SHUFP_int_shuffle_mask : PatLeaf<(build_vector), [{
145 return !X86::isPSHUFDMask(N) &&
146 !X86::isPSHUFHWMask(N) &&
147 !X86::isPSHUFLWMask(N) &&
148 X86::isSHUFPMask(N);
Evan Cheng475aecf2006-03-29 03:04:49 +0000149}], SHUFFLE_get_shuf_imm>;
150
Evan Cheng06a8aa12006-03-17 19:55:52 +0000151//===----------------------------------------------------------------------===//
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000152// SSE scalar FP Instructions
153//===----------------------------------------------------------------------===//
154
Evan Cheng470a6ad2006-02-22 02:26:30 +0000155// Instruction templates
156// SSI - SSE1 instructions with XS prefix.
157// SDI - SSE2 instructions with XD prefix.
158// PSI - SSE1 instructions with TB prefix.
159// PDI - SSE2 instructions with TB and OpSize prefixes.
Evan Cheng2da953f2006-03-22 07:10:28 +0000160// PSIi8 - SSE1 instructions with ImmT == Imm8 and TB prefix.
161// PDIi8 - SSE2 instructions with ImmT == Imm8 and TB and OpSize prefixes.
Evan Cheng4b1734f2006-03-31 21:29:33 +0000162// S3SI - SSE3 instructions with XD prefix.
163// S3DI - SSE3 instructions with TB and OpSize prefixes.
Evan Cheng470a6ad2006-02-22 02:26:30 +0000164class SSI<bits<8> o, Format F, dag ops, string asm, list<dag> pattern>
165 : I<o, F, ops, asm, pattern>, XS, Requires<[HasSSE1]>;
166class SDI<bits<8> o, Format F, dag ops, string asm, list<dag> pattern>
167 : I<o, F, ops, asm, pattern>, XD, Requires<[HasSSE2]>;
168class PSI<bits<8> o, Format F, dag ops, string asm, list<dag> pattern>
169 : I<o, F, ops, asm, pattern>, TB, Requires<[HasSSE1]>;
170class PDI<bits<8> o, Format F, dag ops, string asm, list<dag> pattern>
171 : I<o, F, ops, asm, pattern>, TB, OpSize, Requires<[HasSSE2]>;
Evan Cheng2da953f2006-03-22 07:10:28 +0000172class PSIi8<bits<8> o, Format F, dag ops, string asm, list<dag> pattern>
173 : X86Inst<o, F, Imm8, ops, asm>, TB, Requires<[HasSSE1]> {
174 let Pattern = pattern;
175}
176class PDIi8<bits<8> o, Format F, dag ops, string asm, list<dag> pattern>
177 : X86Inst<o, F, Imm8, ops, asm>, TB, OpSize, Requires<[HasSSE2]> {
178 let Pattern = pattern;
179}
Evan Cheng4b1734f2006-03-31 21:29:33 +0000180class S3SI<bits<8> o, Format F, dag ops, string asm, list<dag> pattern>
181 : I<o, F, ops, asm, pattern>, XD, Requires<[HasSSE3]>;
182class S3DI<bits<8> o, Format F, dag ops, string asm, list<dag> pattern>
183 : I<o, F, ops, asm, pattern>, TB, OpSize, Requires<[HasSSE3]>;
184
185//===----------------------------------------------------------------------===//
186// Helpers for defining instructions that directly correspond to intrinsics.
Evan Cheng6e967402006-04-04 00:10:53 +0000187class SS_Intr<bits<8> o, string asm, Intrinsic IntId>
188 : SSI<o, MRMSrcReg, (ops VR128:$dst, VR128:$src), asm,
189 [(set VR128:$dst, (v4f32 (IntId VR128:$src)))]>;
190class SS_Intm<bits<8> o, string asm, Intrinsic IntId>
191 : SSI<o, MRMSrcMem, (ops VR128:$dst, f32mem:$src), asm,
192 [(set VR128:$dst, (v4f32 (IntId (load addr:$src))))]>;
193class SD_Intr<bits<8> o, string asm, Intrinsic IntId>
194 : SDI<o, MRMSrcReg, (ops VR128:$dst, VR128:$src), asm,
195 [(set VR128:$dst, (v2f64 (IntId VR128:$src)))]>;
196class SD_Intm<bits<8> o, string asm, Intrinsic IntId>
197 : SDI<o, MRMSrcMem, (ops VR128:$dst, f64mem:$src), asm,
198 [(set VR128:$dst, (v2f64 (IntId (load addr:$src))))]>;
199
200class SS_Intrr<bits<8> o, string asm, Intrinsic IntId>
Evan Cheng97ac5fa2006-04-03 23:49:17 +0000201 : SSI<o, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2), asm,
Evan Cheng6e967402006-04-04 00:10:53 +0000202 [(set VR128:$dst, (v4f32 (IntId VR128:$src1, VR128:$src2)))]>;
203class SS_Intrm<bits<8> o, string asm, Intrinsic IntId>
Evan Cheng97ac5fa2006-04-03 23:49:17 +0000204 : SSI<o, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f32mem:$src2), asm,
Evan Cheng6e967402006-04-04 00:10:53 +0000205 [(set VR128:$dst, (v4f32 (IntId VR128:$src1, (load addr:$src2))))]>;
206class SD_Intrr<bits<8> o, string asm, Intrinsic IntId>
Evan Cheng97ac5fa2006-04-03 23:49:17 +0000207 : SDI<o, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2), asm,
Evan Cheng6e967402006-04-04 00:10:53 +0000208 [(set VR128:$dst, (v2f64 (IntId VR128:$src1, VR128:$src2)))]>;
209class SD_Intrm<bits<8> o, string asm, Intrinsic IntId>
Evan Cheng97ac5fa2006-04-03 23:49:17 +0000210 : SDI<o, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f64mem:$src2), asm,
Evan Cheng6e967402006-04-04 00:10:53 +0000211 [(set VR128:$dst, (v2f64 (IntId VR128:$src1, (load addr:$src2))))]>;
Evan Cheng97ac5fa2006-04-03 23:49:17 +0000212
213class PS_Intr<bits<8> o, string asm, Intrinsic IntId>
214 : PSI<o, MRMSrcReg, (ops VR128:$dst, VR128:$src), asm,
215 [(set VR128:$dst, (IntId VR128:$src))]>;
216class PS_Intm<bits<8> o, string asm, Intrinsic IntId>
217 : PSI<o, MRMSrcMem, (ops VR128:$dst, f32mem:$src), asm,
218 [(set VR128:$dst, (IntId (loadv4f32 addr:$src)))]>;
219class PD_Intr<bits<8> o, string asm, Intrinsic IntId>
220 : PDI<o, MRMSrcReg, (ops VR128:$dst, VR128:$src), asm,
221 [(set VR128:$dst, (IntId VR128:$src))]>;
222class PD_Intm<bits<8> o, string asm, Intrinsic IntId>
223 : PDI<o, MRMSrcMem, (ops VR128:$dst, f64mem:$src), asm,
224 [(set VR128:$dst, (IntId (loadv2f64 addr:$src)))]>;
225
226class PS_Intrr<bits<8> o, string asm, Intrinsic IntId>
227 : PSI<o, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2), asm,
228 [(set VR128:$dst, (IntId VR128:$src1, VR128:$src2))]>;
229class PS_Intrm<bits<8> o, string asm, Intrinsic IntId>
230 : PSI<o, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f32mem:$src2), asm,
231 [(set VR128:$dst, (IntId VR128:$src1, (loadv4f32 addr:$src2)))]>;
232class PD_Intrr<bits<8> o, string asm, Intrinsic IntId>
233 : PDI<o, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2), asm,
234 [(set VR128:$dst, (IntId VR128:$src1, VR128:$src2))]>;
235class PD_Intrm<bits<8> o, string asm, Intrinsic IntId>
236 : PDI<o, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f64mem:$src2), asm,
237 [(set VR128:$dst, (IntId VR128:$src1, (loadv2f64 addr:$src2)))]>;
238
Evan Cheng4b1734f2006-03-31 21:29:33 +0000239class S3S_Intrr<bits<8> o, string asm, Intrinsic IntId>
240 : S3SI<o, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2), asm,
241 [(set VR128:$dst, (v4f32 (IntId VR128:$src1, VR128:$src2)))]>;
242class S3S_Intrm<bits<8> o, string asm, Intrinsic IntId>
243 : S3SI<o, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2), asm,
244 [(set VR128:$dst, (v4f32 (IntId VR128:$src1,
245 (loadv4f32 addr:$src2))))]>;
246class S3D_Intrr<bits<8> o, string asm, Intrinsic IntId>
247 : S3DI<o, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2), asm,
248 [(set VR128:$dst, (v2f64 (IntId VR128:$src1, VR128:$src2)))]>;
249class S3D_Intrm<bits<8> o, string asm, Intrinsic IntId>
250 : S3DI<o, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2), asm,
251 [(set VR128:$dst, (v2f64 (IntId VR128:$src1,
252 (loadv2f64 addr:$src2))))]>;
Evan Cheng470a6ad2006-02-22 02:26:30 +0000253
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000254// Some 'special' instructions
255def IMPLICIT_DEF_FR32 : I<0, Pseudo, (ops FR32:$dst),
256 "#IMPLICIT_DEF $dst",
257 [(set FR32:$dst, (undef))]>, Requires<[HasSSE2]>;
258def IMPLICIT_DEF_FR64 : I<0, Pseudo, (ops FR64:$dst),
259 "#IMPLICIT_DEF $dst",
260 [(set FR64:$dst, (undef))]>, Requires<[HasSSE2]>;
261
262// CMOV* - Used to implement the SSE SELECT DAG operation. Expanded by the
263// scheduler into a branch sequence.
264let usesCustomDAGSchedInserter = 1 in { // Expanded by the scheduler.
265 def CMOV_FR32 : I<0, Pseudo,
266 (ops FR32:$dst, FR32:$t, FR32:$f, i8imm:$cond),
267 "#CMOV_FR32 PSEUDO!",
268 [(set FR32:$dst, (X86cmov FR32:$t, FR32:$f, imm:$cond))]>;
269 def CMOV_FR64 : I<0, Pseudo,
270 (ops FR64:$dst, FR64:$t, FR64:$f, i8imm:$cond),
271 "#CMOV_FR64 PSEUDO!",
272 [(set FR64:$dst, (X86cmov FR64:$t, FR64:$f, imm:$cond))]>;
273}
274
275// Move Instructions
Evan Cheng470a6ad2006-02-22 02:26:30 +0000276def MOVSSrr : SSI<0x10, MRMSrcReg, (ops FR32:$dst, FR32:$src),
277 "movss {$src, $dst|$dst, $src}", []>;
278def MOVSSrm : SSI<0x10, MRMSrcMem, (ops FR32:$dst, f32mem:$src),
279 "movss {$src, $dst|$dst, $src}",
280 [(set FR32:$dst, (loadf32 addr:$src))]>;
281def MOVSDrr : SDI<0x10, MRMSrcReg, (ops FR64:$dst, FR64:$src),
282 "movsd {$src, $dst|$dst, $src}", []>;
283def MOVSDrm : SDI<0x10, MRMSrcMem, (ops FR64:$dst, f64mem:$src),
284 "movsd {$src, $dst|$dst, $src}",
285 [(set FR64:$dst, (loadf64 addr:$src))]>;
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000286
Evan Cheng470a6ad2006-02-22 02:26:30 +0000287def MOVSSmr : SSI<0x11, MRMDestMem, (ops f32mem:$dst, FR32:$src),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000288 "movss {$src, $dst|$dst, $src}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000289 [(store FR32:$src, addr:$dst)]>;
290def MOVSDmr : SDI<0x11, MRMDestMem, (ops f64mem:$dst, FR64:$src),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000291 "movsd {$src, $dst|$dst, $src}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000292 [(store FR64:$src, addr:$dst)]>;
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000293
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000294// Arithmetic instructions
295let isTwoAddress = 1 in {
296let isCommutable = 1 in {
Evan Cheng470a6ad2006-02-22 02:26:30 +0000297def ADDSSrr : SSI<0x58, MRMSrcReg, (ops FR32:$dst, FR32:$src1, FR32:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000298 "addss {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000299 [(set FR32:$dst, (fadd FR32:$src1, FR32:$src2))]>;
300def ADDSDrr : SDI<0x58, MRMSrcReg, (ops FR64:$dst, FR64:$src1, FR64:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000301 "addsd {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000302 [(set FR64:$dst, (fadd FR64:$src1, FR64:$src2))]>;
303def MULSSrr : SSI<0x59, MRMSrcReg, (ops FR32:$dst, FR32:$src1, FR32:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000304 "mulss {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000305 [(set FR32:$dst, (fmul FR32:$src1, FR32:$src2))]>;
306def MULSDrr : SDI<0x59, MRMSrcReg, (ops FR64:$dst, FR64:$src1, FR64:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000307 "mulsd {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000308 [(set FR64:$dst, (fmul FR64:$src1, FR64:$src2))]>;
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000309}
310
Evan Cheng470a6ad2006-02-22 02:26:30 +0000311def ADDSSrm : SSI<0x58, MRMSrcMem, (ops FR32:$dst, FR32:$src1, f32mem:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000312 "addss {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000313 [(set FR32:$dst, (fadd FR32:$src1, (loadf32 addr:$src2)))]>;
314def ADDSDrm : SDI<0x58, MRMSrcMem, (ops FR64:$dst, FR64:$src1, f64mem:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000315 "addsd {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000316 [(set FR64:$dst, (fadd FR64:$src1, (loadf64 addr:$src2)))]>;
317def MULSSrm : SSI<0x59, MRMSrcMem, (ops FR32:$dst, FR32:$src1, f32mem:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000318 "mulss {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000319 [(set FR32:$dst, (fmul FR32:$src1, (loadf32 addr:$src2)))]>;
320def MULSDrm : SDI<0x59, MRMSrcMem, (ops FR64:$dst, FR64:$src1, f64mem:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000321 "mulsd {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000322 [(set FR64:$dst, (fmul FR64:$src1, (loadf64 addr:$src2)))]>;
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000323
Evan Cheng470a6ad2006-02-22 02:26:30 +0000324def DIVSSrr : SSI<0x5E, MRMSrcReg, (ops FR32:$dst, FR32:$src1, FR32:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000325 "divss {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000326 [(set FR32:$dst, (fdiv FR32:$src1, FR32:$src2))]>;
327def DIVSSrm : SSI<0x5E, MRMSrcMem, (ops FR32:$dst, FR32:$src1, f32mem:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000328 "divss {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000329 [(set FR32:$dst, (fdiv FR32:$src1, (loadf32 addr:$src2)))]>;
330def DIVSDrr : SDI<0x5E, MRMSrcReg, (ops FR64:$dst, FR64:$src1, FR64:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000331 "divsd {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000332 [(set FR64:$dst, (fdiv FR64:$src1, FR64:$src2))]>;
333def DIVSDrm : SDI<0x5E, MRMSrcMem, (ops FR64:$dst, FR64:$src1, f64mem:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000334 "divsd {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000335 [(set FR64:$dst, (fdiv FR64:$src1, (loadf64 addr:$src2)))]>;
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000336
Evan Cheng470a6ad2006-02-22 02:26:30 +0000337def SUBSSrr : SSI<0x5C, MRMSrcReg, (ops FR32:$dst, FR32:$src1, FR32:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000338 "subss {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000339 [(set FR32:$dst, (fsub FR32:$src1, FR32:$src2))]>;
340def SUBSSrm : SSI<0x5C, MRMSrcMem, (ops FR32:$dst, FR32:$src1, f32mem:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000341 "subss {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000342 [(set FR32:$dst, (fsub FR32:$src1, (loadf32 addr:$src2)))]>;
343def SUBSDrr : SDI<0x5C, MRMSrcReg, (ops FR64:$dst, FR64:$src1, FR64:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000344 "subsd {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000345 [(set FR64:$dst, (fsub FR64:$src1, FR64:$src2))]>;
346def SUBSDrm : SDI<0x5C, MRMSrcMem, (ops FR64:$dst, FR64:$src1, f64mem:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000347 "subsd {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000348 [(set FR64:$dst, (fsub FR64:$src1, (loadf64 addr:$src2)))]>;
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000349}
350
Evan Cheng8703be42006-04-04 19:12:30 +0000351def SQRTSSr : SSI<0x51, MRMSrcReg, (ops FR32:$dst, FR32:$src),
352 "sqrtss {$src, $dst|$dst, $src}",
353 [(set FR32:$dst, (fsqrt FR32:$src))]>;
354def SQRTSSm : SSI<0x51, MRMSrcMem, (ops FR32:$dst, f32mem:$src),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000355 "sqrtss {$src, $dst|$dst, $src}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000356 [(set FR32:$dst, (fsqrt (loadf32 addr:$src)))]>;
Evan Cheng8703be42006-04-04 19:12:30 +0000357def SQRTSDr : SDI<0x51, MRMSrcReg, (ops FR64:$dst, FR64:$src),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000358 "sqrtsd {$src, $dst|$dst, $src}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000359 [(set FR64:$dst, (fsqrt FR64:$src))]>;
Evan Cheng8703be42006-04-04 19:12:30 +0000360def SQRTSDm : SDI<0x51, MRMSrcMem, (ops FR64:$dst, f64mem:$src),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000361 "sqrtsd {$src, $dst|$dst, $src}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000362 [(set FR64:$dst, (fsqrt (loadf64 addr:$src)))]>;
363
Evan Cheng8703be42006-04-04 19:12:30 +0000364def RSQRTSSr : SSI<0x52, MRMSrcReg, (ops FR32:$dst, FR32:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000365 "rsqrtss {$src, $dst|$dst, $src}", []>;
Evan Cheng8703be42006-04-04 19:12:30 +0000366def RSQRTSSm : SSI<0x52, MRMSrcMem, (ops FR32:$dst, f32mem:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000367 "rsqrtss {$src, $dst|$dst, $src}", []>;
Evan Cheng8703be42006-04-04 19:12:30 +0000368def RCPSSr : SSI<0x53, MRMSrcReg, (ops FR32:$dst, FR32:$src),
369 "rcpss {$src, $dst|$dst, $src}", []>;
370def RCPSSm : SSI<0x53, MRMSrcMem, (ops FR32:$dst, f32mem:$src),
371 "rcpss {$src, $dst|$dst, $src}", []>;
Evan Cheng470a6ad2006-02-22 02:26:30 +0000372
Evan Cheng8703be42006-04-04 19:12:30 +0000373let isTwoAddress = 1 in {
374def MAXSSrr : SSI<0x5F, MRMSrcReg, (ops FR32:$dst, FR32:$src1, FR32:$src2),
375 "maxss {$src2, $dst|$dst, $src2}", []>;
376def MAXSSrm : SSI<0x5F, MRMSrcMem, (ops FR32:$dst, FR32:$src1, f32mem:$src2),
377 "maxss {$src2, $dst|$dst, $src2}", []>;
378def MAXSDrr : SDI<0x5F, MRMSrcReg, (ops FR64:$dst, FR32:$src1, FR64:$src2),
379 "maxsd {$src2, $dst|$dst, $src2}", []>;
380def MAXSDrm : SDI<0x5F, MRMSrcMem, (ops FR64:$dst, FR32:$src1, f64mem:$src2),
381 "maxsd {$src2, $dst|$dst, $src2}", []>;
382def MINSSrr : SSI<0x5D, MRMSrcReg, (ops FR32:$dst, FR32:$src1, FR32:$src2),
383 "minss {$src2, $dst|$dst, $src2}", []>;
384def MINSSrm : SSI<0x5D, MRMSrcMem, (ops FR32:$dst, FR32:$src1, f32mem:$src2),
385 "minss {$src2, $dst|$dst, $src2}", []>;
386def MINSDrr : SDI<0x5D, MRMSrcReg, (ops FR64:$dst, FR32:$src1, FR64:$src2),
387 "minsd {$src2, $dst|$dst, $src2}", []>;
388def MINSDrm : SDI<0x5D, MRMSrcMem, (ops FR64:$dst, FR32:$src1, f64mem:$src2),
389 "minsd {$src2, $dst|$dst, $src2}", []>;
390}
Evan Chengc46349d2006-03-28 23:51:43 +0000391
392// Aliases to match intrinsics which expect XMM operand(s).
393let isTwoAddress = 1 in {
394let isCommutable = 1 in {
Evan Cheng6e967402006-04-04 00:10:53 +0000395def Int_ADDSSrr : SS_Intrr<0x58, "addss {$src2, $dst|$dst, $src2}",
396 int_x86_sse_add_ss>;
397def Int_ADDSDrr : SD_Intrr<0x58, "addsd {$src2, $dst|$dst, $src2}",
398 int_x86_sse2_add_sd>;
399def Int_MULSSrr : SS_Intrr<0x59, "mulss {$src2, $dst|$dst, $src2}",
400 int_x86_sse_mul_ss>;
401def Int_MULSDrr : SD_Intrr<0x59, "mulsd {$src2, $dst|$dst, $src2}",
402 int_x86_sse2_mul_sd>;
Evan Chengc46349d2006-03-28 23:51:43 +0000403}
404
Evan Cheng6e967402006-04-04 00:10:53 +0000405def Int_ADDSSrm : SS_Intrm<0x58, "addss {$src2, $dst|$dst, $src2}",
406 int_x86_sse_add_ss>;
407def Int_ADDSDrm : SD_Intrm<0x58, "addsd {$src2, $dst|$dst, $src2}",
408 int_x86_sse2_add_sd>;
409def Int_MULSSrm : SS_Intrm<0x59, "mulss {$src2, $dst|$dst, $src2}",
410 int_x86_sse_mul_ss>;
411def Int_MULSDrm : SD_Intrm<0x59, "mulsd {$src2, $dst|$dst, $src2}",
412 int_x86_sse2_mul_sd>;
Evan Chengc46349d2006-03-28 23:51:43 +0000413
Evan Cheng6e967402006-04-04 00:10:53 +0000414def Int_DIVSSrr : SS_Intrr<0x5E, "divss {$src2, $dst|$dst, $src2}",
415 int_x86_sse_div_ss>;
416def Int_DIVSSrm : SS_Intrm<0x5E, "divss {$src2, $dst|$dst, $src2}",
417 int_x86_sse_div_ss>;
418def Int_DIVSDrr : SD_Intrr<0x5E, "divsd {$src2, $dst|$dst, $src2}",
419 int_x86_sse2_div_sd>;
420def Int_DIVSDrm : SD_Intrm<0x5E, "divsd {$src2, $dst|$dst, $src2}",
421 int_x86_sse2_div_sd>;
Evan Chengc46349d2006-03-28 23:51:43 +0000422
Evan Cheng6e967402006-04-04 00:10:53 +0000423def Int_SUBSSrr : SS_Intrr<0x5C, "subss {$src2, $dst|$dst, $src2}",
424 int_x86_sse_sub_ss>;
425def Int_SUBSSrm : SS_Intrm<0x5C, "subss {$src2, $dst|$dst, $src2}",
426 int_x86_sse_sub_ss>;
427def Int_SUBSDrr : SD_Intrr<0x5C, "subsd {$src2, $dst|$dst, $src2}",
428 int_x86_sse2_sub_sd>;
429def Int_SUBSDrm : SD_Intrm<0x5C, "subsd {$src2, $dst|$dst, $src2}",
430 int_x86_sse2_sub_sd>;
Evan Chengc46349d2006-03-28 23:51:43 +0000431}
432
Evan Cheng8703be42006-04-04 19:12:30 +0000433def Int_SQRTSSr : SS_Intr<0x51, "sqrtss {$src, $dst|$dst, $src}",
434 int_x86_sse_sqrt_ss>;
435def Int_SQRTSSm : SS_Intm<0x51, "sqrtss {$src, $dst|$dst, $src}",
436 int_x86_sse_sqrt_ss>;
437def Int_SQRTSDr : SD_Intr<0x51, "sqrtsd {$src, $dst|$dst, $src}",
438 int_x86_sse2_sqrt_sd>;
439def Int_SQRTSDm : SD_Intm<0x51, "sqrtsd {$src, $dst|$dst, $src}",
440 int_x86_sse2_sqrt_sd>;
Evan Chengc46349d2006-03-28 23:51:43 +0000441
Evan Cheng8703be42006-04-04 19:12:30 +0000442def Int_RSQRTSSr : SS_Intr<0x52, "rsqrtss {$src, $dst|$dst, $src}",
443 int_x86_sse_rsqrt_ss>;
444def Int_RSQRTSSm : SS_Intm<0x52, "rsqrtss {$src, $dst|$dst, $src}",
445 int_x86_sse_rsqrt_ss>;
446def Int_RCPSSr : SS_Intr<0x53, "rcpss {$src, $dst|$dst, $src}",
447 int_x86_sse_rcp_ss>;
448def Int_RCPSSm : SS_Intm<0x53, "rcpss {$src, $dst|$dst, $src}",
449 int_x86_sse_rcp_ss>;
Evan Chengc46349d2006-03-28 23:51:43 +0000450
451let isTwoAddress = 1 in {
Evan Cheng97ac5fa2006-04-03 23:49:17 +0000452def Int_MAXSSrr : SS_Intrr<0x5F, "maxss {$src2, $dst|$dst, $src2}",
Evan Cheng6e967402006-04-04 00:10:53 +0000453 int_x86_sse_max_ss>;
Evan Cheng97ac5fa2006-04-03 23:49:17 +0000454def Int_MAXSSrm : SS_Intrm<0x5F, "maxss {$src2, $dst|$dst, $src2}",
Evan Cheng6e967402006-04-04 00:10:53 +0000455 int_x86_sse_max_ss>;
Evan Cheng97ac5fa2006-04-03 23:49:17 +0000456def Int_MAXSDrr : SD_Intrr<0x5F, "maxsd {$src2, $dst|$dst, $src2}",
Evan Cheng6e967402006-04-04 00:10:53 +0000457 int_x86_sse2_max_sd>;
Evan Cheng97ac5fa2006-04-03 23:49:17 +0000458def Int_MAXSDrm : SD_Intrm<0x5F, "maxsd {$src2, $dst|$dst, $src2}",
Evan Cheng6e967402006-04-04 00:10:53 +0000459 int_x86_sse2_max_sd>;
Evan Cheng97ac5fa2006-04-03 23:49:17 +0000460def Int_MINSSrr : SS_Intrr<0x5D, "minss {$src2, $dst|$dst, $src2}",
Evan Cheng6e967402006-04-04 00:10:53 +0000461 int_x86_sse_min_ss>;
Evan Cheng97ac5fa2006-04-03 23:49:17 +0000462def Int_MINSSrm : SS_Intrm<0x5D, "minss {$src2, $dst|$dst, $src2}",
Evan Cheng6e967402006-04-04 00:10:53 +0000463 int_x86_sse_min_ss>;
Evan Cheng97ac5fa2006-04-03 23:49:17 +0000464def Int_MINSDrr : SD_Intrr<0x5D, "minsd {$src2, $dst|$dst, $src2}",
Evan Cheng6e967402006-04-04 00:10:53 +0000465 int_x86_sse2_min_sd>;
Evan Cheng97ac5fa2006-04-03 23:49:17 +0000466def Int_MINSDrm : SD_Intrm<0x5D, "minsd {$src2, $dst|$dst, $src2}",
Evan Cheng6e967402006-04-04 00:10:53 +0000467 int_x86_sse2_min_sd>;
Evan Chengc46349d2006-03-28 23:51:43 +0000468}
469
470// Conversion instructions
471def CVTSS2SIrr: SSI<0x2D, MRMSrcReg, (ops R32:$dst, FR32:$src),
472 "cvtss2si {$src, $dst|$dst, $src}", []>;
473def CVTSS2SIrm: SSI<0x2D, MRMSrcMem, (ops R32:$dst, f32mem:$src),
474 "cvtss2si {$src, $dst|$dst, $src}", []>;
475
476def CVTTSS2SIrr: SSI<0x2C, MRMSrcReg, (ops R32:$dst, FR32:$src),
Evan Cheng8703be42006-04-04 19:12:30 +0000477 "cvttss2si {$src, $dst|$dst, $src}",
478 [(set R32:$dst, (fp_to_sint FR32:$src))]>;
Evan Chengc46349d2006-03-28 23:51:43 +0000479def CVTTSS2SIrm: SSI<0x2C, MRMSrcMem, (ops R32:$dst, f32mem:$src),
Evan Cheng8703be42006-04-04 19:12:30 +0000480 "cvttss2si {$src, $dst|$dst, $src}",
481 [(set R32:$dst, (fp_to_sint (loadf32 addr:$src)))]>;
Evan Chengc46349d2006-03-28 23:51:43 +0000482def CVTTSD2SIrr: SDI<0x2C, MRMSrcReg, (ops R32:$dst, FR64:$src),
Evan Cheng8703be42006-04-04 19:12:30 +0000483 "cvttsd2si {$src, $dst|$dst, $src}",
484 [(set R32:$dst, (fp_to_sint FR64:$src))]>;
Evan Chengc46349d2006-03-28 23:51:43 +0000485def CVTTSD2SIrm: SDI<0x2C, MRMSrcMem, (ops R32:$dst, f64mem:$src),
Evan Cheng8703be42006-04-04 19:12:30 +0000486 "cvttsd2si {$src, $dst|$dst, $src}",
487 [(set R32:$dst, (fp_to_sint (loadf64 addr:$src)))]>;
Evan Chengc46349d2006-03-28 23:51:43 +0000488def CVTSD2SSrr: SDI<0x5A, MRMSrcReg, (ops FR32:$dst, FR64:$src),
Evan Cheng8703be42006-04-04 19:12:30 +0000489 "cvtsd2ss {$src, $dst|$dst, $src}",
490 [(set FR32:$dst, (fround FR64:$src))]>;
Evan Chengc46349d2006-03-28 23:51:43 +0000491def CVTSD2SSrm: SDI<0x5A, MRMSrcMem, (ops FR32:$dst, f64mem:$src),
Evan Cheng8703be42006-04-04 19:12:30 +0000492 "cvtsd2ss {$src, $dst|$dst, $src}",
493 [(set FR32:$dst, (fround (loadf64 addr:$src)))]>;
Evan Chengc46349d2006-03-28 23:51:43 +0000494def CVTSI2SSrr: SSI<0x2A, MRMSrcReg, (ops FR32:$dst, R32:$src),
495 "cvtsi2ss {$src, $dst|$dst, $src}",
496 [(set FR32:$dst, (sint_to_fp R32:$src))]>;
497def CVTSI2SSrm: SSI<0x2A, MRMSrcMem, (ops FR32:$dst, i32mem:$src),
Evan Cheng8703be42006-04-04 19:12:30 +0000498 "cvtsi2ss {$src, $dst|$dst, $src}",
499 [(set FR32:$dst, (sint_to_fp (loadi32 addr:$src)))]>;
Evan Chengc46349d2006-03-28 23:51:43 +0000500def CVTSI2SDrr: SDI<0x2A, MRMSrcReg, (ops FR64:$dst, R32:$src),
Evan Cheng8703be42006-04-04 19:12:30 +0000501 "cvtsi2sd {$src, $dst|$dst, $src}",
502 [(set FR64:$dst, (sint_to_fp R32:$src))]>;
Evan Chengc46349d2006-03-28 23:51:43 +0000503def CVTSI2SDrm: SDI<0x2A, MRMSrcMem, (ops FR64:$dst, i32mem:$src),
Evan Cheng8703be42006-04-04 19:12:30 +0000504 "cvtsi2sd {$src, $dst|$dst, $src}",
505 [(set FR64:$dst, (sint_to_fp (loadi32 addr:$src)))]>;
Evan Chengc46349d2006-03-28 23:51:43 +0000506// SSE2 instructions with XS prefix
507def CVTSS2SDrr: I<0x5A, MRMSrcReg, (ops FR64:$dst, FR32:$src),
Evan Cheng8703be42006-04-04 19:12:30 +0000508 "cvtss2sd {$src, $dst|$dst, $src}",
509 [(set FR64:$dst, (fextend FR32:$src))]>, XS,
Evan Chengc46349d2006-03-28 23:51:43 +0000510 Requires<[HasSSE2]>;
511def CVTSS2SDrm: I<0x5A, MRMSrcMem, (ops FR64:$dst, f32mem:$src),
Evan Cheng8703be42006-04-04 19:12:30 +0000512 "cvtss2sd {$src, $dst|$dst, $src}",
513 [(set FR64:$dst, (fextend (loadf32 addr:$src)))]>, XS,
Evan Chengc46349d2006-03-28 23:51:43 +0000514 Requires<[HasSSE2]>;
515
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000516// Comparison instructions
517let isTwoAddress = 1 in {
Evan Cheng470a6ad2006-02-22 02:26:30 +0000518def CMPSSrr : SSI<0xC2, MRMSrcReg,
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000519 (ops FR32:$dst, FR32:$src1, FR32:$src, SSECC:$cc),
Evan Cheng0876aa52006-03-30 06:21:22 +0000520 "cmp${cc}ss {$src, $dst|$dst, $src}",
521 []>;
Evan Cheng470a6ad2006-02-22 02:26:30 +0000522def CMPSSrm : SSI<0xC2, MRMSrcMem,
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000523 (ops FR32:$dst, FR32:$src1, f32mem:$src, SSECC:$cc),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000524 "cmp${cc}ss {$src, $dst|$dst, $src}", []>;
525def CMPSDrr : SDI<0xC2, MRMSrcReg,
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000526 (ops FR64:$dst, FR64:$src1, FR64:$src, SSECC:$cc),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000527 "cmp${cc}sd {$src, $dst|$dst, $src}", []>;
528def CMPSDrm : SDI<0xC2, MRMSrcMem,
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000529 (ops FR64:$dst, FR64:$src1, f64mem:$src, SSECC:$cc),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000530 "cmp${cc}sd {$src, $dst|$dst, $src}", []>;
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000531}
532
Evan Cheng470a6ad2006-02-22 02:26:30 +0000533def UCOMISSrr: PSI<0x2E, MRMSrcReg, (ops FR32:$src1, FR32:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000534 "ucomiss {$src2, $src1|$src1, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000535 [(X86cmp FR32:$src1, FR32:$src2)]>;
536def UCOMISSrm: PSI<0x2E, MRMSrcMem, (ops FR32:$src1, f32mem:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000537 "ucomiss {$src2, $src1|$src1, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000538 [(X86cmp FR32:$src1, (loadf32 addr:$src2))]>;
539def UCOMISDrr: PDI<0x2E, MRMSrcReg, (ops FR64:$src1, FR64:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000540 "ucomisd {$src2, $src1|$src1, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000541 [(X86cmp FR64:$src1, FR64:$src2)]>;
542def UCOMISDrm: PDI<0x2E, MRMSrcMem, (ops FR64:$src1, f64mem:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000543 "ucomisd {$src2, $src1|$src1, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000544 [(X86cmp FR64:$src1, (loadf64 addr:$src2))]>;
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000545
Evan Cheng0876aa52006-03-30 06:21:22 +0000546// Aliases to match intrinsics which expect XMM operand(s).
547let isTwoAddress = 1 in {
548def Int_CMPSSrr : SSI<0xC2, MRMSrcReg,
549 (ops VR128:$dst, VR128:$src1, VR128:$src, SSECC:$cc),
550 "cmp${cc}ss {$src, $dst|$dst, $src}",
551 [(set VR128:$dst, (int_x86_sse_cmp_ss VR128:$src1,
552 VR128:$src, imm:$cc))]>;
553def Int_CMPSSrm : SSI<0xC2, MRMSrcMem,
554 (ops VR128:$dst, VR128:$src1, f32mem:$src, SSECC:$cc),
555 "cmp${cc}ss {$src, $dst|$dst, $src}",
556 [(set VR128:$dst, (int_x86_sse_cmp_ss VR128:$src1,
557 (load addr:$src), imm:$cc))]>;
558def Int_CMPSDrr : SDI<0xC2, MRMSrcReg,
559 (ops VR128:$dst, VR128:$src1, VR128:$src, SSECC:$cc),
560 "cmp${cc}sd {$src, $dst|$dst, $src}", []>;
561def Int_CMPSDrm : SDI<0xC2, MRMSrcMem,
562 (ops VR128:$dst, VR128:$src1, f64mem:$src, SSECC:$cc),
563 "cmp${cc}sd {$src, $dst|$dst, $src}", []>;
564}
565
Evan Cheng6be2c582006-04-05 23:38:46 +0000566def Int_UCOMISSrr: PSI<0x2E, MRMSrcReg, (ops VR128:$src1, VR128:$src2),
567 "ucomiss {$src2, $src1|$src1, $src2}",
568 [(X86ucomi (v4f32 VR128:$src1), VR128:$src2)]>;
569def Int_UCOMISSrm: PSI<0x2E, MRMSrcMem, (ops VR128:$src1, f128mem:$src2),
570 "ucomiss {$src2, $src1|$src1, $src2}",
571 [(X86ucomi (v4f32 VR128:$src1), (loadv4f32 addr:$src2))]>;
572def Int_UCOMISDrr: PDI<0x2E, MRMSrcReg, (ops VR128:$src1, VR128:$src2),
573 "ucomisd {$src2, $src1|$src1, $src2}",
574 [(X86ucomi (v2f64 VR128:$src1), (v2f64 VR128:$src2))]>;
575def Int_UCOMISDrm: PDI<0x2E, MRMSrcMem, (ops VR128:$src1, f128mem:$src2),
576 "ucomisd {$src2, $src1|$src1, $src2}",
577 [(X86ucomi (v2f64 VR128:$src1), (loadv2f64 addr:$src2))]>;
578
579def Int_COMISSrr: PSI<0x2F, MRMSrcReg, (ops VR128:$src1, VR128:$src2),
580 "comiss {$src2, $src1|$src1, $src2}",
581 [(X86comi (v4f32 VR128:$src1), VR128:$src2)]>;
582def Int_COMISSrm: PSI<0x2F, MRMSrcMem, (ops VR128:$src1, f128mem:$src2),
583 "comiss {$src2, $src1|$src1, $src2}",
584 [(X86comi (v4f32 VR128:$src1), (loadv4f32 addr:$src2))]>;
585def Int_COMISDrr: PDI<0x2F, MRMSrcReg, (ops VR128:$src1, VR128:$src2),
586 "comisd {$src2, $src1|$src1, $src2}",
587 [(X86comi (v2f64 VR128:$src1), (v2f64 VR128:$src2))]>;
588def Int_COMISDrm: PDI<0x2F, MRMSrcMem, (ops VR128:$src1, f128mem:$src2),
589 "comisd {$src2, $src1|$src1, $src2}",
590 [(X86comi (v2f64 VR128:$src1), (loadv2f64 addr:$src2))]>;
Evan Cheng0876aa52006-03-30 06:21:22 +0000591
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000592// Aliases of packed instructions for scalar use. These all have names that
593// start with 'Fs'.
594
595// Alias instructions that map fld0 to pxor for sse.
596// FIXME: remove when we can teach regalloc that xor reg, reg is ok.
597def FsFLD0SS : I<0xEF, MRMInitReg, (ops FR32:$dst),
598 "pxor $dst, $dst", [(set FR32:$dst, fp32imm0)]>,
599 Requires<[HasSSE1]>, TB, OpSize;
600def FsFLD0SD : I<0xEF, MRMInitReg, (ops FR64:$dst),
601 "pxor $dst, $dst", [(set FR64:$dst, fp64imm0)]>,
602 Requires<[HasSSE2]>, TB, OpSize;
603
604// Alias instructions to do FR32 / FR64 reg-to-reg copy using movaps / movapd.
605// Upper bits are disregarded.
Evan Cheng470a6ad2006-02-22 02:26:30 +0000606def FsMOVAPSrr : PSI<0x28, MRMSrcReg, (ops FR32:$dst, FR32:$src),
607 "movaps {$src, $dst|$dst, $src}", []>;
608def FsMOVAPDrr : PDI<0x28, MRMSrcReg, (ops FR64:$dst, FR64:$src),
609 "movapd {$src, $dst|$dst, $src}", []>;
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000610
611// Alias instructions to load FR32 / FR64 from f128mem using movaps / movapd.
612// Upper bits are disregarded.
Evan Cheng470a6ad2006-02-22 02:26:30 +0000613def FsMOVAPSrm : PSI<0x28, MRMSrcMem, (ops FR32:$dst, f128mem:$src),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000614 "movaps {$src, $dst|$dst, $src}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000615 [(set FR32:$dst, (X86loadpf32 addr:$src))]>;
616def FsMOVAPDrm : PDI<0x28, MRMSrcMem, (ops FR64:$dst, f128mem:$src),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000617 "movapd {$src, $dst|$dst, $src}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000618 [(set FR64:$dst, (X86loadpf64 addr:$src))]>;
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000619
620// Alias bitwise logical operations using SSE logical ops on packed FP values.
621let isTwoAddress = 1 in {
622let isCommutable = 1 in {
Evan Cheng470a6ad2006-02-22 02:26:30 +0000623def FsANDPSrr : PSI<0x54, MRMSrcReg, (ops FR32:$dst, FR32:$src1, FR32:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000624 "andps {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000625 [(set FR32:$dst, (X86fand FR32:$src1, FR32:$src2))]>;
626def FsANDPDrr : PDI<0x54, MRMSrcReg, (ops FR64:$dst, FR64:$src1, FR64:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000627 "andpd {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000628 [(set FR64:$dst, (X86fand FR64:$src1, FR64:$src2))]>;
629def FsORPSrr : PSI<0x56, MRMSrcReg, (ops FR32:$dst, FR32:$src1, FR32:$src2),
630 "orps {$src2, $dst|$dst, $src2}", []>;
631def FsORPDrr : PDI<0x56, MRMSrcReg, (ops FR64:$dst, FR64:$src1, FR64:$src2),
632 "orpd {$src2, $dst|$dst, $src2}", []>;
633def FsXORPSrr : PSI<0x57, MRMSrcReg, (ops FR32:$dst, FR32:$src1, FR32:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000634 "xorps {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000635 [(set FR32:$dst, (X86fxor FR32:$src1, FR32:$src2))]>;
636def FsXORPDrr : PDI<0x57, MRMSrcReg, (ops FR64:$dst, FR64:$src1, FR64:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000637 "xorpd {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000638 [(set FR64:$dst, (X86fxor FR64:$src1, FR64:$src2))]>;
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000639}
Evan Cheng470a6ad2006-02-22 02:26:30 +0000640def FsANDPSrm : PSI<0x54, MRMSrcMem, (ops FR32:$dst, FR32:$src1, f128mem:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000641 "andps {$src2, $dst|$dst, $src2}",
642 [(set FR32:$dst, (X86fand FR32:$src1,
Evan Cheng470a6ad2006-02-22 02:26:30 +0000643 (X86loadpf32 addr:$src2)))]>;
644def FsANDPDrm : PDI<0x54, MRMSrcMem, (ops FR64:$dst, FR64:$src1, f128mem:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000645 "andpd {$src2, $dst|$dst, $src2}",
646 [(set FR64:$dst, (X86fand FR64:$src1,
Evan Cheng470a6ad2006-02-22 02:26:30 +0000647 (X86loadpf64 addr:$src2)))]>;
648def FsORPSrm : PSI<0x56, MRMSrcMem, (ops FR32:$dst, FR32:$src1, f128mem:$src2),
649 "orps {$src2, $dst|$dst, $src2}", []>;
650def FsORPDrm : PDI<0x56, MRMSrcMem, (ops FR64:$dst, FR64:$src1, f128mem:$src2),
651 "orpd {$src2, $dst|$dst, $src2}", []>;
652def FsXORPSrm : PSI<0x57, MRMSrcMem, (ops FR32:$dst, FR32:$src1, f128mem:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000653 "xorps {$src2, $dst|$dst, $src2}",
654 [(set FR32:$dst, (X86fxor FR32:$src1,
Evan Cheng470a6ad2006-02-22 02:26:30 +0000655 (X86loadpf32 addr:$src2)))]>;
656def FsXORPDrm : PDI<0x57, MRMSrcMem, (ops FR64:$dst, FR64:$src1, f128mem:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000657 "xorpd {$src2, $dst|$dst, $src2}",
658 [(set FR64:$dst, (X86fxor FR64:$src1,
Evan Cheng470a6ad2006-02-22 02:26:30 +0000659 (X86loadpf64 addr:$src2)))]>;
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000660
Evan Cheng470a6ad2006-02-22 02:26:30 +0000661def FsANDNPSrr : PSI<0x55, MRMSrcReg, (ops FR32:$dst, FR32:$src1, FR32:$src2),
662 "andnps {$src2, $dst|$dst, $src2}", []>;
663def FsANDNPSrm : PSI<0x55, MRMSrcMem, (ops FR32:$dst, FR32:$src1, f128mem:$src2),
664 "andnps {$src2, $dst|$dst, $src2}", []>;
665def FsANDNPDrr : PDI<0x55, MRMSrcReg, (ops FR64:$dst, FR64:$src1, FR64:$src2),
666 "andnpd {$src2, $dst|$dst, $src2}", []>;
667def FsANDNPDrm : PDI<0x55, MRMSrcMem, (ops FR64:$dst, FR64:$src1, f128mem:$src2),
668 "andnpd {$src2, $dst|$dst, $src2}", []>;
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000669}
670
671//===----------------------------------------------------------------------===//
672// SSE packed FP Instructions
673//===----------------------------------------------------------------------===//
674
Evan Chengc12e6c42006-03-19 09:38:54 +0000675// Some 'special' instructions
676def IMPLICIT_DEF_VR128 : I<0, Pseudo, (ops VR128:$dst),
677 "#IMPLICIT_DEF $dst",
678 [(set VR128:$dst, (v4f32 (undef)))]>,
679 Requires<[HasSSE1]>;
680
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000681// Move Instructions
Evan Cheng2246f842006-03-18 01:23:20 +0000682def MOVAPSrr : PSI<0x28, MRMSrcReg, (ops VR128:$dst, VR128:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000683 "movaps {$src, $dst|$dst, $src}", []>;
Evan Cheng2246f842006-03-18 01:23:20 +0000684def MOVAPSrm : PSI<0x28, MRMSrcMem, (ops VR128:$dst, f128mem:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000685 "movaps {$src, $dst|$dst, $src}",
Evan Cheng2246f842006-03-18 01:23:20 +0000686 [(set VR128:$dst, (loadv4f32 addr:$src))]>;
687def MOVAPDrr : PDI<0x28, MRMSrcReg, (ops VR128:$dst, VR128:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000688 "movapd {$src, $dst|$dst, $src}", []>;
Evan Cheng2246f842006-03-18 01:23:20 +0000689def MOVAPDrm : PDI<0x28, MRMSrcMem, (ops VR128:$dst, f128mem:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000690 "movapd {$src, $dst|$dst, $src}",
Evan Cheng2246f842006-03-18 01:23:20 +0000691 [(set VR128:$dst, (loadv2f64 addr:$src))]>;
Evan Chengffcb95b2006-02-21 19:13:53 +0000692
Evan Cheng2246f842006-03-18 01:23:20 +0000693def MOVAPSmr : PSI<0x29, MRMDestMem, (ops f128mem:$dst, VR128:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000694 "movaps {$src, $dst|$dst, $src}",
Evan Cheng2246f842006-03-18 01:23:20 +0000695 [(store (v4f32 VR128:$src), addr:$dst)]>;
696def MOVAPDmr : PDI<0x29, MRMDestMem, (ops f128mem:$dst, VR128:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000697 "movapd {$src, $dst|$dst, $src}",
Evan Cheng2246f842006-03-18 01:23:20 +0000698 [(store (v2f64 VR128:$src), addr:$dst)]>;
Evan Cheng470a6ad2006-02-22 02:26:30 +0000699
Evan Cheng2246f842006-03-18 01:23:20 +0000700def MOVUPSrr : PSI<0x10, MRMSrcReg, (ops VR128:$dst, VR128:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000701 "movups {$src, $dst|$dst, $src}", []>;
Evan Cheng2246f842006-03-18 01:23:20 +0000702def MOVUPSrm : PSI<0x10, MRMSrcMem, (ops VR128:$dst, f128mem:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000703 "movups {$src, $dst|$dst, $src}", []>;
Evan Cheng2246f842006-03-18 01:23:20 +0000704def MOVUPSmr : PSI<0x11, MRMDestMem, (ops f128mem:$dst, VR128:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000705 "movups {$src, $dst|$dst, $src}", []>;
Evan Cheng2246f842006-03-18 01:23:20 +0000706def MOVUPDrr : PDI<0x10, MRMSrcReg, (ops VR128:$dst, VR128:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000707 "movupd {$src, $dst|$dst, $src}", []>;
Evan Cheng2246f842006-03-18 01:23:20 +0000708def MOVUPDrm : PDI<0x10, MRMSrcMem, (ops VR128:$dst, f128mem:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000709 "movupd {$src, $dst|$dst, $src}", []>;
Evan Cheng2246f842006-03-18 01:23:20 +0000710def MOVUPDmr : PDI<0x11, MRMDestMem, (ops f128mem:$dst, VR128:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000711 "movupd {$src, $dst|$dst, $src}", []>;
712
Evan Cheng4fcb9222006-03-28 02:43:26 +0000713let isTwoAddress = 1 in {
Evan Cheng9bbfd4f2006-03-28 07:01:28 +0000714def MOVLPSrm : PSI<0x12, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f64mem:$src2),
715 "movlps {$src2, $dst|$dst, $src2}", []>;
716def MOVLPDrm : PDI<0x12, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f64mem:$src2),
717 "movlpd {$src2, $dst|$dst, $src2}", []>;
Evan Cheng4fcb9222006-03-28 02:43:26 +0000718def MOVHPSrm : PSI<0x16, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f64mem:$src2),
719 "movhps {$src2, $dst|$dst, $src2}", []>;
720def MOVHPDrm : PDI<0x16, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f64mem:$src2),
721 "movhpd {$src2, $dst|$dst, $src2}",
722 [(set VR128:$dst,
723 (v2f64 (vector_shuffle VR128:$src1,
724 (scalar_to_vector (loadf64 addr:$src2)),
725 UNPCKL_shuffle_mask)))]>;
726}
727
Evan Cheng9bbfd4f2006-03-28 07:01:28 +0000728def MOVLPSmr : PSI<0x13, MRMDestMem, (ops f64mem:$dst, VR128:$src),
729 "movlps {$src, $dst|$dst, $src}", []>;
730def MOVLPDmr : PDI<0x13, MRMDestMem, (ops f64mem:$dst, VR128:$src),
Evan Cheng20e3ed12006-04-03 22:30:54 +0000731 "movlpd {$src, $dst|$dst, $src}",
732 [(store (f64 (vector_extract (v2f64 VR128:$src),
733 (i32 0))), addr:$dst)]>;
Evan Cheng9bbfd4f2006-03-28 07:01:28 +0000734
Evan Cheng2246f842006-03-18 01:23:20 +0000735def MOVHPSmr : PSI<0x17, MRMDestMem, (ops f64mem:$dst, VR128:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000736 "movhps {$src, $dst|$dst, $src}", []>;
Evan Cheng2246f842006-03-18 01:23:20 +0000737def MOVHPDmr : PDI<0x17, MRMDestMem, (ops f64mem:$dst, VR128:$src),
Evan Cheng20e3ed12006-04-03 22:30:54 +0000738 "movhpd {$src, $dst|$dst, $src}",
739 [(store (f64 (vector_extract
740 (v2f64 (vector_shuffle VR128:$src, (undef),
741 UNPCKH_shuffle_mask)), (i32 0))),
742 addr:$dst)]>;
Evan Cheng470a6ad2006-02-22 02:26:30 +0000743
Evan Cheng14aed5e2006-03-24 01:18:28 +0000744let isTwoAddress = 1 in {
745def MOVLHPSrr : PSI<0x16, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
Evan Cheng4fcb9222006-03-28 02:43:26 +0000746 "movlhps {$src2, $dst|$dst, $src2}",
747 [(set VR128:$dst,
Evan Cheng2064a2b2006-03-28 06:50:32 +0000748 (v4f32 (vector_shuffle VR128:$src1, VR128:$src2,
749 MOVLHPS_shuffle_mask)))]>;
Evan Cheng2c0dbd02006-03-24 02:58:06 +0000750
Evan Cheng14aed5e2006-03-24 01:18:28 +0000751def MOVHLPSrr : PSI<0x12, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
Evan Chengbe296ac2006-03-28 06:53:49 +0000752 "movhlps {$src2, $dst|$dst, $src2}",
Evan Cheng4fcb9222006-03-28 02:43:26 +0000753 [(set VR128:$dst,
Evan Cheng2064a2b2006-03-28 06:50:32 +0000754 (v4f32 (vector_shuffle VR128:$src1, VR128:$src2,
Evan Cheng4fcb9222006-03-28 02:43:26 +0000755 MOVHLPS_shuffle_mask)))]>;
Evan Cheng14aed5e2006-03-24 01:18:28 +0000756}
Evan Cheng470a6ad2006-02-22 02:26:30 +0000757
Evan Cheng470a6ad2006-02-22 02:26:30 +0000758// Conversion instructions
Evan Cheng8703be42006-04-04 19:12:30 +0000759def CVTPI2PSr : PSI<0x2A, MRMSrcReg, (ops VR128:$dst, VR64:$src),
760 "cvtpi2ps {$src, $dst|$dst, $src}", []>;
761def CVTPI2PSm : PSI<0x2A, MRMSrcMem, (ops VR128:$dst, i64mem:$src),
762 "cvtpi2ps {$src, $dst|$dst, $src}", []>;
763def CVTPI2PDr : PDI<0x2A, MRMSrcReg, (ops VR128:$dst, VR64:$src),
764 "cvtpi2pd {$src, $dst|$dst, $src}", []>;
765def CVTPI2PDm : PDI<0x2A, MRMSrcMem, (ops VR128:$dst, i64mem:$src),
766 "cvtpi2pd {$src, $dst|$dst, $src}", []>;
Evan Cheng470a6ad2006-02-22 02:26:30 +0000767
768// SSE2 instructions without OpSize prefix
Evan Cheng8703be42006-04-04 19:12:30 +0000769def CVTDQ2PSr : I<0x5B, MRMSrcReg, (ops VR128:$dst, VR128:$src),
770 "cvtdq2ps {$src, $dst|$dst, $src}", []>, TB,
771 Requires<[HasSSE2]>;
772def CVTDQ2PSm : I<0x5B, MRMSrcMem, (ops VR128:$dst, i128mem:$src),
773 "cvtdq2ps {$src, $dst|$dst, $src}", []>, TB,
774 Requires<[HasSSE2]>;
Evan Cheng470a6ad2006-02-22 02:26:30 +0000775
776// SSE2 instructions with XS prefix
Evan Cheng8703be42006-04-04 19:12:30 +0000777def CVTDQ2PDr : I<0xE6, MRMSrcReg, (ops VR128:$dst, VR64:$src),
778 "cvtdq2pd {$src, $dst|$dst, $src}", []>,
779 XS, Requires<[HasSSE2]>;
780def CVTDQ2PDm : I<0xE6, MRMSrcMem, (ops VR128:$dst, i64mem:$src),
781 "cvtdq2pd {$src, $dst|$dst, $src}", []>,
782 XS, Requires<[HasSSE2]>;
Evan Cheng470a6ad2006-02-22 02:26:30 +0000783
Evan Cheng8703be42006-04-04 19:12:30 +0000784def CVTPS2PIr : PSI<0x2D, MRMSrcReg, (ops VR64:$dst, VR128:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000785 "cvtps2pi {$src, $dst|$dst, $src}", []>;
Evan Cheng8703be42006-04-04 19:12:30 +0000786def CVTPS2PIm : PSI<0x2D, MRMSrcMem, (ops VR64:$dst, f64mem:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000787 "cvtps2pi {$src, $dst|$dst, $src}", []>;
Evan Cheng8703be42006-04-04 19:12:30 +0000788def CVTPD2PIr : PDI<0x2D, MRMSrcReg, (ops VR64:$dst, VR128:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000789 "cvtpd2pi {$src, $dst|$dst, $src}", []>;
Evan Cheng8703be42006-04-04 19:12:30 +0000790def CVTPD2PIm : PDI<0x2D, MRMSrcMem, (ops VR64:$dst, f128mem:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000791 "cvtpd2pi {$src, $dst|$dst, $src}", []>;
792
Evan Cheng8703be42006-04-04 19:12:30 +0000793def CVTPS2DQr : PDI<0x5B, MRMSrcReg, (ops VR128:$dst, VR128:$src),
794 "cvtps2dq {$src, $dst|$dst, $src}", []>;
795def CVTPS2DQm : PDI<0x5B, MRMSrcMem, (ops VR128:$dst, f128mem:$src),
796 "cvtps2dq {$src, $dst|$dst, $src}", []>;
Evan Cheng470a6ad2006-02-22 02:26:30 +0000797// SSE2 packed instructions with XD prefix
Evan Cheng8703be42006-04-04 19:12:30 +0000798def CVTPD2DQr : SDI<0xE6, MRMSrcReg, (ops VR128:$dst, VR128:$src),
799 "cvtpd2dq {$src, $dst|$dst, $src}", []>;
800def CVTPD2DQm : SDI<0xE6, MRMSrcMem, (ops VR128:$dst, f128mem:$src),
801 "cvtpd2dq {$src, $dst|$dst, $src}", []>;
Evan Cheng470a6ad2006-02-22 02:26:30 +0000802
803// SSE2 instructions without OpSize prefix
Evan Cheng8703be42006-04-04 19:12:30 +0000804def CVTPS2PDr : I<0x5A, MRMSrcReg, (ops VR128:$dst, VR128:$src),
805 "cvtps2pd {$src, $dst|$dst, $src}", []>, TB,
806 Requires<[HasSSE2]>;
807def CVTPS2PDm : I<0x5A, MRMSrcReg, (ops VR128:$dst, f64mem:$src),
808 "cvtps2pd {$src, $dst|$dst, $src}", []>, TB,
809 Requires<[HasSSE2]>;
Evan Cheng470a6ad2006-02-22 02:26:30 +0000810
Evan Cheng8703be42006-04-04 19:12:30 +0000811def CVTPD2PSr : PDI<0x5A, MRMSrcReg, (ops VR128:$dst, VR128:$src),
812 "cvtpd2ps {$src, $dst|$dst, $src}", []>;
813def CVTPD2PSm : PDI<0x5A, MRMSrcReg, (ops VR128:$dst, f128mem:$src),
814 "cvtpd2ps {$src, $dst|$dst, $src}", []>;
Evan Cheng470a6ad2006-02-22 02:26:30 +0000815
816// Arithmetic
817let isTwoAddress = 1 in {
818let isCommutable = 1 in {
Evan Cheng2246f842006-03-18 01:23:20 +0000819def ADDPSrr : PSI<0x58, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000820 "addps {$src2, $dst|$dst, $src2}",
Evan Cheng2246f842006-03-18 01:23:20 +0000821 [(set VR128:$dst, (v4f32 (fadd VR128:$src1, VR128:$src2)))]>;
822def ADDPDrr : PDI<0x58, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000823 "addpd {$src2, $dst|$dst, $src2}",
Evan Cheng2246f842006-03-18 01:23:20 +0000824 [(set VR128:$dst, (v2f64 (fadd VR128:$src1, VR128:$src2)))]>;
825def MULPSrr : PSI<0x59, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000826 "mulps {$src2, $dst|$dst, $src2}",
Evan Cheng2246f842006-03-18 01:23:20 +0000827 [(set VR128:$dst, (v4f32 (fmul VR128:$src1, VR128:$src2)))]>;
828def MULPDrr : PDI<0x59, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000829 "mulpd {$src2, $dst|$dst, $src2}",
Evan Cheng2246f842006-03-18 01:23:20 +0000830 [(set VR128:$dst, (v2f64 (fmul VR128:$src1, VR128:$src2)))]>;
Evan Cheng470a6ad2006-02-22 02:26:30 +0000831}
832
Evan Cheng2246f842006-03-18 01:23:20 +0000833def ADDPSrm : PSI<0x58, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000834 "addps {$src2, $dst|$dst, $src2}",
Evan Cheng2246f842006-03-18 01:23:20 +0000835 [(set VR128:$dst, (v4f32 (fadd VR128:$src1,
836 (load addr:$src2))))]>;
837def ADDPDrm : PDI<0x58, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000838 "addpd {$src2, $dst|$dst, $src2}",
Evan Cheng2246f842006-03-18 01:23:20 +0000839 [(set VR128:$dst, (v2f64 (fadd VR128:$src1,
840 (load addr:$src2))))]>;
841def MULPSrm : PSI<0x59, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000842 "mulps {$src2, $dst|$dst, $src2}",
Evan Cheng2246f842006-03-18 01:23:20 +0000843 [(set VR128:$dst, (v4f32 (fmul VR128:$src1,
844 (load addr:$src2))))]>;
845def MULPDrm : PDI<0x59, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000846 "mulpd {$src2, $dst|$dst, $src2}",
Evan Cheng2246f842006-03-18 01:23:20 +0000847 [(set VR128:$dst, (v2f64 (fmul VR128:$src1,
848 (load addr:$src2))))]>;
Evan Cheng470a6ad2006-02-22 02:26:30 +0000849
Evan Cheng2246f842006-03-18 01:23:20 +0000850def DIVPSrr : PSI<0x5E, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
851 "divps {$src2, $dst|$dst, $src2}",
852 [(set VR128:$dst, (v4f32 (fdiv VR128:$src1, VR128:$src2)))]>;
853def DIVPSrm : PSI<0x5E, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
854 "divps {$src2, $dst|$dst, $src2}",
855 [(set VR128:$dst, (v4f32 (fdiv VR128:$src1,
856 (load addr:$src2))))]>;
857def DIVPDrr : PDI<0x5E, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000858 "divpd {$src2, $dst|$dst, $src2}",
Evan Cheng2246f842006-03-18 01:23:20 +0000859 [(set VR128:$dst, (v2f64 (fdiv VR128:$src1, VR128:$src2)))]>;
860def DIVPDrm : PDI<0x5E, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000861 "divpd {$src2, $dst|$dst, $src2}",
Evan Cheng2246f842006-03-18 01:23:20 +0000862 [(set VR128:$dst, (v2f64 (fdiv VR128:$src1,
863 (load addr:$src2))))]>;
Evan Cheng470a6ad2006-02-22 02:26:30 +0000864
Evan Cheng2246f842006-03-18 01:23:20 +0000865def SUBPSrr : PSI<0x5C, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
866 "subps {$src2, $dst|$dst, $src2}",
867 [(set VR128:$dst, (v4f32 (fsub VR128:$src1, VR128:$src2)))]>;
868def SUBPSrm : PSI<0x5C, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
869 "subps {$src2, $dst|$dst, $src2}",
870 [(set VR128:$dst, (v4f32 (fsub VR128:$src1,
871 (load addr:$src2))))]>;
872def SUBPDrr : PDI<0x5C, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
873 "subpd {$src2, $dst|$dst, $src2}",
Evan Cheng2c0dbd02006-03-24 02:58:06 +0000874 [(set VR128:$dst, (v2f64 (fsub VR128:$src1, VR128:$src2)))]>;
Evan Cheng2246f842006-03-18 01:23:20 +0000875def SUBPDrm : PDI<0x5C, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
876 "subpd {$src2, $dst|$dst, $src2}",
Evan Cheng2c0dbd02006-03-24 02:58:06 +0000877 [(set VR128:$dst, (v2f64 (fsub VR128:$src1,
878 (load addr:$src2))))]>;
Evan Cheng470a6ad2006-02-22 02:26:30 +0000879}
880
Evan Cheng8703be42006-04-04 19:12:30 +0000881def SQRTPSr : PS_Intr<0x51, "sqrtps {$src, $dst|$dst, $src}",
882 int_x86_sse_sqrt_ps>;
883def SQRTPSm : PS_Intm<0x51, "sqrtps {$src, $dst|$dst, $src}",
884 int_x86_sse_sqrt_ps>;
885def SQRTPDr : PD_Intr<0x51, "sqrtpd {$src, $dst|$dst, $src}",
886 int_x86_sse2_sqrt_pd>;
887def SQRTPDm : PD_Intm<0x51, "sqrtpd {$src, $dst|$dst, $src}",
888 int_x86_sse2_sqrt_pd>;
Evan Cheng470a6ad2006-02-22 02:26:30 +0000889
Evan Cheng8703be42006-04-04 19:12:30 +0000890def RSQRTPSr : PS_Intr<0x52, "rsqrtps {$src, $dst|$dst, $src}",
891 int_x86_sse_rsqrt_ps>;
892def RSQRTPSm : PS_Intm<0x52, "rsqrtps {$src, $dst|$dst, $src}",
893 int_x86_sse_rsqrt_ps>;
894def RCPPSr : PS_Intr<0x53, "rcpps {$src, $dst|$dst, $src}",
895 int_x86_sse_rcp_ps>;
896def RCPPSm : PS_Intm<0x53, "rcpps {$src, $dst|$dst, $src}",
897 int_x86_sse_rcp_ps>;
Evan Cheng470a6ad2006-02-22 02:26:30 +0000898
Evan Cheng97ac5fa2006-04-03 23:49:17 +0000899let isTwoAddress = 1 in {
900def MAXPSrr : PS_Intrr<0x5F, "maxps {$src2, $dst|$dst, $src2}",
901 int_x86_sse_max_ps>;
902def MAXPSrm : PS_Intrm<0x5F, "maxps {$src2, $dst|$dst, $src2}",
903 int_x86_sse_max_ps>;
904def MAXPDrr : PD_Intrr<0x5F, "maxpd {$src2, $dst|$dst, $src2}",
905 int_x86_sse2_max_pd>;
906def MAXPDrm : PD_Intrm<0x5F, "maxpd {$src2, $dst|$dst, $src2}",
907 int_x86_sse2_max_pd>;
908def MINPSrr : PS_Intrr<0x5D, "minps {$src2, $dst|$dst, $src2}",
909 int_x86_sse_min_ps>;
910def MINPSrm : PS_Intrm<0x5D, "minps {$src2, $dst|$dst, $src2}",
911 int_x86_sse_min_ps>;
912def MINPDrr : PD_Intrr<0x5D, "minpd {$src2, $dst|$dst, $src2}",
913 int_x86_sse2_min_pd>;
914def MINPDrm : PD_Intrm<0x5D, "minpd {$src2, $dst|$dst, $src2}",
915 int_x86_sse2_min_pd>;
916}
Evan Chengffcb95b2006-02-21 19:13:53 +0000917
918// Logical
919let isTwoAddress = 1 in {
920let isCommutable = 1 in {
Evan Cheng2246f842006-03-18 01:23:20 +0000921def ANDPSrr : PSI<0x54, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
922 "andps {$src2, $dst|$dst, $src2}",
Evan Cheng5aa97b22006-03-29 18:47:40 +0000923 [(set VR128:$dst,
924 (and (bc_v4i32 (v4f32 VR128:$src1)),
925 (bc_v4i32 (v4f32 VR128:$src2))))]>;
Evan Cheng2246f842006-03-18 01:23:20 +0000926def ANDPDrr : PDI<0x54, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
Evan Chengffcb95b2006-02-21 19:13:53 +0000927 "andpd {$src2, $dst|$dst, $src2}",
Evan Cheng5aa97b22006-03-29 18:47:40 +0000928 [(set VR128:$dst,
929 (and (bc_v2i64 (v2f64 VR128:$src1)),
930 (bc_v2i64 (v2f64 VR128:$src2))))]>;
Evan Cheng2246f842006-03-18 01:23:20 +0000931def ORPSrr : PSI<0x56, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
932 "orps {$src2, $dst|$dst, $src2}",
Evan Cheng5aa97b22006-03-29 18:47:40 +0000933 [(set VR128:$dst,
934 (or (bc_v4i32 (v4f32 VR128:$src1)),
935 (bc_v4i32 (v4f32 VR128:$src2))))]>;
Evan Cheng2246f842006-03-18 01:23:20 +0000936def ORPDrr : PDI<0x56, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
937 "orpd {$src2, $dst|$dst, $src2}",
Evan Cheng5aa97b22006-03-29 18:47:40 +0000938 [(set VR128:$dst,
939 (or (bc_v2i64 (v2f64 VR128:$src1)),
940 (bc_v2i64 (v2f64 VR128:$src2))))]>;
Evan Cheng2246f842006-03-18 01:23:20 +0000941def XORPSrr : PSI<0x57, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
942 "xorps {$src2, $dst|$dst, $src2}",
Evan Cheng5aa97b22006-03-29 18:47:40 +0000943 [(set VR128:$dst,
944 (xor (bc_v4i32 (v4f32 VR128:$src1)),
945 (bc_v4i32 (v4f32 VR128:$src2))))]>;
Evan Cheng2246f842006-03-18 01:23:20 +0000946def XORPDrr : PDI<0x57, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
947 "xorpd {$src2, $dst|$dst, $src2}",
Evan Cheng5aa97b22006-03-29 18:47:40 +0000948 [(set VR128:$dst,
949 (xor (bc_v2i64 (v2f64 VR128:$src1)),
950 (bc_v2i64 (v2f64 VR128:$src2))))]>;
Evan Chengffcb95b2006-02-21 19:13:53 +0000951}
Evan Cheng2246f842006-03-18 01:23:20 +0000952def ANDPSrm : PSI<0x54, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
953 "andps {$src2, $dst|$dst, $src2}",
Evan Cheng5aa97b22006-03-29 18:47:40 +0000954 [(set VR128:$dst,
955 (and (bc_v4i32 (v4f32 VR128:$src1)),
956 (bc_v4i32 (loadv4f32 addr:$src2))))]>;
Evan Cheng2246f842006-03-18 01:23:20 +0000957def ANDPDrm : PDI<0x54, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
958 "andpd {$src2, $dst|$dst, $src2}",
Evan Cheng5aa97b22006-03-29 18:47:40 +0000959 [(set VR128:$dst,
960 (and (bc_v2i64 (v2f64 VR128:$src1)),
961 (bc_v2i64 (loadv2f64 addr:$src2))))]>;
Evan Cheng2246f842006-03-18 01:23:20 +0000962def ORPSrm : PSI<0x56, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
963 "orps {$src2, $dst|$dst, $src2}",
Evan Cheng5aa97b22006-03-29 18:47:40 +0000964 [(set VR128:$dst,
965 (or (bc_v4i32 (v4f32 VR128:$src1)),
966 (bc_v4i32 (loadv4f32 addr:$src2))))]>;
Evan Cheng2246f842006-03-18 01:23:20 +0000967def ORPDrm : PDI<0x56, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
968 "orpd {$src2, $dst|$dst, $src2}",
Evan Cheng5aa97b22006-03-29 18:47:40 +0000969 [(set VR128:$dst,
970 (or (bc_v2i64 (v2f64 VR128:$src1)),
971 (bc_v2i64 (loadv2f64 addr:$src2))))]>;
Evan Cheng2246f842006-03-18 01:23:20 +0000972def XORPSrm : PSI<0x57, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
973 "xorps {$src2, $dst|$dst, $src2}",
Evan Cheng5aa97b22006-03-29 18:47:40 +0000974 [(set VR128:$dst,
975 (xor (bc_v4i32 (v4f32 VR128:$src1)),
976 (bc_v4i32 (loadv4f32 addr:$src2))))]>;
Evan Cheng2246f842006-03-18 01:23:20 +0000977def XORPDrm : PDI<0x57, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
978 "xorpd {$src2, $dst|$dst, $src2}",
Evan Cheng5aa97b22006-03-29 18:47:40 +0000979 [(set VR128:$dst,
980 (xor (bc_v2i64 (v2f64 VR128:$src1)),
981 (bc_v2i64 (loadv2f64 addr:$src2))))]>;
Evan Cheng2246f842006-03-18 01:23:20 +0000982def ANDNPSrr : PSI<0x55, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
983 "andnps {$src2, $dst|$dst, $src2}",
Evan Cheng5aa97b22006-03-29 18:47:40 +0000984 [(set VR128:$dst,
985 (and (vnot (bc_v4i32 (v4f32 VR128:$src1))),
986 (bc_v4i32 (v4f32 VR128:$src2))))]>;
987def ANDNPSrm : PSI<0x55, MRMSrcMem, (ops VR128:$dst, VR128:$src1,f128mem:$src2),
Evan Cheng2246f842006-03-18 01:23:20 +0000988 "andnps {$src2, $dst|$dst, $src2}",
Evan Cheng5aa97b22006-03-29 18:47:40 +0000989 [(set VR128:$dst,
990 (and (vnot (bc_v4i32 (v4f32 VR128:$src1))),
991 (bc_v4i32 (loadv4f32 addr:$src2))))]>;
Evan Cheng2246f842006-03-18 01:23:20 +0000992def ANDNPDrr : PDI<0x55, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
993 "andnpd {$src2, $dst|$dst, $src2}",
Evan Cheng5aa97b22006-03-29 18:47:40 +0000994 [(set VR128:$dst,
995 (and (vnot (bc_v2i64 (v2f64 VR128:$src1))),
996 (bc_v2i64 (v2f64 VR128:$src2))))]>;
997def ANDNPDrm : PDI<0x55, MRMSrcMem, (ops VR128:$dst, VR128:$src1,f128mem:$src2),
Evan Cheng2246f842006-03-18 01:23:20 +0000998 "andnpd {$src2, $dst|$dst, $src2}",
Evan Cheng5aa97b22006-03-29 18:47:40 +0000999 [(set VR128:$dst,
1000 (and (vnot (bc_v2i64 (v2f64 VR128:$src1))),
1001 (bc_v2i64 (loadv2f64 addr:$src2))))]>;
Evan Chengffcb95b2006-02-21 19:13:53 +00001002}
Evan Chengbf156d12006-02-21 19:26:52 +00001003
Evan Cheng470a6ad2006-02-22 02:26:30 +00001004let isTwoAddress = 1 in {
Evan Cheng21760462006-04-04 03:04:07 +00001005def CMPPSrr : PSIi8<0xC2, MRMSrcReg,
1006 (ops VR128:$dst, VR128:$src1, VR128:$src, SSECC:$cc),
1007 "cmp${cc}ps {$src, $dst|$dst, $src}",
1008 [(set VR128:$dst, (int_x86_sse_cmp_ps VR128:$src1,
1009 VR128:$src, imm:$cc))]>;
1010def CMPPSrm : PSIi8<0xC2, MRMSrcMem,
1011 (ops VR128:$dst, VR128:$src1, f128mem:$src, SSECC:$cc),
1012 "cmp${cc}ps {$src, $dst|$dst, $src}",
1013 [(set VR128:$dst, (int_x86_sse_cmp_ps VR128:$src1,
1014 (load addr:$src), imm:$cc))]>;
1015def CMPPDrr : PDIi8<0xC2, MRMSrcReg,
1016 (ops VR128:$dst, VR128:$src1, VR128:$src, SSECC:$cc),
1017 "cmp${cc}pd {$src, $dst|$dst, $src}", []>;
1018def CMPPDrm : PDIi8<0xC2, MRMSrcMem,
1019 (ops VR128:$dst, VR128:$src1, f128mem:$src, SSECC:$cc),
1020 "cmp${cc}pd {$src, $dst|$dst, $src}", []>;
Evan Cheng470a6ad2006-02-22 02:26:30 +00001021}
1022
1023// Shuffle and unpack instructions
Evan Cheng0cea6d22006-03-22 20:08:18 +00001024let isTwoAddress = 1 in {
Evan Cheng2da953f2006-03-22 07:10:28 +00001025def SHUFPSrr : PSIi8<0xC6, MRMSrcReg,
Evan Cheng0038e592006-03-28 00:39:58 +00001026 (ops VR128:$dst, VR128:$src1, VR128:$src2, i32i8imm:$src3),
Evan Cheng14aed5e2006-03-24 01:18:28 +00001027 "shufps {$src3, $src2, $dst|$dst, $src2, $src3}",
Evan Cheng4f563382006-03-29 01:30:51 +00001028 [(set VR128:$dst, (v4f32 (vector_shuffle
1029 VR128:$src1, VR128:$src2,
1030 SHUFP_shuffle_mask:$src3)))]>;
Evan Cheng2da953f2006-03-22 07:10:28 +00001031def SHUFPSrm : PSIi8<0xC6, MRMSrcMem,
Evan Cheng0038e592006-03-28 00:39:58 +00001032 (ops VR128:$dst, VR128:$src1, f128mem:$src2, i32i8imm:$src3),
1033 "shufps {$src3, $src2, $dst|$dst, $src2, $src3}",
Evan Cheng4f563382006-03-29 01:30:51 +00001034 [(set VR128:$dst, (v4f32 (vector_shuffle
1035 VR128:$src1, (load addr:$src2),
1036 SHUFP_shuffle_mask:$src3)))]>;
Evan Cheng2da953f2006-03-22 07:10:28 +00001037def SHUFPDrr : PDIi8<0xC6, MRMSrcReg,
1038 (ops VR128:$dst, VR128:$src1, VR128:$src2, i8imm:$src3),
Evan Cheng14aed5e2006-03-24 01:18:28 +00001039 "shufpd {$src3, $src2, $dst|$dst, $src2, $src3}",
Evan Cheng4f563382006-03-29 01:30:51 +00001040 [(set VR128:$dst, (v2f64 (vector_shuffle
1041 VR128:$src1, VR128:$src2,
1042 SHUFP_shuffle_mask:$src3)))]>;
Evan Cheng2da953f2006-03-22 07:10:28 +00001043def SHUFPDrm : PDIi8<0xC6, MRMSrcMem,
1044 (ops VR128:$dst, VR128:$src1, f128mem:$src2, i8imm:$src3),
Evan Cheng0038e592006-03-28 00:39:58 +00001045 "shufpd {$src3, $src2, $dst|$dst, $src2, $src3}",
Evan Cheng4f563382006-03-29 01:30:51 +00001046 [(set VR128:$dst, (v2f64 (vector_shuffle
1047 VR128:$src1, (load addr:$src2),
1048 SHUFP_shuffle_mask:$src3)))]>;
Evan Cheng470a6ad2006-02-22 02:26:30 +00001049
1050def UNPCKHPSrr : PSI<0x15, MRMSrcReg,
Evan Cheng2246f842006-03-18 01:23:20 +00001051 (ops VR128:$dst, VR128:$src1, VR128:$src2),
Evan Cheng4fcb9222006-03-28 02:43:26 +00001052 "unpckhps {$src2, $dst|$dst, $src2}",
Evan Cheng4f563382006-03-29 01:30:51 +00001053 [(set VR128:$dst, (v4f32 (vector_shuffle
1054 VR128:$src1, VR128:$src2,
1055 UNPCKH_shuffle_mask)))]>;
Evan Cheng470a6ad2006-02-22 02:26:30 +00001056def UNPCKHPSrm : PSI<0x15, MRMSrcMem,
Evan Cheng2246f842006-03-18 01:23:20 +00001057 (ops VR128:$dst, VR128:$src1, f128mem:$src2),
Evan Cheng4fcb9222006-03-28 02:43:26 +00001058 "unpckhps {$src2, $dst|$dst, $src2}",
Evan Cheng4f563382006-03-29 01:30:51 +00001059 [(set VR128:$dst, (v4f32 (vector_shuffle
1060 VR128:$src1, (load addr:$src2),
1061 UNPCKH_shuffle_mask)))]>;
Evan Cheng470a6ad2006-02-22 02:26:30 +00001062def UNPCKHPDrr : PDI<0x15, MRMSrcReg,
Evan Cheng2246f842006-03-18 01:23:20 +00001063 (ops VR128:$dst, VR128:$src1, VR128:$src2),
Evan Cheng4fcb9222006-03-28 02:43:26 +00001064 "unpckhpd {$src2, $dst|$dst, $src2}",
Evan Cheng4f563382006-03-29 01:30:51 +00001065 [(set VR128:$dst, (v2f64 (vector_shuffle
1066 VR128:$src1, VR128:$src2,
1067 UNPCKH_shuffle_mask)))]>;
Evan Cheng470a6ad2006-02-22 02:26:30 +00001068def UNPCKHPDrm : PDI<0x15, MRMSrcMem,
Evan Cheng2246f842006-03-18 01:23:20 +00001069 (ops VR128:$dst, VR128:$src1, f128mem:$src2),
Evan Cheng4fcb9222006-03-28 02:43:26 +00001070 "unpckhpd {$src2, $dst|$dst, $src2}",
Evan Cheng4f563382006-03-29 01:30:51 +00001071 [(set VR128:$dst, (v2f64 (vector_shuffle
1072 VR128:$src1, (load addr:$src2),
1073 UNPCKH_shuffle_mask)))]>;
Evan Cheng4fcb9222006-03-28 02:43:26 +00001074
Evan Cheng470a6ad2006-02-22 02:26:30 +00001075def UNPCKLPSrr : PSI<0x14, MRMSrcReg,
Evan Cheng2246f842006-03-18 01:23:20 +00001076 (ops VR128:$dst, VR128:$src1, VR128:$src2),
Evan Chengc60bd972006-03-25 09:37:23 +00001077 "unpcklps {$src2, $dst|$dst, $src2}",
Evan Cheng4f563382006-03-29 01:30:51 +00001078 [(set VR128:$dst, (v4f32 (vector_shuffle
1079 VR128:$src1, VR128:$src2,
1080 UNPCKL_shuffle_mask)))]>;
Evan Cheng470a6ad2006-02-22 02:26:30 +00001081def UNPCKLPSrm : PSI<0x14, MRMSrcMem,
Evan Cheng2246f842006-03-18 01:23:20 +00001082 (ops VR128:$dst, VR128:$src1, f128mem:$src2),
Evan Chengc60bd972006-03-25 09:37:23 +00001083 "unpcklps {$src2, $dst|$dst, $src2}",
Evan Cheng4f563382006-03-29 01:30:51 +00001084 [(set VR128:$dst, (v4f32 (vector_shuffle
1085 VR128:$src1, (load addr:$src2),
1086 UNPCKL_shuffle_mask)))]>;
Evan Cheng470a6ad2006-02-22 02:26:30 +00001087def UNPCKLPDrr : PDI<0x14, MRMSrcReg,
Evan Cheng2246f842006-03-18 01:23:20 +00001088 (ops VR128:$dst, VR128:$src1, VR128:$src2),
Evan Cheng4fcb9222006-03-28 02:43:26 +00001089 "unpcklpd {$src2, $dst|$dst, $src2}",
Evan Cheng4f563382006-03-29 01:30:51 +00001090 [(set VR128:$dst, (v2f64 (vector_shuffle
1091 VR128:$src1, VR128:$src2,
1092 UNPCKL_shuffle_mask)))]>;
Evan Cheng470a6ad2006-02-22 02:26:30 +00001093def UNPCKLPDrm : PDI<0x14, MRMSrcMem,
Evan Cheng2246f842006-03-18 01:23:20 +00001094 (ops VR128:$dst, VR128:$src1, f128mem:$src2),
Evan Cheng4fcb9222006-03-28 02:43:26 +00001095 "unpcklpd {$src2, $dst|$dst, $src2}",
Evan Cheng4f563382006-03-29 01:30:51 +00001096 [(set VR128:$dst, (v2f64 (vector_shuffle
1097 VR128:$src1, (load addr:$src2),
1098 UNPCKL_shuffle_mask)))]>;
Evan Cheng2c0dbd02006-03-24 02:58:06 +00001099}
Evan Cheng470a6ad2006-02-22 02:26:30 +00001100
Evan Cheng4b1734f2006-03-31 21:29:33 +00001101// Horizontal ops
1102let isTwoAddress = 1 in {
1103def HADDPSrr : S3S_Intrr<0x7C, "haddps {$src2, $dst|$dst, $src2}",
1104 int_x86_sse3_hadd_ps>;
1105def HADDPSrm : S3S_Intrm<0x7C, "haddps {$src2, $dst|$dst, $src2}",
1106 int_x86_sse3_hadd_ps>;
1107def HADDPDrr : S3D_Intrr<0x7C, "haddpd {$src2, $dst|$dst, $src2}",
1108 int_x86_sse3_hadd_pd>;
1109def HADDPDrm : S3D_Intrm<0x7C, "haddpd {$src2, $dst|$dst, $src2}",
1110 int_x86_sse3_hadd_pd>;
1111def HSUBPSrr : S3S_Intrr<0x7C, "hsubps {$src2, $dst|$dst, $src2}",
1112 int_x86_sse3_hsub_ps>;
1113def HSUBPSrm : S3S_Intrm<0x7C, "hsubps {$src2, $dst|$dst, $src2}",
1114 int_x86_sse3_hsub_ps>;
1115def HSUBPDrr : S3D_Intrr<0x7C, "hsubpd {$src2, $dst|$dst, $src2}",
1116 int_x86_sse3_hsub_pd>;
1117def HSUBPDrm : S3D_Intrm<0x7C, "hsubpd {$src2, $dst|$dst, $src2}",
1118 int_x86_sse3_hsub_pd>;
1119}
1120
Evan Chengbf156d12006-02-21 19:26:52 +00001121//===----------------------------------------------------------------------===//
Evan Cheng4e4c71e2006-02-21 20:00:20 +00001122// SSE integer instructions
Evan Chengbf156d12006-02-21 19:26:52 +00001123//===----------------------------------------------------------------------===//
1124
Evan Cheng4e4c71e2006-02-21 20:00:20 +00001125// Move Instructions
Evan Cheng24dc1f52006-03-23 07:44:07 +00001126def MOVDQArr : PDI<0x6F, MRMSrcReg, (ops VR128:$dst, VR128:$src),
1127 "movdqa {$src, $dst|$dst, $src}", []>;
1128def MOVDQArm : PDI<0x6F, MRMSrcMem, (ops VR128:$dst, i128mem:$src),
1129 "movdqa {$src, $dst|$dst, $src}",
1130 [(set VR128:$dst, (loadv4i32 addr:$src))]>;
1131def MOVDQAmr : PDI<0x7F, MRMDestMem, (ops i128mem:$dst, VR128:$src),
1132 "movdqa {$src, $dst|$dst, $src}",
1133 [(store (v4i32 VR128:$src), addr:$dst)]>;
1134
Evan Chenga971f6f2006-03-23 01:57:24 +00001135// 128-bit Integer Arithmetic
1136let isTwoAddress = 1 in {
1137let isCommutable = 1 in {
1138def PADDBrr : PDI<0xFC, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
1139 "paddb {$src2, $dst|$dst, $src2}",
1140 [(set VR128:$dst, (v16i8 (add VR128:$src1, VR128:$src2)))]>;
1141def PADDWrr : PDI<0xFD, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
1142 "paddw {$src2, $dst|$dst, $src2}",
1143 [(set VR128:$dst, (v8i16 (add VR128:$src1, VR128:$src2)))]>;
1144def PADDDrr : PDI<0xFE, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
1145 "paddd {$src2, $dst|$dst, $src2}",
1146 [(set VR128:$dst, (v4i32 (add VR128:$src1, VR128:$src2)))]>;
Evan Cheng506d3df2006-03-29 23:07:14 +00001147
1148def PADDQrr : PDI<0xD4, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
1149 "paddq {$src2, $dst|$dst, $src2}",
1150 [(set VR128:$dst, (v2i64 (add VR128:$src1, VR128:$src2)))]>;
Evan Chenga971f6f2006-03-23 01:57:24 +00001151}
1152def PADDBrm : PDI<0xFC, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
1153 "paddb {$src2, $dst|$dst, $src2}",
1154 [(set VR128:$dst, (v16i8 (add VR128:$src1,
1155 (load addr:$src2))))]>;
1156def PADDWrm : PDI<0xFD, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
1157 "paddw {$src2, $dst|$dst, $src2}",
1158 [(set VR128:$dst, (v8i16 (add VR128:$src1,
1159 (load addr:$src2))))]>;
1160def PADDDrm : PDI<0xFE, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
1161 "paddd {$src2, $dst|$dst, $src2}",
1162 [(set VR128:$dst, (v4i32 (add VR128:$src1,
1163 (load addr:$src2))))]>;
Evan Cheng506d3df2006-03-29 23:07:14 +00001164def PADDQrm : PDI<0xD4, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
1165 "paddd {$src2, $dst|$dst, $src2}",
1166 [(set VR128:$dst, (v2i64 (add VR128:$src1,
1167 (load addr:$src2))))]>;
Evan Cheng7b1d34b2006-03-25 01:33:37 +00001168
1169def PSUBBrr : PDI<0xF8, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
1170 "psubb {$src2, $dst|$dst, $src2}",
1171 [(set VR128:$dst, (v16i8 (sub VR128:$src1, VR128:$src2)))]>;
1172def PSUBWrr : PDI<0xF9, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
1173 "psubw {$src2, $dst|$dst, $src2}",
1174 [(set VR128:$dst, (v8i16 (sub VR128:$src1, VR128:$src2)))]>;
1175def PSUBDrr : PDI<0xFA, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
1176 "psubd {$src2, $dst|$dst, $src2}",
1177 [(set VR128:$dst, (v4i32 (sub VR128:$src1, VR128:$src2)))]>;
Evan Cheng506d3df2006-03-29 23:07:14 +00001178def PSUBQrr : PDI<0xFB, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
1179 "psubq {$src2, $dst|$dst, $src2}",
1180 [(set VR128:$dst, (v2i64 (sub VR128:$src1, VR128:$src2)))]>;
Evan Cheng7b1d34b2006-03-25 01:33:37 +00001181
1182def PSUBBrm : PDI<0xF8, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
1183 "psubb {$src2, $dst|$dst, $src2}",
1184 [(set VR128:$dst, (v16i8 (sub VR128:$src1,
1185 (load addr:$src2))))]>;
1186def PSUBWrm : PDI<0xF9, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
1187 "psubw {$src2, $dst|$dst, $src2}",
1188 [(set VR128:$dst, (v8i16 (sub VR128:$src1,
1189 (load addr:$src2))))]>;
1190def PSUBDrm : PDI<0xFA, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
1191 "psubd {$src2, $dst|$dst, $src2}",
1192 [(set VR128:$dst, (v4i32 (sub VR128:$src1,
1193 (load addr:$src2))))]>;
Evan Cheng506d3df2006-03-29 23:07:14 +00001194def PSUBQrm : PDI<0xFB, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
1195 "psubd {$src2, $dst|$dst, $src2}",
1196 [(set VR128:$dst, (v2i64 (sub VR128:$src1,
1197 (load addr:$src2))))]>;
1198}
Evan Chengc60bd972006-03-25 09:37:23 +00001199
Evan Chengff65e382006-04-04 21:49:39 +00001200let isTwoAddress = 1 in {
1201def PSLLDQri : PDIi8<0x73, MRM7r, (ops VR128:$dst, VR128:$src1, i32i8imm:$src2),
1202 "pslldq {$src2, $dst|$dst, $src2}", []>;
1203def PSRLDQri : PDIi8<0x73, MRM7r, (ops VR128:$dst, VR128:$src1, i32i8imm:$src2),
1204 "psrldq {$src2, $dst|$dst, $src2}", []>;
1205}
1206
Evan Cheng506d3df2006-03-29 23:07:14 +00001207// Logical
1208let isTwoAddress = 1 in {
1209let isCommutable = 1 in {
1210def PANDrr : PDI<0xDB, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
1211 "pand {$src2, $dst|$dst, $src2}",
1212 [(set VR128:$dst, (v2i64 (and VR128:$src1, VR128:$src2)))]>;
1213
1214def PANDrm : PDI<0xDB, MRMSrcMem, (ops VR128:$dst, VR128:$src1, i128mem:$src2),
1215 "pand {$src2, $dst|$dst, $src2}",
1216 [(set VR128:$dst, (v2i64 (and VR128:$src1,
1217 (load addr:$src2))))]>;
Evan Chengc6cb5bb2006-04-06 01:49:20 +00001218def PORrr : PDI<0xEB, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
Evan Cheng506d3df2006-03-29 23:07:14 +00001219 "por {$src2, $dst|$dst, $src2}",
1220 [(set VR128:$dst, (v2i64 (or VR128:$src1, VR128:$src2)))]>;
1221
Evan Chengc6cb5bb2006-04-06 01:49:20 +00001222def PORrm : PDI<0xEB, MRMSrcMem, (ops VR128:$dst, VR128:$src1, i128mem:$src2),
Evan Cheng506d3df2006-03-29 23:07:14 +00001223 "por {$src2, $dst|$dst, $src2}",
1224 [(set VR128:$dst, (v2i64 (or VR128:$src1,
1225 (load addr:$src2))))]>;
1226def PXORrr : PDI<0xEF, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
1227 "pxor {$src2, $dst|$dst, $src2}",
1228 [(set VR128:$dst, (v2i64 (xor VR128:$src1, VR128:$src2)))]>;
1229
1230def PXORrm : PDI<0xEF, MRMSrcMem, (ops VR128:$dst, VR128:$src1, i128mem:$src2),
1231 "pxor {$src2, $dst|$dst, $src2}",
1232 [(set VR128:$dst, (v2i64 (xor VR128:$src1,
1233 (load addr:$src2))))]>;
1234}
1235
1236def PANDNrr : PDI<0xDF, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
1237 "pandn {$src2, $dst|$dst, $src2}",
1238 [(set VR128:$dst, (v2i64 (and (vnot VR128:$src1),
1239 VR128:$src2)))]>;
1240
1241def PANDNrm : PDI<0xDF, MRMSrcMem, (ops VR128:$dst, VR128:$src1, i128mem:$src2),
1242 "pandn {$src2, $dst|$dst, $src2}",
1243 [(set VR128:$dst, (v2i64 (and (vnot VR128:$src1),
1244 (load addr:$src2))))]>;
1245}
1246
1247// Pack instructions
1248let isTwoAddress = 1 in {
1249def PACKSSWBrr : PDI<0x63, MRMSrcReg, (ops VR128:$dst, VR128:$src1,
1250 VR128:$src2),
1251 "packsswb {$src2, $dst|$dst, $src2}",
Evan Cheng591f7402006-03-29 23:53:14 +00001252 [(set VR128:$dst, (v8i16 (int_x86_sse2_packsswb_128
1253 VR128:$src1,
1254 VR128:$src2)))]>;
Evan Cheng506d3df2006-03-29 23:07:14 +00001255def PACKSSWBrm : PDI<0x63, MRMSrcMem, (ops VR128:$dst, VR128:$src1,
1256 i128mem:$src2),
1257 "packsswb {$src2, $dst|$dst, $src2}",
Evan Cheng591f7402006-03-29 23:53:14 +00001258 [(set VR128:$dst, (v8i16 (int_x86_sse2_packsswb_128
1259 VR128:$src1,
1260 (bc_v8i16 (loadv2f64 addr:$src2)))))]>;
Evan Cheng506d3df2006-03-29 23:07:14 +00001261def PACKSSDWrr : PDI<0x6B, MRMSrcReg, (ops VR128:$dst, VR128:$src1,
1262 VR128:$src2),
Evan Cheng591f7402006-03-29 23:53:14 +00001263 "packssdw {$src2, $dst|$dst, $src2}",
1264 [(set VR128:$dst, (v4i32 (int_x86_sse2_packssdw_128
1265 VR128:$src1,
1266 VR128:$src2)))]>;
Evan Cheng506d3df2006-03-29 23:07:14 +00001267def PACKSSDWrm : PDI<0x6B, MRMSrcReg, (ops VR128:$dst, VR128:$src1,
1268 i128mem:$src2),
Evan Cheng591f7402006-03-29 23:53:14 +00001269 "packssdw {$src2, $dst|$dst, $src2}",
1270 [(set VR128:$dst, (v4i32 (int_x86_sse2_packssdw_128
1271 VR128:$src1,
1272 (bc_v4i32 (loadv2i64 addr:$src2)))))]>;
Evan Cheng506d3df2006-03-29 23:07:14 +00001273def PACKUSWBrr : PDI<0x67, MRMSrcReg, (ops VR128:$dst, VR128:$src1,
1274 VR128:$src2),
1275 "packuswb {$src2, $dst|$dst, $src2}",
Evan Cheng591f7402006-03-29 23:53:14 +00001276 [(set VR128:$dst, (v8i16 (int_x86_sse2_packuswb_128
1277 VR128:$src1,
1278 VR128:$src2)))]>;
Evan Cheng506d3df2006-03-29 23:07:14 +00001279def PACKUSWBrm : PDI<0x67, MRMSrcReg, (ops VR128:$dst, VR128:$src1,
1280 i128mem:$src2),
1281 "packuswb {$src2, $dst|$dst, $src2}",
Evan Cheng591f7402006-03-29 23:53:14 +00001282 [(set VR128:$dst, (v8i16 (int_x86_sse2_packuswb_128
1283 VR128:$src1,
1284 (bc_v8i16 (loadv2i64 addr:$src2)))))]>;
Evan Cheng506d3df2006-03-29 23:07:14 +00001285}
1286
1287// Shuffle and unpack instructions
Evan Cheng8703be42006-04-04 19:12:30 +00001288def PSHUFWri : PSIi8<0x70, MRMSrcReg,
Evan Cheng506d3df2006-03-29 23:07:14 +00001289 (ops VR64:$dst, VR64:$src1, i8imm:$src2),
1290 "pshufw {$src2, $src1, $dst|$dst, $src1, $src2}", []>;
Evan Cheng8703be42006-04-04 19:12:30 +00001291def PSHUFWmi : PSIi8<0x70, MRMSrcMem,
Evan Cheng506d3df2006-03-29 23:07:14 +00001292 (ops VR64:$dst, i64mem:$src1, i8imm:$src2),
1293 "pshufw {$src2, $src1, $dst|$dst, $src1, $src2}", []>;
1294
Evan Cheng8703be42006-04-04 19:12:30 +00001295def PSHUFDri : PDIi8<0x70, MRMSrcReg,
Evan Cheng506d3df2006-03-29 23:07:14 +00001296 (ops VR128:$dst, VR128:$src1, i8imm:$src2),
1297 "pshufd {$src2, $src1, $dst|$dst, $src1, $src2}",
1298 [(set VR128:$dst, (v4i32 (vector_shuffle
1299 VR128:$src1, (undef),
1300 PSHUFD_shuffle_mask:$src2)))]>;
Evan Cheng8703be42006-04-04 19:12:30 +00001301def PSHUFDmi : PDIi8<0x70, MRMSrcMem,
Evan Cheng506d3df2006-03-29 23:07:14 +00001302 (ops VR128:$dst, i128mem:$src1, i8imm:$src2),
1303 "pshufd {$src2, $src1, $dst|$dst, $src1, $src2}",
1304 [(set VR128:$dst, (v4i32 (vector_shuffle
1305 (load addr:$src1), (undef),
1306 PSHUFD_shuffle_mask:$src2)))]>;
1307
1308// SSE2 with ImmT == Imm8 and XS prefix.
Evan Cheng8703be42006-04-04 19:12:30 +00001309def PSHUFHWri : Ii8<0x70, MRMSrcReg,
Evan Cheng506d3df2006-03-29 23:07:14 +00001310 (ops VR128:$dst, VR128:$src1, i8imm:$src2),
1311 "pshufhw {$src2, $src1, $dst|$dst, $src1, $src2}",
1312 [(set VR128:$dst, (v8i16 (vector_shuffle
1313 VR128:$src1, (undef),
1314 PSHUFHW_shuffle_mask:$src2)))]>,
1315 XS, Requires<[HasSSE2]>;
Evan Cheng8703be42006-04-04 19:12:30 +00001316def PSHUFHWmi : Ii8<0x70, MRMSrcMem,
Evan Cheng506d3df2006-03-29 23:07:14 +00001317 (ops VR128:$dst, i128mem:$src1, i8imm:$src2),
1318 "pshufhw {$src2, $src1, $dst|$dst, $src1, $src2}",
1319 [(set VR128:$dst, (v8i16 (vector_shuffle
1320 (bc_v8i16 (loadv2i64 addr:$src1)), (undef),
1321 PSHUFHW_shuffle_mask:$src2)))]>,
1322 XS, Requires<[HasSSE2]>;
1323
1324// SSE2 with ImmT == Imm8 and XD prefix.
Evan Cheng8703be42006-04-04 19:12:30 +00001325def PSHUFLWri : Ii8<0x70, MRMSrcReg,
Evan Cheng506d3df2006-03-29 23:07:14 +00001326 (ops VR128:$dst, VR128:$src1, i32i8imm:$src2),
Evan Cheng7d9061e2006-03-30 19:54:57 +00001327 "pshuflw {$src2, $src1, $dst|$dst, $src1, $src2}",
Evan Cheng506d3df2006-03-29 23:07:14 +00001328 [(set VR128:$dst, (v8i16 (vector_shuffle
1329 VR128:$src1, (undef),
1330 PSHUFLW_shuffle_mask:$src2)))]>,
1331 XD, Requires<[HasSSE2]>;
Evan Cheng8703be42006-04-04 19:12:30 +00001332def PSHUFLWmi : Ii8<0x70, MRMSrcMem,
Evan Cheng506d3df2006-03-29 23:07:14 +00001333 (ops VR128:$dst, i128mem:$src1, i32i8imm:$src2),
Evan Cheng7d9061e2006-03-30 19:54:57 +00001334 "pshuflw {$src2, $src1, $dst|$dst, $src1, $src2}",
Evan Cheng506d3df2006-03-29 23:07:14 +00001335 [(set VR128:$dst, (v8i16 (vector_shuffle
1336 (bc_v8i16 (loadv2i64 addr:$src1)), (undef),
1337 PSHUFLW_shuffle_mask:$src2)))]>,
1338 XD, Requires<[HasSSE2]>;
1339
1340let isTwoAddress = 1 in {
Evan Chengc60bd972006-03-25 09:37:23 +00001341def PUNPCKLBWrr : PDI<0x60, MRMSrcReg,
1342 (ops VR128:$dst, VR128:$src1, VR128:$src2),
1343 "punpcklbw {$src2, $dst|$dst, $src2}",
Evan Cheng0038e592006-03-28 00:39:58 +00001344 [(set VR128:$dst,
1345 (v16i8 (vector_shuffle VR128:$src1, VR128:$src2,
1346 UNPCKL_shuffle_mask)))]>;
Evan Chengc60bd972006-03-25 09:37:23 +00001347def PUNPCKLBWrm : PDI<0x60, MRMSrcMem,
1348 (ops VR128:$dst, VR128:$src1, i128mem:$src2),
1349 "punpcklbw {$src2, $dst|$dst, $src2}",
Evan Cheng0038e592006-03-28 00:39:58 +00001350 [(set VR128:$dst,
1351 (v16i8 (vector_shuffle VR128:$src1, (load addr:$src2),
1352 UNPCKL_shuffle_mask)))]>;
Evan Chengc60bd972006-03-25 09:37:23 +00001353def PUNPCKLWDrr : PDI<0x61, MRMSrcReg,
1354 (ops VR128:$dst, VR128:$src1, VR128:$src2),
1355 "punpcklwd {$src2, $dst|$dst, $src2}",
Evan Cheng0038e592006-03-28 00:39:58 +00001356 [(set VR128:$dst,
1357 (v8i16 (vector_shuffle VR128:$src1, VR128:$src2,
1358 UNPCKL_shuffle_mask)))]>;
Evan Chengc60bd972006-03-25 09:37:23 +00001359def PUNPCKLWDrm : PDI<0x61, MRMSrcMem,
1360 (ops VR128:$dst, VR128:$src1, i128mem:$src2),
1361 "punpcklwd {$src2, $dst|$dst, $src2}",
Evan Cheng0038e592006-03-28 00:39:58 +00001362 [(set VR128:$dst,
1363 (v8i16 (vector_shuffle VR128:$src1, (load addr:$src2),
1364 UNPCKL_shuffle_mask)))]>;
Evan Chengc60bd972006-03-25 09:37:23 +00001365def PUNPCKLDQrr : PDI<0x62, MRMSrcReg,
1366 (ops VR128:$dst, VR128:$src1, VR128:$src2),
1367 "punpckldq {$src2, $dst|$dst, $src2}",
Evan Cheng0038e592006-03-28 00:39:58 +00001368 [(set VR128:$dst,
1369 (v4i32 (vector_shuffle VR128:$src1, VR128:$src2,
1370 UNPCKL_shuffle_mask)))]>;
Evan Chengc60bd972006-03-25 09:37:23 +00001371def PUNPCKLDQrm : PDI<0x62, MRMSrcMem,
1372 (ops VR128:$dst, VR128:$src1, i128mem:$src2),
1373 "punpckldq {$src2, $dst|$dst, $src2}",
Evan Cheng0038e592006-03-28 00:39:58 +00001374 [(set VR128:$dst,
1375 (v4i32 (vector_shuffle VR128:$src1, (load addr:$src2),
1376 UNPCKL_shuffle_mask)))]>;
Evan Chengc60bd972006-03-25 09:37:23 +00001377def PUNPCKLQDQrr : PDI<0x6C, MRMSrcReg,
1378 (ops VR128:$dst, VR128:$src1, VR128:$src2),
Evan Cheng4fcb9222006-03-28 02:43:26 +00001379 "punpcklqdq {$src2, $dst|$dst, $src2}",
1380 [(set VR128:$dst,
1381 (v2i64 (vector_shuffle VR128:$src1, VR128:$src2,
1382 UNPCKL_shuffle_mask)))]>;
Evan Chengc60bd972006-03-25 09:37:23 +00001383def PUNPCKLQDQrm : PDI<0x6C, MRMSrcMem,
1384 (ops VR128:$dst, VR128:$src1, i128mem:$src2),
Evan Cheng4fcb9222006-03-28 02:43:26 +00001385 "punpcklqdq {$src2, $dst|$dst, $src2}",
1386 [(set VR128:$dst,
1387 (v2i64 (vector_shuffle VR128:$src1, (load addr:$src2),
1388 UNPCKL_shuffle_mask)))]>;
Evan Chengc60bd972006-03-25 09:37:23 +00001389
1390def PUNPCKHBWrr : PDI<0x68, MRMSrcReg,
1391 (ops VR128:$dst, VR128:$src1, VR128:$src2),
Evan Cheng4fcb9222006-03-28 02:43:26 +00001392 "punpckhbw {$src2, $dst|$dst, $src2}",
1393 [(set VR128:$dst,
1394 (v16i8 (vector_shuffle VR128:$src1, VR128:$src2,
1395 UNPCKH_shuffle_mask)))]>;
Evan Chengc60bd972006-03-25 09:37:23 +00001396def PUNPCKHBWrm : PDI<0x68, MRMSrcMem,
1397 (ops VR128:$dst, VR128:$src1, i128mem:$src2),
Evan Cheng4fcb9222006-03-28 02:43:26 +00001398 "punpckhbw {$src2, $dst|$dst, $src2}",
1399 [(set VR128:$dst,
1400 (v16i8 (vector_shuffle VR128:$src1, (load addr:$src2),
1401 UNPCKH_shuffle_mask)))]>;
Evan Chengc60bd972006-03-25 09:37:23 +00001402def PUNPCKHWDrr : PDI<0x69, MRMSrcReg,
1403 (ops VR128:$dst, VR128:$src1, VR128:$src2),
Evan Cheng4fcb9222006-03-28 02:43:26 +00001404 "punpckhwd {$src2, $dst|$dst, $src2}",
1405 [(set VR128:$dst,
1406 (v8i16 (vector_shuffle VR128:$src1, VR128:$src2,
1407 UNPCKH_shuffle_mask)))]>;
Evan Chengc60bd972006-03-25 09:37:23 +00001408def PUNPCKHWDrm : PDI<0x69, MRMSrcMem,
1409 (ops VR128:$dst, VR128:$src1, i128mem:$src2),
Evan Cheng4fcb9222006-03-28 02:43:26 +00001410 "punpckhwd {$src2, $dst|$dst, $src2}",
1411 [(set VR128:$dst,
1412 (v8i16 (vector_shuffle VR128:$src1, (load addr:$src2),
1413 UNPCKH_shuffle_mask)))]>;
Evan Chengc60bd972006-03-25 09:37:23 +00001414def PUNPCKHDQrr : PDI<0x6A, MRMSrcReg,
1415 (ops VR128:$dst, VR128:$src1, VR128:$src2),
Evan Cheng4fcb9222006-03-28 02:43:26 +00001416 "punpckhdq {$src2, $dst|$dst, $src2}",
1417 [(set VR128:$dst,
1418 (v4i32 (vector_shuffle VR128:$src1, VR128:$src2,
1419 UNPCKH_shuffle_mask)))]>;
Evan Chengc60bd972006-03-25 09:37:23 +00001420def PUNPCKHDQrm : PDI<0x6A, MRMSrcMem,
1421 (ops VR128:$dst, VR128:$src1, i128mem:$src2),
Evan Cheng4fcb9222006-03-28 02:43:26 +00001422 "punpckhdq {$src2, $dst|$dst, $src2}",
1423 [(set VR128:$dst,
1424 (v4i32 (vector_shuffle VR128:$src1, (load addr:$src2),
1425 UNPCKH_shuffle_mask)))]>;
Evan Chengc60bd972006-03-25 09:37:23 +00001426def PUNPCKHQDQrr : PDI<0x6D, MRMSrcReg,
1427 (ops VR128:$dst, VR128:$src1, VR128:$src2),
Evan Cheng4fcb9222006-03-28 02:43:26 +00001428 "punpckhdq {$src2, $dst|$dst, $src2}",
1429 [(set VR128:$dst,
1430 (v2i64 (vector_shuffle VR128:$src1, VR128:$src2,
1431 UNPCKH_shuffle_mask)))]>;
Evan Chengc60bd972006-03-25 09:37:23 +00001432def PUNPCKHQDQrm : PDI<0x6D, MRMSrcMem,
1433 (ops VR128:$dst, VR128:$src1, i128mem:$src2),
Evan Cheng4fcb9222006-03-28 02:43:26 +00001434 "punpckhqdq {$src2, $dst|$dst, $src2}",
1435 [(set VR128:$dst,
1436 (v2i64 (vector_shuffle VR128:$src1, (load addr:$src2),
1437 UNPCKH_shuffle_mask)))]>;
Evan Chenga971f6f2006-03-23 01:57:24 +00001438}
Evan Cheng82521dd2006-03-21 07:09:35 +00001439
Evan Chengb067a1e2006-03-31 19:22:53 +00001440// Extract / Insert
Evan Cheng8703be42006-04-04 19:12:30 +00001441def PEXTRWr : PDIi8<0xC5, MRMSrcReg,
1442 (ops R32:$dst, VR128:$src1, i32i8imm:$src2),
1443 "pextrw {$src2, $src1, $dst|$dst, $src1, $src2}",
1444 [(set R32:$dst, (X86pextrw (v8i16 VR128:$src1),
1445 (i32 imm:$src2)))]>;
1446def PEXTRWm : PDIi8<0xC5, MRMSrcMem,
1447 (ops R32:$dst, i128mem:$src1, i32i8imm:$src2),
1448 "pextrw {$src2, $src1, $dst|$dst, $src1, $src2}",
1449 [(set R32:$dst, (X86pextrw (loadv8i16 addr:$src1),
1450 (i32 imm:$src2)))]>;
Evan Chengb067a1e2006-03-31 19:22:53 +00001451
1452let isTwoAddress = 1 in {
Evan Cheng8703be42006-04-04 19:12:30 +00001453def PINSRWr : PDIi8<0xC4, MRMSrcReg,
Evan Chengb067a1e2006-03-31 19:22:53 +00001454 (ops VR128:$dst, VR128:$src1, R32:$src2, i32i8imm:$src3),
1455 "pinsrw {$src3, $src2, $dst|$dst, $src2, $src3}",
Evan Cheng653159f2006-03-31 21:55:24 +00001456 [(set VR128:$dst, (v8i16 (X86pinsrw (v8i16 VR128:$src1),
1457 R32:$src2, (i32 imm:$src3))))]>;
Evan Cheng8703be42006-04-04 19:12:30 +00001458def PINSRWm : PDIi8<0xC4, MRMSrcMem,
Evan Chengb067a1e2006-03-31 19:22:53 +00001459 (ops VR128:$dst, VR128:$src1, i16mem:$src2, i32i8imm:$src3),
1460 "pinsrw {$src3, $src2, $dst|$dst, $src2, $src3}",
1461 [(set VR128:$dst,
Evan Cheng653159f2006-03-31 21:55:24 +00001462 (v8i16 (X86pinsrw (v8i16 VR128:$src1),
Evan Chengb067a1e2006-03-31 19:22:53 +00001463 (i32 (anyext (loadi16 addr:$src2))),
1464 (i32 imm:$src3))))]>;
1465}
1466
Evan Cheng82521dd2006-03-21 07:09:35 +00001467//===----------------------------------------------------------------------===//
Evan Chengc653d482006-03-24 22:28:37 +00001468// Miscellaneous Instructions
1469//===----------------------------------------------------------------------===//
1470
Evan Chengc5fb2b12006-03-30 00:33:26 +00001471// Mask creation
1472def MOVMSKPSrr : PSI<0x50, MRMSrcReg, (ops R32:$dst, VR128:$src),
1473 "movmskps {$src, $dst|$dst, $src}",
1474 [(set R32:$dst, (int_x86_sse_movmsk_ps VR128:$src))]>;
1475def MOVMSKPDrr : PSI<0x50, MRMSrcReg, (ops R32:$dst, VR128:$src),
1476 "movmskpd {$src, $dst|$dst, $src}",
1477 [(set R32:$dst, (int_x86_sse2_movmskpd VR128:$src))]>;
1478
1479def PMOVMSKBrr : PDI<0xD7, MRMSrcReg, (ops R32:$dst, VR128:$src),
1480 "pmovmskb {$src, $dst|$dst, $src}",
1481 [(set R32:$dst, (int_x86_sse2_pmovmskb_128 VR128:$src))]>;
1482
Evan Chengecac9cb2006-03-25 06:03:26 +00001483// Prefetching loads
1484def PREFETCHT0 : I<0x18, MRM1m, (ops i8mem:$src),
1485 "prefetcht0 $src", []>, TB,
1486 Requires<[HasSSE1]>;
1487def PREFETCHT1 : I<0x18, MRM2m, (ops i8mem:$src),
1488 "prefetcht0 $src", []>, TB,
1489 Requires<[HasSSE1]>;
1490def PREFETCHT2 : I<0x18, MRM3m, (ops i8mem:$src),
1491 "prefetcht0 $src", []>, TB,
1492 Requires<[HasSSE1]>;
1493def PREFETCHTNTA : I<0x18, MRM0m, (ops i8mem:$src),
1494 "prefetcht0 $src", []>, TB,
1495 Requires<[HasSSE1]>;
1496
1497// Non-temporal stores
1498def MOVNTQ : I<0xE7, MRMDestMem, (ops i64mem:$dst, VR64:$src),
1499 "movntq {$src, $dst|$dst, $src}", []>, TB,
1500 Requires<[HasSSE1]>;
1501def MOVNTPS : I<0x2B, MRMDestMem, (ops i128mem:$dst, VR128:$src),
1502 "movntps {$src, $dst|$dst, $src}", []>, TB,
1503 Requires<[HasSSE1]>;
1504def MASKMOVQ : I<0xF7, MRMDestMem, (ops i64mem:$dst, VR64:$src),
1505 "maskmovq {$src, $dst|$dst, $src}", []>, TB,
1506 Requires<[HasSSE1]>;
1507
1508// Store fence
1509def SFENCE : I<0xAE, MRM7m, (ops),
1510 "sfence", []>, TB, Requires<[HasSSE1]>;
1511
1512// Load MXCSR register
Evan Chengc653d482006-03-24 22:28:37 +00001513def LDMXCSR : I<0xAE, MRM2m, (ops i32mem:$src),
1514 "ldmxcsr {$src|$src}", []>, TB, Requires<[HasSSE1]>;
1515
1516//===----------------------------------------------------------------------===//
Evan Cheng82521dd2006-03-21 07:09:35 +00001517// Alias Instructions
1518//===----------------------------------------------------------------------===//
1519
Evan Chengffea91e2006-03-26 09:53:12 +00001520// Alias instructions that map zero vector to pxor / xorp* for sse.
Evan Cheng386031a2006-03-24 07:29:27 +00001521// FIXME: remove when we can teach regalloc that xor reg, reg is ok.
Evan Chengffea91e2006-03-26 09:53:12 +00001522def V_SET0_PI : PDI<0xEF, MRMInitReg, (ops VR128:$dst),
1523 "pxor $dst, $dst",
1524 [(set VR128:$dst, (v2i64 immAllZerosV))]>;
1525def V_SET0_PS : PSI<0x57, MRMInitReg, (ops VR128:$dst),
1526 "xorps $dst, $dst",
1527 [(set VR128:$dst, (v4f32 immAllZerosV))]>;
1528def V_SET0_PD : PDI<0x57, MRMInitReg, (ops VR128:$dst),
1529 "xorpd $dst, $dst",
1530 [(set VR128:$dst, (v2f64 immAllZerosV))]>;
Evan Cheng386031a2006-03-24 07:29:27 +00001531
Evan Chenga0b3afb2006-03-27 07:00:16 +00001532def V_SETALLONES : PDI<0x76, MRMInitReg, (ops VR128:$dst),
1533 "pcmpeqd $dst, $dst",
1534 [(set VR128:$dst, (v2f64 immAllOnesV))]>;
1535
Evan Cheng11e15b32006-04-03 20:53:28 +00001536// FR32 / FR64 to 128-bit vector conversion.
1537def MOVSS2PSrr : SSI<0x10, MRMSrcReg, (ops VR128:$dst, FR32:$src),
1538 "movss {$src, $dst|$dst, $src}",
1539 [(set VR128:$dst,
1540 (v4f32 (scalar_to_vector FR32:$src)))]>;
1541def MOVSS2PSrm : SSI<0x10, MRMSrcMem, (ops VR128:$dst, f32mem:$src),
1542 "movss {$src, $dst|$dst, $src}",
1543 [(set VR128:$dst,
1544 (v4f32 (scalar_to_vector (loadf32 addr:$src))))]>;
1545def MOVSD2PDrr : SDI<0x10, MRMSrcReg, (ops VR128:$dst, FR64:$src),
1546 "movsd {$src, $dst|$dst, $src}",
1547 [(set VR128:$dst,
1548 (v2f64 (scalar_to_vector FR64:$src)))]>;
1549def MOVSD2PDrm : SDI<0x10, MRMSrcMem, (ops VR128:$dst, f64mem:$src),
1550 "movsd {$src, $dst|$dst, $src}",
1551 [(set VR128:$dst,
1552 (v2f64 (scalar_to_vector (loadf64 addr:$src))))]>;
1553
1554def MOVDI2PDIrr : PDI<0x6E, MRMSrcReg, (ops VR128:$dst, R32:$src),
1555 "movd {$src, $dst|$dst, $src}",
1556 [(set VR128:$dst,
1557 (v4i32 (scalar_to_vector R32:$src)))]>;
1558def MOVDI2PDIrm : PDI<0x6E, MRMSrcMem, (ops VR128:$dst, i32mem:$src),
1559 "movd {$src, $dst|$dst, $src}",
1560 [(set VR128:$dst,
1561 (v4i32 (scalar_to_vector (loadi32 addr:$src))))]>;
1562// SSE2 instructions with XS prefix
1563def MOVQI2PQIrr : I<0x7E, MRMSrcReg, (ops VR128:$dst, VR64:$src),
1564 "movq {$src, $dst|$dst, $src}",
1565 [(set VR128:$dst,
1566 (v2i64 (scalar_to_vector VR64:$src)))]>, XS,
1567 Requires<[HasSSE2]>;
1568def MOVQI2PQIrm : I<0x7E, MRMSrcMem, (ops VR128:$dst, i64mem:$src),
1569 "movq {$src, $dst|$dst, $src}",
1570 [(set VR128:$dst,
1571 (v2i64 (scalar_to_vector (loadi64 addr:$src))))]>, XS,
1572 Requires<[HasSSE2]>;
1573// FIXME: may not be able to eliminate this movss with coalescing the src and
1574// dest register classes are different. We really want to write this pattern
1575// like this:
1576// def : Pat<(f32 (vector_extract (v4f32 VR128:$src), (i32 0))),
1577// (f32 FR32:$src)>;
1578def MOVPS2SSrr : SSI<0x10, MRMSrcReg, (ops FR32:$dst, VR128:$src),
1579 "movss {$src, $dst|$dst, $src}",
1580 [(set FR32:$dst, (vector_extract (v4f32 VR128:$src),
1581 (i32 0)))]>;
1582def MOVPS2SSmr : SSI<0x10, MRMDestMem, (ops f32mem:$dst, VR128:$src),
1583 "movss {$src, $dst|$dst, $src}",
1584 [(store (f32 (vector_extract (v4f32 VR128:$src),
1585 (i32 0))), addr:$dst)]>;
1586def MOVPD2SDrr : SDI<0x10, MRMSrcReg, (ops FR64:$dst, VR128:$src),
1587 "movsd {$src, $dst|$dst, $src}",
1588 [(set FR64:$dst, (vector_extract (v2f64 VR128:$src),
1589 (i32 0)))]>;
Evan Cheng11e15b32006-04-03 20:53:28 +00001590def MOVPDI2DIrr : PDI<0x7E, MRMSrcReg, (ops R32:$dst, VR128:$src),
1591 "movd {$src, $dst|$dst, $src}",
1592 [(set R32:$dst, (vector_extract (v4i32 VR128:$src),
1593 (i32 0)))]>;
1594def MOVPDI2DImr : PDI<0x7E, MRMDestMem, (ops i32mem:$dst, VR128:$src),
1595 "movd {$src, $dst|$dst, $src}",
1596 [(store (i32 (vector_extract (v4i32 VR128:$src),
1597 (i32 0))), addr:$dst)]>;
1598
1599// Move to lower bits of a VR128, leaving upper bits alone.
Evan Chengbc4832b2006-03-24 23:15:12 +00001600// Three operand (but two address) aliases.
1601let isTwoAddress = 1 in {
Evan Cheng11e15b32006-04-03 20:53:28 +00001602def MOVLSS2PSrr : SSI<0x10, MRMSrcReg, (ops VR128:$dst, VR128:$src1, FR32:$src2),
Evan Chengbc4832b2006-03-24 23:15:12 +00001603 "movss {$src2, $dst|$dst, $src2}", []>;
Evan Cheng11e15b32006-04-03 20:53:28 +00001604def MOVLSD2PDrr : SDI<0x10, MRMSrcReg, (ops VR128:$dst, VR128:$src1, FR64:$src2),
Evan Chengbc4832b2006-03-24 23:15:12 +00001605 "movsd {$src2, $dst|$dst, $src2}", []>;
Evan Cheng11e15b32006-04-03 20:53:28 +00001606def MOVLDI2PDIrr : PDI<0x6E, MRMSrcReg, (ops VR128:$dst, VR128:$src1, R32:$src2),
Evan Chengbc4832b2006-03-24 23:15:12 +00001607 "movd {$src2, $dst|$dst, $src2}", []>;
Evan Chengbc4832b2006-03-24 23:15:12 +00001608}
Evan Cheng82521dd2006-03-21 07:09:35 +00001609
Evan Cheng11e15b32006-04-03 20:53:28 +00001610// Move to lower bits of a VR128 and zeroing upper bits.
Evan Chengbc4832b2006-03-24 23:15:12 +00001611// Loading from memory automatically zeroing upper bits.
Evan Cheng11e15b32006-04-03 20:53:28 +00001612def MOVZSS2PSrm : SSI<0x10, MRMSrcMem, (ops VR128:$dst, f32mem:$src),
Evan Chengbc4832b2006-03-24 23:15:12 +00001613 "movss {$src, $dst|$dst, $src}",
Evan Cheng82521dd2006-03-21 07:09:35 +00001614 [(set VR128:$dst,
Evan Chengbc4832b2006-03-24 23:15:12 +00001615 (v4f32 (X86zexts2vec (loadf32 addr:$src))))]>;
Evan Cheng11e15b32006-04-03 20:53:28 +00001616def MOVZSD2PDrm : SDI<0x10, MRMSrcMem, (ops VR128:$dst, f64mem:$src),
Evan Chengbc4832b2006-03-24 23:15:12 +00001617 "movsd {$src, $dst|$dst, $src}",
1618 [(set VR128:$dst,
1619 (v2f64 (X86zexts2vec (loadf64 addr:$src))))]>;
Evan Cheng11e15b32006-04-03 20:53:28 +00001620def MOVZDI2PDIrm : PDI<0x6E, MRMSrcMem, (ops VR128:$dst, i32mem:$src),
1621 "movd {$src, $dst|$dst, $src}",
1622 [(set VR128:$dst,
1623 (v4i32 (X86zexts2vec (loadi32 addr:$src))))]>;
1624def MOVZQI2PQIrm : PDI<0x7E, MRMSrcMem, (ops VR128:$dst, i64mem:$src),
1625 "movd {$src, $dst|$dst, $src}",
1626 [(set VR128:$dst,
1627 (v2i64 (X86zexts2vec (loadi64 addr:$src))))]>;
Evan Cheng48090aa2006-03-21 23:01:21 +00001628
1629//===----------------------------------------------------------------------===//
1630// Non-Instruction Patterns
1631//===----------------------------------------------------------------------===//
1632
1633// 128-bit vector undef's.
1634def : Pat<(v2f64 (undef)), (IMPLICIT_DEF_VR128)>, Requires<[HasSSE2]>;
1635def : Pat<(v16i8 (undef)), (IMPLICIT_DEF_VR128)>, Requires<[HasSSE2]>;
1636def : Pat<(v8i16 (undef)), (IMPLICIT_DEF_VR128)>, Requires<[HasSSE2]>;
1637def : Pat<(v4i32 (undef)), (IMPLICIT_DEF_VR128)>, Requires<[HasSSE2]>;
1638def : Pat<(v2i64 (undef)), (IMPLICIT_DEF_VR128)>, Requires<[HasSSE2]>;
1639
Evan Chengffea91e2006-03-26 09:53:12 +00001640// 128-bit vector all zero's.
1641def : Pat<(v16i8 immAllZerosV), (v16i8 (V_SET0_PI))>, Requires<[HasSSE2]>;
1642def : Pat<(v8i16 immAllZerosV), (v8i16 (V_SET0_PI))>, Requires<[HasSSE2]>;
1643def : Pat<(v4i32 immAllZerosV), (v4i32 (V_SET0_PI))>, Requires<[HasSSE2]>;
1644
Evan Chenga0b3afb2006-03-27 07:00:16 +00001645// 128-bit vector all one's.
1646def : Pat<(v16i8 immAllOnesV), (v16i8 (V_SETALLONES))>, Requires<[HasSSE2]>;
1647def : Pat<(v8i16 immAllOnesV), (v8i16 (V_SETALLONES))>, Requires<[HasSSE2]>;
1648def : Pat<(v4i32 immAllOnesV), (v4i32 (V_SETALLONES))>, Requires<[HasSSE2]>;
1649def : Pat<(v2i64 immAllOnesV), (v2i64 (V_SETALLONES))>, Requires<[HasSSE2]>;
1650def : Pat<(v4f32 immAllOnesV), (v4f32 (V_SETALLONES))>, Requires<[HasSSE1]>;
1651
Evan Chenga971f6f2006-03-23 01:57:24 +00001652// Load 128-bit integer vector values.
Evan Cheng24dc1f52006-03-23 07:44:07 +00001653def : Pat<(v16i8 (load addr:$src)), (MOVDQArm addr:$src)>,
Evan Chengffea91e2006-03-26 09:53:12 +00001654 Requires<[HasSSE2]>;
Evan Cheng24dc1f52006-03-23 07:44:07 +00001655def : Pat<(v8i16 (load addr:$src)), (MOVDQArm addr:$src)>,
Evan Chengffea91e2006-03-26 09:53:12 +00001656 Requires<[HasSSE2]>;
Evan Cheng24dc1f52006-03-23 07:44:07 +00001657def : Pat<(v4i32 (load addr:$src)), (MOVDQArm addr:$src)>,
Evan Chengffea91e2006-03-26 09:53:12 +00001658 Requires<[HasSSE2]>;
Evan Cheng24dc1f52006-03-23 07:44:07 +00001659def : Pat<(v2i64 (load addr:$src)), (MOVDQArm addr:$src)>,
Evan Chengffea91e2006-03-26 09:53:12 +00001660 Requires<[HasSSE2]>;
Evan Chenga971f6f2006-03-23 01:57:24 +00001661
Evan Cheng48090aa2006-03-21 23:01:21 +00001662// Store 128-bit integer vector values.
Evan Cheng24dc1f52006-03-23 07:44:07 +00001663def : Pat<(store (v16i8 VR128:$src), addr:$dst),
Evan Chengffea91e2006-03-26 09:53:12 +00001664 (MOVDQAmr addr:$dst, VR128:$src)>, Requires<[HasSSE2]>;
Evan Cheng24dc1f52006-03-23 07:44:07 +00001665def : Pat<(store (v8i16 VR128:$src), addr:$dst),
Evan Chengffea91e2006-03-26 09:53:12 +00001666 (MOVDQAmr addr:$dst, VR128:$src)>, Requires<[HasSSE2]>;
Evan Cheng24dc1f52006-03-23 07:44:07 +00001667def : Pat<(store (v4i32 VR128:$src), addr:$dst),
Evan Chengffea91e2006-03-26 09:53:12 +00001668 (MOVDQAmr addr:$dst, VR128:$src)>, Requires<[HasSSE2]>;
Evan Cheng24dc1f52006-03-23 07:44:07 +00001669def : Pat<(store (v2i64 VR128:$src), addr:$dst),
1670 (MOVDQAmr addr:$dst, VR128:$src)>, Requires<[HasSSE2]>;
Evan Cheng48090aa2006-03-21 23:01:21 +00001671
1672// Scalar to v8i16 / v16i8. The source may be a R32, but only the lower 8 or
1673// 16-bits matter.
Evan Cheng11e15b32006-04-03 20:53:28 +00001674def : Pat<(v8i16 (X86s2vec R32:$src)), (MOVDI2PDIrr R32:$src)>,
Evan Chengffea91e2006-03-26 09:53:12 +00001675 Requires<[HasSSE2]>;
Evan Cheng11e15b32006-04-03 20:53:28 +00001676def : Pat<(v16i8 (X86s2vec R32:$src)), (MOVDI2PDIrr R32:$src)>,
Evan Chengffea91e2006-03-26 09:53:12 +00001677 Requires<[HasSSE2]>;
Evan Cheng48090aa2006-03-21 23:01:21 +00001678
Evan Cheng2c0dbd02006-03-24 02:58:06 +00001679// bit_convert
Evan Cheng475aecf2006-03-29 03:04:49 +00001680def : Pat<(v2i64 (bitconvert (v4i32 VR128:$src))), (v2i64 VR128:$src)>,
1681 Requires<[HasSSE2]>;
Evan Cheng506d3df2006-03-29 23:07:14 +00001682def : Pat<(v2i64 (bitconvert (v8i16 VR128:$src))), (v2i64 VR128:$src)>,
1683 Requires<[HasSSE2]>;
1684def : Pat<(v2i64 (bitconvert (v16i8 VR128:$src))), (v2i64 VR128:$src)>,
1685 Requires<[HasSSE2]>;
1686def : Pat<(v4i32 (bitconvert (v2i64 VR128:$src))), (v4i32 VR128:$src)>,
1687 Requires<[HasSSE2]>;
1688def : Pat<(v4i32 (bitconvert (v8i16 VR128:$src))), (v4i32 VR128:$src)>,
1689 Requires<[HasSSE2]>;
1690def : Pat<(v4i32 (bitconvert (v16i8 VR128:$src))), (v4i32 VR128:$src)>,
1691 Requires<[HasSSE2]>;
1692def : Pat<(v8i16 (bitconvert (v2i64 VR128:$src))), (v4i32 VR128:$src)>,
1693 Requires<[HasSSE2]>;
1694def : Pat<(v8i16 (bitconvert (v4i32 VR128:$src))), (v4i32 VR128:$src)>,
1695 Requires<[HasSSE2]>;
1696def : Pat<(v8i16 (bitconvert (v16i8 VR128:$src))), (v4i32 VR128:$src)>,
1697 Requires<[HasSSE2]>;
1698def : Pat<(v16i8 (bitconvert (v2i64 VR128:$src))), (v4i32 VR128:$src)>,
1699 Requires<[HasSSE2]>;
1700def : Pat<(v16i8 (bitconvert (v4i32 VR128:$src))), (v4i32 VR128:$src)>,
1701 Requires<[HasSSE2]>;
1702def : Pat<(v16i8 (bitconvert (v8i16 VR128:$src))), (v4i32 VR128:$src)>,
1703 Requires<[HasSSE2]>;
1704
Evan Chengffea91e2006-03-26 09:53:12 +00001705def : Pat<(v4i32 (bitconvert (v4f32 VR128:$src))), (v4i32 VR128:$src)>,
1706 Requires<[HasSSE2]>;
1707def : Pat<(v4f32 (bitconvert (v4i32 VR128:$src))), (v4f32 VR128:$src)>,
1708 Requires<[HasSSE2]>;
Evan Chengb9df0ca2006-03-22 02:53:00 +00001709
Evan Chengbc4832b2006-03-24 23:15:12 +00001710// Zeroing a VR128 then do a MOVS* to the lower bits.
1711def : Pat<(v2f64 (X86zexts2vec FR64:$src)),
Evan Cheng11e15b32006-04-03 20:53:28 +00001712 (MOVLSD2PDrr (V_SET0_PD), FR64:$src)>, Requires<[HasSSE2]>;
Evan Chengbc4832b2006-03-24 23:15:12 +00001713def : Pat<(v4f32 (X86zexts2vec FR32:$src)),
Evan Cheng11e15b32006-04-03 20:53:28 +00001714 (MOVLSS2PSrr (V_SET0_PS), FR32:$src)>, Requires<[HasSSE2]>;
Evan Chengbc4832b2006-03-24 23:15:12 +00001715def : Pat<(v4i32 (X86zexts2vec R32:$src)),
Evan Cheng11e15b32006-04-03 20:53:28 +00001716 (MOVLDI2PDIrr (V_SET0_PI), R32:$src)>, Requires<[HasSSE2]>;
Evan Chengbc4832b2006-03-24 23:15:12 +00001717def : Pat<(v8i16 (X86zexts2vec R16:$src)),
Evan Cheng11e15b32006-04-03 20:53:28 +00001718 (MOVLDI2PDIrr (V_SET0_PI), (MOVZX32rr16 R16:$src))>, Requires<[HasSSE2]>;
Evan Chengbc4832b2006-03-24 23:15:12 +00001719def : Pat<(v16i8 (X86zexts2vec R8:$src)),
Evan Cheng11e15b32006-04-03 20:53:28 +00001720 (MOVLDI2PDIrr (V_SET0_PI), (MOVZX32rr8 R8:$src))>, Requires<[HasSSE2]>;
Evan Chengbc4832b2006-03-24 23:15:12 +00001721
Evan Chengb9df0ca2006-03-22 02:53:00 +00001722// Splat v2f64 / v2i64
Evan Cheng691c9232006-03-29 19:02:40 +00001723def : Pat<(vector_shuffle (v2f64 VR128:$src), (undef), SSE_splat_mask:$sm),
1724 (v2f64 (UNPCKLPDrr VR128:$src, VR128:$src))>, Requires<[HasSSE2]>;
1725def : Pat<(vector_shuffle (v2i64 VR128:$src), (undef), SSE_splat_mask:$sm),
Evan Cheng475aecf2006-03-29 03:04:49 +00001726 (v2i64 (PUNPCKLQDQrr VR128:$src, VR128:$src))>, Requires<[HasSSE2]>;
1727
Evan Cheng691c9232006-03-29 19:02:40 +00001728// Splat v4f32
1729def : Pat<(vector_shuffle (v4f32 VR128:$src), (undef), SSE_splat_mask:$sm),
1730 (v4f32 (SHUFPSrr VR128:$src, VR128:$src, SSE_splat_mask:$sm))>,
1731 Requires<[HasSSE1]>;
1732
Evan Cheng7d9061e2006-03-30 19:54:57 +00001733// Shuffle v4i32 with SHUFP* if others do not match.
Evan Cheng475aecf2006-03-29 03:04:49 +00001734def : Pat<(vector_shuffle (v4i32 VR128:$src1), (v4i32 VR128:$src2),
Evan Cheng7d9061e2006-03-30 19:54:57 +00001735 SHUFP_int_shuffle_mask:$sm),
Evan Cheng475aecf2006-03-29 03:04:49 +00001736 (v4i32 (SHUFPSrr VR128:$src1, VR128:$src2,
Evan Cheng7d9061e2006-03-30 19:54:57 +00001737 SHUFP_int_shuffle_mask:$sm))>, Requires<[HasSSE2]>;
Evan Cheng475aecf2006-03-29 03:04:49 +00001738def : Pat<(vector_shuffle (v4i32 VR128:$src1), (load addr:$src2),
Evan Cheng7d9061e2006-03-30 19:54:57 +00001739 SHUFP_int_shuffle_mask:$sm),
Evan Cheng475aecf2006-03-29 03:04:49 +00001740 (v4i32 (SHUFPSrm VR128:$src1, addr:$src2,
Evan Cheng7d9061e2006-03-30 19:54:57 +00001741 SHUFP_int_shuffle_mask:$sm))>, Requires<[HasSSE2]>;
1742
1743// Shuffle v4f32 with PSHUF* if others do not match.
1744def : Pat<(vector_shuffle (v4f32 VR128:$src1), (undef),
1745 PSHUFD_fp_shuffle_mask:$sm),
Evan Cheng8703be42006-04-04 19:12:30 +00001746 (v4f32 (PSHUFDri VR128:$src1, PSHUFD_fp_shuffle_mask:$sm))>,
Evan Cheng7d9061e2006-03-30 19:54:57 +00001747 Requires<[HasSSE2]>;
1748def : Pat<(vector_shuffle (loadv4f32 addr:$src1), (undef),
1749 PSHUFD_fp_shuffle_mask:$sm),
Evan Cheng8703be42006-04-04 19:12:30 +00001750 (v4f32 (PSHUFDmi addr:$src1, PSHUFD_fp_shuffle_mask:$sm))>,
Evan Cheng7d9061e2006-03-30 19:54:57 +00001751 Requires<[HasSSE2]>;
1752def : Pat<(vector_shuffle (v4f32 VR128:$src1), (undef),
1753 PSHUFHW_fp_shuffle_mask:$sm),
Evan Cheng8703be42006-04-04 19:12:30 +00001754 (v4f32 (PSHUFHWri VR128:$src1, PSHUFHW_fp_shuffle_mask:$sm))>,
Evan Cheng7d9061e2006-03-30 19:54:57 +00001755 Requires<[HasSSE2]>;
1756def : Pat<(vector_shuffle (loadv4f32 addr:$src1), (undef),
1757 PSHUFHW_fp_shuffle_mask:$sm),
Evan Cheng8703be42006-04-04 19:12:30 +00001758 (v4f32 (PSHUFHWmi addr:$src1, PSHUFHW_fp_shuffle_mask:$sm))>,
Evan Cheng7d9061e2006-03-30 19:54:57 +00001759 Requires<[HasSSE2]>;
1760def : Pat<(vector_shuffle (v4f32 VR128:$src1), (undef),
1761 PSHUFLW_fp_shuffle_mask:$sm),
Evan Cheng8703be42006-04-04 19:12:30 +00001762 (v4f32 (PSHUFLWri VR128:$src1, PSHUFLW_fp_shuffle_mask:$sm))>,
Evan Cheng7d9061e2006-03-30 19:54:57 +00001763 Requires<[HasSSE2]>;
1764def : Pat<(vector_shuffle (loadv4f32 addr:$src1), (undef),
1765 PSHUFLW_fp_shuffle_mask:$sm),
Evan Cheng8703be42006-04-04 19:12:30 +00001766 (v4f32 (PSHUFLWmi addr:$src1, PSHUFLW_fp_shuffle_mask:$sm))>,
Evan Cheng7d9061e2006-03-30 19:54:57 +00001767 Requires<[HasSSE2]>;
Evan Cheng1b32f222006-03-30 07:33:32 +00001768
Evan Cheng1d5a8cc2006-04-05 07:20:06 +00001769// vector_shuffle v1, <undef>, <0, 0, 1, 1, ...>
1770def : Pat<(v4f32 (vector_shuffle VR128:$src, (undef),
1771 UNPCKL_v_undef_shuffle_mask)),
1772 (UNPCKLPSrr VR128:$src, VR128:$src)>, Requires<[HasSSE2]>;
1773def : Pat<(v16i8 (vector_shuffle VR128:$src, (undef),
1774 UNPCKL_v_undef_shuffle_mask)),
1775 (PUNPCKLBWrr VR128:$src, VR128:$src)>, Requires<[HasSSE2]>;
1776def : Pat<(v8i16 (vector_shuffle VR128:$src, (undef),
1777 UNPCKL_v_undef_shuffle_mask)),
1778 (PUNPCKLWDrr VR128:$src, VR128:$src)>, Requires<[HasSSE2]>;
1779def : Pat<(v4i32 (vector_shuffle VR128:$src, (undef),
1780 UNPCKL_v_undef_shuffle_mask)),
1781 (PUNPCKLDQrr VR128:$src, VR128:$src)>, Requires<[HasSSE1]>;
1782
Evan Chengff65e382006-04-04 21:49:39 +00001783// 128-bit logical shifts
1784def : Pat<(int_x86_sse2_psll_dq VR128:$src1, imm:$src2),
1785 (v2i64 (PSLLDQri VR128:$src1, (PSxLDQ_imm imm:$src2)))>;
1786def : Pat<(int_x86_sse2_psrl_dq VR128:$src1, imm:$src2),
1787 (v2i64 (PSRLDQri VR128:$src1, (PSxLDQ_imm imm:$src2)))>;
1788
Evan Cheng1b32f222006-03-30 07:33:32 +00001789// Logical ops
1790def : Pat<(and (bc_v4i32 (v4f32 VR128:$src1)), (loadv4i32 addr:$src2)),
1791 (ANDPSrm VR128:$src1, addr:$src2)>;
1792def : Pat<(and (bc_v2i64 (v2f64 VR128:$src1)), (loadv2i64 addr:$src2)),
1793 (ANDPDrm VR128:$src1, addr:$src2)>;
1794def : Pat<(or (bc_v4i32 (v4f32 VR128:$src1)), (loadv4i32 addr:$src2)),
1795 (ORPSrm VR128:$src1, addr:$src2)>;
1796def : Pat<(or (bc_v2i64 (v2f64 VR128:$src1)), (loadv2i64 addr:$src2)),
1797 (ORPDrm VR128:$src1, addr:$src2)>;
1798def : Pat<(xor (bc_v4i32 (v4f32 VR128:$src1)), (loadv4i32 addr:$src2)),
1799 (XORPSrm VR128:$src1, addr:$src2)>;
1800def : Pat<(xor (bc_v2i64 (v2f64 VR128:$src1)), (loadv2i64 addr:$src2)),
1801 (XORPDrm VR128:$src1, addr:$src2)>;
1802def : Pat<(and (vnot (bc_v4i32 (v4f32 VR128:$src1))), (loadv4i32 addr:$src2)),
1803 (ANDNPSrm VR128:$src1, addr:$src2)>;
1804def : Pat<(and (vnot (bc_v2i64 (v2f64 VR128:$src1))), (loadv2i64 addr:$src2)),
1805 (ANDNPDrm VR128:$src1, addr:$src2)>;
1806
1807def : Pat<(bc_v4f32 (v4i32 (and VR128:$src1, VR128:$src2))),
1808 (ANDPSrr VR128:$src1, VR128:$src2)>;
1809def : Pat<(bc_v4f32 (v4i32 (or VR128:$src1, VR128:$src2))),
1810 (ORPSrr VR128:$src1, VR128:$src2)>;
1811def : Pat<(bc_v4f32 (v4i32 (xor VR128:$src1, VR128:$src2))),
1812 (XORPSrr VR128:$src1, VR128:$src2)>;
1813def : Pat<(bc_v4f32 (v4i32 (and (vnot VR128:$src1), VR128:$src2))),
1814 (ANDNPSrr VR128:$src1, VR128:$src2)>;
1815
1816def : Pat<(bc_v4f32 (v4i32 (and VR128:$src1, (load addr:$src2)))),
1817 (ANDPSrm (v4i32 VR128:$src1), addr:$src2)>;
1818def : Pat<(bc_v4f32 (v4i32 (or VR128:$src1, (load addr:$src2)))),
1819 (ORPSrm VR128:$src1, addr:$src2)>;
1820def : Pat<(bc_v4f32 (v4i32 (xor VR128:$src1, (load addr:$src2)))),
1821 (XORPSrm VR128:$src1, addr:$src2)>;
1822def : Pat<(bc_v4f32 (v4i32 (and (vnot VR128:$src1), (load addr:$src2)))),
1823 (ANDNPSrm VR128:$src1, addr:$src2)>;
1824
1825def : Pat<(bc_v2f64 (v2i64 (and VR128:$src1, VR128:$src2))),
1826 (ANDPDrr VR128:$src1, VR128:$src2)>;
1827def : Pat<(bc_v2f64 (v2i64 (or VR128:$src1, VR128:$src2))),
1828 (ORPDrr VR128:$src1, VR128:$src2)>;
1829def : Pat<(bc_v2f64 (v2i64 (xor VR128:$src1, VR128:$src2))),
1830 (XORPDrr VR128:$src1, VR128:$src2)>;
1831def : Pat<(bc_v2f64 (v2i64 (and (vnot VR128:$src1), VR128:$src2))),
1832 (ANDNPDrr VR128:$src1, VR128:$src2)>;
1833
1834def : Pat<(bc_v2f64 (v2i64 (and VR128:$src1, (load addr:$src2)))),
1835 (ANDPSrm (v2i64 VR128:$src1), addr:$src2)>;
1836def : Pat<(bc_v2f64 (v2i64 (or VR128:$src1, (load addr:$src2)))),
1837 (ORPSrm VR128:$src1, addr:$src2)>;
1838def : Pat<(bc_v2f64 (v2i64 (xor VR128:$src1, (load addr:$src2)))),
1839 (XORPSrm VR128:$src1, addr:$src2)>;
1840def : Pat<(bc_v2f64 (v2i64 (and (vnot VR128:$src1), (load addr:$src2)))),
1841 (ANDNPSrm VR128:$src1, addr:$src2)>;
1842
1843def : Pat<(v4i32 (and VR128:$src1, VR128:$src2)),
1844 (PANDrr VR128:$src1, VR128:$src2)>;
1845def : Pat<(v8i16 (and VR128:$src1, VR128:$src2)),
1846 (PANDrr VR128:$src1, VR128:$src2)>;
1847def : Pat<(v16i8 (and VR128:$src1, VR128:$src2)),
1848 (PANDrr VR128:$src1, VR128:$src2)>;
1849def : Pat<(v4i32 (or VR128:$src1, VR128:$src2)),
1850 (PORrr VR128:$src1, VR128:$src2)>;
1851def : Pat<(v8i16 (or VR128:$src1, VR128:$src2)),
1852 (PORrr VR128:$src1, VR128:$src2)>;
1853def : Pat<(v16i8 (or VR128:$src1, VR128:$src2)),
1854 (PORrr VR128:$src1, VR128:$src2)>;
1855def : Pat<(v4i32 (xor VR128:$src1, VR128:$src2)),
1856 (PXORrr VR128:$src1, VR128:$src2)>;
1857def : Pat<(v8i16 (xor VR128:$src1, VR128:$src2)),
1858 (PXORrr VR128:$src1, VR128:$src2)>;
1859def : Pat<(v16i8 (xor VR128:$src1, VR128:$src2)),
1860 (PXORrr VR128:$src1, VR128:$src2)>;
1861def : Pat<(v4i32 (and (vnot VR128:$src1), VR128:$src2)),
1862 (PANDNrr VR128:$src1, VR128:$src2)>;
1863def : Pat<(v8i16 (and (vnot VR128:$src1), VR128:$src2)),
1864 (PANDNrr VR128:$src1, VR128:$src2)>;
1865def : Pat<(v16i8 (and (vnot VR128:$src1), VR128:$src2)),
1866 (PANDNrr VR128:$src1, VR128:$src2)>;
1867
1868def : Pat<(v4i32 (and VR128:$src1, (load addr:$src2))),
1869 (PANDrm VR128:$src1, addr:$src2)>;
1870def : Pat<(v8i16 (and VR128:$src1, (load addr:$src2))),
1871 (PANDrm VR128:$src1, addr:$src2)>;
1872def : Pat<(v16i8 (and VR128:$src1, (load addr:$src2))),
1873 (PANDrm VR128:$src1, addr:$src2)>;
1874def : Pat<(v4i32 (or VR128:$src1, (load addr:$src2))),
1875 (PORrm VR128:$src1, addr:$src2)>;
1876def : Pat<(v8i16 (or VR128:$src1, (load addr:$src2))),
1877 (PORrm VR128:$src1, addr:$src2)>;
1878def : Pat<(v16i8 (or VR128:$src1, (load addr:$src2))),
1879 (PORrm VR128:$src1, addr:$src2)>;
1880def : Pat<(v4i32 (xor VR128:$src1, (load addr:$src2))),
1881 (PXORrm VR128:$src1, addr:$src2)>;
1882def : Pat<(v8i16 (xor VR128:$src1, (load addr:$src2))),
1883 (PXORrm VR128:$src1, addr:$src2)>;
1884def : Pat<(v16i8 (xor VR128:$src1, (load addr:$src2))),
1885 (PXORrm VR128:$src1, addr:$src2)>;
1886def : Pat<(v4i32 (and (vnot VR128:$src1), (load addr:$src2))),
1887 (PANDNrm VR128:$src1, addr:$src2)>;
1888def : Pat<(v8i16 (and (vnot VR128:$src1), (load addr:$src2))),
1889 (PANDNrm VR128:$src1, addr:$src2)>;
1890def : Pat<(v16i8 (and (vnot VR128:$src1), (load addr:$src2))),
1891 (PANDNrm VR128:$src1, addr:$src2)>;