blob: 04d670a11f0c2ca202f3a4558e26139717877449 [file] [log] [blame]
Evan Chengffcb95b2006-02-21 19:13:53 +00001//====- X86InstrSSE.td - Describe the X86 Instruction Set -------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file was developed by the Evan Cheng and is distributed under
6// the University of Illinois Open Source License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file describes the X86 SSE instruction set, defining the instructions,
11// and properties of the instructions which are needed for code generation,
12// machine code emission, and analysis.
13//
14//===----------------------------------------------------------------------===//
15
Evan Cheng4e4c71e2006-02-21 20:00:20 +000016//===----------------------------------------------------------------------===//
Evan Cheng2246f842006-03-18 01:23:20 +000017// SSE specific DAG Nodes.
18//===----------------------------------------------------------------------===//
19
Evan Chengb9df0ca2006-03-22 02:53:00 +000020def X86loadp : SDNode<"X86ISD::LOAD_PACK", SDTLoad,
21 [SDNPHasChain]>;
Evan Cheng6be2c582006-04-05 23:38:46 +000022def X86fand : SDNode<"X86ISD::FAND", SDTFPBinOp,
Evan Chengb9df0ca2006-03-22 02:53:00 +000023 [SDNPCommutative, SDNPAssociative]>;
Evan Cheng6be2c582006-04-05 23:38:46 +000024def X86fxor : SDNode<"X86ISD::FXOR", SDTFPBinOp,
Evan Chengb9df0ca2006-03-22 02:53:00 +000025 [SDNPCommutative, SDNPAssociative]>;
Evan Cheng6be2c582006-04-05 23:38:46 +000026def X86comi : SDNode<"X86ISD::COMI", SDTX86CmpTest,
27 [SDNPOutFlag]>;
28def X86ucomi : SDNode<"X86ISD::UCOMI", SDTX86CmpTest,
29 [SDNPOutFlag]>;
Evan Chengbc4832b2006-03-24 23:15:12 +000030def X86s2vec : SDNode<"X86ISD::S2VEC",
Evan Chengb9df0ca2006-03-22 02:53:00 +000031 SDTypeProfile<1, 1, []>, []>;
Evan Chengbc4832b2006-03-24 23:15:12 +000032def X86zexts2vec : SDNode<"X86ISD::ZEXT_S2VEC",
33 SDTypeProfile<1, 1, []>, []>;
Evan Chengb067a1e2006-03-31 19:22:53 +000034def X86pextrw : SDNode<"X86ISD::PEXTRW",
35 SDTypeProfile<1, 2, []>, []>;
Evan Cheng653159f2006-03-31 21:55:24 +000036def X86pinsrw : SDNode<"X86ISD::PINSRW",
37 SDTypeProfile<1, 3, []>, []>;
Evan Chengc60bd972006-03-25 09:37:23 +000038
Evan Cheng2246f842006-03-18 01:23:20 +000039//===----------------------------------------------------------------------===//
Evan Cheng06a8aa12006-03-17 19:55:52 +000040// SSE pattern fragments
41//===----------------------------------------------------------------------===//
42
43def X86loadpf32 : PatFrag<(ops node:$ptr), (f32 (X86loadp node:$ptr))>;
44def X86loadpf64 : PatFrag<(ops node:$ptr), (f64 (X86loadp node:$ptr))>;
45
Evan Cheng2246f842006-03-18 01:23:20 +000046def loadv4f32 : PatFrag<(ops node:$ptr), (v4f32 (load node:$ptr))>;
47def loadv2f64 : PatFrag<(ops node:$ptr), (v2f64 (load node:$ptr))>;
Evan Cheng24dc1f52006-03-23 07:44:07 +000048def loadv16i8 : PatFrag<(ops node:$ptr), (v16i8 (load node:$ptr))>;
49def loadv8i16 : PatFrag<(ops node:$ptr), (v8i16 (load node:$ptr))>;
50def loadv4i32 : PatFrag<(ops node:$ptr), (v4i32 (load node:$ptr))>;
51def loadv2i64 : PatFrag<(ops node:$ptr), (v2i64 (load node:$ptr))>;
Evan Cheng06a8aa12006-03-17 19:55:52 +000052
Evan Cheng1b32f222006-03-30 07:33:32 +000053def bc_v4f32 : PatFrag<(ops node:$in), (v4f32 (bitconvert node:$in))>;
54def bc_v2f64 : PatFrag<(ops node:$in), (v2f64 (bitconvert node:$in))>;
Evan Cheng506d3df2006-03-29 23:07:14 +000055def bc_v16i8 : PatFrag<(ops node:$in), (v16i8 (bitconvert node:$in))>;
56def bc_v8i16 : PatFrag<(ops node:$in), (v8i16 (bitconvert node:$in))>;
Evan Cheng5aa97b22006-03-29 18:47:40 +000057def bc_v4i32 : PatFrag<(ops node:$in), (v4i32 (bitconvert node:$in))>;
58def bc_v2i64 : PatFrag<(ops node:$in), (v2i64 (bitconvert node:$in))>;
59
Evan Cheng386031a2006-03-24 07:29:27 +000060def fp32imm0 : PatLeaf<(f32 fpimm), [{
61 return N->isExactlyValue(+0.0);
62}]>;
63
Evan Chengff65e382006-04-04 21:49:39 +000064def PSxLDQ_imm : SDNodeXForm<imm, [{
65 // Transformation function: imm >> 3
66 return getI32Imm(N->getValue() >> 3);
67}]>;
68
Evan Cheng63d33002006-03-22 08:01:21 +000069// SHUFFLE_get_shuf_imm xform function: convert vector_shuffle mask to PSHUF*,
70// SHUFP* etc. imm.
71def SHUFFLE_get_shuf_imm : SDNodeXForm<build_vector, [{
72 return getI8Imm(X86::getShuffleSHUFImmediate(N));
Evan Chengb9df0ca2006-03-22 02:53:00 +000073}]>;
74
Evan Cheng506d3df2006-03-29 23:07:14 +000075// SHUFFLE_get_pshufhw_imm xform function: convert vector_shuffle mask to
76// PSHUFHW imm.
77def SHUFFLE_get_pshufhw_imm : SDNodeXForm<build_vector, [{
78 return getI8Imm(X86::getShufflePSHUFHWImmediate(N));
79}]>;
80
81// SHUFFLE_get_pshuflw_imm xform function: convert vector_shuffle mask to
82// PSHUFLW imm.
83def SHUFFLE_get_pshuflw_imm : SDNodeXForm<build_vector, [{
84 return getI8Imm(X86::getShufflePSHUFLWImmediate(N));
85}]>;
86
Evan Cheng691c9232006-03-29 19:02:40 +000087def SSE_splat_mask : PatLeaf<(build_vector), [{
Evan Cheng0188ecb2006-03-22 18:59:22 +000088 return X86::isSplatMask(N);
Evan Cheng691c9232006-03-29 19:02:40 +000089}], SHUFFLE_get_shuf_imm>;
Evan Cheng0188ecb2006-03-22 18:59:22 +000090
Evan Cheng2064a2b2006-03-28 06:50:32 +000091def MOVLHPS_shuffle_mask : PatLeaf<(build_vector), [{
92 return X86::isMOVLHPSMask(N);
93}]>;
94
Evan Cheng2c0dbd02006-03-24 02:58:06 +000095def MOVHLPS_shuffle_mask : PatLeaf<(build_vector), [{
96 return X86::isMOVHLPSMask(N);
Evan Cheng4fcb9222006-03-28 02:43:26 +000097}]>;
Evan Cheng2c0dbd02006-03-24 02:58:06 +000098
Evan Cheng5ced1d82006-04-06 23:23:56 +000099def MOVHP_shuffle_mask : PatLeaf<(build_vector), [{
100 return X86::isMOVHPMask(N);
101}]>;
102
103def MOVLP_shuffle_mask : PatLeaf<(build_vector), [{
104 return X86::isMOVLPMask(N);
105}]>;
106
Evan Chengd6d1cbd2006-04-11 00:19:04 +0000107def MOVS_shuffle_mask : PatLeaf<(build_vector), [{
108 return X86::isMOVSMask(N);
109}]>;
110
Evan Cheng0038e592006-03-28 00:39:58 +0000111def UNPCKL_shuffle_mask : PatLeaf<(build_vector), [{
112 return X86::isUNPCKLMask(N);
113}]>;
114
Evan Cheng4fcb9222006-03-28 02:43:26 +0000115def UNPCKH_shuffle_mask : PatLeaf<(build_vector), [{
116 return X86::isUNPCKHMask(N);
117}]>;
118
Evan Cheng1d5a8cc2006-04-05 07:20:06 +0000119def UNPCKL_v_undef_shuffle_mask : PatLeaf<(build_vector), [{
120 return X86::isUNPCKL_v_undef_Mask(N);
121}]>;
122
Evan Cheng0188ecb2006-03-22 18:59:22 +0000123def PSHUFD_shuffle_mask : PatLeaf<(build_vector), [{
Evan Cheng4f563382006-03-29 01:30:51 +0000124 return X86::isPSHUFDMask(N);
Evan Cheng14aed5e2006-03-24 01:18:28 +0000125}], SHUFFLE_get_shuf_imm>;
Evan Cheng0188ecb2006-03-22 18:59:22 +0000126
Evan Cheng506d3df2006-03-29 23:07:14 +0000127def PSHUFHW_shuffle_mask : PatLeaf<(build_vector), [{
128 return X86::isPSHUFHWMask(N);
129}], SHUFFLE_get_pshufhw_imm>;
130
131def PSHUFLW_shuffle_mask : PatLeaf<(build_vector), [{
132 return X86::isPSHUFLWMask(N);
133}], SHUFFLE_get_pshuflw_imm>;
134
Evan Cheng3d60df42006-04-10 22:35:16 +0000135def SHUFP_unary_shuffle_mask : PatLeaf<(build_vector), [{
136 return X86::isPSHUFDMask(N);
Evan Cheng7d9061e2006-03-30 19:54:57 +0000137}], SHUFFLE_get_shuf_imm>;
138
Evan Cheng14aed5e2006-03-24 01:18:28 +0000139def SHUFP_shuffle_mask : PatLeaf<(build_vector), [{
140 return X86::isSHUFPMask(N);
141}], SHUFFLE_get_shuf_imm>;
Evan Chengb9df0ca2006-03-22 02:53:00 +0000142
Evan Cheng3d60df42006-04-10 22:35:16 +0000143def PSHUFD_binary_shuffle_mask : PatLeaf<(build_vector), [{
144 return X86::isSHUFPMask(N);
Evan Cheng475aecf2006-03-29 03:04:49 +0000145}], SHUFFLE_get_shuf_imm>;
146
Evan Cheng06a8aa12006-03-17 19:55:52 +0000147//===----------------------------------------------------------------------===//
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000148// SSE scalar FP Instructions
149//===----------------------------------------------------------------------===//
150
Evan Cheng470a6ad2006-02-22 02:26:30 +0000151// Instruction templates
152// SSI - SSE1 instructions with XS prefix.
153// SDI - SSE2 instructions with XD prefix.
154// PSI - SSE1 instructions with TB prefix.
155// PDI - SSE2 instructions with TB and OpSize prefixes.
Evan Cheng2da953f2006-03-22 07:10:28 +0000156// PSIi8 - SSE1 instructions with ImmT == Imm8 and TB prefix.
157// PDIi8 - SSE2 instructions with ImmT == Imm8 and TB and OpSize prefixes.
Evan Cheng4b1734f2006-03-31 21:29:33 +0000158// S3SI - SSE3 instructions with XD prefix.
159// S3DI - SSE3 instructions with TB and OpSize prefixes.
Evan Cheng470a6ad2006-02-22 02:26:30 +0000160class SSI<bits<8> o, Format F, dag ops, string asm, list<dag> pattern>
161 : I<o, F, ops, asm, pattern>, XS, Requires<[HasSSE1]>;
162class SDI<bits<8> o, Format F, dag ops, string asm, list<dag> pattern>
163 : I<o, F, ops, asm, pattern>, XD, Requires<[HasSSE2]>;
164class PSI<bits<8> o, Format F, dag ops, string asm, list<dag> pattern>
165 : I<o, F, ops, asm, pattern>, TB, Requires<[HasSSE1]>;
166class PDI<bits<8> o, Format F, dag ops, string asm, list<dag> pattern>
167 : I<o, F, ops, asm, pattern>, TB, OpSize, Requires<[HasSSE2]>;
Evan Cheng2da953f2006-03-22 07:10:28 +0000168class PSIi8<bits<8> o, Format F, dag ops, string asm, list<dag> pattern>
169 : X86Inst<o, F, Imm8, ops, asm>, TB, Requires<[HasSSE1]> {
170 let Pattern = pattern;
171}
172class PDIi8<bits<8> o, Format F, dag ops, string asm, list<dag> pattern>
173 : X86Inst<o, F, Imm8, ops, asm>, TB, OpSize, Requires<[HasSSE2]> {
174 let Pattern = pattern;
175}
Evan Cheng4b1734f2006-03-31 21:29:33 +0000176class S3SI<bits<8> o, Format F, dag ops, string asm, list<dag> pattern>
177 : I<o, F, ops, asm, pattern>, XD, Requires<[HasSSE3]>;
178class S3DI<bits<8> o, Format F, dag ops, string asm, list<dag> pattern>
179 : I<o, F, ops, asm, pattern>, TB, OpSize, Requires<[HasSSE3]>;
180
181//===----------------------------------------------------------------------===//
182// Helpers for defining instructions that directly correspond to intrinsics.
Evan Cheng6e967402006-04-04 00:10:53 +0000183class SS_Intr<bits<8> o, string asm, Intrinsic IntId>
184 : SSI<o, MRMSrcReg, (ops VR128:$dst, VR128:$src), asm,
185 [(set VR128:$dst, (v4f32 (IntId VR128:$src)))]>;
186class SS_Intm<bits<8> o, string asm, Intrinsic IntId>
187 : SSI<o, MRMSrcMem, (ops VR128:$dst, f32mem:$src), asm,
188 [(set VR128:$dst, (v4f32 (IntId (load addr:$src))))]>;
189class SD_Intr<bits<8> o, string asm, Intrinsic IntId>
190 : SDI<o, MRMSrcReg, (ops VR128:$dst, VR128:$src), asm,
191 [(set VR128:$dst, (v2f64 (IntId VR128:$src)))]>;
192class SD_Intm<bits<8> o, string asm, Intrinsic IntId>
193 : SDI<o, MRMSrcMem, (ops VR128:$dst, f64mem:$src), asm,
194 [(set VR128:$dst, (v2f64 (IntId (load addr:$src))))]>;
195
196class SS_Intrr<bits<8> o, string asm, Intrinsic IntId>
Evan Cheng97ac5fa2006-04-03 23:49:17 +0000197 : SSI<o, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2), asm,
Evan Cheng6e967402006-04-04 00:10:53 +0000198 [(set VR128:$dst, (v4f32 (IntId VR128:$src1, VR128:$src2)))]>;
199class SS_Intrm<bits<8> o, string asm, Intrinsic IntId>
Evan Cheng97ac5fa2006-04-03 23:49:17 +0000200 : SSI<o, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f32mem:$src2), asm,
Evan Cheng6e967402006-04-04 00:10:53 +0000201 [(set VR128:$dst, (v4f32 (IntId VR128:$src1, (load addr:$src2))))]>;
202class SD_Intrr<bits<8> o, string asm, Intrinsic IntId>
Evan Cheng97ac5fa2006-04-03 23:49:17 +0000203 : SDI<o, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2), asm,
Evan Cheng6e967402006-04-04 00:10:53 +0000204 [(set VR128:$dst, (v2f64 (IntId VR128:$src1, VR128:$src2)))]>;
205class SD_Intrm<bits<8> o, string asm, Intrinsic IntId>
Evan Cheng97ac5fa2006-04-03 23:49:17 +0000206 : SDI<o, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f64mem:$src2), asm,
Evan Cheng6e967402006-04-04 00:10:53 +0000207 [(set VR128:$dst, (v2f64 (IntId VR128:$src1, (load addr:$src2))))]>;
Evan Cheng97ac5fa2006-04-03 23:49:17 +0000208
209class PS_Intr<bits<8> o, string asm, Intrinsic IntId>
210 : PSI<o, MRMSrcReg, (ops VR128:$dst, VR128:$src), asm,
211 [(set VR128:$dst, (IntId VR128:$src))]>;
212class PS_Intm<bits<8> o, string asm, Intrinsic IntId>
213 : PSI<o, MRMSrcMem, (ops VR128:$dst, f32mem:$src), asm,
214 [(set VR128:$dst, (IntId (loadv4f32 addr:$src)))]>;
215class PD_Intr<bits<8> o, string asm, Intrinsic IntId>
216 : PDI<o, MRMSrcReg, (ops VR128:$dst, VR128:$src), asm,
217 [(set VR128:$dst, (IntId VR128:$src))]>;
218class PD_Intm<bits<8> o, string asm, Intrinsic IntId>
219 : PDI<o, MRMSrcMem, (ops VR128:$dst, f64mem:$src), asm,
220 [(set VR128:$dst, (IntId (loadv2f64 addr:$src)))]>;
221
222class PS_Intrr<bits<8> o, string asm, Intrinsic IntId>
223 : PSI<o, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2), asm,
224 [(set VR128:$dst, (IntId VR128:$src1, VR128:$src2))]>;
225class PS_Intrm<bits<8> o, string asm, Intrinsic IntId>
226 : PSI<o, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f32mem:$src2), asm,
227 [(set VR128:$dst, (IntId VR128:$src1, (loadv4f32 addr:$src2)))]>;
228class PD_Intrr<bits<8> o, string asm, Intrinsic IntId>
229 : PDI<o, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2), asm,
230 [(set VR128:$dst, (IntId VR128:$src1, VR128:$src2))]>;
231class PD_Intrm<bits<8> o, string asm, Intrinsic IntId>
232 : PDI<o, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f64mem:$src2), asm,
233 [(set VR128:$dst, (IntId VR128:$src1, (loadv2f64 addr:$src2)))]>;
234
Evan Cheng4b1734f2006-03-31 21:29:33 +0000235class S3S_Intrr<bits<8> o, string asm, Intrinsic IntId>
236 : S3SI<o, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2), asm,
237 [(set VR128:$dst, (v4f32 (IntId VR128:$src1, VR128:$src2)))]>;
238class S3S_Intrm<bits<8> o, string asm, Intrinsic IntId>
239 : S3SI<o, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2), asm,
240 [(set VR128:$dst, (v4f32 (IntId VR128:$src1,
241 (loadv4f32 addr:$src2))))]>;
242class S3D_Intrr<bits<8> o, string asm, Intrinsic IntId>
243 : S3DI<o, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2), asm,
244 [(set VR128:$dst, (v2f64 (IntId VR128:$src1, VR128:$src2)))]>;
245class S3D_Intrm<bits<8> o, string asm, Intrinsic IntId>
246 : S3DI<o, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2), asm,
247 [(set VR128:$dst, (v2f64 (IntId VR128:$src1,
248 (loadv2f64 addr:$src2))))]>;
Evan Cheng470a6ad2006-02-22 02:26:30 +0000249
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000250// Some 'special' instructions
251def IMPLICIT_DEF_FR32 : I<0, Pseudo, (ops FR32:$dst),
252 "#IMPLICIT_DEF $dst",
253 [(set FR32:$dst, (undef))]>, Requires<[HasSSE2]>;
254def IMPLICIT_DEF_FR64 : I<0, Pseudo, (ops FR64:$dst),
255 "#IMPLICIT_DEF $dst",
256 [(set FR64:$dst, (undef))]>, Requires<[HasSSE2]>;
257
258// CMOV* - Used to implement the SSE SELECT DAG operation. Expanded by the
259// scheduler into a branch sequence.
260let usesCustomDAGSchedInserter = 1 in { // Expanded by the scheduler.
261 def CMOV_FR32 : I<0, Pseudo,
262 (ops FR32:$dst, FR32:$t, FR32:$f, i8imm:$cond),
263 "#CMOV_FR32 PSEUDO!",
264 [(set FR32:$dst, (X86cmov FR32:$t, FR32:$f, imm:$cond))]>;
265 def CMOV_FR64 : I<0, Pseudo,
266 (ops FR64:$dst, FR64:$t, FR64:$f, i8imm:$cond),
267 "#CMOV_FR64 PSEUDO!",
268 [(set FR64:$dst, (X86cmov FR64:$t, FR64:$f, imm:$cond))]>;
Evan Chengf7c378e2006-04-10 07:23:14 +0000269 def CMOV_V4F32 : I<0, Pseudo,
270 (ops VR128:$dst, VR128:$t, VR128:$f, i8imm:$cond),
271 "#CMOV_V4F32 PSEUDO!",
272 [(set VR128:$dst,
273 (v4f32 (X86cmov VR128:$t, VR128:$f, imm:$cond)))]>;
274 def CMOV_V2F64 : I<0, Pseudo,
275 (ops VR128:$dst, VR128:$t, VR128:$f, i8imm:$cond),
276 "#CMOV_V2F64 PSEUDO!",
277 [(set VR128:$dst,
278 (v2f64 (X86cmov VR128:$t, VR128:$f, imm:$cond)))]>;
279 def CMOV_V2I64 : I<0, Pseudo,
280 (ops VR128:$dst, VR128:$t, VR128:$f, i8imm:$cond),
281 "#CMOV_V2I64 PSEUDO!",
282 [(set VR128:$dst,
283 (v2i64 (X86cmov VR128:$t, VR128:$f, imm:$cond)))]>;
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000284}
285
286// Move Instructions
Evan Cheng470a6ad2006-02-22 02:26:30 +0000287def MOVSSrr : SSI<0x10, MRMSrcReg, (ops FR32:$dst, FR32:$src),
288 "movss {$src, $dst|$dst, $src}", []>;
289def MOVSSrm : SSI<0x10, MRMSrcMem, (ops FR32:$dst, f32mem:$src),
290 "movss {$src, $dst|$dst, $src}",
291 [(set FR32:$dst, (loadf32 addr:$src))]>;
292def MOVSDrr : SDI<0x10, MRMSrcReg, (ops FR64:$dst, FR64:$src),
293 "movsd {$src, $dst|$dst, $src}", []>;
294def MOVSDrm : SDI<0x10, MRMSrcMem, (ops FR64:$dst, f64mem:$src),
295 "movsd {$src, $dst|$dst, $src}",
296 [(set FR64:$dst, (loadf64 addr:$src))]>;
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000297
Evan Cheng470a6ad2006-02-22 02:26:30 +0000298def MOVSSmr : SSI<0x11, MRMDestMem, (ops f32mem:$dst, FR32:$src),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000299 "movss {$src, $dst|$dst, $src}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000300 [(store FR32:$src, addr:$dst)]>;
301def MOVSDmr : SDI<0x11, MRMDestMem, (ops f64mem:$dst, FR64:$src),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000302 "movsd {$src, $dst|$dst, $src}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000303 [(store FR64:$src, addr:$dst)]>;
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000304
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000305// Arithmetic instructions
306let isTwoAddress = 1 in {
307let isCommutable = 1 in {
Evan Cheng470a6ad2006-02-22 02:26:30 +0000308def ADDSSrr : SSI<0x58, MRMSrcReg, (ops FR32:$dst, FR32:$src1, FR32:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000309 "addss {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000310 [(set FR32:$dst, (fadd FR32:$src1, FR32:$src2))]>;
311def ADDSDrr : SDI<0x58, MRMSrcReg, (ops FR64:$dst, FR64:$src1, FR64:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000312 "addsd {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000313 [(set FR64:$dst, (fadd FR64:$src1, FR64:$src2))]>;
314def MULSSrr : SSI<0x59, MRMSrcReg, (ops FR32:$dst, FR32:$src1, FR32:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000315 "mulss {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000316 [(set FR32:$dst, (fmul FR32:$src1, FR32:$src2))]>;
317def MULSDrr : SDI<0x59, MRMSrcReg, (ops FR64:$dst, FR64:$src1, FR64:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000318 "mulsd {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000319 [(set FR64:$dst, (fmul FR64:$src1, FR64:$src2))]>;
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000320}
321
Evan Cheng470a6ad2006-02-22 02:26:30 +0000322def ADDSSrm : SSI<0x58, MRMSrcMem, (ops FR32:$dst, FR32:$src1, f32mem:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000323 "addss {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000324 [(set FR32:$dst, (fadd FR32:$src1, (loadf32 addr:$src2)))]>;
325def ADDSDrm : SDI<0x58, MRMSrcMem, (ops FR64:$dst, FR64:$src1, f64mem:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000326 "addsd {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000327 [(set FR64:$dst, (fadd FR64:$src1, (loadf64 addr:$src2)))]>;
328def MULSSrm : SSI<0x59, MRMSrcMem, (ops FR32:$dst, FR32:$src1, f32mem:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000329 "mulss {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000330 [(set FR32:$dst, (fmul FR32:$src1, (loadf32 addr:$src2)))]>;
331def MULSDrm : SDI<0x59, MRMSrcMem, (ops FR64:$dst, FR64:$src1, f64mem:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000332 "mulsd {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000333 [(set FR64:$dst, (fmul FR64:$src1, (loadf64 addr:$src2)))]>;
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000334
Evan Cheng470a6ad2006-02-22 02:26:30 +0000335def DIVSSrr : SSI<0x5E, MRMSrcReg, (ops FR32:$dst, FR32:$src1, FR32:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000336 "divss {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000337 [(set FR32:$dst, (fdiv FR32:$src1, FR32:$src2))]>;
338def DIVSSrm : SSI<0x5E, MRMSrcMem, (ops FR32:$dst, FR32:$src1, f32mem:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000339 "divss {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000340 [(set FR32:$dst, (fdiv FR32:$src1, (loadf32 addr:$src2)))]>;
341def DIVSDrr : SDI<0x5E, MRMSrcReg, (ops FR64:$dst, FR64:$src1, FR64:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000342 "divsd {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000343 [(set FR64:$dst, (fdiv FR64:$src1, FR64:$src2))]>;
344def DIVSDrm : SDI<0x5E, MRMSrcMem, (ops FR64:$dst, FR64:$src1, f64mem:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000345 "divsd {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000346 [(set FR64:$dst, (fdiv FR64:$src1, (loadf64 addr:$src2)))]>;
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000347
Evan Cheng470a6ad2006-02-22 02:26:30 +0000348def SUBSSrr : SSI<0x5C, MRMSrcReg, (ops FR32:$dst, FR32:$src1, FR32:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000349 "subss {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000350 [(set FR32:$dst, (fsub FR32:$src1, FR32:$src2))]>;
351def SUBSSrm : SSI<0x5C, MRMSrcMem, (ops FR32:$dst, FR32:$src1, f32mem:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000352 "subss {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000353 [(set FR32:$dst, (fsub FR32:$src1, (loadf32 addr:$src2)))]>;
354def SUBSDrr : SDI<0x5C, MRMSrcReg, (ops FR64:$dst, FR64:$src1, FR64:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000355 "subsd {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000356 [(set FR64:$dst, (fsub FR64:$src1, FR64:$src2))]>;
357def SUBSDrm : SDI<0x5C, MRMSrcMem, (ops FR64:$dst, FR64:$src1, f64mem:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000358 "subsd {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000359 [(set FR64:$dst, (fsub FR64:$src1, (loadf64 addr:$src2)))]>;
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000360}
361
Evan Cheng8703be42006-04-04 19:12:30 +0000362def SQRTSSr : SSI<0x51, MRMSrcReg, (ops FR32:$dst, FR32:$src),
363 "sqrtss {$src, $dst|$dst, $src}",
364 [(set FR32:$dst, (fsqrt FR32:$src))]>;
365def SQRTSSm : SSI<0x51, MRMSrcMem, (ops FR32:$dst, f32mem:$src),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000366 "sqrtss {$src, $dst|$dst, $src}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000367 [(set FR32:$dst, (fsqrt (loadf32 addr:$src)))]>;
Evan Cheng8703be42006-04-04 19:12:30 +0000368def SQRTSDr : SDI<0x51, MRMSrcReg, (ops FR64:$dst, FR64:$src),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000369 "sqrtsd {$src, $dst|$dst, $src}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000370 [(set FR64:$dst, (fsqrt FR64:$src))]>;
Evan Cheng8703be42006-04-04 19:12:30 +0000371def SQRTSDm : SDI<0x51, MRMSrcMem, (ops FR64:$dst, f64mem:$src),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000372 "sqrtsd {$src, $dst|$dst, $src}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000373 [(set FR64:$dst, (fsqrt (loadf64 addr:$src)))]>;
374
Evan Cheng8703be42006-04-04 19:12:30 +0000375def RSQRTSSr : SSI<0x52, MRMSrcReg, (ops FR32:$dst, FR32:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000376 "rsqrtss {$src, $dst|$dst, $src}", []>;
Evan Cheng8703be42006-04-04 19:12:30 +0000377def RSQRTSSm : SSI<0x52, MRMSrcMem, (ops FR32:$dst, f32mem:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000378 "rsqrtss {$src, $dst|$dst, $src}", []>;
Evan Cheng8703be42006-04-04 19:12:30 +0000379def RCPSSr : SSI<0x53, MRMSrcReg, (ops FR32:$dst, FR32:$src),
380 "rcpss {$src, $dst|$dst, $src}", []>;
381def RCPSSm : SSI<0x53, MRMSrcMem, (ops FR32:$dst, f32mem:$src),
382 "rcpss {$src, $dst|$dst, $src}", []>;
Evan Cheng470a6ad2006-02-22 02:26:30 +0000383
Evan Cheng8703be42006-04-04 19:12:30 +0000384let isTwoAddress = 1 in {
385def MAXSSrr : SSI<0x5F, MRMSrcReg, (ops FR32:$dst, FR32:$src1, FR32:$src2),
386 "maxss {$src2, $dst|$dst, $src2}", []>;
387def MAXSSrm : SSI<0x5F, MRMSrcMem, (ops FR32:$dst, FR32:$src1, f32mem:$src2),
388 "maxss {$src2, $dst|$dst, $src2}", []>;
389def MAXSDrr : SDI<0x5F, MRMSrcReg, (ops FR64:$dst, FR32:$src1, FR64:$src2),
390 "maxsd {$src2, $dst|$dst, $src2}", []>;
391def MAXSDrm : SDI<0x5F, MRMSrcMem, (ops FR64:$dst, FR32:$src1, f64mem:$src2),
392 "maxsd {$src2, $dst|$dst, $src2}", []>;
393def MINSSrr : SSI<0x5D, MRMSrcReg, (ops FR32:$dst, FR32:$src1, FR32:$src2),
394 "minss {$src2, $dst|$dst, $src2}", []>;
395def MINSSrm : SSI<0x5D, MRMSrcMem, (ops FR32:$dst, FR32:$src1, f32mem:$src2),
396 "minss {$src2, $dst|$dst, $src2}", []>;
397def MINSDrr : SDI<0x5D, MRMSrcReg, (ops FR64:$dst, FR32:$src1, FR64:$src2),
398 "minsd {$src2, $dst|$dst, $src2}", []>;
399def MINSDrm : SDI<0x5D, MRMSrcMem, (ops FR64:$dst, FR32:$src1, f64mem:$src2),
400 "minsd {$src2, $dst|$dst, $src2}", []>;
401}
Evan Chengc46349d2006-03-28 23:51:43 +0000402
403// Aliases to match intrinsics which expect XMM operand(s).
404let isTwoAddress = 1 in {
405let isCommutable = 1 in {
Evan Cheng6e967402006-04-04 00:10:53 +0000406def Int_ADDSSrr : SS_Intrr<0x58, "addss {$src2, $dst|$dst, $src2}",
407 int_x86_sse_add_ss>;
408def Int_ADDSDrr : SD_Intrr<0x58, "addsd {$src2, $dst|$dst, $src2}",
409 int_x86_sse2_add_sd>;
410def Int_MULSSrr : SS_Intrr<0x59, "mulss {$src2, $dst|$dst, $src2}",
411 int_x86_sse_mul_ss>;
412def Int_MULSDrr : SD_Intrr<0x59, "mulsd {$src2, $dst|$dst, $src2}",
413 int_x86_sse2_mul_sd>;
Evan Chengc46349d2006-03-28 23:51:43 +0000414}
415
Evan Cheng6e967402006-04-04 00:10:53 +0000416def Int_ADDSSrm : SS_Intrm<0x58, "addss {$src2, $dst|$dst, $src2}",
417 int_x86_sse_add_ss>;
418def Int_ADDSDrm : SD_Intrm<0x58, "addsd {$src2, $dst|$dst, $src2}",
419 int_x86_sse2_add_sd>;
420def Int_MULSSrm : SS_Intrm<0x59, "mulss {$src2, $dst|$dst, $src2}",
421 int_x86_sse_mul_ss>;
422def Int_MULSDrm : SD_Intrm<0x59, "mulsd {$src2, $dst|$dst, $src2}",
423 int_x86_sse2_mul_sd>;
Evan Chengc46349d2006-03-28 23:51:43 +0000424
Evan Cheng6e967402006-04-04 00:10:53 +0000425def Int_DIVSSrr : SS_Intrr<0x5E, "divss {$src2, $dst|$dst, $src2}",
426 int_x86_sse_div_ss>;
427def Int_DIVSSrm : SS_Intrm<0x5E, "divss {$src2, $dst|$dst, $src2}",
428 int_x86_sse_div_ss>;
429def Int_DIVSDrr : SD_Intrr<0x5E, "divsd {$src2, $dst|$dst, $src2}",
430 int_x86_sse2_div_sd>;
431def Int_DIVSDrm : SD_Intrm<0x5E, "divsd {$src2, $dst|$dst, $src2}",
432 int_x86_sse2_div_sd>;
Evan Chengc46349d2006-03-28 23:51:43 +0000433
Evan Cheng6e967402006-04-04 00:10:53 +0000434def Int_SUBSSrr : SS_Intrr<0x5C, "subss {$src2, $dst|$dst, $src2}",
435 int_x86_sse_sub_ss>;
436def Int_SUBSSrm : SS_Intrm<0x5C, "subss {$src2, $dst|$dst, $src2}",
437 int_x86_sse_sub_ss>;
438def Int_SUBSDrr : SD_Intrr<0x5C, "subsd {$src2, $dst|$dst, $src2}",
439 int_x86_sse2_sub_sd>;
440def Int_SUBSDrm : SD_Intrm<0x5C, "subsd {$src2, $dst|$dst, $src2}",
441 int_x86_sse2_sub_sd>;
Evan Chengc46349d2006-03-28 23:51:43 +0000442}
443
Evan Cheng8703be42006-04-04 19:12:30 +0000444def Int_SQRTSSr : SS_Intr<0x51, "sqrtss {$src, $dst|$dst, $src}",
445 int_x86_sse_sqrt_ss>;
446def Int_SQRTSSm : SS_Intm<0x51, "sqrtss {$src, $dst|$dst, $src}",
447 int_x86_sse_sqrt_ss>;
448def Int_SQRTSDr : SD_Intr<0x51, "sqrtsd {$src, $dst|$dst, $src}",
449 int_x86_sse2_sqrt_sd>;
450def Int_SQRTSDm : SD_Intm<0x51, "sqrtsd {$src, $dst|$dst, $src}",
451 int_x86_sse2_sqrt_sd>;
Evan Chengc46349d2006-03-28 23:51:43 +0000452
Evan Cheng8703be42006-04-04 19:12:30 +0000453def Int_RSQRTSSr : SS_Intr<0x52, "rsqrtss {$src, $dst|$dst, $src}",
454 int_x86_sse_rsqrt_ss>;
455def Int_RSQRTSSm : SS_Intm<0x52, "rsqrtss {$src, $dst|$dst, $src}",
456 int_x86_sse_rsqrt_ss>;
457def Int_RCPSSr : SS_Intr<0x53, "rcpss {$src, $dst|$dst, $src}",
458 int_x86_sse_rcp_ss>;
459def Int_RCPSSm : SS_Intm<0x53, "rcpss {$src, $dst|$dst, $src}",
460 int_x86_sse_rcp_ss>;
Evan Chengc46349d2006-03-28 23:51:43 +0000461
462let isTwoAddress = 1 in {
Evan Cheng97ac5fa2006-04-03 23:49:17 +0000463def Int_MAXSSrr : SS_Intrr<0x5F, "maxss {$src2, $dst|$dst, $src2}",
Evan Cheng6e967402006-04-04 00:10:53 +0000464 int_x86_sse_max_ss>;
Evan Cheng97ac5fa2006-04-03 23:49:17 +0000465def Int_MAXSSrm : SS_Intrm<0x5F, "maxss {$src2, $dst|$dst, $src2}",
Evan Cheng6e967402006-04-04 00:10:53 +0000466 int_x86_sse_max_ss>;
Evan Cheng97ac5fa2006-04-03 23:49:17 +0000467def Int_MAXSDrr : SD_Intrr<0x5F, "maxsd {$src2, $dst|$dst, $src2}",
Evan Cheng6e967402006-04-04 00:10:53 +0000468 int_x86_sse2_max_sd>;
Evan Cheng97ac5fa2006-04-03 23:49:17 +0000469def Int_MAXSDrm : SD_Intrm<0x5F, "maxsd {$src2, $dst|$dst, $src2}",
Evan Cheng6e967402006-04-04 00:10:53 +0000470 int_x86_sse2_max_sd>;
Evan Cheng97ac5fa2006-04-03 23:49:17 +0000471def Int_MINSSrr : SS_Intrr<0x5D, "minss {$src2, $dst|$dst, $src2}",
Evan Cheng6e967402006-04-04 00:10:53 +0000472 int_x86_sse_min_ss>;
Evan Cheng97ac5fa2006-04-03 23:49:17 +0000473def Int_MINSSrm : SS_Intrm<0x5D, "minss {$src2, $dst|$dst, $src2}",
Evan Cheng6e967402006-04-04 00:10:53 +0000474 int_x86_sse_min_ss>;
Evan Cheng97ac5fa2006-04-03 23:49:17 +0000475def Int_MINSDrr : SD_Intrr<0x5D, "minsd {$src2, $dst|$dst, $src2}",
Evan Cheng6e967402006-04-04 00:10:53 +0000476 int_x86_sse2_min_sd>;
Evan Cheng97ac5fa2006-04-03 23:49:17 +0000477def Int_MINSDrm : SD_Intrm<0x5D, "minsd {$src2, $dst|$dst, $src2}",
Evan Cheng6e967402006-04-04 00:10:53 +0000478 int_x86_sse2_min_sd>;
Evan Chengc46349d2006-03-28 23:51:43 +0000479}
480
481// Conversion instructions
Evan Chengc46349d2006-03-28 23:51:43 +0000482def CVTTSS2SIrr: SSI<0x2C, MRMSrcReg, (ops R32:$dst, FR32:$src),
Evan Cheng8703be42006-04-04 19:12:30 +0000483 "cvttss2si {$src, $dst|$dst, $src}",
484 [(set R32:$dst, (fp_to_sint FR32:$src))]>;
Evan Chengc46349d2006-03-28 23:51:43 +0000485def CVTTSS2SIrm: SSI<0x2C, MRMSrcMem, (ops R32:$dst, f32mem:$src),
Evan Cheng8703be42006-04-04 19:12:30 +0000486 "cvttss2si {$src, $dst|$dst, $src}",
487 [(set R32:$dst, (fp_to_sint (loadf32 addr:$src)))]>;
Evan Chengc46349d2006-03-28 23:51:43 +0000488def CVTTSD2SIrr: SDI<0x2C, MRMSrcReg, (ops R32:$dst, FR64:$src),
Evan Cheng8703be42006-04-04 19:12:30 +0000489 "cvttsd2si {$src, $dst|$dst, $src}",
490 [(set R32:$dst, (fp_to_sint FR64:$src))]>;
Evan Chengc46349d2006-03-28 23:51:43 +0000491def CVTTSD2SIrm: SDI<0x2C, MRMSrcMem, (ops R32:$dst, f64mem:$src),
Evan Cheng8703be42006-04-04 19:12:30 +0000492 "cvttsd2si {$src, $dst|$dst, $src}",
493 [(set R32:$dst, (fp_to_sint (loadf64 addr:$src)))]>;
Evan Chengc46349d2006-03-28 23:51:43 +0000494def CVTSD2SSrr: SDI<0x5A, MRMSrcReg, (ops FR32:$dst, FR64:$src),
Evan Cheng8703be42006-04-04 19:12:30 +0000495 "cvtsd2ss {$src, $dst|$dst, $src}",
496 [(set FR32:$dst, (fround FR64:$src))]>;
Evan Chengc46349d2006-03-28 23:51:43 +0000497def CVTSD2SSrm: SDI<0x5A, MRMSrcMem, (ops FR32:$dst, f64mem:$src),
Evan Cheng8703be42006-04-04 19:12:30 +0000498 "cvtsd2ss {$src, $dst|$dst, $src}",
499 [(set FR32:$dst, (fround (loadf64 addr:$src)))]>;
Evan Chengc46349d2006-03-28 23:51:43 +0000500def CVTSI2SSrr: SSI<0x2A, MRMSrcReg, (ops FR32:$dst, R32:$src),
501 "cvtsi2ss {$src, $dst|$dst, $src}",
502 [(set FR32:$dst, (sint_to_fp R32:$src))]>;
503def CVTSI2SSrm: SSI<0x2A, MRMSrcMem, (ops FR32:$dst, i32mem:$src),
Evan Cheng8703be42006-04-04 19:12:30 +0000504 "cvtsi2ss {$src, $dst|$dst, $src}",
505 [(set FR32:$dst, (sint_to_fp (loadi32 addr:$src)))]>;
Evan Chengc46349d2006-03-28 23:51:43 +0000506def CVTSI2SDrr: SDI<0x2A, MRMSrcReg, (ops FR64:$dst, R32:$src),
Evan Cheng8703be42006-04-04 19:12:30 +0000507 "cvtsi2sd {$src, $dst|$dst, $src}",
508 [(set FR64:$dst, (sint_to_fp R32:$src))]>;
Evan Chengc46349d2006-03-28 23:51:43 +0000509def CVTSI2SDrm: SDI<0x2A, MRMSrcMem, (ops FR64:$dst, i32mem:$src),
Evan Cheng8703be42006-04-04 19:12:30 +0000510 "cvtsi2sd {$src, $dst|$dst, $src}",
511 [(set FR64:$dst, (sint_to_fp (loadi32 addr:$src)))]>;
Evan Chengd2a6d542006-04-12 23:42:44 +0000512
Evan Chengc46349d2006-03-28 23:51:43 +0000513// SSE2 instructions with XS prefix
514def CVTSS2SDrr: I<0x5A, MRMSrcReg, (ops FR64:$dst, FR32:$src),
Evan Cheng8703be42006-04-04 19:12:30 +0000515 "cvtss2sd {$src, $dst|$dst, $src}",
516 [(set FR64:$dst, (fextend FR32:$src))]>, XS,
Evan Chengc46349d2006-03-28 23:51:43 +0000517 Requires<[HasSSE2]>;
518def CVTSS2SDrm: I<0x5A, MRMSrcMem, (ops FR64:$dst, f32mem:$src),
Evan Cheng8703be42006-04-04 19:12:30 +0000519 "cvtss2sd {$src, $dst|$dst, $src}",
520 [(set FR64:$dst, (fextend (loadf32 addr:$src)))]>, XS,
Evan Chengc46349d2006-03-28 23:51:43 +0000521 Requires<[HasSSE2]>;
522
Evan Chengd2a6d542006-04-12 23:42:44 +0000523// Match intrinsics which expect XMM operand(s).
524def CVTSS2SIrr: SSI<0x2D, MRMSrcReg, (ops R32:$dst, VR128:$src),
525 "cvtss2si {$src, $dst|$dst, $src}",
526 [(set R32:$dst, (int_x86_sse_cvtss2si VR128:$src))]>;
527def CVTSS2SIrm: SSI<0x2D, MRMSrcMem, (ops R32:$dst, f32mem:$src),
528 "cvtss2si {$src, $dst|$dst, $src}",
529 [(set R32:$dst, (int_x86_sse_cvtss2si
530 (loadv4f32 addr:$src)))]>;
531
532// Aliases for intrinsics
533def Int_CVTTSS2SIrr: SSI<0x2C, MRMSrcReg, (ops R32:$dst, VR128:$src),
534 "cvttss2si {$src, $dst|$dst, $src}",
535 [(set R32:$dst, (int_x86_sse_cvttss2si VR128:$src))]>;
536def Int_CVTTSS2SIrm: SSI<0x2C, MRMSrcMem, (ops R32:$dst, f32mem:$src),
537 "cvttss2si {$src, $dst|$dst, $src}",
538 [(set R32:$dst, (int_x86_sse_cvttss2si
539 (loadv4f32 addr:$src)))]>;
Evan Chengd03db7a2006-04-12 05:20:24 +0000540def Int_CVTTSD2SIrr: SDI<0x2C, MRMSrcReg, (ops R32:$dst, VR128:$src),
541 "cvttsd2si {$src, $dst|$dst, $src}",
542 [(set R32:$dst, (int_x86_sse2_cvttsd2si VR128:$src))]>;
543def Int_CVTTSD2SIrm: SDI<0x2C, MRMSrcMem, (ops R32:$dst, f128mem:$src),
544 "cvttsd2si {$src, $dst|$dst, $src}",
545 [(set R32:$dst, (int_x86_sse2_cvttsd2si
Evan Cheng91b740d2006-04-12 17:12:36 +0000546 (loadv2f64 addr:$src)))]>;
Evan Chengd03db7a2006-04-12 05:20:24 +0000547
Evan Chengd2a6d542006-04-12 23:42:44 +0000548let isTwoAddress = 1 in {
549def Int_CVTSI2SSrr: SSI<0x2A, MRMSrcReg,
550 (ops VR128:$dst, VR128:$src1, R32:$src2),
551 "cvtsi2ss {$src2, $dst|$dst, $src2}",
552 [(set VR128:$dst, (int_x86_sse_cvtsi2ss VR128:$src1,
553 R32:$src2))]>;
554def Int_CVTSI2SSrm: SSI<0x2A, MRMSrcMem,
555 (ops VR128:$dst, VR128:$src1, i32mem:$src2),
556 "cvtsi2ss {$src2, $dst|$dst, $src2}",
557 [(set VR128:$dst, (int_x86_sse_cvtsi2ss VR128:$src1,
558 (loadi32 addr:$src2)))]>;
559}
Evan Chengd03db7a2006-04-12 05:20:24 +0000560
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000561// Comparison instructions
562let isTwoAddress = 1 in {
Evan Cheng470a6ad2006-02-22 02:26:30 +0000563def CMPSSrr : SSI<0xC2, MRMSrcReg,
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000564 (ops FR32:$dst, FR32:$src1, FR32:$src, SSECC:$cc),
Evan Cheng0876aa52006-03-30 06:21:22 +0000565 "cmp${cc}ss {$src, $dst|$dst, $src}",
566 []>;
Evan Cheng470a6ad2006-02-22 02:26:30 +0000567def CMPSSrm : SSI<0xC2, MRMSrcMem,
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000568 (ops FR32:$dst, FR32:$src1, f32mem:$src, SSECC:$cc),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000569 "cmp${cc}ss {$src, $dst|$dst, $src}", []>;
570def CMPSDrr : SDI<0xC2, MRMSrcReg,
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000571 (ops FR64:$dst, FR64:$src1, FR64:$src, SSECC:$cc),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000572 "cmp${cc}sd {$src, $dst|$dst, $src}", []>;
573def CMPSDrm : SDI<0xC2, MRMSrcMem,
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000574 (ops FR64:$dst, FR64:$src1, f64mem:$src, SSECC:$cc),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000575 "cmp${cc}sd {$src, $dst|$dst, $src}", []>;
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000576}
577
Evan Cheng470a6ad2006-02-22 02:26:30 +0000578def UCOMISSrr: PSI<0x2E, MRMSrcReg, (ops FR32:$src1, FR32:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000579 "ucomiss {$src2, $src1|$src1, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000580 [(X86cmp FR32:$src1, FR32:$src2)]>;
581def UCOMISSrm: PSI<0x2E, MRMSrcMem, (ops FR32:$src1, f32mem:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000582 "ucomiss {$src2, $src1|$src1, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000583 [(X86cmp FR32:$src1, (loadf32 addr:$src2))]>;
584def UCOMISDrr: PDI<0x2E, MRMSrcReg, (ops FR64:$src1, FR64:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000585 "ucomisd {$src2, $src1|$src1, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000586 [(X86cmp FR64:$src1, FR64:$src2)]>;
587def UCOMISDrm: PDI<0x2E, MRMSrcMem, (ops FR64:$src1, f64mem:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000588 "ucomisd {$src2, $src1|$src1, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000589 [(X86cmp FR64:$src1, (loadf64 addr:$src2))]>;
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000590
Evan Cheng0876aa52006-03-30 06:21:22 +0000591// Aliases to match intrinsics which expect XMM operand(s).
592let isTwoAddress = 1 in {
593def Int_CMPSSrr : SSI<0xC2, MRMSrcReg,
594 (ops VR128:$dst, VR128:$src1, VR128:$src, SSECC:$cc),
595 "cmp${cc}ss {$src, $dst|$dst, $src}",
596 [(set VR128:$dst, (int_x86_sse_cmp_ss VR128:$src1,
597 VR128:$src, imm:$cc))]>;
598def Int_CMPSSrm : SSI<0xC2, MRMSrcMem,
599 (ops VR128:$dst, VR128:$src1, f32mem:$src, SSECC:$cc),
600 "cmp${cc}ss {$src, $dst|$dst, $src}",
601 [(set VR128:$dst, (int_x86_sse_cmp_ss VR128:$src1,
602 (load addr:$src), imm:$cc))]>;
603def Int_CMPSDrr : SDI<0xC2, MRMSrcReg,
604 (ops VR128:$dst, VR128:$src1, VR128:$src, SSECC:$cc),
605 "cmp${cc}sd {$src, $dst|$dst, $src}", []>;
606def Int_CMPSDrm : SDI<0xC2, MRMSrcMem,
607 (ops VR128:$dst, VR128:$src1, f64mem:$src, SSECC:$cc),
608 "cmp${cc}sd {$src, $dst|$dst, $src}", []>;
609}
610
Evan Cheng6be2c582006-04-05 23:38:46 +0000611def Int_UCOMISSrr: PSI<0x2E, MRMSrcReg, (ops VR128:$src1, VR128:$src2),
612 "ucomiss {$src2, $src1|$src1, $src2}",
613 [(X86ucomi (v4f32 VR128:$src1), VR128:$src2)]>;
614def Int_UCOMISSrm: PSI<0x2E, MRMSrcMem, (ops VR128:$src1, f128mem:$src2),
615 "ucomiss {$src2, $src1|$src1, $src2}",
616 [(X86ucomi (v4f32 VR128:$src1), (loadv4f32 addr:$src2))]>;
617def Int_UCOMISDrr: PDI<0x2E, MRMSrcReg, (ops VR128:$src1, VR128:$src2),
618 "ucomisd {$src2, $src1|$src1, $src2}",
619 [(X86ucomi (v2f64 VR128:$src1), (v2f64 VR128:$src2))]>;
620def Int_UCOMISDrm: PDI<0x2E, MRMSrcMem, (ops VR128:$src1, f128mem:$src2),
621 "ucomisd {$src2, $src1|$src1, $src2}",
622 [(X86ucomi (v2f64 VR128:$src1), (loadv2f64 addr:$src2))]>;
623
624def Int_COMISSrr: PSI<0x2F, MRMSrcReg, (ops VR128:$src1, VR128:$src2),
625 "comiss {$src2, $src1|$src1, $src2}",
626 [(X86comi (v4f32 VR128:$src1), VR128:$src2)]>;
627def Int_COMISSrm: PSI<0x2F, MRMSrcMem, (ops VR128:$src1, f128mem:$src2),
628 "comiss {$src2, $src1|$src1, $src2}",
629 [(X86comi (v4f32 VR128:$src1), (loadv4f32 addr:$src2))]>;
630def Int_COMISDrr: PDI<0x2F, MRMSrcReg, (ops VR128:$src1, VR128:$src2),
631 "comisd {$src2, $src1|$src1, $src2}",
632 [(X86comi (v2f64 VR128:$src1), (v2f64 VR128:$src2))]>;
633def Int_COMISDrm: PDI<0x2F, MRMSrcMem, (ops VR128:$src1, f128mem:$src2),
634 "comisd {$src2, $src1|$src1, $src2}",
635 [(X86comi (v2f64 VR128:$src1), (loadv2f64 addr:$src2))]>;
Evan Cheng0876aa52006-03-30 06:21:22 +0000636
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000637// Aliases of packed instructions for scalar use. These all have names that
638// start with 'Fs'.
639
640// Alias instructions that map fld0 to pxor for sse.
641// FIXME: remove when we can teach regalloc that xor reg, reg is ok.
642def FsFLD0SS : I<0xEF, MRMInitReg, (ops FR32:$dst),
643 "pxor $dst, $dst", [(set FR32:$dst, fp32imm0)]>,
644 Requires<[HasSSE1]>, TB, OpSize;
645def FsFLD0SD : I<0xEF, MRMInitReg, (ops FR64:$dst),
646 "pxor $dst, $dst", [(set FR64:$dst, fp64imm0)]>,
647 Requires<[HasSSE2]>, TB, OpSize;
648
649// Alias instructions to do FR32 / FR64 reg-to-reg copy using movaps / movapd.
650// Upper bits are disregarded.
Evan Cheng470a6ad2006-02-22 02:26:30 +0000651def FsMOVAPSrr : PSI<0x28, MRMSrcReg, (ops FR32:$dst, FR32:$src),
652 "movaps {$src, $dst|$dst, $src}", []>;
653def FsMOVAPDrr : PDI<0x28, MRMSrcReg, (ops FR64:$dst, FR64:$src),
654 "movapd {$src, $dst|$dst, $src}", []>;
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000655
656// Alias instructions to load FR32 / FR64 from f128mem using movaps / movapd.
657// Upper bits are disregarded.
Evan Cheng470a6ad2006-02-22 02:26:30 +0000658def FsMOVAPSrm : PSI<0x28, MRMSrcMem, (ops FR32:$dst, f128mem:$src),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000659 "movaps {$src, $dst|$dst, $src}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000660 [(set FR32:$dst, (X86loadpf32 addr:$src))]>;
661def FsMOVAPDrm : PDI<0x28, MRMSrcMem, (ops FR64:$dst, f128mem:$src),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000662 "movapd {$src, $dst|$dst, $src}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000663 [(set FR64:$dst, (X86loadpf64 addr:$src))]>;
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000664
665// Alias bitwise logical operations using SSE logical ops on packed FP values.
666let isTwoAddress = 1 in {
667let isCommutable = 1 in {
Evan Cheng470a6ad2006-02-22 02:26:30 +0000668def FsANDPSrr : PSI<0x54, MRMSrcReg, (ops FR32:$dst, FR32:$src1, FR32:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000669 "andps {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000670 [(set FR32:$dst, (X86fand FR32:$src1, FR32:$src2))]>;
671def FsANDPDrr : PDI<0x54, MRMSrcReg, (ops FR64:$dst, FR64:$src1, FR64:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000672 "andpd {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000673 [(set FR64:$dst, (X86fand FR64:$src1, FR64:$src2))]>;
674def FsORPSrr : PSI<0x56, MRMSrcReg, (ops FR32:$dst, FR32:$src1, FR32:$src2),
675 "orps {$src2, $dst|$dst, $src2}", []>;
676def FsORPDrr : PDI<0x56, MRMSrcReg, (ops FR64:$dst, FR64:$src1, FR64:$src2),
677 "orpd {$src2, $dst|$dst, $src2}", []>;
678def FsXORPSrr : PSI<0x57, MRMSrcReg, (ops FR32:$dst, FR32:$src1, FR32:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000679 "xorps {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000680 [(set FR32:$dst, (X86fxor FR32:$src1, FR32:$src2))]>;
681def FsXORPDrr : PDI<0x57, MRMSrcReg, (ops FR64:$dst, FR64:$src1, FR64:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000682 "xorpd {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000683 [(set FR64:$dst, (X86fxor FR64:$src1, FR64:$src2))]>;
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000684}
Evan Cheng470a6ad2006-02-22 02:26:30 +0000685def FsANDPSrm : PSI<0x54, MRMSrcMem, (ops FR32:$dst, FR32:$src1, f128mem:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000686 "andps {$src2, $dst|$dst, $src2}",
687 [(set FR32:$dst, (X86fand FR32:$src1,
Evan Cheng470a6ad2006-02-22 02:26:30 +0000688 (X86loadpf32 addr:$src2)))]>;
689def FsANDPDrm : PDI<0x54, MRMSrcMem, (ops FR64:$dst, FR64:$src1, f128mem:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000690 "andpd {$src2, $dst|$dst, $src2}",
691 [(set FR64:$dst, (X86fand FR64:$src1,
Evan Cheng470a6ad2006-02-22 02:26:30 +0000692 (X86loadpf64 addr:$src2)))]>;
693def FsORPSrm : PSI<0x56, MRMSrcMem, (ops FR32:$dst, FR32:$src1, f128mem:$src2),
694 "orps {$src2, $dst|$dst, $src2}", []>;
695def FsORPDrm : PDI<0x56, MRMSrcMem, (ops FR64:$dst, FR64:$src1, f128mem:$src2),
696 "orpd {$src2, $dst|$dst, $src2}", []>;
697def FsXORPSrm : PSI<0x57, MRMSrcMem, (ops FR32:$dst, FR32:$src1, f128mem:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000698 "xorps {$src2, $dst|$dst, $src2}",
699 [(set FR32:$dst, (X86fxor FR32:$src1,
Evan Cheng470a6ad2006-02-22 02:26:30 +0000700 (X86loadpf32 addr:$src2)))]>;
701def FsXORPDrm : PDI<0x57, MRMSrcMem, (ops FR64:$dst, FR64:$src1, f128mem:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000702 "xorpd {$src2, $dst|$dst, $src2}",
703 [(set FR64:$dst, (X86fxor FR64:$src1,
Evan Cheng470a6ad2006-02-22 02:26:30 +0000704 (X86loadpf64 addr:$src2)))]>;
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000705
Evan Cheng470a6ad2006-02-22 02:26:30 +0000706def FsANDNPSrr : PSI<0x55, MRMSrcReg, (ops FR32:$dst, FR32:$src1, FR32:$src2),
707 "andnps {$src2, $dst|$dst, $src2}", []>;
708def FsANDNPSrm : PSI<0x55, MRMSrcMem, (ops FR32:$dst, FR32:$src1, f128mem:$src2),
709 "andnps {$src2, $dst|$dst, $src2}", []>;
710def FsANDNPDrr : PDI<0x55, MRMSrcReg, (ops FR64:$dst, FR64:$src1, FR64:$src2),
711 "andnpd {$src2, $dst|$dst, $src2}", []>;
712def FsANDNPDrm : PDI<0x55, MRMSrcMem, (ops FR64:$dst, FR64:$src1, f128mem:$src2),
713 "andnpd {$src2, $dst|$dst, $src2}", []>;
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000714}
715
716//===----------------------------------------------------------------------===//
717// SSE packed FP Instructions
718//===----------------------------------------------------------------------===//
719
Evan Chengc12e6c42006-03-19 09:38:54 +0000720// Some 'special' instructions
721def IMPLICIT_DEF_VR128 : I<0, Pseudo, (ops VR128:$dst),
722 "#IMPLICIT_DEF $dst",
723 [(set VR128:$dst, (v4f32 (undef)))]>,
724 Requires<[HasSSE1]>;
725
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000726// Move Instructions
Evan Cheng2246f842006-03-18 01:23:20 +0000727def MOVAPSrr : PSI<0x28, MRMSrcReg, (ops VR128:$dst, VR128:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000728 "movaps {$src, $dst|$dst, $src}", []>;
Evan Cheng2246f842006-03-18 01:23:20 +0000729def MOVAPSrm : PSI<0x28, MRMSrcMem, (ops VR128:$dst, f128mem:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000730 "movaps {$src, $dst|$dst, $src}",
Evan Cheng2246f842006-03-18 01:23:20 +0000731 [(set VR128:$dst, (loadv4f32 addr:$src))]>;
732def MOVAPDrr : PDI<0x28, MRMSrcReg, (ops VR128:$dst, VR128:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000733 "movapd {$src, $dst|$dst, $src}", []>;
Evan Cheng2246f842006-03-18 01:23:20 +0000734def MOVAPDrm : PDI<0x28, MRMSrcMem, (ops VR128:$dst, f128mem:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000735 "movapd {$src, $dst|$dst, $src}",
Evan Cheng2246f842006-03-18 01:23:20 +0000736 [(set VR128:$dst, (loadv2f64 addr:$src))]>;
Evan Chengffcb95b2006-02-21 19:13:53 +0000737
Evan Cheng2246f842006-03-18 01:23:20 +0000738def MOVAPSmr : PSI<0x29, MRMDestMem, (ops f128mem:$dst, VR128:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000739 "movaps {$src, $dst|$dst, $src}",
Evan Cheng2246f842006-03-18 01:23:20 +0000740 [(store (v4f32 VR128:$src), addr:$dst)]>;
741def MOVAPDmr : PDI<0x29, MRMDestMem, (ops f128mem:$dst, VR128:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000742 "movapd {$src, $dst|$dst, $src}",
Evan Cheng2246f842006-03-18 01:23:20 +0000743 [(store (v2f64 VR128:$src), addr:$dst)]>;
Evan Cheng470a6ad2006-02-22 02:26:30 +0000744
Evan Cheng2246f842006-03-18 01:23:20 +0000745def MOVUPSrr : PSI<0x10, MRMSrcReg, (ops VR128:$dst, VR128:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000746 "movups {$src, $dst|$dst, $src}", []>;
Evan Chengaa9fb8c2006-04-10 21:11:06 +0000747def MOVUPSrm : PDI<0x10, MRMSrcMem, (ops VR128:$dst, f128mem:$src),
748 "movups {$src, $dst|$dst, $src}",
749 [(set VR128:$dst, (int_x86_sse_loadu_ps addr:$src))]>;
750def MOVUPSmr : PDI<0x11, MRMDestMem, (ops f128mem:$dst, VR128:$src),
751 "movups {$src, $dst|$dst, $src}",
752 [(int_x86_sse_storeu_ps addr:$dst, VR128:$src)]>;
Evan Cheng2246f842006-03-18 01:23:20 +0000753def MOVUPDrr : PDI<0x10, MRMSrcReg, (ops VR128:$dst, VR128:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000754 "movupd {$src, $dst|$dst, $src}", []>;
Evan Cheng2246f842006-03-18 01:23:20 +0000755def MOVUPDrm : PDI<0x10, MRMSrcMem, (ops VR128:$dst, f128mem:$src),
Evan Chengaa9fb8c2006-04-10 21:11:06 +0000756 "movupd {$src, $dst|$dst, $src}",
757 [(set VR128:$dst, (int_x86_sse2_loadu_pd addr:$src))]>;
Evan Cheng2246f842006-03-18 01:23:20 +0000758def MOVUPDmr : PDI<0x11, MRMDestMem, (ops f128mem:$dst, VR128:$src),
Evan Chengaa9fb8c2006-04-10 21:11:06 +0000759 "movupd {$src, $dst|$dst, $src}",
760 [(int_x86_sse2_storeu_pd addr:$dst, VR128:$src)]>;
Evan Cheng397edef2006-04-11 22:28:25 +0000761def MOVDQUrm : I<0x6F, MRMSrcMem, (ops VR128:$dst, i128mem:$src),
762 "movdqu {$src, $dst|$dst, $src}",
763 [(set VR128:$dst, (int_x86_sse2_loadu_dq addr:$src))]>,
764 XS, Requires<[HasSSE2]>;
765def MOVDQUmr : I<0x7F, MRMDestMem, (ops i128mem:$dst, VR128:$src),
766 "movdqu {$src, $dst|$dst, $src}",
767 [(int_x86_sse2_storeu_dq addr:$dst, VR128:$src)]>,
768 XS, Requires<[HasSSE2]>;
Evan Cheng470a6ad2006-02-22 02:26:30 +0000769
Evan Cheng4fcb9222006-03-28 02:43:26 +0000770let isTwoAddress = 1 in {
Evan Cheng9bbfd4f2006-03-28 07:01:28 +0000771def MOVLPSrm : PSI<0x12, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f64mem:$src2),
Evan Cheng5ced1d82006-04-06 23:23:56 +0000772 "movlps {$src2, $dst|$dst, $src2}",
773 [(set VR128:$dst,
774 (v4f32 (vector_shuffle VR128:$src1,
775 (bc_v4f32 (v2f64 (scalar_to_vector (loadf64 addr:$src2)))),
776 MOVLP_shuffle_mask)))]>;
Evan Cheng9bbfd4f2006-03-28 07:01:28 +0000777def MOVLPDrm : PDI<0x12, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f64mem:$src2),
Evan Cheng5ced1d82006-04-06 23:23:56 +0000778 "movlpd {$src2, $dst|$dst, $src2}",
779 [(set VR128:$dst,
780 (v2f64 (vector_shuffle VR128:$src1,
781 (scalar_to_vector (loadf64 addr:$src2)),
782 MOVLP_shuffle_mask)))]>;
Evan Cheng4fcb9222006-03-28 02:43:26 +0000783def MOVHPSrm : PSI<0x16, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f64mem:$src2),
Evan Cheng5ced1d82006-04-06 23:23:56 +0000784 "movhps {$src2, $dst|$dst, $src2}",
785 [(set VR128:$dst,
786 (v4f32 (vector_shuffle VR128:$src1,
787 (bc_v4f32 (v2f64 (scalar_to_vector (loadf64 addr:$src2)))),
788 MOVHP_shuffle_mask)))]>;
Evan Cheng4fcb9222006-03-28 02:43:26 +0000789def MOVHPDrm : PDI<0x16, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f64mem:$src2),
790 "movhpd {$src2, $dst|$dst, $src2}",
791 [(set VR128:$dst,
792 (v2f64 (vector_shuffle VR128:$src1,
793 (scalar_to_vector (loadf64 addr:$src2)),
Evan Cheng5ced1d82006-04-06 23:23:56 +0000794 MOVHP_shuffle_mask)))]>;
Evan Cheng4fcb9222006-03-28 02:43:26 +0000795}
796
Evan Cheng9bbfd4f2006-03-28 07:01:28 +0000797def MOVLPSmr : PSI<0x13, MRMDestMem, (ops f64mem:$dst, VR128:$src),
Evan Cheng664ade72006-04-07 21:20:58 +0000798 "movlps {$src, $dst|$dst, $src}",
799 [(store (f64 (vector_extract (bc_v2f64 (v4f32 VR128:$src)),
800 (i32 0))), addr:$dst)]>;
Evan Cheng9bbfd4f2006-03-28 07:01:28 +0000801def MOVLPDmr : PDI<0x13, MRMDestMem, (ops f64mem:$dst, VR128:$src),
Evan Cheng20e3ed12006-04-03 22:30:54 +0000802 "movlpd {$src, $dst|$dst, $src}",
803 [(store (f64 (vector_extract (v2f64 VR128:$src),
804 (i32 0))), addr:$dst)]>;
Evan Cheng9bbfd4f2006-03-28 07:01:28 +0000805
Evan Cheng664ade72006-04-07 21:20:58 +0000806// v2f64 extract element 1 is always custom lowered to unpack high to low
807// and extract element 0 so the non-store version isn't too horrible.
Evan Cheng2246f842006-03-18 01:23:20 +0000808def MOVHPSmr : PSI<0x17, MRMDestMem, (ops f64mem:$dst, VR128:$src),
Evan Cheng664ade72006-04-07 21:20:58 +0000809 "movhps {$src, $dst|$dst, $src}",
810 [(store (f64 (vector_extract
811 (v2f64 (vector_shuffle
812 (bc_v2f64 (v4f32 VR128:$src)), (undef),
813 UNPCKH_shuffle_mask)), (i32 0))),
814 addr:$dst)]>;
Evan Cheng2246f842006-03-18 01:23:20 +0000815def MOVHPDmr : PDI<0x17, MRMDestMem, (ops f64mem:$dst, VR128:$src),
Evan Cheng20e3ed12006-04-03 22:30:54 +0000816 "movhpd {$src, $dst|$dst, $src}",
817 [(store (f64 (vector_extract
818 (v2f64 (vector_shuffle VR128:$src, (undef),
819 UNPCKH_shuffle_mask)), (i32 0))),
820 addr:$dst)]>;
Evan Cheng470a6ad2006-02-22 02:26:30 +0000821
Evan Cheng14aed5e2006-03-24 01:18:28 +0000822let isTwoAddress = 1 in {
823def MOVLHPSrr : PSI<0x16, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
Evan Cheng4fcb9222006-03-28 02:43:26 +0000824 "movlhps {$src2, $dst|$dst, $src2}",
825 [(set VR128:$dst,
Evan Cheng2064a2b2006-03-28 06:50:32 +0000826 (v4f32 (vector_shuffle VR128:$src1, VR128:$src2,
827 MOVLHPS_shuffle_mask)))]>;
Evan Cheng2c0dbd02006-03-24 02:58:06 +0000828
Evan Cheng14aed5e2006-03-24 01:18:28 +0000829def MOVHLPSrr : PSI<0x12, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
Evan Chengbe296ac2006-03-28 06:53:49 +0000830 "movhlps {$src2, $dst|$dst, $src2}",
Evan Cheng4fcb9222006-03-28 02:43:26 +0000831 [(set VR128:$dst,
Evan Cheng2064a2b2006-03-28 06:50:32 +0000832 (v4f32 (vector_shuffle VR128:$src1, VR128:$src2,
Evan Cheng4fcb9222006-03-28 02:43:26 +0000833 MOVHLPS_shuffle_mask)))]>;
Evan Cheng14aed5e2006-03-24 01:18:28 +0000834}
Evan Cheng470a6ad2006-02-22 02:26:30 +0000835
Evan Cheng470a6ad2006-02-22 02:26:30 +0000836// SSE2 instructions without OpSize prefix
Evan Chengd03db7a2006-04-12 05:20:24 +0000837def CVTDQ2PSrr : I<0x5B, MRMSrcReg, (ops VR128:$dst, VR128:$src),
838 "cvtdq2ps {$src, $dst|$dst, $src}",
839 [(set VR128:$dst, (int_x86_sse2_cvtdq2ps VR128:$src))]>,
840 TB, Requires<[HasSSE2]>;
841def CVTDQ2PSrm : I<0x5B, MRMSrcMem, (ops VR128:$dst, i128mem:$src),
842 "cvtdq2ps {$src, $dst|$dst, $src}",
843 [(set VR128:$dst, (int_x86_sse2_cvtdq2ps
Evan Cheng91b740d2006-04-12 17:12:36 +0000844 (bc_v4i32 (loadv2i64 addr:$src))))]>,
Evan Chengd03db7a2006-04-12 05:20:24 +0000845 TB, Requires<[HasSSE2]>;
Evan Cheng470a6ad2006-02-22 02:26:30 +0000846
847// SSE2 instructions with XS prefix
Evan Chengd03db7a2006-04-12 05:20:24 +0000848def CVTDQ2PDrr : I<0xE6, MRMSrcReg, (ops VR128:$dst, VR128:$src),
849 "cvtdq2pd {$src, $dst|$dst, $src}",
850 [(set VR128:$dst, (int_x86_sse2_cvtdq2pd VR128:$src))]>,
851 XS, Requires<[HasSSE2]>;
852def CVTDQ2PDrm : I<0xE6, MRMSrcMem, (ops VR128:$dst, i64mem:$src),
853 "cvtdq2pd {$src, $dst|$dst, $src}",
854 [(set VR128:$dst, (int_x86_sse2_cvtdq2pd
Evan Cheng91b740d2006-04-12 17:12:36 +0000855 (bc_v4i32 (loadv2i64 addr:$src))))]>,
Evan Chengd03db7a2006-04-12 05:20:24 +0000856 XS, Requires<[HasSSE2]>;
Evan Cheng470a6ad2006-02-22 02:26:30 +0000857
Evan Chengd03db7a2006-04-12 05:20:24 +0000858def CVTPS2DQrr : PDI<0x5B, MRMSrcReg, (ops VR128:$dst, VR128:$src),
859 "cvtps2dq {$src, $dst|$dst, $src}",
860 [(set VR128:$dst, (int_x86_sse2_cvtps2dq VR128:$src))]>;
861def CVTPS2DQrm : PDI<0x5B, MRMSrcMem, (ops VR128:$dst, f128mem:$src),
862 "cvtps2dq {$src, $dst|$dst, $src}",
863 [(set VR128:$dst, (int_x86_sse2_cvtps2dq
Evan Cheng91b740d2006-04-12 17:12:36 +0000864 (loadv4f32 addr:$src)))]>;
Evan Chengd03db7a2006-04-12 05:20:24 +0000865// SSE2 packed instructions with XS prefix
866def CVTTPS2DQrr : I<0x5B, MRMSrcReg, (ops VR128:$dst, VR128:$src),
867 "cvttps2dq {$src, $dst|$dst, $src}",
868 [(set VR128:$dst, (int_x86_sse2_cvttps2dq VR128:$src))]>,
869 XS, Requires<[HasSSE2]>;
870def CVTTPS2DQrm : I<0x5B, MRMSrcMem, (ops VR128:$dst, f128mem:$src),
871 "cvttps2dq {$src, $dst|$dst, $src}",
872 [(set VR128:$dst, (int_x86_sse2_cvttps2dq
Evan Cheng91b740d2006-04-12 17:12:36 +0000873 (loadv4f32 addr:$src)))]>,
Evan Chengd03db7a2006-04-12 05:20:24 +0000874 XS, Requires<[HasSSE2]>;
875
Evan Cheng470a6ad2006-02-22 02:26:30 +0000876// SSE2 packed instructions with XD prefix
Evan Chengd03db7a2006-04-12 05:20:24 +0000877def CVTPD2DQrr : I<0xE6, MRMSrcReg, (ops VR128:$dst, VR128:$src),
878 "cvtpd2dq {$src, $dst|$dst, $src}",
879 [(set VR128:$dst, (int_x86_sse2_cvtpd2dq VR128:$src))]>,
880 XD, Requires<[HasSSE2]>;
881def CVTPD2DQrm : I<0xE6, MRMSrcMem, (ops VR128:$dst, f128mem:$src),
882 "cvtpd2dq {$src, $dst|$dst, $src}",
883 [(set VR128:$dst, (int_x86_sse2_cvtpd2dq
Evan Cheng91b740d2006-04-12 17:12:36 +0000884 (loadv2f64 addr:$src)))]>,
Evan Chengd03db7a2006-04-12 05:20:24 +0000885 XD, Requires<[HasSSE2]>;
886def CVTTPD2DQrr : PDI<0xE6, MRMSrcReg, (ops VR128:$dst, VR128:$src),
887 "cvttpd2dq {$src, $dst|$dst, $src}",
888 [(set VR128:$dst, (int_x86_sse2_cvttpd2dq VR128:$src))]>;
889def CVTTPD2DQrm : PDI<0xE6, MRMSrcMem, (ops VR128:$dst, f128mem:$src),
890 "cvttpd2dq {$src, $dst|$dst, $src}",
891 [(set VR128:$dst, (int_x86_sse2_cvttpd2dq
Evan Cheng91b740d2006-04-12 17:12:36 +0000892 (loadv2f64 addr:$src)))]>;
Evan Cheng470a6ad2006-02-22 02:26:30 +0000893
894// SSE2 instructions without OpSize prefix
Evan Chengd03db7a2006-04-12 05:20:24 +0000895def CVTPS2PDrr : I<0x5A, MRMSrcReg, (ops VR128:$dst, VR128:$src),
896 "cvtps2pd {$src, $dst|$dst, $src}",
897 [(set VR128:$dst, (int_x86_sse2_cvtps2pd VR128:$src))]>,
898 TB, Requires<[HasSSE2]>;
899def CVTPS2PDrm : I<0x5A, MRMSrcReg, (ops VR128:$dst, f64mem:$src),
900 "cvtps2pd {$src, $dst|$dst, $src}",
901 [(set VR128:$dst, (int_x86_sse2_cvtps2pd
Evan Cheng91b740d2006-04-12 17:12:36 +0000902 (loadv4f32 addr:$src)))]>,
Evan Chengd03db7a2006-04-12 05:20:24 +0000903 TB, Requires<[HasSSE2]>;
Evan Cheng470a6ad2006-02-22 02:26:30 +0000904
Evan Chengd03db7a2006-04-12 05:20:24 +0000905def CVTPD2PSrr : PDI<0x5A, MRMSrcReg, (ops VR128:$dst, VR128:$src),
906 "cvtpd2ps {$src, $dst|$dst, $src}",
907 [(set VR128:$dst, (int_x86_sse2_cvtpd2ps VR128:$src))]>;
908def CVTPD2PSrm : PDI<0x5A, MRMSrcReg, (ops VR128:$dst, f128mem:$src),
909 "cvtpd2ps {$src, $dst|$dst, $src}",
910 [(set VR128:$dst, (int_x86_sse2_cvtpd2ps
Evan Cheng91b740d2006-04-12 17:12:36 +0000911 (loadv2f64 addr:$src)))]>;
Evan Cheng470a6ad2006-02-22 02:26:30 +0000912
Evan Chengd2a6d542006-04-12 23:42:44 +0000913
914def CVTSD2SIrr: SDI<0x2D, MRMSrcReg, (ops R32:$dst, VR128:$src),
915 "cvtsd2si {$src, $dst|$dst, $src}",
916 [(set R32:$dst, (int_x86_sse2_cvtsd2si VR128:$src))]>;
917def CVTSD2SIrm: SDI<0x2D, MRMSrcMem, (ops R32:$dst, f128mem:$src),
918 "cvtsd2si {$src, $dst|$dst, $src}",
919 [(set R32:$dst, (int_x86_sse2_cvtsd2si
920 (loadv2f64 addr:$src)))]>;
921
922// Match intrinsics which expect XMM operand(s).
923// Aliases for intrinsics
924let isTwoAddress = 1 in {
925def Int_CVTSI2SDrr: SDI<0x2A, MRMSrcReg,
926 (ops VR128:$dst, VR128:$src1, R32:$src2),
927 "cvtsi2sd {$src2, $dst|$dst, $src2}",
928 [(set VR128:$dst, (int_x86_sse2_cvtsi2sd VR128:$src1,
929 R32:$src2))]>;
930def Int_CVTSI2SDrm: SDI<0x2A, MRMSrcMem,
931 (ops VR128:$dst, VR128:$src1, i32mem:$src2),
932 "cvtsi2sd {$src2, $dst|$dst, $src2}",
933 [(set VR128:$dst, (int_x86_sse2_cvtsi2sd VR128:$src1,
934 (loadi32 addr:$src2)))]>;
935def Int_CVTSD2SSrr: SDI<0x5A, MRMSrcReg,
936 (ops VR128:$dst, VR128:$src1, VR128:$src2),
937 "cvtsd2ss {$src2, $dst|$dst, $src2}",
938 [(set VR128:$dst, (int_x86_sse2_cvtsd2ss VR128:$src1,
939 VR128:$src2))]>;
940def Int_CVTSD2SSrm: SDI<0x5A, MRMSrcMem,
941 (ops VR128:$dst, VR128:$src1, f64mem:$src2),
942 "cvtsd2ss {$src2, $dst|$dst, $src2}",
943 [(set VR128:$dst, (int_x86_sse2_cvtsd2ss VR128:$src1,
944 (loadv2f64 addr:$src2)))]>;
945def Int_CVTSS2SDrr: I<0x5A, MRMSrcReg,
946 (ops VR128:$dst, VR128:$src1, VR128:$src2),
947 "cvtss2sd {$src2, $dst|$dst, $src2}",
948 [(set VR128:$dst, (int_x86_sse2_cvtss2sd VR128:$src1,
949 VR128:$src2))]>, XS,
950 Requires<[HasSSE2]>;
951def Int_CVTSS2SDrm: I<0x5A, MRMSrcMem,
952 (ops VR128:$dst, VR128:$src1, f32mem:$src2),
953 "cvtss2sd {$src2, $dst|$dst, $src2}",
954 [(set VR128:$dst, (int_x86_sse2_cvtss2sd VR128:$src1,
955 (loadv4f32 addr:$src2)))]>, XS,
956 Requires<[HasSSE2]>;
957}
958
Evan Cheng470a6ad2006-02-22 02:26:30 +0000959// Arithmetic
960let isTwoAddress = 1 in {
961let isCommutable = 1 in {
Evan Cheng2246f842006-03-18 01:23:20 +0000962def ADDPSrr : PSI<0x58, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000963 "addps {$src2, $dst|$dst, $src2}",
Evan Cheng2246f842006-03-18 01:23:20 +0000964 [(set VR128:$dst, (v4f32 (fadd VR128:$src1, VR128:$src2)))]>;
965def ADDPDrr : PDI<0x58, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000966 "addpd {$src2, $dst|$dst, $src2}",
Evan Cheng2246f842006-03-18 01:23:20 +0000967 [(set VR128:$dst, (v2f64 (fadd VR128:$src1, VR128:$src2)))]>;
968def MULPSrr : PSI<0x59, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000969 "mulps {$src2, $dst|$dst, $src2}",
Evan Cheng2246f842006-03-18 01:23:20 +0000970 [(set VR128:$dst, (v4f32 (fmul VR128:$src1, VR128:$src2)))]>;
971def MULPDrr : PDI<0x59, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000972 "mulpd {$src2, $dst|$dst, $src2}",
Evan Cheng2246f842006-03-18 01:23:20 +0000973 [(set VR128:$dst, (v2f64 (fmul VR128:$src1, VR128:$src2)))]>;
Evan Cheng470a6ad2006-02-22 02:26:30 +0000974}
975
Evan Cheng2246f842006-03-18 01:23:20 +0000976def ADDPSrm : PSI<0x58, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000977 "addps {$src2, $dst|$dst, $src2}",
Evan Cheng2246f842006-03-18 01:23:20 +0000978 [(set VR128:$dst, (v4f32 (fadd VR128:$src1,
979 (load addr:$src2))))]>;
980def ADDPDrm : PDI<0x58, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000981 "addpd {$src2, $dst|$dst, $src2}",
Evan Cheng2246f842006-03-18 01:23:20 +0000982 [(set VR128:$dst, (v2f64 (fadd VR128:$src1,
983 (load addr:$src2))))]>;
984def MULPSrm : PSI<0x59, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000985 "mulps {$src2, $dst|$dst, $src2}",
Evan Cheng2246f842006-03-18 01:23:20 +0000986 [(set VR128:$dst, (v4f32 (fmul VR128:$src1,
987 (load addr:$src2))))]>;
988def MULPDrm : PDI<0x59, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000989 "mulpd {$src2, $dst|$dst, $src2}",
Evan Cheng2246f842006-03-18 01:23:20 +0000990 [(set VR128:$dst, (v2f64 (fmul VR128:$src1,
991 (load addr:$src2))))]>;
Evan Cheng470a6ad2006-02-22 02:26:30 +0000992
Evan Cheng2246f842006-03-18 01:23:20 +0000993def DIVPSrr : PSI<0x5E, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
994 "divps {$src2, $dst|$dst, $src2}",
995 [(set VR128:$dst, (v4f32 (fdiv VR128:$src1, VR128:$src2)))]>;
996def DIVPSrm : PSI<0x5E, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
997 "divps {$src2, $dst|$dst, $src2}",
998 [(set VR128:$dst, (v4f32 (fdiv VR128:$src1,
999 (load addr:$src2))))]>;
1000def DIVPDrr : PDI<0x5E, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
Evan Cheng470a6ad2006-02-22 02:26:30 +00001001 "divpd {$src2, $dst|$dst, $src2}",
Evan Cheng2246f842006-03-18 01:23:20 +00001002 [(set VR128:$dst, (v2f64 (fdiv VR128:$src1, VR128:$src2)))]>;
1003def DIVPDrm : PDI<0x5E, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
Evan Cheng470a6ad2006-02-22 02:26:30 +00001004 "divpd {$src2, $dst|$dst, $src2}",
Evan Cheng2246f842006-03-18 01:23:20 +00001005 [(set VR128:$dst, (v2f64 (fdiv VR128:$src1,
1006 (load addr:$src2))))]>;
Evan Cheng470a6ad2006-02-22 02:26:30 +00001007
Evan Cheng2246f842006-03-18 01:23:20 +00001008def SUBPSrr : PSI<0x5C, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
1009 "subps {$src2, $dst|$dst, $src2}",
1010 [(set VR128:$dst, (v4f32 (fsub VR128:$src1, VR128:$src2)))]>;
1011def SUBPSrm : PSI<0x5C, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
1012 "subps {$src2, $dst|$dst, $src2}",
1013 [(set VR128:$dst, (v4f32 (fsub VR128:$src1,
1014 (load addr:$src2))))]>;
1015def SUBPDrr : PDI<0x5C, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
1016 "subpd {$src2, $dst|$dst, $src2}",
Evan Cheng2c0dbd02006-03-24 02:58:06 +00001017 [(set VR128:$dst, (v2f64 (fsub VR128:$src1, VR128:$src2)))]>;
Evan Cheng2246f842006-03-18 01:23:20 +00001018def SUBPDrm : PDI<0x5C, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
1019 "subpd {$src2, $dst|$dst, $src2}",
Evan Cheng2c0dbd02006-03-24 02:58:06 +00001020 [(set VR128:$dst, (v2f64 (fsub VR128:$src1,
1021 (load addr:$src2))))]>;
Evan Cheng470a6ad2006-02-22 02:26:30 +00001022}
1023
Evan Cheng8703be42006-04-04 19:12:30 +00001024def SQRTPSr : PS_Intr<0x51, "sqrtps {$src, $dst|$dst, $src}",
1025 int_x86_sse_sqrt_ps>;
1026def SQRTPSm : PS_Intm<0x51, "sqrtps {$src, $dst|$dst, $src}",
1027 int_x86_sse_sqrt_ps>;
1028def SQRTPDr : PD_Intr<0x51, "sqrtpd {$src, $dst|$dst, $src}",
1029 int_x86_sse2_sqrt_pd>;
1030def SQRTPDm : PD_Intm<0x51, "sqrtpd {$src, $dst|$dst, $src}",
1031 int_x86_sse2_sqrt_pd>;
Evan Cheng470a6ad2006-02-22 02:26:30 +00001032
Evan Cheng8703be42006-04-04 19:12:30 +00001033def RSQRTPSr : PS_Intr<0x52, "rsqrtps {$src, $dst|$dst, $src}",
1034 int_x86_sse_rsqrt_ps>;
1035def RSQRTPSm : PS_Intm<0x52, "rsqrtps {$src, $dst|$dst, $src}",
1036 int_x86_sse_rsqrt_ps>;
1037def RCPPSr : PS_Intr<0x53, "rcpps {$src, $dst|$dst, $src}",
1038 int_x86_sse_rcp_ps>;
1039def RCPPSm : PS_Intm<0x53, "rcpps {$src, $dst|$dst, $src}",
1040 int_x86_sse_rcp_ps>;
Evan Cheng470a6ad2006-02-22 02:26:30 +00001041
Evan Cheng97ac5fa2006-04-03 23:49:17 +00001042let isTwoAddress = 1 in {
1043def MAXPSrr : PS_Intrr<0x5F, "maxps {$src2, $dst|$dst, $src2}",
1044 int_x86_sse_max_ps>;
1045def MAXPSrm : PS_Intrm<0x5F, "maxps {$src2, $dst|$dst, $src2}",
1046 int_x86_sse_max_ps>;
1047def MAXPDrr : PD_Intrr<0x5F, "maxpd {$src2, $dst|$dst, $src2}",
1048 int_x86_sse2_max_pd>;
1049def MAXPDrm : PD_Intrm<0x5F, "maxpd {$src2, $dst|$dst, $src2}",
1050 int_x86_sse2_max_pd>;
1051def MINPSrr : PS_Intrr<0x5D, "minps {$src2, $dst|$dst, $src2}",
1052 int_x86_sse_min_ps>;
1053def MINPSrm : PS_Intrm<0x5D, "minps {$src2, $dst|$dst, $src2}",
1054 int_x86_sse_min_ps>;
1055def MINPDrr : PD_Intrr<0x5D, "minpd {$src2, $dst|$dst, $src2}",
1056 int_x86_sse2_min_pd>;
1057def MINPDrm : PD_Intrm<0x5D, "minpd {$src2, $dst|$dst, $src2}",
1058 int_x86_sse2_min_pd>;
1059}
Evan Chengffcb95b2006-02-21 19:13:53 +00001060
1061// Logical
1062let isTwoAddress = 1 in {
1063let isCommutable = 1 in {
Evan Cheng2246f842006-03-18 01:23:20 +00001064def ANDPSrr : PSI<0x54, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
1065 "andps {$src2, $dst|$dst, $src2}",
Evan Cheng2c3ae372006-04-12 21:21:57 +00001066 [(set VR128:$dst, (v2i64 (and VR128:$src1, VR128:$src2)))]>;
Evan Cheng2246f842006-03-18 01:23:20 +00001067def ANDPDrr : PDI<0x54, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
Evan Chengffcb95b2006-02-21 19:13:53 +00001068 "andpd {$src2, $dst|$dst, $src2}",
Evan Cheng5aa97b22006-03-29 18:47:40 +00001069 [(set VR128:$dst,
1070 (and (bc_v2i64 (v2f64 VR128:$src1)),
1071 (bc_v2i64 (v2f64 VR128:$src2))))]>;
Evan Cheng2246f842006-03-18 01:23:20 +00001072def ORPSrr : PSI<0x56, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
1073 "orps {$src2, $dst|$dst, $src2}",
Evan Cheng2c3ae372006-04-12 21:21:57 +00001074 [(set VR128:$dst, (v2i64 (or VR128:$src1, VR128:$src2)))]>;
Evan Cheng2246f842006-03-18 01:23:20 +00001075def ORPDrr : PDI<0x56, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
1076 "orpd {$src2, $dst|$dst, $src2}",
Evan Cheng5aa97b22006-03-29 18:47:40 +00001077 [(set VR128:$dst,
1078 (or (bc_v2i64 (v2f64 VR128:$src1)),
1079 (bc_v2i64 (v2f64 VR128:$src2))))]>;
Evan Cheng2246f842006-03-18 01:23:20 +00001080def XORPSrr : PSI<0x57, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
1081 "xorps {$src2, $dst|$dst, $src2}",
Evan Cheng2c3ae372006-04-12 21:21:57 +00001082 [(set VR128:$dst, (v2i64 (xor VR128:$src1, VR128:$src2)))]>;
Evan Cheng2246f842006-03-18 01:23:20 +00001083def XORPDrr : PDI<0x57, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
1084 "xorpd {$src2, $dst|$dst, $src2}",
Evan Cheng5aa97b22006-03-29 18:47:40 +00001085 [(set VR128:$dst,
1086 (xor (bc_v2i64 (v2f64 VR128:$src1)),
1087 (bc_v2i64 (v2f64 VR128:$src2))))]>;
Evan Chengffcb95b2006-02-21 19:13:53 +00001088}
Evan Cheng2246f842006-03-18 01:23:20 +00001089def ANDPSrm : PSI<0x54, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
1090 "andps {$src2, $dst|$dst, $src2}",
Evan Cheng2c3ae372006-04-12 21:21:57 +00001091 [(set VR128:$dst, (and VR128:$src1,
1092 (bc_v2i64 (loadv4f32 addr:$src2))))]>;
Evan Cheng2246f842006-03-18 01:23:20 +00001093def ANDPDrm : PDI<0x54, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
1094 "andpd {$src2, $dst|$dst, $src2}",
Evan Cheng5aa97b22006-03-29 18:47:40 +00001095 [(set VR128:$dst,
1096 (and (bc_v2i64 (v2f64 VR128:$src1)),
1097 (bc_v2i64 (loadv2f64 addr:$src2))))]>;
Evan Cheng2246f842006-03-18 01:23:20 +00001098def ORPSrm : PSI<0x56, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
1099 "orps {$src2, $dst|$dst, $src2}",
Evan Cheng2c3ae372006-04-12 21:21:57 +00001100 [(set VR128:$dst, (or VR128:$src1,
1101 (bc_v2i64 (loadv4f32 addr:$src2))))]>;
Evan Cheng2246f842006-03-18 01:23:20 +00001102def ORPDrm : PDI<0x56, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
1103 "orpd {$src2, $dst|$dst, $src2}",
Evan Cheng5aa97b22006-03-29 18:47:40 +00001104 [(set VR128:$dst,
1105 (or (bc_v2i64 (v2f64 VR128:$src1)),
1106 (bc_v2i64 (loadv2f64 addr:$src2))))]>;
Evan Cheng2246f842006-03-18 01:23:20 +00001107def XORPSrm : PSI<0x57, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
1108 "xorps {$src2, $dst|$dst, $src2}",
Evan Cheng2c3ae372006-04-12 21:21:57 +00001109 [(set VR128:$dst, (xor VR128:$src1,
1110 (bc_v2i64 (loadv4f32 addr:$src2))))]>;
Evan Cheng2246f842006-03-18 01:23:20 +00001111def XORPDrm : PDI<0x57, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
1112 "xorpd {$src2, $dst|$dst, $src2}",
Evan Cheng5aa97b22006-03-29 18:47:40 +00001113 [(set VR128:$dst,
1114 (xor (bc_v2i64 (v2f64 VR128:$src1)),
1115 (bc_v2i64 (loadv2f64 addr:$src2))))]>;
Evan Cheng2246f842006-03-18 01:23:20 +00001116def ANDNPSrr : PSI<0x55, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
1117 "andnps {$src2, $dst|$dst, $src2}",
Evan Cheng2c3ae372006-04-12 21:21:57 +00001118 [(set VR128:$dst, (v2i64 (and (xor VR128:$src1,
1119 (bc_v2i64 (v4i32 immAllOnesV))),
1120 VR128:$src2)))]>;
Evan Cheng5aa97b22006-03-29 18:47:40 +00001121def ANDNPSrm : PSI<0x55, MRMSrcMem, (ops VR128:$dst, VR128:$src1,f128mem:$src2),
Evan Cheng2246f842006-03-18 01:23:20 +00001122 "andnps {$src2, $dst|$dst, $src2}",
Evan Cheng2c3ae372006-04-12 21:21:57 +00001123 [(set VR128:$dst, (v2i64 (and (xor VR128:$src1,
1124 (bc_v2i64 (v4i32 immAllOnesV))),
1125 (bc_v2i64 (loadv4f32 addr:$src2)))))]>;
Evan Cheng2246f842006-03-18 01:23:20 +00001126def ANDNPDrr : PDI<0x55, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
1127 "andnpd {$src2, $dst|$dst, $src2}",
Evan Cheng5aa97b22006-03-29 18:47:40 +00001128 [(set VR128:$dst,
1129 (and (vnot (bc_v2i64 (v2f64 VR128:$src1))),
1130 (bc_v2i64 (v2f64 VR128:$src2))))]>;
1131def ANDNPDrm : PDI<0x55, MRMSrcMem, (ops VR128:$dst, VR128:$src1,f128mem:$src2),
Evan Cheng2246f842006-03-18 01:23:20 +00001132 "andnpd {$src2, $dst|$dst, $src2}",
Evan Cheng5aa97b22006-03-29 18:47:40 +00001133 [(set VR128:$dst,
1134 (and (vnot (bc_v2i64 (v2f64 VR128:$src1))),
1135 (bc_v2i64 (loadv2f64 addr:$src2))))]>;
Evan Chengffcb95b2006-02-21 19:13:53 +00001136}
Evan Chengbf156d12006-02-21 19:26:52 +00001137
Evan Cheng470a6ad2006-02-22 02:26:30 +00001138let isTwoAddress = 1 in {
Evan Cheng21760462006-04-04 03:04:07 +00001139def CMPPSrr : PSIi8<0xC2, MRMSrcReg,
1140 (ops VR128:$dst, VR128:$src1, VR128:$src, SSECC:$cc),
1141 "cmp${cc}ps {$src, $dst|$dst, $src}",
1142 [(set VR128:$dst, (int_x86_sse_cmp_ps VR128:$src1,
1143 VR128:$src, imm:$cc))]>;
1144def CMPPSrm : PSIi8<0xC2, MRMSrcMem,
1145 (ops VR128:$dst, VR128:$src1, f128mem:$src, SSECC:$cc),
1146 "cmp${cc}ps {$src, $dst|$dst, $src}",
1147 [(set VR128:$dst, (int_x86_sse_cmp_ps VR128:$src1,
1148 (load addr:$src), imm:$cc))]>;
1149def CMPPDrr : PDIi8<0xC2, MRMSrcReg,
1150 (ops VR128:$dst, VR128:$src1, VR128:$src, SSECC:$cc),
1151 "cmp${cc}pd {$src, $dst|$dst, $src}", []>;
1152def CMPPDrm : PDIi8<0xC2, MRMSrcMem,
1153 (ops VR128:$dst, VR128:$src1, f128mem:$src, SSECC:$cc),
1154 "cmp${cc}pd {$src, $dst|$dst, $src}", []>;
Evan Cheng470a6ad2006-02-22 02:26:30 +00001155}
1156
1157// Shuffle and unpack instructions
Evan Cheng0cea6d22006-03-22 20:08:18 +00001158let isTwoAddress = 1 in {
Evan Cheng2da953f2006-03-22 07:10:28 +00001159def SHUFPSrr : PSIi8<0xC6, MRMSrcReg,
Evan Cheng0038e592006-03-28 00:39:58 +00001160 (ops VR128:$dst, VR128:$src1, VR128:$src2, i32i8imm:$src3),
Evan Cheng14aed5e2006-03-24 01:18:28 +00001161 "shufps {$src3, $src2, $dst|$dst, $src2, $src3}",
Evan Cheng4f563382006-03-29 01:30:51 +00001162 [(set VR128:$dst, (v4f32 (vector_shuffle
1163 VR128:$src1, VR128:$src2,
1164 SHUFP_shuffle_mask:$src3)))]>;
Evan Cheng2da953f2006-03-22 07:10:28 +00001165def SHUFPSrm : PSIi8<0xC6, MRMSrcMem,
Evan Cheng0038e592006-03-28 00:39:58 +00001166 (ops VR128:$dst, VR128:$src1, f128mem:$src2, i32i8imm:$src3),
1167 "shufps {$src3, $src2, $dst|$dst, $src2, $src3}",
Evan Cheng4f563382006-03-29 01:30:51 +00001168 [(set VR128:$dst, (v4f32 (vector_shuffle
1169 VR128:$src1, (load addr:$src2),
1170 SHUFP_shuffle_mask:$src3)))]>;
Evan Cheng2da953f2006-03-22 07:10:28 +00001171def SHUFPDrr : PDIi8<0xC6, MRMSrcReg,
1172 (ops VR128:$dst, VR128:$src1, VR128:$src2, i8imm:$src3),
Evan Cheng14aed5e2006-03-24 01:18:28 +00001173 "shufpd {$src3, $src2, $dst|$dst, $src2, $src3}",
Evan Cheng4f563382006-03-29 01:30:51 +00001174 [(set VR128:$dst, (v2f64 (vector_shuffle
1175 VR128:$src1, VR128:$src2,
1176 SHUFP_shuffle_mask:$src3)))]>;
Evan Cheng2da953f2006-03-22 07:10:28 +00001177def SHUFPDrm : PDIi8<0xC6, MRMSrcMem,
1178 (ops VR128:$dst, VR128:$src1, f128mem:$src2, i8imm:$src3),
Evan Cheng0038e592006-03-28 00:39:58 +00001179 "shufpd {$src3, $src2, $dst|$dst, $src2, $src3}",
Evan Cheng4f563382006-03-29 01:30:51 +00001180 [(set VR128:$dst, (v2f64 (vector_shuffle
1181 VR128:$src1, (load addr:$src2),
1182 SHUFP_shuffle_mask:$src3)))]>;
Evan Cheng470a6ad2006-02-22 02:26:30 +00001183
1184def UNPCKHPSrr : PSI<0x15, MRMSrcReg,
Evan Cheng2246f842006-03-18 01:23:20 +00001185 (ops VR128:$dst, VR128:$src1, VR128:$src2),
Evan Cheng4fcb9222006-03-28 02:43:26 +00001186 "unpckhps {$src2, $dst|$dst, $src2}",
Evan Cheng4f563382006-03-29 01:30:51 +00001187 [(set VR128:$dst, (v4f32 (vector_shuffle
1188 VR128:$src1, VR128:$src2,
1189 UNPCKH_shuffle_mask)))]>;
Evan Cheng470a6ad2006-02-22 02:26:30 +00001190def UNPCKHPSrm : PSI<0x15, MRMSrcMem,
Evan Cheng2246f842006-03-18 01:23:20 +00001191 (ops VR128:$dst, VR128:$src1, f128mem:$src2),
Evan Cheng4fcb9222006-03-28 02:43:26 +00001192 "unpckhps {$src2, $dst|$dst, $src2}",
Evan Cheng4f563382006-03-29 01:30:51 +00001193 [(set VR128:$dst, (v4f32 (vector_shuffle
1194 VR128:$src1, (load addr:$src2),
1195 UNPCKH_shuffle_mask)))]>;
Evan Cheng470a6ad2006-02-22 02:26:30 +00001196def UNPCKHPDrr : PDI<0x15, MRMSrcReg,
Evan Cheng2246f842006-03-18 01:23:20 +00001197 (ops VR128:$dst, VR128:$src1, VR128:$src2),
Evan Cheng4fcb9222006-03-28 02:43:26 +00001198 "unpckhpd {$src2, $dst|$dst, $src2}",
Evan Cheng4f563382006-03-29 01:30:51 +00001199 [(set VR128:$dst, (v2f64 (vector_shuffle
1200 VR128:$src1, VR128:$src2,
1201 UNPCKH_shuffle_mask)))]>;
Evan Cheng470a6ad2006-02-22 02:26:30 +00001202def UNPCKHPDrm : PDI<0x15, MRMSrcMem,
Evan Cheng2246f842006-03-18 01:23:20 +00001203 (ops VR128:$dst, VR128:$src1, f128mem:$src2),
Evan Cheng4fcb9222006-03-28 02:43:26 +00001204 "unpckhpd {$src2, $dst|$dst, $src2}",
Evan Cheng4f563382006-03-29 01:30:51 +00001205 [(set VR128:$dst, (v2f64 (vector_shuffle
1206 VR128:$src1, (load addr:$src2),
1207 UNPCKH_shuffle_mask)))]>;
Evan Cheng4fcb9222006-03-28 02:43:26 +00001208
Evan Cheng470a6ad2006-02-22 02:26:30 +00001209def UNPCKLPSrr : PSI<0x14, MRMSrcReg,
Evan Cheng2246f842006-03-18 01:23:20 +00001210 (ops VR128:$dst, VR128:$src1, VR128:$src2),
Evan Chengc60bd972006-03-25 09:37:23 +00001211 "unpcklps {$src2, $dst|$dst, $src2}",
Evan Cheng4f563382006-03-29 01:30:51 +00001212 [(set VR128:$dst, (v4f32 (vector_shuffle
1213 VR128:$src1, VR128:$src2,
1214 UNPCKL_shuffle_mask)))]>;
Evan Cheng470a6ad2006-02-22 02:26:30 +00001215def UNPCKLPSrm : PSI<0x14, MRMSrcMem,
Evan Cheng2246f842006-03-18 01:23:20 +00001216 (ops VR128:$dst, VR128:$src1, f128mem:$src2),
Evan Chengc60bd972006-03-25 09:37:23 +00001217 "unpcklps {$src2, $dst|$dst, $src2}",
Evan Cheng4f563382006-03-29 01:30:51 +00001218 [(set VR128:$dst, (v4f32 (vector_shuffle
1219 VR128:$src1, (load addr:$src2),
1220 UNPCKL_shuffle_mask)))]>;
Evan Cheng470a6ad2006-02-22 02:26:30 +00001221def UNPCKLPDrr : PDI<0x14, MRMSrcReg,
Evan Cheng2246f842006-03-18 01:23:20 +00001222 (ops VR128:$dst, VR128:$src1, VR128:$src2),
Evan Cheng4fcb9222006-03-28 02:43:26 +00001223 "unpcklpd {$src2, $dst|$dst, $src2}",
Evan Cheng4f563382006-03-29 01:30:51 +00001224 [(set VR128:$dst, (v2f64 (vector_shuffle
1225 VR128:$src1, VR128:$src2,
1226 UNPCKL_shuffle_mask)))]>;
Evan Cheng470a6ad2006-02-22 02:26:30 +00001227def UNPCKLPDrm : PDI<0x14, MRMSrcMem,
Evan Cheng2246f842006-03-18 01:23:20 +00001228 (ops VR128:$dst, VR128:$src1, f128mem:$src2),
Evan Cheng4fcb9222006-03-28 02:43:26 +00001229 "unpcklpd {$src2, $dst|$dst, $src2}",
Evan Cheng4f563382006-03-29 01:30:51 +00001230 [(set VR128:$dst, (v2f64 (vector_shuffle
1231 VR128:$src1, (load addr:$src2),
1232 UNPCKL_shuffle_mask)))]>;
Evan Cheng2c0dbd02006-03-24 02:58:06 +00001233}
Evan Cheng470a6ad2006-02-22 02:26:30 +00001234
Evan Cheng4b1734f2006-03-31 21:29:33 +00001235// Horizontal ops
1236let isTwoAddress = 1 in {
1237def HADDPSrr : S3S_Intrr<0x7C, "haddps {$src2, $dst|$dst, $src2}",
1238 int_x86_sse3_hadd_ps>;
1239def HADDPSrm : S3S_Intrm<0x7C, "haddps {$src2, $dst|$dst, $src2}",
1240 int_x86_sse3_hadd_ps>;
1241def HADDPDrr : S3D_Intrr<0x7C, "haddpd {$src2, $dst|$dst, $src2}",
1242 int_x86_sse3_hadd_pd>;
1243def HADDPDrm : S3D_Intrm<0x7C, "haddpd {$src2, $dst|$dst, $src2}",
1244 int_x86_sse3_hadd_pd>;
1245def HSUBPSrr : S3S_Intrr<0x7C, "hsubps {$src2, $dst|$dst, $src2}",
1246 int_x86_sse3_hsub_ps>;
1247def HSUBPSrm : S3S_Intrm<0x7C, "hsubps {$src2, $dst|$dst, $src2}",
1248 int_x86_sse3_hsub_ps>;
1249def HSUBPDrr : S3D_Intrr<0x7C, "hsubpd {$src2, $dst|$dst, $src2}",
1250 int_x86_sse3_hsub_pd>;
1251def HSUBPDrm : S3D_Intrm<0x7C, "hsubpd {$src2, $dst|$dst, $src2}",
1252 int_x86_sse3_hsub_pd>;
1253}
1254
Evan Chengbf156d12006-02-21 19:26:52 +00001255//===----------------------------------------------------------------------===//
Evan Cheng4e4c71e2006-02-21 20:00:20 +00001256// SSE integer instructions
Evan Chengbf156d12006-02-21 19:26:52 +00001257//===----------------------------------------------------------------------===//
1258
Evan Cheng4e4c71e2006-02-21 20:00:20 +00001259// Move Instructions
Evan Cheng24dc1f52006-03-23 07:44:07 +00001260def MOVDQArr : PDI<0x6F, MRMSrcReg, (ops VR128:$dst, VR128:$src),
1261 "movdqa {$src, $dst|$dst, $src}", []>;
1262def MOVDQArm : PDI<0x6F, MRMSrcMem, (ops VR128:$dst, i128mem:$src),
1263 "movdqa {$src, $dst|$dst, $src}",
Evan Cheng91b740d2006-04-12 17:12:36 +00001264 [(set VR128:$dst, (loadv2i64 addr:$src))]>;
Evan Cheng24dc1f52006-03-23 07:44:07 +00001265def MOVDQAmr : PDI<0x7F, MRMDestMem, (ops i128mem:$dst, VR128:$src),
1266 "movdqa {$src, $dst|$dst, $src}",
Evan Cheng91b740d2006-04-12 17:12:36 +00001267 [(store (v2i64 VR128:$src), addr:$dst)]>;
Evan Cheng24dc1f52006-03-23 07:44:07 +00001268
Evan Chenga971f6f2006-03-23 01:57:24 +00001269// 128-bit Integer Arithmetic
1270let isTwoAddress = 1 in {
1271let isCommutable = 1 in {
1272def PADDBrr : PDI<0xFC, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
1273 "paddb {$src2, $dst|$dst, $src2}",
1274 [(set VR128:$dst, (v16i8 (add VR128:$src1, VR128:$src2)))]>;
1275def PADDWrr : PDI<0xFD, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
1276 "paddw {$src2, $dst|$dst, $src2}",
1277 [(set VR128:$dst, (v8i16 (add VR128:$src1, VR128:$src2)))]>;
1278def PADDDrr : PDI<0xFE, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
1279 "paddd {$src2, $dst|$dst, $src2}",
1280 [(set VR128:$dst, (v4i32 (add VR128:$src1, VR128:$src2)))]>;
Evan Cheng506d3df2006-03-29 23:07:14 +00001281
1282def PADDQrr : PDI<0xD4, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
1283 "paddq {$src2, $dst|$dst, $src2}",
1284 [(set VR128:$dst, (v2i64 (add VR128:$src1, VR128:$src2)))]>;
Evan Chenga971f6f2006-03-23 01:57:24 +00001285}
1286def PADDBrm : PDI<0xFC, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
1287 "paddb {$src2, $dst|$dst, $src2}",
1288 [(set VR128:$dst, (v16i8 (add VR128:$src1,
1289 (load addr:$src2))))]>;
1290def PADDWrm : PDI<0xFD, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
1291 "paddw {$src2, $dst|$dst, $src2}",
1292 [(set VR128:$dst, (v8i16 (add VR128:$src1,
1293 (load addr:$src2))))]>;
1294def PADDDrm : PDI<0xFE, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
1295 "paddd {$src2, $dst|$dst, $src2}",
1296 [(set VR128:$dst, (v4i32 (add VR128:$src1,
1297 (load addr:$src2))))]>;
Evan Cheng506d3df2006-03-29 23:07:14 +00001298def PADDQrm : PDI<0xD4, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
1299 "paddd {$src2, $dst|$dst, $src2}",
1300 [(set VR128:$dst, (v2i64 (add VR128:$src1,
1301 (load addr:$src2))))]>;
Evan Cheng7b1d34b2006-03-25 01:33:37 +00001302
1303def PSUBBrr : PDI<0xF8, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
1304 "psubb {$src2, $dst|$dst, $src2}",
1305 [(set VR128:$dst, (v16i8 (sub VR128:$src1, VR128:$src2)))]>;
1306def PSUBWrr : PDI<0xF9, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
1307 "psubw {$src2, $dst|$dst, $src2}",
1308 [(set VR128:$dst, (v8i16 (sub VR128:$src1, VR128:$src2)))]>;
1309def PSUBDrr : PDI<0xFA, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
1310 "psubd {$src2, $dst|$dst, $src2}",
1311 [(set VR128:$dst, (v4i32 (sub VR128:$src1, VR128:$src2)))]>;
Evan Cheng506d3df2006-03-29 23:07:14 +00001312def PSUBQrr : PDI<0xFB, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
1313 "psubq {$src2, $dst|$dst, $src2}",
1314 [(set VR128:$dst, (v2i64 (sub VR128:$src1, VR128:$src2)))]>;
Evan Cheng7b1d34b2006-03-25 01:33:37 +00001315
1316def PSUBBrm : PDI<0xF8, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
1317 "psubb {$src2, $dst|$dst, $src2}",
1318 [(set VR128:$dst, (v16i8 (sub VR128:$src1,
1319 (load addr:$src2))))]>;
1320def PSUBWrm : PDI<0xF9, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
1321 "psubw {$src2, $dst|$dst, $src2}",
1322 [(set VR128:$dst, (v8i16 (sub VR128:$src1,
1323 (load addr:$src2))))]>;
1324def PSUBDrm : PDI<0xFA, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
1325 "psubd {$src2, $dst|$dst, $src2}",
1326 [(set VR128:$dst, (v4i32 (sub VR128:$src1,
1327 (load addr:$src2))))]>;
Evan Cheng506d3df2006-03-29 23:07:14 +00001328def PSUBQrm : PDI<0xFB, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
1329 "psubd {$src2, $dst|$dst, $src2}",
1330 [(set VR128:$dst, (v2i64 (sub VR128:$src1,
1331 (load addr:$src2))))]>;
1332}
Evan Chengc60bd972006-03-25 09:37:23 +00001333
Evan Chengff65e382006-04-04 21:49:39 +00001334let isTwoAddress = 1 in {
1335def PSLLDQri : PDIi8<0x73, MRM7r, (ops VR128:$dst, VR128:$src1, i32i8imm:$src2),
1336 "pslldq {$src2, $dst|$dst, $src2}", []>;
1337def PSRLDQri : PDIi8<0x73, MRM7r, (ops VR128:$dst, VR128:$src1, i32i8imm:$src2),
1338 "psrldq {$src2, $dst|$dst, $src2}", []>;
1339}
1340
Evan Cheng506d3df2006-03-29 23:07:14 +00001341// Logical
1342let isTwoAddress = 1 in {
1343let isCommutable = 1 in {
1344def PANDrr : PDI<0xDB, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
1345 "pand {$src2, $dst|$dst, $src2}",
1346 [(set VR128:$dst, (v2i64 (and VR128:$src1, VR128:$src2)))]>;
1347
1348def PANDrm : PDI<0xDB, MRMSrcMem, (ops VR128:$dst, VR128:$src1, i128mem:$src2),
1349 "pand {$src2, $dst|$dst, $src2}",
1350 [(set VR128:$dst, (v2i64 (and VR128:$src1,
1351 (load addr:$src2))))]>;
Evan Chengc6cb5bb2006-04-06 01:49:20 +00001352def PORrr : PDI<0xEB, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
Evan Cheng506d3df2006-03-29 23:07:14 +00001353 "por {$src2, $dst|$dst, $src2}",
1354 [(set VR128:$dst, (v2i64 (or VR128:$src1, VR128:$src2)))]>;
1355
Evan Chengc6cb5bb2006-04-06 01:49:20 +00001356def PORrm : PDI<0xEB, MRMSrcMem, (ops VR128:$dst, VR128:$src1, i128mem:$src2),
Evan Cheng506d3df2006-03-29 23:07:14 +00001357 "por {$src2, $dst|$dst, $src2}",
1358 [(set VR128:$dst, (v2i64 (or VR128:$src1,
1359 (load addr:$src2))))]>;
1360def PXORrr : PDI<0xEF, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
1361 "pxor {$src2, $dst|$dst, $src2}",
1362 [(set VR128:$dst, (v2i64 (xor VR128:$src1, VR128:$src2)))]>;
1363
1364def PXORrm : PDI<0xEF, MRMSrcMem, (ops VR128:$dst, VR128:$src1, i128mem:$src2),
1365 "pxor {$src2, $dst|$dst, $src2}",
1366 [(set VR128:$dst, (v2i64 (xor VR128:$src1,
1367 (load addr:$src2))))]>;
1368}
1369
1370def PANDNrr : PDI<0xDF, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
1371 "pandn {$src2, $dst|$dst, $src2}",
1372 [(set VR128:$dst, (v2i64 (and (vnot VR128:$src1),
1373 VR128:$src2)))]>;
1374
1375def PANDNrm : PDI<0xDF, MRMSrcMem, (ops VR128:$dst, VR128:$src1, i128mem:$src2),
1376 "pandn {$src2, $dst|$dst, $src2}",
1377 [(set VR128:$dst, (v2i64 (and (vnot VR128:$src1),
1378 (load addr:$src2))))]>;
1379}
1380
1381// Pack instructions
1382let isTwoAddress = 1 in {
1383def PACKSSWBrr : PDI<0x63, MRMSrcReg, (ops VR128:$dst, VR128:$src1,
1384 VR128:$src2),
1385 "packsswb {$src2, $dst|$dst, $src2}",
Evan Cheng591f7402006-03-29 23:53:14 +00001386 [(set VR128:$dst, (v8i16 (int_x86_sse2_packsswb_128
1387 VR128:$src1,
1388 VR128:$src2)))]>;
Evan Cheng506d3df2006-03-29 23:07:14 +00001389def PACKSSWBrm : PDI<0x63, MRMSrcMem, (ops VR128:$dst, VR128:$src1,
1390 i128mem:$src2),
1391 "packsswb {$src2, $dst|$dst, $src2}",
Evan Cheng591f7402006-03-29 23:53:14 +00001392 [(set VR128:$dst, (v8i16 (int_x86_sse2_packsswb_128
1393 VR128:$src1,
1394 (bc_v8i16 (loadv2f64 addr:$src2)))))]>;
Evan Cheng506d3df2006-03-29 23:07:14 +00001395def PACKSSDWrr : PDI<0x6B, MRMSrcReg, (ops VR128:$dst, VR128:$src1,
1396 VR128:$src2),
Evan Cheng591f7402006-03-29 23:53:14 +00001397 "packssdw {$src2, $dst|$dst, $src2}",
1398 [(set VR128:$dst, (v4i32 (int_x86_sse2_packssdw_128
1399 VR128:$src1,
1400 VR128:$src2)))]>;
Evan Cheng506d3df2006-03-29 23:07:14 +00001401def PACKSSDWrm : PDI<0x6B, MRMSrcReg, (ops VR128:$dst, VR128:$src1,
1402 i128mem:$src2),
Evan Cheng591f7402006-03-29 23:53:14 +00001403 "packssdw {$src2, $dst|$dst, $src2}",
1404 [(set VR128:$dst, (v4i32 (int_x86_sse2_packssdw_128
1405 VR128:$src1,
1406 (bc_v4i32 (loadv2i64 addr:$src2)))))]>;
Evan Cheng506d3df2006-03-29 23:07:14 +00001407def PACKUSWBrr : PDI<0x67, MRMSrcReg, (ops VR128:$dst, VR128:$src1,
1408 VR128:$src2),
1409 "packuswb {$src2, $dst|$dst, $src2}",
Evan Cheng591f7402006-03-29 23:53:14 +00001410 [(set VR128:$dst, (v8i16 (int_x86_sse2_packuswb_128
1411 VR128:$src1,
1412 VR128:$src2)))]>;
Evan Cheng506d3df2006-03-29 23:07:14 +00001413def PACKUSWBrm : PDI<0x67, MRMSrcReg, (ops VR128:$dst, VR128:$src1,
1414 i128mem:$src2),
1415 "packuswb {$src2, $dst|$dst, $src2}",
Evan Cheng591f7402006-03-29 23:53:14 +00001416 [(set VR128:$dst, (v8i16 (int_x86_sse2_packuswb_128
1417 VR128:$src1,
1418 (bc_v8i16 (loadv2i64 addr:$src2)))))]>;
Evan Cheng506d3df2006-03-29 23:07:14 +00001419}
1420
1421// Shuffle and unpack instructions
Evan Cheng8703be42006-04-04 19:12:30 +00001422def PSHUFDri : PDIi8<0x70, MRMSrcReg,
Evan Cheng506d3df2006-03-29 23:07:14 +00001423 (ops VR128:$dst, VR128:$src1, i8imm:$src2),
1424 "pshufd {$src2, $src1, $dst|$dst, $src1, $src2}",
1425 [(set VR128:$dst, (v4i32 (vector_shuffle
1426 VR128:$src1, (undef),
1427 PSHUFD_shuffle_mask:$src2)))]>;
Evan Cheng8703be42006-04-04 19:12:30 +00001428def PSHUFDmi : PDIi8<0x70, MRMSrcMem,
Evan Cheng506d3df2006-03-29 23:07:14 +00001429 (ops VR128:$dst, i128mem:$src1, i8imm:$src2),
1430 "pshufd {$src2, $src1, $dst|$dst, $src1, $src2}",
1431 [(set VR128:$dst, (v4i32 (vector_shuffle
Evan Cheng91b740d2006-04-12 17:12:36 +00001432 (bc_v4i32 (loadv2i64 addr:$src1)),
1433 (undef),
Evan Cheng506d3df2006-03-29 23:07:14 +00001434 PSHUFD_shuffle_mask:$src2)))]>;
1435
1436// SSE2 with ImmT == Imm8 and XS prefix.
Evan Cheng8703be42006-04-04 19:12:30 +00001437def PSHUFHWri : Ii8<0x70, MRMSrcReg,
Evan Cheng506d3df2006-03-29 23:07:14 +00001438 (ops VR128:$dst, VR128:$src1, i8imm:$src2),
1439 "pshufhw {$src2, $src1, $dst|$dst, $src1, $src2}",
1440 [(set VR128:$dst, (v8i16 (vector_shuffle
1441 VR128:$src1, (undef),
1442 PSHUFHW_shuffle_mask:$src2)))]>,
1443 XS, Requires<[HasSSE2]>;
Evan Cheng8703be42006-04-04 19:12:30 +00001444def PSHUFHWmi : Ii8<0x70, MRMSrcMem,
Evan Cheng506d3df2006-03-29 23:07:14 +00001445 (ops VR128:$dst, i128mem:$src1, i8imm:$src2),
1446 "pshufhw {$src2, $src1, $dst|$dst, $src1, $src2}",
1447 [(set VR128:$dst, (v8i16 (vector_shuffle
Evan Cheng91b740d2006-04-12 17:12:36 +00001448 (bc_v8i16 (loadv2i64 addr:$src1)),
1449 (undef),
Evan Cheng506d3df2006-03-29 23:07:14 +00001450 PSHUFHW_shuffle_mask:$src2)))]>,
1451 XS, Requires<[HasSSE2]>;
1452
1453// SSE2 with ImmT == Imm8 and XD prefix.
Evan Cheng8703be42006-04-04 19:12:30 +00001454def PSHUFLWri : Ii8<0x70, MRMSrcReg,
Evan Cheng506d3df2006-03-29 23:07:14 +00001455 (ops VR128:$dst, VR128:$src1, i32i8imm:$src2),
Evan Cheng7d9061e2006-03-30 19:54:57 +00001456 "pshuflw {$src2, $src1, $dst|$dst, $src1, $src2}",
Evan Cheng506d3df2006-03-29 23:07:14 +00001457 [(set VR128:$dst, (v8i16 (vector_shuffle
1458 VR128:$src1, (undef),
1459 PSHUFLW_shuffle_mask:$src2)))]>,
1460 XD, Requires<[HasSSE2]>;
Evan Cheng8703be42006-04-04 19:12:30 +00001461def PSHUFLWmi : Ii8<0x70, MRMSrcMem,
Evan Cheng506d3df2006-03-29 23:07:14 +00001462 (ops VR128:$dst, i128mem:$src1, i32i8imm:$src2),
Evan Cheng7d9061e2006-03-30 19:54:57 +00001463 "pshuflw {$src2, $src1, $dst|$dst, $src1, $src2}",
Evan Cheng506d3df2006-03-29 23:07:14 +00001464 [(set VR128:$dst, (v8i16 (vector_shuffle
Evan Cheng91b740d2006-04-12 17:12:36 +00001465 (bc_v8i16 (loadv2i64 addr:$src1)),
1466 (undef),
Evan Cheng506d3df2006-03-29 23:07:14 +00001467 PSHUFLW_shuffle_mask:$src2)))]>,
1468 XD, Requires<[HasSSE2]>;
1469
1470let isTwoAddress = 1 in {
Evan Chengc60bd972006-03-25 09:37:23 +00001471def PUNPCKLBWrr : PDI<0x60, MRMSrcReg,
1472 (ops VR128:$dst, VR128:$src1, VR128:$src2),
1473 "punpcklbw {$src2, $dst|$dst, $src2}",
Evan Cheng0038e592006-03-28 00:39:58 +00001474 [(set VR128:$dst,
1475 (v16i8 (vector_shuffle VR128:$src1, VR128:$src2,
1476 UNPCKL_shuffle_mask)))]>;
Evan Chengc60bd972006-03-25 09:37:23 +00001477def PUNPCKLBWrm : PDI<0x60, MRMSrcMem,
1478 (ops VR128:$dst, VR128:$src1, i128mem:$src2),
1479 "punpcklbw {$src2, $dst|$dst, $src2}",
Evan Cheng0038e592006-03-28 00:39:58 +00001480 [(set VR128:$dst,
Evan Cheng91b740d2006-04-12 17:12:36 +00001481 (v16i8 (vector_shuffle VR128:$src1,
1482 (bc_v16i8 (loadv2i64 addr:$src2)),
Evan Cheng0038e592006-03-28 00:39:58 +00001483 UNPCKL_shuffle_mask)))]>;
Evan Chengc60bd972006-03-25 09:37:23 +00001484def PUNPCKLWDrr : PDI<0x61, MRMSrcReg,
1485 (ops VR128:$dst, VR128:$src1, VR128:$src2),
1486 "punpcklwd {$src2, $dst|$dst, $src2}",
Evan Cheng0038e592006-03-28 00:39:58 +00001487 [(set VR128:$dst,
1488 (v8i16 (vector_shuffle VR128:$src1, VR128:$src2,
1489 UNPCKL_shuffle_mask)))]>;
Evan Chengc60bd972006-03-25 09:37:23 +00001490def PUNPCKLWDrm : PDI<0x61, MRMSrcMem,
1491 (ops VR128:$dst, VR128:$src1, i128mem:$src2),
1492 "punpcklwd {$src2, $dst|$dst, $src2}",
Evan Cheng0038e592006-03-28 00:39:58 +00001493 [(set VR128:$dst,
Evan Cheng91b740d2006-04-12 17:12:36 +00001494 (v8i16 (vector_shuffle VR128:$src1,
1495 (bc_v8i16 (loadv2i64 addr:$src2)),
Evan Cheng0038e592006-03-28 00:39:58 +00001496 UNPCKL_shuffle_mask)))]>;
Evan Chengc60bd972006-03-25 09:37:23 +00001497def PUNPCKLDQrr : PDI<0x62, MRMSrcReg,
1498 (ops VR128:$dst, VR128:$src1, VR128:$src2),
1499 "punpckldq {$src2, $dst|$dst, $src2}",
Evan Cheng0038e592006-03-28 00:39:58 +00001500 [(set VR128:$dst,
1501 (v4i32 (vector_shuffle VR128:$src1, VR128:$src2,
1502 UNPCKL_shuffle_mask)))]>;
Evan Chengc60bd972006-03-25 09:37:23 +00001503def PUNPCKLDQrm : PDI<0x62, MRMSrcMem,
1504 (ops VR128:$dst, VR128:$src1, i128mem:$src2),
1505 "punpckldq {$src2, $dst|$dst, $src2}",
Evan Cheng0038e592006-03-28 00:39:58 +00001506 [(set VR128:$dst,
Evan Cheng91b740d2006-04-12 17:12:36 +00001507 (v4i32 (vector_shuffle VR128:$src1,
1508 (bc_v4i32 (loadv2i64 addr:$src2)),
Evan Cheng0038e592006-03-28 00:39:58 +00001509 UNPCKL_shuffle_mask)))]>;
Evan Chengc60bd972006-03-25 09:37:23 +00001510def PUNPCKLQDQrr : PDI<0x6C, MRMSrcReg,
1511 (ops VR128:$dst, VR128:$src1, VR128:$src2),
Evan Cheng4fcb9222006-03-28 02:43:26 +00001512 "punpcklqdq {$src2, $dst|$dst, $src2}",
1513 [(set VR128:$dst,
1514 (v2i64 (vector_shuffle VR128:$src1, VR128:$src2,
1515 UNPCKL_shuffle_mask)))]>;
Evan Chengc60bd972006-03-25 09:37:23 +00001516def PUNPCKLQDQrm : PDI<0x6C, MRMSrcMem,
1517 (ops VR128:$dst, VR128:$src1, i128mem:$src2),
Evan Cheng4fcb9222006-03-28 02:43:26 +00001518 "punpcklqdq {$src2, $dst|$dst, $src2}",
1519 [(set VR128:$dst,
Evan Cheng91b740d2006-04-12 17:12:36 +00001520 (v2i64 (vector_shuffle VR128:$src1,
1521 (loadv2i64 addr:$src2),
Evan Cheng4fcb9222006-03-28 02:43:26 +00001522 UNPCKL_shuffle_mask)))]>;
Evan Chengc60bd972006-03-25 09:37:23 +00001523
1524def PUNPCKHBWrr : PDI<0x68, MRMSrcReg,
1525 (ops VR128:$dst, VR128:$src1, VR128:$src2),
Evan Cheng4fcb9222006-03-28 02:43:26 +00001526 "punpckhbw {$src2, $dst|$dst, $src2}",
1527 [(set VR128:$dst,
1528 (v16i8 (vector_shuffle VR128:$src1, VR128:$src2,
1529 UNPCKH_shuffle_mask)))]>;
Evan Chengc60bd972006-03-25 09:37:23 +00001530def PUNPCKHBWrm : PDI<0x68, MRMSrcMem,
1531 (ops VR128:$dst, VR128:$src1, i128mem:$src2),
Evan Cheng4fcb9222006-03-28 02:43:26 +00001532 "punpckhbw {$src2, $dst|$dst, $src2}",
1533 [(set VR128:$dst,
Evan Cheng91b740d2006-04-12 17:12:36 +00001534 (v16i8 (vector_shuffle VR128:$src1,
1535 (bc_v16i8 (loadv2i64 addr:$src2)),
Evan Cheng4fcb9222006-03-28 02:43:26 +00001536 UNPCKH_shuffle_mask)))]>;
Evan Chengc60bd972006-03-25 09:37:23 +00001537def PUNPCKHWDrr : PDI<0x69, MRMSrcReg,
1538 (ops VR128:$dst, VR128:$src1, VR128:$src2),
Evan Cheng4fcb9222006-03-28 02:43:26 +00001539 "punpckhwd {$src2, $dst|$dst, $src2}",
1540 [(set VR128:$dst,
1541 (v8i16 (vector_shuffle VR128:$src1, VR128:$src2,
1542 UNPCKH_shuffle_mask)))]>;
Evan Chengc60bd972006-03-25 09:37:23 +00001543def PUNPCKHWDrm : PDI<0x69, MRMSrcMem,
1544 (ops VR128:$dst, VR128:$src1, i128mem:$src2),
Evan Cheng4fcb9222006-03-28 02:43:26 +00001545 "punpckhwd {$src2, $dst|$dst, $src2}",
1546 [(set VR128:$dst,
Evan Cheng91b740d2006-04-12 17:12:36 +00001547 (v8i16 (vector_shuffle VR128:$src1,
1548 (bc_v8i16 (loadv2i64 addr:$src2)),
Evan Cheng4fcb9222006-03-28 02:43:26 +00001549 UNPCKH_shuffle_mask)))]>;
Evan Chengc60bd972006-03-25 09:37:23 +00001550def PUNPCKHDQrr : PDI<0x6A, MRMSrcReg,
1551 (ops VR128:$dst, VR128:$src1, VR128:$src2),
Evan Cheng4fcb9222006-03-28 02:43:26 +00001552 "punpckhdq {$src2, $dst|$dst, $src2}",
1553 [(set VR128:$dst,
1554 (v4i32 (vector_shuffle VR128:$src1, VR128:$src2,
1555 UNPCKH_shuffle_mask)))]>;
Evan Chengc60bd972006-03-25 09:37:23 +00001556def PUNPCKHDQrm : PDI<0x6A, MRMSrcMem,
1557 (ops VR128:$dst, VR128:$src1, i128mem:$src2),
Evan Cheng4fcb9222006-03-28 02:43:26 +00001558 "punpckhdq {$src2, $dst|$dst, $src2}",
1559 [(set VR128:$dst,
Evan Cheng91b740d2006-04-12 17:12:36 +00001560 (v4i32 (vector_shuffle VR128:$src1,
1561 (bc_v4i32 (loadv2i64 addr:$src2)),
Evan Cheng4fcb9222006-03-28 02:43:26 +00001562 UNPCKH_shuffle_mask)))]>;
Evan Chengc60bd972006-03-25 09:37:23 +00001563def PUNPCKHQDQrr : PDI<0x6D, MRMSrcReg,
1564 (ops VR128:$dst, VR128:$src1, VR128:$src2),
Evan Cheng4fcb9222006-03-28 02:43:26 +00001565 "punpckhdq {$src2, $dst|$dst, $src2}",
1566 [(set VR128:$dst,
1567 (v2i64 (vector_shuffle VR128:$src1, VR128:$src2,
1568 UNPCKH_shuffle_mask)))]>;
Evan Chengc60bd972006-03-25 09:37:23 +00001569def PUNPCKHQDQrm : PDI<0x6D, MRMSrcMem,
1570 (ops VR128:$dst, VR128:$src1, i128mem:$src2),
Evan Cheng4fcb9222006-03-28 02:43:26 +00001571 "punpckhqdq {$src2, $dst|$dst, $src2}",
1572 [(set VR128:$dst,
Evan Cheng91b740d2006-04-12 17:12:36 +00001573 (v2i64 (vector_shuffle VR128:$src1,
1574 (loadv2i64 addr:$src2),
Evan Cheng4fcb9222006-03-28 02:43:26 +00001575 UNPCKH_shuffle_mask)))]>;
Evan Chenga971f6f2006-03-23 01:57:24 +00001576}
Evan Cheng82521dd2006-03-21 07:09:35 +00001577
Evan Chengb067a1e2006-03-31 19:22:53 +00001578// Extract / Insert
Evan Cheng8703be42006-04-04 19:12:30 +00001579def PEXTRWr : PDIi8<0xC5, MRMSrcReg,
1580 (ops R32:$dst, VR128:$src1, i32i8imm:$src2),
1581 "pextrw {$src2, $src1, $dst|$dst, $src1, $src2}",
1582 [(set R32:$dst, (X86pextrw (v8i16 VR128:$src1),
1583 (i32 imm:$src2)))]>;
1584def PEXTRWm : PDIi8<0xC5, MRMSrcMem,
1585 (ops R32:$dst, i128mem:$src1, i32i8imm:$src2),
1586 "pextrw {$src2, $src1, $dst|$dst, $src1, $src2}",
Evan Cheng91b740d2006-04-12 17:12:36 +00001587 [(set R32:$dst, (X86pextrw
1588 (bc_v8i16 (loadv2i64 addr:$src1)),
Evan Cheng8703be42006-04-04 19:12:30 +00001589 (i32 imm:$src2)))]>;
Evan Chengb067a1e2006-03-31 19:22:53 +00001590
1591let isTwoAddress = 1 in {
Evan Cheng8703be42006-04-04 19:12:30 +00001592def PINSRWr : PDIi8<0xC4, MRMSrcReg,
Evan Chengb067a1e2006-03-31 19:22:53 +00001593 (ops VR128:$dst, VR128:$src1, R32:$src2, i32i8imm:$src3),
1594 "pinsrw {$src3, $src2, $dst|$dst, $src2, $src3}",
Evan Cheng653159f2006-03-31 21:55:24 +00001595 [(set VR128:$dst, (v8i16 (X86pinsrw (v8i16 VR128:$src1),
1596 R32:$src2, (i32 imm:$src3))))]>;
Evan Cheng8703be42006-04-04 19:12:30 +00001597def PINSRWm : PDIi8<0xC4, MRMSrcMem,
Evan Chengb067a1e2006-03-31 19:22:53 +00001598 (ops VR128:$dst, VR128:$src1, i16mem:$src2, i32i8imm:$src3),
1599 "pinsrw {$src3, $src2, $dst|$dst, $src2, $src3}",
1600 [(set VR128:$dst,
Evan Cheng653159f2006-03-31 21:55:24 +00001601 (v8i16 (X86pinsrw (v8i16 VR128:$src1),
Evan Chengb067a1e2006-03-31 19:22:53 +00001602 (i32 (anyext (loadi16 addr:$src2))),
1603 (i32 imm:$src3))))]>;
1604}
1605
Evan Cheng82521dd2006-03-21 07:09:35 +00001606//===----------------------------------------------------------------------===//
Evan Chengc653d482006-03-24 22:28:37 +00001607// Miscellaneous Instructions
1608//===----------------------------------------------------------------------===//
1609
Evan Chengc5fb2b12006-03-30 00:33:26 +00001610// Mask creation
1611def MOVMSKPSrr : PSI<0x50, MRMSrcReg, (ops R32:$dst, VR128:$src),
1612 "movmskps {$src, $dst|$dst, $src}",
1613 [(set R32:$dst, (int_x86_sse_movmsk_ps VR128:$src))]>;
1614def MOVMSKPDrr : PSI<0x50, MRMSrcReg, (ops R32:$dst, VR128:$src),
1615 "movmskpd {$src, $dst|$dst, $src}",
Evan Chenga50a0862006-04-13 00:00:23 +00001616 [(set R32:$dst, (int_x86_sse2_movmsk_pd VR128:$src))]>;
Evan Chengc5fb2b12006-03-30 00:33:26 +00001617
1618def PMOVMSKBrr : PDI<0xD7, MRMSrcReg, (ops R32:$dst, VR128:$src),
1619 "pmovmskb {$src, $dst|$dst, $src}",
1620 [(set R32:$dst, (int_x86_sse2_pmovmskb_128 VR128:$src))]>;
1621
Evan Chengfcf5e212006-04-11 06:57:30 +00001622// Conditional store
1623def MASKMOVDQU : PDI<0xF7, RawFrm, (ops VR128:$src, VR128:$mask),
1624 "maskmovdqu {$mask, $src|$src, $mask}",
1625 [(int_x86_sse2_maskmov_dqu VR128:$src, VR128:$mask, EDI)]>,
1626 Imp<[EDI],[]>;
1627
Evan Chengecac9cb2006-03-25 06:03:26 +00001628// Prefetching loads
Evan Cheng135c6a92006-04-11 17:35:57 +00001629def PREFETCHT0 : PSI<0x18, MRM1m, (ops i8mem:$src),
Evan Chengdf3c33c2006-04-11 18:04:57 +00001630 "prefetcht0 $src", []>;
Evan Cheng135c6a92006-04-11 17:35:57 +00001631def PREFETCHT1 : PSI<0x18, MRM2m, (ops i8mem:$src),
Evan Chengdf3c33c2006-04-11 18:04:57 +00001632 "prefetcht1 $src", []>;
Evan Cheng135c6a92006-04-11 17:35:57 +00001633def PREFETCHT2 : PSI<0x18, MRM3m, (ops i8mem:$src),
Evan Chengdf3c33c2006-04-11 18:04:57 +00001634 "prefetcht2 $src", []>;
Evan Cheng135c6a92006-04-11 17:35:57 +00001635def PREFETCHTNTA : PSI<0x18, MRM0m, (ops i8mem:$src),
Evan Chengdf3c33c2006-04-11 18:04:57 +00001636 "prefetchtnta $src", []>;
Evan Chengecac9cb2006-03-25 06:03:26 +00001637
1638// Non-temporal stores
Evan Chengfcf5e212006-04-11 06:57:30 +00001639def MOVNTPSmr : PSI<0x2B, MRMDestMem, (ops i128mem:$dst, VR128:$src),
1640 "movntps {$src, $dst|$dst, $src}",
1641 [(int_x86_sse_movnt_ps addr:$dst, VR128:$src)]>;
1642def MOVNTPDmr : PDI<0x2B, MRMDestMem, (ops i128mem:$dst, VR128:$src),
1643 "movntpd {$src, $dst|$dst, $src}",
1644 [(int_x86_sse2_movnt_pd addr:$dst, VR128:$src)]>;
1645def MOVNTDQmr : PDI<0xE7, MRMDestMem, (ops f128mem:$dst, VR128:$src),
1646 "movntdq {$src, $dst|$dst, $src}",
1647 [(int_x86_sse2_movnt_dq addr:$dst, VR128:$src)]>;
1648def MOVNTImr : I<0xC3, MRMDestMem, (ops i32mem:$dst, R32:$src),
1649 "movnti {$src, $dst|$dst, $src}",
1650 [(int_x86_sse2_movnt_i addr:$dst, R32:$src)]>,
1651 TB, Requires<[HasSSE2]>;
Evan Chengecac9cb2006-03-25 06:03:26 +00001652
1653// Store fence
1654def SFENCE : I<0xAE, MRM7m, (ops),
Evan Cheng135c6a92006-04-11 17:35:57 +00001655 "sfence", [(int_x86_sse_sfence)]>, TB, Requires<[HasSSE1]>;
Evan Chengecac9cb2006-03-25 06:03:26 +00001656
Evan Cheng372db542006-04-08 00:47:44 +00001657// MXCSR register
Evan Chengc653d482006-03-24 22:28:37 +00001658def LDMXCSR : I<0xAE, MRM2m, (ops i32mem:$src),
Evan Cheng372db542006-04-08 00:47:44 +00001659 "ldmxcsr $src",
1660 [(int_x86_sse_ldmxcsr addr:$src)]>, TB, Requires<[HasSSE1]>;
1661def STMXCSR : I<0xAE, MRM3m, (ops i32mem:$dst),
1662 "stmxcsr $dst",
1663 [(int_x86_sse_stmxcsr addr:$dst)]>, TB, Requires<[HasSSE1]>;
Evan Chengc653d482006-03-24 22:28:37 +00001664
1665//===----------------------------------------------------------------------===//
Evan Cheng82521dd2006-03-21 07:09:35 +00001666// Alias Instructions
1667//===----------------------------------------------------------------------===//
1668
Evan Chengffea91e2006-03-26 09:53:12 +00001669// Alias instructions that map zero vector to pxor / xorp* for sse.
Evan Cheng386031a2006-03-24 07:29:27 +00001670// FIXME: remove when we can teach regalloc that xor reg, reg is ok.
Evan Chengffea91e2006-03-26 09:53:12 +00001671def V_SET0_PI : PDI<0xEF, MRMInitReg, (ops VR128:$dst),
1672 "pxor $dst, $dst",
1673 [(set VR128:$dst, (v2i64 immAllZerosV))]>;
1674def V_SET0_PS : PSI<0x57, MRMInitReg, (ops VR128:$dst),
1675 "xorps $dst, $dst",
1676 [(set VR128:$dst, (v4f32 immAllZerosV))]>;
1677def V_SET0_PD : PDI<0x57, MRMInitReg, (ops VR128:$dst),
1678 "xorpd $dst, $dst",
1679 [(set VR128:$dst, (v2f64 immAllZerosV))]>;
Evan Cheng386031a2006-03-24 07:29:27 +00001680
Evan Chenga0b3afb2006-03-27 07:00:16 +00001681def V_SETALLONES : PDI<0x76, MRMInitReg, (ops VR128:$dst),
1682 "pcmpeqd $dst, $dst",
1683 [(set VR128:$dst, (v2f64 immAllOnesV))]>;
1684
Evan Cheng11e15b32006-04-03 20:53:28 +00001685// FR32 / FR64 to 128-bit vector conversion.
1686def MOVSS2PSrr : SSI<0x10, MRMSrcReg, (ops VR128:$dst, FR32:$src),
1687 "movss {$src, $dst|$dst, $src}",
1688 [(set VR128:$dst,
1689 (v4f32 (scalar_to_vector FR32:$src)))]>;
1690def MOVSS2PSrm : SSI<0x10, MRMSrcMem, (ops VR128:$dst, f32mem:$src),
1691 "movss {$src, $dst|$dst, $src}",
1692 [(set VR128:$dst,
1693 (v4f32 (scalar_to_vector (loadf32 addr:$src))))]>;
1694def MOVSD2PDrr : SDI<0x10, MRMSrcReg, (ops VR128:$dst, FR64:$src),
1695 "movsd {$src, $dst|$dst, $src}",
1696 [(set VR128:$dst,
1697 (v2f64 (scalar_to_vector FR64:$src)))]>;
1698def MOVSD2PDrm : SDI<0x10, MRMSrcMem, (ops VR128:$dst, f64mem:$src),
1699 "movsd {$src, $dst|$dst, $src}",
1700 [(set VR128:$dst,
1701 (v2f64 (scalar_to_vector (loadf64 addr:$src))))]>;
1702
1703def MOVDI2PDIrr : PDI<0x6E, MRMSrcReg, (ops VR128:$dst, R32:$src),
1704 "movd {$src, $dst|$dst, $src}",
1705 [(set VR128:$dst,
1706 (v4i32 (scalar_to_vector R32:$src)))]>;
1707def MOVDI2PDIrm : PDI<0x6E, MRMSrcMem, (ops VR128:$dst, i32mem:$src),
1708 "movd {$src, $dst|$dst, $src}",
1709 [(set VR128:$dst,
1710 (v4i32 (scalar_to_vector (loadi32 addr:$src))))]>;
1711// SSE2 instructions with XS prefix
1712def MOVQI2PQIrr : I<0x7E, MRMSrcReg, (ops VR128:$dst, VR64:$src),
1713 "movq {$src, $dst|$dst, $src}",
1714 [(set VR128:$dst,
1715 (v2i64 (scalar_to_vector VR64:$src)))]>, XS,
1716 Requires<[HasSSE2]>;
1717def MOVQI2PQIrm : I<0x7E, MRMSrcMem, (ops VR128:$dst, i64mem:$src),
1718 "movq {$src, $dst|$dst, $src}",
1719 [(set VR128:$dst,
1720 (v2i64 (scalar_to_vector (loadi64 addr:$src))))]>, XS,
1721 Requires<[HasSSE2]>;
1722// FIXME: may not be able to eliminate this movss with coalescing the src and
1723// dest register classes are different. We really want to write this pattern
1724// like this:
1725// def : Pat<(f32 (vector_extract (v4f32 VR128:$src), (i32 0))),
1726// (f32 FR32:$src)>;
1727def MOVPS2SSrr : SSI<0x10, MRMSrcReg, (ops FR32:$dst, VR128:$src),
1728 "movss {$src, $dst|$dst, $src}",
1729 [(set FR32:$dst, (vector_extract (v4f32 VR128:$src),
1730 (i32 0)))]>;
Evan Cheng85c09652006-04-06 23:53:29 +00001731def MOVPS2SSmr : SSI<0x11, MRMDestMem, (ops f32mem:$dst, VR128:$src),
Evan Cheng11e15b32006-04-03 20:53:28 +00001732 "movss {$src, $dst|$dst, $src}",
1733 [(store (f32 (vector_extract (v4f32 VR128:$src),
1734 (i32 0))), addr:$dst)]>;
1735def MOVPD2SDrr : SDI<0x10, MRMSrcReg, (ops FR64:$dst, VR128:$src),
1736 "movsd {$src, $dst|$dst, $src}",
1737 [(set FR64:$dst, (vector_extract (v2f64 VR128:$src),
1738 (i32 0)))]>;
Evan Cheng85c09652006-04-06 23:53:29 +00001739def MOVPDI2DIrr : PDI<0x6E, MRMSrcReg, (ops R32:$dst, VR128:$src),
Evan Cheng11e15b32006-04-03 20:53:28 +00001740 "movd {$src, $dst|$dst, $src}",
1741 [(set R32:$dst, (vector_extract (v4i32 VR128:$src),
1742 (i32 0)))]>;
1743def MOVPDI2DImr : PDI<0x7E, MRMDestMem, (ops i32mem:$dst, VR128:$src),
1744 "movd {$src, $dst|$dst, $src}",
1745 [(store (i32 (vector_extract (v4i32 VR128:$src),
1746 (i32 0))), addr:$dst)]>;
1747
1748// Move to lower bits of a VR128, leaving upper bits alone.
Evan Chengbc4832b2006-03-24 23:15:12 +00001749// Three operand (but two address) aliases.
1750let isTwoAddress = 1 in {
Evan Cheng11e15b32006-04-03 20:53:28 +00001751def MOVLSS2PSrr : SSI<0x10, MRMSrcReg, (ops VR128:$dst, VR128:$src1, FR32:$src2),
Evan Chengbc4832b2006-03-24 23:15:12 +00001752 "movss {$src2, $dst|$dst, $src2}", []>;
Evan Cheng11e15b32006-04-03 20:53:28 +00001753def MOVLSD2PDrr : SDI<0x10, MRMSrcReg, (ops VR128:$dst, VR128:$src1, FR64:$src2),
Evan Chengbc4832b2006-03-24 23:15:12 +00001754 "movsd {$src2, $dst|$dst, $src2}", []>;
Evan Cheng11e15b32006-04-03 20:53:28 +00001755def MOVLDI2PDIrr : PDI<0x6E, MRMSrcReg, (ops VR128:$dst, VR128:$src1, R32:$src2),
Evan Chengbc4832b2006-03-24 23:15:12 +00001756 "movd {$src2, $dst|$dst, $src2}", []>;
Evan Chengd6d1cbd2006-04-11 00:19:04 +00001757
1758def MOVLPSrr : SSI<0x10, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
1759 "movss {$src2, $dst|$dst, $src2}",
1760 [(set VR128:$dst,
1761 (v4f32 (vector_shuffle VR128:$src1, VR128:$src2,
1762 MOVS_shuffle_mask)))]>;
1763def MOVLPDrr : SDI<0x10, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
1764 "movsd {$src2, $dst|$dst, $src2}",
1765 [(set VR128:$dst,
1766 (v2f64 (vector_shuffle VR128:$src1, VR128:$src2,
1767 MOVS_shuffle_mask)))]>;
Evan Chengbc4832b2006-03-24 23:15:12 +00001768}
Evan Cheng82521dd2006-03-21 07:09:35 +00001769
Evan Cheng397edef2006-04-11 22:28:25 +00001770// Store / copy lower 64-bits of a XMM register.
1771def MOVLQ128mr : PDI<0xD6, MRMDestMem, (ops i64mem:$dst, VR128:$src),
1772 "movq {$src, $dst|$dst, $src}",
1773 [(int_x86_sse2_storel_dq addr:$dst, VR128:$src)]>;
1774
1775// FIXME: Temporary workaround since 2-wide shuffle is broken.
1776def MOVLQ128rr : PDI<0xD6, MRMSrcReg, (ops VR128:$dst, VR128:$src),
1777 "movq {$src, $dst|$dst, $src}",
1778 [(set VR128:$dst, (int_x86_sse2_movl_dq VR128:$src))]>;
1779
Evan Cheng11e15b32006-04-03 20:53:28 +00001780// Move to lower bits of a VR128 and zeroing upper bits.
Evan Chengbc4832b2006-03-24 23:15:12 +00001781// Loading from memory automatically zeroing upper bits.
Evan Cheng11e15b32006-04-03 20:53:28 +00001782def MOVZSS2PSrm : SSI<0x10, MRMSrcMem, (ops VR128:$dst, f32mem:$src),
Evan Chengbc4832b2006-03-24 23:15:12 +00001783 "movss {$src, $dst|$dst, $src}",
Evan Cheng82521dd2006-03-21 07:09:35 +00001784 [(set VR128:$dst,
Evan Chengbc4832b2006-03-24 23:15:12 +00001785 (v4f32 (X86zexts2vec (loadf32 addr:$src))))]>;
Evan Cheng11e15b32006-04-03 20:53:28 +00001786def MOVZSD2PDrm : SDI<0x10, MRMSrcMem, (ops VR128:$dst, f64mem:$src),
Evan Chengbc4832b2006-03-24 23:15:12 +00001787 "movsd {$src, $dst|$dst, $src}",
1788 [(set VR128:$dst,
1789 (v2f64 (X86zexts2vec (loadf64 addr:$src))))]>;
Evan Cheng11e15b32006-04-03 20:53:28 +00001790def MOVZDI2PDIrm : PDI<0x6E, MRMSrcMem, (ops VR128:$dst, i32mem:$src),
1791 "movd {$src, $dst|$dst, $src}",
1792 [(set VR128:$dst,
1793 (v4i32 (X86zexts2vec (loadi32 addr:$src))))]>;
1794def MOVZQI2PQIrm : PDI<0x7E, MRMSrcMem, (ops VR128:$dst, i64mem:$src),
Evan Cheng397edef2006-04-11 22:28:25 +00001795 "movq {$src, $dst|$dst, $src}",
Evan Cheng11e15b32006-04-03 20:53:28 +00001796 [(set VR128:$dst,
Evan Cheng397edef2006-04-11 22:28:25 +00001797 (bc_v2i64 (v2f64 (X86zexts2vec
1798 (loadf64 addr:$src)))))]>;
Evan Cheng48090aa2006-03-21 23:01:21 +00001799
1800//===----------------------------------------------------------------------===//
1801// Non-Instruction Patterns
1802//===----------------------------------------------------------------------===//
1803
1804// 128-bit vector undef's.
1805def : Pat<(v2f64 (undef)), (IMPLICIT_DEF_VR128)>, Requires<[HasSSE2]>;
1806def : Pat<(v16i8 (undef)), (IMPLICIT_DEF_VR128)>, Requires<[HasSSE2]>;
1807def : Pat<(v8i16 (undef)), (IMPLICIT_DEF_VR128)>, Requires<[HasSSE2]>;
1808def : Pat<(v4i32 (undef)), (IMPLICIT_DEF_VR128)>, Requires<[HasSSE2]>;
1809def : Pat<(v2i64 (undef)), (IMPLICIT_DEF_VR128)>, Requires<[HasSSE2]>;
1810
Evan Chengffea91e2006-03-26 09:53:12 +00001811// 128-bit vector all zero's.
1812def : Pat<(v16i8 immAllZerosV), (v16i8 (V_SET0_PI))>, Requires<[HasSSE2]>;
1813def : Pat<(v8i16 immAllZerosV), (v8i16 (V_SET0_PI))>, Requires<[HasSSE2]>;
1814def : Pat<(v4i32 immAllZerosV), (v4i32 (V_SET0_PI))>, Requires<[HasSSE2]>;
1815
Evan Chenga0b3afb2006-03-27 07:00:16 +00001816// 128-bit vector all one's.
1817def : Pat<(v16i8 immAllOnesV), (v16i8 (V_SETALLONES))>, Requires<[HasSSE2]>;
1818def : Pat<(v8i16 immAllOnesV), (v8i16 (V_SETALLONES))>, Requires<[HasSSE2]>;
1819def : Pat<(v4i32 immAllOnesV), (v4i32 (V_SETALLONES))>, Requires<[HasSSE2]>;
1820def : Pat<(v2i64 immAllOnesV), (v2i64 (V_SETALLONES))>, Requires<[HasSSE2]>;
1821def : Pat<(v4f32 immAllOnesV), (v4f32 (V_SETALLONES))>, Requires<[HasSSE1]>;
1822
Evan Cheng48090aa2006-03-21 23:01:21 +00001823// Store 128-bit integer vector values.
Evan Cheng24dc1f52006-03-23 07:44:07 +00001824def : Pat<(store (v16i8 VR128:$src), addr:$dst),
Evan Chengffea91e2006-03-26 09:53:12 +00001825 (MOVDQAmr addr:$dst, VR128:$src)>, Requires<[HasSSE2]>;
Evan Cheng24dc1f52006-03-23 07:44:07 +00001826def : Pat<(store (v8i16 VR128:$src), addr:$dst),
Evan Chengffea91e2006-03-26 09:53:12 +00001827 (MOVDQAmr addr:$dst, VR128:$src)>, Requires<[HasSSE2]>;
Evan Cheng24dc1f52006-03-23 07:44:07 +00001828def : Pat<(store (v4i32 VR128:$src), addr:$dst),
Evan Chengffea91e2006-03-26 09:53:12 +00001829 (MOVDQAmr addr:$dst, VR128:$src)>, Requires<[HasSSE2]>;
Evan Cheng48090aa2006-03-21 23:01:21 +00001830
1831// Scalar to v8i16 / v16i8. The source may be a R32, but only the lower 8 or
1832// 16-bits matter.
Evan Cheng11e15b32006-04-03 20:53:28 +00001833def : Pat<(v8i16 (X86s2vec R32:$src)), (MOVDI2PDIrr R32:$src)>,
Evan Chengffea91e2006-03-26 09:53:12 +00001834 Requires<[HasSSE2]>;
Evan Cheng11e15b32006-04-03 20:53:28 +00001835def : Pat<(v16i8 (X86s2vec R32:$src)), (MOVDI2PDIrr R32:$src)>,
Evan Chengffea91e2006-03-26 09:53:12 +00001836 Requires<[HasSSE2]>;
Evan Cheng48090aa2006-03-21 23:01:21 +00001837
Evan Cheng2c0dbd02006-03-24 02:58:06 +00001838// bit_convert
Evan Cheng475aecf2006-03-29 03:04:49 +00001839def : Pat<(v2i64 (bitconvert (v4i32 VR128:$src))), (v2i64 VR128:$src)>,
1840 Requires<[HasSSE2]>;
Evan Cheng506d3df2006-03-29 23:07:14 +00001841def : Pat<(v2i64 (bitconvert (v8i16 VR128:$src))), (v2i64 VR128:$src)>,
1842 Requires<[HasSSE2]>;
1843def : Pat<(v2i64 (bitconvert (v16i8 VR128:$src))), (v2i64 VR128:$src)>,
1844 Requires<[HasSSE2]>;
Evan Cheng664ade72006-04-07 21:20:58 +00001845def : Pat<(v2i64 (bitconvert (v2f64 VR128:$src))), (v2i64 VR128:$src)>,
1846 Requires<[HasSSE2]>;
1847def : Pat<(v2i64 (bitconvert (v4f32 VR128:$src))), (v2i64 VR128:$src)>,
1848 Requires<[HasSSE2]>;
Evan Cheng506d3df2006-03-29 23:07:14 +00001849def : Pat<(v4i32 (bitconvert (v2i64 VR128:$src))), (v4i32 VR128:$src)>,
1850 Requires<[HasSSE2]>;
1851def : Pat<(v4i32 (bitconvert (v8i16 VR128:$src))), (v4i32 VR128:$src)>,
1852 Requires<[HasSSE2]>;
1853def : Pat<(v4i32 (bitconvert (v16i8 VR128:$src))), (v4i32 VR128:$src)>,
1854 Requires<[HasSSE2]>;
Evan Cheng664ade72006-04-07 21:20:58 +00001855def : Pat<(v4i32 (bitconvert (v2f64 VR128:$src))), (v4i32 VR128:$src)>,
1856 Requires<[HasSSE2]>;
1857def : Pat<(v4i32 (bitconvert (v4f32 VR128:$src))), (v4i32 VR128:$src)>,
1858 Requires<[HasSSE2]>;
Evan Cheng506d3df2006-03-29 23:07:14 +00001859def : Pat<(v8i16 (bitconvert (v2i64 VR128:$src))), (v4i32 VR128:$src)>,
1860 Requires<[HasSSE2]>;
1861def : Pat<(v8i16 (bitconvert (v4i32 VR128:$src))), (v4i32 VR128:$src)>,
1862 Requires<[HasSSE2]>;
1863def : Pat<(v8i16 (bitconvert (v16i8 VR128:$src))), (v4i32 VR128:$src)>,
1864 Requires<[HasSSE2]>;
Evan Cheng664ade72006-04-07 21:20:58 +00001865def : Pat<(v8i16 (bitconvert (v2f64 VR128:$src))), (v8i16 VR128:$src)>,
1866 Requires<[HasSSE2]>;
1867def : Pat<(v8i16 (bitconvert (v4f32 VR128:$src))), (v8i16 VR128:$src)>,
1868 Requires<[HasSSE2]>;
Evan Cheng506d3df2006-03-29 23:07:14 +00001869def : Pat<(v16i8 (bitconvert (v2i64 VR128:$src))), (v4i32 VR128:$src)>,
1870 Requires<[HasSSE2]>;
1871def : Pat<(v16i8 (bitconvert (v4i32 VR128:$src))), (v4i32 VR128:$src)>,
1872 Requires<[HasSSE2]>;
1873def : Pat<(v16i8 (bitconvert (v8i16 VR128:$src))), (v4i32 VR128:$src)>,
1874 Requires<[HasSSE2]>;
Evan Cheng664ade72006-04-07 21:20:58 +00001875def : Pat<(v16i8 (bitconvert (v2f64 VR128:$src))), (v16i8 VR128:$src)>,
1876 Requires<[HasSSE2]>;
1877def : Pat<(v16i8 (bitconvert (v4f32 VR128:$src))), (v16i8 VR128:$src)>,
1878 Requires<[HasSSE2]>;
1879def : Pat<(v4f32 (bitconvert (v2i64 VR128:$src))), (v4f32 VR128:$src)>,
Evan Chengffea91e2006-03-26 09:53:12 +00001880 Requires<[HasSSE2]>;
1881def : Pat<(v4f32 (bitconvert (v4i32 VR128:$src))), (v4f32 VR128:$src)>,
1882 Requires<[HasSSE2]>;
Evan Cheng664ade72006-04-07 21:20:58 +00001883def : Pat<(v4f32 (bitconvert (v8i16 VR128:$src))), (v4f32 VR128:$src)>,
1884 Requires<[HasSSE2]>;
1885def : Pat<(v4f32 (bitconvert (v16i8 VR128:$src))), (v4f32 VR128:$src)>,
1886 Requires<[HasSSE2]>;
Evan Cheng5ced1d82006-04-06 23:23:56 +00001887def : Pat<(v4f32 (bitconvert (v2f64 VR128:$src))), (v4f32 VR128:$src)>,
1888 Requires<[HasSSE2]>;
Evan Cheng664ade72006-04-07 21:20:58 +00001889def : Pat<(v2f64 (bitconvert (v2i64 VR128:$src))), (v2f64 VR128:$src)>,
1890 Requires<[HasSSE2]>;
1891def : Pat<(v2f64 (bitconvert (v4i32 VR128:$src))), (v2f64 VR128:$src)>,
1892 Requires<[HasSSE2]>;
1893def : Pat<(v2f64 (bitconvert (v8i16 VR128:$src))), (v2f64 VR128:$src)>,
1894 Requires<[HasSSE2]>;
1895def : Pat<(v2f64 (bitconvert (v16i8 VR128:$src))), (v2f64 VR128:$src)>,
1896 Requires<[HasSSE2]>;
1897def : Pat<(v2f64 (bitconvert (v4f32 VR128:$src))), (v2f64 VR128:$src)>,
1898 Requires<[HasSSE2]>;
Evan Chengb9df0ca2006-03-22 02:53:00 +00001899
Evan Chengbc4832b2006-03-24 23:15:12 +00001900// Zeroing a VR128 then do a MOVS* to the lower bits.
1901def : Pat<(v2f64 (X86zexts2vec FR64:$src)),
Evan Cheng11e15b32006-04-03 20:53:28 +00001902 (MOVLSD2PDrr (V_SET0_PD), FR64:$src)>, Requires<[HasSSE2]>;
Evan Chengbc4832b2006-03-24 23:15:12 +00001903def : Pat<(v4f32 (X86zexts2vec FR32:$src)),
Evan Cheng11e15b32006-04-03 20:53:28 +00001904 (MOVLSS2PSrr (V_SET0_PS), FR32:$src)>, Requires<[HasSSE2]>;
Evan Chengbc4832b2006-03-24 23:15:12 +00001905def : Pat<(v4i32 (X86zexts2vec R32:$src)),
Evan Cheng11e15b32006-04-03 20:53:28 +00001906 (MOVLDI2PDIrr (V_SET0_PI), R32:$src)>, Requires<[HasSSE2]>;
Evan Chengbc4832b2006-03-24 23:15:12 +00001907def : Pat<(v8i16 (X86zexts2vec R16:$src)),
Evan Cheng11e15b32006-04-03 20:53:28 +00001908 (MOVLDI2PDIrr (V_SET0_PI), (MOVZX32rr16 R16:$src))>, Requires<[HasSSE2]>;
Evan Chengbc4832b2006-03-24 23:15:12 +00001909def : Pat<(v16i8 (X86zexts2vec R8:$src)),
Evan Cheng11e15b32006-04-03 20:53:28 +00001910 (MOVLDI2PDIrr (V_SET0_PI), (MOVZX32rr8 R8:$src))>, Requires<[HasSSE2]>;
Evan Chengbc4832b2006-03-24 23:15:12 +00001911
Evan Chengb9df0ca2006-03-22 02:53:00 +00001912// Splat v2f64 / v2i64
Evan Cheng691c9232006-03-29 19:02:40 +00001913def : Pat<(vector_shuffle (v2f64 VR128:$src), (undef), SSE_splat_mask:$sm),
1914 (v2f64 (UNPCKLPDrr VR128:$src, VR128:$src))>, Requires<[HasSSE2]>;
1915def : Pat<(vector_shuffle (v2i64 VR128:$src), (undef), SSE_splat_mask:$sm),
Evan Cheng475aecf2006-03-29 03:04:49 +00001916 (v2i64 (PUNPCKLQDQrr VR128:$src, VR128:$src))>, Requires<[HasSSE2]>;
1917
Evan Cheng691c9232006-03-29 19:02:40 +00001918// Splat v4f32
1919def : Pat<(vector_shuffle (v4f32 VR128:$src), (undef), SSE_splat_mask:$sm),
1920 (v4f32 (SHUFPSrr VR128:$src, VR128:$src, SSE_splat_mask:$sm))>,
1921 Requires<[HasSSE1]>;
1922
Evan Cheng3d60df42006-04-10 22:35:16 +00001923// Special unary SHUFPSrr case.
1924// FIXME: when we want non two-address code, then we should use PSHUFD?
Evan Cheng7d9061e2006-03-30 19:54:57 +00001925def : Pat<(vector_shuffle (v4f32 VR128:$src1), (undef),
Evan Cheng3d60df42006-04-10 22:35:16 +00001926 SHUFP_unary_shuffle_mask:$sm),
1927 (v4f32 (SHUFPSrr VR128:$src1, VR128:$src1, SHUFP_unary_shuffle_mask:$sm))>,
Evan Cheng56e73012006-04-10 21:42:19 +00001928 Requires<[HasSSE1]>;
Evan Cheng3d60df42006-04-10 22:35:16 +00001929// Unary v4f32 shuffle with PSHUF* in order to fold a load.
Evan Cheng7d9061e2006-03-30 19:54:57 +00001930def : Pat<(vector_shuffle (loadv4f32 addr:$src1), (undef),
Evan Cheng3d60df42006-04-10 22:35:16 +00001931 SHUFP_unary_shuffle_mask:$sm),
1932 (v4f32 (PSHUFDmi addr:$src1, SHUFP_unary_shuffle_mask:$sm))>,
Evan Cheng7d9061e2006-03-30 19:54:57 +00001933 Requires<[HasSSE2]>;
Evan Cheng3d60df42006-04-10 22:35:16 +00001934// Special binary v4i32 shuffle cases with SHUFPS.
1935def : Pat<(vector_shuffle (v4i32 VR128:$src1), (v4i32 VR128:$src2),
1936 PSHUFD_binary_shuffle_mask:$sm),
1937 (v4i32 (SHUFPSrr VR128:$src1, VR128:$src2,
1938 PSHUFD_binary_shuffle_mask:$sm))>, Requires<[HasSSE2]>;
Evan Cheng91b740d2006-04-12 17:12:36 +00001939def : Pat<(vector_shuffle (v4i32 VR128:$src1),
1940 (bc_v4i32 (loadv2i64 addr:$src2)), PSHUFD_binary_shuffle_mask:$sm),
Evan Cheng3d60df42006-04-10 22:35:16 +00001941 (v4i32 (SHUFPSrm VR128:$src1, addr:$src2,
1942 PSHUFD_binary_shuffle_mask:$sm))>, Requires<[HasSSE2]>;
Evan Cheng1b32f222006-03-30 07:33:32 +00001943
Evan Cheng1d5a8cc2006-04-05 07:20:06 +00001944// vector_shuffle v1, <undef>, <0, 0, 1, 1, ...>
1945def : Pat<(v4f32 (vector_shuffle VR128:$src, (undef),
1946 UNPCKL_v_undef_shuffle_mask)),
1947 (UNPCKLPSrr VR128:$src, VR128:$src)>, Requires<[HasSSE2]>;
1948def : Pat<(v16i8 (vector_shuffle VR128:$src, (undef),
1949 UNPCKL_v_undef_shuffle_mask)),
1950 (PUNPCKLBWrr VR128:$src, VR128:$src)>, Requires<[HasSSE2]>;
1951def : Pat<(v8i16 (vector_shuffle VR128:$src, (undef),
1952 UNPCKL_v_undef_shuffle_mask)),
1953 (PUNPCKLWDrr VR128:$src, VR128:$src)>, Requires<[HasSSE2]>;
1954def : Pat<(v4i32 (vector_shuffle VR128:$src, (undef),
1955 UNPCKL_v_undef_shuffle_mask)),
1956 (PUNPCKLDQrr VR128:$src, VR128:$src)>, Requires<[HasSSE1]>;
1957
Evan Chengff65e382006-04-04 21:49:39 +00001958// 128-bit logical shifts
1959def : Pat<(int_x86_sse2_psll_dq VR128:$src1, imm:$src2),
Evan Cheng2c3ae372006-04-12 21:21:57 +00001960 (v2i64 (PSLLDQri VR128:$src1, (PSxLDQ_imm imm:$src2)))>,
1961 Requires<[HasSSE2]>;
Evan Chengff65e382006-04-04 21:49:39 +00001962def : Pat<(int_x86_sse2_psrl_dq VR128:$src1, imm:$src2),
Evan Cheng2c3ae372006-04-12 21:21:57 +00001963 (v2i64 (PSRLDQri VR128:$src1, (PSxLDQ_imm imm:$src2)))>,
1964 Requires<[HasSSE2]>;
Evan Chengff65e382006-04-04 21:49:39 +00001965
Evan Cheng2c3ae372006-04-12 21:21:57 +00001966// Some special case pandn patterns.
1967def : Pat<(v2i64 (and (xor VR128:$src1, (bc_v2i64 (v4i32 immAllOnesV))),
1968 VR128:$src2)),
1969 (PANDNrr VR128:$src1, VR128:$src2)>, Requires<[HasSSE2]>;
1970def : Pat<(v2i64 (and (xor VR128:$src1, (bc_v2i64 (v8i16 immAllOnesV))),
1971 VR128:$src2)),
1972 (PANDNrr VR128:$src1, VR128:$src2)>, Requires<[HasSSE2]>;
1973def : Pat<(v2i64 (and (xor VR128:$src1, (bc_v2i64 (v16i8 immAllOnesV))),
1974 VR128:$src2)),
1975 (PANDNrr VR128:$src1, VR128:$src2)>, Requires<[HasSSE2]>;
Evan Cheng1b32f222006-03-30 07:33:32 +00001976
Evan Cheng2c3ae372006-04-12 21:21:57 +00001977def : Pat<(v2i64 (and (xor VR128:$src1, (bc_v2i64 (v4i32 immAllOnesV))),
1978 (load addr:$src2))),
1979 (PANDNrm VR128:$src1, addr:$src2)>, Requires<[HasSSE2]>;
1980def : Pat<(v2i64 (and (xor VR128:$src1, (bc_v2i64 (v8i16 immAllOnesV))),
1981 (load addr:$src2))),
1982 (PANDNrm VR128:$src1, addr:$src2)>, Requires<[HasSSE2]>;
1983def : Pat<(v2i64 (and (xor VR128:$src1, (bc_v2i64 (v16i8 immAllOnesV))),
1984 (load addr:$src2))),
1985 (PANDNrm VR128:$src1, addr:$src2)>, Requires<[HasSSE2]>;