blob: f4b64dc5245330a507527b7b385918e58eb55117 [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 Cheng5ced1d82006-04-06 23:23:56 +000099def MOVHP_shuffle_mask : PatLeaf<(build_vector), [{
100 return X86::isMOVHPMask(N);
101}]>;
102
103def MOVLP_shuffle_mask : PatLeaf<(build_vector), [{
104 return X86::isMOVLPMask(N);
105}]>;
106
Evan Cheng0038e592006-03-28 00:39:58 +0000107def UNPCKL_shuffle_mask : PatLeaf<(build_vector), [{
108 return X86::isUNPCKLMask(N);
109}]>;
110
Evan Cheng4fcb9222006-03-28 02:43:26 +0000111def UNPCKH_shuffle_mask : PatLeaf<(build_vector), [{
112 return X86::isUNPCKHMask(N);
113}]>;
114
Evan Cheng1d5a8cc2006-04-05 07:20:06 +0000115def UNPCKL_v_undef_shuffle_mask : PatLeaf<(build_vector), [{
116 return X86::isUNPCKL_v_undef_Mask(N);
117}]>;
118
Evan Cheng0188ecb2006-03-22 18:59:22 +0000119def PSHUFD_shuffle_mask : PatLeaf<(build_vector), [{
Evan Cheng4f563382006-03-29 01:30:51 +0000120 return X86::isPSHUFDMask(N);
Evan Cheng14aed5e2006-03-24 01:18:28 +0000121}], SHUFFLE_get_shuf_imm>;
Evan Cheng0188ecb2006-03-22 18:59:22 +0000122
Evan Cheng506d3df2006-03-29 23:07:14 +0000123def PSHUFHW_shuffle_mask : PatLeaf<(build_vector), [{
124 return X86::isPSHUFHWMask(N);
125}], SHUFFLE_get_pshufhw_imm>;
126
127def PSHUFLW_shuffle_mask : PatLeaf<(build_vector), [{
128 return X86::isPSHUFLWMask(N);
129}], SHUFFLE_get_pshuflw_imm>;
130
Evan Cheng7d9061e2006-03-30 19:54:57 +0000131// Only use PSHUF* for v4f32 if SHUFP does not match.
132def PSHUFD_fp_shuffle_mask : PatLeaf<(build_vector), [{
133 return !X86::isSHUFPMask(N) &&
134 X86::isPSHUFDMask(N);
135}], SHUFFLE_get_shuf_imm>;
136
137def PSHUFHW_fp_shuffle_mask : PatLeaf<(build_vector), [{
138 return !X86::isSHUFPMask(N) &&
139 X86::isPSHUFHWMask(N);
140}], SHUFFLE_get_pshufhw_imm>;
141
142def PSHUFLW_fp_shuffle_mask : PatLeaf<(build_vector), [{
143 return !X86::isSHUFPMask(N) &&
144 X86::isPSHUFLWMask(N);
145}], SHUFFLE_get_pshuflw_imm>;
146
Evan Cheng14aed5e2006-03-24 01:18:28 +0000147def SHUFP_shuffle_mask : PatLeaf<(build_vector), [{
148 return X86::isSHUFPMask(N);
149}], SHUFFLE_get_shuf_imm>;
Evan Chengb9df0ca2006-03-22 02:53:00 +0000150
Evan Cheng7d9061e2006-03-30 19:54:57 +0000151// Only use SHUFP for v4i32 if PSHUF* do not match.
152def SHUFP_int_shuffle_mask : PatLeaf<(build_vector), [{
153 return !X86::isPSHUFDMask(N) &&
154 !X86::isPSHUFHWMask(N) &&
155 !X86::isPSHUFLWMask(N) &&
156 X86::isSHUFPMask(N);
Evan Cheng475aecf2006-03-29 03:04:49 +0000157}], SHUFFLE_get_shuf_imm>;
158
Evan Cheng06a8aa12006-03-17 19:55:52 +0000159//===----------------------------------------------------------------------===//
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000160// SSE scalar FP Instructions
161//===----------------------------------------------------------------------===//
162
Evan Cheng470a6ad2006-02-22 02:26:30 +0000163// Instruction templates
164// SSI - SSE1 instructions with XS prefix.
165// SDI - SSE2 instructions with XD prefix.
166// PSI - SSE1 instructions with TB prefix.
167// PDI - SSE2 instructions with TB and OpSize prefixes.
Evan Cheng2da953f2006-03-22 07:10:28 +0000168// PSIi8 - SSE1 instructions with ImmT == Imm8 and TB prefix.
169// PDIi8 - SSE2 instructions with ImmT == Imm8 and TB and OpSize prefixes.
Evan Cheng4b1734f2006-03-31 21:29:33 +0000170// S3SI - SSE3 instructions with XD prefix.
171// S3DI - SSE3 instructions with TB and OpSize prefixes.
Evan Cheng470a6ad2006-02-22 02:26:30 +0000172class SSI<bits<8> o, Format F, dag ops, string asm, list<dag> pattern>
173 : I<o, F, ops, asm, pattern>, XS, Requires<[HasSSE1]>;
174class SDI<bits<8> o, Format F, dag ops, string asm, list<dag> pattern>
175 : I<o, F, ops, asm, pattern>, XD, Requires<[HasSSE2]>;
176class PSI<bits<8> o, Format F, dag ops, string asm, list<dag> pattern>
177 : I<o, F, ops, asm, pattern>, TB, Requires<[HasSSE1]>;
178class PDI<bits<8> o, Format F, dag ops, string asm, list<dag> pattern>
179 : I<o, F, ops, asm, pattern>, TB, OpSize, Requires<[HasSSE2]>;
Evan Cheng2da953f2006-03-22 07:10:28 +0000180class PSIi8<bits<8> o, Format F, dag ops, string asm, list<dag> pattern>
181 : X86Inst<o, F, Imm8, ops, asm>, TB, Requires<[HasSSE1]> {
182 let Pattern = pattern;
183}
184class PDIi8<bits<8> o, Format F, dag ops, string asm, list<dag> pattern>
185 : X86Inst<o, F, Imm8, ops, asm>, TB, OpSize, Requires<[HasSSE2]> {
186 let Pattern = pattern;
187}
Evan Cheng4b1734f2006-03-31 21:29:33 +0000188class S3SI<bits<8> o, Format F, dag ops, string asm, list<dag> pattern>
189 : I<o, F, ops, asm, pattern>, XD, Requires<[HasSSE3]>;
190class S3DI<bits<8> o, Format F, dag ops, string asm, list<dag> pattern>
191 : I<o, F, ops, asm, pattern>, TB, OpSize, Requires<[HasSSE3]>;
192
193//===----------------------------------------------------------------------===//
194// Helpers for defining instructions that directly correspond to intrinsics.
Evan Cheng6e967402006-04-04 00:10:53 +0000195class SS_Intr<bits<8> o, string asm, Intrinsic IntId>
196 : SSI<o, MRMSrcReg, (ops VR128:$dst, VR128:$src), asm,
197 [(set VR128:$dst, (v4f32 (IntId VR128:$src)))]>;
198class SS_Intm<bits<8> o, string asm, Intrinsic IntId>
199 : SSI<o, MRMSrcMem, (ops VR128:$dst, f32mem:$src), asm,
200 [(set VR128:$dst, (v4f32 (IntId (load addr:$src))))]>;
201class SD_Intr<bits<8> o, string asm, Intrinsic IntId>
202 : SDI<o, MRMSrcReg, (ops VR128:$dst, VR128:$src), asm,
203 [(set VR128:$dst, (v2f64 (IntId VR128:$src)))]>;
204class SD_Intm<bits<8> o, string asm, Intrinsic IntId>
205 : SDI<o, MRMSrcMem, (ops VR128:$dst, f64mem:$src), asm,
206 [(set VR128:$dst, (v2f64 (IntId (load addr:$src))))]>;
207
208class SS_Intrr<bits<8> o, string asm, Intrinsic IntId>
Evan Cheng97ac5fa2006-04-03 23:49:17 +0000209 : SSI<o, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2), asm,
Evan Cheng6e967402006-04-04 00:10:53 +0000210 [(set VR128:$dst, (v4f32 (IntId VR128:$src1, VR128:$src2)))]>;
211class SS_Intrm<bits<8> o, string asm, Intrinsic IntId>
Evan Cheng97ac5fa2006-04-03 23:49:17 +0000212 : SSI<o, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f32mem:$src2), asm,
Evan Cheng6e967402006-04-04 00:10:53 +0000213 [(set VR128:$dst, (v4f32 (IntId VR128:$src1, (load addr:$src2))))]>;
214class SD_Intrr<bits<8> o, string asm, Intrinsic IntId>
Evan Cheng97ac5fa2006-04-03 23:49:17 +0000215 : SDI<o, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2), asm,
Evan Cheng6e967402006-04-04 00:10:53 +0000216 [(set VR128:$dst, (v2f64 (IntId VR128:$src1, VR128:$src2)))]>;
217class SD_Intrm<bits<8> o, string asm, Intrinsic IntId>
Evan Cheng97ac5fa2006-04-03 23:49:17 +0000218 : SDI<o, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f64mem:$src2), asm,
Evan Cheng6e967402006-04-04 00:10:53 +0000219 [(set VR128:$dst, (v2f64 (IntId VR128:$src1, (load addr:$src2))))]>;
Evan Cheng97ac5fa2006-04-03 23:49:17 +0000220
221class PS_Intr<bits<8> o, string asm, Intrinsic IntId>
222 : PSI<o, MRMSrcReg, (ops VR128:$dst, VR128:$src), asm,
223 [(set VR128:$dst, (IntId VR128:$src))]>;
224class PS_Intm<bits<8> o, string asm, Intrinsic IntId>
225 : PSI<o, MRMSrcMem, (ops VR128:$dst, f32mem:$src), asm,
226 [(set VR128:$dst, (IntId (loadv4f32 addr:$src)))]>;
227class PD_Intr<bits<8> o, string asm, Intrinsic IntId>
228 : PDI<o, MRMSrcReg, (ops VR128:$dst, VR128:$src), asm,
229 [(set VR128:$dst, (IntId VR128:$src))]>;
230class PD_Intm<bits<8> o, string asm, Intrinsic IntId>
231 : PDI<o, MRMSrcMem, (ops VR128:$dst, f64mem:$src), asm,
232 [(set VR128:$dst, (IntId (loadv2f64 addr:$src)))]>;
233
234class PS_Intrr<bits<8> o, string asm, Intrinsic IntId>
235 : PSI<o, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2), asm,
236 [(set VR128:$dst, (IntId VR128:$src1, VR128:$src2))]>;
237class PS_Intrm<bits<8> o, string asm, Intrinsic IntId>
238 : PSI<o, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f32mem:$src2), asm,
239 [(set VR128:$dst, (IntId VR128:$src1, (loadv4f32 addr:$src2)))]>;
240class PD_Intrr<bits<8> o, string asm, Intrinsic IntId>
241 : PDI<o, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2), asm,
242 [(set VR128:$dst, (IntId VR128:$src1, VR128:$src2))]>;
243class PD_Intrm<bits<8> o, string asm, Intrinsic IntId>
244 : PDI<o, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f64mem:$src2), asm,
245 [(set VR128:$dst, (IntId VR128:$src1, (loadv2f64 addr:$src2)))]>;
246
Evan Cheng4b1734f2006-03-31 21:29:33 +0000247class S3S_Intrr<bits<8> o, string asm, Intrinsic IntId>
248 : S3SI<o, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2), asm,
249 [(set VR128:$dst, (v4f32 (IntId VR128:$src1, VR128:$src2)))]>;
250class S3S_Intrm<bits<8> o, string asm, Intrinsic IntId>
251 : S3SI<o, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2), asm,
252 [(set VR128:$dst, (v4f32 (IntId VR128:$src1,
253 (loadv4f32 addr:$src2))))]>;
254class S3D_Intrr<bits<8> o, string asm, Intrinsic IntId>
255 : S3DI<o, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2), asm,
256 [(set VR128:$dst, (v2f64 (IntId VR128:$src1, VR128:$src2)))]>;
257class S3D_Intrm<bits<8> o, string asm, Intrinsic IntId>
258 : S3DI<o, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2), asm,
259 [(set VR128:$dst, (v2f64 (IntId VR128:$src1,
260 (loadv2f64 addr:$src2))))]>;
Evan Cheng470a6ad2006-02-22 02:26:30 +0000261
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000262// Some 'special' instructions
263def IMPLICIT_DEF_FR32 : I<0, Pseudo, (ops FR32:$dst),
264 "#IMPLICIT_DEF $dst",
265 [(set FR32:$dst, (undef))]>, Requires<[HasSSE2]>;
266def IMPLICIT_DEF_FR64 : I<0, Pseudo, (ops FR64:$dst),
267 "#IMPLICIT_DEF $dst",
268 [(set FR64:$dst, (undef))]>, Requires<[HasSSE2]>;
269
270// CMOV* - Used to implement the SSE SELECT DAG operation. Expanded by the
271// scheduler into a branch sequence.
272let usesCustomDAGSchedInserter = 1 in { // Expanded by the scheduler.
273 def CMOV_FR32 : I<0, Pseudo,
274 (ops FR32:$dst, FR32:$t, FR32:$f, i8imm:$cond),
275 "#CMOV_FR32 PSEUDO!",
276 [(set FR32:$dst, (X86cmov FR32:$t, FR32:$f, imm:$cond))]>;
277 def CMOV_FR64 : I<0, Pseudo,
278 (ops FR64:$dst, FR64:$t, FR64:$f, i8imm:$cond),
279 "#CMOV_FR64 PSEUDO!",
280 [(set FR64:$dst, (X86cmov FR64:$t, FR64:$f, imm:$cond))]>;
281}
282
283// Move Instructions
Evan Cheng470a6ad2006-02-22 02:26:30 +0000284def MOVSSrr : SSI<0x10, MRMSrcReg, (ops FR32:$dst, FR32:$src),
285 "movss {$src, $dst|$dst, $src}", []>;
286def MOVSSrm : SSI<0x10, MRMSrcMem, (ops FR32:$dst, f32mem:$src),
287 "movss {$src, $dst|$dst, $src}",
288 [(set FR32:$dst, (loadf32 addr:$src))]>;
289def MOVSDrr : SDI<0x10, MRMSrcReg, (ops FR64:$dst, FR64:$src),
290 "movsd {$src, $dst|$dst, $src}", []>;
291def MOVSDrm : SDI<0x10, MRMSrcMem, (ops FR64:$dst, f64mem:$src),
292 "movsd {$src, $dst|$dst, $src}",
293 [(set FR64:$dst, (loadf64 addr:$src))]>;
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000294
Evan Cheng470a6ad2006-02-22 02:26:30 +0000295def MOVSSmr : SSI<0x11, MRMDestMem, (ops f32mem:$dst, FR32:$src),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000296 "movss {$src, $dst|$dst, $src}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000297 [(store FR32:$src, addr:$dst)]>;
298def MOVSDmr : SDI<0x11, MRMDestMem, (ops f64mem:$dst, FR64:$src),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000299 "movsd {$src, $dst|$dst, $src}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000300 [(store FR64:$src, addr:$dst)]>;
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000301
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000302// Arithmetic instructions
303let isTwoAddress = 1 in {
304let isCommutable = 1 in {
Evan Cheng470a6ad2006-02-22 02:26:30 +0000305def ADDSSrr : SSI<0x58, MRMSrcReg, (ops FR32:$dst, FR32:$src1, FR32:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000306 "addss {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000307 [(set FR32:$dst, (fadd FR32:$src1, FR32:$src2))]>;
308def ADDSDrr : SDI<0x58, MRMSrcReg, (ops FR64:$dst, FR64:$src1, FR64:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000309 "addsd {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000310 [(set FR64:$dst, (fadd FR64:$src1, FR64:$src2))]>;
311def MULSSrr : SSI<0x59, MRMSrcReg, (ops FR32:$dst, FR32:$src1, FR32:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000312 "mulss {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000313 [(set FR32:$dst, (fmul FR32:$src1, FR32:$src2))]>;
314def MULSDrr : SDI<0x59, MRMSrcReg, (ops FR64:$dst, FR64:$src1, FR64:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000315 "mulsd {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000316 [(set FR64:$dst, (fmul FR64:$src1, FR64:$src2))]>;
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000317}
318
Evan Cheng470a6ad2006-02-22 02:26:30 +0000319def ADDSSrm : SSI<0x58, MRMSrcMem, (ops FR32:$dst, FR32:$src1, f32mem:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000320 "addss {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000321 [(set FR32:$dst, (fadd FR32:$src1, (loadf32 addr:$src2)))]>;
322def ADDSDrm : SDI<0x58, MRMSrcMem, (ops FR64:$dst, FR64:$src1, f64mem:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000323 "addsd {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000324 [(set FR64:$dst, (fadd FR64:$src1, (loadf64 addr:$src2)))]>;
325def MULSSrm : SSI<0x59, MRMSrcMem, (ops FR32:$dst, FR32:$src1, f32mem:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000326 "mulss {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000327 [(set FR32:$dst, (fmul FR32:$src1, (loadf32 addr:$src2)))]>;
328def MULSDrm : SDI<0x59, MRMSrcMem, (ops FR64:$dst, FR64:$src1, f64mem:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000329 "mulsd {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000330 [(set FR64:$dst, (fmul FR64:$src1, (loadf64 addr:$src2)))]>;
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000331
Evan Cheng470a6ad2006-02-22 02:26:30 +0000332def DIVSSrr : SSI<0x5E, MRMSrcReg, (ops FR32:$dst, FR32:$src1, FR32:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000333 "divss {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000334 [(set FR32:$dst, (fdiv FR32:$src1, FR32:$src2))]>;
335def DIVSSrm : SSI<0x5E, MRMSrcMem, (ops FR32:$dst, FR32:$src1, f32mem:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000336 "divss {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000337 [(set FR32:$dst, (fdiv FR32:$src1, (loadf32 addr:$src2)))]>;
338def DIVSDrr : SDI<0x5E, MRMSrcReg, (ops FR64:$dst, FR64:$src1, FR64:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000339 "divsd {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000340 [(set FR64:$dst, (fdiv FR64:$src1, FR64:$src2))]>;
341def DIVSDrm : SDI<0x5E, MRMSrcMem, (ops FR64:$dst, FR64:$src1, f64mem:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000342 "divsd {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000343 [(set FR64:$dst, (fdiv FR64:$src1, (loadf64 addr:$src2)))]>;
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000344
Evan Cheng470a6ad2006-02-22 02:26:30 +0000345def SUBSSrr : SSI<0x5C, MRMSrcReg, (ops FR32:$dst, FR32:$src1, FR32:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000346 "subss {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000347 [(set FR32:$dst, (fsub FR32:$src1, FR32:$src2))]>;
348def SUBSSrm : SSI<0x5C, MRMSrcMem, (ops FR32:$dst, FR32:$src1, f32mem:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000349 "subss {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000350 [(set FR32:$dst, (fsub FR32:$src1, (loadf32 addr:$src2)))]>;
351def SUBSDrr : SDI<0x5C, MRMSrcReg, (ops FR64:$dst, FR64:$src1, FR64:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000352 "subsd {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000353 [(set FR64:$dst, (fsub FR64:$src1, FR64:$src2))]>;
354def SUBSDrm : SDI<0x5C, MRMSrcMem, (ops FR64:$dst, FR64:$src1, f64mem:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000355 "subsd {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000356 [(set FR64:$dst, (fsub FR64:$src1, (loadf64 addr:$src2)))]>;
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000357}
358
Evan Cheng8703be42006-04-04 19:12:30 +0000359def SQRTSSr : SSI<0x51, MRMSrcReg, (ops FR32:$dst, FR32:$src),
360 "sqrtss {$src, $dst|$dst, $src}",
361 [(set FR32:$dst, (fsqrt FR32:$src))]>;
362def SQRTSSm : SSI<0x51, MRMSrcMem, (ops FR32:$dst, f32mem:$src),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000363 "sqrtss {$src, $dst|$dst, $src}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000364 [(set FR32:$dst, (fsqrt (loadf32 addr:$src)))]>;
Evan Cheng8703be42006-04-04 19:12:30 +0000365def SQRTSDr : SDI<0x51, MRMSrcReg, (ops FR64:$dst, FR64:$src),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000366 "sqrtsd {$src, $dst|$dst, $src}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000367 [(set FR64:$dst, (fsqrt FR64:$src))]>;
Evan Cheng8703be42006-04-04 19:12:30 +0000368def SQRTSDm : SDI<0x51, MRMSrcMem, (ops FR64:$dst, f64mem:$src),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000369 "sqrtsd {$src, $dst|$dst, $src}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000370 [(set FR64:$dst, (fsqrt (loadf64 addr:$src)))]>;
371
Evan Cheng8703be42006-04-04 19:12:30 +0000372def RSQRTSSr : SSI<0x52, MRMSrcReg, (ops FR32:$dst, FR32:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000373 "rsqrtss {$src, $dst|$dst, $src}", []>;
Evan Cheng8703be42006-04-04 19:12:30 +0000374def RSQRTSSm : SSI<0x52, MRMSrcMem, (ops FR32:$dst, f32mem:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000375 "rsqrtss {$src, $dst|$dst, $src}", []>;
Evan Cheng8703be42006-04-04 19:12:30 +0000376def RCPSSr : SSI<0x53, MRMSrcReg, (ops FR32:$dst, FR32:$src),
377 "rcpss {$src, $dst|$dst, $src}", []>;
378def RCPSSm : SSI<0x53, MRMSrcMem, (ops FR32:$dst, f32mem:$src),
379 "rcpss {$src, $dst|$dst, $src}", []>;
Evan Cheng470a6ad2006-02-22 02:26:30 +0000380
Evan Cheng8703be42006-04-04 19:12:30 +0000381let isTwoAddress = 1 in {
382def MAXSSrr : SSI<0x5F, MRMSrcReg, (ops FR32:$dst, FR32:$src1, FR32:$src2),
383 "maxss {$src2, $dst|$dst, $src2}", []>;
384def MAXSSrm : SSI<0x5F, MRMSrcMem, (ops FR32:$dst, FR32:$src1, f32mem:$src2),
385 "maxss {$src2, $dst|$dst, $src2}", []>;
386def MAXSDrr : SDI<0x5F, MRMSrcReg, (ops FR64:$dst, FR32:$src1, FR64:$src2),
387 "maxsd {$src2, $dst|$dst, $src2}", []>;
388def MAXSDrm : SDI<0x5F, MRMSrcMem, (ops FR64:$dst, FR32:$src1, f64mem:$src2),
389 "maxsd {$src2, $dst|$dst, $src2}", []>;
390def MINSSrr : SSI<0x5D, MRMSrcReg, (ops FR32:$dst, FR32:$src1, FR32:$src2),
391 "minss {$src2, $dst|$dst, $src2}", []>;
392def MINSSrm : SSI<0x5D, MRMSrcMem, (ops FR32:$dst, FR32:$src1, f32mem:$src2),
393 "minss {$src2, $dst|$dst, $src2}", []>;
394def MINSDrr : SDI<0x5D, MRMSrcReg, (ops FR64:$dst, FR32:$src1, FR64:$src2),
395 "minsd {$src2, $dst|$dst, $src2}", []>;
396def MINSDrm : SDI<0x5D, MRMSrcMem, (ops FR64:$dst, FR32:$src1, f64mem:$src2),
397 "minsd {$src2, $dst|$dst, $src2}", []>;
398}
Evan Chengc46349d2006-03-28 23:51:43 +0000399
400// Aliases to match intrinsics which expect XMM operand(s).
401let isTwoAddress = 1 in {
402let isCommutable = 1 in {
Evan Cheng6e967402006-04-04 00:10:53 +0000403def Int_ADDSSrr : SS_Intrr<0x58, "addss {$src2, $dst|$dst, $src2}",
404 int_x86_sse_add_ss>;
405def Int_ADDSDrr : SD_Intrr<0x58, "addsd {$src2, $dst|$dst, $src2}",
406 int_x86_sse2_add_sd>;
407def Int_MULSSrr : SS_Intrr<0x59, "mulss {$src2, $dst|$dst, $src2}",
408 int_x86_sse_mul_ss>;
409def Int_MULSDrr : SD_Intrr<0x59, "mulsd {$src2, $dst|$dst, $src2}",
410 int_x86_sse2_mul_sd>;
Evan Chengc46349d2006-03-28 23:51:43 +0000411}
412
Evan Cheng6e967402006-04-04 00:10:53 +0000413def Int_ADDSSrm : SS_Intrm<0x58, "addss {$src2, $dst|$dst, $src2}",
414 int_x86_sse_add_ss>;
415def Int_ADDSDrm : SD_Intrm<0x58, "addsd {$src2, $dst|$dst, $src2}",
416 int_x86_sse2_add_sd>;
417def Int_MULSSrm : SS_Intrm<0x59, "mulss {$src2, $dst|$dst, $src2}",
418 int_x86_sse_mul_ss>;
419def Int_MULSDrm : SD_Intrm<0x59, "mulsd {$src2, $dst|$dst, $src2}",
420 int_x86_sse2_mul_sd>;
Evan Chengc46349d2006-03-28 23:51:43 +0000421
Evan Cheng6e967402006-04-04 00:10:53 +0000422def Int_DIVSSrr : SS_Intrr<0x5E, "divss {$src2, $dst|$dst, $src2}",
423 int_x86_sse_div_ss>;
424def Int_DIVSSrm : SS_Intrm<0x5E, "divss {$src2, $dst|$dst, $src2}",
425 int_x86_sse_div_ss>;
426def Int_DIVSDrr : SD_Intrr<0x5E, "divsd {$src2, $dst|$dst, $src2}",
427 int_x86_sse2_div_sd>;
428def Int_DIVSDrm : SD_Intrm<0x5E, "divsd {$src2, $dst|$dst, $src2}",
429 int_x86_sse2_div_sd>;
Evan Chengc46349d2006-03-28 23:51:43 +0000430
Evan Cheng6e967402006-04-04 00:10:53 +0000431def Int_SUBSSrr : SS_Intrr<0x5C, "subss {$src2, $dst|$dst, $src2}",
432 int_x86_sse_sub_ss>;
433def Int_SUBSSrm : SS_Intrm<0x5C, "subss {$src2, $dst|$dst, $src2}",
434 int_x86_sse_sub_ss>;
435def Int_SUBSDrr : SD_Intrr<0x5C, "subsd {$src2, $dst|$dst, $src2}",
436 int_x86_sse2_sub_sd>;
437def Int_SUBSDrm : SD_Intrm<0x5C, "subsd {$src2, $dst|$dst, $src2}",
438 int_x86_sse2_sub_sd>;
Evan Chengc46349d2006-03-28 23:51:43 +0000439}
440
Evan Cheng8703be42006-04-04 19:12:30 +0000441def Int_SQRTSSr : SS_Intr<0x51, "sqrtss {$src, $dst|$dst, $src}",
442 int_x86_sse_sqrt_ss>;
443def Int_SQRTSSm : SS_Intm<0x51, "sqrtss {$src, $dst|$dst, $src}",
444 int_x86_sse_sqrt_ss>;
445def Int_SQRTSDr : SD_Intr<0x51, "sqrtsd {$src, $dst|$dst, $src}",
446 int_x86_sse2_sqrt_sd>;
447def Int_SQRTSDm : SD_Intm<0x51, "sqrtsd {$src, $dst|$dst, $src}",
448 int_x86_sse2_sqrt_sd>;
Evan Chengc46349d2006-03-28 23:51:43 +0000449
Evan Cheng8703be42006-04-04 19:12:30 +0000450def Int_RSQRTSSr : SS_Intr<0x52, "rsqrtss {$src, $dst|$dst, $src}",
451 int_x86_sse_rsqrt_ss>;
452def Int_RSQRTSSm : SS_Intm<0x52, "rsqrtss {$src, $dst|$dst, $src}",
453 int_x86_sse_rsqrt_ss>;
454def Int_RCPSSr : SS_Intr<0x53, "rcpss {$src, $dst|$dst, $src}",
455 int_x86_sse_rcp_ss>;
456def Int_RCPSSm : SS_Intm<0x53, "rcpss {$src, $dst|$dst, $src}",
457 int_x86_sse_rcp_ss>;
Evan Chengc46349d2006-03-28 23:51:43 +0000458
459let isTwoAddress = 1 in {
Evan Cheng97ac5fa2006-04-03 23:49:17 +0000460def Int_MAXSSrr : SS_Intrr<0x5F, "maxss {$src2, $dst|$dst, $src2}",
Evan Cheng6e967402006-04-04 00:10:53 +0000461 int_x86_sse_max_ss>;
Evan Cheng97ac5fa2006-04-03 23:49:17 +0000462def Int_MAXSSrm : SS_Intrm<0x5F, "maxss {$src2, $dst|$dst, $src2}",
Evan Cheng6e967402006-04-04 00:10:53 +0000463 int_x86_sse_max_ss>;
Evan Cheng97ac5fa2006-04-03 23:49:17 +0000464def Int_MAXSDrr : SD_Intrr<0x5F, "maxsd {$src2, $dst|$dst, $src2}",
Evan Cheng6e967402006-04-04 00:10:53 +0000465 int_x86_sse2_max_sd>;
Evan Cheng97ac5fa2006-04-03 23:49:17 +0000466def Int_MAXSDrm : SD_Intrm<0x5F, "maxsd {$src2, $dst|$dst, $src2}",
Evan Cheng6e967402006-04-04 00:10:53 +0000467 int_x86_sse2_max_sd>;
Evan Cheng97ac5fa2006-04-03 23:49:17 +0000468def Int_MINSSrr : SS_Intrr<0x5D, "minss {$src2, $dst|$dst, $src2}",
Evan Cheng6e967402006-04-04 00:10:53 +0000469 int_x86_sse_min_ss>;
Evan Cheng97ac5fa2006-04-03 23:49:17 +0000470def Int_MINSSrm : SS_Intrm<0x5D, "minss {$src2, $dst|$dst, $src2}",
Evan Cheng6e967402006-04-04 00:10:53 +0000471 int_x86_sse_min_ss>;
Evan Cheng97ac5fa2006-04-03 23:49:17 +0000472def Int_MINSDrr : SD_Intrr<0x5D, "minsd {$src2, $dst|$dst, $src2}",
Evan Cheng6e967402006-04-04 00:10:53 +0000473 int_x86_sse2_min_sd>;
Evan Cheng97ac5fa2006-04-03 23:49:17 +0000474def Int_MINSDrm : SD_Intrm<0x5D, "minsd {$src2, $dst|$dst, $src2}",
Evan Cheng6e967402006-04-04 00:10:53 +0000475 int_x86_sse2_min_sd>;
Evan Chengc46349d2006-03-28 23:51:43 +0000476}
477
478// Conversion instructions
479def CVTSS2SIrr: SSI<0x2D, MRMSrcReg, (ops R32:$dst, FR32:$src),
480 "cvtss2si {$src, $dst|$dst, $src}", []>;
481def CVTSS2SIrm: SSI<0x2D, MRMSrcMem, (ops R32:$dst, f32mem:$src),
482 "cvtss2si {$src, $dst|$dst, $src}", []>;
483
484def CVTTSS2SIrr: SSI<0x2C, MRMSrcReg, (ops R32:$dst, FR32:$src),
Evan Cheng8703be42006-04-04 19:12:30 +0000485 "cvttss2si {$src, $dst|$dst, $src}",
486 [(set R32:$dst, (fp_to_sint FR32:$src))]>;
Evan Chengc46349d2006-03-28 23:51:43 +0000487def CVTTSS2SIrm: SSI<0x2C, MRMSrcMem, (ops R32:$dst, f32mem:$src),
Evan Cheng8703be42006-04-04 19:12:30 +0000488 "cvttss2si {$src, $dst|$dst, $src}",
489 [(set R32:$dst, (fp_to_sint (loadf32 addr:$src)))]>;
Evan Chengc46349d2006-03-28 23:51:43 +0000490def CVTTSD2SIrr: SDI<0x2C, MRMSrcReg, (ops R32:$dst, FR64:$src),
Evan Cheng8703be42006-04-04 19:12:30 +0000491 "cvttsd2si {$src, $dst|$dst, $src}",
492 [(set R32:$dst, (fp_to_sint FR64:$src))]>;
Evan Chengc46349d2006-03-28 23:51:43 +0000493def CVTTSD2SIrm: SDI<0x2C, MRMSrcMem, (ops R32:$dst, f64mem:$src),
Evan Cheng8703be42006-04-04 19:12:30 +0000494 "cvttsd2si {$src, $dst|$dst, $src}",
495 [(set R32:$dst, (fp_to_sint (loadf64 addr:$src)))]>;
Evan Chengc46349d2006-03-28 23:51:43 +0000496def CVTSD2SSrr: SDI<0x5A, MRMSrcReg, (ops FR32:$dst, FR64:$src),
Evan Cheng8703be42006-04-04 19:12:30 +0000497 "cvtsd2ss {$src, $dst|$dst, $src}",
498 [(set FR32:$dst, (fround FR64:$src))]>;
Evan Chengc46349d2006-03-28 23:51:43 +0000499def CVTSD2SSrm: SDI<0x5A, MRMSrcMem, (ops FR32:$dst, f64mem:$src),
Evan Cheng8703be42006-04-04 19:12:30 +0000500 "cvtsd2ss {$src, $dst|$dst, $src}",
501 [(set FR32:$dst, (fround (loadf64 addr:$src)))]>;
Evan Chengc46349d2006-03-28 23:51:43 +0000502def CVTSI2SSrr: SSI<0x2A, MRMSrcReg, (ops FR32:$dst, R32:$src),
503 "cvtsi2ss {$src, $dst|$dst, $src}",
504 [(set FR32:$dst, (sint_to_fp R32:$src))]>;
505def CVTSI2SSrm: SSI<0x2A, MRMSrcMem, (ops FR32:$dst, i32mem:$src),
Evan Cheng8703be42006-04-04 19:12:30 +0000506 "cvtsi2ss {$src, $dst|$dst, $src}",
507 [(set FR32:$dst, (sint_to_fp (loadi32 addr:$src)))]>;
Evan Chengc46349d2006-03-28 23:51:43 +0000508def CVTSI2SDrr: SDI<0x2A, MRMSrcReg, (ops FR64:$dst, R32:$src),
Evan Cheng8703be42006-04-04 19:12:30 +0000509 "cvtsi2sd {$src, $dst|$dst, $src}",
510 [(set FR64:$dst, (sint_to_fp R32:$src))]>;
Evan Chengc46349d2006-03-28 23:51:43 +0000511def CVTSI2SDrm: SDI<0x2A, MRMSrcMem, (ops FR64:$dst, i32mem:$src),
Evan Cheng8703be42006-04-04 19:12:30 +0000512 "cvtsi2sd {$src, $dst|$dst, $src}",
513 [(set FR64:$dst, (sint_to_fp (loadi32 addr:$src)))]>;
Evan Chengc46349d2006-03-28 23:51:43 +0000514// SSE2 instructions with XS prefix
515def CVTSS2SDrr: I<0x5A, MRMSrcReg, (ops FR64:$dst, FR32:$src),
Evan Cheng8703be42006-04-04 19:12:30 +0000516 "cvtss2sd {$src, $dst|$dst, $src}",
517 [(set FR64:$dst, (fextend FR32:$src))]>, XS,
Evan Chengc46349d2006-03-28 23:51:43 +0000518 Requires<[HasSSE2]>;
519def CVTSS2SDrm: I<0x5A, MRMSrcMem, (ops FR64:$dst, f32mem:$src),
Evan Cheng8703be42006-04-04 19:12:30 +0000520 "cvtss2sd {$src, $dst|$dst, $src}",
521 [(set FR64:$dst, (fextend (loadf32 addr:$src)))]>, XS,
Evan Chengc46349d2006-03-28 23:51:43 +0000522 Requires<[HasSSE2]>;
523
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000524// Comparison instructions
525let isTwoAddress = 1 in {
Evan Cheng470a6ad2006-02-22 02:26:30 +0000526def CMPSSrr : SSI<0xC2, MRMSrcReg,
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000527 (ops FR32:$dst, FR32:$src1, FR32:$src, SSECC:$cc),
Evan Cheng0876aa52006-03-30 06:21:22 +0000528 "cmp${cc}ss {$src, $dst|$dst, $src}",
529 []>;
Evan Cheng470a6ad2006-02-22 02:26:30 +0000530def CMPSSrm : SSI<0xC2, MRMSrcMem,
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000531 (ops FR32:$dst, FR32:$src1, f32mem:$src, SSECC:$cc),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000532 "cmp${cc}ss {$src, $dst|$dst, $src}", []>;
533def CMPSDrr : SDI<0xC2, MRMSrcReg,
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000534 (ops FR64:$dst, FR64:$src1, FR64:$src, SSECC:$cc),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000535 "cmp${cc}sd {$src, $dst|$dst, $src}", []>;
536def CMPSDrm : SDI<0xC2, MRMSrcMem,
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000537 (ops FR64:$dst, FR64:$src1, f64mem:$src, SSECC:$cc),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000538 "cmp${cc}sd {$src, $dst|$dst, $src}", []>;
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000539}
540
Evan Cheng470a6ad2006-02-22 02:26:30 +0000541def UCOMISSrr: PSI<0x2E, MRMSrcReg, (ops FR32:$src1, FR32:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000542 "ucomiss {$src2, $src1|$src1, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000543 [(X86cmp FR32:$src1, FR32:$src2)]>;
544def UCOMISSrm: PSI<0x2E, MRMSrcMem, (ops FR32:$src1, f32mem:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000545 "ucomiss {$src2, $src1|$src1, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000546 [(X86cmp FR32:$src1, (loadf32 addr:$src2))]>;
547def UCOMISDrr: PDI<0x2E, MRMSrcReg, (ops FR64:$src1, FR64:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000548 "ucomisd {$src2, $src1|$src1, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000549 [(X86cmp FR64:$src1, FR64:$src2)]>;
550def UCOMISDrm: PDI<0x2E, MRMSrcMem, (ops FR64:$src1, f64mem:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000551 "ucomisd {$src2, $src1|$src1, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000552 [(X86cmp FR64:$src1, (loadf64 addr:$src2))]>;
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000553
Evan Cheng0876aa52006-03-30 06:21:22 +0000554// Aliases to match intrinsics which expect XMM operand(s).
555let isTwoAddress = 1 in {
556def Int_CMPSSrr : SSI<0xC2, MRMSrcReg,
557 (ops VR128:$dst, VR128:$src1, VR128:$src, SSECC:$cc),
558 "cmp${cc}ss {$src, $dst|$dst, $src}",
559 [(set VR128:$dst, (int_x86_sse_cmp_ss VR128:$src1,
560 VR128:$src, imm:$cc))]>;
561def Int_CMPSSrm : SSI<0xC2, MRMSrcMem,
562 (ops VR128:$dst, VR128:$src1, f32mem:$src, SSECC:$cc),
563 "cmp${cc}ss {$src, $dst|$dst, $src}",
564 [(set VR128:$dst, (int_x86_sse_cmp_ss VR128:$src1,
565 (load addr:$src), imm:$cc))]>;
566def Int_CMPSDrr : SDI<0xC2, MRMSrcReg,
567 (ops VR128:$dst, VR128:$src1, VR128:$src, SSECC:$cc),
568 "cmp${cc}sd {$src, $dst|$dst, $src}", []>;
569def Int_CMPSDrm : SDI<0xC2, MRMSrcMem,
570 (ops VR128:$dst, VR128:$src1, f64mem:$src, SSECC:$cc),
571 "cmp${cc}sd {$src, $dst|$dst, $src}", []>;
572}
573
Evan Cheng6be2c582006-04-05 23:38:46 +0000574def Int_UCOMISSrr: PSI<0x2E, MRMSrcReg, (ops VR128:$src1, VR128:$src2),
575 "ucomiss {$src2, $src1|$src1, $src2}",
576 [(X86ucomi (v4f32 VR128:$src1), VR128:$src2)]>;
577def Int_UCOMISSrm: PSI<0x2E, MRMSrcMem, (ops VR128:$src1, f128mem:$src2),
578 "ucomiss {$src2, $src1|$src1, $src2}",
579 [(X86ucomi (v4f32 VR128:$src1), (loadv4f32 addr:$src2))]>;
580def Int_UCOMISDrr: PDI<0x2E, MRMSrcReg, (ops VR128:$src1, VR128:$src2),
581 "ucomisd {$src2, $src1|$src1, $src2}",
582 [(X86ucomi (v2f64 VR128:$src1), (v2f64 VR128:$src2))]>;
583def Int_UCOMISDrm: PDI<0x2E, MRMSrcMem, (ops VR128:$src1, f128mem:$src2),
584 "ucomisd {$src2, $src1|$src1, $src2}",
585 [(X86ucomi (v2f64 VR128:$src1), (loadv2f64 addr:$src2))]>;
586
587def Int_COMISSrr: PSI<0x2F, MRMSrcReg, (ops VR128:$src1, VR128:$src2),
588 "comiss {$src2, $src1|$src1, $src2}",
589 [(X86comi (v4f32 VR128:$src1), VR128:$src2)]>;
590def Int_COMISSrm: PSI<0x2F, MRMSrcMem, (ops VR128:$src1, f128mem:$src2),
591 "comiss {$src2, $src1|$src1, $src2}",
592 [(X86comi (v4f32 VR128:$src1), (loadv4f32 addr:$src2))]>;
593def Int_COMISDrr: PDI<0x2F, MRMSrcReg, (ops VR128:$src1, VR128:$src2),
594 "comisd {$src2, $src1|$src1, $src2}",
595 [(X86comi (v2f64 VR128:$src1), (v2f64 VR128:$src2))]>;
596def Int_COMISDrm: PDI<0x2F, MRMSrcMem, (ops VR128:$src1, f128mem:$src2),
597 "comisd {$src2, $src1|$src1, $src2}",
598 [(X86comi (v2f64 VR128:$src1), (loadv2f64 addr:$src2))]>;
Evan Cheng0876aa52006-03-30 06:21:22 +0000599
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000600// Aliases of packed instructions for scalar use. These all have names that
601// start with 'Fs'.
602
603// Alias instructions that map fld0 to pxor for sse.
604// FIXME: remove when we can teach regalloc that xor reg, reg is ok.
605def FsFLD0SS : I<0xEF, MRMInitReg, (ops FR32:$dst),
606 "pxor $dst, $dst", [(set FR32:$dst, fp32imm0)]>,
607 Requires<[HasSSE1]>, TB, OpSize;
608def FsFLD0SD : I<0xEF, MRMInitReg, (ops FR64:$dst),
609 "pxor $dst, $dst", [(set FR64:$dst, fp64imm0)]>,
610 Requires<[HasSSE2]>, TB, OpSize;
611
612// Alias instructions to do FR32 / FR64 reg-to-reg copy using movaps / movapd.
613// Upper bits are disregarded.
Evan Cheng470a6ad2006-02-22 02:26:30 +0000614def FsMOVAPSrr : PSI<0x28, MRMSrcReg, (ops FR32:$dst, FR32:$src),
615 "movaps {$src, $dst|$dst, $src}", []>;
616def FsMOVAPDrr : PDI<0x28, MRMSrcReg, (ops FR64:$dst, FR64:$src),
617 "movapd {$src, $dst|$dst, $src}", []>;
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000618
619// Alias instructions to load FR32 / FR64 from f128mem using movaps / movapd.
620// Upper bits are disregarded.
Evan Cheng470a6ad2006-02-22 02:26:30 +0000621def FsMOVAPSrm : PSI<0x28, MRMSrcMem, (ops FR32:$dst, f128mem:$src),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000622 "movaps {$src, $dst|$dst, $src}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000623 [(set FR32:$dst, (X86loadpf32 addr:$src))]>;
624def FsMOVAPDrm : PDI<0x28, MRMSrcMem, (ops FR64:$dst, f128mem:$src),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000625 "movapd {$src, $dst|$dst, $src}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000626 [(set FR64:$dst, (X86loadpf64 addr:$src))]>;
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000627
628// Alias bitwise logical operations using SSE logical ops on packed FP values.
629let isTwoAddress = 1 in {
630let isCommutable = 1 in {
Evan Cheng470a6ad2006-02-22 02:26:30 +0000631def FsANDPSrr : PSI<0x54, MRMSrcReg, (ops FR32:$dst, FR32:$src1, FR32:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000632 "andps {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000633 [(set FR32:$dst, (X86fand FR32:$src1, FR32:$src2))]>;
634def FsANDPDrr : PDI<0x54, MRMSrcReg, (ops FR64:$dst, FR64:$src1, FR64:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000635 "andpd {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000636 [(set FR64:$dst, (X86fand FR64:$src1, FR64:$src2))]>;
637def FsORPSrr : PSI<0x56, MRMSrcReg, (ops FR32:$dst, FR32:$src1, FR32:$src2),
638 "orps {$src2, $dst|$dst, $src2}", []>;
639def FsORPDrr : PDI<0x56, MRMSrcReg, (ops FR64:$dst, FR64:$src1, FR64:$src2),
640 "orpd {$src2, $dst|$dst, $src2}", []>;
641def FsXORPSrr : PSI<0x57, MRMSrcReg, (ops FR32:$dst, FR32:$src1, FR32:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000642 "xorps {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000643 [(set FR32:$dst, (X86fxor FR32:$src1, FR32:$src2))]>;
644def FsXORPDrr : PDI<0x57, MRMSrcReg, (ops FR64:$dst, FR64:$src1, FR64:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000645 "xorpd {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000646 [(set FR64:$dst, (X86fxor FR64:$src1, FR64:$src2))]>;
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000647}
Evan Cheng470a6ad2006-02-22 02:26:30 +0000648def FsANDPSrm : PSI<0x54, MRMSrcMem, (ops FR32:$dst, FR32:$src1, f128mem:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000649 "andps {$src2, $dst|$dst, $src2}",
650 [(set FR32:$dst, (X86fand FR32:$src1,
Evan Cheng470a6ad2006-02-22 02:26:30 +0000651 (X86loadpf32 addr:$src2)))]>;
652def FsANDPDrm : PDI<0x54, MRMSrcMem, (ops FR64:$dst, FR64:$src1, f128mem:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000653 "andpd {$src2, $dst|$dst, $src2}",
654 [(set FR64:$dst, (X86fand FR64:$src1,
Evan Cheng470a6ad2006-02-22 02:26:30 +0000655 (X86loadpf64 addr:$src2)))]>;
656def FsORPSrm : PSI<0x56, MRMSrcMem, (ops FR32:$dst, FR32:$src1, f128mem:$src2),
657 "orps {$src2, $dst|$dst, $src2}", []>;
658def FsORPDrm : PDI<0x56, MRMSrcMem, (ops FR64:$dst, FR64:$src1, f128mem:$src2),
659 "orpd {$src2, $dst|$dst, $src2}", []>;
660def FsXORPSrm : PSI<0x57, MRMSrcMem, (ops FR32:$dst, FR32:$src1, f128mem:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000661 "xorps {$src2, $dst|$dst, $src2}",
662 [(set FR32:$dst, (X86fxor FR32:$src1,
Evan Cheng470a6ad2006-02-22 02:26:30 +0000663 (X86loadpf32 addr:$src2)))]>;
664def FsXORPDrm : PDI<0x57, MRMSrcMem, (ops FR64:$dst, FR64:$src1, f128mem:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000665 "xorpd {$src2, $dst|$dst, $src2}",
666 [(set FR64:$dst, (X86fxor FR64:$src1,
Evan Cheng470a6ad2006-02-22 02:26:30 +0000667 (X86loadpf64 addr:$src2)))]>;
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000668
Evan Cheng470a6ad2006-02-22 02:26:30 +0000669def FsANDNPSrr : PSI<0x55, MRMSrcReg, (ops FR32:$dst, FR32:$src1, FR32:$src2),
670 "andnps {$src2, $dst|$dst, $src2}", []>;
671def FsANDNPSrm : PSI<0x55, MRMSrcMem, (ops FR32:$dst, FR32:$src1, f128mem:$src2),
672 "andnps {$src2, $dst|$dst, $src2}", []>;
673def FsANDNPDrr : PDI<0x55, MRMSrcReg, (ops FR64:$dst, FR64:$src1, FR64:$src2),
674 "andnpd {$src2, $dst|$dst, $src2}", []>;
675def FsANDNPDrm : PDI<0x55, MRMSrcMem, (ops FR64:$dst, FR64:$src1, f128mem:$src2),
676 "andnpd {$src2, $dst|$dst, $src2}", []>;
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000677}
678
679//===----------------------------------------------------------------------===//
680// SSE packed FP Instructions
681//===----------------------------------------------------------------------===//
682
Evan Chengc12e6c42006-03-19 09:38:54 +0000683// Some 'special' instructions
684def IMPLICIT_DEF_VR128 : I<0, Pseudo, (ops VR128:$dst),
685 "#IMPLICIT_DEF $dst",
686 [(set VR128:$dst, (v4f32 (undef)))]>,
687 Requires<[HasSSE1]>;
688
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000689// Move Instructions
Evan Cheng2246f842006-03-18 01:23:20 +0000690def MOVAPSrr : PSI<0x28, MRMSrcReg, (ops VR128:$dst, VR128:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000691 "movaps {$src, $dst|$dst, $src}", []>;
Evan Cheng2246f842006-03-18 01:23:20 +0000692def MOVAPSrm : PSI<0x28, MRMSrcMem, (ops VR128:$dst, f128mem:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000693 "movaps {$src, $dst|$dst, $src}",
Evan Cheng2246f842006-03-18 01:23:20 +0000694 [(set VR128:$dst, (loadv4f32 addr:$src))]>;
695def MOVAPDrr : PDI<0x28, MRMSrcReg, (ops VR128:$dst, VR128:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000696 "movapd {$src, $dst|$dst, $src}", []>;
Evan Cheng2246f842006-03-18 01:23:20 +0000697def MOVAPDrm : PDI<0x28, MRMSrcMem, (ops VR128:$dst, f128mem:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000698 "movapd {$src, $dst|$dst, $src}",
Evan Cheng2246f842006-03-18 01:23:20 +0000699 [(set VR128:$dst, (loadv2f64 addr:$src))]>;
Evan Chengffcb95b2006-02-21 19:13:53 +0000700
Evan Cheng2246f842006-03-18 01:23:20 +0000701def MOVAPSmr : PSI<0x29, MRMDestMem, (ops f128mem:$dst, VR128:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000702 "movaps {$src, $dst|$dst, $src}",
Evan Cheng2246f842006-03-18 01:23:20 +0000703 [(store (v4f32 VR128:$src), addr:$dst)]>;
704def MOVAPDmr : PDI<0x29, MRMDestMem, (ops f128mem:$dst, VR128:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000705 "movapd {$src, $dst|$dst, $src}",
Evan Cheng2246f842006-03-18 01:23:20 +0000706 [(store (v2f64 VR128:$src), addr:$dst)]>;
Evan Cheng470a6ad2006-02-22 02:26:30 +0000707
Evan Cheng2246f842006-03-18 01:23:20 +0000708def MOVUPSrr : PSI<0x10, MRMSrcReg, (ops VR128:$dst, VR128:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000709 "movups {$src, $dst|$dst, $src}", []>;
Evan Cheng2246f842006-03-18 01:23:20 +0000710def MOVUPSrm : PSI<0x10, MRMSrcMem, (ops VR128:$dst, f128mem:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000711 "movups {$src, $dst|$dst, $src}", []>;
Evan Cheng2246f842006-03-18 01:23:20 +0000712def MOVUPSmr : PSI<0x11, MRMDestMem, (ops f128mem:$dst, VR128:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000713 "movups {$src, $dst|$dst, $src}", []>;
Evan Cheng2246f842006-03-18 01:23:20 +0000714def MOVUPDrr : PDI<0x10, MRMSrcReg, (ops VR128:$dst, VR128:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000715 "movupd {$src, $dst|$dst, $src}", []>;
Evan Cheng2246f842006-03-18 01:23:20 +0000716def MOVUPDrm : PDI<0x10, MRMSrcMem, (ops VR128:$dst, f128mem:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000717 "movupd {$src, $dst|$dst, $src}", []>;
Evan Cheng2246f842006-03-18 01:23:20 +0000718def MOVUPDmr : PDI<0x11, MRMDestMem, (ops f128mem:$dst, VR128:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000719 "movupd {$src, $dst|$dst, $src}", []>;
720
Evan Cheng4fcb9222006-03-28 02:43:26 +0000721let isTwoAddress = 1 in {
Evan Cheng9bbfd4f2006-03-28 07:01:28 +0000722def MOVLPSrm : PSI<0x12, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f64mem:$src2),
Evan Cheng5ced1d82006-04-06 23:23:56 +0000723 "movlps {$src2, $dst|$dst, $src2}",
724 [(set VR128:$dst,
725 (v4f32 (vector_shuffle VR128:$src1,
726 (bc_v4f32 (v2f64 (scalar_to_vector (loadf64 addr:$src2)))),
727 MOVLP_shuffle_mask)))]>;
Evan Cheng9bbfd4f2006-03-28 07:01:28 +0000728def MOVLPDrm : PDI<0x12, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f64mem:$src2),
Evan Cheng5ced1d82006-04-06 23:23:56 +0000729 "movlpd {$src2, $dst|$dst, $src2}",
730 [(set VR128:$dst,
731 (v2f64 (vector_shuffle VR128:$src1,
732 (scalar_to_vector (loadf64 addr:$src2)),
733 MOVLP_shuffle_mask)))]>;
Evan Cheng4fcb9222006-03-28 02:43:26 +0000734def MOVHPSrm : PSI<0x16, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f64mem:$src2),
Evan Cheng5ced1d82006-04-06 23:23:56 +0000735 "movhps {$src2, $dst|$dst, $src2}",
736 [(set VR128:$dst,
737 (v4f32 (vector_shuffle VR128:$src1,
738 (bc_v4f32 (v2f64 (scalar_to_vector (loadf64 addr:$src2)))),
739 MOVHP_shuffle_mask)))]>;
Evan Cheng4fcb9222006-03-28 02:43:26 +0000740def MOVHPDrm : PDI<0x16, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f64mem:$src2),
741 "movhpd {$src2, $dst|$dst, $src2}",
742 [(set VR128:$dst,
743 (v2f64 (vector_shuffle VR128:$src1,
744 (scalar_to_vector (loadf64 addr:$src2)),
Evan Cheng5ced1d82006-04-06 23:23:56 +0000745 MOVHP_shuffle_mask)))]>;
Evan Cheng4fcb9222006-03-28 02:43:26 +0000746}
747
Evan Cheng9bbfd4f2006-03-28 07:01:28 +0000748def MOVLPSmr : PSI<0x13, MRMDestMem, (ops f64mem:$dst, VR128:$src),
749 "movlps {$src, $dst|$dst, $src}", []>;
750def MOVLPDmr : PDI<0x13, MRMDestMem, (ops f64mem:$dst, VR128:$src),
Evan Cheng20e3ed12006-04-03 22:30:54 +0000751 "movlpd {$src, $dst|$dst, $src}",
752 [(store (f64 (vector_extract (v2f64 VR128:$src),
753 (i32 0))), addr:$dst)]>;
Evan Cheng9bbfd4f2006-03-28 07:01:28 +0000754
Evan Cheng2246f842006-03-18 01:23:20 +0000755def MOVHPSmr : PSI<0x17, MRMDestMem, (ops f64mem:$dst, VR128:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000756 "movhps {$src, $dst|$dst, $src}", []>;
Evan Cheng2246f842006-03-18 01:23:20 +0000757def MOVHPDmr : PDI<0x17, MRMDestMem, (ops f64mem:$dst, VR128:$src),
Evan Cheng20e3ed12006-04-03 22:30:54 +0000758 "movhpd {$src, $dst|$dst, $src}",
759 [(store (f64 (vector_extract
760 (v2f64 (vector_shuffle VR128:$src, (undef),
761 UNPCKH_shuffle_mask)), (i32 0))),
762 addr:$dst)]>;
Evan Cheng470a6ad2006-02-22 02:26:30 +0000763
Evan Cheng14aed5e2006-03-24 01:18:28 +0000764let isTwoAddress = 1 in {
765def MOVLHPSrr : PSI<0x16, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
Evan Cheng4fcb9222006-03-28 02:43:26 +0000766 "movlhps {$src2, $dst|$dst, $src2}",
767 [(set VR128:$dst,
Evan Cheng2064a2b2006-03-28 06:50:32 +0000768 (v4f32 (vector_shuffle VR128:$src1, VR128:$src2,
769 MOVLHPS_shuffle_mask)))]>;
Evan Cheng2c0dbd02006-03-24 02:58:06 +0000770
Evan Cheng14aed5e2006-03-24 01:18:28 +0000771def MOVHLPSrr : PSI<0x12, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
Evan Chengbe296ac2006-03-28 06:53:49 +0000772 "movhlps {$src2, $dst|$dst, $src2}",
Evan Cheng4fcb9222006-03-28 02:43:26 +0000773 [(set VR128:$dst,
Evan Cheng2064a2b2006-03-28 06:50:32 +0000774 (v4f32 (vector_shuffle VR128:$src1, VR128:$src2,
Evan Cheng4fcb9222006-03-28 02:43:26 +0000775 MOVHLPS_shuffle_mask)))]>;
Evan Cheng14aed5e2006-03-24 01:18:28 +0000776}
Evan Cheng470a6ad2006-02-22 02:26:30 +0000777
Evan Cheng470a6ad2006-02-22 02:26:30 +0000778// Conversion instructions
Evan Cheng8703be42006-04-04 19:12:30 +0000779def CVTPI2PSr : PSI<0x2A, MRMSrcReg, (ops VR128:$dst, VR64:$src),
780 "cvtpi2ps {$src, $dst|$dst, $src}", []>;
781def CVTPI2PSm : PSI<0x2A, MRMSrcMem, (ops VR128:$dst, i64mem:$src),
782 "cvtpi2ps {$src, $dst|$dst, $src}", []>;
783def CVTPI2PDr : PDI<0x2A, MRMSrcReg, (ops VR128:$dst, VR64:$src),
784 "cvtpi2pd {$src, $dst|$dst, $src}", []>;
785def CVTPI2PDm : PDI<0x2A, MRMSrcMem, (ops VR128:$dst, i64mem:$src),
786 "cvtpi2pd {$src, $dst|$dst, $src}", []>;
Evan Cheng470a6ad2006-02-22 02:26:30 +0000787
788// SSE2 instructions without OpSize prefix
Evan Cheng8703be42006-04-04 19:12:30 +0000789def CVTDQ2PSr : I<0x5B, MRMSrcReg, (ops VR128:$dst, VR128:$src),
790 "cvtdq2ps {$src, $dst|$dst, $src}", []>, TB,
791 Requires<[HasSSE2]>;
792def CVTDQ2PSm : I<0x5B, MRMSrcMem, (ops VR128:$dst, i128mem:$src),
793 "cvtdq2ps {$src, $dst|$dst, $src}", []>, TB,
794 Requires<[HasSSE2]>;
Evan Cheng470a6ad2006-02-22 02:26:30 +0000795
796// SSE2 instructions with XS prefix
Evan Cheng8703be42006-04-04 19:12:30 +0000797def CVTDQ2PDr : I<0xE6, MRMSrcReg, (ops VR128:$dst, VR64:$src),
798 "cvtdq2pd {$src, $dst|$dst, $src}", []>,
799 XS, Requires<[HasSSE2]>;
800def CVTDQ2PDm : I<0xE6, MRMSrcMem, (ops VR128:$dst, i64mem:$src),
801 "cvtdq2pd {$src, $dst|$dst, $src}", []>,
802 XS, Requires<[HasSSE2]>;
Evan Cheng470a6ad2006-02-22 02:26:30 +0000803
Evan Cheng8703be42006-04-04 19:12:30 +0000804def CVTPS2PIr : PSI<0x2D, MRMSrcReg, (ops VR64:$dst, VR128:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000805 "cvtps2pi {$src, $dst|$dst, $src}", []>;
Evan Cheng8703be42006-04-04 19:12:30 +0000806def CVTPS2PIm : PSI<0x2D, MRMSrcMem, (ops VR64:$dst, f64mem:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000807 "cvtps2pi {$src, $dst|$dst, $src}", []>;
Evan Cheng8703be42006-04-04 19:12:30 +0000808def CVTPD2PIr : PDI<0x2D, MRMSrcReg, (ops VR64:$dst, VR128:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000809 "cvtpd2pi {$src, $dst|$dst, $src}", []>;
Evan Cheng8703be42006-04-04 19:12:30 +0000810def CVTPD2PIm : PDI<0x2D, MRMSrcMem, (ops VR64:$dst, f128mem:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000811 "cvtpd2pi {$src, $dst|$dst, $src}", []>;
812
Evan Cheng8703be42006-04-04 19:12:30 +0000813def CVTPS2DQr : PDI<0x5B, MRMSrcReg, (ops VR128:$dst, VR128:$src),
814 "cvtps2dq {$src, $dst|$dst, $src}", []>;
815def CVTPS2DQm : PDI<0x5B, MRMSrcMem, (ops VR128:$dst, f128mem:$src),
816 "cvtps2dq {$src, $dst|$dst, $src}", []>;
Evan Cheng470a6ad2006-02-22 02:26:30 +0000817// SSE2 packed instructions with XD prefix
Evan Cheng8703be42006-04-04 19:12:30 +0000818def CVTPD2DQr : SDI<0xE6, MRMSrcReg, (ops VR128:$dst, VR128:$src),
819 "cvtpd2dq {$src, $dst|$dst, $src}", []>;
820def CVTPD2DQm : SDI<0xE6, MRMSrcMem, (ops VR128:$dst, f128mem:$src),
821 "cvtpd2dq {$src, $dst|$dst, $src}", []>;
Evan Cheng470a6ad2006-02-22 02:26:30 +0000822
823// SSE2 instructions without OpSize prefix
Evan Cheng8703be42006-04-04 19:12:30 +0000824def CVTPS2PDr : I<0x5A, MRMSrcReg, (ops VR128:$dst, VR128:$src),
825 "cvtps2pd {$src, $dst|$dst, $src}", []>, TB,
826 Requires<[HasSSE2]>;
827def CVTPS2PDm : I<0x5A, MRMSrcReg, (ops VR128:$dst, f64mem:$src),
828 "cvtps2pd {$src, $dst|$dst, $src}", []>, TB,
829 Requires<[HasSSE2]>;
Evan Cheng470a6ad2006-02-22 02:26:30 +0000830
Evan Cheng8703be42006-04-04 19:12:30 +0000831def CVTPD2PSr : PDI<0x5A, MRMSrcReg, (ops VR128:$dst, VR128:$src),
832 "cvtpd2ps {$src, $dst|$dst, $src}", []>;
833def CVTPD2PSm : PDI<0x5A, MRMSrcReg, (ops VR128:$dst, f128mem:$src),
834 "cvtpd2ps {$src, $dst|$dst, $src}", []>;
Evan Cheng470a6ad2006-02-22 02:26:30 +0000835
836// Arithmetic
837let isTwoAddress = 1 in {
838let isCommutable = 1 in {
Evan Cheng2246f842006-03-18 01:23:20 +0000839def ADDPSrr : PSI<0x58, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000840 "addps {$src2, $dst|$dst, $src2}",
Evan Cheng2246f842006-03-18 01:23:20 +0000841 [(set VR128:$dst, (v4f32 (fadd VR128:$src1, VR128:$src2)))]>;
842def ADDPDrr : PDI<0x58, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000843 "addpd {$src2, $dst|$dst, $src2}",
Evan Cheng2246f842006-03-18 01:23:20 +0000844 [(set VR128:$dst, (v2f64 (fadd VR128:$src1, VR128:$src2)))]>;
845def MULPSrr : PSI<0x59, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000846 "mulps {$src2, $dst|$dst, $src2}",
Evan Cheng2246f842006-03-18 01:23:20 +0000847 [(set VR128:$dst, (v4f32 (fmul VR128:$src1, VR128:$src2)))]>;
848def MULPDrr : PDI<0x59, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000849 "mulpd {$src2, $dst|$dst, $src2}",
Evan Cheng2246f842006-03-18 01:23:20 +0000850 [(set VR128:$dst, (v2f64 (fmul VR128:$src1, VR128:$src2)))]>;
Evan Cheng470a6ad2006-02-22 02:26:30 +0000851}
852
Evan Cheng2246f842006-03-18 01:23:20 +0000853def ADDPSrm : PSI<0x58, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000854 "addps {$src2, $dst|$dst, $src2}",
Evan Cheng2246f842006-03-18 01:23:20 +0000855 [(set VR128:$dst, (v4f32 (fadd VR128:$src1,
856 (load addr:$src2))))]>;
857def ADDPDrm : PDI<0x58, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000858 "addpd {$src2, $dst|$dst, $src2}",
Evan Cheng2246f842006-03-18 01:23:20 +0000859 [(set VR128:$dst, (v2f64 (fadd VR128:$src1,
860 (load addr:$src2))))]>;
861def MULPSrm : PSI<0x59, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000862 "mulps {$src2, $dst|$dst, $src2}",
Evan Cheng2246f842006-03-18 01:23:20 +0000863 [(set VR128:$dst, (v4f32 (fmul VR128:$src1,
864 (load addr:$src2))))]>;
865def MULPDrm : PDI<0x59, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000866 "mulpd {$src2, $dst|$dst, $src2}",
Evan Cheng2246f842006-03-18 01:23:20 +0000867 [(set VR128:$dst, (v2f64 (fmul VR128:$src1,
868 (load addr:$src2))))]>;
Evan Cheng470a6ad2006-02-22 02:26:30 +0000869
Evan Cheng2246f842006-03-18 01:23:20 +0000870def DIVPSrr : PSI<0x5E, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
871 "divps {$src2, $dst|$dst, $src2}",
872 [(set VR128:$dst, (v4f32 (fdiv VR128:$src1, VR128:$src2)))]>;
873def DIVPSrm : PSI<0x5E, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
874 "divps {$src2, $dst|$dst, $src2}",
875 [(set VR128:$dst, (v4f32 (fdiv VR128:$src1,
876 (load addr:$src2))))]>;
877def DIVPDrr : PDI<0x5E, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000878 "divpd {$src2, $dst|$dst, $src2}",
Evan Cheng2246f842006-03-18 01:23:20 +0000879 [(set VR128:$dst, (v2f64 (fdiv VR128:$src1, VR128:$src2)))]>;
880def DIVPDrm : PDI<0x5E, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000881 "divpd {$src2, $dst|$dst, $src2}",
Evan Cheng2246f842006-03-18 01:23:20 +0000882 [(set VR128:$dst, (v2f64 (fdiv VR128:$src1,
883 (load addr:$src2))))]>;
Evan Cheng470a6ad2006-02-22 02:26:30 +0000884
Evan Cheng2246f842006-03-18 01:23:20 +0000885def SUBPSrr : PSI<0x5C, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
886 "subps {$src2, $dst|$dst, $src2}",
887 [(set VR128:$dst, (v4f32 (fsub VR128:$src1, VR128:$src2)))]>;
888def SUBPSrm : PSI<0x5C, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
889 "subps {$src2, $dst|$dst, $src2}",
890 [(set VR128:$dst, (v4f32 (fsub VR128:$src1,
891 (load addr:$src2))))]>;
892def SUBPDrr : PDI<0x5C, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
893 "subpd {$src2, $dst|$dst, $src2}",
Evan Cheng2c0dbd02006-03-24 02:58:06 +0000894 [(set VR128:$dst, (v2f64 (fsub VR128:$src1, VR128:$src2)))]>;
Evan Cheng2246f842006-03-18 01:23:20 +0000895def SUBPDrm : PDI<0x5C, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
896 "subpd {$src2, $dst|$dst, $src2}",
Evan Cheng2c0dbd02006-03-24 02:58:06 +0000897 [(set VR128:$dst, (v2f64 (fsub VR128:$src1,
898 (load addr:$src2))))]>;
Evan Cheng470a6ad2006-02-22 02:26:30 +0000899}
900
Evan Cheng8703be42006-04-04 19:12:30 +0000901def SQRTPSr : PS_Intr<0x51, "sqrtps {$src, $dst|$dst, $src}",
902 int_x86_sse_sqrt_ps>;
903def SQRTPSm : PS_Intm<0x51, "sqrtps {$src, $dst|$dst, $src}",
904 int_x86_sse_sqrt_ps>;
905def SQRTPDr : PD_Intr<0x51, "sqrtpd {$src, $dst|$dst, $src}",
906 int_x86_sse2_sqrt_pd>;
907def SQRTPDm : PD_Intm<0x51, "sqrtpd {$src, $dst|$dst, $src}",
908 int_x86_sse2_sqrt_pd>;
Evan Cheng470a6ad2006-02-22 02:26:30 +0000909
Evan Cheng8703be42006-04-04 19:12:30 +0000910def RSQRTPSr : PS_Intr<0x52, "rsqrtps {$src, $dst|$dst, $src}",
911 int_x86_sse_rsqrt_ps>;
912def RSQRTPSm : PS_Intm<0x52, "rsqrtps {$src, $dst|$dst, $src}",
913 int_x86_sse_rsqrt_ps>;
914def RCPPSr : PS_Intr<0x53, "rcpps {$src, $dst|$dst, $src}",
915 int_x86_sse_rcp_ps>;
916def RCPPSm : PS_Intm<0x53, "rcpps {$src, $dst|$dst, $src}",
917 int_x86_sse_rcp_ps>;
Evan Cheng470a6ad2006-02-22 02:26:30 +0000918
Evan Cheng97ac5fa2006-04-03 23:49:17 +0000919let isTwoAddress = 1 in {
920def MAXPSrr : PS_Intrr<0x5F, "maxps {$src2, $dst|$dst, $src2}",
921 int_x86_sse_max_ps>;
922def MAXPSrm : PS_Intrm<0x5F, "maxps {$src2, $dst|$dst, $src2}",
923 int_x86_sse_max_ps>;
924def MAXPDrr : PD_Intrr<0x5F, "maxpd {$src2, $dst|$dst, $src2}",
925 int_x86_sse2_max_pd>;
926def MAXPDrm : PD_Intrm<0x5F, "maxpd {$src2, $dst|$dst, $src2}",
927 int_x86_sse2_max_pd>;
928def MINPSrr : PS_Intrr<0x5D, "minps {$src2, $dst|$dst, $src2}",
929 int_x86_sse_min_ps>;
930def MINPSrm : PS_Intrm<0x5D, "minps {$src2, $dst|$dst, $src2}",
931 int_x86_sse_min_ps>;
932def MINPDrr : PD_Intrr<0x5D, "minpd {$src2, $dst|$dst, $src2}",
933 int_x86_sse2_min_pd>;
934def MINPDrm : PD_Intrm<0x5D, "minpd {$src2, $dst|$dst, $src2}",
935 int_x86_sse2_min_pd>;
936}
Evan Chengffcb95b2006-02-21 19:13:53 +0000937
938// Logical
939let isTwoAddress = 1 in {
940let isCommutable = 1 in {
Evan Cheng2246f842006-03-18 01:23:20 +0000941def ANDPSrr : PSI<0x54, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
942 "andps {$src2, $dst|$dst, $src2}",
Evan Cheng5aa97b22006-03-29 18:47:40 +0000943 [(set VR128:$dst,
944 (and (bc_v4i32 (v4f32 VR128:$src1)),
945 (bc_v4i32 (v4f32 VR128:$src2))))]>;
Evan Cheng2246f842006-03-18 01:23:20 +0000946def ANDPDrr : PDI<0x54, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
Evan Chengffcb95b2006-02-21 19:13:53 +0000947 "andpd {$src2, $dst|$dst, $src2}",
Evan Cheng5aa97b22006-03-29 18:47:40 +0000948 [(set VR128:$dst,
949 (and (bc_v2i64 (v2f64 VR128:$src1)),
950 (bc_v2i64 (v2f64 VR128:$src2))))]>;
Evan Cheng2246f842006-03-18 01:23:20 +0000951def ORPSrr : PSI<0x56, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
952 "orps {$src2, $dst|$dst, $src2}",
Evan Cheng5aa97b22006-03-29 18:47:40 +0000953 [(set VR128:$dst,
954 (or (bc_v4i32 (v4f32 VR128:$src1)),
955 (bc_v4i32 (v4f32 VR128:$src2))))]>;
Evan Cheng2246f842006-03-18 01:23:20 +0000956def ORPDrr : PDI<0x56, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
957 "orpd {$src2, $dst|$dst, $src2}",
Evan Cheng5aa97b22006-03-29 18:47:40 +0000958 [(set VR128:$dst,
959 (or (bc_v2i64 (v2f64 VR128:$src1)),
960 (bc_v2i64 (v2f64 VR128:$src2))))]>;
Evan Cheng2246f842006-03-18 01:23:20 +0000961def XORPSrr : PSI<0x57, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
962 "xorps {$src2, $dst|$dst, $src2}",
Evan Cheng5aa97b22006-03-29 18:47:40 +0000963 [(set VR128:$dst,
964 (xor (bc_v4i32 (v4f32 VR128:$src1)),
965 (bc_v4i32 (v4f32 VR128:$src2))))]>;
Evan Cheng2246f842006-03-18 01:23:20 +0000966def XORPDrr : PDI<0x57, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
967 "xorpd {$src2, $dst|$dst, $src2}",
Evan Cheng5aa97b22006-03-29 18:47:40 +0000968 [(set VR128:$dst,
969 (xor (bc_v2i64 (v2f64 VR128:$src1)),
970 (bc_v2i64 (v2f64 VR128:$src2))))]>;
Evan Chengffcb95b2006-02-21 19:13:53 +0000971}
Evan Cheng2246f842006-03-18 01:23:20 +0000972def ANDPSrm : PSI<0x54, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
973 "andps {$src2, $dst|$dst, $src2}",
Evan Cheng5aa97b22006-03-29 18:47:40 +0000974 [(set VR128:$dst,
975 (and (bc_v4i32 (v4f32 VR128:$src1)),
976 (bc_v4i32 (loadv4f32 addr:$src2))))]>;
Evan Cheng2246f842006-03-18 01:23:20 +0000977def ANDPDrm : PDI<0x54, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
978 "andpd {$src2, $dst|$dst, $src2}",
Evan Cheng5aa97b22006-03-29 18:47:40 +0000979 [(set VR128:$dst,
980 (and (bc_v2i64 (v2f64 VR128:$src1)),
981 (bc_v2i64 (loadv2f64 addr:$src2))))]>;
Evan Cheng2246f842006-03-18 01:23:20 +0000982def ORPSrm : PSI<0x56, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
983 "orps {$src2, $dst|$dst, $src2}",
Evan Cheng5aa97b22006-03-29 18:47:40 +0000984 [(set VR128:$dst,
985 (or (bc_v4i32 (v4f32 VR128:$src1)),
986 (bc_v4i32 (loadv4f32 addr:$src2))))]>;
Evan Cheng2246f842006-03-18 01:23:20 +0000987def ORPDrm : PDI<0x56, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
988 "orpd {$src2, $dst|$dst, $src2}",
Evan Cheng5aa97b22006-03-29 18:47:40 +0000989 [(set VR128:$dst,
990 (or (bc_v2i64 (v2f64 VR128:$src1)),
991 (bc_v2i64 (loadv2f64 addr:$src2))))]>;
Evan Cheng2246f842006-03-18 01:23:20 +0000992def XORPSrm : PSI<0x57, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
993 "xorps {$src2, $dst|$dst, $src2}",
Evan Cheng5aa97b22006-03-29 18:47:40 +0000994 [(set VR128:$dst,
995 (xor (bc_v4i32 (v4f32 VR128:$src1)),
996 (bc_v4i32 (loadv4f32 addr:$src2))))]>;
Evan Cheng2246f842006-03-18 01:23:20 +0000997def XORPDrm : PDI<0x57, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
998 "xorpd {$src2, $dst|$dst, $src2}",
Evan Cheng5aa97b22006-03-29 18:47:40 +0000999 [(set VR128:$dst,
1000 (xor (bc_v2i64 (v2f64 VR128:$src1)),
1001 (bc_v2i64 (loadv2f64 addr:$src2))))]>;
Evan Cheng2246f842006-03-18 01:23:20 +00001002def ANDNPSrr : PSI<0x55, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
1003 "andnps {$src2, $dst|$dst, $src2}",
Evan Cheng5aa97b22006-03-29 18:47:40 +00001004 [(set VR128:$dst,
1005 (and (vnot (bc_v4i32 (v4f32 VR128:$src1))),
1006 (bc_v4i32 (v4f32 VR128:$src2))))]>;
1007def ANDNPSrm : PSI<0x55, MRMSrcMem, (ops VR128:$dst, VR128:$src1,f128mem:$src2),
Evan Cheng2246f842006-03-18 01:23:20 +00001008 "andnps {$src2, $dst|$dst, $src2}",
Evan Cheng5aa97b22006-03-29 18:47:40 +00001009 [(set VR128:$dst,
1010 (and (vnot (bc_v4i32 (v4f32 VR128:$src1))),
1011 (bc_v4i32 (loadv4f32 addr:$src2))))]>;
Evan Cheng2246f842006-03-18 01:23:20 +00001012def ANDNPDrr : PDI<0x55, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
1013 "andnpd {$src2, $dst|$dst, $src2}",
Evan Cheng5aa97b22006-03-29 18:47:40 +00001014 [(set VR128:$dst,
1015 (and (vnot (bc_v2i64 (v2f64 VR128:$src1))),
1016 (bc_v2i64 (v2f64 VR128:$src2))))]>;
1017def ANDNPDrm : PDI<0x55, MRMSrcMem, (ops VR128:$dst, VR128:$src1,f128mem:$src2),
Evan Cheng2246f842006-03-18 01:23:20 +00001018 "andnpd {$src2, $dst|$dst, $src2}",
Evan Cheng5aa97b22006-03-29 18:47:40 +00001019 [(set VR128:$dst,
1020 (and (vnot (bc_v2i64 (v2f64 VR128:$src1))),
1021 (bc_v2i64 (loadv2f64 addr:$src2))))]>;
Evan Chengffcb95b2006-02-21 19:13:53 +00001022}
Evan Chengbf156d12006-02-21 19:26:52 +00001023
Evan Cheng470a6ad2006-02-22 02:26:30 +00001024let isTwoAddress = 1 in {
Evan Cheng21760462006-04-04 03:04:07 +00001025def CMPPSrr : PSIi8<0xC2, MRMSrcReg,
1026 (ops VR128:$dst, VR128:$src1, VR128:$src, SSECC:$cc),
1027 "cmp${cc}ps {$src, $dst|$dst, $src}",
1028 [(set VR128:$dst, (int_x86_sse_cmp_ps VR128:$src1,
1029 VR128:$src, imm:$cc))]>;
1030def CMPPSrm : PSIi8<0xC2, MRMSrcMem,
1031 (ops VR128:$dst, VR128:$src1, f128mem:$src, SSECC:$cc),
1032 "cmp${cc}ps {$src, $dst|$dst, $src}",
1033 [(set VR128:$dst, (int_x86_sse_cmp_ps VR128:$src1,
1034 (load addr:$src), imm:$cc))]>;
1035def CMPPDrr : PDIi8<0xC2, MRMSrcReg,
1036 (ops VR128:$dst, VR128:$src1, VR128:$src, SSECC:$cc),
1037 "cmp${cc}pd {$src, $dst|$dst, $src}", []>;
1038def CMPPDrm : PDIi8<0xC2, MRMSrcMem,
1039 (ops VR128:$dst, VR128:$src1, f128mem:$src, SSECC:$cc),
1040 "cmp${cc}pd {$src, $dst|$dst, $src}", []>;
Evan Cheng470a6ad2006-02-22 02:26:30 +00001041}
1042
1043// Shuffle and unpack instructions
Evan Cheng0cea6d22006-03-22 20:08:18 +00001044let isTwoAddress = 1 in {
Evan Cheng2da953f2006-03-22 07:10:28 +00001045def SHUFPSrr : PSIi8<0xC6, MRMSrcReg,
Evan Cheng0038e592006-03-28 00:39:58 +00001046 (ops VR128:$dst, VR128:$src1, VR128:$src2, i32i8imm:$src3),
Evan Cheng14aed5e2006-03-24 01:18:28 +00001047 "shufps {$src3, $src2, $dst|$dst, $src2, $src3}",
Evan Cheng4f563382006-03-29 01:30:51 +00001048 [(set VR128:$dst, (v4f32 (vector_shuffle
1049 VR128:$src1, VR128:$src2,
1050 SHUFP_shuffle_mask:$src3)))]>;
Evan Cheng2da953f2006-03-22 07:10:28 +00001051def SHUFPSrm : PSIi8<0xC6, MRMSrcMem,
Evan Cheng0038e592006-03-28 00:39:58 +00001052 (ops VR128:$dst, VR128:$src1, f128mem:$src2, i32i8imm:$src3),
1053 "shufps {$src3, $src2, $dst|$dst, $src2, $src3}",
Evan Cheng4f563382006-03-29 01:30:51 +00001054 [(set VR128:$dst, (v4f32 (vector_shuffle
1055 VR128:$src1, (load addr:$src2),
1056 SHUFP_shuffle_mask:$src3)))]>;
Evan Cheng2da953f2006-03-22 07:10:28 +00001057def SHUFPDrr : PDIi8<0xC6, MRMSrcReg,
1058 (ops VR128:$dst, VR128:$src1, VR128:$src2, i8imm:$src3),
Evan Cheng14aed5e2006-03-24 01:18:28 +00001059 "shufpd {$src3, $src2, $dst|$dst, $src2, $src3}",
Evan Cheng4f563382006-03-29 01:30:51 +00001060 [(set VR128:$dst, (v2f64 (vector_shuffle
1061 VR128:$src1, VR128:$src2,
1062 SHUFP_shuffle_mask:$src3)))]>;
Evan Cheng2da953f2006-03-22 07:10:28 +00001063def SHUFPDrm : PDIi8<0xC6, MRMSrcMem,
1064 (ops VR128:$dst, VR128:$src1, f128mem:$src2, i8imm:$src3),
Evan Cheng0038e592006-03-28 00:39:58 +00001065 "shufpd {$src3, $src2, $dst|$dst, $src2, $src3}",
Evan Cheng4f563382006-03-29 01:30:51 +00001066 [(set VR128:$dst, (v2f64 (vector_shuffle
1067 VR128:$src1, (load addr:$src2),
1068 SHUFP_shuffle_mask:$src3)))]>;
Evan Cheng470a6ad2006-02-22 02:26:30 +00001069
1070def UNPCKHPSrr : PSI<0x15, MRMSrcReg,
Evan Cheng2246f842006-03-18 01:23:20 +00001071 (ops VR128:$dst, VR128:$src1, VR128:$src2),
Evan Cheng4fcb9222006-03-28 02:43:26 +00001072 "unpckhps {$src2, $dst|$dst, $src2}",
Evan Cheng4f563382006-03-29 01:30:51 +00001073 [(set VR128:$dst, (v4f32 (vector_shuffle
1074 VR128:$src1, VR128:$src2,
1075 UNPCKH_shuffle_mask)))]>;
Evan Cheng470a6ad2006-02-22 02:26:30 +00001076def UNPCKHPSrm : PSI<0x15, MRMSrcMem,
Evan Cheng2246f842006-03-18 01:23:20 +00001077 (ops VR128:$dst, VR128:$src1, f128mem:$src2),
Evan Cheng4fcb9222006-03-28 02:43:26 +00001078 "unpckhps {$src2, $dst|$dst, $src2}",
Evan Cheng4f563382006-03-29 01:30:51 +00001079 [(set VR128:$dst, (v4f32 (vector_shuffle
1080 VR128:$src1, (load addr:$src2),
1081 UNPCKH_shuffle_mask)))]>;
Evan Cheng470a6ad2006-02-22 02:26:30 +00001082def UNPCKHPDrr : PDI<0x15, MRMSrcReg,
Evan Cheng2246f842006-03-18 01:23:20 +00001083 (ops VR128:$dst, VR128:$src1, VR128:$src2),
Evan Cheng4fcb9222006-03-28 02:43:26 +00001084 "unpckhpd {$src2, $dst|$dst, $src2}",
Evan Cheng4f563382006-03-29 01:30:51 +00001085 [(set VR128:$dst, (v2f64 (vector_shuffle
1086 VR128:$src1, VR128:$src2,
1087 UNPCKH_shuffle_mask)))]>;
Evan Cheng470a6ad2006-02-22 02:26:30 +00001088def UNPCKHPDrm : PDI<0x15, MRMSrcMem,
Evan Cheng2246f842006-03-18 01:23:20 +00001089 (ops VR128:$dst, VR128:$src1, f128mem:$src2),
Evan Cheng4fcb9222006-03-28 02:43:26 +00001090 "unpckhpd {$src2, $dst|$dst, $src2}",
Evan Cheng4f563382006-03-29 01:30:51 +00001091 [(set VR128:$dst, (v2f64 (vector_shuffle
1092 VR128:$src1, (load addr:$src2),
1093 UNPCKH_shuffle_mask)))]>;
Evan Cheng4fcb9222006-03-28 02:43:26 +00001094
Evan Cheng470a6ad2006-02-22 02:26:30 +00001095def UNPCKLPSrr : PSI<0x14, MRMSrcReg,
Evan Cheng2246f842006-03-18 01:23:20 +00001096 (ops VR128:$dst, VR128:$src1, VR128:$src2),
Evan Chengc60bd972006-03-25 09:37:23 +00001097 "unpcklps {$src2, $dst|$dst, $src2}",
Evan Cheng4f563382006-03-29 01:30:51 +00001098 [(set VR128:$dst, (v4f32 (vector_shuffle
1099 VR128:$src1, VR128:$src2,
1100 UNPCKL_shuffle_mask)))]>;
Evan Cheng470a6ad2006-02-22 02:26:30 +00001101def UNPCKLPSrm : PSI<0x14, MRMSrcMem,
Evan Cheng2246f842006-03-18 01:23:20 +00001102 (ops VR128:$dst, VR128:$src1, f128mem:$src2),
Evan Chengc60bd972006-03-25 09:37:23 +00001103 "unpcklps {$src2, $dst|$dst, $src2}",
Evan Cheng4f563382006-03-29 01:30:51 +00001104 [(set VR128:$dst, (v4f32 (vector_shuffle
1105 VR128:$src1, (load addr:$src2),
1106 UNPCKL_shuffle_mask)))]>;
Evan Cheng470a6ad2006-02-22 02:26:30 +00001107def UNPCKLPDrr : PDI<0x14, MRMSrcReg,
Evan Cheng2246f842006-03-18 01:23:20 +00001108 (ops VR128:$dst, VR128:$src1, VR128:$src2),
Evan Cheng4fcb9222006-03-28 02:43:26 +00001109 "unpcklpd {$src2, $dst|$dst, $src2}",
Evan Cheng4f563382006-03-29 01:30:51 +00001110 [(set VR128:$dst, (v2f64 (vector_shuffle
1111 VR128:$src1, VR128:$src2,
1112 UNPCKL_shuffle_mask)))]>;
Evan Cheng470a6ad2006-02-22 02:26:30 +00001113def UNPCKLPDrm : PDI<0x14, MRMSrcMem,
Evan Cheng2246f842006-03-18 01:23:20 +00001114 (ops VR128:$dst, VR128:$src1, f128mem:$src2),
Evan Cheng4fcb9222006-03-28 02:43:26 +00001115 "unpcklpd {$src2, $dst|$dst, $src2}",
Evan Cheng4f563382006-03-29 01:30:51 +00001116 [(set VR128:$dst, (v2f64 (vector_shuffle
1117 VR128:$src1, (load addr:$src2),
1118 UNPCKL_shuffle_mask)))]>;
Evan Cheng2c0dbd02006-03-24 02:58:06 +00001119}
Evan Cheng470a6ad2006-02-22 02:26:30 +00001120
Evan Cheng4b1734f2006-03-31 21:29:33 +00001121// Horizontal ops
1122let isTwoAddress = 1 in {
1123def HADDPSrr : S3S_Intrr<0x7C, "haddps {$src2, $dst|$dst, $src2}",
1124 int_x86_sse3_hadd_ps>;
1125def HADDPSrm : S3S_Intrm<0x7C, "haddps {$src2, $dst|$dst, $src2}",
1126 int_x86_sse3_hadd_ps>;
1127def HADDPDrr : S3D_Intrr<0x7C, "haddpd {$src2, $dst|$dst, $src2}",
1128 int_x86_sse3_hadd_pd>;
1129def HADDPDrm : S3D_Intrm<0x7C, "haddpd {$src2, $dst|$dst, $src2}",
1130 int_x86_sse3_hadd_pd>;
1131def HSUBPSrr : S3S_Intrr<0x7C, "hsubps {$src2, $dst|$dst, $src2}",
1132 int_x86_sse3_hsub_ps>;
1133def HSUBPSrm : S3S_Intrm<0x7C, "hsubps {$src2, $dst|$dst, $src2}",
1134 int_x86_sse3_hsub_ps>;
1135def HSUBPDrr : S3D_Intrr<0x7C, "hsubpd {$src2, $dst|$dst, $src2}",
1136 int_x86_sse3_hsub_pd>;
1137def HSUBPDrm : S3D_Intrm<0x7C, "hsubpd {$src2, $dst|$dst, $src2}",
1138 int_x86_sse3_hsub_pd>;
1139}
1140
Evan Chengbf156d12006-02-21 19:26:52 +00001141//===----------------------------------------------------------------------===//
Evan Cheng4e4c71e2006-02-21 20:00:20 +00001142// SSE integer instructions
Evan Chengbf156d12006-02-21 19:26:52 +00001143//===----------------------------------------------------------------------===//
1144
Evan Cheng4e4c71e2006-02-21 20:00:20 +00001145// Move Instructions
Evan Cheng24dc1f52006-03-23 07:44:07 +00001146def MOVDQArr : PDI<0x6F, MRMSrcReg, (ops VR128:$dst, VR128:$src),
1147 "movdqa {$src, $dst|$dst, $src}", []>;
1148def MOVDQArm : PDI<0x6F, MRMSrcMem, (ops VR128:$dst, i128mem:$src),
1149 "movdqa {$src, $dst|$dst, $src}",
1150 [(set VR128:$dst, (loadv4i32 addr:$src))]>;
1151def MOVDQAmr : PDI<0x7F, MRMDestMem, (ops i128mem:$dst, VR128:$src),
1152 "movdqa {$src, $dst|$dst, $src}",
1153 [(store (v4i32 VR128:$src), addr:$dst)]>;
1154
Evan Chenga971f6f2006-03-23 01:57:24 +00001155// 128-bit Integer Arithmetic
1156let isTwoAddress = 1 in {
1157let isCommutable = 1 in {
1158def PADDBrr : PDI<0xFC, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
1159 "paddb {$src2, $dst|$dst, $src2}",
1160 [(set VR128:$dst, (v16i8 (add VR128:$src1, VR128:$src2)))]>;
1161def PADDWrr : PDI<0xFD, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
1162 "paddw {$src2, $dst|$dst, $src2}",
1163 [(set VR128:$dst, (v8i16 (add VR128:$src1, VR128:$src2)))]>;
1164def PADDDrr : PDI<0xFE, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
1165 "paddd {$src2, $dst|$dst, $src2}",
1166 [(set VR128:$dst, (v4i32 (add VR128:$src1, VR128:$src2)))]>;
Evan Cheng506d3df2006-03-29 23:07:14 +00001167
1168def PADDQrr : PDI<0xD4, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
1169 "paddq {$src2, $dst|$dst, $src2}",
1170 [(set VR128:$dst, (v2i64 (add VR128:$src1, VR128:$src2)))]>;
Evan Chenga971f6f2006-03-23 01:57:24 +00001171}
1172def PADDBrm : PDI<0xFC, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
1173 "paddb {$src2, $dst|$dst, $src2}",
1174 [(set VR128:$dst, (v16i8 (add VR128:$src1,
1175 (load addr:$src2))))]>;
1176def PADDWrm : PDI<0xFD, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
1177 "paddw {$src2, $dst|$dst, $src2}",
1178 [(set VR128:$dst, (v8i16 (add VR128:$src1,
1179 (load addr:$src2))))]>;
1180def PADDDrm : PDI<0xFE, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
1181 "paddd {$src2, $dst|$dst, $src2}",
1182 [(set VR128:$dst, (v4i32 (add VR128:$src1,
1183 (load addr:$src2))))]>;
Evan Cheng506d3df2006-03-29 23:07:14 +00001184def PADDQrm : PDI<0xD4, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
1185 "paddd {$src2, $dst|$dst, $src2}",
1186 [(set VR128:$dst, (v2i64 (add VR128:$src1,
1187 (load addr:$src2))))]>;
Evan Cheng7b1d34b2006-03-25 01:33:37 +00001188
1189def PSUBBrr : PDI<0xF8, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
1190 "psubb {$src2, $dst|$dst, $src2}",
1191 [(set VR128:$dst, (v16i8 (sub VR128:$src1, VR128:$src2)))]>;
1192def PSUBWrr : PDI<0xF9, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
1193 "psubw {$src2, $dst|$dst, $src2}",
1194 [(set VR128:$dst, (v8i16 (sub VR128:$src1, VR128:$src2)))]>;
1195def PSUBDrr : PDI<0xFA, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
1196 "psubd {$src2, $dst|$dst, $src2}",
1197 [(set VR128:$dst, (v4i32 (sub VR128:$src1, VR128:$src2)))]>;
Evan Cheng506d3df2006-03-29 23:07:14 +00001198def PSUBQrr : PDI<0xFB, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
1199 "psubq {$src2, $dst|$dst, $src2}",
1200 [(set VR128:$dst, (v2i64 (sub VR128:$src1, VR128:$src2)))]>;
Evan Cheng7b1d34b2006-03-25 01:33:37 +00001201
1202def PSUBBrm : PDI<0xF8, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
1203 "psubb {$src2, $dst|$dst, $src2}",
1204 [(set VR128:$dst, (v16i8 (sub VR128:$src1,
1205 (load addr:$src2))))]>;
1206def PSUBWrm : PDI<0xF9, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
1207 "psubw {$src2, $dst|$dst, $src2}",
1208 [(set VR128:$dst, (v8i16 (sub VR128:$src1,
1209 (load addr:$src2))))]>;
1210def PSUBDrm : PDI<0xFA, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
1211 "psubd {$src2, $dst|$dst, $src2}",
1212 [(set VR128:$dst, (v4i32 (sub VR128:$src1,
1213 (load addr:$src2))))]>;
Evan Cheng506d3df2006-03-29 23:07:14 +00001214def PSUBQrm : PDI<0xFB, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
1215 "psubd {$src2, $dst|$dst, $src2}",
1216 [(set VR128:$dst, (v2i64 (sub VR128:$src1,
1217 (load addr:$src2))))]>;
1218}
Evan Chengc60bd972006-03-25 09:37:23 +00001219
Evan Chengff65e382006-04-04 21:49:39 +00001220let isTwoAddress = 1 in {
1221def PSLLDQri : PDIi8<0x73, MRM7r, (ops VR128:$dst, VR128:$src1, i32i8imm:$src2),
1222 "pslldq {$src2, $dst|$dst, $src2}", []>;
1223def PSRLDQri : PDIi8<0x73, MRM7r, (ops VR128:$dst, VR128:$src1, i32i8imm:$src2),
1224 "psrldq {$src2, $dst|$dst, $src2}", []>;
1225}
1226
Evan Cheng506d3df2006-03-29 23:07:14 +00001227// Logical
1228let isTwoAddress = 1 in {
1229let isCommutable = 1 in {
1230def PANDrr : PDI<0xDB, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
1231 "pand {$src2, $dst|$dst, $src2}",
1232 [(set VR128:$dst, (v2i64 (and VR128:$src1, VR128:$src2)))]>;
1233
1234def PANDrm : PDI<0xDB, MRMSrcMem, (ops VR128:$dst, VR128:$src1, i128mem:$src2),
1235 "pand {$src2, $dst|$dst, $src2}",
1236 [(set VR128:$dst, (v2i64 (and VR128:$src1,
1237 (load addr:$src2))))]>;
Evan Chengc6cb5bb2006-04-06 01:49:20 +00001238def PORrr : PDI<0xEB, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
Evan Cheng506d3df2006-03-29 23:07:14 +00001239 "por {$src2, $dst|$dst, $src2}",
1240 [(set VR128:$dst, (v2i64 (or VR128:$src1, VR128:$src2)))]>;
1241
Evan Chengc6cb5bb2006-04-06 01:49:20 +00001242def PORrm : PDI<0xEB, MRMSrcMem, (ops VR128:$dst, VR128:$src1, i128mem:$src2),
Evan Cheng506d3df2006-03-29 23:07:14 +00001243 "por {$src2, $dst|$dst, $src2}",
1244 [(set VR128:$dst, (v2i64 (or VR128:$src1,
1245 (load addr:$src2))))]>;
1246def PXORrr : PDI<0xEF, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
1247 "pxor {$src2, $dst|$dst, $src2}",
1248 [(set VR128:$dst, (v2i64 (xor VR128:$src1, VR128:$src2)))]>;
1249
1250def PXORrm : PDI<0xEF, MRMSrcMem, (ops VR128:$dst, VR128:$src1, i128mem:$src2),
1251 "pxor {$src2, $dst|$dst, $src2}",
1252 [(set VR128:$dst, (v2i64 (xor VR128:$src1,
1253 (load addr:$src2))))]>;
1254}
1255
1256def PANDNrr : PDI<0xDF, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
1257 "pandn {$src2, $dst|$dst, $src2}",
1258 [(set VR128:$dst, (v2i64 (and (vnot VR128:$src1),
1259 VR128:$src2)))]>;
1260
1261def PANDNrm : PDI<0xDF, MRMSrcMem, (ops VR128:$dst, VR128:$src1, i128mem:$src2),
1262 "pandn {$src2, $dst|$dst, $src2}",
1263 [(set VR128:$dst, (v2i64 (and (vnot VR128:$src1),
1264 (load addr:$src2))))]>;
1265}
1266
1267// Pack instructions
1268let isTwoAddress = 1 in {
1269def PACKSSWBrr : PDI<0x63, MRMSrcReg, (ops VR128:$dst, VR128:$src1,
1270 VR128:$src2),
1271 "packsswb {$src2, $dst|$dst, $src2}",
Evan Cheng591f7402006-03-29 23:53:14 +00001272 [(set VR128:$dst, (v8i16 (int_x86_sse2_packsswb_128
1273 VR128:$src1,
1274 VR128:$src2)))]>;
Evan Cheng506d3df2006-03-29 23:07:14 +00001275def PACKSSWBrm : PDI<0x63, MRMSrcMem, (ops VR128:$dst, VR128:$src1,
1276 i128mem:$src2),
1277 "packsswb {$src2, $dst|$dst, $src2}",
Evan Cheng591f7402006-03-29 23:53:14 +00001278 [(set VR128:$dst, (v8i16 (int_x86_sse2_packsswb_128
1279 VR128:$src1,
1280 (bc_v8i16 (loadv2f64 addr:$src2)))))]>;
Evan Cheng506d3df2006-03-29 23:07:14 +00001281def PACKSSDWrr : PDI<0x6B, MRMSrcReg, (ops VR128:$dst, VR128:$src1,
1282 VR128:$src2),
Evan Cheng591f7402006-03-29 23:53:14 +00001283 "packssdw {$src2, $dst|$dst, $src2}",
1284 [(set VR128:$dst, (v4i32 (int_x86_sse2_packssdw_128
1285 VR128:$src1,
1286 VR128:$src2)))]>;
Evan Cheng506d3df2006-03-29 23:07:14 +00001287def PACKSSDWrm : PDI<0x6B, MRMSrcReg, (ops VR128:$dst, VR128:$src1,
1288 i128mem:$src2),
Evan Cheng591f7402006-03-29 23:53:14 +00001289 "packssdw {$src2, $dst|$dst, $src2}",
1290 [(set VR128:$dst, (v4i32 (int_x86_sse2_packssdw_128
1291 VR128:$src1,
1292 (bc_v4i32 (loadv2i64 addr:$src2)))))]>;
Evan Cheng506d3df2006-03-29 23:07:14 +00001293def PACKUSWBrr : PDI<0x67, MRMSrcReg, (ops VR128:$dst, VR128:$src1,
1294 VR128:$src2),
1295 "packuswb {$src2, $dst|$dst, $src2}",
Evan Cheng591f7402006-03-29 23:53:14 +00001296 [(set VR128:$dst, (v8i16 (int_x86_sse2_packuswb_128
1297 VR128:$src1,
1298 VR128:$src2)))]>;
Evan Cheng506d3df2006-03-29 23:07:14 +00001299def PACKUSWBrm : PDI<0x67, MRMSrcReg, (ops VR128:$dst, VR128:$src1,
1300 i128mem:$src2),
1301 "packuswb {$src2, $dst|$dst, $src2}",
Evan Cheng591f7402006-03-29 23:53:14 +00001302 [(set VR128:$dst, (v8i16 (int_x86_sse2_packuswb_128
1303 VR128:$src1,
1304 (bc_v8i16 (loadv2i64 addr:$src2)))))]>;
Evan Cheng506d3df2006-03-29 23:07:14 +00001305}
1306
1307// Shuffle and unpack instructions
Evan Cheng8703be42006-04-04 19:12:30 +00001308def PSHUFWri : PSIi8<0x70, MRMSrcReg,
Evan Cheng506d3df2006-03-29 23:07:14 +00001309 (ops VR64:$dst, VR64:$src1, i8imm:$src2),
1310 "pshufw {$src2, $src1, $dst|$dst, $src1, $src2}", []>;
Evan Cheng8703be42006-04-04 19:12:30 +00001311def PSHUFWmi : PSIi8<0x70, MRMSrcMem,
Evan Cheng506d3df2006-03-29 23:07:14 +00001312 (ops VR64:$dst, i64mem:$src1, i8imm:$src2),
1313 "pshufw {$src2, $src1, $dst|$dst, $src1, $src2}", []>;
1314
Evan Cheng8703be42006-04-04 19:12:30 +00001315def PSHUFDri : PDIi8<0x70, MRMSrcReg,
Evan Cheng506d3df2006-03-29 23:07:14 +00001316 (ops VR128:$dst, VR128:$src1, i8imm:$src2),
1317 "pshufd {$src2, $src1, $dst|$dst, $src1, $src2}",
1318 [(set VR128:$dst, (v4i32 (vector_shuffle
1319 VR128:$src1, (undef),
1320 PSHUFD_shuffle_mask:$src2)))]>;
Evan Cheng8703be42006-04-04 19:12:30 +00001321def PSHUFDmi : PDIi8<0x70, MRMSrcMem,
Evan Cheng506d3df2006-03-29 23:07:14 +00001322 (ops VR128:$dst, i128mem:$src1, i8imm:$src2),
1323 "pshufd {$src2, $src1, $dst|$dst, $src1, $src2}",
1324 [(set VR128:$dst, (v4i32 (vector_shuffle
1325 (load addr:$src1), (undef),
1326 PSHUFD_shuffle_mask:$src2)))]>;
1327
1328// SSE2 with ImmT == Imm8 and XS prefix.
Evan Cheng8703be42006-04-04 19:12:30 +00001329def PSHUFHWri : Ii8<0x70, MRMSrcReg,
Evan Cheng506d3df2006-03-29 23:07:14 +00001330 (ops VR128:$dst, VR128:$src1, i8imm:$src2),
1331 "pshufhw {$src2, $src1, $dst|$dst, $src1, $src2}",
1332 [(set VR128:$dst, (v8i16 (vector_shuffle
1333 VR128:$src1, (undef),
1334 PSHUFHW_shuffle_mask:$src2)))]>,
1335 XS, Requires<[HasSSE2]>;
Evan Cheng8703be42006-04-04 19:12:30 +00001336def PSHUFHWmi : Ii8<0x70, MRMSrcMem,
Evan Cheng506d3df2006-03-29 23:07:14 +00001337 (ops VR128:$dst, i128mem:$src1, i8imm:$src2),
1338 "pshufhw {$src2, $src1, $dst|$dst, $src1, $src2}",
1339 [(set VR128:$dst, (v8i16 (vector_shuffle
1340 (bc_v8i16 (loadv2i64 addr:$src1)), (undef),
1341 PSHUFHW_shuffle_mask:$src2)))]>,
1342 XS, Requires<[HasSSE2]>;
1343
1344// SSE2 with ImmT == Imm8 and XD prefix.
Evan Cheng8703be42006-04-04 19:12:30 +00001345def PSHUFLWri : Ii8<0x70, MRMSrcReg,
Evan Cheng506d3df2006-03-29 23:07:14 +00001346 (ops VR128:$dst, VR128:$src1, i32i8imm:$src2),
Evan Cheng7d9061e2006-03-30 19:54:57 +00001347 "pshuflw {$src2, $src1, $dst|$dst, $src1, $src2}",
Evan Cheng506d3df2006-03-29 23:07:14 +00001348 [(set VR128:$dst, (v8i16 (vector_shuffle
1349 VR128:$src1, (undef),
1350 PSHUFLW_shuffle_mask:$src2)))]>,
1351 XD, Requires<[HasSSE2]>;
Evan Cheng8703be42006-04-04 19:12:30 +00001352def PSHUFLWmi : Ii8<0x70, MRMSrcMem,
Evan Cheng506d3df2006-03-29 23:07:14 +00001353 (ops VR128:$dst, i128mem:$src1, i32i8imm:$src2),
Evan Cheng7d9061e2006-03-30 19:54:57 +00001354 "pshuflw {$src2, $src1, $dst|$dst, $src1, $src2}",
Evan Cheng506d3df2006-03-29 23:07:14 +00001355 [(set VR128:$dst, (v8i16 (vector_shuffle
1356 (bc_v8i16 (loadv2i64 addr:$src1)), (undef),
1357 PSHUFLW_shuffle_mask:$src2)))]>,
1358 XD, Requires<[HasSSE2]>;
1359
1360let isTwoAddress = 1 in {
Evan Chengc60bd972006-03-25 09:37:23 +00001361def PUNPCKLBWrr : PDI<0x60, MRMSrcReg,
1362 (ops VR128:$dst, VR128:$src1, VR128:$src2),
1363 "punpcklbw {$src2, $dst|$dst, $src2}",
Evan Cheng0038e592006-03-28 00:39:58 +00001364 [(set VR128:$dst,
1365 (v16i8 (vector_shuffle VR128:$src1, VR128:$src2,
1366 UNPCKL_shuffle_mask)))]>;
Evan Chengc60bd972006-03-25 09:37:23 +00001367def PUNPCKLBWrm : PDI<0x60, MRMSrcMem,
1368 (ops VR128:$dst, VR128:$src1, i128mem:$src2),
1369 "punpcklbw {$src2, $dst|$dst, $src2}",
Evan Cheng0038e592006-03-28 00:39:58 +00001370 [(set VR128:$dst,
1371 (v16i8 (vector_shuffle VR128:$src1, (load addr:$src2),
1372 UNPCKL_shuffle_mask)))]>;
Evan Chengc60bd972006-03-25 09:37:23 +00001373def PUNPCKLWDrr : PDI<0x61, MRMSrcReg,
1374 (ops VR128:$dst, VR128:$src1, VR128:$src2),
1375 "punpcklwd {$src2, $dst|$dst, $src2}",
Evan Cheng0038e592006-03-28 00:39:58 +00001376 [(set VR128:$dst,
1377 (v8i16 (vector_shuffle VR128:$src1, VR128:$src2,
1378 UNPCKL_shuffle_mask)))]>;
Evan Chengc60bd972006-03-25 09:37:23 +00001379def PUNPCKLWDrm : PDI<0x61, MRMSrcMem,
1380 (ops VR128:$dst, VR128:$src1, i128mem:$src2),
1381 "punpcklwd {$src2, $dst|$dst, $src2}",
Evan Cheng0038e592006-03-28 00:39:58 +00001382 [(set VR128:$dst,
1383 (v8i16 (vector_shuffle VR128:$src1, (load addr:$src2),
1384 UNPCKL_shuffle_mask)))]>;
Evan Chengc60bd972006-03-25 09:37:23 +00001385def PUNPCKLDQrr : PDI<0x62, MRMSrcReg,
1386 (ops VR128:$dst, VR128:$src1, VR128:$src2),
1387 "punpckldq {$src2, $dst|$dst, $src2}",
Evan Cheng0038e592006-03-28 00:39:58 +00001388 [(set VR128:$dst,
1389 (v4i32 (vector_shuffle VR128:$src1, VR128:$src2,
1390 UNPCKL_shuffle_mask)))]>;
Evan Chengc60bd972006-03-25 09:37:23 +00001391def PUNPCKLDQrm : PDI<0x62, MRMSrcMem,
1392 (ops VR128:$dst, VR128:$src1, i128mem:$src2),
1393 "punpckldq {$src2, $dst|$dst, $src2}",
Evan Cheng0038e592006-03-28 00:39:58 +00001394 [(set VR128:$dst,
1395 (v4i32 (vector_shuffle VR128:$src1, (load addr:$src2),
1396 UNPCKL_shuffle_mask)))]>;
Evan Chengc60bd972006-03-25 09:37:23 +00001397def PUNPCKLQDQrr : PDI<0x6C, MRMSrcReg,
1398 (ops VR128:$dst, VR128:$src1, VR128:$src2),
Evan Cheng4fcb9222006-03-28 02:43:26 +00001399 "punpcklqdq {$src2, $dst|$dst, $src2}",
1400 [(set VR128:$dst,
1401 (v2i64 (vector_shuffle VR128:$src1, VR128:$src2,
1402 UNPCKL_shuffle_mask)))]>;
Evan Chengc60bd972006-03-25 09:37:23 +00001403def PUNPCKLQDQrm : PDI<0x6C, MRMSrcMem,
1404 (ops VR128:$dst, VR128:$src1, i128mem:$src2),
Evan Cheng4fcb9222006-03-28 02:43:26 +00001405 "punpcklqdq {$src2, $dst|$dst, $src2}",
1406 [(set VR128:$dst,
1407 (v2i64 (vector_shuffle VR128:$src1, (load addr:$src2),
1408 UNPCKL_shuffle_mask)))]>;
Evan Chengc60bd972006-03-25 09:37:23 +00001409
1410def PUNPCKHBWrr : PDI<0x68, MRMSrcReg,
1411 (ops VR128:$dst, VR128:$src1, VR128:$src2),
Evan Cheng4fcb9222006-03-28 02:43:26 +00001412 "punpckhbw {$src2, $dst|$dst, $src2}",
1413 [(set VR128:$dst,
1414 (v16i8 (vector_shuffle VR128:$src1, VR128:$src2,
1415 UNPCKH_shuffle_mask)))]>;
Evan Chengc60bd972006-03-25 09:37:23 +00001416def PUNPCKHBWrm : PDI<0x68, MRMSrcMem,
1417 (ops VR128:$dst, VR128:$src1, i128mem:$src2),
Evan Cheng4fcb9222006-03-28 02:43:26 +00001418 "punpckhbw {$src2, $dst|$dst, $src2}",
1419 [(set VR128:$dst,
1420 (v16i8 (vector_shuffle VR128:$src1, (load addr:$src2),
1421 UNPCKH_shuffle_mask)))]>;
Evan Chengc60bd972006-03-25 09:37:23 +00001422def PUNPCKHWDrr : PDI<0x69, MRMSrcReg,
1423 (ops VR128:$dst, VR128:$src1, VR128:$src2),
Evan Cheng4fcb9222006-03-28 02:43:26 +00001424 "punpckhwd {$src2, $dst|$dst, $src2}",
1425 [(set VR128:$dst,
1426 (v8i16 (vector_shuffle VR128:$src1, VR128:$src2,
1427 UNPCKH_shuffle_mask)))]>;
Evan Chengc60bd972006-03-25 09:37:23 +00001428def PUNPCKHWDrm : PDI<0x69, MRMSrcMem,
1429 (ops VR128:$dst, VR128:$src1, i128mem:$src2),
Evan Cheng4fcb9222006-03-28 02:43:26 +00001430 "punpckhwd {$src2, $dst|$dst, $src2}",
1431 [(set VR128:$dst,
1432 (v8i16 (vector_shuffle VR128:$src1, (load addr:$src2),
1433 UNPCKH_shuffle_mask)))]>;
Evan Chengc60bd972006-03-25 09:37:23 +00001434def PUNPCKHDQrr : PDI<0x6A, MRMSrcReg,
1435 (ops VR128:$dst, VR128:$src1, VR128:$src2),
Evan Cheng4fcb9222006-03-28 02:43:26 +00001436 "punpckhdq {$src2, $dst|$dst, $src2}",
1437 [(set VR128:$dst,
1438 (v4i32 (vector_shuffle VR128:$src1, VR128:$src2,
1439 UNPCKH_shuffle_mask)))]>;
Evan Chengc60bd972006-03-25 09:37:23 +00001440def PUNPCKHDQrm : PDI<0x6A, MRMSrcMem,
1441 (ops VR128:$dst, VR128:$src1, i128mem:$src2),
Evan Cheng4fcb9222006-03-28 02:43:26 +00001442 "punpckhdq {$src2, $dst|$dst, $src2}",
1443 [(set VR128:$dst,
1444 (v4i32 (vector_shuffle VR128:$src1, (load addr:$src2),
1445 UNPCKH_shuffle_mask)))]>;
Evan Chengc60bd972006-03-25 09:37:23 +00001446def PUNPCKHQDQrr : PDI<0x6D, MRMSrcReg,
1447 (ops VR128:$dst, VR128:$src1, VR128:$src2),
Evan Cheng4fcb9222006-03-28 02:43:26 +00001448 "punpckhdq {$src2, $dst|$dst, $src2}",
1449 [(set VR128:$dst,
1450 (v2i64 (vector_shuffle VR128:$src1, VR128:$src2,
1451 UNPCKH_shuffle_mask)))]>;
Evan Chengc60bd972006-03-25 09:37:23 +00001452def PUNPCKHQDQrm : PDI<0x6D, MRMSrcMem,
1453 (ops VR128:$dst, VR128:$src1, i128mem:$src2),
Evan Cheng4fcb9222006-03-28 02:43:26 +00001454 "punpckhqdq {$src2, $dst|$dst, $src2}",
1455 [(set VR128:$dst,
1456 (v2i64 (vector_shuffle VR128:$src1, (load addr:$src2),
1457 UNPCKH_shuffle_mask)))]>;
Evan Chenga971f6f2006-03-23 01:57:24 +00001458}
Evan Cheng82521dd2006-03-21 07:09:35 +00001459
Evan Chengb067a1e2006-03-31 19:22:53 +00001460// Extract / Insert
Evan Cheng8703be42006-04-04 19:12:30 +00001461def PEXTRWr : PDIi8<0xC5, MRMSrcReg,
1462 (ops R32:$dst, VR128:$src1, i32i8imm:$src2),
1463 "pextrw {$src2, $src1, $dst|$dst, $src1, $src2}",
1464 [(set R32:$dst, (X86pextrw (v8i16 VR128:$src1),
1465 (i32 imm:$src2)))]>;
1466def PEXTRWm : PDIi8<0xC5, MRMSrcMem,
1467 (ops R32:$dst, i128mem:$src1, i32i8imm:$src2),
1468 "pextrw {$src2, $src1, $dst|$dst, $src1, $src2}",
1469 [(set R32:$dst, (X86pextrw (loadv8i16 addr:$src1),
1470 (i32 imm:$src2)))]>;
Evan Chengb067a1e2006-03-31 19:22:53 +00001471
1472let isTwoAddress = 1 in {
Evan Cheng8703be42006-04-04 19:12:30 +00001473def PINSRWr : PDIi8<0xC4, MRMSrcReg,
Evan Chengb067a1e2006-03-31 19:22:53 +00001474 (ops VR128:$dst, VR128:$src1, R32:$src2, i32i8imm:$src3),
1475 "pinsrw {$src3, $src2, $dst|$dst, $src2, $src3}",
Evan Cheng653159f2006-03-31 21:55:24 +00001476 [(set VR128:$dst, (v8i16 (X86pinsrw (v8i16 VR128:$src1),
1477 R32:$src2, (i32 imm:$src3))))]>;
Evan Cheng8703be42006-04-04 19:12:30 +00001478def PINSRWm : PDIi8<0xC4, MRMSrcMem,
Evan Chengb067a1e2006-03-31 19:22:53 +00001479 (ops VR128:$dst, VR128:$src1, i16mem:$src2, i32i8imm:$src3),
1480 "pinsrw {$src3, $src2, $dst|$dst, $src2, $src3}",
1481 [(set VR128:$dst,
Evan Cheng653159f2006-03-31 21:55:24 +00001482 (v8i16 (X86pinsrw (v8i16 VR128:$src1),
Evan Chengb067a1e2006-03-31 19:22:53 +00001483 (i32 (anyext (loadi16 addr:$src2))),
1484 (i32 imm:$src3))))]>;
1485}
1486
Evan Cheng82521dd2006-03-21 07:09:35 +00001487//===----------------------------------------------------------------------===//
Evan Chengc653d482006-03-24 22:28:37 +00001488// Miscellaneous Instructions
1489//===----------------------------------------------------------------------===//
1490
Evan Chengc5fb2b12006-03-30 00:33:26 +00001491// Mask creation
1492def MOVMSKPSrr : PSI<0x50, MRMSrcReg, (ops R32:$dst, VR128:$src),
1493 "movmskps {$src, $dst|$dst, $src}",
1494 [(set R32:$dst, (int_x86_sse_movmsk_ps VR128:$src))]>;
1495def MOVMSKPDrr : PSI<0x50, MRMSrcReg, (ops R32:$dst, VR128:$src),
1496 "movmskpd {$src, $dst|$dst, $src}",
1497 [(set R32:$dst, (int_x86_sse2_movmskpd VR128:$src))]>;
1498
1499def PMOVMSKBrr : PDI<0xD7, MRMSrcReg, (ops R32:$dst, VR128:$src),
1500 "pmovmskb {$src, $dst|$dst, $src}",
1501 [(set R32:$dst, (int_x86_sse2_pmovmskb_128 VR128:$src))]>;
1502
Evan Chengecac9cb2006-03-25 06:03:26 +00001503// Prefetching loads
1504def PREFETCHT0 : I<0x18, MRM1m, (ops i8mem:$src),
1505 "prefetcht0 $src", []>, TB,
1506 Requires<[HasSSE1]>;
1507def PREFETCHT1 : I<0x18, MRM2m, (ops i8mem:$src),
1508 "prefetcht0 $src", []>, TB,
1509 Requires<[HasSSE1]>;
1510def PREFETCHT2 : I<0x18, MRM3m, (ops i8mem:$src),
1511 "prefetcht0 $src", []>, TB,
1512 Requires<[HasSSE1]>;
1513def PREFETCHTNTA : I<0x18, MRM0m, (ops i8mem:$src),
1514 "prefetcht0 $src", []>, TB,
1515 Requires<[HasSSE1]>;
1516
1517// Non-temporal stores
1518def MOVNTQ : I<0xE7, MRMDestMem, (ops i64mem:$dst, VR64:$src),
1519 "movntq {$src, $dst|$dst, $src}", []>, TB,
1520 Requires<[HasSSE1]>;
1521def MOVNTPS : I<0x2B, MRMDestMem, (ops i128mem:$dst, VR128:$src),
1522 "movntps {$src, $dst|$dst, $src}", []>, TB,
1523 Requires<[HasSSE1]>;
1524def MASKMOVQ : I<0xF7, MRMDestMem, (ops i64mem:$dst, VR64:$src),
1525 "maskmovq {$src, $dst|$dst, $src}", []>, TB,
1526 Requires<[HasSSE1]>;
1527
1528// Store fence
1529def SFENCE : I<0xAE, MRM7m, (ops),
1530 "sfence", []>, TB, Requires<[HasSSE1]>;
1531
1532// Load MXCSR register
Evan Chengc653d482006-03-24 22:28:37 +00001533def LDMXCSR : I<0xAE, MRM2m, (ops i32mem:$src),
1534 "ldmxcsr {$src|$src}", []>, TB, Requires<[HasSSE1]>;
1535
1536//===----------------------------------------------------------------------===//
Evan Cheng82521dd2006-03-21 07:09:35 +00001537// Alias Instructions
1538//===----------------------------------------------------------------------===//
1539
Evan Chengffea91e2006-03-26 09:53:12 +00001540// Alias instructions that map zero vector to pxor / xorp* for sse.
Evan Cheng386031a2006-03-24 07:29:27 +00001541// FIXME: remove when we can teach regalloc that xor reg, reg is ok.
Evan Chengffea91e2006-03-26 09:53:12 +00001542def V_SET0_PI : PDI<0xEF, MRMInitReg, (ops VR128:$dst),
1543 "pxor $dst, $dst",
1544 [(set VR128:$dst, (v2i64 immAllZerosV))]>;
1545def V_SET0_PS : PSI<0x57, MRMInitReg, (ops VR128:$dst),
1546 "xorps $dst, $dst",
1547 [(set VR128:$dst, (v4f32 immAllZerosV))]>;
1548def V_SET0_PD : PDI<0x57, MRMInitReg, (ops VR128:$dst),
1549 "xorpd $dst, $dst",
1550 [(set VR128:$dst, (v2f64 immAllZerosV))]>;
Evan Cheng386031a2006-03-24 07:29:27 +00001551
Evan Chenga0b3afb2006-03-27 07:00:16 +00001552def V_SETALLONES : PDI<0x76, MRMInitReg, (ops VR128:$dst),
1553 "pcmpeqd $dst, $dst",
1554 [(set VR128:$dst, (v2f64 immAllOnesV))]>;
1555
Evan Cheng11e15b32006-04-03 20:53:28 +00001556// FR32 / FR64 to 128-bit vector conversion.
1557def MOVSS2PSrr : SSI<0x10, MRMSrcReg, (ops VR128:$dst, FR32:$src),
1558 "movss {$src, $dst|$dst, $src}",
1559 [(set VR128:$dst,
1560 (v4f32 (scalar_to_vector FR32:$src)))]>;
1561def MOVSS2PSrm : SSI<0x10, MRMSrcMem, (ops VR128:$dst, f32mem:$src),
1562 "movss {$src, $dst|$dst, $src}",
1563 [(set VR128:$dst,
1564 (v4f32 (scalar_to_vector (loadf32 addr:$src))))]>;
1565def MOVSD2PDrr : SDI<0x10, MRMSrcReg, (ops VR128:$dst, FR64:$src),
1566 "movsd {$src, $dst|$dst, $src}",
1567 [(set VR128:$dst,
1568 (v2f64 (scalar_to_vector FR64:$src)))]>;
1569def MOVSD2PDrm : SDI<0x10, MRMSrcMem, (ops VR128:$dst, f64mem:$src),
1570 "movsd {$src, $dst|$dst, $src}",
1571 [(set VR128:$dst,
1572 (v2f64 (scalar_to_vector (loadf64 addr:$src))))]>;
1573
1574def MOVDI2PDIrr : PDI<0x6E, MRMSrcReg, (ops VR128:$dst, R32:$src),
1575 "movd {$src, $dst|$dst, $src}",
1576 [(set VR128:$dst,
1577 (v4i32 (scalar_to_vector R32:$src)))]>;
1578def MOVDI2PDIrm : PDI<0x6E, MRMSrcMem, (ops VR128:$dst, i32mem:$src),
1579 "movd {$src, $dst|$dst, $src}",
1580 [(set VR128:$dst,
1581 (v4i32 (scalar_to_vector (loadi32 addr:$src))))]>;
1582// SSE2 instructions with XS prefix
1583def MOVQI2PQIrr : I<0x7E, MRMSrcReg, (ops VR128:$dst, VR64:$src),
1584 "movq {$src, $dst|$dst, $src}",
1585 [(set VR128:$dst,
1586 (v2i64 (scalar_to_vector VR64:$src)))]>, XS,
1587 Requires<[HasSSE2]>;
1588def MOVQI2PQIrm : I<0x7E, MRMSrcMem, (ops VR128:$dst, i64mem:$src),
1589 "movq {$src, $dst|$dst, $src}",
1590 [(set VR128:$dst,
1591 (v2i64 (scalar_to_vector (loadi64 addr:$src))))]>, XS,
1592 Requires<[HasSSE2]>;
1593// FIXME: may not be able to eliminate this movss with coalescing the src and
1594// dest register classes are different. We really want to write this pattern
1595// like this:
1596// def : Pat<(f32 (vector_extract (v4f32 VR128:$src), (i32 0))),
1597// (f32 FR32:$src)>;
1598def MOVPS2SSrr : SSI<0x10, MRMSrcReg, (ops FR32:$dst, VR128:$src),
1599 "movss {$src, $dst|$dst, $src}",
1600 [(set FR32:$dst, (vector_extract (v4f32 VR128:$src),
1601 (i32 0)))]>;
Evan Cheng85c09652006-04-06 23:53:29 +00001602def MOVPS2SSmr : SSI<0x11, MRMDestMem, (ops f32mem:$dst, VR128:$src),
Evan Cheng11e15b32006-04-03 20:53:28 +00001603 "movss {$src, $dst|$dst, $src}",
1604 [(store (f32 (vector_extract (v4f32 VR128:$src),
1605 (i32 0))), addr:$dst)]>;
1606def MOVPD2SDrr : SDI<0x10, MRMSrcReg, (ops FR64:$dst, VR128:$src),
1607 "movsd {$src, $dst|$dst, $src}",
1608 [(set FR64:$dst, (vector_extract (v2f64 VR128:$src),
1609 (i32 0)))]>;
Evan Cheng85c09652006-04-06 23:53:29 +00001610def MOVPDI2DIrr : PDI<0x6E, MRMSrcReg, (ops R32:$dst, VR128:$src),
Evan Cheng11e15b32006-04-03 20:53:28 +00001611 "movd {$src, $dst|$dst, $src}",
1612 [(set R32:$dst, (vector_extract (v4i32 VR128:$src),
1613 (i32 0)))]>;
1614def MOVPDI2DImr : PDI<0x7E, MRMDestMem, (ops i32mem:$dst, VR128:$src),
1615 "movd {$src, $dst|$dst, $src}",
1616 [(store (i32 (vector_extract (v4i32 VR128:$src),
1617 (i32 0))), addr:$dst)]>;
1618
1619// Move to lower bits of a VR128, leaving upper bits alone.
Evan Chengbc4832b2006-03-24 23:15:12 +00001620// Three operand (but two address) aliases.
1621let isTwoAddress = 1 in {
Evan Cheng11e15b32006-04-03 20:53:28 +00001622def MOVLSS2PSrr : SSI<0x10, MRMSrcReg, (ops VR128:$dst, VR128:$src1, FR32:$src2),
Evan Chengbc4832b2006-03-24 23:15:12 +00001623 "movss {$src2, $dst|$dst, $src2}", []>;
Evan Cheng11e15b32006-04-03 20:53:28 +00001624def MOVLSD2PDrr : SDI<0x10, MRMSrcReg, (ops VR128:$dst, VR128:$src1, FR64:$src2),
Evan Chengbc4832b2006-03-24 23:15:12 +00001625 "movsd {$src2, $dst|$dst, $src2}", []>;
Evan Cheng11e15b32006-04-03 20:53:28 +00001626def MOVLDI2PDIrr : PDI<0x6E, MRMSrcReg, (ops VR128:$dst, VR128:$src1, R32:$src2),
Evan Chengbc4832b2006-03-24 23:15:12 +00001627 "movd {$src2, $dst|$dst, $src2}", []>;
Evan Chengbc4832b2006-03-24 23:15:12 +00001628}
Evan Cheng82521dd2006-03-21 07:09:35 +00001629
Evan Cheng11e15b32006-04-03 20:53:28 +00001630// Move to lower bits of a VR128 and zeroing upper bits.
Evan Chengbc4832b2006-03-24 23:15:12 +00001631// Loading from memory automatically zeroing upper bits.
Evan Cheng11e15b32006-04-03 20:53:28 +00001632def MOVZSS2PSrm : SSI<0x10, MRMSrcMem, (ops VR128:$dst, f32mem:$src),
Evan Chengbc4832b2006-03-24 23:15:12 +00001633 "movss {$src, $dst|$dst, $src}",
Evan Cheng82521dd2006-03-21 07:09:35 +00001634 [(set VR128:$dst,
Evan Chengbc4832b2006-03-24 23:15:12 +00001635 (v4f32 (X86zexts2vec (loadf32 addr:$src))))]>;
Evan Cheng11e15b32006-04-03 20:53:28 +00001636def MOVZSD2PDrm : SDI<0x10, MRMSrcMem, (ops VR128:$dst, f64mem:$src),
Evan Chengbc4832b2006-03-24 23:15:12 +00001637 "movsd {$src, $dst|$dst, $src}",
1638 [(set VR128:$dst,
1639 (v2f64 (X86zexts2vec (loadf64 addr:$src))))]>;
Evan Cheng11e15b32006-04-03 20:53:28 +00001640def MOVZDI2PDIrm : PDI<0x6E, MRMSrcMem, (ops VR128:$dst, i32mem:$src),
1641 "movd {$src, $dst|$dst, $src}",
1642 [(set VR128:$dst,
1643 (v4i32 (X86zexts2vec (loadi32 addr:$src))))]>;
1644def MOVZQI2PQIrm : PDI<0x7E, MRMSrcMem, (ops VR128:$dst, i64mem:$src),
1645 "movd {$src, $dst|$dst, $src}",
1646 [(set VR128:$dst,
1647 (v2i64 (X86zexts2vec (loadi64 addr:$src))))]>;
Evan Cheng48090aa2006-03-21 23:01:21 +00001648
1649//===----------------------------------------------------------------------===//
1650// Non-Instruction Patterns
1651//===----------------------------------------------------------------------===//
1652
1653// 128-bit vector undef's.
1654def : Pat<(v2f64 (undef)), (IMPLICIT_DEF_VR128)>, Requires<[HasSSE2]>;
1655def : Pat<(v16i8 (undef)), (IMPLICIT_DEF_VR128)>, Requires<[HasSSE2]>;
1656def : Pat<(v8i16 (undef)), (IMPLICIT_DEF_VR128)>, Requires<[HasSSE2]>;
1657def : Pat<(v4i32 (undef)), (IMPLICIT_DEF_VR128)>, Requires<[HasSSE2]>;
1658def : Pat<(v2i64 (undef)), (IMPLICIT_DEF_VR128)>, Requires<[HasSSE2]>;
1659
Evan Chengffea91e2006-03-26 09:53:12 +00001660// 128-bit vector all zero's.
1661def : Pat<(v16i8 immAllZerosV), (v16i8 (V_SET0_PI))>, Requires<[HasSSE2]>;
1662def : Pat<(v8i16 immAllZerosV), (v8i16 (V_SET0_PI))>, Requires<[HasSSE2]>;
1663def : Pat<(v4i32 immAllZerosV), (v4i32 (V_SET0_PI))>, Requires<[HasSSE2]>;
1664
Evan Chenga0b3afb2006-03-27 07:00:16 +00001665// 128-bit vector all one's.
1666def : Pat<(v16i8 immAllOnesV), (v16i8 (V_SETALLONES))>, Requires<[HasSSE2]>;
1667def : Pat<(v8i16 immAllOnesV), (v8i16 (V_SETALLONES))>, Requires<[HasSSE2]>;
1668def : Pat<(v4i32 immAllOnesV), (v4i32 (V_SETALLONES))>, Requires<[HasSSE2]>;
1669def : Pat<(v2i64 immAllOnesV), (v2i64 (V_SETALLONES))>, Requires<[HasSSE2]>;
1670def : Pat<(v4f32 immAllOnesV), (v4f32 (V_SETALLONES))>, Requires<[HasSSE1]>;
1671
Evan Chenga971f6f2006-03-23 01:57:24 +00001672// Load 128-bit integer vector values.
Evan Cheng24dc1f52006-03-23 07:44:07 +00001673def : Pat<(v16i8 (load addr:$src)), (MOVDQArm addr:$src)>,
Evan Chengffea91e2006-03-26 09:53:12 +00001674 Requires<[HasSSE2]>;
Evan Cheng24dc1f52006-03-23 07:44:07 +00001675def : Pat<(v8i16 (load addr:$src)), (MOVDQArm addr:$src)>,
Evan Chengffea91e2006-03-26 09:53:12 +00001676 Requires<[HasSSE2]>;
Evan Cheng24dc1f52006-03-23 07:44:07 +00001677def : Pat<(v4i32 (load addr:$src)), (MOVDQArm addr:$src)>,
Evan Chengffea91e2006-03-26 09:53:12 +00001678 Requires<[HasSSE2]>;
Evan Cheng24dc1f52006-03-23 07:44:07 +00001679def : Pat<(v2i64 (load addr:$src)), (MOVDQArm addr:$src)>,
Evan Chengffea91e2006-03-26 09:53:12 +00001680 Requires<[HasSSE2]>;
Evan Chenga971f6f2006-03-23 01:57:24 +00001681
Evan Cheng48090aa2006-03-21 23:01:21 +00001682// Store 128-bit integer vector values.
Evan Cheng24dc1f52006-03-23 07:44:07 +00001683def : Pat<(store (v16i8 VR128:$src), addr:$dst),
Evan Chengffea91e2006-03-26 09:53:12 +00001684 (MOVDQAmr addr:$dst, VR128:$src)>, Requires<[HasSSE2]>;
Evan Cheng24dc1f52006-03-23 07:44:07 +00001685def : Pat<(store (v8i16 VR128:$src), addr:$dst),
Evan Chengffea91e2006-03-26 09:53:12 +00001686 (MOVDQAmr addr:$dst, VR128:$src)>, Requires<[HasSSE2]>;
Evan Cheng24dc1f52006-03-23 07:44:07 +00001687def : Pat<(store (v4i32 VR128:$src), addr:$dst),
Evan Chengffea91e2006-03-26 09:53:12 +00001688 (MOVDQAmr addr:$dst, VR128:$src)>, Requires<[HasSSE2]>;
Evan Cheng24dc1f52006-03-23 07:44:07 +00001689def : Pat<(store (v2i64 VR128:$src), addr:$dst),
1690 (MOVDQAmr addr:$dst, VR128:$src)>, Requires<[HasSSE2]>;
Evan Cheng48090aa2006-03-21 23:01:21 +00001691
1692// Scalar to v8i16 / v16i8. The source may be a R32, but only the lower 8 or
1693// 16-bits matter.
Evan Cheng11e15b32006-04-03 20:53:28 +00001694def : Pat<(v8i16 (X86s2vec R32:$src)), (MOVDI2PDIrr R32:$src)>,
Evan Chengffea91e2006-03-26 09:53:12 +00001695 Requires<[HasSSE2]>;
Evan Cheng11e15b32006-04-03 20:53:28 +00001696def : Pat<(v16i8 (X86s2vec R32:$src)), (MOVDI2PDIrr R32:$src)>,
Evan Chengffea91e2006-03-26 09:53:12 +00001697 Requires<[HasSSE2]>;
Evan Cheng48090aa2006-03-21 23:01:21 +00001698
Evan Cheng2c0dbd02006-03-24 02:58:06 +00001699// bit_convert
Evan Cheng475aecf2006-03-29 03:04:49 +00001700def : Pat<(v2i64 (bitconvert (v4i32 VR128:$src))), (v2i64 VR128:$src)>,
1701 Requires<[HasSSE2]>;
Evan Cheng506d3df2006-03-29 23:07:14 +00001702def : Pat<(v2i64 (bitconvert (v8i16 VR128:$src))), (v2i64 VR128:$src)>,
1703 Requires<[HasSSE2]>;
1704def : Pat<(v2i64 (bitconvert (v16i8 VR128:$src))), (v2i64 VR128:$src)>,
1705 Requires<[HasSSE2]>;
1706def : Pat<(v4i32 (bitconvert (v2i64 VR128:$src))), (v4i32 VR128:$src)>,
1707 Requires<[HasSSE2]>;
1708def : Pat<(v4i32 (bitconvert (v8i16 VR128:$src))), (v4i32 VR128:$src)>,
1709 Requires<[HasSSE2]>;
1710def : Pat<(v4i32 (bitconvert (v16i8 VR128:$src))), (v4i32 VR128:$src)>,
1711 Requires<[HasSSE2]>;
1712def : Pat<(v8i16 (bitconvert (v2i64 VR128:$src))), (v4i32 VR128:$src)>,
1713 Requires<[HasSSE2]>;
1714def : Pat<(v8i16 (bitconvert (v4i32 VR128:$src))), (v4i32 VR128:$src)>,
1715 Requires<[HasSSE2]>;
1716def : Pat<(v8i16 (bitconvert (v16i8 VR128:$src))), (v4i32 VR128:$src)>,
1717 Requires<[HasSSE2]>;
1718def : Pat<(v16i8 (bitconvert (v2i64 VR128:$src))), (v4i32 VR128:$src)>,
1719 Requires<[HasSSE2]>;
1720def : Pat<(v16i8 (bitconvert (v4i32 VR128:$src))), (v4i32 VR128:$src)>,
1721 Requires<[HasSSE2]>;
1722def : Pat<(v16i8 (bitconvert (v8i16 VR128:$src))), (v4i32 VR128:$src)>,
1723 Requires<[HasSSE2]>;
1724
Evan Chengffea91e2006-03-26 09:53:12 +00001725def : Pat<(v4i32 (bitconvert (v4f32 VR128:$src))), (v4i32 VR128:$src)>,
1726 Requires<[HasSSE2]>;
1727def : Pat<(v4f32 (bitconvert (v4i32 VR128:$src))), (v4f32 VR128:$src)>,
1728 Requires<[HasSSE2]>;
Evan Cheng5ced1d82006-04-06 23:23:56 +00001729def : Pat<(v4f32 (bitconvert (v2f64 VR128:$src))), (v4f32 VR128:$src)>,
1730 Requires<[HasSSE2]>;
Evan Chengb9df0ca2006-03-22 02:53:00 +00001731
Evan Chengbc4832b2006-03-24 23:15:12 +00001732// Zeroing a VR128 then do a MOVS* to the lower bits.
1733def : Pat<(v2f64 (X86zexts2vec FR64:$src)),
Evan Cheng11e15b32006-04-03 20:53:28 +00001734 (MOVLSD2PDrr (V_SET0_PD), FR64:$src)>, Requires<[HasSSE2]>;
Evan Chengbc4832b2006-03-24 23:15:12 +00001735def : Pat<(v4f32 (X86zexts2vec FR32:$src)),
Evan Cheng11e15b32006-04-03 20:53:28 +00001736 (MOVLSS2PSrr (V_SET0_PS), FR32:$src)>, Requires<[HasSSE2]>;
Evan Chengbc4832b2006-03-24 23:15:12 +00001737def : Pat<(v4i32 (X86zexts2vec R32:$src)),
Evan Cheng11e15b32006-04-03 20:53:28 +00001738 (MOVLDI2PDIrr (V_SET0_PI), R32:$src)>, Requires<[HasSSE2]>;
Evan Chengbc4832b2006-03-24 23:15:12 +00001739def : Pat<(v8i16 (X86zexts2vec R16:$src)),
Evan Cheng11e15b32006-04-03 20:53:28 +00001740 (MOVLDI2PDIrr (V_SET0_PI), (MOVZX32rr16 R16:$src))>, Requires<[HasSSE2]>;
Evan Chengbc4832b2006-03-24 23:15:12 +00001741def : Pat<(v16i8 (X86zexts2vec R8:$src)),
Evan Cheng11e15b32006-04-03 20:53:28 +00001742 (MOVLDI2PDIrr (V_SET0_PI), (MOVZX32rr8 R8:$src))>, Requires<[HasSSE2]>;
Evan Chengbc4832b2006-03-24 23:15:12 +00001743
Evan Chengb9df0ca2006-03-22 02:53:00 +00001744// Splat v2f64 / v2i64
Evan Cheng691c9232006-03-29 19:02:40 +00001745def : Pat<(vector_shuffle (v2f64 VR128:$src), (undef), SSE_splat_mask:$sm),
1746 (v2f64 (UNPCKLPDrr VR128:$src, VR128:$src))>, Requires<[HasSSE2]>;
1747def : Pat<(vector_shuffle (v2i64 VR128:$src), (undef), SSE_splat_mask:$sm),
Evan Cheng475aecf2006-03-29 03:04:49 +00001748 (v2i64 (PUNPCKLQDQrr VR128:$src, VR128:$src))>, Requires<[HasSSE2]>;
1749
Evan Cheng691c9232006-03-29 19:02:40 +00001750// Splat v4f32
1751def : Pat<(vector_shuffle (v4f32 VR128:$src), (undef), SSE_splat_mask:$sm),
1752 (v4f32 (SHUFPSrr VR128:$src, VR128:$src, SSE_splat_mask:$sm))>,
1753 Requires<[HasSSE1]>;
1754
Evan Cheng7d9061e2006-03-30 19:54:57 +00001755// Shuffle v4i32 with SHUFP* if others do not match.
Evan Cheng475aecf2006-03-29 03:04:49 +00001756def : Pat<(vector_shuffle (v4i32 VR128:$src1), (v4i32 VR128:$src2),
Evan Cheng7d9061e2006-03-30 19:54:57 +00001757 SHUFP_int_shuffle_mask:$sm),
Evan Cheng475aecf2006-03-29 03:04:49 +00001758 (v4i32 (SHUFPSrr VR128:$src1, VR128:$src2,
Evan Cheng7d9061e2006-03-30 19:54:57 +00001759 SHUFP_int_shuffle_mask:$sm))>, Requires<[HasSSE2]>;
Evan Cheng475aecf2006-03-29 03:04:49 +00001760def : Pat<(vector_shuffle (v4i32 VR128:$src1), (load addr:$src2),
Evan Cheng7d9061e2006-03-30 19:54:57 +00001761 SHUFP_int_shuffle_mask:$sm),
Evan Cheng475aecf2006-03-29 03:04:49 +00001762 (v4i32 (SHUFPSrm VR128:$src1, addr:$src2,
Evan Cheng7d9061e2006-03-30 19:54:57 +00001763 SHUFP_int_shuffle_mask:$sm))>, Requires<[HasSSE2]>;
1764
1765// Shuffle v4f32 with PSHUF* if others do not match.
1766def : Pat<(vector_shuffle (v4f32 VR128:$src1), (undef),
1767 PSHUFD_fp_shuffle_mask:$sm),
Evan Cheng8703be42006-04-04 19:12:30 +00001768 (v4f32 (PSHUFDri VR128:$src1, PSHUFD_fp_shuffle_mask:$sm))>,
Evan Cheng7d9061e2006-03-30 19:54:57 +00001769 Requires<[HasSSE2]>;
1770def : Pat<(vector_shuffle (loadv4f32 addr:$src1), (undef),
1771 PSHUFD_fp_shuffle_mask:$sm),
Evan Cheng8703be42006-04-04 19:12:30 +00001772 (v4f32 (PSHUFDmi addr:$src1, PSHUFD_fp_shuffle_mask:$sm))>,
Evan Cheng7d9061e2006-03-30 19:54:57 +00001773 Requires<[HasSSE2]>;
1774def : Pat<(vector_shuffle (v4f32 VR128:$src1), (undef),
1775 PSHUFHW_fp_shuffle_mask:$sm),
Evan Cheng8703be42006-04-04 19:12:30 +00001776 (v4f32 (PSHUFHWri VR128:$src1, PSHUFHW_fp_shuffle_mask:$sm))>,
Evan Cheng7d9061e2006-03-30 19:54:57 +00001777 Requires<[HasSSE2]>;
1778def : Pat<(vector_shuffle (loadv4f32 addr:$src1), (undef),
1779 PSHUFHW_fp_shuffle_mask:$sm),
Evan Cheng8703be42006-04-04 19:12:30 +00001780 (v4f32 (PSHUFHWmi addr:$src1, PSHUFHW_fp_shuffle_mask:$sm))>,
Evan Cheng7d9061e2006-03-30 19:54:57 +00001781 Requires<[HasSSE2]>;
1782def : Pat<(vector_shuffle (v4f32 VR128:$src1), (undef),
1783 PSHUFLW_fp_shuffle_mask:$sm),
Evan Cheng8703be42006-04-04 19:12:30 +00001784 (v4f32 (PSHUFLWri VR128:$src1, PSHUFLW_fp_shuffle_mask:$sm))>,
Evan Cheng7d9061e2006-03-30 19:54:57 +00001785 Requires<[HasSSE2]>;
1786def : Pat<(vector_shuffle (loadv4f32 addr:$src1), (undef),
1787 PSHUFLW_fp_shuffle_mask:$sm),
Evan Cheng8703be42006-04-04 19:12:30 +00001788 (v4f32 (PSHUFLWmi addr:$src1, PSHUFLW_fp_shuffle_mask:$sm))>,
Evan Cheng7d9061e2006-03-30 19:54:57 +00001789 Requires<[HasSSE2]>;
Evan Cheng1b32f222006-03-30 07:33:32 +00001790
Evan Cheng1d5a8cc2006-04-05 07:20:06 +00001791// vector_shuffle v1, <undef>, <0, 0, 1, 1, ...>
1792def : Pat<(v4f32 (vector_shuffle VR128:$src, (undef),
1793 UNPCKL_v_undef_shuffle_mask)),
1794 (UNPCKLPSrr VR128:$src, VR128:$src)>, Requires<[HasSSE2]>;
1795def : Pat<(v16i8 (vector_shuffle VR128:$src, (undef),
1796 UNPCKL_v_undef_shuffle_mask)),
1797 (PUNPCKLBWrr VR128:$src, VR128:$src)>, Requires<[HasSSE2]>;
1798def : Pat<(v8i16 (vector_shuffle VR128:$src, (undef),
1799 UNPCKL_v_undef_shuffle_mask)),
1800 (PUNPCKLWDrr VR128:$src, VR128:$src)>, Requires<[HasSSE2]>;
1801def : Pat<(v4i32 (vector_shuffle VR128:$src, (undef),
1802 UNPCKL_v_undef_shuffle_mask)),
1803 (PUNPCKLDQrr VR128:$src, VR128:$src)>, Requires<[HasSSE1]>;
1804
Evan Chengff65e382006-04-04 21:49:39 +00001805// 128-bit logical shifts
1806def : Pat<(int_x86_sse2_psll_dq VR128:$src1, imm:$src2),
1807 (v2i64 (PSLLDQri VR128:$src1, (PSxLDQ_imm imm:$src2)))>;
1808def : Pat<(int_x86_sse2_psrl_dq VR128:$src1, imm:$src2),
1809 (v2i64 (PSRLDQri VR128:$src1, (PSxLDQ_imm imm:$src2)))>;
1810
Evan Cheng1b32f222006-03-30 07:33:32 +00001811// Logical ops
1812def : Pat<(and (bc_v4i32 (v4f32 VR128:$src1)), (loadv4i32 addr:$src2)),
1813 (ANDPSrm VR128:$src1, addr:$src2)>;
1814def : Pat<(and (bc_v2i64 (v2f64 VR128:$src1)), (loadv2i64 addr:$src2)),
1815 (ANDPDrm VR128:$src1, addr:$src2)>;
1816def : Pat<(or (bc_v4i32 (v4f32 VR128:$src1)), (loadv4i32 addr:$src2)),
1817 (ORPSrm VR128:$src1, addr:$src2)>;
1818def : Pat<(or (bc_v2i64 (v2f64 VR128:$src1)), (loadv2i64 addr:$src2)),
1819 (ORPDrm VR128:$src1, addr:$src2)>;
1820def : Pat<(xor (bc_v4i32 (v4f32 VR128:$src1)), (loadv4i32 addr:$src2)),
1821 (XORPSrm VR128:$src1, addr:$src2)>;
1822def : Pat<(xor (bc_v2i64 (v2f64 VR128:$src1)), (loadv2i64 addr:$src2)),
1823 (XORPDrm VR128:$src1, addr:$src2)>;
1824def : Pat<(and (vnot (bc_v4i32 (v4f32 VR128:$src1))), (loadv4i32 addr:$src2)),
1825 (ANDNPSrm VR128:$src1, addr:$src2)>;
1826def : Pat<(and (vnot (bc_v2i64 (v2f64 VR128:$src1))), (loadv2i64 addr:$src2)),
1827 (ANDNPDrm VR128:$src1, addr:$src2)>;
1828
1829def : Pat<(bc_v4f32 (v4i32 (and VR128:$src1, VR128:$src2))),
1830 (ANDPSrr VR128:$src1, VR128:$src2)>;
1831def : Pat<(bc_v4f32 (v4i32 (or VR128:$src1, VR128:$src2))),
1832 (ORPSrr VR128:$src1, VR128:$src2)>;
1833def : Pat<(bc_v4f32 (v4i32 (xor VR128:$src1, VR128:$src2))),
1834 (XORPSrr VR128:$src1, VR128:$src2)>;
1835def : Pat<(bc_v4f32 (v4i32 (and (vnot VR128:$src1), VR128:$src2))),
1836 (ANDNPSrr VR128:$src1, VR128:$src2)>;
1837
1838def : Pat<(bc_v4f32 (v4i32 (and VR128:$src1, (load addr:$src2)))),
1839 (ANDPSrm (v4i32 VR128:$src1), addr:$src2)>;
1840def : Pat<(bc_v4f32 (v4i32 (or VR128:$src1, (load addr:$src2)))),
1841 (ORPSrm VR128:$src1, addr:$src2)>;
1842def : Pat<(bc_v4f32 (v4i32 (xor VR128:$src1, (load addr:$src2)))),
1843 (XORPSrm VR128:$src1, addr:$src2)>;
1844def : Pat<(bc_v4f32 (v4i32 (and (vnot VR128:$src1), (load addr:$src2)))),
1845 (ANDNPSrm VR128:$src1, addr:$src2)>;
1846
1847def : Pat<(bc_v2f64 (v2i64 (and VR128:$src1, VR128:$src2))),
1848 (ANDPDrr VR128:$src1, VR128:$src2)>;
1849def : Pat<(bc_v2f64 (v2i64 (or VR128:$src1, VR128:$src2))),
1850 (ORPDrr VR128:$src1, VR128:$src2)>;
1851def : Pat<(bc_v2f64 (v2i64 (xor VR128:$src1, VR128:$src2))),
1852 (XORPDrr VR128:$src1, VR128:$src2)>;
1853def : Pat<(bc_v2f64 (v2i64 (and (vnot VR128:$src1), VR128:$src2))),
1854 (ANDNPDrr VR128:$src1, VR128:$src2)>;
1855
1856def : Pat<(bc_v2f64 (v2i64 (and VR128:$src1, (load addr:$src2)))),
1857 (ANDPSrm (v2i64 VR128:$src1), addr:$src2)>;
1858def : Pat<(bc_v2f64 (v2i64 (or VR128:$src1, (load addr:$src2)))),
1859 (ORPSrm VR128:$src1, addr:$src2)>;
1860def : Pat<(bc_v2f64 (v2i64 (xor VR128:$src1, (load addr:$src2)))),
1861 (XORPSrm VR128:$src1, addr:$src2)>;
1862def : Pat<(bc_v2f64 (v2i64 (and (vnot VR128:$src1), (load addr:$src2)))),
1863 (ANDNPSrm VR128:$src1, addr:$src2)>;
1864
1865def : Pat<(v4i32 (and VR128:$src1, VR128:$src2)),
1866 (PANDrr VR128:$src1, VR128:$src2)>;
1867def : Pat<(v8i16 (and VR128:$src1, VR128:$src2)),
1868 (PANDrr VR128:$src1, VR128:$src2)>;
1869def : Pat<(v16i8 (and VR128:$src1, VR128:$src2)),
1870 (PANDrr VR128:$src1, VR128:$src2)>;
1871def : Pat<(v4i32 (or VR128:$src1, VR128:$src2)),
1872 (PORrr VR128:$src1, VR128:$src2)>;
1873def : Pat<(v8i16 (or VR128:$src1, VR128:$src2)),
1874 (PORrr VR128:$src1, VR128:$src2)>;
1875def : Pat<(v16i8 (or VR128:$src1, VR128:$src2)),
1876 (PORrr VR128:$src1, VR128:$src2)>;
1877def : Pat<(v4i32 (xor VR128:$src1, VR128:$src2)),
1878 (PXORrr VR128:$src1, VR128:$src2)>;
1879def : Pat<(v8i16 (xor VR128:$src1, VR128:$src2)),
1880 (PXORrr VR128:$src1, VR128:$src2)>;
1881def : Pat<(v16i8 (xor VR128:$src1, VR128:$src2)),
1882 (PXORrr VR128:$src1, VR128:$src2)>;
1883def : Pat<(v4i32 (and (vnot VR128:$src1), VR128:$src2)),
1884 (PANDNrr VR128:$src1, VR128:$src2)>;
1885def : Pat<(v8i16 (and (vnot VR128:$src1), VR128:$src2)),
1886 (PANDNrr VR128:$src1, VR128:$src2)>;
1887def : Pat<(v16i8 (and (vnot VR128:$src1), VR128:$src2)),
1888 (PANDNrr VR128:$src1, VR128:$src2)>;
1889
1890def : Pat<(v4i32 (and VR128:$src1, (load addr:$src2))),
1891 (PANDrm VR128:$src1, addr:$src2)>;
1892def : Pat<(v8i16 (and VR128:$src1, (load addr:$src2))),
1893 (PANDrm VR128:$src1, addr:$src2)>;
1894def : Pat<(v16i8 (and VR128:$src1, (load addr:$src2))),
1895 (PANDrm VR128:$src1, addr:$src2)>;
1896def : Pat<(v4i32 (or VR128:$src1, (load addr:$src2))),
1897 (PORrm VR128:$src1, addr:$src2)>;
1898def : Pat<(v8i16 (or VR128:$src1, (load addr:$src2))),
1899 (PORrm VR128:$src1, addr:$src2)>;
1900def : Pat<(v16i8 (or VR128:$src1, (load addr:$src2))),
1901 (PORrm VR128:$src1, addr:$src2)>;
1902def : Pat<(v4i32 (xor VR128:$src1, (load addr:$src2))),
1903 (PXORrm VR128:$src1, addr:$src2)>;
1904def : Pat<(v8i16 (xor VR128:$src1, (load addr:$src2))),
1905 (PXORrm VR128:$src1, addr:$src2)>;
1906def : Pat<(v16i8 (xor VR128:$src1, (load addr:$src2))),
1907 (PXORrm VR128:$src1, addr:$src2)>;
1908def : Pat<(v4i32 (and (vnot VR128:$src1), (load addr:$src2))),
1909 (PANDNrm VR128:$src1, addr:$src2)>;
1910def : Pat<(v8i16 (and (vnot VR128:$src1), (load addr:$src2))),
1911 (PANDNrm VR128:$src1, addr:$src2)>;
1912def : Pat<(v16i8 (and (vnot VR128:$src1), (load addr:$src2))),
1913 (PANDNrm VR128:$src1, addr:$src2)>;