blob: 7cd22b35db76f1aef0ad502d177a2be97066d7e6 [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 Chengd9539472006-04-14 21:59:03 +000091def SSE_splat_v2_mask : PatLeaf<(build_vector), [{
92 return X86::isSplatMask(N);
93}]>;
94
Evan Cheng2064a2b2006-03-28 06:50:32 +000095def MOVLHPS_shuffle_mask : PatLeaf<(build_vector), [{
96 return X86::isMOVLHPSMask(N);
97}]>;
98
Evan Cheng2c0dbd02006-03-24 02:58:06 +000099def MOVHLPS_shuffle_mask : PatLeaf<(build_vector), [{
100 return X86::isMOVHLPSMask(N);
Evan Cheng4fcb9222006-03-28 02:43:26 +0000101}]>;
Evan Cheng2c0dbd02006-03-24 02:58:06 +0000102
Evan Cheng5ced1d82006-04-06 23:23:56 +0000103def MOVHP_shuffle_mask : PatLeaf<(build_vector), [{
104 return X86::isMOVHPMask(N);
105}]>;
106
107def MOVLP_shuffle_mask : PatLeaf<(build_vector), [{
108 return X86::isMOVLPMask(N);
109}]>;
110
Evan Chengd6d1cbd2006-04-11 00:19:04 +0000111def MOVS_shuffle_mask : PatLeaf<(build_vector), [{
112 return X86::isMOVSMask(N);
113}]>;
114
Evan Chengd9539472006-04-14 21:59:03 +0000115def MOVSHDUP_shuffle_mask : PatLeaf<(build_vector), [{
116 return X86::isMOVSHDUPMask(N);
117}]>;
118
119def MOVSLDUP_shuffle_mask : PatLeaf<(build_vector), [{
120 return X86::isMOVSLDUPMask(N);
121}]>;
122
Evan Cheng0038e592006-03-28 00:39:58 +0000123def UNPCKL_shuffle_mask : PatLeaf<(build_vector), [{
124 return X86::isUNPCKLMask(N);
125}]>;
126
Evan Cheng4fcb9222006-03-28 02:43:26 +0000127def UNPCKH_shuffle_mask : PatLeaf<(build_vector), [{
128 return X86::isUNPCKHMask(N);
129}]>;
130
Evan Cheng1d5a8cc2006-04-05 07:20:06 +0000131def UNPCKL_v_undef_shuffle_mask : PatLeaf<(build_vector), [{
132 return X86::isUNPCKL_v_undef_Mask(N);
133}]>;
134
Evan Cheng0188ecb2006-03-22 18:59:22 +0000135def PSHUFD_shuffle_mask : PatLeaf<(build_vector), [{
Evan Cheng4f563382006-03-29 01:30:51 +0000136 return X86::isPSHUFDMask(N);
Evan Cheng14aed5e2006-03-24 01:18:28 +0000137}], SHUFFLE_get_shuf_imm>;
Evan Cheng0188ecb2006-03-22 18:59:22 +0000138
Evan Cheng506d3df2006-03-29 23:07:14 +0000139def PSHUFHW_shuffle_mask : PatLeaf<(build_vector), [{
140 return X86::isPSHUFHWMask(N);
141}], SHUFFLE_get_pshufhw_imm>;
142
143def PSHUFLW_shuffle_mask : PatLeaf<(build_vector), [{
144 return X86::isPSHUFLWMask(N);
145}], SHUFFLE_get_pshuflw_imm>;
146
Evan Cheng3d60df42006-04-10 22:35:16 +0000147def SHUFP_unary_shuffle_mask : PatLeaf<(build_vector), [{
148 return X86::isPSHUFDMask(N);
Evan Cheng7d9061e2006-03-30 19:54:57 +0000149}], SHUFFLE_get_shuf_imm>;
150
Evan Cheng14aed5e2006-03-24 01:18:28 +0000151def SHUFP_shuffle_mask : PatLeaf<(build_vector), [{
152 return X86::isSHUFPMask(N);
153}], SHUFFLE_get_shuf_imm>;
Evan Chengb9df0ca2006-03-22 02:53:00 +0000154
Evan Cheng3d60df42006-04-10 22:35:16 +0000155def PSHUFD_binary_shuffle_mask : PatLeaf<(build_vector), [{
156 return 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 Chengd9539472006-04-14 21:59:03 +0000170// S3I - SSE3 instructions with TB and OpSize prefixes.
171// S3SI - SSE3 instructions with XS prefix.
Evan Cheng57ebe9f2006-04-15 05:37:34 +0000172// S3DI - SSE3 instructions with XD prefix.
Evan Cheng470a6ad2006-02-22 02:26:30 +0000173class SSI<bits<8> o, Format F, dag ops, string asm, list<dag> pattern>
174 : I<o, F, ops, asm, pattern>, XS, Requires<[HasSSE1]>;
175class SDI<bits<8> o, Format F, dag ops, string asm, list<dag> pattern>
176 : I<o, F, ops, asm, pattern>, XD, Requires<[HasSSE2]>;
177class PSI<bits<8> o, Format F, dag ops, string asm, list<dag> pattern>
178 : I<o, F, ops, asm, pattern>, TB, Requires<[HasSSE1]>;
179class PDI<bits<8> o, Format F, dag ops, string asm, list<dag> pattern>
180 : I<o, F, ops, asm, pattern>, TB, OpSize, Requires<[HasSSE2]>;
Evan Cheng2da953f2006-03-22 07:10:28 +0000181class PSIi8<bits<8> o, Format F, dag ops, string asm, list<dag> pattern>
182 : X86Inst<o, F, Imm8, ops, asm>, TB, Requires<[HasSSE1]> {
183 let Pattern = pattern;
184}
185class PDIi8<bits<8> o, Format F, dag ops, string asm, list<dag> pattern>
186 : X86Inst<o, F, Imm8, ops, asm>, TB, OpSize, Requires<[HasSSE2]> {
187 let Pattern = pattern;
188}
Evan Cheng4b1734f2006-03-31 21:29:33 +0000189class S3SI<bits<8> o, Format F, dag ops, string asm, list<dag> pattern>
Evan Chengd9539472006-04-14 21:59:03 +0000190 : I<o, F, ops, asm, pattern>, XS, Requires<[HasSSE3]>;
Evan Cheng4b1734f2006-03-31 21:29:33 +0000191class S3DI<bits<8> o, Format F, dag ops, string asm, list<dag> pattern>
Evan Chengd9539472006-04-14 21:59:03 +0000192 : I<o, F, ops, asm, pattern>, XD, Requires<[HasSSE3]>;
193class S3I<bits<8> o, Format F, dag ops, string asm, list<dag> pattern>
Evan Cheng4b1734f2006-03-31 21:29:33 +0000194 : I<o, F, ops, asm, pattern>, TB, OpSize, Requires<[HasSSE3]>;
195
196//===----------------------------------------------------------------------===//
197// Helpers for defining instructions that directly correspond to intrinsics.
Evan Cheng6e967402006-04-04 00:10:53 +0000198class SS_Intr<bits<8> o, string asm, Intrinsic IntId>
199 : SSI<o, MRMSrcReg, (ops VR128:$dst, VR128:$src), asm,
200 [(set VR128:$dst, (v4f32 (IntId VR128:$src)))]>;
201class SS_Intm<bits<8> o, string asm, Intrinsic IntId>
202 : SSI<o, MRMSrcMem, (ops VR128:$dst, f32mem:$src), asm,
203 [(set VR128:$dst, (v4f32 (IntId (load addr:$src))))]>;
204class SD_Intr<bits<8> o, string asm, Intrinsic IntId>
205 : SDI<o, MRMSrcReg, (ops VR128:$dst, VR128:$src), asm,
206 [(set VR128:$dst, (v2f64 (IntId VR128:$src)))]>;
207class SD_Intm<bits<8> o, string asm, Intrinsic IntId>
208 : SDI<o, MRMSrcMem, (ops VR128:$dst, f64mem:$src), asm,
209 [(set VR128:$dst, (v2f64 (IntId (load addr:$src))))]>;
210
211class SS_Intrr<bits<8> o, string asm, Intrinsic IntId>
Evan Cheng97ac5fa2006-04-03 23:49:17 +0000212 : SSI<o, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2), asm,
Evan Cheng6e967402006-04-04 00:10:53 +0000213 [(set VR128:$dst, (v4f32 (IntId VR128:$src1, VR128:$src2)))]>;
214class SS_Intrm<bits<8> o, string asm, Intrinsic IntId>
Evan Cheng97ac5fa2006-04-03 23:49:17 +0000215 : SSI<o, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f32mem:$src2), asm,
Evan Cheng6e967402006-04-04 00:10:53 +0000216 [(set VR128:$dst, (v4f32 (IntId VR128:$src1, (load addr:$src2))))]>;
217class SD_Intrr<bits<8> o, string asm, Intrinsic IntId>
Evan Cheng97ac5fa2006-04-03 23:49:17 +0000218 : SDI<o, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2), asm,
Evan Cheng6e967402006-04-04 00:10:53 +0000219 [(set VR128:$dst, (v2f64 (IntId VR128:$src1, VR128:$src2)))]>;
220class SD_Intrm<bits<8> o, string asm, Intrinsic IntId>
Evan Cheng97ac5fa2006-04-03 23:49:17 +0000221 : SDI<o, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f64mem:$src2), asm,
Evan Cheng6e967402006-04-04 00:10:53 +0000222 [(set VR128:$dst, (v2f64 (IntId VR128:$src1, (load addr:$src2))))]>;
Evan Cheng97ac5fa2006-04-03 23:49:17 +0000223
224class PS_Intr<bits<8> o, string asm, Intrinsic IntId>
225 : PSI<o, MRMSrcReg, (ops VR128:$dst, VR128:$src), asm,
226 [(set VR128:$dst, (IntId VR128:$src))]>;
227class PS_Intm<bits<8> o, string asm, Intrinsic IntId>
228 : PSI<o, MRMSrcMem, (ops VR128:$dst, f32mem:$src), asm,
229 [(set VR128:$dst, (IntId (loadv4f32 addr:$src)))]>;
230class PD_Intr<bits<8> o, string asm, Intrinsic IntId>
231 : PDI<o, MRMSrcReg, (ops VR128:$dst, VR128:$src), asm,
232 [(set VR128:$dst, (IntId VR128:$src))]>;
233class PD_Intm<bits<8> o, string asm, Intrinsic IntId>
234 : PDI<o, MRMSrcMem, (ops VR128:$dst, f64mem:$src), asm,
235 [(set VR128:$dst, (IntId (loadv2f64 addr:$src)))]>;
236
237class PS_Intrr<bits<8> o, string asm, Intrinsic IntId>
238 : PSI<o, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2), asm,
239 [(set VR128:$dst, (IntId VR128:$src1, VR128:$src2))]>;
240class PS_Intrm<bits<8> o, string asm, Intrinsic IntId>
241 : PSI<o, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f32mem:$src2), asm,
242 [(set VR128:$dst, (IntId VR128:$src1, (loadv4f32 addr:$src2)))]>;
243class PD_Intrr<bits<8> o, string asm, Intrinsic IntId>
244 : PDI<o, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2), asm,
245 [(set VR128:$dst, (IntId VR128:$src1, VR128:$src2))]>;
246class PD_Intrm<bits<8> o, string asm, Intrinsic IntId>
247 : PDI<o, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f64mem:$src2), asm,
248 [(set VR128:$dst, (IntId VR128:$src1, (loadv2f64 addr:$src2)))]>;
249
Evan Cheng4b1734f2006-03-31 21:29:33 +0000250class S3D_Intrr<bits<8> o, string asm, Intrinsic IntId>
251 : S3DI<o, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2), asm,
Evan Chengd9539472006-04-14 21:59:03 +0000252 [(set VR128:$dst, (v4f32 (IntId VR128:$src1, VR128:$src2)))]>;
Evan Cheng4b1734f2006-03-31 21:29:33 +0000253class S3D_Intrm<bits<8> o, string asm, Intrinsic IntId>
254 : S3DI<o, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2), asm,
Evan Chengd9539472006-04-14 21:59:03 +0000255 [(set VR128:$dst, (v4f32 (IntId VR128:$src1,
256 (loadv4f32 addr:$src2))))]>;
257class S3_Intrr<bits<8> o, string asm, Intrinsic IntId>
258 : S3I<o, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2), asm,
259 [(set VR128:$dst, (v2f64 (IntId VR128:$src1, VR128:$src2)))]>;
260class S3_Intrm<bits<8> o, string asm, Intrinsic IntId>
261 : S3I<o, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2), asm,
Evan Cheng4b1734f2006-03-31 21:29:33 +0000262 [(set VR128:$dst, (v2f64 (IntId VR128:$src1,
263 (loadv2f64 addr:$src2))))]>;
Evan Cheng470a6ad2006-02-22 02:26:30 +0000264
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000265// Some 'special' instructions
266def IMPLICIT_DEF_FR32 : I<0, Pseudo, (ops FR32:$dst),
267 "#IMPLICIT_DEF $dst",
268 [(set FR32:$dst, (undef))]>, Requires<[HasSSE2]>;
269def IMPLICIT_DEF_FR64 : I<0, Pseudo, (ops FR64:$dst),
270 "#IMPLICIT_DEF $dst",
271 [(set FR64:$dst, (undef))]>, Requires<[HasSSE2]>;
272
273// CMOV* - Used to implement the SSE SELECT DAG operation. Expanded by the
274// scheduler into a branch sequence.
275let usesCustomDAGSchedInserter = 1 in { // Expanded by the scheduler.
276 def CMOV_FR32 : I<0, Pseudo,
277 (ops FR32:$dst, FR32:$t, FR32:$f, i8imm:$cond),
278 "#CMOV_FR32 PSEUDO!",
279 [(set FR32:$dst, (X86cmov FR32:$t, FR32:$f, imm:$cond))]>;
280 def CMOV_FR64 : I<0, Pseudo,
281 (ops FR64:$dst, FR64:$t, FR64:$f, i8imm:$cond),
282 "#CMOV_FR64 PSEUDO!",
283 [(set FR64:$dst, (X86cmov FR64:$t, FR64:$f, imm:$cond))]>;
Evan Chengf7c378e2006-04-10 07:23:14 +0000284 def CMOV_V4F32 : I<0, Pseudo,
285 (ops VR128:$dst, VR128:$t, VR128:$f, i8imm:$cond),
286 "#CMOV_V4F32 PSEUDO!",
287 [(set VR128:$dst,
288 (v4f32 (X86cmov VR128:$t, VR128:$f, imm:$cond)))]>;
289 def CMOV_V2F64 : I<0, Pseudo,
290 (ops VR128:$dst, VR128:$t, VR128:$f, i8imm:$cond),
291 "#CMOV_V2F64 PSEUDO!",
292 [(set VR128:$dst,
293 (v2f64 (X86cmov VR128:$t, VR128:$f, imm:$cond)))]>;
294 def CMOV_V2I64 : I<0, Pseudo,
295 (ops VR128:$dst, VR128:$t, VR128:$f, i8imm:$cond),
296 "#CMOV_V2I64 PSEUDO!",
297 [(set VR128:$dst,
298 (v2i64 (X86cmov VR128:$t, VR128:$f, imm:$cond)))]>;
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000299}
300
301// Move Instructions
Evan Cheng470a6ad2006-02-22 02:26:30 +0000302def MOVSSrr : SSI<0x10, MRMSrcReg, (ops FR32:$dst, FR32:$src),
303 "movss {$src, $dst|$dst, $src}", []>;
304def MOVSSrm : SSI<0x10, MRMSrcMem, (ops FR32:$dst, f32mem:$src),
305 "movss {$src, $dst|$dst, $src}",
306 [(set FR32:$dst, (loadf32 addr:$src))]>;
307def MOVSDrr : SDI<0x10, MRMSrcReg, (ops FR64:$dst, FR64:$src),
308 "movsd {$src, $dst|$dst, $src}", []>;
309def MOVSDrm : SDI<0x10, MRMSrcMem, (ops FR64:$dst, f64mem:$src),
310 "movsd {$src, $dst|$dst, $src}",
311 [(set FR64:$dst, (loadf64 addr:$src))]>;
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000312
Evan Cheng470a6ad2006-02-22 02:26:30 +0000313def MOVSSmr : SSI<0x11, MRMDestMem, (ops f32mem:$dst, FR32:$src),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000314 "movss {$src, $dst|$dst, $src}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000315 [(store FR32:$src, addr:$dst)]>;
316def MOVSDmr : SDI<0x11, MRMDestMem, (ops f64mem:$dst, FR64:$src),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000317 "movsd {$src, $dst|$dst, $src}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000318 [(store FR64:$src, addr:$dst)]>;
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000319
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000320// Arithmetic instructions
321let isTwoAddress = 1 in {
322let isCommutable = 1 in {
Evan Cheng470a6ad2006-02-22 02:26:30 +0000323def ADDSSrr : SSI<0x58, MRMSrcReg, (ops FR32:$dst, FR32:$src1, FR32:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000324 "addss {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000325 [(set FR32:$dst, (fadd FR32:$src1, FR32:$src2))]>;
326def ADDSDrr : SDI<0x58, MRMSrcReg, (ops FR64:$dst, FR64:$src1, FR64:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000327 "addsd {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000328 [(set FR64:$dst, (fadd FR64:$src1, FR64:$src2))]>;
329def MULSSrr : SSI<0x59, MRMSrcReg, (ops FR32:$dst, FR32:$src1, FR32:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000330 "mulss {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000331 [(set FR32:$dst, (fmul FR32:$src1, FR32:$src2))]>;
332def MULSDrr : SDI<0x59, MRMSrcReg, (ops FR64:$dst, FR64:$src1, FR64:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000333 "mulsd {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000334 [(set FR64:$dst, (fmul FR64:$src1, FR64:$src2))]>;
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000335}
336
Evan Cheng470a6ad2006-02-22 02:26:30 +0000337def ADDSSrm : SSI<0x58, MRMSrcMem, (ops FR32:$dst, FR32:$src1, f32mem:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000338 "addss {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000339 [(set FR32:$dst, (fadd FR32:$src1, (loadf32 addr:$src2)))]>;
340def ADDSDrm : SDI<0x58, MRMSrcMem, (ops FR64:$dst, FR64:$src1, f64mem:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000341 "addsd {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000342 [(set FR64:$dst, (fadd FR64:$src1, (loadf64 addr:$src2)))]>;
343def MULSSrm : SSI<0x59, MRMSrcMem, (ops FR32:$dst, FR32:$src1, f32mem:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000344 "mulss {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000345 [(set FR32:$dst, (fmul FR32:$src1, (loadf32 addr:$src2)))]>;
346def MULSDrm : SDI<0x59, MRMSrcMem, (ops FR64:$dst, FR64:$src1, f64mem:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000347 "mulsd {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000348 [(set FR64:$dst, (fmul FR64:$src1, (loadf64 addr:$src2)))]>;
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000349
Evan Cheng470a6ad2006-02-22 02:26:30 +0000350def DIVSSrr : SSI<0x5E, MRMSrcReg, (ops FR32:$dst, FR32:$src1, FR32:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000351 "divss {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000352 [(set FR32:$dst, (fdiv FR32:$src1, FR32:$src2))]>;
353def DIVSSrm : SSI<0x5E, MRMSrcMem, (ops FR32:$dst, FR32:$src1, f32mem:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000354 "divss {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000355 [(set FR32:$dst, (fdiv FR32:$src1, (loadf32 addr:$src2)))]>;
356def DIVSDrr : SDI<0x5E, MRMSrcReg, (ops FR64:$dst, FR64:$src1, FR64:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000357 "divsd {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000358 [(set FR64:$dst, (fdiv FR64:$src1, FR64:$src2))]>;
359def DIVSDrm : SDI<0x5E, MRMSrcMem, (ops FR64:$dst, FR64:$src1, f64mem:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000360 "divsd {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000361 [(set FR64:$dst, (fdiv FR64:$src1, (loadf64 addr:$src2)))]>;
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000362
Evan Cheng470a6ad2006-02-22 02:26:30 +0000363def SUBSSrr : SSI<0x5C, MRMSrcReg, (ops FR32:$dst, FR32:$src1, FR32:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000364 "subss {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000365 [(set FR32:$dst, (fsub FR32:$src1, FR32:$src2))]>;
366def SUBSSrm : SSI<0x5C, MRMSrcMem, (ops FR32:$dst, FR32:$src1, f32mem:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000367 "subss {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000368 [(set FR32:$dst, (fsub FR32:$src1, (loadf32 addr:$src2)))]>;
369def SUBSDrr : SDI<0x5C, MRMSrcReg, (ops FR64:$dst, FR64:$src1, FR64:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000370 "subsd {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000371 [(set FR64:$dst, (fsub FR64:$src1, FR64:$src2))]>;
372def SUBSDrm : SDI<0x5C, MRMSrcMem, (ops FR64:$dst, FR64:$src1, f64mem:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000373 "subsd {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000374 [(set FR64:$dst, (fsub FR64:$src1, (loadf64 addr:$src2)))]>;
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000375}
376
Evan Cheng8703be42006-04-04 19:12:30 +0000377def SQRTSSr : SSI<0x51, MRMSrcReg, (ops FR32:$dst, FR32:$src),
378 "sqrtss {$src, $dst|$dst, $src}",
379 [(set FR32:$dst, (fsqrt FR32:$src))]>;
380def SQRTSSm : SSI<0x51, MRMSrcMem, (ops FR32:$dst, f32mem:$src),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000381 "sqrtss {$src, $dst|$dst, $src}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000382 [(set FR32:$dst, (fsqrt (loadf32 addr:$src)))]>;
Evan Cheng8703be42006-04-04 19:12:30 +0000383def SQRTSDr : SDI<0x51, MRMSrcReg, (ops FR64:$dst, FR64:$src),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000384 "sqrtsd {$src, $dst|$dst, $src}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000385 [(set FR64:$dst, (fsqrt FR64:$src))]>;
Evan Cheng8703be42006-04-04 19:12:30 +0000386def SQRTSDm : SDI<0x51, MRMSrcMem, (ops FR64:$dst, f64mem:$src),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000387 "sqrtsd {$src, $dst|$dst, $src}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000388 [(set FR64:$dst, (fsqrt (loadf64 addr:$src)))]>;
389
Evan Cheng8703be42006-04-04 19:12:30 +0000390def RSQRTSSr : SSI<0x52, MRMSrcReg, (ops FR32:$dst, FR32:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000391 "rsqrtss {$src, $dst|$dst, $src}", []>;
Evan Cheng8703be42006-04-04 19:12:30 +0000392def RSQRTSSm : SSI<0x52, MRMSrcMem, (ops FR32:$dst, f32mem:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000393 "rsqrtss {$src, $dst|$dst, $src}", []>;
Evan Cheng8703be42006-04-04 19:12:30 +0000394def RCPSSr : SSI<0x53, MRMSrcReg, (ops FR32:$dst, FR32:$src),
395 "rcpss {$src, $dst|$dst, $src}", []>;
396def RCPSSm : SSI<0x53, MRMSrcMem, (ops FR32:$dst, f32mem:$src),
397 "rcpss {$src, $dst|$dst, $src}", []>;
Evan Cheng470a6ad2006-02-22 02:26:30 +0000398
Evan Cheng8703be42006-04-04 19:12:30 +0000399let isTwoAddress = 1 in {
400def MAXSSrr : SSI<0x5F, MRMSrcReg, (ops FR32:$dst, FR32:$src1, FR32:$src2),
401 "maxss {$src2, $dst|$dst, $src2}", []>;
402def MAXSSrm : SSI<0x5F, MRMSrcMem, (ops FR32:$dst, FR32:$src1, f32mem:$src2),
403 "maxss {$src2, $dst|$dst, $src2}", []>;
404def MAXSDrr : SDI<0x5F, MRMSrcReg, (ops FR64:$dst, FR32:$src1, FR64:$src2),
405 "maxsd {$src2, $dst|$dst, $src2}", []>;
406def MAXSDrm : SDI<0x5F, MRMSrcMem, (ops FR64:$dst, FR32:$src1, f64mem:$src2),
407 "maxsd {$src2, $dst|$dst, $src2}", []>;
408def MINSSrr : SSI<0x5D, MRMSrcReg, (ops FR32:$dst, FR32:$src1, FR32:$src2),
409 "minss {$src2, $dst|$dst, $src2}", []>;
410def MINSSrm : SSI<0x5D, MRMSrcMem, (ops FR32:$dst, FR32:$src1, f32mem:$src2),
411 "minss {$src2, $dst|$dst, $src2}", []>;
412def MINSDrr : SDI<0x5D, MRMSrcReg, (ops FR64:$dst, FR32:$src1, FR64:$src2),
413 "minsd {$src2, $dst|$dst, $src2}", []>;
414def MINSDrm : SDI<0x5D, MRMSrcMem, (ops FR64:$dst, FR32:$src1, f64mem:$src2),
415 "minsd {$src2, $dst|$dst, $src2}", []>;
416}
Evan Chengc46349d2006-03-28 23:51:43 +0000417
418// Aliases to match intrinsics which expect XMM operand(s).
419let isTwoAddress = 1 in {
420let isCommutable = 1 in {
Evan Cheng6e967402006-04-04 00:10:53 +0000421def Int_ADDSSrr : SS_Intrr<0x58, "addss {$src2, $dst|$dst, $src2}",
422 int_x86_sse_add_ss>;
423def Int_ADDSDrr : SD_Intrr<0x58, "addsd {$src2, $dst|$dst, $src2}",
424 int_x86_sse2_add_sd>;
425def Int_MULSSrr : SS_Intrr<0x59, "mulss {$src2, $dst|$dst, $src2}",
426 int_x86_sse_mul_ss>;
427def Int_MULSDrr : SD_Intrr<0x59, "mulsd {$src2, $dst|$dst, $src2}",
428 int_x86_sse2_mul_sd>;
Evan Chengc46349d2006-03-28 23:51:43 +0000429}
430
Evan Cheng6e967402006-04-04 00:10:53 +0000431def Int_ADDSSrm : SS_Intrm<0x58, "addss {$src2, $dst|$dst, $src2}",
432 int_x86_sse_add_ss>;
433def Int_ADDSDrm : SD_Intrm<0x58, "addsd {$src2, $dst|$dst, $src2}",
434 int_x86_sse2_add_sd>;
435def Int_MULSSrm : SS_Intrm<0x59, "mulss {$src2, $dst|$dst, $src2}",
436 int_x86_sse_mul_ss>;
437def Int_MULSDrm : SD_Intrm<0x59, "mulsd {$src2, $dst|$dst, $src2}",
438 int_x86_sse2_mul_sd>;
Evan Chengc46349d2006-03-28 23:51:43 +0000439
Evan Cheng6e967402006-04-04 00:10:53 +0000440def Int_DIVSSrr : SS_Intrr<0x5E, "divss {$src2, $dst|$dst, $src2}",
441 int_x86_sse_div_ss>;
442def Int_DIVSSrm : SS_Intrm<0x5E, "divss {$src2, $dst|$dst, $src2}",
443 int_x86_sse_div_ss>;
444def Int_DIVSDrr : SD_Intrr<0x5E, "divsd {$src2, $dst|$dst, $src2}",
445 int_x86_sse2_div_sd>;
446def Int_DIVSDrm : SD_Intrm<0x5E, "divsd {$src2, $dst|$dst, $src2}",
447 int_x86_sse2_div_sd>;
Evan Chengc46349d2006-03-28 23:51:43 +0000448
Evan Cheng6e967402006-04-04 00:10:53 +0000449def Int_SUBSSrr : SS_Intrr<0x5C, "subss {$src2, $dst|$dst, $src2}",
450 int_x86_sse_sub_ss>;
451def Int_SUBSSrm : SS_Intrm<0x5C, "subss {$src2, $dst|$dst, $src2}",
452 int_x86_sse_sub_ss>;
453def Int_SUBSDrr : SD_Intrr<0x5C, "subsd {$src2, $dst|$dst, $src2}",
454 int_x86_sse2_sub_sd>;
455def Int_SUBSDrm : SD_Intrm<0x5C, "subsd {$src2, $dst|$dst, $src2}",
456 int_x86_sse2_sub_sd>;
Evan Chengc46349d2006-03-28 23:51:43 +0000457}
458
Evan Cheng8703be42006-04-04 19:12:30 +0000459def Int_SQRTSSr : SS_Intr<0x51, "sqrtss {$src, $dst|$dst, $src}",
460 int_x86_sse_sqrt_ss>;
461def Int_SQRTSSm : SS_Intm<0x51, "sqrtss {$src, $dst|$dst, $src}",
462 int_x86_sse_sqrt_ss>;
463def Int_SQRTSDr : SD_Intr<0x51, "sqrtsd {$src, $dst|$dst, $src}",
464 int_x86_sse2_sqrt_sd>;
465def Int_SQRTSDm : SD_Intm<0x51, "sqrtsd {$src, $dst|$dst, $src}",
466 int_x86_sse2_sqrt_sd>;
Evan Chengc46349d2006-03-28 23:51:43 +0000467
Evan Cheng8703be42006-04-04 19:12:30 +0000468def Int_RSQRTSSr : SS_Intr<0x52, "rsqrtss {$src, $dst|$dst, $src}",
469 int_x86_sse_rsqrt_ss>;
470def Int_RSQRTSSm : SS_Intm<0x52, "rsqrtss {$src, $dst|$dst, $src}",
471 int_x86_sse_rsqrt_ss>;
472def Int_RCPSSr : SS_Intr<0x53, "rcpss {$src, $dst|$dst, $src}",
473 int_x86_sse_rcp_ss>;
474def Int_RCPSSm : SS_Intm<0x53, "rcpss {$src, $dst|$dst, $src}",
475 int_x86_sse_rcp_ss>;
Evan Chengc46349d2006-03-28 23:51:43 +0000476
477let isTwoAddress = 1 in {
Evan Cheng97ac5fa2006-04-03 23:49:17 +0000478def Int_MAXSSrr : SS_Intrr<0x5F, "maxss {$src2, $dst|$dst, $src2}",
Evan Cheng6e967402006-04-04 00:10:53 +0000479 int_x86_sse_max_ss>;
Evan Cheng97ac5fa2006-04-03 23:49:17 +0000480def Int_MAXSSrm : SS_Intrm<0x5F, "maxss {$src2, $dst|$dst, $src2}",
Evan Cheng6e967402006-04-04 00:10:53 +0000481 int_x86_sse_max_ss>;
Evan Cheng97ac5fa2006-04-03 23:49:17 +0000482def Int_MAXSDrr : SD_Intrr<0x5F, "maxsd {$src2, $dst|$dst, $src2}",
Evan Cheng6e967402006-04-04 00:10:53 +0000483 int_x86_sse2_max_sd>;
Evan Cheng97ac5fa2006-04-03 23:49:17 +0000484def Int_MAXSDrm : SD_Intrm<0x5F, "maxsd {$src2, $dst|$dst, $src2}",
Evan Cheng6e967402006-04-04 00:10:53 +0000485 int_x86_sse2_max_sd>;
Evan Cheng97ac5fa2006-04-03 23:49:17 +0000486def Int_MINSSrr : SS_Intrr<0x5D, "minss {$src2, $dst|$dst, $src2}",
Evan Cheng6e967402006-04-04 00:10:53 +0000487 int_x86_sse_min_ss>;
Evan Cheng97ac5fa2006-04-03 23:49:17 +0000488def Int_MINSSrm : SS_Intrm<0x5D, "minss {$src2, $dst|$dst, $src2}",
Evan Cheng6e967402006-04-04 00:10:53 +0000489 int_x86_sse_min_ss>;
Evan Cheng97ac5fa2006-04-03 23:49:17 +0000490def Int_MINSDrr : SD_Intrr<0x5D, "minsd {$src2, $dst|$dst, $src2}",
Evan Cheng6e967402006-04-04 00:10:53 +0000491 int_x86_sse2_min_sd>;
Evan Cheng97ac5fa2006-04-03 23:49:17 +0000492def Int_MINSDrm : SD_Intrm<0x5D, "minsd {$src2, $dst|$dst, $src2}",
Evan Cheng6e967402006-04-04 00:10:53 +0000493 int_x86_sse2_min_sd>;
Evan Chengc46349d2006-03-28 23:51:43 +0000494}
495
496// Conversion instructions
Evan Chengc46349d2006-03-28 23:51:43 +0000497def CVTTSS2SIrr: SSI<0x2C, MRMSrcReg, (ops R32:$dst, FR32:$src),
Evan Cheng8703be42006-04-04 19:12:30 +0000498 "cvttss2si {$src, $dst|$dst, $src}",
499 [(set R32:$dst, (fp_to_sint FR32:$src))]>;
Evan Chengc46349d2006-03-28 23:51:43 +0000500def CVTTSS2SIrm: SSI<0x2C, MRMSrcMem, (ops R32:$dst, f32mem:$src),
Evan Cheng8703be42006-04-04 19:12:30 +0000501 "cvttss2si {$src, $dst|$dst, $src}",
502 [(set R32:$dst, (fp_to_sint (loadf32 addr:$src)))]>;
Evan Chengc46349d2006-03-28 23:51:43 +0000503def CVTTSD2SIrr: SDI<0x2C, MRMSrcReg, (ops R32:$dst, FR64:$src),
Evan Cheng8703be42006-04-04 19:12:30 +0000504 "cvttsd2si {$src, $dst|$dst, $src}",
505 [(set R32:$dst, (fp_to_sint FR64:$src))]>;
Evan Chengc46349d2006-03-28 23:51:43 +0000506def CVTTSD2SIrm: SDI<0x2C, MRMSrcMem, (ops R32:$dst, f64mem:$src),
Evan Cheng8703be42006-04-04 19:12:30 +0000507 "cvttsd2si {$src, $dst|$dst, $src}",
508 [(set R32:$dst, (fp_to_sint (loadf64 addr:$src)))]>;
Evan Chengc46349d2006-03-28 23:51:43 +0000509def CVTSD2SSrr: SDI<0x5A, MRMSrcReg, (ops FR32:$dst, FR64:$src),
Evan Cheng8703be42006-04-04 19:12:30 +0000510 "cvtsd2ss {$src, $dst|$dst, $src}",
511 [(set FR32:$dst, (fround FR64:$src))]>;
Evan Chengc46349d2006-03-28 23:51:43 +0000512def CVTSD2SSrm: SDI<0x5A, MRMSrcMem, (ops FR32:$dst, f64mem:$src),
Evan Cheng8703be42006-04-04 19:12:30 +0000513 "cvtsd2ss {$src, $dst|$dst, $src}",
514 [(set FR32:$dst, (fround (loadf64 addr:$src)))]>;
Evan Chengc46349d2006-03-28 23:51:43 +0000515def CVTSI2SSrr: SSI<0x2A, MRMSrcReg, (ops FR32:$dst, R32:$src),
516 "cvtsi2ss {$src, $dst|$dst, $src}",
517 [(set FR32:$dst, (sint_to_fp R32:$src))]>;
518def CVTSI2SSrm: SSI<0x2A, MRMSrcMem, (ops FR32:$dst, i32mem:$src),
Evan Cheng8703be42006-04-04 19:12:30 +0000519 "cvtsi2ss {$src, $dst|$dst, $src}",
520 [(set FR32:$dst, (sint_to_fp (loadi32 addr:$src)))]>;
Evan Chengc46349d2006-03-28 23:51:43 +0000521def CVTSI2SDrr: SDI<0x2A, MRMSrcReg, (ops FR64:$dst, R32:$src),
Evan Cheng8703be42006-04-04 19:12:30 +0000522 "cvtsi2sd {$src, $dst|$dst, $src}",
523 [(set FR64:$dst, (sint_to_fp R32:$src))]>;
Evan Chengc46349d2006-03-28 23:51:43 +0000524def CVTSI2SDrm: SDI<0x2A, MRMSrcMem, (ops FR64:$dst, i32mem:$src),
Evan Cheng8703be42006-04-04 19:12:30 +0000525 "cvtsi2sd {$src, $dst|$dst, $src}",
526 [(set FR64:$dst, (sint_to_fp (loadi32 addr:$src)))]>;
Evan Chengd2a6d542006-04-12 23:42:44 +0000527
Evan Chengc46349d2006-03-28 23:51:43 +0000528// SSE2 instructions with XS prefix
529def CVTSS2SDrr: I<0x5A, MRMSrcReg, (ops FR64:$dst, FR32:$src),
Evan Cheng8703be42006-04-04 19:12:30 +0000530 "cvtss2sd {$src, $dst|$dst, $src}",
531 [(set FR64:$dst, (fextend FR32:$src))]>, XS,
Evan Chengc46349d2006-03-28 23:51:43 +0000532 Requires<[HasSSE2]>;
533def CVTSS2SDrm: I<0x5A, MRMSrcMem, (ops FR64:$dst, f32mem:$src),
Evan Cheng8703be42006-04-04 19:12:30 +0000534 "cvtss2sd {$src, $dst|$dst, $src}",
535 [(set FR64:$dst, (fextend (loadf32 addr:$src)))]>, XS,
Evan Chengc46349d2006-03-28 23:51:43 +0000536 Requires<[HasSSE2]>;
537
Evan Chengd2a6d542006-04-12 23:42:44 +0000538// Match intrinsics which expect XMM operand(s).
539def CVTSS2SIrr: SSI<0x2D, MRMSrcReg, (ops R32:$dst, VR128:$src),
540 "cvtss2si {$src, $dst|$dst, $src}",
541 [(set R32:$dst, (int_x86_sse_cvtss2si VR128:$src))]>;
542def CVTSS2SIrm: SSI<0x2D, MRMSrcMem, (ops R32:$dst, f32mem:$src),
543 "cvtss2si {$src, $dst|$dst, $src}",
544 [(set R32:$dst, (int_x86_sse_cvtss2si
545 (loadv4f32 addr:$src)))]>;
Evan Chengd9539472006-04-14 21:59:03 +0000546def CVTSD2SIrr: SDI<0x2D, MRMSrcReg, (ops R32:$dst, VR128:$src),
547 "cvtsd2si {$src, $dst|$dst, $src}",
548 [(set R32:$dst, (int_x86_sse2_cvtsd2si VR128:$src))]>;
549def CVTSD2SIrm: SDI<0x2D, MRMSrcMem, (ops R32:$dst, f128mem:$src),
550 "cvtsd2si {$src, $dst|$dst, $src}",
551 [(set R32:$dst, (int_x86_sse2_cvtsd2si
552 (loadv2f64 addr:$src)))]>;
Evan Chengd2a6d542006-04-12 23:42:44 +0000553
554// Aliases for intrinsics
555def Int_CVTTSS2SIrr: SSI<0x2C, MRMSrcReg, (ops R32:$dst, VR128:$src),
556 "cvttss2si {$src, $dst|$dst, $src}",
557 [(set R32:$dst, (int_x86_sse_cvttss2si VR128:$src))]>;
558def Int_CVTTSS2SIrm: SSI<0x2C, MRMSrcMem, (ops R32:$dst, f32mem:$src),
559 "cvttss2si {$src, $dst|$dst, $src}",
560 [(set R32:$dst, (int_x86_sse_cvttss2si
561 (loadv4f32 addr:$src)))]>;
Evan Chengd03db7a2006-04-12 05:20:24 +0000562def Int_CVTTSD2SIrr: SDI<0x2C, MRMSrcReg, (ops R32:$dst, VR128:$src),
563 "cvttsd2si {$src, $dst|$dst, $src}",
564 [(set R32:$dst, (int_x86_sse2_cvttsd2si VR128:$src))]>;
565def Int_CVTTSD2SIrm: SDI<0x2C, MRMSrcMem, (ops R32:$dst, f128mem:$src),
566 "cvttsd2si {$src, $dst|$dst, $src}",
567 [(set R32:$dst, (int_x86_sse2_cvttsd2si
Evan Cheng91b740d2006-04-12 17:12:36 +0000568 (loadv2f64 addr:$src)))]>;
Evan Chengd03db7a2006-04-12 05:20:24 +0000569
Evan Chengd2a6d542006-04-12 23:42:44 +0000570let isTwoAddress = 1 in {
571def Int_CVTSI2SSrr: SSI<0x2A, MRMSrcReg,
572 (ops VR128:$dst, VR128:$src1, R32:$src2),
573 "cvtsi2ss {$src2, $dst|$dst, $src2}",
574 [(set VR128:$dst, (int_x86_sse_cvtsi2ss VR128:$src1,
575 R32:$src2))]>;
576def Int_CVTSI2SSrm: SSI<0x2A, MRMSrcMem,
577 (ops VR128:$dst, VR128:$src1, i32mem:$src2),
578 "cvtsi2ss {$src2, $dst|$dst, $src2}",
579 [(set VR128:$dst, (int_x86_sse_cvtsi2ss VR128:$src1,
580 (loadi32 addr:$src2)))]>;
581}
Evan Chengd03db7a2006-04-12 05:20:24 +0000582
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000583// Comparison instructions
584let isTwoAddress = 1 in {
Evan Cheng470a6ad2006-02-22 02:26:30 +0000585def CMPSSrr : SSI<0xC2, MRMSrcReg,
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000586 (ops FR32:$dst, FR32:$src1, FR32:$src, SSECC:$cc),
Evan Cheng0876aa52006-03-30 06:21:22 +0000587 "cmp${cc}ss {$src, $dst|$dst, $src}",
588 []>;
Evan Cheng470a6ad2006-02-22 02:26:30 +0000589def CMPSSrm : SSI<0xC2, MRMSrcMem,
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000590 (ops FR32:$dst, FR32:$src1, f32mem:$src, SSECC:$cc),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000591 "cmp${cc}ss {$src, $dst|$dst, $src}", []>;
592def CMPSDrr : SDI<0xC2, MRMSrcReg,
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000593 (ops FR64:$dst, FR64:$src1, FR64:$src, SSECC:$cc),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000594 "cmp${cc}sd {$src, $dst|$dst, $src}", []>;
595def CMPSDrm : SDI<0xC2, MRMSrcMem,
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000596 (ops FR64:$dst, FR64:$src1, f64mem:$src, SSECC:$cc),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000597 "cmp${cc}sd {$src, $dst|$dst, $src}", []>;
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000598}
599
Evan Cheng470a6ad2006-02-22 02:26:30 +0000600def UCOMISSrr: PSI<0x2E, MRMSrcReg, (ops FR32:$src1, FR32:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000601 "ucomiss {$src2, $src1|$src1, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000602 [(X86cmp FR32:$src1, FR32:$src2)]>;
603def UCOMISSrm: PSI<0x2E, MRMSrcMem, (ops FR32:$src1, f32mem:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000604 "ucomiss {$src2, $src1|$src1, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000605 [(X86cmp FR32:$src1, (loadf32 addr:$src2))]>;
606def UCOMISDrr: PDI<0x2E, MRMSrcReg, (ops FR64:$src1, FR64:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000607 "ucomisd {$src2, $src1|$src1, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000608 [(X86cmp FR64:$src1, FR64:$src2)]>;
609def UCOMISDrm: PDI<0x2E, MRMSrcMem, (ops FR64:$src1, f64mem:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000610 "ucomisd {$src2, $src1|$src1, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000611 [(X86cmp FR64:$src1, (loadf64 addr:$src2))]>;
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000612
Evan Cheng0876aa52006-03-30 06:21:22 +0000613// Aliases to match intrinsics which expect XMM operand(s).
614let isTwoAddress = 1 in {
615def Int_CMPSSrr : SSI<0xC2, MRMSrcReg,
616 (ops VR128:$dst, VR128:$src1, VR128:$src, SSECC:$cc),
617 "cmp${cc}ss {$src, $dst|$dst, $src}",
618 [(set VR128:$dst, (int_x86_sse_cmp_ss VR128:$src1,
619 VR128:$src, imm:$cc))]>;
620def Int_CMPSSrm : SSI<0xC2, MRMSrcMem,
621 (ops VR128:$dst, VR128:$src1, f32mem:$src, SSECC:$cc),
622 "cmp${cc}ss {$src, $dst|$dst, $src}",
623 [(set VR128:$dst, (int_x86_sse_cmp_ss VR128:$src1,
624 (load addr:$src), imm:$cc))]>;
625def Int_CMPSDrr : SDI<0xC2, MRMSrcReg,
626 (ops VR128:$dst, VR128:$src1, VR128:$src, SSECC:$cc),
627 "cmp${cc}sd {$src, $dst|$dst, $src}", []>;
628def Int_CMPSDrm : SDI<0xC2, MRMSrcMem,
629 (ops VR128:$dst, VR128:$src1, f64mem:$src, SSECC:$cc),
630 "cmp${cc}sd {$src, $dst|$dst, $src}", []>;
631}
632
Evan Cheng6be2c582006-04-05 23:38:46 +0000633def Int_UCOMISSrr: PSI<0x2E, MRMSrcReg, (ops VR128:$src1, VR128:$src2),
634 "ucomiss {$src2, $src1|$src1, $src2}",
635 [(X86ucomi (v4f32 VR128:$src1), VR128:$src2)]>;
636def Int_UCOMISSrm: PSI<0x2E, MRMSrcMem, (ops VR128:$src1, f128mem:$src2),
637 "ucomiss {$src2, $src1|$src1, $src2}",
638 [(X86ucomi (v4f32 VR128:$src1), (loadv4f32 addr:$src2))]>;
639def Int_UCOMISDrr: PDI<0x2E, MRMSrcReg, (ops VR128:$src1, VR128:$src2),
640 "ucomisd {$src2, $src1|$src1, $src2}",
641 [(X86ucomi (v2f64 VR128:$src1), (v2f64 VR128:$src2))]>;
642def Int_UCOMISDrm: PDI<0x2E, MRMSrcMem, (ops VR128:$src1, f128mem:$src2),
643 "ucomisd {$src2, $src1|$src1, $src2}",
644 [(X86ucomi (v2f64 VR128:$src1), (loadv2f64 addr:$src2))]>;
645
646def Int_COMISSrr: PSI<0x2F, MRMSrcReg, (ops VR128:$src1, VR128:$src2),
647 "comiss {$src2, $src1|$src1, $src2}",
648 [(X86comi (v4f32 VR128:$src1), VR128:$src2)]>;
649def Int_COMISSrm: PSI<0x2F, MRMSrcMem, (ops VR128:$src1, f128mem:$src2),
650 "comiss {$src2, $src1|$src1, $src2}",
651 [(X86comi (v4f32 VR128:$src1), (loadv4f32 addr:$src2))]>;
652def Int_COMISDrr: PDI<0x2F, MRMSrcReg, (ops VR128:$src1, VR128:$src2),
653 "comisd {$src2, $src1|$src1, $src2}",
654 [(X86comi (v2f64 VR128:$src1), (v2f64 VR128:$src2))]>;
655def Int_COMISDrm: PDI<0x2F, MRMSrcMem, (ops VR128:$src1, f128mem:$src2),
656 "comisd {$src2, $src1|$src1, $src2}",
657 [(X86comi (v2f64 VR128:$src1), (loadv2f64 addr:$src2))]>;
Evan Cheng0876aa52006-03-30 06:21:22 +0000658
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000659// Aliases of packed instructions for scalar use. These all have names that
660// start with 'Fs'.
661
662// Alias instructions that map fld0 to pxor for sse.
663// FIXME: remove when we can teach regalloc that xor reg, reg is ok.
664def FsFLD0SS : I<0xEF, MRMInitReg, (ops FR32:$dst),
665 "pxor $dst, $dst", [(set FR32:$dst, fp32imm0)]>,
666 Requires<[HasSSE1]>, TB, OpSize;
667def FsFLD0SD : I<0xEF, MRMInitReg, (ops FR64:$dst),
668 "pxor $dst, $dst", [(set FR64:$dst, fp64imm0)]>,
669 Requires<[HasSSE2]>, TB, OpSize;
670
671// Alias instructions to do FR32 / FR64 reg-to-reg copy using movaps / movapd.
672// Upper bits are disregarded.
Evan Cheng470a6ad2006-02-22 02:26:30 +0000673def FsMOVAPSrr : PSI<0x28, MRMSrcReg, (ops FR32:$dst, FR32:$src),
674 "movaps {$src, $dst|$dst, $src}", []>;
675def FsMOVAPDrr : PDI<0x28, MRMSrcReg, (ops FR64:$dst, FR64:$src),
676 "movapd {$src, $dst|$dst, $src}", []>;
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000677
678// Alias instructions to load FR32 / FR64 from f128mem using movaps / movapd.
679// Upper bits are disregarded.
Evan Cheng470a6ad2006-02-22 02:26:30 +0000680def FsMOVAPSrm : PSI<0x28, MRMSrcMem, (ops FR32:$dst, f128mem:$src),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000681 "movaps {$src, $dst|$dst, $src}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000682 [(set FR32:$dst, (X86loadpf32 addr:$src))]>;
683def FsMOVAPDrm : PDI<0x28, MRMSrcMem, (ops FR64:$dst, f128mem:$src),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000684 "movapd {$src, $dst|$dst, $src}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000685 [(set FR64:$dst, (X86loadpf64 addr:$src))]>;
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000686
687// Alias bitwise logical operations using SSE logical ops on packed FP values.
688let isTwoAddress = 1 in {
689let isCommutable = 1 in {
Evan Cheng470a6ad2006-02-22 02:26:30 +0000690def FsANDPSrr : PSI<0x54, MRMSrcReg, (ops FR32:$dst, FR32:$src1, FR32:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000691 "andps {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000692 [(set FR32:$dst, (X86fand FR32:$src1, FR32:$src2))]>;
693def FsANDPDrr : PDI<0x54, MRMSrcReg, (ops FR64:$dst, FR64:$src1, FR64:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000694 "andpd {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000695 [(set FR64:$dst, (X86fand FR64:$src1, FR64:$src2))]>;
696def FsORPSrr : PSI<0x56, MRMSrcReg, (ops FR32:$dst, FR32:$src1, FR32:$src2),
697 "orps {$src2, $dst|$dst, $src2}", []>;
698def FsORPDrr : PDI<0x56, MRMSrcReg, (ops FR64:$dst, FR64:$src1, FR64:$src2),
699 "orpd {$src2, $dst|$dst, $src2}", []>;
700def FsXORPSrr : PSI<0x57, MRMSrcReg, (ops FR32:$dst, FR32:$src1, FR32:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000701 "xorps {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000702 [(set FR32:$dst, (X86fxor FR32:$src1, FR32:$src2))]>;
703def FsXORPDrr : PDI<0x57, MRMSrcReg, (ops FR64:$dst, FR64:$src1, FR64:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000704 "xorpd {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000705 [(set FR64:$dst, (X86fxor FR64:$src1, FR64:$src2))]>;
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000706}
Evan Cheng470a6ad2006-02-22 02:26:30 +0000707def FsANDPSrm : PSI<0x54, MRMSrcMem, (ops FR32:$dst, FR32:$src1, f128mem:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000708 "andps {$src2, $dst|$dst, $src2}",
709 [(set FR32:$dst, (X86fand FR32:$src1,
Evan Cheng470a6ad2006-02-22 02:26:30 +0000710 (X86loadpf32 addr:$src2)))]>;
711def FsANDPDrm : PDI<0x54, MRMSrcMem, (ops FR64:$dst, FR64:$src1, f128mem:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000712 "andpd {$src2, $dst|$dst, $src2}",
713 [(set FR64:$dst, (X86fand FR64:$src1,
Evan Cheng470a6ad2006-02-22 02:26:30 +0000714 (X86loadpf64 addr:$src2)))]>;
715def FsORPSrm : PSI<0x56, MRMSrcMem, (ops FR32:$dst, FR32:$src1, f128mem:$src2),
716 "orps {$src2, $dst|$dst, $src2}", []>;
717def FsORPDrm : PDI<0x56, MRMSrcMem, (ops FR64:$dst, FR64:$src1, f128mem:$src2),
718 "orpd {$src2, $dst|$dst, $src2}", []>;
719def FsXORPSrm : PSI<0x57, MRMSrcMem, (ops FR32:$dst, FR32:$src1, f128mem:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000720 "xorps {$src2, $dst|$dst, $src2}",
721 [(set FR32:$dst, (X86fxor FR32:$src1,
Evan Cheng470a6ad2006-02-22 02:26:30 +0000722 (X86loadpf32 addr:$src2)))]>;
723def FsXORPDrm : PDI<0x57, MRMSrcMem, (ops FR64:$dst, FR64:$src1, f128mem:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000724 "xorpd {$src2, $dst|$dst, $src2}",
725 [(set FR64:$dst, (X86fxor FR64:$src1,
Evan Cheng470a6ad2006-02-22 02:26:30 +0000726 (X86loadpf64 addr:$src2)))]>;
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000727
Evan Cheng470a6ad2006-02-22 02:26:30 +0000728def FsANDNPSrr : PSI<0x55, MRMSrcReg, (ops FR32:$dst, FR32:$src1, FR32:$src2),
729 "andnps {$src2, $dst|$dst, $src2}", []>;
730def FsANDNPSrm : PSI<0x55, MRMSrcMem, (ops FR32:$dst, FR32:$src1, f128mem:$src2),
731 "andnps {$src2, $dst|$dst, $src2}", []>;
732def FsANDNPDrr : PDI<0x55, MRMSrcReg, (ops FR64:$dst, FR64:$src1, FR64:$src2),
733 "andnpd {$src2, $dst|$dst, $src2}", []>;
734def FsANDNPDrm : PDI<0x55, MRMSrcMem, (ops FR64:$dst, FR64:$src1, f128mem:$src2),
735 "andnpd {$src2, $dst|$dst, $src2}", []>;
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000736}
737
738//===----------------------------------------------------------------------===//
Evan Cheng9ab1ac52006-04-14 23:32:40 +0000739// SSE packed FP Instructions
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000740//===----------------------------------------------------------------------===//
741
Evan Chengc12e6c42006-03-19 09:38:54 +0000742// Some 'special' instructions
743def IMPLICIT_DEF_VR128 : I<0, Pseudo, (ops VR128:$dst),
744 "#IMPLICIT_DEF $dst",
745 [(set VR128:$dst, (v4f32 (undef)))]>,
746 Requires<[HasSSE1]>;
747
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000748// Move Instructions
Evan Cheng2246f842006-03-18 01:23:20 +0000749def MOVAPSrr : PSI<0x28, MRMSrcReg, (ops VR128:$dst, VR128:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000750 "movaps {$src, $dst|$dst, $src}", []>;
Evan Cheng2246f842006-03-18 01:23:20 +0000751def MOVAPSrm : PSI<0x28, MRMSrcMem, (ops VR128:$dst, f128mem:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000752 "movaps {$src, $dst|$dst, $src}",
Evan Cheng2246f842006-03-18 01:23:20 +0000753 [(set VR128:$dst, (loadv4f32 addr:$src))]>;
754def MOVAPDrr : PDI<0x28, MRMSrcReg, (ops VR128:$dst, VR128:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000755 "movapd {$src, $dst|$dst, $src}", []>;
Evan Cheng2246f842006-03-18 01:23:20 +0000756def MOVAPDrm : PDI<0x28, MRMSrcMem, (ops VR128:$dst, f128mem:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000757 "movapd {$src, $dst|$dst, $src}",
Evan Cheng2246f842006-03-18 01:23:20 +0000758 [(set VR128:$dst, (loadv2f64 addr:$src))]>;
Evan Chengffcb95b2006-02-21 19:13:53 +0000759
Evan Cheng2246f842006-03-18 01:23:20 +0000760def MOVAPSmr : PSI<0x29, MRMDestMem, (ops f128mem:$dst, VR128:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000761 "movaps {$src, $dst|$dst, $src}",
Evan Cheng2246f842006-03-18 01:23:20 +0000762 [(store (v4f32 VR128:$src), addr:$dst)]>;
763def MOVAPDmr : PDI<0x29, MRMDestMem, (ops f128mem:$dst, VR128:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000764 "movapd {$src, $dst|$dst, $src}",
Evan Cheng2246f842006-03-18 01:23:20 +0000765 [(store (v2f64 VR128:$src), addr:$dst)]>;
Evan Cheng470a6ad2006-02-22 02:26:30 +0000766
Evan Cheng2246f842006-03-18 01:23:20 +0000767def MOVUPSrr : PSI<0x10, MRMSrcReg, (ops VR128:$dst, VR128:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000768 "movups {$src, $dst|$dst, $src}", []>;
Evan Chengaa9fb8c2006-04-10 21:11:06 +0000769def MOVUPSrm : PDI<0x10, MRMSrcMem, (ops VR128:$dst, f128mem:$src),
770 "movups {$src, $dst|$dst, $src}",
771 [(set VR128:$dst, (int_x86_sse_loadu_ps addr:$src))]>;
772def MOVUPSmr : PDI<0x11, MRMDestMem, (ops f128mem:$dst, VR128:$src),
773 "movups {$src, $dst|$dst, $src}",
774 [(int_x86_sse_storeu_ps addr:$dst, VR128:$src)]>;
Evan Cheng2246f842006-03-18 01:23:20 +0000775def MOVUPDrr : PDI<0x10, MRMSrcReg, (ops VR128:$dst, VR128:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000776 "movupd {$src, $dst|$dst, $src}", []>;
Evan Cheng2246f842006-03-18 01:23:20 +0000777def MOVUPDrm : PDI<0x10, MRMSrcMem, (ops VR128:$dst, f128mem:$src),
Evan Chengaa9fb8c2006-04-10 21:11:06 +0000778 "movupd {$src, $dst|$dst, $src}",
779 [(set VR128:$dst, (int_x86_sse2_loadu_pd addr:$src))]>;
Evan Cheng2246f842006-03-18 01:23:20 +0000780def MOVUPDmr : PDI<0x11, MRMDestMem, (ops f128mem:$dst, VR128:$src),
Evan Chengaa9fb8c2006-04-10 21:11:06 +0000781 "movupd {$src, $dst|$dst, $src}",
782 [(int_x86_sse2_storeu_pd addr:$dst, VR128:$src)]>;
Evan Cheng470a6ad2006-02-22 02:26:30 +0000783
Evan Cheng4fcb9222006-03-28 02:43:26 +0000784let isTwoAddress = 1 in {
Evan Cheng9bbfd4f2006-03-28 07:01:28 +0000785def MOVLPSrm : PSI<0x12, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f64mem:$src2),
Evan Cheng5ced1d82006-04-06 23:23:56 +0000786 "movlps {$src2, $dst|$dst, $src2}",
787 [(set VR128:$dst,
788 (v4f32 (vector_shuffle VR128:$src1,
789 (bc_v4f32 (v2f64 (scalar_to_vector (loadf64 addr:$src2)))),
790 MOVLP_shuffle_mask)))]>;
Evan Cheng9bbfd4f2006-03-28 07:01:28 +0000791def MOVLPDrm : PDI<0x12, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f64mem:$src2),
Evan Cheng5ced1d82006-04-06 23:23:56 +0000792 "movlpd {$src2, $dst|$dst, $src2}",
793 [(set VR128:$dst,
794 (v2f64 (vector_shuffle VR128:$src1,
795 (scalar_to_vector (loadf64 addr:$src2)),
796 MOVLP_shuffle_mask)))]>;
Evan Cheng4fcb9222006-03-28 02:43:26 +0000797def MOVHPSrm : PSI<0x16, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f64mem:$src2),
Evan Cheng5ced1d82006-04-06 23:23:56 +0000798 "movhps {$src2, $dst|$dst, $src2}",
799 [(set VR128:$dst,
800 (v4f32 (vector_shuffle VR128:$src1,
801 (bc_v4f32 (v2f64 (scalar_to_vector (loadf64 addr:$src2)))),
802 MOVHP_shuffle_mask)))]>;
Evan Cheng4fcb9222006-03-28 02:43:26 +0000803def MOVHPDrm : PDI<0x16, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f64mem:$src2),
804 "movhpd {$src2, $dst|$dst, $src2}",
805 [(set VR128:$dst,
806 (v2f64 (vector_shuffle VR128:$src1,
807 (scalar_to_vector (loadf64 addr:$src2)),
Evan Cheng5ced1d82006-04-06 23:23:56 +0000808 MOVHP_shuffle_mask)))]>;
Evan Cheng4fcb9222006-03-28 02:43:26 +0000809}
810
Evan Cheng9bbfd4f2006-03-28 07:01:28 +0000811def MOVLPSmr : PSI<0x13, MRMDestMem, (ops f64mem:$dst, VR128:$src),
Evan Cheng664ade72006-04-07 21:20:58 +0000812 "movlps {$src, $dst|$dst, $src}",
813 [(store (f64 (vector_extract (bc_v2f64 (v4f32 VR128:$src)),
814 (i32 0))), addr:$dst)]>;
Evan Cheng9bbfd4f2006-03-28 07:01:28 +0000815def MOVLPDmr : PDI<0x13, MRMDestMem, (ops f64mem:$dst, VR128:$src),
Evan Cheng20e3ed12006-04-03 22:30:54 +0000816 "movlpd {$src, $dst|$dst, $src}",
817 [(store (f64 (vector_extract (v2f64 VR128:$src),
818 (i32 0))), addr:$dst)]>;
Evan Cheng9bbfd4f2006-03-28 07:01:28 +0000819
Evan Cheng664ade72006-04-07 21:20:58 +0000820// v2f64 extract element 1 is always custom lowered to unpack high to low
821// and extract element 0 so the non-store version isn't too horrible.
Evan Cheng2246f842006-03-18 01:23:20 +0000822def MOVHPSmr : PSI<0x17, MRMDestMem, (ops f64mem:$dst, VR128:$src),
Evan Cheng664ade72006-04-07 21:20:58 +0000823 "movhps {$src, $dst|$dst, $src}",
824 [(store (f64 (vector_extract
825 (v2f64 (vector_shuffle
826 (bc_v2f64 (v4f32 VR128:$src)), (undef),
827 UNPCKH_shuffle_mask)), (i32 0))),
828 addr:$dst)]>;
Evan Cheng2246f842006-03-18 01:23:20 +0000829def MOVHPDmr : PDI<0x17, MRMDestMem, (ops f64mem:$dst, VR128:$src),
Evan Cheng20e3ed12006-04-03 22:30:54 +0000830 "movhpd {$src, $dst|$dst, $src}",
831 [(store (f64 (vector_extract
832 (v2f64 (vector_shuffle VR128:$src, (undef),
833 UNPCKH_shuffle_mask)), (i32 0))),
834 addr:$dst)]>;
Evan Cheng470a6ad2006-02-22 02:26:30 +0000835
Evan Cheng14aed5e2006-03-24 01:18:28 +0000836let isTwoAddress = 1 in {
837def MOVLHPSrr : PSI<0x16, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
Evan Cheng4fcb9222006-03-28 02:43:26 +0000838 "movlhps {$src2, $dst|$dst, $src2}",
839 [(set VR128:$dst,
Evan Cheng2064a2b2006-03-28 06:50:32 +0000840 (v4f32 (vector_shuffle VR128:$src1, VR128:$src2,
841 MOVLHPS_shuffle_mask)))]>;
Evan Cheng2c0dbd02006-03-24 02:58:06 +0000842
Evan Cheng14aed5e2006-03-24 01:18:28 +0000843def MOVHLPSrr : PSI<0x12, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
Evan Chengbe296ac2006-03-28 06:53:49 +0000844 "movhlps {$src2, $dst|$dst, $src2}",
Evan Cheng4fcb9222006-03-28 02:43:26 +0000845 [(set VR128:$dst,
Evan Cheng2064a2b2006-03-28 06:50:32 +0000846 (v4f32 (vector_shuffle VR128:$src1, VR128:$src2,
Evan Cheng4fcb9222006-03-28 02:43:26 +0000847 MOVHLPS_shuffle_mask)))]>;
Evan Cheng14aed5e2006-03-24 01:18:28 +0000848}
Evan Cheng470a6ad2006-02-22 02:26:30 +0000849
Evan Chengd9539472006-04-14 21:59:03 +0000850def MOVSHDUPrr : S3SI<0x16, MRMSrcReg, (ops VR128:$dst, VR128:$src),
851 "movshdup {$src, $dst|$dst, $src}",
852 [(set VR128:$dst, (v4f32 (vector_shuffle
853 VR128:$src, (undef),
854 MOVSHDUP_shuffle_mask)))]>;
855def MOVSHDUPrm : S3SI<0x16, MRMSrcReg, (ops VR128:$dst, f128mem:$src),
856 "movshdup {$src, $dst|$dst, $src}",
857 [(set VR128:$dst, (v4f32 (vector_shuffle
858 (loadv4f32 addr:$src), (undef),
859 MOVSHDUP_shuffle_mask)))]>;
860
861def MOVSLDUPrr : S3SI<0x12, MRMSrcReg, (ops VR128:$dst, VR128:$src),
862 "movsldup {$src, $dst|$dst, $src}",
863 [(set VR128:$dst, (v4f32 (vector_shuffle
864 VR128:$src, (undef),
865 MOVSLDUP_shuffle_mask)))]>;
866def MOVSLDUPrm : S3SI<0x12, MRMSrcReg, (ops VR128:$dst, f128mem:$src),
867 "movsldup {$src, $dst|$dst, $src}",
868 [(set VR128:$dst, (v4f32 (vector_shuffle
869 (loadv4f32 addr:$src), (undef),
870 MOVSLDUP_shuffle_mask)))]>;
871
872def MOVDDUPrr : S3DI<0x12, MRMSrcReg, (ops VR128:$dst, VR128:$src),
873 "movddup {$src, $dst|$dst, $src}",
874 [(set VR128:$dst, (v2f64 (vector_shuffle
875 VR128:$src, (undef),
876 SSE_splat_v2_mask)))]>;
877def MOVDDUPrm : S3DI<0x12, MRMSrcReg, (ops VR128:$dst, f64mem:$src),
878 "movddup {$src, $dst|$dst, $src}",
879 [(set VR128:$dst, (v2f64 (vector_shuffle
880 (loadv2f64 addr:$src), (undef),
881 SSE_splat_v2_mask)))]>;
882
Evan Cheng470a6ad2006-02-22 02:26:30 +0000883// SSE2 instructions without OpSize prefix
Evan Chengd03db7a2006-04-12 05:20:24 +0000884def CVTDQ2PSrr : I<0x5B, MRMSrcReg, (ops VR128:$dst, VR128:$src),
885 "cvtdq2ps {$src, $dst|$dst, $src}",
886 [(set VR128:$dst, (int_x86_sse2_cvtdq2ps VR128:$src))]>,
887 TB, Requires<[HasSSE2]>;
888def CVTDQ2PSrm : I<0x5B, MRMSrcMem, (ops VR128:$dst, i128mem:$src),
889 "cvtdq2ps {$src, $dst|$dst, $src}",
890 [(set VR128:$dst, (int_x86_sse2_cvtdq2ps
Evan Cheng91b740d2006-04-12 17:12:36 +0000891 (bc_v4i32 (loadv2i64 addr:$src))))]>,
Evan Chengd03db7a2006-04-12 05:20:24 +0000892 TB, Requires<[HasSSE2]>;
Evan Cheng470a6ad2006-02-22 02:26:30 +0000893
894// SSE2 instructions with XS prefix
Evan Chengd03db7a2006-04-12 05:20:24 +0000895def CVTDQ2PDrr : I<0xE6, MRMSrcReg, (ops VR128:$dst, VR128:$src),
896 "cvtdq2pd {$src, $dst|$dst, $src}",
897 [(set VR128:$dst, (int_x86_sse2_cvtdq2pd VR128:$src))]>,
898 XS, Requires<[HasSSE2]>;
899def CVTDQ2PDrm : I<0xE6, MRMSrcMem, (ops VR128:$dst, i64mem:$src),
900 "cvtdq2pd {$src, $dst|$dst, $src}",
901 [(set VR128:$dst, (int_x86_sse2_cvtdq2pd
Evan Cheng91b740d2006-04-12 17:12:36 +0000902 (bc_v4i32 (loadv2i64 addr:$src))))]>,
Evan Chengd03db7a2006-04-12 05:20:24 +0000903 XS, Requires<[HasSSE2]>;
Evan Cheng470a6ad2006-02-22 02:26:30 +0000904
Evan Chengd03db7a2006-04-12 05:20:24 +0000905def CVTPS2DQrr : PDI<0x5B, MRMSrcReg, (ops VR128:$dst, VR128:$src),
906 "cvtps2dq {$src, $dst|$dst, $src}",
907 [(set VR128:$dst, (int_x86_sse2_cvtps2dq VR128:$src))]>;
908def CVTPS2DQrm : PDI<0x5B, MRMSrcMem, (ops VR128:$dst, f128mem:$src),
909 "cvtps2dq {$src, $dst|$dst, $src}",
910 [(set VR128:$dst, (int_x86_sse2_cvtps2dq
Evan Cheng91b740d2006-04-12 17:12:36 +0000911 (loadv4f32 addr:$src)))]>;
Evan Chengd03db7a2006-04-12 05:20:24 +0000912// SSE2 packed instructions with XS prefix
913def CVTTPS2DQrr : I<0x5B, MRMSrcReg, (ops VR128:$dst, VR128:$src),
914 "cvttps2dq {$src, $dst|$dst, $src}",
915 [(set VR128:$dst, (int_x86_sse2_cvttps2dq VR128:$src))]>,
916 XS, Requires<[HasSSE2]>;
917def CVTTPS2DQrm : I<0x5B, MRMSrcMem, (ops VR128:$dst, f128mem:$src),
918 "cvttps2dq {$src, $dst|$dst, $src}",
919 [(set VR128:$dst, (int_x86_sse2_cvttps2dq
Evan Cheng91b740d2006-04-12 17:12:36 +0000920 (loadv4f32 addr:$src)))]>,
Evan Chengd03db7a2006-04-12 05:20:24 +0000921 XS, Requires<[HasSSE2]>;
922
Evan Cheng470a6ad2006-02-22 02:26:30 +0000923// SSE2 packed instructions with XD prefix
Evan Chengd03db7a2006-04-12 05:20:24 +0000924def CVTPD2DQrr : I<0xE6, MRMSrcReg, (ops VR128:$dst, VR128:$src),
925 "cvtpd2dq {$src, $dst|$dst, $src}",
926 [(set VR128:$dst, (int_x86_sse2_cvtpd2dq VR128:$src))]>,
927 XD, Requires<[HasSSE2]>;
928def CVTPD2DQrm : I<0xE6, MRMSrcMem, (ops VR128:$dst, f128mem:$src),
929 "cvtpd2dq {$src, $dst|$dst, $src}",
930 [(set VR128:$dst, (int_x86_sse2_cvtpd2dq
Evan Cheng91b740d2006-04-12 17:12:36 +0000931 (loadv2f64 addr:$src)))]>,
Evan Chengd03db7a2006-04-12 05:20:24 +0000932 XD, Requires<[HasSSE2]>;
933def CVTTPD2DQrr : PDI<0xE6, MRMSrcReg, (ops VR128:$dst, VR128:$src),
934 "cvttpd2dq {$src, $dst|$dst, $src}",
935 [(set VR128:$dst, (int_x86_sse2_cvttpd2dq VR128:$src))]>;
936def CVTTPD2DQrm : PDI<0xE6, MRMSrcMem, (ops VR128:$dst, f128mem:$src),
937 "cvttpd2dq {$src, $dst|$dst, $src}",
938 [(set VR128:$dst, (int_x86_sse2_cvttpd2dq
Evan Cheng91b740d2006-04-12 17:12:36 +0000939 (loadv2f64 addr:$src)))]>;
Evan Cheng470a6ad2006-02-22 02:26:30 +0000940
941// SSE2 instructions without OpSize prefix
Evan Chengd03db7a2006-04-12 05:20:24 +0000942def CVTPS2PDrr : I<0x5A, MRMSrcReg, (ops VR128:$dst, VR128:$src),
943 "cvtps2pd {$src, $dst|$dst, $src}",
944 [(set VR128:$dst, (int_x86_sse2_cvtps2pd VR128:$src))]>,
945 TB, Requires<[HasSSE2]>;
946def CVTPS2PDrm : I<0x5A, MRMSrcReg, (ops VR128:$dst, f64mem:$src),
947 "cvtps2pd {$src, $dst|$dst, $src}",
948 [(set VR128:$dst, (int_x86_sse2_cvtps2pd
Evan Cheng91b740d2006-04-12 17:12:36 +0000949 (loadv4f32 addr:$src)))]>,
Evan Chengd03db7a2006-04-12 05:20:24 +0000950 TB, Requires<[HasSSE2]>;
Evan Cheng470a6ad2006-02-22 02:26:30 +0000951
Evan Chengd03db7a2006-04-12 05:20:24 +0000952def CVTPD2PSrr : PDI<0x5A, MRMSrcReg, (ops VR128:$dst, VR128:$src),
953 "cvtpd2ps {$src, $dst|$dst, $src}",
954 [(set VR128:$dst, (int_x86_sse2_cvtpd2ps VR128:$src))]>;
955def CVTPD2PSrm : PDI<0x5A, MRMSrcReg, (ops VR128:$dst, f128mem:$src),
956 "cvtpd2ps {$src, $dst|$dst, $src}",
957 [(set VR128:$dst, (int_x86_sse2_cvtpd2ps
Evan Cheng91b740d2006-04-12 17:12:36 +0000958 (loadv2f64 addr:$src)))]>;
Evan Cheng470a6ad2006-02-22 02:26:30 +0000959
Evan Chengd2a6d542006-04-12 23:42:44 +0000960// Match intrinsics which expect XMM operand(s).
961// Aliases for intrinsics
962let isTwoAddress = 1 in {
963def Int_CVTSI2SDrr: SDI<0x2A, MRMSrcReg,
964 (ops VR128:$dst, VR128:$src1, R32:$src2),
965 "cvtsi2sd {$src2, $dst|$dst, $src2}",
966 [(set VR128:$dst, (int_x86_sse2_cvtsi2sd VR128:$src1,
967 R32:$src2))]>;
968def Int_CVTSI2SDrm: SDI<0x2A, MRMSrcMem,
969 (ops VR128:$dst, VR128:$src1, i32mem:$src2),
970 "cvtsi2sd {$src2, $dst|$dst, $src2}",
971 [(set VR128:$dst, (int_x86_sse2_cvtsi2sd VR128:$src1,
972 (loadi32 addr:$src2)))]>;
973def Int_CVTSD2SSrr: SDI<0x5A, MRMSrcReg,
974 (ops VR128:$dst, VR128:$src1, VR128:$src2),
975 "cvtsd2ss {$src2, $dst|$dst, $src2}",
976 [(set VR128:$dst, (int_x86_sse2_cvtsd2ss VR128:$src1,
977 VR128:$src2))]>;
978def Int_CVTSD2SSrm: SDI<0x5A, MRMSrcMem,
979 (ops VR128:$dst, VR128:$src1, f64mem:$src2),
980 "cvtsd2ss {$src2, $dst|$dst, $src2}",
981 [(set VR128:$dst, (int_x86_sse2_cvtsd2ss VR128:$src1,
982 (loadv2f64 addr:$src2)))]>;
983def Int_CVTSS2SDrr: I<0x5A, MRMSrcReg,
984 (ops VR128:$dst, VR128:$src1, VR128:$src2),
985 "cvtss2sd {$src2, $dst|$dst, $src2}",
986 [(set VR128:$dst, (int_x86_sse2_cvtss2sd VR128:$src1,
987 VR128:$src2))]>, XS,
988 Requires<[HasSSE2]>;
989def Int_CVTSS2SDrm: I<0x5A, MRMSrcMem,
990 (ops VR128:$dst, VR128:$src1, f32mem:$src2),
991 "cvtss2sd {$src2, $dst|$dst, $src2}",
992 [(set VR128:$dst, (int_x86_sse2_cvtss2sd VR128:$src1,
993 (loadv4f32 addr:$src2)))]>, XS,
994 Requires<[HasSSE2]>;
995}
996
Evan Cheng470a6ad2006-02-22 02:26:30 +0000997// Arithmetic
998let isTwoAddress = 1 in {
999let isCommutable = 1 in {
Evan Cheng2246f842006-03-18 01:23:20 +00001000def ADDPSrr : PSI<0x58, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
Evan Cheng470a6ad2006-02-22 02:26:30 +00001001 "addps {$src2, $dst|$dst, $src2}",
Evan Cheng2246f842006-03-18 01:23:20 +00001002 [(set VR128:$dst, (v4f32 (fadd VR128:$src1, VR128:$src2)))]>;
1003def ADDPDrr : PDI<0x58, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
Evan Cheng470a6ad2006-02-22 02:26:30 +00001004 "addpd {$src2, $dst|$dst, $src2}",
Evan Cheng2246f842006-03-18 01:23:20 +00001005 [(set VR128:$dst, (v2f64 (fadd VR128:$src1, VR128:$src2)))]>;
1006def MULPSrr : PSI<0x59, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
Evan Cheng470a6ad2006-02-22 02:26:30 +00001007 "mulps {$src2, $dst|$dst, $src2}",
Evan Cheng2246f842006-03-18 01:23:20 +00001008 [(set VR128:$dst, (v4f32 (fmul VR128:$src1, VR128:$src2)))]>;
1009def MULPDrr : PDI<0x59, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
Evan Cheng470a6ad2006-02-22 02:26:30 +00001010 "mulpd {$src2, $dst|$dst, $src2}",
Evan Cheng2246f842006-03-18 01:23:20 +00001011 [(set VR128:$dst, (v2f64 (fmul VR128:$src1, VR128:$src2)))]>;
Evan Cheng470a6ad2006-02-22 02:26:30 +00001012}
1013
Evan Cheng2246f842006-03-18 01:23:20 +00001014def ADDPSrm : PSI<0x58, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
Evan Cheng470a6ad2006-02-22 02:26:30 +00001015 "addps {$src2, $dst|$dst, $src2}",
Evan Cheng2246f842006-03-18 01:23:20 +00001016 [(set VR128:$dst, (v4f32 (fadd VR128:$src1,
1017 (load addr:$src2))))]>;
1018def ADDPDrm : PDI<0x58, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
Evan Cheng470a6ad2006-02-22 02:26:30 +00001019 "addpd {$src2, $dst|$dst, $src2}",
Evan Cheng2246f842006-03-18 01:23:20 +00001020 [(set VR128:$dst, (v2f64 (fadd VR128:$src1,
1021 (load addr:$src2))))]>;
1022def MULPSrm : PSI<0x59, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
Evan Cheng470a6ad2006-02-22 02:26:30 +00001023 "mulps {$src2, $dst|$dst, $src2}",
Evan Cheng2246f842006-03-18 01:23:20 +00001024 [(set VR128:$dst, (v4f32 (fmul VR128:$src1,
1025 (load addr:$src2))))]>;
1026def MULPDrm : PDI<0x59, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
Evan Cheng470a6ad2006-02-22 02:26:30 +00001027 "mulpd {$src2, $dst|$dst, $src2}",
Evan Cheng2246f842006-03-18 01:23:20 +00001028 [(set VR128:$dst, (v2f64 (fmul VR128:$src1,
1029 (load addr:$src2))))]>;
Evan Cheng470a6ad2006-02-22 02:26:30 +00001030
Evan Cheng2246f842006-03-18 01:23:20 +00001031def DIVPSrr : PSI<0x5E, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
1032 "divps {$src2, $dst|$dst, $src2}",
1033 [(set VR128:$dst, (v4f32 (fdiv VR128:$src1, VR128:$src2)))]>;
1034def DIVPSrm : PSI<0x5E, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
1035 "divps {$src2, $dst|$dst, $src2}",
1036 [(set VR128:$dst, (v4f32 (fdiv VR128:$src1,
1037 (load addr:$src2))))]>;
1038def DIVPDrr : PDI<0x5E, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
Evan Cheng470a6ad2006-02-22 02:26:30 +00001039 "divpd {$src2, $dst|$dst, $src2}",
Evan Cheng2246f842006-03-18 01:23:20 +00001040 [(set VR128:$dst, (v2f64 (fdiv VR128:$src1, VR128:$src2)))]>;
1041def DIVPDrm : PDI<0x5E, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
Evan Cheng470a6ad2006-02-22 02:26:30 +00001042 "divpd {$src2, $dst|$dst, $src2}",
Evan Cheng2246f842006-03-18 01:23:20 +00001043 [(set VR128:$dst, (v2f64 (fdiv VR128:$src1,
1044 (load addr:$src2))))]>;
Evan Cheng470a6ad2006-02-22 02:26:30 +00001045
Evan Cheng2246f842006-03-18 01:23:20 +00001046def SUBPSrr : PSI<0x5C, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
1047 "subps {$src2, $dst|$dst, $src2}",
1048 [(set VR128:$dst, (v4f32 (fsub VR128:$src1, VR128:$src2)))]>;
1049def SUBPSrm : PSI<0x5C, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
1050 "subps {$src2, $dst|$dst, $src2}",
1051 [(set VR128:$dst, (v4f32 (fsub VR128:$src1,
1052 (load addr:$src2))))]>;
1053def SUBPDrr : PDI<0x5C, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
1054 "subpd {$src2, $dst|$dst, $src2}",
Evan Cheng2c0dbd02006-03-24 02:58:06 +00001055 [(set VR128:$dst, (v2f64 (fsub VR128:$src1, VR128:$src2)))]>;
Evan Cheng2246f842006-03-18 01:23:20 +00001056def SUBPDrm : PDI<0x5C, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
1057 "subpd {$src2, $dst|$dst, $src2}",
Evan Cheng2c0dbd02006-03-24 02:58:06 +00001058 [(set VR128:$dst, (v2f64 (fsub VR128:$src1,
1059 (load addr:$src2))))]>;
Evan Chengd9539472006-04-14 21:59:03 +00001060
1061def ADDSUBPSrr : S3DI<0xD0, MRMSrcReg,
1062 (ops VR128:$dst, VR128:$src1, VR128:$src2),
1063 "addsubps {$src2, $dst|$dst, $src2}",
1064 [(set VR128:$dst, (int_x86_sse3_addsub_ps VR128:$src1,
1065 VR128:$src2))]>;
1066def ADDSUBPSrm : S3DI<0xD0, MRMSrcMem,
1067 (ops VR128:$dst, VR128:$src1, f128mem:$src2),
1068 "addsubps {$src2, $dst|$dst, $src2}",
1069 [(set VR128:$dst, (int_x86_sse3_addsub_ps VR128:$src1,
1070 (loadv4f32 addr:$src2)))]>;
1071def ADDSUBPDrr : S3I<0xD0, MRMSrcReg,
1072 (ops VR128:$dst, VR128:$src1, VR128:$src2),
1073 "addsubpd {$src2, $dst|$dst, $src2}",
1074 [(set VR128:$dst, (int_x86_sse3_addsub_pd VR128:$src1,
1075 VR128:$src2))]>;
1076def ADDSUBPDrm : S3I<0xD0, MRMSrcMem,
1077 (ops VR128:$dst, VR128:$src1, f128mem:$src2),
1078 "addsubpd {$src2, $dst|$dst, $src2}",
1079 [(set VR128:$dst, (int_x86_sse3_addsub_pd VR128:$src1,
1080 (loadv2f64 addr:$src2)))]>;
Evan Cheng470a6ad2006-02-22 02:26:30 +00001081}
1082
Evan Cheng8703be42006-04-04 19:12:30 +00001083def SQRTPSr : PS_Intr<0x51, "sqrtps {$src, $dst|$dst, $src}",
1084 int_x86_sse_sqrt_ps>;
1085def SQRTPSm : PS_Intm<0x51, "sqrtps {$src, $dst|$dst, $src}",
1086 int_x86_sse_sqrt_ps>;
1087def SQRTPDr : PD_Intr<0x51, "sqrtpd {$src, $dst|$dst, $src}",
1088 int_x86_sse2_sqrt_pd>;
1089def SQRTPDm : PD_Intm<0x51, "sqrtpd {$src, $dst|$dst, $src}",
1090 int_x86_sse2_sqrt_pd>;
Evan Cheng470a6ad2006-02-22 02:26:30 +00001091
Evan Cheng8703be42006-04-04 19:12:30 +00001092def RSQRTPSr : PS_Intr<0x52, "rsqrtps {$src, $dst|$dst, $src}",
1093 int_x86_sse_rsqrt_ps>;
1094def RSQRTPSm : PS_Intm<0x52, "rsqrtps {$src, $dst|$dst, $src}",
1095 int_x86_sse_rsqrt_ps>;
1096def RCPPSr : PS_Intr<0x53, "rcpps {$src, $dst|$dst, $src}",
1097 int_x86_sse_rcp_ps>;
1098def RCPPSm : PS_Intm<0x53, "rcpps {$src, $dst|$dst, $src}",
1099 int_x86_sse_rcp_ps>;
Evan Cheng470a6ad2006-02-22 02:26:30 +00001100
Evan Cheng97ac5fa2006-04-03 23:49:17 +00001101let isTwoAddress = 1 in {
1102def MAXPSrr : PS_Intrr<0x5F, "maxps {$src2, $dst|$dst, $src2}",
1103 int_x86_sse_max_ps>;
1104def MAXPSrm : PS_Intrm<0x5F, "maxps {$src2, $dst|$dst, $src2}",
1105 int_x86_sse_max_ps>;
1106def MAXPDrr : PD_Intrr<0x5F, "maxpd {$src2, $dst|$dst, $src2}",
1107 int_x86_sse2_max_pd>;
1108def MAXPDrm : PD_Intrm<0x5F, "maxpd {$src2, $dst|$dst, $src2}",
1109 int_x86_sse2_max_pd>;
1110def MINPSrr : PS_Intrr<0x5D, "minps {$src2, $dst|$dst, $src2}",
1111 int_x86_sse_min_ps>;
1112def MINPSrm : PS_Intrm<0x5D, "minps {$src2, $dst|$dst, $src2}",
1113 int_x86_sse_min_ps>;
1114def MINPDrr : PD_Intrr<0x5D, "minpd {$src2, $dst|$dst, $src2}",
1115 int_x86_sse2_min_pd>;
1116def MINPDrm : PD_Intrm<0x5D, "minpd {$src2, $dst|$dst, $src2}",
1117 int_x86_sse2_min_pd>;
1118}
Evan Chengffcb95b2006-02-21 19:13:53 +00001119
1120// Logical
1121let isTwoAddress = 1 in {
1122let isCommutable = 1 in {
Evan Cheng2246f842006-03-18 01:23:20 +00001123def ANDPSrr : PSI<0x54, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
1124 "andps {$src2, $dst|$dst, $src2}",
Evan Cheng2c3ae372006-04-12 21:21:57 +00001125 [(set VR128:$dst, (v2i64 (and VR128:$src1, VR128:$src2)))]>;
Evan Cheng2246f842006-03-18 01:23:20 +00001126def ANDPDrr : PDI<0x54, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
Evan Chengffcb95b2006-02-21 19:13:53 +00001127 "andpd {$src2, $dst|$dst, $src2}",
Evan Cheng5aa97b22006-03-29 18:47:40 +00001128 [(set VR128:$dst,
1129 (and (bc_v2i64 (v2f64 VR128:$src1)),
1130 (bc_v2i64 (v2f64 VR128:$src2))))]>;
Evan Cheng2246f842006-03-18 01:23:20 +00001131def ORPSrr : PSI<0x56, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
1132 "orps {$src2, $dst|$dst, $src2}",
Evan Cheng2c3ae372006-04-12 21:21:57 +00001133 [(set VR128:$dst, (v2i64 (or VR128:$src1, VR128:$src2)))]>;
Evan Cheng2246f842006-03-18 01:23:20 +00001134def ORPDrr : PDI<0x56, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
1135 "orpd {$src2, $dst|$dst, $src2}",
Evan Cheng5aa97b22006-03-29 18:47:40 +00001136 [(set VR128:$dst,
1137 (or (bc_v2i64 (v2f64 VR128:$src1)),
1138 (bc_v2i64 (v2f64 VR128:$src2))))]>;
Evan Cheng2246f842006-03-18 01:23:20 +00001139def XORPSrr : PSI<0x57, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
1140 "xorps {$src2, $dst|$dst, $src2}",
Evan Cheng2c3ae372006-04-12 21:21:57 +00001141 [(set VR128:$dst, (v2i64 (xor VR128:$src1, VR128:$src2)))]>;
Evan Cheng2246f842006-03-18 01:23:20 +00001142def XORPDrr : PDI<0x57, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
1143 "xorpd {$src2, $dst|$dst, $src2}",
Evan Cheng5aa97b22006-03-29 18:47:40 +00001144 [(set VR128:$dst,
1145 (xor (bc_v2i64 (v2f64 VR128:$src1)),
1146 (bc_v2i64 (v2f64 VR128:$src2))))]>;
Evan Chengffcb95b2006-02-21 19:13:53 +00001147}
Evan Cheng2246f842006-03-18 01:23:20 +00001148def ANDPSrm : PSI<0x54, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
1149 "andps {$src2, $dst|$dst, $src2}",
Evan Cheng2c3ae372006-04-12 21:21:57 +00001150 [(set VR128:$dst, (and VR128:$src1,
1151 (bc_v2i64 (loadv4f32 addr:$src2))))]>;
Evan Cheng2246f842006-03-18 01:23:20 +00001152def ANDPDrm : PDI<0x54, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
1153 "andpd {$src2, $dst|$dst, $src2}",
Evan Cheng5aa97b22006-03-29 18:47:40 +00001154 [(set VR128:$dst,
1155 (and (bc_v2i64 (v2f64 VR128:$src1)),
1156 (bc_v2i64 (loadv2f64 addr:$src2))))]>;
Evan Cheng2246f842006-03-18 01:23:20 +00001157def ORPSrm : PSI<0x56, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
1158 "orps {$src2, $dst|$dst, $src2}",
Evan Cheng2c3ae372006-04-12 21:21:57 +00001159 [(set VR128:$dst, (or VR128:$src1,
1160 (bc_v2i64 (loadv4f32 addr:$src2))))]>;
Evan Cheng2246f842006-03-18 01:23:20 +00001161def ORPDrm : PDI<0x56, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
1162 "orpd {$src2, $dst|$dst, $src2}",
Evan Cheng5aa97b22006-03-29 18:47:40 +00001163 [(set VR128:$dst,
1164 (or (bc_v2i64 (v2f64 VR128:$src1)),
1165 (bc_v2i64 (loadv2f64 addr:$src2))))]>;
Evan Cheng2246f842006-03-18 01:23:20 +00001166def XORPSrm : PSI<0x57, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
1167 "xorps {$src2, $dst|$dst, $src2}",
Evan Cheng2c3ae372006-04-12 21:21:57 +00001168 [(set VR128:$dst, (xor VR128:$src1,
1169 (bc_v2i64 (loadv4f32 addr:$src2))))]>;
Evan Cheng2246f842006-03-18 01:23:20 +00001170def XORPDrm : PDI<0x57, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
1171 "xorpd {$src2, $dst|$dst, $src2}",
Evan Cheng5aa97b22006-03-29 18:47:40 +00001172 [(set VR128:$dst,
1173 (xor (bc_v2i64 (v2f64 VR128:$src1)),
1174 (bc_v2i64 (loadv2f64 addr:$src2))))]>;
Evan Cheng2246f842006-03-18 01:23:20 +00001175def ANDNPSrr : PSI<0x55, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
1176 "andnps {$src2, $dst|$dst, $src2}",
Evan Cheng2c3ae372006-04-12 21:21:57 +00001177 [(set VR128:$dst, (v2i64 (and (xor VR128:$src1,
1178 (bc_v2i64 (v4i32 immAllOnesV))),
1179 VR128:$src2)))]>;
Evan Cheng5aa97b22006-03-29 18:47:40 +00001180def ANDNPSrm : PSI<0x55, MRMSrcMem, (ops VR128:$dst, VR128:$src1,f128mem:$src2),
Evan Cheng2246f842006-03-18 01:23:20 +00001181 "andnps {$src2, $dst|$dst, $src2}",
Evan Cheng2c3ae372006-04-12 21:21:57 +00001182 [(set VR128:$dst, (v2i64 (and (xor VR128:$src1,
1183 (bc_v2i64 (v4i32 immAllOnesV))),
1184 (bc_v2i64 (loadv4f32 addr:$src2)))))]>;
Evan Cheng2246f842006-03-18 01:23:20 +00001185def ANDNPDrr : PDI<0x55, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
1186 "andnpd {$src2, $dst|$dst, $src2}",
Evan Cheng5aa97b22006-03-29 18:47:40 +00001187 [(set VR128:$dst,
1188 (and (vnot (bc_v2i64 (v2f64 VR128:$src1))),
1189 (bc_v2i64 (v2f64 VR128:$src2))))]>;
1190def ANDNPDrm : PDI<0x55, MRMSrcMem, (ops VR128:$dst, VR128:$src1,f128mem:$src2),
Evan Cheng2246f842006-03-18 01:23:20 +00001191 "andnpd {$src2, $dst|$dst, $src2}",
Evan Cheng5aa97b22006-03-29 18:47:40 +00001192 [(set VR128:$dst,
1193 (and (vnot (bc_v2i64 (v2f64 VR128:$src1))),
1194 (bc_v2i64 (loadv2f64 addr:$src2))))]>;
Evan Chengffcb95b2006-02-21 19:13:53 +00001195}
Evan Chengbf156d12006-02-21 19:26:52 +00001196
Evan Cheng470a6ad2006-02-22 02:26:30 +00001197let isTwoAddress = 1 in {
Evan Cheng21760462006-04-04 03:04:07 +00001198def CMPPSrr : PSIi8<0xC2, MRMSrcReg,
1199 (ops VR128:$dst, VR128:$src1, VR128:$src, SSECC:$cc),
1200 "cmp${cc}ps {$src, $dst|$dst, $src}",
1201 [(set VR128:$dst, (int_x86_sse_cmp_ps VR128:$src1,
1202 VR128:$src, imm:$cc))]>;
1203def CMPPSrm : PSIi8<0xC2, MRMSrcMem,
1204 (ops VR128:$dst, VR128:$src1, f128mem:$src, SSECC:$cc),
1205 "cmp${cc}ps {$src, $dst|$dst, $src}",
1206 [(set VR128:$dst, (int_x86_sse_cmp_ps VR128:$src1,
1207 (load addr:$src), imm:$cc))]>;
1208def CMPPDrr : PDIi8<0xC2, MRMSrcReg,
1209 (ops VR128:$dst, VR128:$src1, VR128:$src, SSECC:$cc),
Evan Chengbb5c43e2006-04-14 01:39:53 +00001210 "cmp${cc}pd {$src, $dst|$dst, $src}",
1211 [(set VR128:$dst, (int_x86_sse2_cmp_pd VR128:$src1,
1212 VR128:$src, imm:$cc))]>;
Evan Cheng21760462006-04-04 03:04:07 +00001213def CMPPDrm : PDIi8<0xC2, MRMSrcMem,
1214 (ops VR128:$dst, VR128:$src1, f128mem:$src, SSECC:$cc),
Evan Chengbb5c43e2006-04-14 01:39:53 +00001215 "cmp${cc}pd {$src, $dst|$dst, $src}",
1216 [(set VR128:$dst, (int_x86_sse2_cmp_pd VR128:$src1,
1217 (load addr:$src), imm:$cc))]>;
Evan Cheng470a6ad2006-02-22 02:26:30 +00001218}
1219
1220// Shuffle and unpack instructions
Evan Cheng0cea6d22006-03-22 20:08:18 +00001221let isTwoAddress = 1 in {
Evan Cheng2da953f2006-03-22 07:10:28 +00001222def SHUFPSrr : PSIi8<0xC6, MRMSrcReg,
Evan Cheng0038e592006-03-28 00:39:58 +00001223 (ops VR128:$dst, VR128:$src1, VR128:$src2, i32i8imm:$src3),
Evan Cheng14aed5e2006-03-24 01:18:28 +00001224 "shufps {$src3, $src2, $dst|$dst, $src2, $src3}",
Evan Cheng4f563382006-03-29 01:30:51 +00001225 [(set VR128:$dst, (v4f32 (vector_shuffle
1226 VR128:$src1, VR128:$src2,
1227 SHUFP_shuffle_mask:$src3)))]>;
Evan Cheng2da953f2006-03-22 07:10:28 +00001228def SHUFPSrm : PSIi8<0xC6, MRMSrcMem,
Evan Cheng0038e592006-03-28 00:39:58 +00001229 (ops VR128:$dst, VR128:$src1, f128mem:$src2, i32i8imm:$src3),
1230 "shufps {$src3, $src2, $dst|$dst, $src2, $src3}",
Evan Cheng4f563382006-03-29 01:30:51 +00001231 [(set VR128:$dst, (v4f32 (vector_shuffle
1232 VR128:$src1, (load addr:$src2),
1233 SHUFP_shuffle_mask:$src3)))]>;
Evan Cheng2da953f2006-03-22 07:10:28 +00001234def SHUFPDrr : PDIi8<0xC6, MRMSrcReg,
1235 (ops VR128:$dst, VR128:$src1, VR128:$src2, i8imm:$src3),
Evan Cheng14aed5e2006-03-24 01:18:28 +00001236 "shufpd {$src3, $src2, $dst|$dst, $src2, $src3}",
Evan Cheng4f563382006-03-29 01:30:51 +00001237 [(set VR128:$dst, (v2f64 (vector_shuffle
1238 VR128:$src1, VR128:$src2,
1239 SHUFP_shuffle_mask:$src3)))]>;
Evan Cheng2da953f2006-03-22 07:10:28 +00001240def SHUFPDrm : PDIi8<0xC6, MRMSrcMem,
1241 (ops VR128:$dst, VR128:$src1, f128mem:$src2, i8imm:$src3),
Evan Cheng0038e592006-03-28 00:39:58 +00001242 "shufpd {$src3, $src2, $dst|$dst, $src2, $src3}",
Evan Cheng4f563382006-03-29 01:30:51 +00001243 [(set VR128:$dst, (v2f64 (vector_shuffle
1244 VR128:$src1, (load addr:$src2),
1245 SHUFP_shuffle_mask:$src3)))]>;
Evan Cheng470a6ad2006-02-22 02:26:30 +00001246
1247def UNPCKHPSrr : PSI<0x15, MRMSrcReg,
Evan Cheng2246f842006-03-18 01:23:20 +00001248 (ops VR128:$dst, VR128:$src1, VR128:$src2),
Evan Cheng4fcb9222006-03-28 02:43:26 +00001249 "unpckhps {$src2, $dst|$dst, $src2}",
Evan Cheng4f563382006-03-29 01:30:51 +00001250 [(set VR128:$dst, (v4f32 (vector_shuffle
1251 VR128:$src1, VR128:$src2,
1252 UNPCKH_shuffle_mask)))]>;
Evan Cheng470a6ad2006-02-22 02:26:30 +00001253def UNPCKHPSrm : PSI<0x15, MRMSrcMem,
Evan Cheng2246f842006-03-18 01:23:20 +00001254 (ops VR128:$dst, VR128:$src1, f128mem:$src2),
Evan Cheng4fcb9222006-03-28 02:43:26 +00001255 "unpckhps {$src2, $dst|$dst, $src2}",
Evan Cheng4f563382006-03-29 01:30:51 +00001256 [(set VR128:$dst, (v4f32 (vector_shuffle
1257 VR128:$src1, (load addr:$src2),
1258 UNPCKH_shuffle_mask)))]>;
Evan Cheng470a6ad2006-02-22 02:26:30 +00001259def UNPCKHPDrr : PDI<0x15, MRMSrcReg,
Evan Cheng2246f842006-03-18 01:23:20 +00001260 (ops VR128:$dst, VR128:$src1, VR128:$src2),
Evan Cheng4fcb9222006-03-28 02:43:26 +00001261 "unpckhpd {$src2, $dst|$dst, $src2}",
Evan Cheng4f563382006-03-29 01:30:51 +00001262 [(set VR128:$dst, (v2f64 (vector_shuffle
1263 VR128:$src1, VR128:$src2,
1264 UNPCKH_shuffle_mask)))]>;
Evan Cheng470a6ad2006-02-22 02:26:30 +00001265def UNPCKHPDrm : PDI<0x15, MRMSrcMem,
Evan Cheng2246f842006-03-18 01:23:20 +00001266 (ops VR128:$dst, VR128:$src1, f128mem:$src2),
Evan Cheng4fcb9222006-03-28 02:43:26 +00001267 "unpckhpd {$src2, $dst|$dst, $src2}",
Evan Cheng4f563382006-03-29 01:30:51 +00001268 [(set VR128:$dst, (v2f64 (vector_shuffle
1269 VR128:$src1, (load addr:$src2),
1270 UNPCKH_shuffle_mask)))]>;
Evan Cheng4fcb9222006-03-28 02:43:26 +00001271
Evan Cheng470a6ad2006-02-22 02:26:30 +00001272def UNPCKLPSrr : PSI<0x14, MRMSrcReg,
Evan Cheng2246f842006-03-18 01:23:20 +00001273 (ops VR128:$dst, VR128:$src1, VR128:$src2),
Evan Chengc60bd972006-03-25 09:37:23 +00001274 "unpcklps {$src2, $dst|$dst, $src2}",
Evan Cheng4f563382006-03-29 01:30:51 +00001275 [(set VR128:$dst, (v4f32 (vector_shuffle
1276 VR128:$src1, VR128:$src2,
1277 UNPCKL_shuffle_mask)))]>;
Evan Cheng470a6ad2006-02-22 02:26:30 +00001278def UNPCKLPSrm : PSI<0x14, MRMSrcMem,
Evan Cheng2246f842006-03-18 01:23:20 +00001279 (ops VR128:$dst, VR128:$src1, f128mem:$src2),
Evan Chengc60bd972006-03-25 09:37:23 +00001280 "unpcklps {$src2, $dst|$dst, $src2}",
Evan Cheng4f563382006-03-29 01:30:51 +00001281 [(set VR128:$dst, (v4f32 (vector_shuffle
1282 VR128:$src1, (load addr:$src2),
1283 UNPCKL_shuffle_mask)))]>;
Evan Cheng470a6ad2006-02-22 02:26:30 +00001284def UNPCKLPDrr : PDI<0x14, MRMSrcReg,
Evan Cheng2246f842006-03-18 01:23:20 +00001285 (ops VR128:$dst, VR128:$src1, VR128:$src2),
Evan Cheng4fcb9222006-03-28 02:43:26 +00001286 "unpcklpd {$src2, $dst|$dst, $src2}",
Evan Cheng4f563382006-03-29 01:30:51 +00001287 [(set VR128:$dst, (v2f64 (vector_shuffle
1288 VR128:$src1, VR128:$src2,
1289 UNPCKL_shuffle_mask)))]>;
Evan Cheng470a6ad2006-02-22 02:26:30 +00001290def UNPCKLPDrm : PDI<0x14, MRMSrcMem,
Evan Cheng2246f842006-03-18 01:23:20 +00001291 (ops VR128:$dst, VR128:$src1, f128mem:$src2),
Evan Cheng4fcb9222006-03-28 02:43:26 +00001292 "unpcklpd {$src2, $dst|$dst, $src2}",
Evan Cheng4f563382006-03-29 01:30:51 +00001293 [(set VR128:$dst, (v2f64 (vector_shuffle
1294 VR128:$src1, (load addr:$src2),
1295 UNPCKL_shuffle_mask)))]>;
Evan Cheng2c0dbd02006-03-24 02:58:06 +00001296}
Evan Cheng470a6ad2006-02-22 02:26:30 +00001297
Evan Cheng4b1734f2006-03-31 21:29:33 +00001298// Horizontal ops
1299let isTwoAddress = 1 in {
Evan Chengd9539472006-04-14 21:59:03 +00001300def HADDPSrr : S3D_Intrr<0x7C, "haddps {$src2, $dst|$dst, $src2}",
Evan Cheng4b1734f2006-03-31 21:29:33 +00001301 int_x86_sse3_hadd_ps>;
Evan Chengd9539472006-04-14 21:59:03 +00001302def HADDPSrm : S3D_Intrm<0x7C, "haddps {$src2, $dst|$dst, $src2}",
Evan Cheng4b1734f2006-03-31 21:29:33 +00001303 int_x86_sse3_hadd_ps>;
Evan Chengd9539472006-04-14 21:59:03 +00001304def HADDPDrr : S3_Intrr<0x7C, "haddpd {$src2, $dst|$dst, $src2}",
Evan Cheng4b1734f2006-03-31 21:29:33 +00001305 int_x86_sse3_hadd_pd>;
Evan Chengd9539472006-04-14 21:59:03 +00001306def HADDPDrm : S3_Intrm<0x7C, "haddpd {$src2, $dst|$dst, $src2}",
Evan Cheng4b1734f2006-03-31 21:29:33 +00001307 int_x86_sse3_hadd_pd>;
Evan Cheng7076e2d2006-04-15 05:52:42 +00001308def HSUBPSrr : S3D_Intrr<0x7D, "hsubps {$src2, $dst|$dst, $src2}",
Evan Cheng4b1734f2006-03-31 21:29:33 +00001309 int_x86_sse3_hsub_ps>;
Evan Cheng7076e2d2006-04-15 05:52:42 +00001310def HSUBPSrm : S3D_Intrm<0x7D, "hsubps {$src2, $dst|$dst, $src2}",
Evan Cheng4b1734f2006-03-31 21:29:33 +00001311 int_x86_sse3_hsub_ps>;
Evan Cheng7076e2d2006-04-15 05:52:42 +00001312def HSUBPDrr : S3_Intrr<0x7D, "hsubpd {$src2, $dst|$dst, $src2}",
Evan Cheng4b1734f2006-03-31 21:29:33 +00001313 int_x86_sse3_hsub_pd>;
Evan Cheng7076e2d2006-04-15 05:52:42 +00001314def HSUBPDrm : S3_Intrm<0x7D, "hsubpd {$src2, $dst|$dst, $src2}",
Evan Cheng4b1734f2006-03-31 21:29:33 +00001315 int_x86_sse3_hsub_pd>;
1316}
1317
Evan Chengbf156d12006-02-21 19:26:52 +00001318//===----------------------------------------------------------------------===//
Evan Cheng4e4c71e2006-02-21 20:00:20 +00001319// SSE integer instructions
Evan Chengbf156d12006-02-21 19:26:52 +00001320//===----------------------------------------------------------------------===//
1321
Evan Cheng4e4c71e2006-02-21 20:00:20 +00001322// Move Instructions
Evan Cheng24dc1f52006-03-23 07:44:07 +00001323def MOVDQArr : PDI<0x6F, MRMSrcReg, (ops VR128:$dst, VR128:$src),
1324 "movdqa {$src, $dst|$dst, $src}", []>;
1325def MOVDQArm : PDI<0x6F, MRMSrcMem, (ops VR128:$dst, i128mem:$src),
1326 "movdqa {$src, $dst|$dst, $src}",
Evan Cheng91b740d2006-04-12 17:12:36 +00001327 [(set VR128:$dst, (loadv2i64 addr:$src))]>;
Evan Cheng24dc1f52006-03-23 07:44:07 +00001328def MOVDQAmr : PDI<0x7F, MRMDestMem, (ops i128mem:$dst, VR128:$src),
1329 "movdqa {$src, $dst|$dst, $src}",
Evan Cheng91b740d2006-04-12 17:12:36 +00001330 [(store (v2i64 VR128:$src), addr:$dst)]>;
Evan Cheng9ab1ac52006-04-14 23:32:40 +00001331def MOVDQUrm : I<0x6F, MRMSrcMem, (ops VR128:$dst, i128mem:$src),
1332 "movdqu {$src, $dst|$dst, $src}",
1333 [(set VR128:$dst, (int_x86_sse2_loadu_dq addr:$src))]>,
1334 XS, Requires<[HasSSE2]>;
1335def MOVDQUmr : I<0x7F, MRMDestMem, (ops i128mem:$dst, VR128:$src),
1336 "movdqu {$src, $dst|$dst, $src}",
1337 [(int_x86_sse2_storeu_dq addr:$dst, VR128:$src)]>,
1338 XS, Requires<[HasSSE2]>;
1339def LDDQUrm : S3DI<0xF0, MRMSrcMem, (ops VR128:$dst, i128mem:$src),
1340 "lddqu {$src, $dst|$dst, $src}",
1341 [(set VR128:$dst, (int_x86_sse3_ldu_dq addr:$src))]>;
Evan Cheng24dc1f52006-03-23 07:44:07 +00001342
Evan Chenga971f6f2006-03-23 01:57:24 +00001343// 128-bit Integer Arithmetic
1344let isTwoAddress = 1 in {
1345let isCommutable = 1 in {
1346def PADDBrr : PDI<0xFC, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
1347 "paddb {$src2, $dst|$dst, $src2}",
1348 [(set VR128:$dst, (v16i8 (add VR128:$src1, VR128:$src2)))]>;
1349def PADDWrr : PDI<0xFD, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
1350 "paddw {$src2, $dst|$dst, $src2}",
1351 [(set VR128:$dst, (v8i16 (add VR128:$src1, VR128:$src2)))]>;
1352def PADDDrr : PDI<0xFE, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
1353 "paddd {$src2, $dst|$dst, $src2}",
1354 [(set VR128:$dst, (v4i32 (add VR128:$src1, VR128:$src2)))]>;
Evan Cheng506d3df2006-03-29 23:07:14 +00001355
1356def PADDQrr : PDI<0xD4, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
1357 "paddq {$src2, $dst|$dst, $src2}",
1358 [(set VR128:$dst, (v2i64 (add VR128:$src1, VR128:$src2)))]>;
Evan Chenga971f6f2006-03-23 01:57:24 +00001359}
Evan Cheng49ac1bf2006-04-13 00:43:35 +00001360def PADDBrm : PDI<0xFC, MRMSrcMem, (ops VR128:$dst, VR128:$src1, i128mem:$src2),
Evan Chenga971f6f2006-03-23 01:57:24 +00001361 "paddb {$src2, $dst|$dst, $src2}",
1362 [(set VR128:$dst, (v16i8 (add VR128:$src1,
1363 (load addr:$src2))))]>;
Evan Cheng49ac1bf2006-04-13 00:43:35 +00001364def PADDWrm : PDI<0xFD, MRMSrcMem, (ops VR128:$dst, VR128:$src1, i128mem:$src2),
Evan Chenga971f6f2006-03-23 01:57:24 +00001365 "paddw {$src2, $dst|$dst, $src2}",
1366 [(set VR128:$dst, (v8i16 (add VR128:$src1,
1367 (load addr:$src2))))]>;
Evan Cheng49ac1bf2006-04-13 00:43:35 +00001368def PADDDrm : PDI<0xFE, MRMSrcMem, (ops VR128:$dst, VR128:$src1, i128mem:$src2),
Evan Chenga971f6f2006-03-23 01:57:24 +00001369 "paddd {$src2, $dst|$dst, $src2}",
1370 [(set VR128:$dst, (v4i32 (add VR128:$src1,
1371 (load addr:$src2))))]>;
Evan Cheng49ac1bf2006-04-13 00:43:35 +00001372def PADDQrm : PDI<0xD4, MRMSrcMem, (ops VR128:$dst, VR128:$src1, i128mem:$src2),
Evan Cheng506d3df2006-03-29 23:07:14 +00001373 "paddd {$src2, $dst|$dst, $src2}",
1374 [(set VR128:$dst, (v2i64 (add VR128:$src1,
1375 (load addr:$src2))))]>;
Evan Cheng7b1d34b2006-03-25 01:33:37 +00001376
Evan Cheng49ac1bf2006-04-13 00:43:35 +00001377let isCommutable = 1 in {
1378def PADDSBrr : PDI<0xEC, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
1379 "paddsb {$src2, $dst|$dst, $src2}",
1380 [(set VR128:$dst, (int_x86_sse2_padds_b VR128:$src1,
1381 VR128:$src2))]>;
1382def PADDSWrr : PDI<0xED, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
1383 "paddsw {$src2, $dst|$dst, $src2}",
1384 [(set VR128:$dst, (int_x86_sse2_padds_w VR128:$src1,
1385 VR128:$src2))]>;
1386def PADDUSBrr : PDI<0xDC, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
1387 "paddusb {$src2, $dst|$dst, $src2}",
1388 [(set VR128:$dst, (int_x86_sse2_paddus_b VR128:$src1,
1389 VR128:$src2))]>;
1390def PADDUSWrr : PDI<0xDD, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
1391 "paddusw {$src2, $dst|$dst, $src2}",
1392 [(set VR128:$dst, (int_x86_sse2_paddus_w VR128:$src1,
1393 VR128:$src2))]>;
1394}
1395def PADDSBrm : PDI<0xEC, MRMSrcMem, (ops VR128:$dst, VR128:$src1, i128mem:$src2),
1396 "paddsb {$src2, $dst|$dst, $src2}",
1397 [(set VR128:$dst, (int_x86_sse2_padds_b VR128:$src1,
1398 (bc_v16i8 (loadv2i64 addr:$src2))))]>;
1399def PADDSWrm : PDI<0xED, MRMSrcMem, (ops VR128:$dst, VR128:$src1, i128mem:$src2),
1400 "paddsw {$src2, $dst|$dst, $src2}",
1401 [(set VR128:$dst, (int_x86_sse2_padds_w VR128:$src1,
1402 (bc_v8i16 (loadv2i64 addr:$src2))))]>;
1403def PADDUSBrm : PDI<0xDC, MRMSrcMem, (ops VR128:$dst, VR128:$src1, i128mem:$src2),
1404 "paddusb {$src2, $dst|$dst, $src2}",
1405 [(set VR128:$dst, (int_x86_sse2_paddus_b VR128:$src1,
1406 (bc_v16i8 (loadv2i64 addr:$src2))))]>;
1407def PADDUSWrm : PDI<0xDD, MRMSrcMem, (ops VR128:$dst, VR128:$src1, i128mem:$src2),
1408 "paddusw {$src2, $dst|$dst, $src2}",
1409 [(set VR128:$dst, (int_x86_sse2_paddus_w VR128:$src1,
1410 (bc_v8i16 (loadv2i64 addr:$src2))))]>;
1411
1412
Evan Cheng7b1d34b2006-03-25 01:33:37 +00001413def PSUBBrr : PDI<0xF8, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
1414 "psubb {$src2, $dst|$dst, $src2}",
1415 [(set VR128:$dst, (v16i8 (sub VR128:$src1, VR128:$src2)))]>;
1416def PSUBWrr : PDI<0xF9, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
1417 "psubw {$src2, $dst|$dst, $src2}",
1418 [(set VR128:$dst, (v8i16 (sub VR128:$src1, VR128:$src2)))]>;
1419def PSUBDrr : PDI<0xFA, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
1420 "psubd {$src2, $dst|$dst, $src2}",
1421 [(set VR128:$dst, (v4i32 (sub VR128:$src1, VR128:$src2)))]>;
Evan Cheng506d3df2006-03-29 23:07:14 +00001422def PSUBQrr : PDI<0xFB, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
1423 "psubq {$src2, $dst|$dst, $src2}",
1424 [(set VR128:$dst, (v2i64 (sub VR128:$src1, VR128:$src2)))]>;
Evan Cheng7b1d34b2006-03-25 01:33:37 +00001425
Evan Cheng49ac1bf2006-04-13 00:43:35 +00001426def PSUBBrm : PDI<0xF8, MRMSrcMem, (ops VR128:$dst, VR128:$src1, i128mem:$src2),
Evan Cheng7b1d34b2006-03-25 01:33:37 +00001427 "psubb {$src2, $dst|$dst, $src2}",
1428 [(set VR128:$dst, (v16i8 (sub VR128:$src1,
1429 (load addr:$src2))))]>;
Evan Cheng49ac1bf2006-04-13 00:43:35 +00001430def PSUBWrm : PDI<0xF9, MRMSrcMem, (ops VR128:$dst, VR128:$src1, i128mem:$src2),
Evan Cheng7b1d34b2006-03-25 01:33:37 +00001431 "psubw {$src2, $dst|$dst, $src2}",
1432 [(set VR128:$dst, (v8i16 (sub VR128:$src1,
1433 (load addr:$src2))))]>;
Evan Cheng49ac1bf2006-04-13 00:43:35 +00001434def PSUBDrm : PDI<0xFA, MRMSrcMem, (ops VR128:$dst, VR128:$src1, i128mem:$src2),
Evan Cheng7b1d34b2006-03-25 01:33:37 +00001435 "psubd {$src2, $dst|$dst, $src2}",
1436 [(set VR128:$dst, (v4i32 (sub VR128:$src1,
1437 (load addr:$src2))))]>;
Evan Cheng49ac1bf2006-04-13 00:43:35 +00001438def PSUBQrm : PDI<0xFB, MRMSrcMem, (ops VR128:$dst, VR128:$src1, i128mem:$src2),
Evan Cheng506d3df2006-03-29 23:07:14 +00001439 "psubd {$src2, $dst|$dst, $src2}",
1440 [(set VR128:$dst, (v2i64 (sub VR128:$src1,
1441 (load addr:$src2))))]>;
Evan Cheng49ac1bf2006-04-13 00:43:35 +00001442
1443def PSUBSBrr : PDI<0xE8, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
1444 "psubsb {$src2, $dst|$dst, $src2}",
1445 [(set VR128:$dst, (int_x86_sse2_psubs_b VR128:$src1,
1446 VR128:$src2))]>;
1447def PSUBSWrr : PDI<0xE9, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
1448 "psubsw {$src2, $dst|$dst, $src2}",
1449 [(set VR128:$dst, (int_x86_sse2_psubs_w VR128:$src1,
1450 VR128:$src2))]>;
1451def PSUBUSBrr : PDI<0xD8, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
1452 "psubusb {$src2, $dst|$dst, $src2}",
1453 [(set VR128:$dst, (int_x86_sse2_psubus_b VR128:$src1,
1454 VR128:$src2))]>;
1455def PSUBUSWrr : PDI<0xD9, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
1456 "psubusw {$src2, $dst|$dst, $src2}",
1457 [(set VR128:$dst, (int_x86_sse2_psubus_w VR128:$src1,
1458 VR128:$src2))]>;
1459
Evan Cheng2f40b1b2006-04-13 05:24:54 +00001460def PSUBSBrm : PDI<0xE8, MRMSrcMem,
1461 (ops VR128:$dst, VR128:$src1, i128mem:$src2),
Evan Cheng49ac1bf2006-04-13 00:43:35 +00001462 "psubsb {$src2, $dst|$dst, $src2}",
1463 [(set VR128:$dst, (int_x86_sse2_psubs_b VR128:$src1,
1464 (bc_v16i8 (loadv2i64 addr:$src2))))]>;
Evan Cheng2f40b1b2006-04-13 05:24:54 +00001465def PSUBSWrm : PDI<0xE9, MRMSrcMem,
1466 (ops VR128:$dst, VR128:$src1, i128mem:$src2),
Evan Cheng49ac1bf2006-04-13 00:43:35 +00001467 "psubsw {$src2, $dst|$dst, $src2}",
1468 [(set VR128:$dst, (int_x86_sse2_psubs_w VR128:$src1,
1469 (bc_v8i16 (loadv2i64 addr:$src2))))]>;
Evan Cheng2f40b1b2006-04-13 05:24:54 +00001470def PSUBUSBrm : PDI<0xD8, MRMSrcMem,
1471 (ops VR128:$dst, VR128:$src1, i128mem:$src2),
Evan Cheng49ac1bf2006-04-13 00:43:35 +00001472 "psubusb {$src2, $dst|$dst, $src2}",
1473 [(set VR128:$dst, (int_x86_sse2_psubus_b VR128:$src1,
1474 (bc_v16i8 (loadv2i64 addr:$src2))))]>;
Evan Cheng2f40b1b2006-04-13 05:24:54 +00001475def PSUBUSWrm : PDI<0xD9, MRMSrcMem,
1476 (ops VR128:$dst, VR128:$src1, i128mem:$src2),
Evan Cheng49ac1bf2006-04-13 00:43:35 +00001477 "psubusw {$src2, $dst|$dst, $src2}",
1478 [(set VR128:$dst, (int_x86_sse2_psubus_w VR128:$src1,
1479 (bc_v8i16 (loadv2i64 addr:$src2))))]>;
Evan Cheng2f40b1b2006-04-13 05:24:54 +00001480
1481let isCommutable = 1 in {
1482def PMULHUWrr : PDI<0xE4, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
1483 "pmulhuw {$src2, $dst|$dst, $src2}",
1484 [(set VR128:$dst, (int_x86_sse2_pmulhu_w VR128:$src1,
1485 VR128:$src2))]>;
1486def PMULHWrr : PDI<0xE5, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
1487 "pmulhw {$src2, $dst|$dst, $src2}",
1488 [(set VR128:$dst, (int_x86_sse2_pmulh_w VR128:$src1,
1489 VR128:$src2))]>;
1490def PMULLWrr : PDI<0xD5, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
1491 "pmullw {$src2, $dst|$dst, $src2}",
1492 [(set VR128:$dst, (v8i16 (mul VR128:$src1, VR128:$src2)))]>;
1493def PMULUDQrr : PDI<0xF4, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
1494 "pmuludq {$src2, $dst|$dst, $src2}",
1495 [(set VR128:$dst, (int_x86_sse2_pmulu_dq VR128:$src1,
1496 VR128:$src2))]>;
1497}
Evan Cheng2f40b1b2006-04-13 05:24:54 +00001498def PMULHUWrm : PDI<0xE4, MRMSrcMem, (ops VR128:$dst, VR128:$src1, i128mem:$src2),
1499 "pmulhuw {$src2, $dst|$dst, $src2}",
1500 [(set VR128:$dst, (int_x86_sse2_pmulhu_w VR128:$src1,
1501 (bc_v8i16 (loadv2i64 addr:$src2))))]>;
1502def PMULHWrm : PDI<0xE5, MRMSrcMem, (ops VR128:$dst, VR128:$src1, i128mem:$src2),
1503 "pmulhw {$src2, $dst|$dst, $src2}",
1504 [(set VR128:$dst, (int_x86_sse2_pmulh_w VR128:$src1,
1505 (bc_v8i16 (loadv2i64 addr:$src2))))]>;
1506def PMULLWrm : PDI<0xD5, MRMSrcMem,
1507 (ops VR128:$dst, VR128:$src1, i128mem:$src2),
1508 "pmullw {$src2, $dst|$dst, $src2}",
1509 [(set VR128:$dst, (v8i16 (mul VR128:$src1,
1510 (bc_v8i16 (loadv2i64 addr:$src2)))))]>;
1511def PMULUDQrm : PDI<0xF4, MRMSrcMem, (ops VR128:$dst, VR128:$src1, i128mem:$src2),
1512 "pmuludq {$src2, $dst|$dst, $src2}",
1513 [(set VR128:$dst, (int_x86_sse2_pmulu_dq VR128:$src1,
1514 (bc_v4i32 (loadv2i64 addr:$src2))))]>;
1515
Evan Cheng00586942006-04-13 06:11:45 +00001516let isCommutable = 1 in {
Evan Cheng2f40b1b2006-04-13 05:24:54 +00001517def PMADDWDrr : PDI<0xF5, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
1518 "pmaddwd {$src2, $dst|$dst, $src2}",
1519 [(set VR128:$dst, (int_x86_sse2_pmadd_wd VR128:$src1,
1520 VR128:$src2))]>;
Evan Cheng00586942006-04-13 06:11:45 +00001521}
Evan Cheng2f40b1b2006-04-13 05:24:54 +00001522def PMADDWDrm : PDI<0xF5, MRMSrcMem,
1523 (ops VR128:$dst, VR128:$src1, i128mem:$src2),
1524 "pmaddwd {$src2, $dst|$dst, $src2}",
1525 [(set VR128:$dst, (int_x86_sse2_pmadd_wd VR128:$src1,
1526 (bc_v8i16 (loadv2i64 addr:$src2))))]>;
1527
Evan Cheng00586942006-04-13 06:11:45 +00001528let isCommutable = 1 in {
Evan Cheng2f40b1b2006-04-13 05:24:54 +00001529def PAVGBrr : PDI<0xE0, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
1530 "pavgb {$src2, $dst|$dst, $src2}",
1531 [(set VR128:$dst, (int_x86_sse2_pavg_b VR128:$src1,
1532 VR128:$src2))]>;
1533def PAVGWrr : PDI<0xE3, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
1534 "pavgw {$src2, $dst|$dst, $src2}",
1535 [(set VR128:$dst, (int_x86_sse2_pavg_w VR128:$src1,
1536 VR128:$src2))]>;
Evan Cheng00586942006-04-13 06:11:45 +00001537}
Evan Cheng2f40b1b2006-04-13 05:24:54 +00001538def PAVGBrm : PDI<0xE0, MRMSrcMem, (ops VR128:$dst, VR128:$src1, i128mem:$src2),
1539 "pavgb {$src2, $dst|$dst, $src2}",
1540 [(set VR128:$dst, (int_x86_sse2_pavg_b VR128:$src1,
1541 (bc_v16i8 (loadv2i64 addr:$src2))))]>;
1542def PAVGWrm : PDI<0xE3, MRMSrcMem, (ops VR128:$dst, VR128:$src1, i128mem:$src2),
1543 "pavgw {$src2, $dst|$dst, $src2}",
1544 [(set VR128:$dst, (int_x86_sse2_pavg_w VR128:$src1,
1545 (bc_v8i16 (loadv2i64 addr:$src2))))]>;
Evan Cheng00586942006-04-13 06:11:45 +00001546
1547let isCommutable = 1 in {
1548def PMAXUBrr : PDI<0xDE, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
1549 "pmaxub {$src2, $dst|$dst, $src2}",
1550 [(set VR128:$dst, (int_x86_sse2_pmaxu_b VR128:$src1,
1551 VR128:$src2))]>;
1552def PMAXSWrr : PDI<0xEE, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
1553 "pmaxsw {$src2, $dst|$dst, $src2}",
1554 [(set VR128:$dst, (int_x86_sse2_pmaxs_w VR128:$src1,
1555 VR128:$src2))]>;
1556}
1557def PMAXUBrm : PDI<0xDE, MRMSrcMem, (ops VR128:$dst, VR128:$src1, i128mem:$src2),
1558 "pmaxub {$src2, $dst|$dst, $src2}",
1559 [(set VR128:$dst, (int_x86_sse2_pmaxu_b VR128:$src1,
1560 (bc_v16i8 (loadv2i64 addr:$src2))))]>;
1561def PMAXSWrm : PDI<0xEE, MRMSrcMem, (ops VR128:$dst, VR128:$src1, i128mem:$src2),
1562 "pmaxsw {$src2, $dst|$dst, $src2}",
1563 [(set VR128:$dst, (int_x86_sse2_pmaxs_w VR128:$src1,
1564 (bc_v8i16 (loadv2i64 addr:$src2))))]>;
1565
1566let isCommutable = 1 in {
1567def PMINUBrr : PDI<0xDA, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
1568 "pminub {$src2, $dst|$dst, $src2}",
1569 [(set VR128:$dst, (int_x86_sse2_pminu_b VR128:$src1,
1570 VR128:$src2))]>;
1571def PMINSWrr : PDI<0xEA, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
1572 "pminsw {$src2, $dst|$dst, $src2}",
1573 [(set VR128:$dst, (int_x86_sse2_pmins_w VR128:$src1,
1574 VR128:$src2))]>;
1575}
1576def PMINUBrm : PDI<0xDA, MRMSrcMem, (ops VR128:$dst, VR128:$src1, i128mem:$src2),
1577 "pminub {$src2, $dst|$dst, $src2}",
1578 [(set VR128:$dst, (int_x86_sse2_pminu_b VR128:$src1,
1579 (bc_v16i8 (loadv2i64 addr:$src2))))]>;
1580def PMINSWrm : PDI<0xEA, MRMSrcMem, (ops VR128:$dst, VR128:$src1, i128mem:$src2),
1581 "pminsw {$src2, $dst|$dst, $src2}",
1582 [(set VR128:$dst, (int_x86_sse2_pmins_w VR128:$src1,
1583 (bc_v8i16 (loadv2i64 addr:$src2))))]>;
1584
1585
1586let isCommutable = 1 in {
1587def PSADBWrr : PDI<0xE0, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
1588 "psadbw {$src2, $dst|$dst, $src2}",
1589 [(set VR128:$dst, (int_x86_sse2_psad_bw VR128:$src1,
1590 VR128:$src2))]>;
1591}
1592def PSADBWrm : PDI<0xE0, MRMSrcMem, (ops VR128:$dst, VR128:$src1, i128mem:$src2),
1593 "psadbw {$src2, $dst|$dst, $src2}",
1594 [(set VR128:$dst, (int_x86_sse2_psad_bw VR128:$src1,
1595 (bc_v16i8 (loadv2i64 addr:$src2))))]>;
Evan Cheng506d3df2006-03-29 23:07:14 +00001596}
Evan Chengc60bd972006-03-25 09:37:23 +00001597
Evan Chengff65e382006-04-04 21:49:39 +00001598let isTwoAddress = 1 in {
Evan Cheng0ac8ea92006-04-14 00:14:05 +00001599def PSLLWrr : PDIi8<0xF1, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
1600 "psllw {$src2, $dst|$dst, $src2}",
1601 [(set VR128:$dst, (int_x86_sse2_psll_w VR128:$src1,
1602 VR128:$src2))]>;
Evan Cheng1af18982006-04-15 05:59:08 +00001603def PSLLWrm : PDIi8<0xF1, MRMSrcMem, (ops VR128:$dst, VR128:$src1, i128mem:$src2),
Evan Cheng0ac8ea92006-04-14 00:14:05 +00001604 "psllw {$src2, $dst|$dst, $src2}",
1605 [(set VR128:$dst, (int_x86_sse2_psll_w VR128:$src1,
1606 (bc_v4i32 (loadv2i64 addr:$src2))))]>;
1607def PSLLWri : PDIi8<0x71, MRM6r, (ops VR128:$dst, VR128:$src1, i32i8imm:$src2),
1608 "psllw {$src2, $dst|$dst, $src2}",
1609 [(set VR128:$dst, (int_x86_sse2_psll_w VR128:$src1,
1610 (scalar_to_vector (i32 imm:$src2))))]>;
1611def PSLLDrr : PDIi8<0xF2, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
1612 "pslld {$src2, $dst|$dst, $src2}",
1613 [(set VR128:$dst, (int_x86_sse2_psll_d VR128:$src1,
1614 VR128:$src2))]>;
Evan Cheng1af18982006-04-15 05:59:08 +00001615def PSLLDrm : PDIi8<0xF2, MRMSrcMem, (ops VR128:$dst, VR128:$src1, i128mem:$src2),
Evan Cheng0ac8ea92006-04-14 00:14:05 +00001616 "pslld {$src2, $dst|$dst, $src2}",
1617 [(set VR128:$dst, (int_x86_sse2_psll_d VR128:$src1,
1618 (bc_v4i32 (loadv2i64 addr:$src2))))]>;
1619def PSLLDri : PDIi8<0x72, MRM6r, (ops VR128:$dst, VR128:$src1, i32i8imm:$src2),
1620 "pslld {$src2, $dst|$dst, $src2}",
1621 [(set VR128:$dst, (int_x86_sse2_psll_d VR128:$src1,
1622 (scalar_to_vector (i32 imm:$src2))))]>;
1623def PSLLQrr : PDIi8<0xF3, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
1624 "psllq {$src2, $dst|$dst, $src2}",
1625 [(set VR128:$dst, (int_x86_sse2_psll_q VR128:$src1,
1626 VR128:$src2))]>;
Evan Cheng1af18982006-04-15 05:59:08 +00001627def PSLLQrm : PDIi8<0xF3, MRMSrcMem, (ops VR128:$dst, VR128:$src1, i128mem:$src2),
Evan Cheng0ac8ea92006-04-14 00:14:05 +00001628 "psllq {$src2, $dst|$dst, $src2}",
1629 [(set VR128:$dst, (int_x86_sse2_psll_q VR128:$src1,
1630 (bc_v4i32 (loadv2i64 addr:$src2))))]>;
1631def PSLLQri : PDIi8<0x73, MRM6r, (ops VR128:$dst, VR128:$src1, i32i8imm:$src2),
1632 "psllq {$src2, $dst|$dst, $src2}",
1633 [(set VR128:$dst, (int_x86_sse2_psll_q VR128:$src1,
1634 (scalar_to_vector (i32 imm:$src2))))]>;
Evan Chengff65e382006-04-04 21:49:39 +00001635def PSLLDQri : PDIi8<0x73, MRM7r, (ops VR128:$dst, VR128:$src1, i32i8imm:$src2),
1636 "pslldq {$src2, $dst|$dst, $src2}", []>;
Evan Cheng0ac8ea92006-04-14 00:14:05 +00001637
1638def PSRLWrr : PDIi8<0xD1, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
1639 "psrlw {$src2, $dst|$dst, $src2}",
1640 [(set VR128:$dst, (int_x86_sse2_psrl_w VR128:$src1,
1641 VR128:$src2))]>;
Evan Cheng1af18982006-04-15 05:59:08 +00001642def PSRLWrm : PDIi8<0xD1, MRMSrcMem, (ops VR128:$dst, VR128:$src1, i128mem:$src2),
Evan Cheng0ac8ea92006-04-14 00:14:05 +00001643 "psrlw {$src2, $dst|$dst, $src2}",
1644 [(set VR128:$dst, (int_x86_sse2_psrl_w VR128:$src1,
1645 (bc_v4i32 (loadv2i64 addr:$src2))))]>;
1646def PSRLWri : PDIi8<0x71, MRM2r, (ops VR128:$dst, VR128:$src1, i32i8imm:$src2),
1647 "psrlw {$src2, $dst|$dst, $src2}",
1648 [(set VR128:$dst, (int_x86_sse2_psrl_w VR128:$src1,
1649 (scalar_to_vector (i32 imm:$src2))))]>;
1650def PSRLDrr : PDIi8<0xD2, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
1651 "psrld {$src2, $dst|$dst, $src2}",
1652 [(set VR128:$dst, (int_x86_sse2_psrl_d VR128:$src1,
1653 VR128:$src2))]>;
Evan Cheng1af18982006-04-15 05:59:08 +00001654def PSRLDrm : PDIi8<0xD2, MRMSrcMem, (ops VR128:$dst, VR128:$src1, i128mem:$src2),
Evan Cheng0ac8ea92006-04-14 00:14:05 +00001655 "psrld {$src2, $dst|$dst, $src2}",
1656 [(set VR128:$dst, (int_x86_sse2_psrl_d VR128:$src1,
1657 (bc_v4i32 (loadv2i64 addr:$src2))))]>;
1658def PSRLDri : PDIi8<0x72, MRM2r, (ops VR128:$dst, VR128:$src1, i32i8imm:$src2),
1659 "psrld {$src2, $dst|$dst, $src2}",
1660 [(set VR128:$dst, (int_x86_sse2_psrl_d VR128:$src1,
1661 (scalar_to_vector (i32 imm:$src2))))]>;
1662def PSRLQrr : PDIi8<0xD3, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
1663 "psrlq {$src2, $dst|$dst, $src2}",
1664 [(set VR128:$dst, (int_x86_sse2_psrl_q VR128:$src1,
1665 VR128:$src2))]>;
Evan Cheng1af18982006-04-15 05:59:08 +00001666def PSRLQrm : PDIi8<0xD3, MRMSrcMem, (ops VR128:$dst, VR128:$src1, i128mem:$src2),
Evan Cheng0ac8ea92006-04-14 00:14:05 +00001667 "psrlq {$src2, $dst|$dst, $src2}",
1668 [(set VR128:$dst, (int_x86_sse2_psrl_q VR128:$src1,
1669 (bc_v4i32 (loadv2i64 addr:$src2))))]>;
1670def PSRLQri : PDIi8<0x73, MRM2r, (ops VR128:$dst, VR128:$src1, i32i8imm:$src2),
1671 "psrlq {$src2, $dst|$dst, $src2}",
1672 [(set VR128:$dst, (int_x86_sse2_psrl_q VR128:$src1,
1673 (scalar_to_vector (i32 imm:$src2))))]>;
1674def PSRLDQri : PDIi8<0x73, MRM3r, (ops VR128:$dst, VR128:$src1, i32i8imm:$src2),
Evan Chengff65e382006-04-04 21:49:39 +00001675 "psrldq {$src2, $dst|$dst, $src2}", []>;
Evan Cheng0ac8ea92006-04-14 00:14:05 +00001676
1677def PSRAWrr : PDIi8<0xE1, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
1678 "psraw {$src2, $dst|$dst, $src2}",
1679 [(set VR128:$dst, (int_x86_sse2_psra_w VR128:$src1,
1680 VR128:$src2))]>;
Evan Cheng1af18982006-04-15 05:59:08 +00001681def PSRAWrm : PDIi8<0xE1, MRMSrcMem, (ops VR128:$dst, VR128:$src1, i128mem:$src2),
Evan Cheng0ac8ea92006-04-14 00:14:05 +00001682 "psraw {$src2, $dst|$dst, $src2}",
1683 [(set VR128:$dst, (int_x86_sse2_psra_w VR128:$src1,
1684 (bc_v4i32 (loadv2i64 addr:$src2))))]>;
1685def PSRAWri : PDIi8<0x71, MRM4r, (ops VR128:$dst, VR128:$src1, i32i8imm:$src2),
1686 "psraw {$src2, $dst|$dst, $src2}",
1687 [(set VR128:$dst, (int_x86_sse2_psra_w VR128:$src1,
1688 (scalar_to_vector (i32 imm:$src2))))]>;
1689def PSRADrr : PDIi8<0xE2, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
1690 "psrad {$src2, $dst|$dst, $src2}",
1691 [(set VR128:$dst, (int_x86_sse2_psra_d VR128:$src1,
1692 VR128:$src2))]>;
Evan Cheng1af18982006-04-15 05:59:08 +00001693def PSRADrm : PDIi8<0xE2, MRMSrcMem, (ops VR128:$dst, VR128:$src1, i128mem:$src2),
Evan Cheng0ac8ea92006-04-14 00:14:05 +00001694 "psrad {$src2, $dst|$dst, $src2}",
1695 [(set VR128:$dst, (int_x86_sse2_psra_d VR128:$src1,
1696 (bc_v4i32 (loadv2i64 addr:$src2))))]>;
1697def PSRADri : PDIi8<0x72, MRM4r, (ops VR128:$dst, VR128:$src1, i32i8imm:$src2),
1698 "psrad {$src2, $dst|$dst, $src2}",
1699 [(set VR128:$dst, (int_x86_sse2_psra_d VR128:$src1,
1700 (scalar_to_vector (i32 imm:$src2))))]>;
Evan Chengff65e382006-04-04 21:49:39 +00001701}
1702
Evan Cheng506d3df2006-03-29 23:07:14 +00001703// Logical
1704let isTwoAddress = 1 in {
1705let isCommutable = 1 in {
1706def PANDrr : PDI<0xDB, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
1707 "pand {$src2, $dst|$dst, $src2}",
1708 [(set VR128:$dst, (v2i64 (and VR128:$src1, VR128:$src2)))]>;
Evan Cheng2b21ac62006-04-13 18:11:28 +00001709def PORrr : PDI<0xEB, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
1710 "por {$src2, $dst|$dst, $src2}",
1711 [(set VR128:$dst, (v2i64 (or VR128:$src1, VR128:$src2)))]>;
1712def PXORrr : PDI<0xEF, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
1713 "pxor {$src2, $dst|$dst, $src2}",
1714 [(set VR128:$dst, (v2i64 (xor VR128:$src1, VR128:$src2)))]>;
1715}
Evan Cheng506d3df2006-03-29 23:07:14 +00001716
1717def PANDrm : PDI<0xDB, MRMSrcMem, (ops VR128:$dst, VR128:$src1, i128mem:$src2),
1718 "pand {$src2, $dst|$dst, $src2}",
1719 [(set VR128:$dst, (v2i64 (and VR128:$src1,
1720 (load addr:$src2))))]>;
Evan Chengc6cb5bb2006-04-06 01:49:20 +00001721def PORrm : PDI<0xEB, MRMSrcMem, (ops VR128:$dst, VR128:$src1, i128mem:$src2),
Evan Cheng506d3df2006-03-29 23:07:14 +00001722 "por {$src2, $dst|$dst, $src2}",
1723 [(set VR128:$dst, (v2i64 (or VR128:$src1,
1724 (load addr:$src2))))]>;
Evan Cheng506d3df2006-03-29 23:07:14 +00001725def PXORrm : PDI<0xEF, MRMSrcMem, (ops VR128:$dst, VR128:$src1, i128mem:$src2),
1726 "pxor {$src2, $dst|$dst, $src2}",
1727 [(set VR128:$dst, (v2i64 (xor VR128:$src1,
1728 (load addr:$src2))))]>;
Evan Cheng506d3df2006-03-29 23:07:14 +00001729
1730def PANDNrr : PDI<0xDF, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
1731 "pandn {$src2, $dst|$dst, $src2}",
1732 [(set VR128:$dst, (v2i64 (and (vnot VR128:$src1),
1733 VR128:$src2)))]>;
1734
1735def PANDNrm : PDI<0xDF, MRMSrcMem, (ops VR128:$dst, VR128:$src1, i128mem:$src2),
1736 "pandn {$src2, $dst|$dst, $src2}",
1737 [(set VR128:$dst, (v2i64 (and (vnot VR128:$src1),
1738 (load addr:$src2))))]>;
1739}
1740
Evan Cheng9ab1ac52006-04-14 23:32:40 +00001741// SSE2 Integer comparison
1742let isTwoAddress = 1 in {
1743def PCMPEQBrr : PDI<0x74, MRMSrcReg,
1744 (ops VR128:$dst, VR128:$src1, VR128:$src2),
1745 "pcmpeqb {$src2, $dst|$dst, $src2}",
1746 [(set VR128:$dst, (int_x86_sse2_pcmpeq_b VR128:$src1,
1747 VR128:$src2))]>;
Evan Cheng60d3fa22006-04-15 06:10:09 +00001748def PCMPEQBrm : PDI<0x74, MRMSrcMem,
Evan Cheng9ab1ac52006-04-14 23:32:40 +00001749 (ops VR128:$dst, VR128:$src1, i128mem:$src2),
1750 "pcmpeqb {$src2, $dst|$dst, $src2}",
1751 [(set VR128:$dst, (int_x86_sse2_pcmpeq_b VR128:$src1,
1752 (bc_v16i8 (loadv2i64 addr:$src2))))]>;
1753def PCMPEQWrr : PDI<0x75, MRMSrcReg,
1754 (ops VR128:$dst, VR128:$src1, VR128:$src2),
1755 "pcmpeqw {$src2, $dst|$dst, $src2}",
1756 [(set VR128:$dst, (int_x86_sse2_pcmpeq_w VR128:$src1,
1757 VR128:$src2))]>;
Evan Cheng60d3fa22006-04-15 06:10:09 +00001758def PCMPEQWrm : PDI<0x75, MRMSrcMem,
Evan Cheng9ab1ac52006-04-14 23:32:40 +00001759 (ops VR128:$dst, VR128:$src1, i128mem:$src2),
1760 "pcmpeqw {$src2, $dst|$dst, $src2}",
1761 [(set VR128:$dst, (int_x86_sse2_pcmpeq_w VR128:$src1,
1762 (bc_v8i16 (loadv2i64 addr:$src2))))]>;
1763def PCMPEQDrr : PDI<0x76, MRMSrcReg,
1764 (ops VR128:$dst, VR128:$src1, VR128:$src2),
1765 "pcmpeqd {$src2, $dst|$dst, $src2}",
1766 [(set VR128:$dst, (int_x86_sse2_pcmpeq_d VR128:$src1,
1767 VR128:$src2))]>;
Evan Cheng60d3fa22006-04-15 06:10:09 +00001768def PCMPEQDrm : PDI<0x76, MRMSrcMem,
Evan Cheng9ab1ac52006-04-14 23:32:40 +00001769 (ops VR128:$dst, VR128:$src1, i128mem:$src2),
1770 "pcmpeqd {$src2, $dst|$dst, $src2}",
1771 [(set VR128:$dst, (int_x86_sse2_pcmpeq_d VR128:$src1,
1772 (bc_v4i32 (loadv2i64 addr:$src2))))]>;
1773
1774def PCMPGTBrr : PDI<0x64, MRMSrcReg,
1775 (ops VR128:$dst, VR128:$src1, VR128:$src2),
1776 "pcmpgtb {$src2, $dst|$dst, $src2}",
1777 [(set VR128:$dst, (int_x86_sse2_pcmpgt_b VR128:$src1,
1778 VR128:$src2))]>;
Evan Cheng60d3fa22006-04-15 06:10:09 +00001779def PCMPGTBrm : PDI<0x64, MRMSrcMem,
Evan Cheng9ab1ac52006-04-14 23:32:40 +00001780 (ops VR128:$dst, VR128:$src1, i128mem:$src2),
1781 "pcmpgtb {$src2, $dst|$dst, $src2}",
1782 [(set VR128:$dst, (int_x86_sse2_pcmpgt_b VR128:$src1,
1783 (bc_v16i8 (loadv2i64 addr:$src2))))]>;
1784def PCMPGTWrr : PDI<0x65, MRMSrcReg,
1785 (ops VR128:$dst, VR128:$src1, VR128:$src2),
1786 "pcmpgtw {$src2, $dst|$dst, $src2}",
1787 [(set VR128:$dst, (int_x86_sse2_pcmpgt_w VR128:$src1,
1788 VR128:$src2))]>;
Evan Cheng60d3fa22006-04-15 06:10:09 +00001789def PCMPGTWrm : PDI<0x65, MRMSrcMem,
Evan Cheng9ab1ac52006-04-14 23:32:40 +00001790 (ops VR128:$dst, VR128:$src1, i128mem:$src2),
1791 "pcmpgtw {$src2, $dst|$dst, $src2}",
1792 [(set VR128:$dst, (int_x86_sse2_pcmpgt_w VR128:$src1,
1793 (bc_v8i16 (loadv2i64 addr:$src2))))]>;
1794def PCMPGTDrr : PDI<0x66, MRMSrcReg,
1795 (ops VR128:$dst, VR128:$src1, VR128:$src2),
1796 "pcmpgtd {$src2, $dst|$dst, $src2}",
1797 [(set VR128:$dst, (int_x86_sse2_pcmpgt_d VR128:$src1,
1798 VR128:$src2))]>;
Evan Cheng60d3fa22006-04-15 06:10:09 +00001799def PCMPGTDrm : PDI<0x66, MRMSrcMem,
Evan Cheng9ab1ac52006-04-14 23:32:40 +00001800 (ops VR128:$dst, VR128:$src1, i128mem:$src2),
1801 "pcmpgtd {$src2, $dst|$dst, $src2}",
1802 [(set VR128:$dst, (int_x86_sse2_pcmpgt_d VR128:$src1,
1803 (bc_v4i32 (loadv2i64 addr:$src2))))]>;
1804}
1805
Evan Cheng506d3df2006-03-29 23:07:14 +00001806// Pack instructions
1807let isTwoAddress = 1 in {
1808def PACKSSWBrr : PDI<0x63, MRMSrcReg, (ops VR128:$dst, VR128:$src1,
1809 VR128:$src2),
1810 "packsswb {$src2, $dst|$dst, $src2}",
Evan Cheng591f7402006-03-29 23:53:14 +00001811 [(set VR128:$dst, (v8i16 (int_x86_sse2_packsswb_128
1812 VR128:$src1,
1813 VR128:$src2)))]>;
Evan Cheng506d3df2006-03-29 23:07:14 +00001814def PACKSSWBrm : PDI<0x63, MRMSrcMem, (ops VR128:$dst, VR128:$src1,
1815 i128mem:$src2),
1816 "packsswb {$src2, $dst|$dst, $src2}",
Evan Cheng591f7402006-03-29 23:53:14 +00001817 [(set VR128:$dst, (v8i16 (int_x86_sse2_packsswb_128
1818 VR128:$src1,
1819 (bc_v8i16 (loadv2f64 addr:$src2)))))]>;
Evan Cheng506d3df2006-03-29 23:07:14 +00001820def PACKSSDWrr : PDI<0x6B, MRMSrcReg, (ops VR128:$dst, VR128:$src1,
1821 VR128:$src2),
Evan Cheng591f7402006-03-29 23:53:14 +00001822 "packssdw {$src2, $dst|$dst, $src2}",
1823 [(set VR128:$dst, (v4i32 (int_x86_sse2_packssdw_128
1824 VR128:$src1,
1825 VR128:$src2)))]>;
Evan Cheng60d3fa22006-04-15 06:10:09 +00001826def PACKSSDWrm : PDI<0x6B, MRMSrcMem, (ops VR128:$dst, VR128:$src1,
Evan Cheng506d3df2006-03-29 23:07:14 +00001827 i128mem:$src2),
Evan Cheng591f7402006-03-29 23:53:14 +00001828 "packssdw {$src2, $dst|$dst, $src2}",
1829 [(set VR128:$dst, (v4i32 (int_x86_sse2_packssdw_128
1830 VR128:$src1,
1831 (bc_v4i32 (loadv2i64 addr:$src2)))))]>;
Evan Cheng506d3df2006-03-29 23:07:14 +00001832def PACKUSWBrr : PDI<0x67, MRMSrcReg, (ops VR128:$dst, VR128:$src1,
1833 VR128:$src2),
1834 "packuswb {$src2, $dst|$dst, $src2}",
Evan Cheng591f7402006-03-29 23:53:14 +00001835 [(set VR128:$dst, (v8i16 (int_x86_sse2_packuswb_128
1836 VR128:$src1,
1837 VR128:$src2)))]>;
Evan Cheng60d3fa22006-04-15 06:10:09 +00001838def PACKUSWBrm : PDI<0x67, MRMSrcMem, (ops VR128:$dst, VR128:$src1,
Evan Cheng506d3df2006-03-29 23:07:14 +00001839 i128mem:$src2),
1840 "packuswb {$src2, $dst|$dst, $src2}",
Evan Cheng591f7402006-03-29 23:53:14 +00001841 [(set VR128:$dst, (v8i16 (int_x86_sse2_packuswb_128
1842 VR128:$src1,
1843 (bc_v8i16 (loadv2i64 addr:$src2)))))]>;
Evan Cheng506d3df2006-03-29 23:07:14 +00001844}
1845
1846// Shuffle and unpack instructions
Evan Cheng8703be42006-04-04 19:12:30 +00001847def PSHUFDri : PDIi8<0x70, MRMSrcReg,
Evan Cheng506d3df2006-03-29 23:07:14 +00001848 (ops VR128:$dst, VR128:$src1, i8imm:$src2),
1849 "pshufd {$src2, $src1, $dst|$dst, $src1, $src2}",
1850 [(set VR128:$dst, (v4i32 (vector_shuffle
1851 VR128:$src1, (undef),
1852 PSHUFD_shuffle_mask:$src2)))]>;
Evan Cheng8703be42006-04-04 19:12:30 +00001853def PSHUFDmi : PDIi8<0x70, MRMSrcMem,
Evan Cheng506d3df2006-03-29 23:07:14 +00001854 (ops VR128:$dst, i128mem:$src1, i8imm:$src2),
1855 "pshufd {$src2, $src1, $dst|$dst, $src1, $src2}",
1856 [(set VR128:$dst, (v4i32 (vector_shuffle
Evan Cheng91b740d2006-04-12 17:12:36 +00001857 (bc_v4i32 (loadv2i64 addr:$src1)),
1858 (undef),
Evan Cheng506d3df2006-03-29 23:07:14 +00001859 PSHUFD_shuffle_mask:$src2)))]>;
1860
1861// SSE2 with ImmT == Imm8 and XS prefix.
Evan Cheng8703be42006-04-04 19:12:30 +00001862def PSHUFHWri : Ii8<0x70, MRMSrcReg,
Evan Cheng506d3df2006-03-29 23:07:14 +00001863 (ops VR128:$dst, VR128:$src1, i8imm:$src2),
1864 "pshufhw {$src2, $src1, $dst|$dst, $src1, $src2}",
1865 [(set VR128:$dst, (v8i16 (vector_shuffle
1866 VR128:$src1, (undef),
1867 PSHUFHW_shuffle_mask:$src2)))]>,
1868 XS, Requires<[HasSSE2]>;
Evan Cheng8703be42006-04-04 19:12:30 +00001869def PSHUFHWmi : Ii8<0x70, MRMSrcMem,
Evan Cheng506d3df2006-03-29 23:07:14 +00001870 (ops VR128:$dst, i128mem:$src1, i8imm:$src2),
1871 "pshufhw {$src2, $src1, $dst|$dst, $src1, $src2}",
1872 [(set VR128:$dst, (v8i16 (vector_shuffle
Evan Cheng91b740d2006-04-12 17:12:36 +00001873 (bc_v8i16 (loadv2i64 addr:$src1)),
1874 (undef),
Evan Cheng506d3df2006-03-29 23:07:14 +00001875 PSHUFHW_shuffle_mask:$src2)))]>,
1876 XS, Requires<[HasSSE2]>;
1877
1878// SSE2 with ImmT == Imm8 and XD prefix.
Evan Cheng8703be42006-04-04 19:12:30 +00001879def PSHUFLWri : Ii8<0x70, MRMSrcReg,
Evan Cheng506d3df2006-03-29 23:07:14 +00001880 (ops VR128:$dst, VR128:$src1, i32i8imm:$src2),
Evan Cheng7d9061e2006-03-30 19:54:57 +00001881 "pshuflw {$src2, $src1, $dst|$dst, $src1, $src2}",
Evan Cheng506d3df2006-03-29 23:07:14 +00001882 [(set VR128:$dst, (v8i16 (vector_shuffle
1883 VR128:$src1, (undef),
1884 PSHUFLW_shuffle_mask:$src2)))]>,
1885 XD, Requires<[HasSSE2]>;
Evan Cheng8703be42006-04-04 19:12:30 +00001886def PSHUFLWmi : Ii8<0x70, MRMSrcMem,
Evan Cheng506d3df2006-03-29 23:07:14 +00001887 (ops VR128:$dst, i128mem:$src1, i32i8imm:$src2),
Evan Cheng7d9061e2006-03-30 19:54:57 +00001888 "pshuflw {$src2, $src1, $dst|$dst, $src1, $src2}",
Evan Cheng506d3df2006-03-29 23:07:14 +00001889 [(set VR128:$dst, (v8i16 (vector_shuffle
Evan Cheng91b740d2006-04-12 17:12:36 +00001890 (bc_v8i16 (loadv2i64 addr:$src1)),
1891 (undef),
Evan Cheng506d3df2006-03-29 23:07:14 +00001892 PSHUFLW_shuffle_mask:$src2)))]>,
1893 XD, Requires<[HasSSE2]>;
1894
1895let isTwoAddress = 1 in {
Evan Chengc60bd972006-03-25 09:37:23 +00001896def PUNPCKLBWrr : PDI<0x60, MRMSrcReg,
1897 (ops VR128:$dst, VR128:$src1, VR128:$src2),
1898 "punpcklbw {$src2, $dst|$dst, $src2}",
Evan Cheng0038e592006-03-28 00:39:58 +00001899 [(set VR128:$dst,
1900 (v16i8 (vector_shuffle VR128:$src1, VR128:$src2,
1901 UNPCKL_shuffle_mask)))]>;
Evan Chengc60bd972006-03-25 09:37:23 +00001902def PUNPCKLBWrm : PDI<0x60, MRMSrcMem,
1903 (ops VR128:$dst, VR128:$src1, i128mem:$src2),
1904 "punpcklbw {$src2, $dst|$dst, $src2}",
Evan Cheng0038e592006-03-28 00:39:58 +00001905 [(set VR128:$dst,
Evan Cheng91b740d2006-04-12 17:12:36 +00001906 (v16i8 (vector_shuffle VR128:$src1,
1907 (bc_v16i8 (loadv2i64 addr:$src2)),
Evan Cheng0038e592006-03-28 00:39:58 +00001908 UNPCKL_shuffle_mask)))]>;
Evan Chengc60bd972006-03-25 09:37:23 +00001909def PUNPCKLWDrr : PDI<0x61, MRMSrcReg,
1910 (ops VR128:$dst, VR128:$src1, VR128:$src2),
1911 "punpcklwd {$src2, $dst|$dst, $src2}",
Evan Cheng0038e592006-03-28 00:39:58 +00001912 [(set VR128:$dst,
1913 (v8i16 (vector_shuffle VR128:$src1, VR128:$src2,
1914 UNPCKL_shuffle_mask)))]>;
Evan Chengc60bd972006-03-25 09:37:23 +00001915def PUNPCKLWDrm : PDI<0x61, MRMSrcMem,
1916 (ops VR128:$dst, VR128:$src1, i128mem:$src2),
1917 "punpcklwd {$src2, $dst|$dst, $src2}",
Evan Cheng0038e592006-03-28 00:39:58 +00001918 [(set VR128:$dst,
Evan Cheng91b740d2006-04-12 17:12:36 +00001919 (v8i16 (vector_shuffle VR128:$src1,
1920 (bc_v8i16 (loadv2i64 addr:$src2)),
Evan Cheng0038e592006-03-28 00:39:58 +00001921 UNPCKL_shuffle_mask)))]>;
Evan Chengc60bd972006-03-25 09:37:23 +00001922def PUNPCKLDQrr : PDI<0x62, MRMSrcReg,
1923 (ops VR128:$dst, VR128:$src1, VR128:$src2),
1924 "punpckldq {$src2, $dst|$dst, $src2}",
Evan Cheng0038e592006-03-28 00:39:58 +00001925 [(set VR128:$dst,
1926 (v4i32 (vector_shuffle VR128:$src1, VR128:$src2,
1927 UNPCKL_shuffle_mask)))]>;
Evan Chengc60bd972006-03-25 09:37:23 +00001928def PUNPCKLDQrm : PDI<0x62, MRMSrcMem,
1929 (ops VR128:$dst, VR128:$src1, i128mem:$src2),
1930 "punpckldq {$src2, $dst|$dst, $src2}",
Evan Cheng0038e592006-03-28 00:39:58 +00001931 [(set VR128:$dst,
Evan Cheng91b740d2006-04-12 17:12:36 +00001932 (v4i32 (vector_shuffle VR128:$src1,
1933 (bc_v4i32 (loadv2i64 addr:$src2)),
Evan Cheng0038e592006-03-28 00:39:58 +00001934 UNPCKL_shuffle_mask)))]>;
Evan Chengc60bd972006-03-25 09:37:23 +00001935def PUNPCKLQDQrr : PDI<0x6C, MRMSrcReg,
1936 (ops VR128:$dst, VR128:$src1, VR128:$src2),
Evan Cheng4fcb9222006-03-28 02:43:26 +00001937 "punpcklqdq {$src2, $dst|$dst, $src2}",
1938 [(set VR128:$dst,
1939 (v2i64 (vector_shuffle VR128:$src1, VR128:$src2,
1940 UNPCKL_shuffle_mask)))]>;
Evan Chengc60bd972006-03-25 09:37:23 +00001941def PUNPCKLQDQrm : PDI<0x6C, MRMSrcMem,
1942 (ops VR128:$dst, VR128:$src1, i128mem:$src2),
Evan Cheng4fcb9222006-03-28 02:43:26 +00001943 "punpcklqdq {$src2, $dst|$dst, $src2}",
1944 [(set VR128:$dst,
Evan Cheng91b740d2006-04-12 17:12:36 +00001945 (v2i64 (vector_shuffle VR128:$src1,
1946 (loadv2i64 addr:$src2),
Evan Cheng4fcb9222006-03-28 02:43:26 +00001947 UNPCKL_shuffle_mask)))]>;
Evan Chengc60bd972006-03-25 09:37:23 +00001948
1949def PUNPCKHBWrr : PDI<0x68, MRMSrcReg,
1950 (ops VR128:$dst, VR128:$src1, VR128:$src2),
Evan Cheng4fcb9222006-03-28 02:43:26 +00001951 "punpckhbw {$src2, $dst|$dst, $src2}",
1952 [(set VR128:$dst,
1953 (v16i8 (vector_shuffle VR128:$src1, VR128:$src2,
1954 UNPCKH_shuffle_mask)))]>;
Evan Chengc60bd972006-03-25 09:37:23 +00001955def PUNPCKHBWrm : PDI<0x68, MRMSrcMem,
1956 (ops VR128:$dst, VR128:$src1, i128mem:$src2),
Evan Cheng4fcb9222006-03-28 02:43:26 +00001957 "punpckhbw {$src2, $dst|$dst, $src2}",
1958 [(set VR128:$dst,
Evan Cheng91b740d2006-04-12 17:12:36 +00001959 (v16i8 (vector_shuffle VR128:$src1,
1960 (bc_v16i8 (loadv2i64 addr:$src2)),
Evan Cheng4fcb9222006-03-28 02:43:26 +00001961 UNPCKH_shuffle_mask)))]>;
Evan Chengc60bd972006-03-25 09:37:23 +00001962def PUNPCKHWDrr : PDI<0x69, MRMSrcReg,
1963 (ops VR128:$dst, VR128:$src1, VR128:$src2),
Evan Cheng4fcb9222006-03-28 02:43:26 +00001964 "punpckhwd {$src2, $dst|$dst, $src2}",
1965 [(set VR128:$dst,
1966 (v8i16 (vector_shuffle VR128:$src1, VR128:$src2,
1967 UNPCKH_shuffle_mask)))]>;
Evan Chengc60bd972006-03-25 09:37:23 +00001968def PUNPCKHWDrm : PDI<0x69, MRMSrcMem,
1969 (ops VR128:$dst, VR128:$src1, i128mem:$src2),
Evan Cheng4fcb9222006-03-28 02:43:26 +00001970 "punpckhwd {$src2, $dst|$dst, $src2}",
1971 [(set VR128:$dst,
Evan Cheng91b740d2006-04-12 17:12:36 +00001972 (v8i16 (vector_shuffle VR128:$src1,
1973 (bc_v8i16 (loadv2i64 addr:$src2)),
Evan Cheng4fcb9222006-03-28 02:43:26 +00001974 UNPCKH_shuffle_mask)))]>;
Evan Chengc60bd972006-03-25 09:37:23 +00001975def PUNPCKHDQrr : PDI<0x6A, MRMSrcReg,
1976 (ops VR128:$dst, VR128:$src1, VR128:$src2),
Evan Cheng4fcb9222006-03-28 02:43:26 +00001977 "punpckhdq {$src2, $dst|$dst, $src2}",
1978 [(set VR128:$dst,
1979 (v4i32 (vector_shuffle VR128:$src1, VR128:$src2,
1980 UNPCKH_shuffle_mask)))]>;
Evan Chengc60bd972006-03-25 09:37:23 +00001981def PUNPCKHDQrm : PDI<0x6A, MRMSrcMem,
1982 (ops VR128:$dst, VR128:$src1, i128mem:$src2),
Evan Cheng4fcb9222006-03-28 02:43:26 +00001983 "punpckhdq {$src2, $dst|$dst, $src2}",
1984 [(set VR128:$dst,
Evan Cheng91b740d2006-04-12 17:12:36 +00001985 (v4i32 (vector_shuffle VR128:$src1,
1986 (bc_v4i32 (loadv2i64 addr:$src2)),
Evan Cheng4fcb9222006-03-28 02:43:26 +00001987 UNPCKH_shuffle_mask)))]>;
Evan Chengc60bd972006-03-25 09:37:23 +00001988def PUNPCKHQDQrr : PDI<0x6D, MRMSrcReg,
1989 (ops VR128:$dst, VR128:$src1, VR128:$src2),
Evan Cheng4fcb9222006-03-28 02:43:26 +00001990 "punpckhdq {$src2, $dst|$dst, $src2}",
1991 [(set VR128:$dst,
1992 (v2i64 (vector_shuffle VR128:$src1, VR128:$src2,
1993 UNPCKH_shuffle_mask)))]>;
Evan Chengc60bd972006-03-25 09:37:23 +00001994def PUNPCKHQDQrm : PDI<0x6D, MRMSrcMem,
1995 (ops VR128:$dst, VR128:$src1, i128mem:$src2),
Evan Cheng4fcb9222006-03-28 02:43:26 +00001996 "punpckhqdq {$src2, $dst|$dst, $src2}",
1997 [(set VR128:$dst,
Evan Cheng91b740d2006-04-12 17:12:36 +00001998 (v2i64 (vector_shuffle VR128:$src1,
1999 (loadv2i64 addr:$src2),
Evan Cheng4fcb9222006-03-28 02:43:26 +00002000 UNPCKH_shuffle_mask)))]>;
Evan Chenga971f6f2006-03-23 01:57:24 +00002001}
Evan Cheng82521dd2006-03-21 07:09:35 +00002002
Evan Chengb067a1e2006-03-31 19:22:53 +00002003// Extract / Insert
Evan Cheng9ab1ac52006-04-14 23:32:40 +00002004def PEXTRWri : PDIi8<0xC5, MRMSrcReg,
Evan Cheng8703be42006-04-04 19:12:30 +00002005 (ops R32:$dst, VR128:$src1, i32i8imm:$src2),
2006 "pextrw {$src2, $src1, $dst|$dst, $src1, $src2}",
2007 [(set R32:$dst, (X86pextrw (v8i16 VR128:$src1),
2008 (i32 imm:$src2)))]>;
Evan Cheng9ab1ac52006-04-14 23:32:40 +00002009def PEXTRWmi : PDIi8<0xC5, MRMSrcMem,
Evan Cheng8703be42006-04-04 19:12:30 +00002010 (ops R32:$dst, i128mem:$src1, i32i8imm:$src2),
2011 "pextrw {$src2, $src1, $dst|$dst, $src1, $src2}",
Evan Cheng91b740d2006-04-12 17:12:36 +00002012 [(set R32:$dst, (X86pextrw
2013 (bc_v8i16 (loadv2i64 addr:$src1)),
Evan Cheng8703be42006-04-04 19:12:30 +00002014 (i32 imm:$src2)))]>;
Evan Chengb067a1e2006-03-31 19:22:53 +00002015
2016let isTwoAddress = 1 in {
Evan Cheng9ab1ac52006-04-14 23:32:40 +00002017def PINSRWrri : PDIi8<0xC4, MRMSrcReg,
Evan Chengb067a1e2006-03-31 19:22:53 +00002018 (ops VR128:$dst, VR128:$src1, R32:$src2, i32i8imm:$src3),
2019 "pinsrw {$src3, $src2, $dst|$dst, $src2, $src3}",
Evan Cheng653159f2006-03-31 21:55:24 +00002020 [(set VR128:$dst, (v8i16 (X86pinsrw (v8i16 VR128:$src1),
2021 R32:$src2, (i32 imm:$src3))))]>;
Evan Cheng9ab1ac52006-04-14 23:32:40 +00002022def PINSRWrmi : PDIi8<0xC4, MRMSrcMem,
Evan Chengb067a1e2006-03-31 19:22:53 +00002023 (ops VR128:$dst, VR128:$src1, i16mem:$src2, i32i8imm:$src3),
2024 "pinsrw {$src3, $src2, $dst|$dst, $src2, $src3}",
2025 [(set VR128:$dst,
Evan Cheng653159f2006-03-31 21:55:24 +00002026 (v8i16 (X86pinsrw (v8i16 VR128:$src1),
Evan Chengb067a1e2006-03-31 19:22:53 +00002027 (i32 (anyext (loadi16 addr:$src2))),
2028 (i32 imm:$src3))))]>;
2029}
2030
Evan Cheng82521dd2006-03-21 07:09:35 +00002031//===----------------------------------------------------------------------===//
Evan Chengc653d482006-03-24 22:28:37 +00002032// Miscellaneous Instructions
2033//===----------------------------------------------------------------------===//
2034
Evan Chengc5fb2b12006-03-30 00:33:26 +00002035// Mask creation
2036def MOVMSKPSrr : PSI<0x50, MRMSrcReg, (ops R32:$dst, VR128:$src),
2037 "movmskps {$src, $dst|$dst, $src}",
2038 [(set R32:$dst, (int_x86_sse_movmsk_ps VR128:$src))]>;
2039def MOVMSKPDrr : PSI<0x50, MRMSrcReg, (ops R32:$dst, VR128:$src),
2040 "movmskpd {$src, $dst|$dst, $src}",
Evan Chenga50a0862006-04-13 00:00:23 +00002041 [(set R32:$dst, (int_x86_sse2_movmsk_pd VR128:$src))]>;
Evan Chengc5fb2b12006-03-30 00:33:26 +00002042
2043def PMOVMSKBrr : PDI<0xD7, MRMSrcReg, (ops R32:$dst, VR128:$src),
2044 "pmovmskb {$src, $dst|$dst, $src}",
2045 [(set R32:$dst, (int_x86_sse2_pmovmskb_128 VR128:$src))]>;
2046
Evan Chengfcf5e212006-04-11 06:57:30 +00002047// Conditional store
2048def MASKMOVDQU : PDI<0xF7, RawFrm, (ops VR128:$src, VR128:$mask),
2049 "maskmovdqu {$mask, $src|$src, $mask}",
2050 [(int_x86_sse2_maskmov_dqu VR128:$src, VR128:$mask, EDI)]>,
2051 Imp<[EDI],[]>;
2052
Evan Chengecac9cb2006-03-25 06:03:26 +00002053// Prefetching loads
Evan Cheng135c6a92006-04-11 17:35:57 +00002054def PREFETCHT0 : PSI<0x18, MRM1m, (ops i8mem:$src),
Evan Chengdf3c33c2006-04-11 18:04:57 +00002055 "prefetcht0 $src", []>;
Evan Cheng135c6a92006-04-11 17:35:57 +00002056def PREFETCHT1 : PSI<0x18, MRM2m, (ops i8mem:$src),
Evan Chengdf3c33c2006-04-11 18:04:57 +00002057 "prefetcht1 $src", []>;
Evan Cheng135c6a92006-04-11 17:35:57 +00002058def PREFETCHT2 : PSI<0x18, MRM3m, (ops i8mem:$src),
Evan Chengdf3c33c2006-04-11 18:04:57 +00002059 "prefetcht2 $src", []>;
Evan Cheng135c6a92006-04-11 17:35:57 +00002060def PREFETCHTNTA : PSI<0x18, MRM0m, (ops i8mem:$src),
Evan Chengdf3c33c2006-04-11 18:04:57 +00002061 "prefetchtnta $src", []>;
Evan Chengecac9cb2006-03-25 06:03:26 +00002062
2063// Non-temporal stores
Evan Chengfcf5e212006-04-11 06:57:30 +00002064def MOVNTPSmr : PSI<0x2B, MRMDestMem, (ops i128mem:$dst, VR128:$src),
2065 "movntps {$src, $dst|$dst, $src}",
2066 [(int_x86_sse_movnt_ps addr:$dst, VR128:$src)]>;
2067def MOVNTPDmr : PDI<0x2B, MRMDestMem, (ops i128mem:$dst, VR128:$src),
2068 "movntpd {$src, $dst|$dst, $src}",
2069 [(int_x86_sse2_movnt_pd addr:$dst, VR128:$src)]>;
2070def MOVNTDQmr : PDI<0xE7, MRMDestMem, (ops f128mem:$dst, VR128:$src),
2071 "movntdq {$src, $dst|$dst, $src}",
2072 [(int_x86_sse2_movnt_dq addr:$dst, VR128:$src)]>;
2073def MOVNTImr : I<0xC3, MRMDestMem, (ops i32mem:$dst, R32:$src),
2074 "movnti {$src, $dst|$dst, $src}",
2075 [(int_x86_sse2_movnt_i addr:$dst, R32:$src)]>,
2076 TB, Requires<[HasSSE2]>;
Evan Chengecac9cb2006-03-25 06:03:26 +00002077
Evan Chengf3e1b1d2006-04-14 07:43:12 +00002078// Flush cache
2079def CLFLUSH : I<0xAE, MRM7m, (ops i8mem:$src),
2080 "clflush $src", [(int_x86_sse2_clflush addr:$src)]>,
2081 TB, Requires<[HasSSE2]>;
2082
2083// Load, store, and memory fence
Evan Chengecac9cb2006-03-25 06:03:26 +00002084def SFENCE : I<0xAE, MRM7m, (ops),
Evan Cheng135c6a92006-04-11 17:35:57 +00002085 "sfence", [(int_x86_sse_sfence)]>, TB, Requires<[HasSSE1]>;
Evan Chengf3e1b1d2006-04-14 07:43:12 +00002086def LFENCE : I<0xAE, MRM5m, (ops),
2087 "lfence", [(int_x86_sse2_lfence)]>, TB, Requires<[HasSSE2]>;
2088def MFENCE : I<0xAE, MRM6m, (ops),
2089 "mfence", [(int_x86_sse2_mfence)]>, TB, Requires<[HasSSE2]>;
Evan Chengecac9cb2006-03-25 06:03:26 +00002090
Evan Cheng372db542006-04-08 00:47:44 +00002091// MXCSR register
Evan Chengf3e1b1d2006-04-14 07:43:12 +00002092def LDMXCSR : I<0xAE, MRM5m, (ops i32mem:$src),
Evan Cheng372db542006-04-08 00:47:44 +00002093 "ldmxcsr $src",
2094 [(int_x86_sse_ldmxcsr addr:$src)]>, TB, Requires<[HasSSE1]>;
2095def STMXCSR : I<0xAE, MRM3m, (ops i32mem:$dst),
2096 "stmxcsr $dst",
2097 [(int_x86_sse_stmxcsr addr:$dst)]>, TB, Requires<[HasSSE1]>;
Evan Chengc653d482006-03-24 22:28:37 +00002098
Evan Chengd9539472006-04-14 21:59:03 +00002099// Thread synchronization
2100def MONITOR : I<0xC8, RawFrm, (ops), "monitor",
2101 [(int_x86_sse3_monitor EAX, ECX, EDX)]>,
2102 TB, Requires<[HasSSE3]>;
2103def MWAIT : I<0xC9, RawFrm, (ops), "mwait",
2104 [(int_x86_sse3_mwait ECX, EAX)]>,
2105 TB, Requires<[HasSSE3]>;
2106
Evan Chengc653d482006-03-24 22:28:37 +00002107//===----------------------------------------------------------------------===//
Evan Cheng82521dd2006-03-21 07:09:35 +00002108// Alias Instructions
2109//===----------------------------------------------------------------------===//
2110
Evan Chengffea91e2006-03-26 09:53:12 +00002111// Alias instructions that map zero vector to pxor / xorp* for sse.
Evan Cheng386031a2006-03-24 07:29:27 +00002112// FIXME: remove when we can teach regalloc that xor reg, reg is ok.
Evan Chengffea91e2006-03-26 09:53:12 +00002113def V_SET0_PI : PDI<0xEF, MRMInitReg, (ops VR128:$dst),
2114 "pxor $dst, $dst",
2115 [(set VR128:$dst, (v2i64 immAllZerosV))]>;
2116def V_SET0_PS : PSI<0x57, MRMInitReg, (ops VR128:$dst),
2117 "xorps $dst, $dst",
2118 [(set VR128:$dst, (v4f32 immAllZerosV))]>;
2119def V_SET0_PD : PDI<0x57, MRMInitReg, (ops VR128:$dst),
2120 "xorpd $dst, $dst",
2121 [(set VR128:$dst, (v2f64 immAllZerosV))]>;
Evan Cheng386031a2006-03-24 07:29:27 +00002122
Evan Chenga0b3afb2006-03-27 07:00:16 +00002123def V_SETALLONES : PDI<0x76, MRMInitReg, (ops VR128:$dst),
2124 "pcmpeqd $dst, $dst",
2125 [(set VR128:$dst, (v2f64 immAllOnesV))]>;
2126
Evan Cheng11e15b32006-04-03 20:53:28 +00002127// FR32 / FR64 to 128-bit vector conversion.
2128def MOVSS2PSrr : SSI<0x10, MRMSrcReg, (ops VR128:$dst, FR32:$src),
2129 "movss {$src, $dst|$dst, $src}",
2130 [(set VR128:$dst,
2131 (v4f32 (scalar_to_vector FR32:$src)))]>;
2132def MOVSS2PSrm : SSI<0x10, MRMSrcMem, (ops VR128:$dst, f32mem:$src),
2133 "movss {$src, $dst|$dst, $src}",
2134 [(set VR128:$dst,
2135 (v4f32 (scalar_to_vector (loadf32 addr:$src))))]>;
2136def MOVSD2PDrr : SDI<0x10, MRMSrcReg, (ops VR128:$dst, FR64:$src),
2137 "movsd {$src, $dst|$dst, $src}",
2138 [(set VR128:$dst,
2139 (v2f64 (scalar_to_vector FR64:$src)))]>;
2140def MOVSD2PDrm : SDI<0x10, MRMSrcMem, (ops VR128:$dst, f64mem:$src),
2141 "movsd {$src, $dst|$dst, $src}",
2142 [(set VR128:$dst,
2143 (v2f64 (scalar_to_vector (loadf64 addr:$src))))]>;
2144
2145def MOVDI2PDIrr : PDI<0x6E, MRMSrcReg, (ops VR128:$dst, R32:$src),
2146 "movd {$src, $dst|$dst, $src}",
2147 [(set VR128:$dst,
2148 (v4i32 (scalar_to_vector R32:$src)))]>;
2149def MOVDI2PDIrm : PDI<0x6E, MRMSrcMem, (ops VR128:$dst, i32mem:$src),
2150 "movd {$src, $dst|$dst, $src}",
2151 [(set VR128:$dst,
2152 (v4i32 (scalar_to_vector (loadi32 addr:$src))))]>;
2153// SSE2 instructions with XS prefix
2154def MOVQI2PQIrr : I<0x7E, MRMSrcReg, (ops VR128:$dst, VR64:$src),
2155 "movq {$src, $dst|$dst, $src}",
2156 [(set VR128:$dst,
2157 (v2i64 (scalar_to_vector VR64:$src)))]>, XS,
2158 Requires<[HasSSE2]>;
2159def MOVQI2PQIrm : I<0x7E, MRMSrcMem, (ops VR128:$dst, i64mem:$src),
2160 "movq {$src, $dst|$dst, $src}",
2161 [(set VR128:$dst,
2162 (v2i64 (scalar_to_vector (loadi64 addr:$src))))]>, XS,
2163 Requires<[HasSSE2]>;
2164// FIXME: may not be able to eliminate this movss with coalescing the src and
2165// dest register classes are different. We really want to write this pattern
2166// like this:
2167// def : Pat<(f32 (vector_extract (v4f32 VR128:$src), (i32 0))),
2168// (f32 FR32:$src)>;
2169def MOVPS2SSrr : SSI<0x10, MRMSrcReg, (ops FR32:$dst, VR128:$src),
2170 "movss {$src, $dst|$dst, $src}",
2171 [(set FR32:$dst, (vector_extract (v4f32 VR128:$src),
2172 (i32 0)))]>;
Evan Cheng85c09652006-04-06 23:53:29 +00002173def MOVPS2SSmr : SSI<0x11, MRMDestMem, (ops f32mem:$dst, VR128:$src),
Evan Cheng11e15b32006-04-03 20:53:28 +00002174 "movss {$src, $dst|$dst, $src}",
2175 [(store (f32 (vector_extract (v4f32 VR128:$src),
2176 (i32 0))), addr:$dst)]>;
2177def MOVPD2SDrr : SDI<0x10, MRMSrcReg, (ops FR64:$dst, VR128:$src),
2178 "movsd {$src, $dst|$dst, $src}",
2179 [(set FR64:$dst, (vector_extract (v2f64 VR128:$src),
2180 (i32 0)))]>;
Evan Cheng85c09652006-04-06 23:53:29 +00002181def MOVPDI2DIrr : PDI<0x6E, MRMSrcReg, (ops R32:$dst, VR128:$src),
Evan Cheng11e15b32006-04-03 20:53:28 +00002182 "movd {$src, $dst|$dst, $src}",
2183 [(set R32:$dst, (vector_extract (v4i32 VR128:$src),
2184 (i32 0)))]>;
2185def MOVPDI2DImr : PDI<0x7E, MRMDestMem, (ops i32mem:$dst, VR128:$src),
2186 "movd {$src, $dst|$dst, $src}",
2187 [(store (i32 (vector_extract (v4i32 VR128:$src),
2188 (i32 0))), addr:$dst)]>;
2189
2190// Move to lower bits of a VR128, leaving upper bits alone.
Evan Chengbc4832b2006-03-24 23:15:12 +00002191// Three operand (but two address) aliases.
2192let isTwoAddress = 1 in {
Evan Cheng11e15b32006-04-03 20:53:28 +00002193def MOVLSS2PSrr : SSI<0x10, MRMSrcReg, (ops VR128:$dst, VR128:$src1, FR32:$src2),
Evan Chengbc4832b2006-03-24 23:15:12 +00002194 "movss {$src2, $dst|$dst, $src2}", []>;
Evan Cheng11e15b32006-04-03 20:53:28 +00002195def MOVLSD2PDrr : SDI<0x10, MRMSrcReg, (ops VR128:$dst, VR128:$src1, FR64:$src2),
Evan Chengbc4832b2006-03-24 23:15:12 +00002196 "movsd {$src2, $dst|$dst, $src2}", []>;
Evan Cheng11e15b32006-04-03 20:53:28 +00002197def MOVLDI2PDIrr : PDI<0x6E, MRMSrcReg, (ops VR128:$dst, VR128:$src1, R32:$src2),
Evan Chengbc4832b2006-03-24 23:15:12 +00002198 "movd {$src2, $dst|$dst, $src2}", []>;
Evan Chengd6d1cbd2006-04-11 00:19:04 +00002199
2200def MOVLPSrr : SSI<0x10, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
2201 "movss {$src2, $dst|$dst, $src2}",
2202 [(set VR128:$dst,
2203 (v4f32 (vector_shuffle VR128:$src1, VR128:$src2,
2204 MOVS_shuffle_mask)))]>;
2205def MOVLPDrr : SDI<0x10, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
2206 "movsd {$src2, $dst|$dst, $src2}",
2207 [(set VR128:$dst,
2208 (v2f64 (vector_shuffle VR128:$src1, VR128:$src2,
2209 MOVS_shuffle_mask)))]>;
Evan Chengbc4832b2006-03-24 23:15:12 +00002210}
Evan Cheng82521dd2006-03-21 07:09:35 +00002211
Evan Cheng397edef2006-04-11 22:28:25 +00002212// Store / copy lower 64-bits of a XMM register.
2213def MOVLQ128mr : PDI<0xD6, MRMDestMem, (ops i64mem:$dst, VR128:$src),
2214 "movq {$src, $dst|$dst, $src}",
2215 [(int_x86_sse2_storel_dq addr:$dst, VR128:$src)]>;
2216
2217// FIXME: Temporary workaround since 2-wide shuffle is broken.
2218def MOVLQ128rr : PDI<0xD6, MRMSrcReg, (ops VR128:$dst, VR128:$src),
2219 "movq {$src, $dst|$dst, $src}",
2220 [(set VR128:$dst, (int_x86_sse2_movl_dq VR128:$src))]>;
2221
Evan Cheng11e15b32006-04-03 20:53:28 +00002222// Move to lower bits of a VR128 and zeroing upper bits.
Evan Chengbc4832b2006-03-24 23:15:12 +00002223// Loading from memory automatically zeroing upper bits.
Evan Cheng11e15b32006-04-03 20:53:28 +00002224def MOVZSS2PSrm : SSI<0x10, MRMSrcMem, (ops VR128:$dst, f32mem:$src),
Evan Chengbc4832b2006-03-24 23:15:12 +00002225 "movss {$src, $dst|$dst, $src}",
Evan Cheng82521dd2006-03-21 07:09:35 +00002226 [(set VR128:$dst,
Evan Chengbc4832b2006-03-24 23:15:12 +00002227 (v4f32 (X86zexts2vec (loadf32 addr:$src))))]>;
Evan Cheng11e15b32006-04-03 20:53:28 +00002228def MOVZSD2PDrm : SDI<0x10, MRMSrcMem, (ops VR128:$dst, f64mem:$src),
Evan Chengbc4832b2006-03-24 23:15:12 +00002229 "movsd {$src, $dst|$dst, $src}",
2230 [(set VR128:$dst,
2231 (v2f64 (X86zexts2vec (loadf64 addr:$src))))]>;
Evan Cheng11e15b32006-04-03 20:53:28 +00002232def MOVZDI2PDIrm : PDI<0x6E, MRMSrcMem, (ops VR128:$dst, i32mem:$src),
2233 "movd {$src, $dst|$dst, $src}",
2234 [(set VR128:$dst,
2235 (v4i32 (X86zexts2vec (loadi32 addr:$src))))]>;
2236def MOVZQI2PQIrm : PDI<0x7E, MRMSrcMem, (ops VR128:$dst, i64mem:$src),
Evan Cheng397edef2006-04-11 22:28:25 +00002237 "movq {$src, $dst|$dst, $src}",
Evan Cheng11e15b32006-04-03 20:53:28 +00002238 [(set VR128:$dst,
Evan Cheng397edef2006-04-11 22:28:25 +00002239 (bc_v2i64 (v2f64 (X86zexts2vec
2240 (loadf64 addr:$src)))))]>;
Evan Cheng48090aa2006-03-21 23:01:21 +00002241
2242//===----------------------------------------------------------------------===//
2243// Non-Instruction Patterns
2244//===----------------------------------------------------------------------===//
2245
2246// 128-bit vector undef's.
2247def : Pat<(v2f64 (undef)), (IMPLICIT_DEF_VR128)>, Requires<[HasSSE2]>;
2248def : Pat<(v16i8 (undef)), (IMPLICIT_DEF_VR128)>, Requires<[HasSSE2]>;
2249def : Pat<(v8i16 (undef)), (IMPLICIT_DEF_VR128)>, Requires<[HasSSE2]>;
2250def : Pat<(v4i32 (undef)), (IMPLICIT_DEF_VR128)>, Requires<[HasSSE2]>;
2251def : Pat<(v2i64 (undef)), (IMPLICIT_DEF_VR128)>, Requires<[HasSSE2]>;
2252
Evan Chengffea91e2006-03-26 09:53:12 +00002253// 128-bit vector all zero's.
2254def : Pat<(v16i8 immAllZerosV), (v16i8 (V_SET0_PI))>, Requires<[HasSSE2]>;
2255def : Pat<(v8i16 immAllZerosV), (v8i16 (V_SET0_PI))>, Requires<[HasSSE2]>;
2256def : Pat<(v4i32 immAllZerosV), (v4i32 (V_SET0_PI))>, Requires<[HasSSE2]>;
2257
Evan Chenga0b3afb2006-03-27 07:00:16 +00002258// 128-bit vector all one's.
2259def : Pat<(v16i8 immAllOnesV), (v16i8 (V_SETALLONES))>, Requires<[HasSSE2]>;
2260def : Pat<(v8i16 immAllOnesV), (v8i16 (V_SETALLONES))>, Requires<[HasSSE2]>;
2261def : Pat<(v4i32 immAllOnesV), (v4i32 (V_SETALLONES))>, Requires<[HasSSE2]>;
2262def : Pat<(v2i64 immAllOnesV), (v2i64 (V_SETALLONES))>, Requires<[HasSSE2]>;
2263def : Pat<(v4f32 immAllOnesV), (v4f32 (V_SETALLONES))>, Requires<[HasSSE1]>;
2264
Evan Cheng48090aa2006-03-21 23:01:21 +00002265// Store 128-bit integer vector values.
Evan Cheng24dc1f52006-03-23 07:44:07 +00002266def : Pat<(store (v16i8 VR128:$src), addr:$dst),
Evan Chengffea91e2006-03-26 09:53:12 +00002267 (MOVDQAmr addr:$dst, VR128:$src)>, Requires<[HasSSE2]>;
Evan Cheng24dc1f52006-03-23 07:44:07 +00002268def : Pat<(store (v8i16 VR128:$src), addr:$dst),
Evan Chengffea91e2006-03-26 09:53:12 +00002269 (MOVDQAmr addr:$dst, VR128:$src)>, Requires<[HasSSE2]>;
Evan Cheng24dc1f52006-03-23 07:44:07 +00002270def : Pat<(store (v4i32 VR128:$src), addr:$dst),
Evan Chengffea91e2006-03-26 09:53:12 +00002271 (MOVDQAmr addr:$dst, VR128:$src)>, Requires<[HasSSE2]>;
Evan Cheng48090aa2006-03-21 23:01:21 +00002272
2273// Scalar to v8i16 / v16i8. The source may be a R32, but only the lower 8 or
2274// 16-bits matter.
Evan Cheng11e15b32006-04-03 20:53:28 +00002275def : Pat<(v8i16 (X86s2vec R32:$src)), (MOVDI2PDIrr R32:$src)>,
Evan Chengffea91e2006-03-26 09:53:12 +00002276 Requires<[HasSSE2]>;
Evan Cheng11e15b32006-04-03 20:53:28 +00002277def : Pat<(v16i8 (X86s2vec R32:$src)), (MOVDI2PDIrr R32:$src)>,
Evan Chengffea91e2006-03-26 09:53:12 +00002278 Requires<[HasSSE2]>;
Evan Cheng48090aa2006-03-21 23:01:21 +00002279
Evan Cheng2c0dbd02006-03-24 02:58:06 +00002280// bit_convert
Evan Cheng475aecf2006-03-29 03:04:49 +00002281def : Pat<(v2i64 (bitconvert (v4i32 VR128:$src))), (v2i64 VR128:$src)>,
2282 Requires<[HasSSE2]>;
Evan Cheng506d3df2006-03-29 23:07:14 +00002283def : Pat<(v2i64 (bitconvert (v8i16 VR128:$src))), (v2i64 VR128:$src)>,
2284 Requires<[HasSSE2]>;
2285def : Pat<(v2i64 (bitconvert (v16i8 VR128:$src))), (v2i64 VR128:$src)>,
2286 Requires<[HasSSE2]>;
Evan Cheng664ade72006-04-07 21:20:58 +00002287def : Pat<(v2i64 (bitconvert (v2f64 VR128:$src))), (v2i64 VR128:$src)>,
2288 Requires<[HasSSE2]>;
2289def : Pat<(v2i64 (bitconvert (v4f32 VR128:$src))), (v2i64 VR128:$src)>,
2290 Requires<[HasSSE2]>;
Evan Cheng506d3df2006-03-29 23:07:14 +00002291def : Pat<(v4i32 (bitconvert (v2i64 VR128:$src))), (v4i32 VR128:$src)>,
2292 Requires<[HasSSE2]>;
2293def : Pat<(v4i32 (bitconvert (v8i16 VR128:$src))), (v4i32 VR128:$src)>,
2294 Requires<[HasSSE2]>;
2295def : Pat<(v4i32 (bitconvert (v16i8 VR128:$src))), (v4i32 VR128:$src)>,
2296 Requires<[HasSSE2]>;
Evan Cheng664ade72006-04-07 21:20:58 +00002297def : Pat<(v4i32 (bitconvert (v2f64 VR128:$src))), (v4i32 VR128:$src)>,
2298 Requires<[HasSSE2]>;
2299def : Pat<(v4i32 (bitconvert (v4f32 VR128:$src))), (v4i32 VR128:$src)>,
2300 Requires<[HasSSE2]>;
Evan Cheng506d3df2006-03-29 23:07:14 +00002301def : Pat<(v8i16 (bitconvert (v2i64 VR128:$src))), (v4i32 VR128:$src)>,
2302 Requires<[HasSSE2]>;
2303def : Pat<(v8i16 (bitconvert (v4i32 VR128:$src))), (v4i32 VR128:$src)>,
2304 Requires<[HasSSE2]>;
2305def : Pat<(v8i16 (bitconvert (v16i8 VR128:$src))), (v4i32 VR128:$src)>,
2306 Requires<[HasSSE2]>;
Evan Cheng664ade72006-04-07 21:20:58 +00002307def : Pat<(v8i16 (bitconvert (v2f64 VR128:$src))), (v8i16 VR128:$src)>,
2308 Requires<[HasSSE2]>;
2309def : Pat<(v8i16 (bitconvert (v4f32 VR128:$src))), (v8i16 VR128:$src)>,
2310 Requires<[HasSSE2]>;
Evan Cheng506d3df2006-03-29 23:07:14 +00002311def : Pat<(v16i8 (bitconvert (v2i64 VR128:$src))), (v4i32 VR128:$src)>,
2312 Requires<[HasSSE2]>;
2313def : Pat<(v16i8 (bitconvert (v4i32 VR128:$src))), (v4i32 VR128:$src)>,
2314 Requires<[HasSSE2]>;
2315def : Pat<(v16i8 (bitconvert (v8i16 VR128:$src))), (v4i32 VR128:$src)>,
2316 Requires<[HasSSE2]>;
Evan Cheng664ade72006-04-07 21:20:58 +00002317def : Pat<(v16i8 (bitconvert (v2f64 VR128:$src))), (v16i8 VR128:$src)>,
2318 Requires<[HasSSE2]>;
2319def : Pat<(v16i8 (bitconvert (v4f32 VR128:$src))), (v16i8 VR128:$src)>,
2320 Requires<[HasSSE2]>;
2321def : Pat<(v4f32 (bitconvert (v2i64 VR128:$src))), (v4f32 VR128:$src)>,
Evan Chengffea91e2006-03-26 09:53:12 +00002322 Requires<[HasSSE2]>;
2323def : Pat<(v4f32 (bitconvert (v4i32 VR128:$src))), (v4f32 VR128:$src)>,
2324 Requires<[HasSSE2]>;
Evan Cheng664ade72006-04-07 21:20:58 +00002325def : Pat<(v4f32 (bitconvert (v8i16 VR128:$src))), (v4f32 VR128:$src)>,
2326 Requires<[HasSSE2]>;
2327def : Pat<(v4f32 (bitconvert (v16i8 VR128:$src))), (v4f32 VR128:$src)>,
2328 Requires<[HasSSE2]>;
Evan Cheng5ced1d82006-04-06 23:23:56 +00002329def : Pat<(v4f32 (bitconvert (v2f64 VR128:$src))), (v4f32 VR128:$src)>,
2330 Requires<[HasSSE2]>;
Evan Cheng664ade72006-04-07 21:20:58 +00002331def : Pat<(v2f64 (bitconvert (v2i64 VR128:$src))), (v2f64 VR128:$src)>,
2332 Requires<[HasSSE2]>;
2333def : Pat<(v2f64 (bitconvert (v4i32 VR128:$src))), (v2f64 VR128:$src)>,
2334 Requires<[HasSSE2]>;
2335def : Pat<(v2f64 (bitconvert (v8i16 VR128:$src))), (v2f64 VR128:$src)>,
2336 Requires<[HasSSE2]>;
2337def : Pat<(v2f64 (bitconvert (v16i8 VR128:$src))), (v2f64 VR128:$src)>,
2338 Requires<[HasSSE2]>;
2339def : Pat<(v2f64 (bitconvert (v4f32 VR128:$src))), (v2f64 VR128:$src)>,
2340 Requires<[HasSSE2]>;
Evan Chengb9df0ca2006-03-22 02:53:00 +00002341
Evan Chengbc4832b2006-03-24 23:15:12 +00002342// Zeroing a VR128 then do a MOVS* to the lower bits.
2343def : Pat<(v2f64 (X86zexts2vec FR64:$src)),
Evan Cheng11e15b32006-04-03 20:53:28 +00002344 (MOVLSD2PDrr (V_SET0_PD), FR64:$src)>, Requires<[HasSSE2]>;
Evan Chengbc4832b2006-03-24 23:15:12 +00002345def : Pat<(v4f32 (X86zexts2vec FR32:$src)),
Evan Cheng11e15b32006-04-03 20:53:28 +00002346 (MOVLSS2PSrr (V_SET0_PS), FR32:$src)>, Requires<[HasSSE2]>;
Evan Chengbc4832b2006-03-24 23:15:12 +00002347def : Pat<(v4i32 (X86zexts2vec R32:$src)),
Evan Cheng11e15b32006-04-03 20:53:28 +00002348 (MOVLDI2PDIrr (V_SET0_PI), R32:$src)>, Requires<[HasSSE2]>;
Evan Chengbc4832b2006-03-24 23:15:12 +00002349def : Pat<(v8i16 (X86zexts2vec R16:$src)),
Evan Cheng11e15b32006-04-03 20:53:28 +00002350 (MOVLDI2PDIrr (V_SET0_PI), (MOVZX32rr16 R16:$src))>, Requires<[HasSSE2]>;
Evan Chengbc4832b2006-03-24 23:15:12 +00002351def : Pat<(v16i8 (X86zexts2vec R8:$src)),
Evan Cheng11e15b32006-04-03 20:53:28 +00002352 (MOVLDI2PDIrr (V_SET0_PI), (MOVZX32rr8 R8:$src))>, Requires<[HasSSE2]>;
Evan Chengbc4832b2006-03-24 23:15:12 +00002353
Evan Chengb9df0ca2006-03-22 02:53:00 +00002354// Splat v2f64 / v2i64
Evan Chengd9539472006-04-14 21:59:03 +00002355def : Pat<(vector_shuffle (v2f64 VR128:$src), (undef), SSE_splat_v2_mask:$sm),
Evan Cheng691c9232006-03-29 19:02:40 +00002356 (v2f64 (UNPCKLPDrr VR128:$src, VR128:$src))>, Requires<[HasSSE2]>;
Evan Chengd9539472006-04-14 21:59:03 +00002357def : Pat<(vector_shuffle (v2i64 VR128:$src), (undef), SSE_splat_v2_mask:$sm),
Evan Cheng475aecf2006-03-29 03:04:49 +00002358 (v2i64 (PUNPCKLQDQrr VR128:$src, VR128:$src))>, Requires<[HasSSE2]>;
2359
Evan Cheng691c9232006-03-29 19:02:40 +00002360// Splat v4f32
2361def : Pat<(vector_shuffle (v4f32 VR128:$src), (undef), SSE_splat_mask:$sm),
2362 (v4f32 (SHUFPSrr VR128:$src, VR128:$src, SSE_splat_mask:$sm))>,
2363 Requires<[HasSSE1]>;
2364
Evan Cheng3d60df42006-04-10 22:35:16 +00002365// Special unary SHUFPSrr case.
2366// FIXME: when we want non two-address code, then we should use PSHUFD?
Evan Cheng7d9061e2006-03-30 19:54:57 +00002367def : Pat<(vector_shuffle (v4f32 VR128:$src1), (undef),
Evan Cheng3d60df42006-04-10 22:35:16 +00002368 SHUFP_unary_shuffle_mask:$sm),
2369 (v4f32 (SHUFPSrr VR128:$src1, VR128:$src1, SHUFP_unary_shuffle_mask:$sm))>,
Evan Cheng56e73012006-04-10 21:42:19 +00002370 Requires<[HasSSE1]>;
Evan Cheng3d60df42006-04-10 22:35:16 +00002371// Unary v4f32 shuffle with PSHUF* in order to fold a load.
Evan Cheng7d9061e2006-03-30 19:54:57 +00002372def : Pat<(vector_shuffle (loadv4f32 addr:$src1), (undef),
Evan Cheng3d60df42006-04-10 22:35:16 +00002373 SHUFP_unary_shuffle_mask:$sm),
2374 (v4f32 (PSHUFDmi addr:$src1, SHUFP_unary_shuffle_mask:$sm))>,
Evan Cheng7d9061e2006-03-30 19:54:57 +00002375 Requires<[HasSSE2]>;
Evan Cheng3d60df42006-04-10 22:35:16 +00002376// Special binary v4i32 shuffle cases with SHUFPS.
2377def : Pat<(vector_shuffle (v4i32 VR128:$src1), (v4i32 VR128:$src2),
2378 PSHUFD_binary_shuffle_mask:$sm),
2379 (v4i32 (SHUFPSrr VR128:$src1, VR128:$src2,
2380 PSHUFD_binary_shuffle_mask:$sm))>, Requires<[HasSSE2]>;
Evan Cheng91b740d2006-04-12 17:12:36 +00002381def : Pat<(vector_shuffle (v4i32 VR128:$src1),
2382 (bc_v4i32 (loadv2i64 addr:$src2)), PSHUFD_binary_shuffle_mask:$sm),
Evan Cheng3d60df42006-04-10 22:35:16 +00002383 (v4i32 (SHUFPSrm VR128:$src1, addr:$src2,
2384 PSHUFD_binary_shuffle_mask:$sm))>, Requires<[HasSSE2]>;
Evan Cheng1b32f222006-03-30 07:33:32 +00002385
Evan Cheng1d5a8cc2006-04-05 07:20:06 +00002386// vector_shuffle v1, <undef>, <0, 0, 1, 1, ...>
2387def : Pat<(v4f32 (vector_shuffle VR128:$src, (undef),
2388 UNPCKL_v_undef_shuffle_mask)),
2389 (UNPCKLPSrr VR128:$src, VR128:$src)>, Requires<[HasSSE2]>;
2390def : Pat<(v16i8 (vector_shuffle VR128:$src, (undef),
2391 UNPCKL_v_undef_shuffle_mask)),
2392 (PUNPCKLBWrr VR128:$src, VR128:$src)>, Requires<[HasSSE2]>;
2393def : Pat<(v8i16 (vector_shuffle VR128:$src, (undef),
2394 UNPCKL_v_undef_shuffle_mask)),
2395 (PUNPCKLWDrr VR128:$src, VR128:$src)>, Requires<[HasSSE2]>;
2396def : Pat<(v4i32 (vector_shuffle VR128:$src, (undef),
2397 UNPCKL_v_undef_shuffle_mask)),
2398 (PUNPCKLDQrr VR128:$src, VR128:$src)>, Requires<[HasSSE1]>;
2399
Evan Chengd9539472006-04-14 21:59:03 +00002400// vector_shuffle v1, <undef> <1, 1, 3, 3>
2401def : Pat<(v4i32 (vector_shuffle VR128:$src, (undef),
2402 MOVSHDUP_shuffle_mask)),
2403 (MOVSHDUPrr VR128:$src)>, Requires<[HasSSE3]>;
2404def : Pat<(v4i32 (vector_shuffle (bc_v4i32 (loadv2i64 addr:$src)), (undef),
2405 MOVSHDUP_shuffle_mask)),
2406 (MOVSHDUPrm addr:$src)>, Requires<[HasSSE3]>;
2407
2408// vector_shuffle v1, <undef> <0, 0, 2, 2>
2409def : Pat<(v4i32 (vector_shuffle VR128:$src, (undef),
2410 MOVSLDUP_shuffle_mask)),
2411 (MOVSLDUPrr VR128:$src)>, Requires<[HasSSE3]>;
2412def : Pat<(v4i32 (vector_shuffle (bc_v4i32 (loadv2i64 addr:$src)), (undef),
2413 MOVSLDUP_shuffle_mask)),
2414 (MOVSLDUPrm addr:$src)>, Requires<[HasSSE3]>;
2415
Evan Chengff65e382006-04-04 21:49:39 +00002416// 128-bit logical shifts
2417def : Pat<(int_x86_sse2_psll_dq VR128:$src1, imm:$src2),
Evan Cheng2c3ae372006-04-12 21:21:57 +00002418 (v2i64 (PSLLDQri VR128:$src1, (PSxLDQ_imm imm:$src2)))>,
2419 Requires<[HasSSE2]>;
Evan Chengff65e382006-04-04 21:49:39 +00002420def : Pat<(int_x86_sse2_psrl_dq VR128:$src1, imm:$src2),
Evan Cheng2c3ae372006-04-12 21:21:57 +00002421 (v2i64 (PSRLDQri VR128:$src1, (PSxLDQ_imm imm:$src2)))>,
2422 Requires<[HasSSE2]>;
Evan Chengff65e382006-04-04 21:49:39 +00002423
Evan Cheng2c3ae372006-04-12 21:21:57 +00002424// Some special case pandn patterns.
2425def : Pat<(v2i64 (and (xor VR128:$src1, (bc_v2i64 (v4i32 immAllOnesV))),
2426 VR128:$src2)),
2427 (PANDNrr VR128:$src1, VR128:$src2)>, Requires<[HasSSE2]>;
2428def : Pat<(v2i64 (and (xor VR128:$src1, (bc_v2i64 (v8i16 immAllOnesV))),
2429 VR128:$src2)),
2430 (PANDNrr VR128:$src1, VR128:$src2)>, Requires<[HasSSE2]>;
2431def : Pat<(v2i64 (and (xor VR128:$src1, (bc_v2i64 (v16i8 immAllOnesV))),
2432 VR128:$src2)),
2433 (PANDNrr VR128:$src1, VR128:$src2)>, Requires<[HasSSE2]>;
Evan Cheng1b32f222006-03-30 07:33:32 +00002434
Evan Cheng2c3ae372006-04-12 21:21:57 +00002435def : Pat<(v2i64 (and (xor VR128:$src1, (bc_v2i64 (v4i32 immAllOnesV))),
2436 (load addr:$src2))),
2437 (PANDNrm VR128:$src1, addr:$src2)>, Requires<[HasSSE2]>;
2438def : Pat<(v2i64 (and (xor VR128:$src1, (bc_v2i64 (v8i16 immAllOnesV))),
2439 (load addr:$src2))),
2440 (PANDNrm VR128:$src1, addr:$src2)>, Requires<[HasSSE2]>;
2441def : Pat<(v2i64 (and (xor VR128:$src1, (bc_v2i64 (v16i8 immAllOnesV))),
2442 (load addr:$src2))),
2443 (PANDNrm VR128:$src1, addr:$src2)>, Requires<[HasSSE2]>;