blob: 5fc0004d51184009545197a94b0dec60b7225a83 [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]>;
22def X86fand : SDNode<"X86ISD::FAND", SDTFPBinOp,
23 [SDNPCommutative, SDNPAssociative]>;
24def X86fxor : SDNode<"X86ISD::FXOR", SDTFPBinOp,
25 [SDNPCommutative, SDNPAssociative]>;
Evan Chengbc4832b2006-03-24 23:15:12 +000026def X86s2vec : SDNode<"X86ISD::S2VEC",
Evan Chengb9df0ca2006-03-22 02:53:00 +000027 SDTypeProfile<1, 1, []>, []>;
Evan Chengbc4832b2006-03-24 23:15:12 +000028def X86zexts2vec : SDNode<"X86ISD::ZEXT_S2VEC",
29 SDTypeProfile<1, 1, []>, []>;
Evan Chengb067a1e2006-03-31 19:22:53 +000030def X86pextrw : SDNode<"X86ISD::PEXTRW",
31 SDTypeProfile<1, 2, []>, []>;
Evan Cheng653159f2006-03-31 21:55:24 +000032def X86pinsrw : SDNode<"X86ISD::PINSRW",
33 SDTypeProfile<1, 3, []>, []>;
Evan Chengc60bd972006-03-25 09:37:23 +000034
Evan Cheng2246f842006-03-18 01:23:20 +000035//===----------------------------------------------------------------------===//
Evan Cheng06a8aa12006-03-17 19:55:52 +000036// SSE pattern fragments
37//===----------------------------------------------------------------------===//
38
39def X86loadpf32 : PatFrag<(ops node:$ptr), (f32 (X86loadp node:$ptr))>;
40def X86loadpf64 : PatFrag<(ops node:$ptr), (f64 (X86loadp node:$ptr))>;
41
Evan Cheng2246f842006-03-18 01:23:20 +000042def loadv4f32 : PatFrag<(ops node:$ptr), (v4f32 (load node:$ptr))>;
43def loadv2f64 : PatFrag<(ops node:$ptr), (v2f64 (load node:$ptr))>;
Evan Cheng24dc1f52006-03-23 07:44:07 +000044def loadv16i8 : PatFrag<(ops node:$ptr), (v16i8 (load node:$ptr))>;
45def loadv8i16 : PatFrag<(ops node:$ptr), (v8i16 (load node:$ptr))>;
46def loadv4i32 : PatFrag<(ops node:$ptr), (v4i32 (load node:$ptr))>;
47def loadv2i64 : PatFrag<(ops node:$ptr), (v2i64 (load node:$ptr))>;
Evan Cheng06a8aa12006-03-17 19:55:52 +000048
Evan Cheng1b32f222006-03-30 07:33:32 +000049def bc_v4f32 : PatFrag<(ops node:$in), (v4f32 (bitconvert node:$in))>;
50def bc_v2f64 : PatFrag<(ops node:$in), (v2f64 (bitconvert node:$in))>;
Evan Cheng506d3df2006-03-29 23:07:14 +000051def bc_v16i8 : PatFrag<(ops node:$in), (v16i8 (bitconvert node:$in))>;
52def bc_v8i16 : PatFrag<(ops node:$in), (v8i16 (bitconvert node:$in))>;
Evan Cheng5aa97b22006-03-29 18:47:40 +000053def bc_v4i32 : PatFrag<(ops node:$in), (v4i32 (bitconvert node:$in))>;
54def bc_v2i64 : PatFrag<(ops node:$in), (v2i64 (bitconvert node:$in))>;
55
Evan Cheng386031a2006-03-24 07:29:27 +000056def fp32imm0 : PatLeaf<(f32 fpimm), [{
57 return N->isExactlyValue(+0.0);
58}]>;
59
Evan Cheng63d33002006-03-22 08:01:21 +000060// SHUFFLE_get_shuf_imm xform function: convert vector_shuffle mask to PSHUF*,
61// SHUFP* etc. imm.
62def SHUFFLE_get_shuf_imm : SDNodeXForm<build_vector, [{
63 return getI8Imm(X86::getShuffleSHUFImmediate(N));
Evan Chengb9df0ca2006-03-22 02:53:00 +000064}]>;
65
Evan Cheng506d3df2006-03-29 23:07:14 +000066// SHUFFLE_get_pshufhw_imm xform function: convert vector_shuffle mask to
67// PSHUFHW imm.
68def SHUFFLE_get_pshufhw_imm : SDNodeXForm<build_vector, [{
69 return getI8Imm(X86::getShufflePSHUFHWImmediate(N));
70}]>;
71
72// SHUFFLE_get_pshuflw_imm xform function: convert vector_shuffle mask to
73// PSHUFLW imm.
74def SHUFFLE_get_pshuflw_imm : SDNodeXForm<build_vector, [{
75 return getI8Imm(X86::getShufflePSHUFLWImmediate(N));
76}]>;
77
Evan Cheng691c9232006-03-29 19:02:40 +000078def SSE_splat_mask : PatLeaf<(build_vector), [{
Evan Cheng0188ecb2006-03-22 18:59:22 +000079 return X86::isSplatMask(N);
Evan Cheng691c9232006-03-29 19:02:40 +000080}], SHUFFLE_get_shuf_imm>;
Evan Cheng0188ecb2006-03-22 18:59:22 +000081
Evan Cheng2064a2b2006-03-28 06:50:32 +000082def MOVLHPS_shuffle_mask : PatLeaf<(build_vector), [{
83 return X86::isMOVLHPSMask(N);
84}]>;
85
Evan Cheng2c0dbd02006-03-24 02:58:06 +000086def MOVHLPS_shuffle_mask : PatLeaf<(build_vector), [{
87 return X86::isMOVHLPSMask(N);
Evan Cheng4fcb9222006-03-28 02:43:26 +000088}]>;
Evan Cheng2c0dbd02006-03-24 02:58:06 +000089
Evan Cheng0038e592006-03-28 00:39:58 +000090def UNPCKL_shuffle_mask : PatLeaf<(build_vector), [{
91 return X86::isUNPCKLMask(N);
92}]>;
93
Evan Cheng4fcb9222006-03-28 02:43:26 +000094def UNPCKH_shuffle_mask : PatLeaf<(build_vector), [{
95 return X86::isUNPCKHMask(N);
96}]>;
97
Evan Cheng0188ecb2006-03-22 18:59:22 +000098def PSHUFD_shuffle_mask : PatLeaf<(build_vector), [{
Evan Cheng4f563382006-03-29 01:30:51 +000099 return X86::isPSHUFDMask(N);
Evan Cheng14aed5e2006-03-24 01:18:28 +0000100}], SHUFFLE_get_shuf_imm>;
Evan Cheng0188ecb2006-03-22 18:59:22 +0000101
Evan Cheng506d3df2006-03-29 23:07:14 +0000102def PSHUFHW_shuffle_mask : PatLeaf<(build_vector), [{
103 return X86::isPSHUFHWMask(N);
104}], SHUFFLE_get_pshufhw_imm>;
105
106def PSHUFLW_shuffle_mask : PatLeaf<(build_vector), [{
107 return X86::isPSHUFLWMask(N);
108}], SHUFFLE_get_pshuflw_imm>;
109
Evan Cheng7d9061e2006-03-30 19:54:57 +0000110// Only use PSHUF* for v4f32 if SHUFP does not match.
111def PSHUFD_fp_shuffle_mask : PatLeaf<(build_vector), [{
112 return !X86::isSHUFPMask(N) &&
113 X86::isPSHUFDMask(N);
114}], SHUFFLE_get_shuf_imm>;
115
116def PSHUFHW_fp_shuffle_mask : PatLeaf<(build_vector), [{
117 return !X86::isSHUFPMask(N) &&
118 X86::isPSHUFHWMask(N);
119}], SHUFFLE_get_pshufhw_imm>;
120
121def PSHUFLW_fp_shuffle_mask : PatLeaf<(build_vector), [{
122 return !X86::isSHUFPMask(N) &&
123 X86::isPSHUFLWMask(N);
124}], SHUFFLE_get_pshuflw_imm>;
125
Evan Cheng14aed5e2006-03-24 01:18:28 +0000126def SHUFP_shuffle_mask : PatLeaf<(build_vector), [{
127 return X86::isSHUFPMask(N);
128}], SHUFFLE_get_shuf_imm>;
Evan Chengb9df0ca2006-03-22 02:53:00 +0000129
Evan Cheng7d9061e2006-03-30 19:54:57 +0000130// Only use SHUFP for v4i32 if PSHUF* do not match.
131def SHUFP_int_shuffle_mask : PatLeaf<(build_vector), [{
132 return !X86::isPSHUFDMask(N) &&
133 !X86::isPSHUFHWMask(N) &&
134 !X86::isPSHUFLWMask(N) &&
135 X86::isSHUFPMask(N);
Evan Cheng475aecf2006-03-29 03:04:49 +0000136}], SHUFFLE_get_shuf_imm>;
137
Evan Cheng06a8aa12006-03-17 19:55:52 +0000138//===----------------------------------------------------------------------===//
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000139// SSE scalar FP Instructions
140//===----------------------------------------------------------------------===//
141
Evan Cheng470a6ad2006-02-22 02:26:30 +0000142// Instruction templates
143// SSI - SSE1 instructions with XS prefix.
144// SDI - SSE2 instructions with XD prefix.
145// PSI - SSE1 instructions with TB prefix.
146// PDI - SSE2 instructions with TB and OpSize prefixes.
Evan Cheng2da953f2006-03-22 07:10:28 +0000147// PSIi8 - SSE1 instructions with ImmT == Imm8 and TB prefix.
148// PDIi8 - SSE2 instructions with ImmT == Imm8 and TB and OpSize prefixes.
Evan Cheng4b1734f2006-03-31 21:29:33 +0000149// S3SI - SSE3 instructions with XD prefix.
150// S3DI - SSE3 instructions with TB and OpSize prefixes.
Evan Cheng470a6ad2006-02-22 02:26:30 +0000151class SSI<bits<8> o, Format F, dag ops, string asm, list<dag> pattern>
152 : I<o, F, ops, asm, pattern>, XS, Requires<[HasSSE1]>;
153class SDI<bits<8> o, Format F, dag ops, string asm, list<dag> pattern>
154 : I<o, F, ops, asm, pattern>, XD, Requires<[HasSSE2]>;
155class PSI<bits<8> o, Format F, dag ops, string asm, list<dag> pattern>
156 : I<o, F, ops, asm, pattern>, TB, Requires<[HasSSE1]>;
157class PDI<bits<8> o, Format F, dag ops, string asm, list<dag> pattern>
158 : I<o, F, ops, asm, pattern>, TB, OpSize, Requires<[HasSSE2]>;
Evan Cheng2da953f2006-03-22 07:10:28 +0000159class PSIi8<bits<8> o, Format F, dag ops, string asm, list<dag> pattern>
160 : X86Inst<o, F, Imm8, ops, asm>, TB, Requires<[HasSSE1]> {
161 let Pattern = pattern;
162}
163class PDIi8<bits<8> o, Format F, dag ops, string asm, list<dag> pattern>
164 : X86Inst<o, F, Imm8, ops, asm>, TB, OpSize, Requires<[HasSSE2]> {
165 let Pattern = pattern;
166}
Evan Cheng4b1734f2006-03-31 21:29:33 +0000167class S3SI<bits<8> o, Format F, dag ops, string asm, list<dag> pattern>
168 : I<o, F, ops, asm, pattern>, XD, Requires<[HasSSE3]>;
169class S3DI<bits<8> o, Format F, dag ops, string asm, list<dag> pattern>
170 : I<o, F, ops, asm, pattern>, TB, OpSize, Requires<[HasSSE3]>;
171
172//===----------------------------------------------------------------------===//
173// Helpers for defining instructions that directly correspond to intrinsics.
174class S3S_Intrr<bits<8> o, string asm, Intrinsic IntId>
175 : S3SI<o, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2), asm,
176 [(set VR128:$dst, (v4f32 (IntId VR128:$src1, VR128:$src2)))]>;
177class S3S_Intrm<bits<8> o, string asm, Intrinsic IntId>
178 : S3SI<o, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2), asm,
179 [(set VR128:$dst, (v4f32 (IntId VR128:$src1,
180 (loadv4f32 addr:$src2))))]>;
181class S3D_Intrr<bits<8> o, string asm, Intrinsic IntId>
182 : S3DI<o, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2), asm,
183 [(set VR128:$dst, (v2f64 (IntId VR128:$src1, VR128:$src2)))]>;
184class S3D_Intrm<bits<8> o, string asm, Intrinsic IntId>
185 : S3DI<o, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2), asm,
186 [(set VR128:$dst, (v2f64 (IntId VR128:$src1,
187 (loadv2f64 addr:$src2))))]>;
Evan Cheng470a6ad2006-02-22 02:26:30 +0000188
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000189// Some 'special' instructions
190def IMPLICIT_DEF_FR32 : I<0, Pseudo, (ops FR32:$dst),
191 "#IMPLICIT_DEF $dst",
192 [(set FR32:$dst, (undef))]>, Requires<[HasSSE2]>;
193def IMPLICIT_DEF_FR64 : I<0, Pseudo, (ops FR64:$dst),
194 "#IMPLICIT_DEF $dst",
195 [(set FR64:$dst, (undef))]>, Requires<[HasSSE2]>;
196
197// CMOV* - Used to implement the SSE SELECT DAG operation. Expanded by the
198// scheduler into a branch sequence.
199let usesCustomDAGSchedInserter = 1 in { // Expanded by the scheduler.
200 def CMOV_FR32 : I<0, Pseudo,
201 (ops FR32:$dst, FR32:$t, FR32:$f, i8imm:$cond),
202 "#CMOV_FR32 PSEUDO!",
203 [(set FR32:$dst, (X86cmov FR32:$t, FR32:$f, imm:$cond))]>;
204 def CMOV_FR64 : I<0, Pseudo,
205 (ops FR64:$dst, FR64:$t, FR64:$f, i8imm:$cond),
206 "#CMOV_FR64 PSEUDO!",
207 [(set FR64:$dst, (X86cmov FR64:$t, FR64:$f, imm:$cond))]>;
208}
209
210// Move Instructions
Evan Cheng470a6ad2006-02-22 02:26:30 +0000211def MOVSSrr : SSI<0x10, MRMSrcReg, (ops FR32:$dst, FR32:$src),
212 "movss {$src, $dst|$dst, $src}", []>;
213def MOVSSrm : SSI<0x10, MRMSrcMem, (ops FR32:$dst, f32mem:$src),
214 "movss {$src, $dst|$dst, $src}",
215 [(set FR32:$dst, (loadf32 addr:$src))]>;
216def MOVSDrr : SDI<0x10, MRMSrcReg, (ops FR64:$dst, FR64:$src),
217 "movsd {$src, $dst|$dst, $src}", []>;
218def MOVSDrm : SDI<0x10, MRMSrcMem, (ops FR64:$dst, f64mem:$src),
219 "movsd {$src, $dst|$dst, $src}",
220 [(set FR64:$dst, (loadf64 addr:$src))]>;
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000221
Evan Cheng470a6ad2006-02-22 02:26:30 +0000222def MOVSSmr : SSI<0x11, MRMDestMem, (ops f32mem:$dst, FR32:$src),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000223 "movss {$src, $dst|$dst, $src}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000224 [(store FR32:$src, addr:$dst)]>;
225def MOVSDmr : SDI<0x11, MRMDestMem, (ops f64mem:$dst, FR64:$src),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000226 "movsd {$src, $dst|$dst, $src}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000227 [(store FR64:$src, addr:$dst)]>;
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000228
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000229// Arithmetic instructions
230let isTwoAddress = 1 in {
231let isCommutable = 1 in {
Evan Cheng470a6ad2006-02-22 02:26:30 +0000232def ADDSSrr : SSI<0x58, MRMSrcReg, (ops FR32:$dst, FR32:$src1, FR32:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000233 "addss {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000234 [(set FR32:$dst, (fadd FR32:$src1, FR32:$src2))]>;
235def ADDSDrr : SDI<0x58, MRMSrcReg, (ops FR64:$dst, FR64:$src1, FR64:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000236 "addsd {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000237 [(set FR64:$dst, (fadd FR64:$src1, FR64:$src2))]>;
238def MULSSrr : SSI<0x59, MRMSrcReg, (ops FR32:$dst, FR32:$src1, FR32:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000239 "mulss {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000240 [(set FR32:$dst, (fmul FR32:$src1, FR32:$src2))]>;
241def MULSDrr : SDI<0x59, MRMSrcReg, (ops FR64:$dst, FR64:$src1, FR64:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000242 "mulsd {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000243 [(set FR64:$dst, (fmul FR64:$src1, FR64:$src2))]>;
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000244}
245
Evan Cheng470a6ad2006-02-22 02:26:30 +0000246def ADDSSrm : SSI<0x58, MRMSrcMem, (ops FR32:$dst, FR32:$src1, f32mem:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000247 "addss {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000248 [(set FR32:$dst, (fadd FR32:$src1, (loadf32 addr:$src2)))]>;
249def ADDSDrm : SDI<0x58, MRMSrcMem, (ops FR64:$dst, FR64:$src1, f64mem:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000250 "addsd {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000251 [(set FR64:$dst, (fadd FR64:$src1, (loadf64 addr:$src2)))]>;
252def MULSSrm : SSI<0x59, MRMSrcMem, (ops FR32:$dst, FR32:$src1, f32mem:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000253 "mulss {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000254 [(set FR32:$dst, (fmul FR32:$src1, (loadf32 addr:$src2)))]>;
255def MULSDrm : SDI<0x59, MRMSrcMem, (ops FR64:$dst, FR64:$src1, f64mem:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000256 "mulsd {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000257 [(set FR64:$dst, (fmul FR64:$src1, (loadf64 addr:$src2)))]>;
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000258
Evan Cheng470a6ad2006-02-22 02:26:30 +0000259def DIVSSrr : SSI<0x5E, MRMSrcReg, (ops FR32:$dst, FR32:$src1, FR32:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000260 "divss {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000261 [(set FR32:$dst, (fdiv FR32:$src1, FR32:$src2))]>;
262def DIVSSrm : SSI<0x5E, MRMSrcMem, (ops FR32:$dst, FR32:$src1, f32mem:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000263 "divss {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000264 [(set FR32:$dst, (fdiv FR32:$src1, (loadf32 addr:$src2)))]>;
265def DIVSDrr : SDI<0x5E, MRMSrcReg, (ops FR64:$dst, FR64:$src1, FR64:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000266 "divsd {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000267 [(set FR64:$dst, (fdiv FR64:$src1, FR64:$src2))]>;
268def DIVSDrm : SDI<0x5E, MRMSrcMem, (ops FR64:$dst, FR64:$src1, f64mem:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000269 "divsd {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000270 [(set FR64:$dst, (fdiv FR64:$src1, (loadf64 addr:$src2)))]>;
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000271
Evan Cheng470a6ad2006-02-22 02:26:30 +0000272def SUBSSrr : SSI<0x5C, MRMSrcReg, (ops FR32:$dst, FR32:$src1, FR32:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000273 "subss {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000274 [(set FR32:$dst, (fsub FR32:$src1, FR32:$src2))]>;
275def SUBSSrm : SSI<0x5C, MRMSrcMem, (ops FR32:$dst, FR32:$src1, f32mem:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000276 "subss {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000277 [(set FR32:$dst, (fsub FR32:$src1, (loadf32 addr:$src2)))]>;
278def SUBSDrr : SDI<0x5C, MRMSrcReg, (ops FR64:$dst, FR64:$src1, FR64:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000279 "subsd {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000280 [(set FR64:$dst, (fsub FR64:$src1, FR64:$src2))]>;
281def SUBSDrm : SDI<0x5C, MRMSrcMem, (ops FR64:$dst, FR64:$src1, f64mem:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000282 "subsd {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000283 [(set FR64:$dst, (fsub FR64:$src1, (loadf64 addr:$src2)))]>;
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000284}
285
Evan Cheng470a6ad2006-02-22 02:26:30 +0000286def SQRTSSrr : SSI<0x51, MRMSrcReg, (ops FR32:$dst, FR32:$src),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000287 "sqrtss {$src, $dst|$dst, $src}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000288 [(set FR32:$dst, (fsqrt FR32:$src))]>;
289def SQRTSSrm : SSI<0x51, MRMSrcMem, (ops FR32:$dst, f32mem:$src),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000290 "sqrtss {$src, $dst|$dst, $src}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000291 [(set FR32:$dst, (fsqrt (loadf32 addr:$src)))]>;
292def SQRTSDrr : SDI<0x51, MRMSrcReg, (ops FR64:$dst, FR64:$src),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000293 "sqrtsd {$src, $dst|$dst, $src}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000294 [(set FR64:$dst, (fsqrt FR64:$src))]>;
295def SQRTSDrm : SDI<0x51, MRMSrcMem, (ops FR64:$dst, f64mem:$src),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000296 "sqrtsd {$src, $dst|$dst, $src}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000297 [(set FR64:$dst, (fsqrt (loadf64 addr:$src)))]>;
298
299def RSQRTSSrr : SSI<0x52, MRMSrcReg, (ops FR32:$dst, FR32:$src),
300 "rsqrtss {$src, $dst|$dst, $src}", []>;
301def RSQRTSSrm : SSI<0x52, MRMSrcMem, (ops FR32:$dst, f32mem:$src),
302 "rsqrtss {$src, $dst|$dst, $src}", []>;
303def RCPSSrr : SSI<0x53, MRMSrcReg, (ops FR32:$dst, FR32:$src),
304 "rcpss {$src, $dst|$dst, $src}", []>;
305def RCPSSrm : SSI<0x53, MRMSrcMem, (ops FR32:$dst, f32mem:$src),
306 "rcpss {$src, $dst|$dst, $src}", []>;
307
308def MAXSSrr : SSI<0x5F, MRMSrcReg, (ops FR32:$dst, FR32:$src),
309 "maxss {$src, $dst|$dst, $src}", []>;
310def MAXSSrm : SSI<0x5F, MRMSrcMem, (ops FR32:$dst, f32mem:$src),
311 "maxss {$src, $dst|$dst, $src}", []>;
312def MAXSDrr : SDI<0x5F, MRMSrcReg, (ops FR64:$dst, FR64:$src),
313 "maxsd {$src, $dst|$dst, $src}", []>;
314def MAXSDrm : SDI<0x5F, MRMSrcMem, (ops FR64:$dst, f64mem:$src),
315 "maxsd {$src, $dst|$dst, $src}", []>;
316def MINSSrr : SSI<0x5D, MRMSrcReg, (ops FR32:$dst, FR32:$src),
317 "minss {$src, $dst|$dst, $src}", []>;
318def MINSSrm : SSI<0x5D, MRMSrcMem, (ops FR32:$dst, f32mem:$src),
319 "minss {$src, $dst|$dst, $src}", []>;
320def MINSDrr : SDI<0x5D, MRMSrcReg, (ops FR64:$dst, FR64:$src),
321 "minsd {$src, $dst|$dst, $src}", []>;
322def MINSDrm : SDI<0x5D, MRMSrcMem, (ops FR64:$dst, f64mem:$src),
323 "minsd {$src, $dst|$dst, $src}", []>;
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000324
Evan Chengc46349d2006-03-28 23:51:43 +0000325
326// Aliases to match intrinsics which expect XMM operand(s).
327let isTwoAddress = 1 in {
328let isCommutable = 1 in {
329def Int_ADDSSrr : SSI<0x58, MRMSrcReg, (ops VR128:$dst, VR128:$src1,
330 VR128:$src2),
331 "addss {$src2, $dst|$dst, $src2}",
332 [(set VR128:$dst, (int_x86_sse_add_ss VR128:$src1,
333 VR128:$src2))]>;
334def Int_ADDSDrr : SDI<0x58, MRMSrcReg, (ops VR128:$dst, VR128:$src1,
335 VR128:$src2),
336 "addsd {$src2, $dst|$dst, $src2}",
337 [(set VR128:$dst, (int_x86_sse2_add_sd VR128:$src1,
338 VR128:$src2))]>;
339def Int_MULSSrr : SSI<0x59, MRMSrcReg, (ops VR128:$dst, VR128:$src1,
340 VR128:$src2),
341 "mulss {$src2, $dst|$dst, $src2}",
342 [(set VR128:$dst, (int_x86_sse_mul_ss VR128:$src1,
343 VR128:$src2))]>;
344def Int_MULSDrr : SDI<0x59, MRMSrcReg, (ops VR128:$dst, VR128:$src1,
345 VR128:$src2),
346 "mulsd {$src2, $dst|$dst, $src2}",
347 [(set VR128:$dst, (int_x86_sse2_mul_sd VR128:$src1,
348 VR128:$src2))]>;
349}
350
351def Int_ADDSSrm : SSI<0x58, MRMSrcMem, (ops VR128:$dst, VR128:$src1,
352 f32mem:$src2),
353 "addss {$src2, $dst|$dst, $src2}",
354 [(set VR128:$dst, (int_x86_sse_add_ss VR128:$src1,
355 (load addr:$src2)))]>;
356def Int_ADDSDrm : SDI<0x58, MRMSrcMem, (ops VR128:$dst, VR128:$src1,
357 f64mem:$src2),
358 "addsd {$src2, $dst|$dst, $src2}",
359 [(set VR128:$dst, (int_x86_sse2_add_sd VR128:$src1,
360 (load addr:$src2)))]>;
361def Int_MULSSrm : SSI<0x59, MRMSrcMem, (ops VR128:$dst, VR128:$src1,
362 f32mem:$src2),
363 "mulss {$src2, $dst|$dst, $src2}",
364 [(set VR128:$dst, (int_x86_sse_mul_ss VR128:$src1,
365 (load addr:$src2)))]>;
366def Int_MULSDrm : SDI<0x59, MRMSrcMem, (ops VR128:$dst, VR128:$src1,
367 f64mem:$src2),
368 "mulsd {$src2, $dst|$dst, $src2}",
369 [(set VR128:$dst, (int_x86_sse2_mul_sd VR128:$src1,
370 (load addr:$src2)))]>;
371
372def Int_DIVSSrr : SSI<0x5E, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
373 "divss {$src2, $dst|$dst, $src2}",
374 [(set VR128:$dst, (int_x86_sse_div_ss VR128:$src1,
375 VR128:$src2))]>;
376def Int_DIVSSrm : SSI<0x5E, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f32mem:$src2),
377 "divss {$src2, $dst|$dst, $src2}",
378 [(set VR128:$dst, (int_x86_sse_div_ss VR128:$src1,
379 (load addr:$src2)))]>;
380def Int_DIVSDrr : SDI<0x5E, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
381 "divsd {$src2, $dst|$dst, $src2}",
382 [(set VR128:$dst, (int_x86_sse2_div_sd VR128:$src1,
383 VR128:$src2))]>;
384def Int_DIVSDrm : SDI<0x5E, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f64mem:$src2),
385 "divsd {$src2, $dst|$dst, $src2}",
386 [(set VR128:$dst, (int_x86_sse2_div_sd VR128:$src1,
387 (load addr:$src2)))]>;
388
389def Int_SUBSSrr : SSI<0x5C, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
390 "subss {$src2, $dst|$dst, $src2}",
391 [(set VR128:$dst, (int_x86_sse_sub_ss VR128:$src1,
392 VR128:$src2))]>;
393def Int_SUBSSrm : SSI<0x5C, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f32mem:$src2),
394 "subss {$src2, $dst|$dst, $src2}",
395 [(set VR128:$dst, (int_x86_sse_sub_ss VR128:$src1,
396 (load addr:$src2)))]>;
397def Int_SUBSDrr : SDI<0x5C, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
398 "subsd {$src2, $dst|$dst, $src2}",
399 [(set VR128:$dst, (int_x86_sse2_sub_sd VR128:$src1,
400 VR128:$src2))]>;
401def Int_SUBSDrm : SDI<0x5C, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f64mem:$src2),
402 "subsd {$src2, $dst|$dst, $src2}",
403 [(set VR128:$dst, (int_x86_sse2_sub_sd VR128:$src1,
404 (load addr:$src2)))]>;
405}
406
407def Int_SQRTSSrr : SSI<0x51, MRMSrcReg, (ops VR128:$dst, VR128:$src),
408 "sqrtss {$src, $dst|$dst, $src}",
409 [(set VR128:$dst, (int_x86_sse_sqrt_ss VR128:$src))]>;
410def Int_SQRTSSrm : SSI<0x51, MRMSrcMem, (ops VR128:$dst, f32mem:$src),
411 "sqrtss {$src, $dst|$dst, $src}",
412 [(set VR128:$dst, (int_x86_sse_sqrt_ss
413 (load addr:$src)))]>;
414def Int_SQRTSDrr : SDI<0x51, MRMSrcReg, (ops VR128:$dst, VR128:$src),
415 "sqrtsd {$src, $dst|$dst, $src}",
416 [(set VR128:$dst, (int_x86_sse2_sqrt_sd VR128:$src))]>;
417def Int_SQRTSDrm : SDI<0x51, MRMSrcMem, (ops VR128:$dst, f64mem:$src),
418 "sqrtsd {$src, $dst|$dst, $src}",
419 [(set VR128:$dst, (int_x86_sse2_sqrt_sd
420 (load addr:$src)))]>;
421
422def Int_RSQRTSSrr : SSI<0x52, MRMSrcReg, (ops VR128:$dst, VR128:$src),
423 "rsqrtss {$src, $dst|$dst, $src}",
424 [(set VR128:$dst, (int_x86_sse_rsqrt_ss VR128:$src))]>;
425def Int_RSQRTSSrm : SSI<0x52, MRMSrcMem, (ops VR128:$dst, f32mem:$src),
426 "rsqrtss {$src, $dst|$dst, $src}",
427 [(set VR128:$dst, (int_x86_sse_rsqrt_ss
428 (load addr:$src)))]>;
429def Int_RCPSSrr : SSI<0x53, MRMSrcReg, (ops VR128:$dst, VR128:$src),
430 "rcpss {$src, $dst|$dst, $src}",
431 [(set VR128:$dst, (int_x86_sse_rcp_ss VR128:$src))]>;
432def Int_RCPSSrm : SSI<0x53, MRMSrcMem, (ops VR128:$dst, f32mem:$src),
433 "rcpss {$src, $dst|$dst, $src}",
434 [(set VR128:$dst, (int_x86_sse_rcp_ss
435 (load addr:$src)))]>;
436
437let isTwoAddress = 1 in {
438def Int_MAXSSrr : SSI<0x5F, MRMSrcReg, (ops VR128:$dst, VR128:$src1,
439 VR128:$src2),
440 "maxss {$src2, $dst|$dst, $src2}",
441 [(set VR128:$dst, (int_x86_sse_max_ss VR128:$src1,
442 VR128:$src2))]>;
443def Int_MAXSSrm : SSI<0x5F, MRMSrcMem, (ops VR128:$dst, VR128:$src1,
444 f32mem:$src2),
445 "maxss {$src2, $dst|$dst, $src2}",
446 [(set VR128:$dst, (int_x86_sse_max_ss VR128:$src1,
447 (load addr:$src2)))]>;
448def Int_MAXSDrr : SDI<0x5F, MRMSrcReg, (ops VR128:$dst, VR128:$src1,
449 VR128:$src2),
450 "maxsd {$src2, $dst|$dst, $src2}",
451 [(set VR128:$dst, (int_x86_sse2_max_sd VR128:$src1,
452 VR128:$src2))]>;
453def Int_MAXSDrm : SDI<0x5F, MRMSrcMem, (ops VR128:$dst, VR128:$src1,
454 f64mem:$src2),
455 "maxsd {$src2, $dst|$dst, $src2}",
456 [(set VR128:$dst, (int_x86_sse2_max_sd VR128:$src1,
457 (load addr:$src2)))]>;
458def Int_MINSSrr : SSI<0x5D, MRMSrcReg, (ops VR128:$dst, VR128:$src1,
459 VR128:$src2),
460 "minss {$src2, $dst|$dst, $src2}",
461 [(set VR128:$dst, (int_x86_sse_min_ss VR128:$src1,
462 VR128:$src2))]>;
463def Int_MINSSrm : SSI<0x5D, MRMSrcMem, (ops VR128:$dst, VR128:$src1,
464 f32mem:$src2),
465 "minss {$src2, $dst|$dst, $src2}",
466 [(set VR128:$dst, (int_x86_sse_min_ss VR128:$src1,
467 (load addr:$src2)))]>;
468def Int_MINSDrr : SDI<0x5D, MRMSrcReg, (ops VR128:$dst, VR128:$src1,
469 VR128:$src2),
470 "minsd {$src2, $dst|$dst, $src2}",
471 [(set VR128:$dst, (int_x86_sse2_min_sd VR128:$src1,
472 VR128:$src2))]>;
473def Int_MINSDrm : SDI<0x5D, MRMSrcMem, (ops VR128:$dst, VR128:$src1,
474 f64mem:$src2),
475 "minsd {$src2, $dst|$dst, $src2}",
476 [(set VR128:$dst, (int_x86_sse2_min_sd VR128:$src1,
477 (load addr:$src2)))]>;
478}
479
480// Conversion instructions
481def CVTSS2SIrr: SSI<0x2D, MRMSrcReg, (ops R32:$dst, FR32:$src),
482 "cvtss2si {$src, $dst|$dst, $src}", []>;
483def CVTSS2SIrm: SSI<0x2D, MRMSrcMem, (ops R32:$dst, f32mem:$src),
484 "cvtss2si {$src, $dst|$dst, $src}", []>;
485
486def CVTTSS2SIrr: SSI<0x2C, MRMSrcReg, (ops R32:$dst, FR32:$src),
487 "cvttss2si {$src, $dst|$dst, $src}",
488 [(set R32:$dst, (fp_to_sint FR32:$src))]>;
489def CVTTSS2SIrm: SSI<0x2C, MRMSrcMem, (ops R32:$dst, f32mem:$src),
490 "cvttss2si {$src, $dst|$dst, $src}",
491 [(set R32:$dst, (fp_to_sint (loadf32 addr:$src)))]>;
492def CVTTSD2SIrr: SDI<0x2C, MRMSrcReg, (ops R32:$dst, FR64:$src),
493 "cvttsd2si {$src, $dst|$dst, $src}",
494 [(set R32:$dst, (fp_to_sint FR64:$src))]>;
495def CVTTSD2SIrm: SDI<0x2C, MRMSrcMem, (ops R32:$dst, f64mem:$src),
496 "cvttsd2si {$src, $dst|$dst, $src}",
497 [(set R32:$dst, (fp_to_sint (loadf64 addr:$src)))]>;
498def CVTSD2SSrr: SDI<0x5A, MRMSrcReg, (ops FR32:$dst, FR64:$src),
499 "cvtsd2ss {$src, $dst|$dst, $src}",
500 [(set FR32:$dst, (fround FR64:$src))]>;
501def CVTSD2SSrm: SDI<0x5A, MRMSrcMem, (ops FR32:$dst, f64mem:$src),
502 "cvtsd2ss {$src, $dst|$dst, $src}",
503 [(set FR32:$dst, (fround (loadf64 addr:$src)))]>;
504def CVTSI2SSrr: SSI<0x2A, MRMSrcReg, (ops FR32:$dst, R32:$src),
505 "cvtsi2ss {$src, $dst|$dst, $src}",
506 [(set FR32:$dst, (sint_to_fp R32:$src))]>;
507def CVTSI2SSrm: SSI<0x2A, MRMSrcMem, (ops FR32:$dst, i32mem:$src),
508 "cvtsi2ss {$src, $dst|$dst, $src}",
509 [(set FR32:$dst, (sint_to_fp (loadi32 addr:$src)))]>;
510def CVTSI2SDrr: SDI<0x2A, MRMSrcReg, (ops FR64:$dst, R32:$src),
511 "cvtsi2sd {$src, $dst|$dst, $src}",
512 [(set FR64:$dst, (sint_to_fp R32:$src))]>;
513def CVTSI2SDrm: SDI<0x2A, MRMSrcMem, (ops FR64:$dst, i32mem:$src),
514 "cvtsi2sd {$src, $dst|$dst, $src}",
515 [(set FR64:$dst, (sint_to_fp (loadi32 addr:$src)))]>;
516// SSE2 instructions with XS prefix
517def CVTSS2SDrr: I<0x5A, MRMSrcReg, (ops FR64:$dst, FR32:$src),
518 "cvtss2sd {$src, $dst|$dst, $src}",
519 [(set FR64:$dst, (fextend FR32:$src))]>, XS,
520 Requires<[HasSSE2]>;
521def CVTSS2SDrm: I<0x5A, MRMSrcMem, (ops FR64:$dst, f32mem:$src),
522 "cvtss2sd {$src, $dst|$dst, $src}",
523 [(set FR64:$dst, (fextend (loadf32 addr:$src)))]>, XS,
524 Requires<[HasSSE2]>;
525
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000526// Comparison instructions
527let isTwoAddress = 1 in {
Evan Cheng470a6ad2006-02-22 02:26:30 +0000528def CMPSSrr : SSI<0xC2, MRMSrcReg,
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000529 (ops FR32:$dst, FR32:$src1, FR32:$src, SSECC:$cc),
Evan Cheng0876aa52006-03-30 06:21:22 +0000530 "cmp${cc}ss {$src, $dst|$dst, $src}",
531 []>;
Evan Cheng470a6ad2006-02-22 02:26:30 +0000532def CMPSSrm : SSI<0xC2, MRMSrcMem,
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000533 (ops FR32:$dst, FR32:$src1, f32mem:$src, SSECC:$cc),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000534 "cmp${cc}ss {$src, $dst|$dst, $src}", []>;
535def CMPSDrr : SDI<0xC2, MRMSrcReg,
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000536 (ops FR64:$dst, FR64:$src1, FR64:$src, SSECC:$cc),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000537 "cmp${cc}sd {$src, $dst|$dst, $src}", []>;
538def CMPSDrm : SDI<0xC2, MRMSrcMem,
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000539 (ops FR64:$dst, FR64:$src1, f64mem:$src, SSECC:$cc),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000540 "cmp${cc}sd {$src, $dst|$dst, $src}", []>;
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000541}
542
Evan Cheng470a6ad2006-02-22 02:26:30 +0000543def UCOMISSrr: PSI<0x2E, MRMSrcReg, (ops FR32:$src1, FR32:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000544 "ucomiss {$src2, $src1|$src1, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000545 [(X86cmp FR32:$src1, FR32:$src2)]>;
546def UCOMISSrm: PSI<0x2E, MRMSrcMem, (ops FR32:$src1, f32mem:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000547 "ucomiss {$src2, $src1|$src1, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000548 [(X86cmp FR32:$src1, (loadf32 addr:$src2))]>;
549def UCOMISDrr: PDI<0x2E, MRMSrcReg, (ops FR64:$src1, FR64:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000550 "ucomisd {$src2, $src1|$src1, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000551 [(X86cmp FR64:$src1, FR64:$src2)]>;
552def UCOMISDrm: PDI<0x2E, MRMSrcMem, (ops FR64:$src1, f64mem:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000553 "ucomisd {$src2, $src1|$src1, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000554 [(X86cmp FR64:$src1, (loadf64 addr:$src2))]>;
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000555
Evan Cheng0876aa52006-03-30 06:21:22 +0000556// Aliases to match intrinsics which expect XMM operand(s).
557let isTwoAddress = 1 in {
558def Int_CMPSSrr : SSI<0xC2, MRMSrcReg,
559 (ops VR128:$dst, VR128:$src1, VR128:$src, SSECC:$cc),
560 "cmp${cc}ss {$src, $dst|$dst, $src}",
561 [(set VR128:$dst, (int_x86_sse_cmp_ss VR128:$src1,
562 VR128:$src, imm:$cc))]>;
563def Int_CMPSSrm : SSI<0xC2, MRMSrcMem,
564 (ops VR128:$dst, VR128:$src1, f32mem:$src, SSECC:$cc),
565 "cmp${cc}ss {$src, $dst|$dst, $src}",
566 [(set VR128:$dst, (int_x86_sse_cmp_ss VR128:$src1,
567 (load addr:$src), imm:$cc))]>;
568def Int_CMPSDrr : SDI<0xC2, MRMSrcReg,
569 (ops VR128:$dst, VR128:$src1, VR128:$src, SSECC:$cc),
570 "cmp${cc}sd {$src, $dst|$dst, $src}", []>;
571def Int_CMPSDrm : SDI<0xC2, MRMSrcMem,
572 (ops VR128:$dst, VR128:$src1, f64mem:$src, SSECC:$cc),
573 "cmp${cc}sd {$src, $dst|$dst, $src}", []>;
574}
575
576
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000577// Aliases of packed instructions for scalar use. These all have names that
578// start with 'Fs'.
579
580// Alias instructions that map fld0 to pxor for sse.
581// FIXME: remove when we can teach regalloc that xor reg, reg is ok.
582def FsFLD0SS : I<0xEF, MRMInitReg, (ops FR32:$dst),
583 "pxor $dst, $dst", [(set FR32:$dst, fp32imm0)]>,
584 Requires<[HasSSE1]>, TB, OpSize;
585def FsFLD0SD : I<0xEF, MRMInitReg, (ops FR64:$dst),
586 "pxor $dst, $dst", [(set FR64:$dst, fp64imm0)]>,
587 Requires<[HasSSE2]>, TB, OpSize;
588
589// Alias instructions to do FR32 / FR64 reg-to-reg copy using movaps / movapd.
590// Upper bits are disregarded.
Evan Cheng470a6ad2006-02-22 02:26:30 +0000591def FsMOVAPSrr : PSI<0x28, MRMSrcReg, (ops FR32:$dst, FR32:$src),
592 "movaps {$src, $dst|$dst, $src}", []>;
593def FsMOVAPDrr : PDI<0x28, MRMSrcReg, (ops FR64:$dst, FR64:$src),
594 "movapd {$src, $dst|$dst, $src}", []>;
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000595
596// Alias instructions to load FR32 / FR64 from f128mem using movaps / movapd.
597// Upper bits are disregarded.
Evan Cheng470a6ad2006-02-22 02:26:30 +0000598def FsMOVAPSrm : PSI<0x28, MRMSrcMem, (ops FR32:$dst, f128mem:$src),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000599 "movaps {$src, $dst|$dst, $src}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000600 [(set FR32:$dst, (X86loadpf32 addr:$src))]>;
601def FsMOVAPDrm : PDI<0x28, MRMSrcMem, (ops FR64:$dst, f128mem:$src),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000602 "movapd {$src, $dst|$dst, $src}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000603 [(set FR64:$dst, (X86loadpf64 addr:$src))]>;
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000604
605// Alias bitwise logical operations using SSE logical ops on packed FP values.
606let isTwoAddress = 1 in {
607let isCommutable = 1 in {
Evan Cheng470a6ad2006-02-22 02:26:30 +0000608def FsANDPSrr : PSI<0x54, MRMSrcReg, (ops FR32:$dst, FR32:$src1, FR32:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000609 "andps {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000610 [(set FR32:$dst, (X86fand FR32:$src1, FR32:$src2))]>;
611def FsANDPDrr : PDI<0x54, MRMSrcReg, (ops FR64:$dst, FR64:$src1, FR64:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000612 "andpd {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000613 [(set FR64:$dst, (X86fand FR64:$src1, FR64:$src2))]>;
614def FsORPSrr : PSI<0x56, MRMSrcReg, (ops FR32:$dst, FR32:$src1, FR32:$src2),
615 "orps {$src2, $dst|$dst, $src2}", []>;
616def FsORPDrr : PDI<0x56, MRMSrcReg, (ops FR64:$dst, FR64:$src1, FR64:$src2),
617 "orpd {$src2, $dst|$dst, $src2}", []>;
618def FsXORPSrr : PSI<0x57, MRMSrcReg, (ops FR32:$dst, FR32:$src1, FR32:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000619 "xorps {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000620 [(set FR32:$dst, (X86fxor FR32:$src1, FR32:$src2))]>;
621def FsXORPDrr : PDI<0x57, MRMSrcReg, (ops FR64:$dst, FR64:$src1, FR64:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000622 "xorpd {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000623 [(set FR64:$dst, (X86fxor FR64:$src1, FR64:$src2))]>;
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000624}
Evan Cheng470a6ad2006-02-22 02:26:30 +0000625def FsANDPSrm : PSI<0x54, MRMSrcMem, (ops FR32:$dst, FR32:$src1, f128mem:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000626 "andps {$src2, $dst|$dst, $src2}",
627 [(set FR32:$dst, (X86fand FR32:$src1,
Evan Cheng470a6ad2006-02-22 02:26:30 +0000628 (X86loadpf32 addr:$src2)))]>;
629def FsANDPDrm : PDI<0x54, MRMSrcMem, (ops FR64:$dst, FR64:$src1, f128mem:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000630 "andpd {$src2, $dst|$dst, $src2}",
631 [(set FR64:$dst, (X86fand FR64:$src1,
Evan Cheng470a6ad2006-02-22 02:26:30 +0000632 (X86loadpf64 addr:$src2)))]>;
633def FsORPSrm : PSI<0x56, MRMSrcMem, (ops FR32:$dst, FR32:$src1, f128mem:$src2),
634 "orps {$src2, $dst|$dst, $src2}", []>;
635def FsORPDrm : PDI<0x56, MRMSrcMem, (ops FR64:$dst, FR64:$src1, f128mem:$src2),
636 "orpd {$src2, $dst|$dst, $src2}", []>;
637def FsXORPSrm : PSI<0x57, MRMSrcMem, (ops FR32:$dst, FR32:$src1, f128mem:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000638 "xorps {$src2, $dst|$dst, $src2}",
639 [(set FR32:$dst, (X86fxor FR32:$src1,
Evan Cheng470a6ad2006-02-22 02:26:30 +0000640 (X86loadpf32 addr:$src2)))]>;
641def FsXORPDrm : PDI<0x57, MRMSrcMem, (ops FR64:$dst, FR64:$src1, f128mem:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000642 "xorpd {$src2, $dst|$dst, $src2}",
643 [(set FR64:$dst, (X86fxor FR64:$src1,
Evan Cheng470a6ad2006-02-22 02:26:30 +0000644 (X86loadpf64 addr:$src2)))]>;
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000645
Evan Cheng470a6ad2006-02-22 02:26:30 +0000646def FsANDNPSrr : PSI<0x55, MRMSrcReg, (ops FR32:$dst, FR32:$src1, FR32:$src2),
647 "andnps {$src2, $dst|$dst, $src2}", []>;
648def FsANDNPSrm : PSI<0x55, MRMSrcMem, (ops FR32:$dst, FR32:$src1, f128mem:$src2),
649 "andnps {$src2, $dst|$dst, $src2}", []>;
650def FsANDNPDrr : PDI<0x55, MRMSrcReg, (ops FR64:$dst, FR64:$src1, FR64:$src2),
651 "andnpd {$src2, $dst|$dst, $src2}", []>;
652def FsANDNPDrm : PDI<0x55, MRMSrcMem, (ops FR64:$dst, FR64:$src1, f128mem:$src2),
653 "andnpd {$src2, $dst|$dst, $src2}", []>;
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000654}
655
656//===----------------------------------------------------------------------===//
657// SSE packed FP Instructions
658//===----------------------------------------------------------------------===//
659
Evan Chengc12e6c42006-03-19 09:38:54 +0000660// Some 'special' instructions
661def IMPLICIT_DEF_VR128 : I<0, Pseudo, (ops VR128:$dst),
662 "#IMPLICIT_DEF $dst",
663 [(set VR128:$dst, (v4f32 (undef)))]>,
664 Requires<[HasSSE1]>;
665
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000666// Move Instructions
Evan Cheng2246f842006-03-18 01:23:20 +0000667def MOVAPSrr : PSI<0x28, MRMSrcReg, (ops VR128:$dst, VR128:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000668 "movaps {$src, $dst|$dst, $src}", []>;
Evan Cheng2246f842006-03-18 01:23:20 +0000669def MOVAPSrm : PSI<0x28, MRMSrcMem, (ops VR128:$dst, f128mem:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000670 "movaps {$src, $dst|$dst, $src}",
Evan Cheng2246f842006-03-18 01:23:20 +0000671 [(set VR128:$dst, (loadv4f32 addr:$src))]>;
672def MOVAPDrr : PDI<0x28, MRMSrcReg, (ops VR128:$dst, VR128:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000673 "movapd {$src, $dst|$dst, $src}", []>;
Evan Cheng2246f842006-03-18 01:23:20 +0000674def MOVAPDrm : PDI<0x28, MRMSrcMem, (ops VR128:$dst, f128mem:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000675 "movapd {$src, $dst|$dst, $src}",
Evan Cheng2246f842006-03-18 01:23:20 +0000676 [(set VR128:$dst, (loadv2f64 addr:$src))]>;
Evan Chengffcb95b2006-02-21 19:13:53 +0000677
Evan Cheng2246f842006-03-18 01:23:20 +0000678def MOVAPSmr : PSI<0x29, MRMDestMem, (ops f128mem:$dst, VR128:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000679 "movaps {$src, $dst|$dst, $src}",
Evan Cheng2246f842006-03-18 01:23:20 +0000680 [(store (v4f32 VR128:$src), addr:$dst)]>;
681def MOVAPDmr : PDI<0x29, MRMDestMem, (ops f128mem:$dst, VR128:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000682 "movapd {$src, $dst|$dst, $src}",
Evan Cheng2246f842006-03-18 01:23:20 +0000683 [(store (v2f64 VR128:$src), addr:$dst)]>;
Evan Cheng470a6ad2006-02-22 02:26:30 +0000684
Evan Cheng2246f842006-03-18 01:23:20 +0000685def MOVUPSrr : PSI<0x10, MRMSrcReg, (ops VR128:$dst, VR128:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000686 "movups {$src, $dst|$dst, $src}", []>;
Evan Cheng2246f842006-03-18 01:23:20 +0000687def MOVUPSrm : PSI<0x10, MRMSrcMem, (ops VR128:$dst, f128mem:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000688 "movups {$src, $dst|$dst, $src}", []>;
Evan Cheng2246f842006-03-18 01:23:20 +0000689def MOVUPSmr : PSI<0x11, MRMDestMem, (ops f128mem:$dst, VR128:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000690 "movups {$src, $dst|$dst, $src}", []>;
Evan Cheng2246f842006-03-18 01:23:20 +0000691def MOVUPDrr : PDI<0x10, MRMSrcReg, (ops VR128:$dst, VR128:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000692 "movupd {$src, $dst|$dst, $src}", []>;
Evan Cheng2246f842006-03-18 01:23:20 +0000693def MOVUPDrm : PDI<0x10, MRMSrcMem, (ops VR128:$dst, f128mem:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000694 "movupd {$src, $dst|$dst, $src}", []>;
Evan Cheng2246f842006-03-18 01:23:20 +0000695def MOVUPDmr : PDI<0x11, MRMDestMem, (ops f128mem:$dst, VR128:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000696 "movupd {$src, $dst|$dst, $src}", []>;
697
Evan Cheng4fcb9222006-03-28 02:43:26 +0000698let isTwoAddress = 1 in {
Evan Cheng9bbfd4f2006-03-28 07:01:28 +0000699def MOVLPSrm : PSI<0x12, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f64mem:$src2),
700 "movlps {$src2, $dst|$dst, $src2}", []>;
701def MOVLPDrm : PDI<0x12, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f64mem:$src2),
702 "movlpd {$src2, $dst|$dst, $src2}", []>;
Evan Cheng4fcb9222006-03-28 02:43:26 +0000703def MOVHPSrm : PSI<0x16, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f64mem:$src2),
704 "movhps {$src2, $dst|$dst, $src2}", []>;
705def MOVHPDrm : PDI<0x16, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f64mem:$src2),
706 "movhpd {$src2, $dst|$dst, $src2}",
707 [(set VR128:$dst,
708 (v2f64 (vector_shuffle VR128:$src1,
709 (scalar_to_vector (loadf64 addr:$src2)),
710 UNPCKL_shuffle_mask)))]>;
711}
712
Evan Cheng9bbfd4f2006-03-28 07:01:28 +0000713def MOVLPSmr : PSI<0x13, MRMDestMem, (ops f64mem:$dst, VR128:$src),
714 "movlps {$src, $dst|$dst, $src}", []>;
715def MOVLPDmr : PDI<0x13, MRMDestMem, (ops f64mem:$dst, VR128:$src),
716 "movlpd {$src, $dst|$dst, $src}", []>;
717
Evan Cheng2246f842006-03-18 01:23:20 +0000718def MOVHPSmr : PSI<0x17, MRMDestMem, (ops f64mem:$dst, VR128:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000719 "movhps {$src, $dst|$dst, $src}", []>;
Evan Cheng2246f842006-03-18 01:23:20 +0000720def MOVHPDmr : PDI<0x17, MRMDestMem, (ops f64mem:$dst, VR128:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000721 "movhpd {$src, $dst|$dst, $src}", []>;
722
Evan Cheng14aed5e2006-03-24 01:18:28 +0000723let isTwoAddress = 1 in {
724def MOVLHPSrr : PSI<0x16, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
Evan Cheng4fcb9222006-03-28 02:43:26 +0000725 "movlhps {$src2, $dst|$dst, $src2}",
726 [(set VR128:$dst,
Evan Cheng2064a2b2006-03-28 06:50:32 +0000727 (v4f32 (vector_shuffle VR128:$src1, VR128:$src2,
728 MOVLHPS_shuffle_mask)))]>;
Evan Cheng2c0dbd02006-03-24 02:58:06 +0000729
Evan Cheng14aed5e2006-03-24 01:18:28 +0000730def MOVHLPSrr : PSI<0x12, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
Evan Chengbe296ac2006-03-28 06:53:49 +0000731 "movhlps {$src2, $dst|$dst, $src2}",
Evan Cheng4fcb9222006-03-28 02:43:26 +0000732 [(set VR128:$dst,
Evan Cheng2064a2b2006-03-28 06:50:32 +0000733 (v4f32 (vector_shuffle VR128:$src1, VR128:$src2,
Evan Cheng4fcb9222006-03-28 02:43:26 +0000734 MOVHLPS_shuffle_mask)))]>;
Evan Cheng14aed5e2006-03-24 01:18:28 +0000735}
Evan Cheng470a6ad2006-02-22 02:26:30 +0000736
Evan Cheng470a6ad2006-02-22 02:26:30 +0000737// Conversion instructions
Evan Cheng2246f842006-03-18 01:23:20 +0000738def CVTPI2PSrr : PSI<0x2A, MRMSrcReg, (ops VR128:$dst, VR64:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000739 "cvtpi2ps {$src, $dst|$dst, $src}", []>;
Evan Cheng2246f842006-03-18 01:23:20 +0000740def CVTPI2PSrm : PSI<0x2A, MRMSrcMem, (ops VR128:$dst, i64mem:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000741 "cvtpi2ps {$src, $dst|$dst, $src}", []>;
Evan Cheng2246f842006-03-18 01:23:20 +0000742def CVTPI2PDrr : PDI<0x2A, MRMSrcReg, (ops VR128:$dst, VR64:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000743 "cvtpi2pd {$src, $dst|$dst, $src}", []>;
Evan Cheng2246f842006-03-18 01:23:20 +0000744def CVTPI2PDrm : PDI<0x2A, MRMSrcMem, (ops VR128:$dst, i64mem:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000745 "cvtpi2pd {$src, $dst|$dst, $src}", []>;
746
747// SSE2 instructions without OpSize prefix
Evan Cheng2246f842006-03-18 01:23:20 +0000748def CVTDQ2PSrr : I<0x5B, MRMSrcReg, (ops VR128:$dst, VR128:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000749 "cvtdq2ps {$src, $dst|$dst, $src}", []>, TB,
750 Requires<[HasSSE2]>;
Evan Cheng2246f842006-03-18 01:23:20 +0000751def CVTDQ2PSrm : I<0x5B, MRMSrcMem, (ops VR128:$dst, i128mem:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000752 "cvtdq2ps {$src, $dst|$dst, $src}", []>, TB,
753 Requires<[HasSSE2]>;
754
755// SSE2 instructions with XS prefix
Evan Cheng2246f842006-03-18 01:23:20 +0000756def CVTDQ2PDrr : I<0xE6, MRMSrcReg, (ops VR128:$dst, VR64:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000757 "cvtdq2pd {$src, $dst|$dst, $src}", []>,
758 XS, Requires<[HasSSE2]>;
Evan Cheng2246f842006-03-18 01:23:20 +0000759def CVTDQ2PDrm : I<0xE6, MRMSrcMem, (ops VR128:$dst, i64mem:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000760 "cvtdq2pd {$src, $dst|$dst, $src}", []>,
761 XS, Requires<[HasSSE2]>;
762
Evan Cheng2246f842006-03-18 01:23:20 +0000763def CVTPS2PIrr : PSI<0x2D, MRMSrcReg, (ops VR64:$dst, VR128:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000764 "cvtps2pi {$src, $dst|$dst, $src}", []>;
Evan Cheng2246f842006-03-18 01:23:20 +0000765def CVTPS2PIrm : PSI<0x2D, MRMSrcMem, (ops VR64:$dst, f64mem:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000766 "cvtps2pi {$src, $dst|$dst, $src}", []>;
Evan Cheng2246f842006-03-18 01:23:20 +0000767def CVTPD2PIrr : PDI<0x2D, MRMSrcReg, (ops VR64:$dst, VR128:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000768 "cvtpd2pi {$src, $dst|$dst, $src}", []>;
Evan Cheng2246f842006-03-18 01:23:20 +0000769def CVTPD2PIrm : PDI<0x2D, MRMSrcMem, (ops VR64:$dst, f128mem:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000770 "cvtpd2pi {$src, $dst|$dst, $src}", []>;
771
Evan Cheng2246f842006-03-18 01:23:20 +0000772def CVTPS2DQrr : PDI<0x5B, MRMSrcReg, (ops VR128:$dst, VR128:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000773 "cvtps2dq {$src, $dst|$dst, $src}", []>;
Evan Cheng2246f842006-03-18 01:23:20 +0000774def CVTPS2DQrm : PDI<0x5B, MRMSrcMem, (ops VR128:$dst, f128mem:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000775 "cvtps2dq {$src, $dst|$dst, $src}", []>;
776// SSE2 packed instructions with XD prefix
Evan Cheng2246f842006-03-18 01:23:20 +0000777def CVTPD2DQrr : SDI<0xE6, MRMSrcReg, (ops VR128:$dst, VR128:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000778 "cvtpd2dq {$src, $dst|$dst, $src}", []>;
Evan Cheng2246f842006-03-18 01:23:20 +0000779def CVTPD2DQrm : SDI<0xE6, MRMSrcMem, (ops VR128:$dst, f128mem:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000780 "cvtpd2dq {$src, $dst|$dst, $src}", []>;
781
782// SSE2 instructions without OpSize prefix
Evan Cheng2246f842006-03-18 01:23:20 +0000783def CVTPS2PDrr : I<0x5A, MRMSrcReg, (ops VR128:$dst, VR128:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000784 "cvtps2pd {$src, $dst|$dst, $src}", []>, TB,
785 Requires<[HasSSE2]>;
Evan Cheng2246f842006-03-18 01:23:20 +0000786def CVTPS2PDrm : I<0x5A, MRMSrcReg, (ops VR128:$dst, f64mem:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000787 "cvtps2pd {$src, $dst|$dst, $src}", []>, TB,
788 Requires<[HasSSE2]>;
789
Evan Cheng2246f842006-03-18 01:23:20 +0000790def CVTPD2PSrr : PDI<0x5A, MRMSrcReg, (ops VR128:$dst, VR128:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000791 "cvtpd2ps {$src, $dst|$dst, $src}", []>;
Evan Cheng2246f842006-03-18 01:23:20 +0000792def CVTPD2PSrm : PDI<0x5A, MRMSrcReg, (ops VR128:$dst, f128mem:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000793 "cvtpd2ps {$src, $dst|$dst, $src}", []>;
794
795// Arithmetic
796let isTwoAddress = 1 in {
797let isCommutable = 1 in {
Evan Cheng2246f842006-03-18 01:23:20 +0000798def ADDPSrr : PSI<0x58, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000799 "addps {$src2, $dst|$dst, $src2}",
Evan Cheng2246f842006-03-18 01:23:20 +0000800 [(set VR128:$dst, (v4f32 (fadd VR128:$src1, VR128:$src2)))]>;
801def ADDPDrr : PDI<0x58, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000802 "addpd {$src2, $dst|$dst, $src2}",
Evan Cheng2246f842006-03-18 01:23:20 +0000803 [(set VR128:$dst, (v2f64 (fadd VR128:$src1, VR128:$src2)))]>;
804def MULPSrr : PSI<0x59, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000805 "mulps {$src2, $dst|$dst, $src2}",
Evan Cheng2246f842006-03-18 01:23:20 +0000806 [(set VR128:$dst, (v4f32 (fmul VR128:$src1, VR128:$src2)))]>;
807def MULPDrr : PDI<0x59, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000808 "mulpd {$src2, $dst|$dst, $src2}",
Evan Cheng2246f842006-03-18 01:23:20 +0000809 [(set VR128:$dst, (v2f64 (fmul VR128:$src1, VR128:$src2)))]>;
Evan Cheng470a6ad2006-02-22 02:26:30 +0000810}
811
Evan Cheng2246f842006-03-18 01:23:20 +0000812def ADDPSrm : PSI<0x58, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000813 "addps {$src2, $dst|$dst, $src2}",
Evan Cheng2246f842006-03-18 01:23:20 +0000814 [(set VR128:$dst, (v4f32 (fadd VR128:$src1,
815 (load addr:$src2))))]>;
816def ADDPDrm : PDI<0x58, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000817 "addpd {$src2, $dst|$dst, $src2}",
Evan Cheng2246f842006-03-18 01:23:20 +0000818 [(set VR128:$dst, (v2f64 (fadd VR128:$src1,
819 (load addr:$src2))))]>;
820def MULPSrm : PSI<0x59, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000821 "mulps {$src2, $dst|$dst, $src2}",
Evan Cheng2246f842006-03-18 01:23:20 +0000822 [(set VR128:$dst, (v4f32 (fmul VR128:$src1,
823 (load addr:$src2))))]>;
824def MULPDrm : PDI<0x59, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000825 "mulpd {$src2, $dst|$dst, $src2}",
Evan Cheng2246f842006-03-18 01:23:20 +0000826 [(set VR128:$dst, (v2f64 (fmul VR128:$src1,
827 (load addr:$src2))))]>;
Evan Cheng470a6ad2006-02-22 02:26:30 +0000828
Evan Cheng2246f842006-03-18 01:23:20 +0000829def DIVPSrr : PSI<0x5E, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
830 "divps {$src2, $dst|$dst, $src2}",
831 [(set VR128:$dst, (v4f32 (fdiv VR128:$src1, VR128:$src2)))]>;
832def DIVPSrm : PSI<0x5E, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
833 "divps {$src2, $dst|$dst, $src2}",
834 [(set VR128:$dst, (v4f32 (fdiv VR128:$src1,
835 (load addr:$src2))))]>;
836def DIVPDrr : PDI<0x5E, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000837 "divpd {$src2, $dst|$dst, $src2}",
Evan Cheng2246f842006-03-18 01:23:20 +0000838 [(set VR128:$dst, (v2f64 (fdiv VR128:$src1, VR128:$src2)))]>;
839def DIVPDrm : PDI<0x5E, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000840 "divpd {$src2, $dst|$dst, $src2}",
Evan Cheng2246f842006-03-18 01:23:20 +0000841 [(set VR128:$dst, (v2f64 (fdiv VR128:$src1,
842 (load addr:$src2))))]>;
Evan Cheng470a6ad2006-02-22 02:26:30 +0000843
Evan Cheng2246f842006-03-18 01:23:20 +0000844def SUBPSrr : PSI<0x5C, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
845 "subps {$src2, $dst|$dst, $src2}",
846 [(set VR128:$dst, (v4f32 (fsub VR128:$src1, VR128:$src2)))]>;
847def SUBPSrm : PSI<0x5C, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
848 "subps {$src2, $dst|$dst, $src2}",
849 [(set VR128:$dst, (v4f32 (fsub VR128:$src1,
850 (load addr:$src2))))]>;
851def SUBPDrr : PDI<0x5C, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
852 "subpd {$src2, $dst|$dst, $src2}",
Evan Cheng2c0dbd02006-03-24 02:58:06 +0000853 [(set VR128:$dst, (v2f64 (fsub VR128:$src1, VR128:$src2)))]>;
Evan Cheng2246f842006-03-18 01:23:20 +0000854def SUBPDrm : PDI<0x5C, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
855 "subpd {$src2, $dst|$dst, $src2}",
Evan Cheng2c0dbd02006-03-24 02:58:06 +0000856 [(set VR128:$dst, (v2f64 (fsub VR128:$src1,
857 (load addr:$src2))))]>;
Evan Cheng470a6ad2006-02-22 02:26:30 +0000858}
859
Evan Cheng2246f842006-03-18 01:23:20 +0000860def SQRTPSrr : PSI<0x51, MRMSrcReg, (ops VR128:$dst, VR128:$src),
861 "sqrtps {$src, $dst|$dst, $src}",
862 [(set VR128:$dst, (v4f32 (fsqrt VR128:$src)))]>;
863def SQRTPSrm : PSI<0x51, MRMSrcMem, (ops VR128:$dst, f128mem:$src),
864 "sqrtps {$src, $dst|$dst, $src}",
865 [(set VR128:$dst, (v4f32 (fsqrt (load addr:$src))))]>;
866def SQRTPDrr : PDI<0x51, MRMSrcReg, (ops VR128:$dst, VR128:$src),
867 "sqrtpd {$src, $dst|$dst, $src}",
868 [(set VR128:$dst, (v2f64 (fsqrt VR128:$src)))]>;
869def SQRTPDrm : PDI<0x51, MRMSrcMem, (ops VR128:$dst, f128mem:$src),
870 "sqrtpd {$src, $dst|$dst, $src}",
871 [(set VR128:$dst, (v2f64 (fsqrt (load addr:$src))))]>;
Evan Cheng470a6ad2006-02-22 02:26:30 +0000872
Evan Cheng2246f842006-03-18 01:23:20 +0000873def RSQRTPSrr : PSI<0x52, MRMSrcReg, (ops VR128:$dst, VR128:$src),
874 "rsqrtps {$src, $dst|$dst, $src}", []>;
875def RSQRTPSrm : PSI<0x52, MRMSrcMem, (ops VR128:$dst, f128mem:$src),
876 "rsqrtps {$src, $dst|$dst, $src}", []>;
877def RCPPSrr : PSI<0x53, MRMSrcReg, (ops VR128:$dst, VR128:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000878 "rcpps {$src, $dst|$dst, $src}", []>;
Evan Cheng2246f842006-03-18 01:23:20 +0000879def RCPPSrm : PSI<0x53, MRMSrcMem, (ops VR128:$dst, f128mem:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000880 "rcpps {$src, $dst|$dst, $src}", []>;
881
Evan Cheng2246f842006-03-18 01:23:20 +0000882def MAXPSrr : PSI<0x5F, MRMSrcReg, (ops VR128:$dst, VR128:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000883 "maxps {$src, $dst|$dst, $src}", []>;
Evan Cheng2246f842006-03-18 01:23:20 +0000884def MAXPSrm : PSI<0x5F, MRMSrcMem, (ops VR128:$dst, f128mem:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000885 "maxps {$src, $dst|$dst, $src}", []>;
Evan Cheng2246f842006-03-18 01:23:20 +0000886def MAXPDrr : PDI<0x5F, MRMSrcReg, (ops VR128:$dst, VR128:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000887 "maxpd {$src, $dst|$dst, $src}", []>;
Evan Cheng2246f842006-03-18 01:23:20 +0000888def MAXPDrm : PDI<0x5F, MRMSrcMem, (ops VR128:$dst, f128mem:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000889 "maxpd {$src, $dst|$dst, $src}", []>;
Evan Cheng2246f842006-03-18 01:23:20 +0000890def MINPSrr : PSI<0x5D, MRMSrcReg, (ops VR128:$dst, VR128:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000891 "minps {$src, $dst|$dst, $src}", []>;
Evan Cheng2246f842006-03-18 01:23:20 +0000892def MINPSrm : PSI<0x5D, MRMSrcMem, (ops VR128:$dst, f128mem:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000893 "minps {$src, $dst|$dst, $src}", []>;
Evan Cheng2246f842006-03-18 01:23:20 +0000894def MINPDrr : PDI<0x5D, MRMSrcReg, (ops VR128:$dst, VR128:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000895 "minpd {$src, $dst|$dst, $src}", []>;
Evan Cheng2246f842006-03-18 01:23:20 +0000896def MINPDrm : PDI<0x5D, MRMSrcMem, (ops VR128:$dst, f128mem:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000897 "minpd {$src, $dst|$dst, $src}", []>;
Evan Chengffcb95b2006-02-21 19:13:53 +0000898
899// Logical
900let isTwoAddress = 1 in {
901let isCommutable = 1 in {
Evan Cheng2246f842006-03-18 01:23:20 +0000902def ANDPSrr : PSI<0x54, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
903 "andps {$src2, $dst|$dst, $src2}",
Evan Cheng5aa97b22006-03-29 18:47:40 +0000904 [(set VR128:$dst,
905 (and (bc_v4i32 (v4f32 VR128:$src1)),
906 (bc_v4i32 (v4f32 VR128:$src2))))]>;
Evan Cheng2246f842006-03-18 01:23:20 +0000907def ANDPDrr : PDI<0x54, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
Evan Chengffcb95b2006-02-21 19:13:53 +0000908 "andpd {$src2, $dst|$dst, $src2}",
Evan Cheng5aa97b22006-03-29 18:47:40 +0000909 [(set VR128:$dst,
910 (and (bc_v2i64 (v2f64 VR128:$src1)),
911 (bc_v2i64 (v2f64 VR128:$src2))))]>;
Evan Cheng2246f842006-03-18 01:23:20 +0000912def ORPSrr : PSI<0x56, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
913 "orps {$src2, $dst|$dst, $src2}",
Evan Cheng5aa97b22006-03-29 18:47:40 +0000914 [(set VR128:$dst,
915 (or (bc_v4i32 (v4f32 VR128:$src1)),
916 (bc_v4i32 (v4f32 VR128:$src2))))]>;
Evan Cheng2246f842006-03-18 01:23:20 +0000917def ORPDrr : PDI<0x56, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
918 "orpd {$src2, $dst|$dst, $src2}",
Evan Cheng5aa97b22006-03-29 18:47:40 +0000919 [(set VR128:$dst,
920 (or (bc_v2i64 (v2f64 VR128:$src1)),
921 (bc_v2i64 (v2f64 VR128:$src2))))]>;
Evan Cheng2246f842006-03-18 01:23:20 +0000922def XORPSrr : PSI<0x57, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
923 "xorps {$src2, $dst|$dst, $src2}",
Evan Cheng5aa97b22006-03-29 18:47:40 +0000924 [(set VR128:$dst,
925 (xor (bc_v4i32 (v4f32 VR128:$src1)),
926 (bc_v4i32 (v4f32 VR128:$src2))))]>;
Evan Cheng2246f842006-03-18 01:23:20 +0000927def XORPDrr : PDI<0x57, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
928 "xorpd {$src2, $dst|$dst, $src2}",
Evan Cheng5aa97b22006-03-29 18:47:40 +0000929 [(set VR128:$dst,
930 (xor (bc_v2i64 (v2f64 VR128:$src1)),
931 (bc_v2i64 (v2f64 VR128:$src2))))]>;
Evan Chengffcb95b2006-02-21 19:13:53 +0000932}
Evan Cheng2246f842006-03-18 01:23:20 +0000933def ANDPSrm : PSI<0x54, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
934 "andps {$src2, $dst|$dst, $src2}",
Evan Cheng5aa97b22006-03-29 18:47:40 +0000935 [(set VR128:$dst,
936 (and (bc_v4i32 (v4f32 VR128:$src1)),
937 (bc_v4i32 (loadv4f32 addr:$src2))))]>;
Evan Cheng2246f842006-03-18 01:23:20 +0000938def ANDPDrm : PDI<0x54, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
939 "andpd {$src2, $dst|$dst, $src2}",
Evan Cheng5aa97b22006-03-29 18:47:40 +0000940 [(set VR128:$dst,
941 (and (bc_v2i64 (v2f64 VR128:$src1)),
942 (bc_v2i64 (loadv2f64 addr:$src2))))]>;
Evan Cheng2246f842006-03-18 01:23:20 +0000943def ORPSrm : PSI<0x56, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
944 "orps {$src2, $dst|$dst, $src2}",
Evan Cheng5aa97b22006-03-29 18:47:40 +0000945 [(set VR128:$dst,
946 (or (bc_v4i32 (v4f32 VR128:$src1)),
947 (bc_v4i32 (loadv4f32 addr:$src2))))]>;
Evan Cheng2246f842006-03-18 01:23:20 +0000948def ORPDrm : PDI<0x56, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
949 "orpd {$src2, $dst|$dst, $src2}",
Evan Cheng5aa97b22006-03-29 18:47:40 +0000950 [(set VR128:$dst,
951 (or (bc_v2i64 (v2f64 VR128:$src1)),
952 (bc_v2i64 (loadv2f64 addr:$src2))))]>;
Evan Cheng2246f842006-03-18 01:23:20 +0000953def XORPSrm : PSI<0x57, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
954 "xorps {$src2, $dst|$dst, $src2}",
Evan Cheng5aa97b22006-03-29 18:47:40 +0000955 [(set VR128:$dst,
956 (xor (bc_v4i32 (v4f32 VR128:$src1)),
957 (bc_v4i32 (loadv4f32 addr:$src2))))]>;
Evan Cheng2246f842006-03-18 01:23:20 +0000958def XORPDrm : PDI<0x57, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
959 "xorpd {$src2, $dst|$dst, $src2}",
Evan Cheng5aa97b22006-03-29 18:47:40 +0000960 [(set VR128:$dst,
961 (xor (bc_v2i64 (v2f64 VR128:$src1)),
962 (bc_v2i64 (loadv2f64 addr:$src2))))]>;
Evan Cheng2246f842006-03-18 01:23:20 +0000963def ANDNPSrr : PSI<0x55, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
964 "andnps {$src2, $dst|$dst, $src2}",
Evan Cheng5aa97b22006-03-29 18:47:40 +0000965 [(set VR128:$dst,
966 (and (vnot (bc_v4i32 (v4f32 VR128:$src1))),
967 (bc_v4i32 (v4f32 VR128:$src2))))]>;
968def ANDNPSrm : PSI<0x55, MRMSrcMem, (ops VR128:$dst, VR128:$src1,f128mem:$src2),
Evan Cheng2246f842006-03-18 01:23:20 +0000969 "andnps {$src2, $dst|$dst, $src2}",
Evan Cheng5aa97b22006-03-29 18:47:40 +0000970 [(set VR128:$dst,
971 (and (vnot (bc_v4i32 (v4f32 VR128:$src1))),
972 (bc_v4i32 (loadv4f32 addr:$src2))))]>;
Evan Cheng2246f842006-03-18 01:23:20 +0000973def ANDNPDrr : PDI<0x55, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
974 "andnpd {$src2, $dst|$dst, $src2}",
Evan Cheng5aa97b22006-03-29 18:47:40 +0000975 [(set VR128:$dst,
976 (and (vnot (bc_v2i64 (v2f64 VR128:$src1))),
977 (bc_v2i64 (v2f64 VR128:$src2))))]>;
978def ANDNPDrm : PDI<0x55, MRMSrcMem, (ops VR128:$dst, VR128:$src1,f128mem:$src2),
Evan Cheng2246f842006-03-18 01:23:20 +0000979 "andnpd {$src2, $dst|$dst, $src2}",
Evan Cheng5aa97b22006-03-29 18:47:40 +0000980 [(set VR128:$dst,
981 (and (vnot (bc_v2i64 (v2f64 VR128:$src1))),
982 (bc_v2i64 (loadv2f64 addr:$src2))))]>;
Evan Chengffcb95b2006-02-21 19:13:53 +0000983}
Evan Chengbf156d12006-02-21 19:26:52 +0000984
Evan Cheng470a6ad2006-02-22 02:26:30 +0000985let isTwoAddress = 1 in {
986def CMPPSrr : PSI<0xC2, MRMSrcReg,
Evan Cheng0876aa52006-03-30 06:21:22 +0000987 (ops VR128:$dst, VR128:$src1, VR128:$src, SSECC:$cc),
988 "cmp${cc}ps {$src, $dst|$dst, $src}",
989 [(set VR128:$dst, (int_x86_sse_cmp_ps VR128:$src1,
990 VR128:$src, imm:$cc))]>;
Evan Cheng470a6ad2006-02-22 02:26:30 +0000991def CMPPSrm : PSI<0xC2, MRMSrcMem,
Evan Cheng0876aa52006-03-30 06:21:22 +0000992 (ops VR128:$dst, VR128:$src1, f128mem:$src, SSECC:$cc),
993 "cmp${cc}ps {$src, $dst|$dst, $src}",
994 [(set VR128:$dst, (int_x86_sse_cmp_ps VR128:$src1,
995 (load addr:$src), imm:$cc))]>;
Evan Cheng470a6ad2006-02-22 02:26:30 +0000996def CMPPDrr : PDI<0xC2, MRMSrcReg,
Evan Cheng0876aa52006-03-30 06:21:22 +0000997 (ops VR128:$dst, VR128:$src1, VR128:$src, SSECC:$cc),
998 "cmp${cc}pd {$src, $dst|$dst, $src}", []>;
Evan Cheng470a6ad2006-02-22 02:26:30 +0000999def CMPPDrm : PDI<0xC2, MRMSrcMem,
Evan Cheng0876aa52006-03-30 06:21:22 +00001000 (ops VR128:$dst, VR128:$src1, f128mem:$src, SSECC:$cc),
1001 "cmp${cc}pd {$src, $dst|$dst, $src}", []>;
Evan Cheng470a6ad2006-02-22 02:26:30 +00001002}
1003
1004// Shuffle and unpack instructions
Evan Cheng0cea6d22006-03-22 20:08:18 +00001005let isTwoAddress = 1 in {
Evan Cheng2da953f2006-03-22 07:10:28 +00001006def SHUFPSrr : PSIi8<0xC6, MRMSrcReg,
Evan Cheng0038e592006-03-28 00:39:58 +00001007 (ops VR128:$dst, VR128:$src1, VR128:$src2, i32i8imm:$src3),
Evan Cheng14aed5e2006-03-24 01:18:28 +00001008 "shufps {$src3, $src2, $dst|$dst, $src2, $src3}",
Evan Cheng4f563382006-03-29 01:30:51 +00001009 [(set VR128:$dst, (v4f32 (vector_shuffle
1010 VR128:$src1, VR128:$src2,
1011 SHUFP_shuffle_mask:$src3)))]>;
Evan Cheng2da953f2006-03-22 07:10:28 +00001012def SHUFPSrm : PSIi8<0xC6, MRMSrcMem,
Evan Cheng0038e592006-03-28 00:39:58 +00001013 (ops VR128:$dst, VR128:$src1, f128mem:$src2, i32i8imm:$src3),
1014 "shufps {$src3, $src2, $dst|$dst, $src2, $src3}",
Evan Cheng4f563382006-03-29 01:30:51 +00001015 [(set VR128:$dst, (v4f32 (vector_shuffle
1016 VR128:$src1, (load addr:$src2),
1017 SHUFP_shuffle_mask:$src3)))]>;
Evan Cheng2da953f2006-03-22 07:10:28 +00001018def SHUFPDrr : PDIi8<0xC6, MRMSrcReg,
1019 (ops VR128:$dst, VR128:$src1, VR128:$src2, i8imm:$src3),
Evan Cheng14aed5e2006-03-24 01:18:28 +00001020 "shufpd {$src3, $src2, $dst|$dst, $src2, $src3}",
Evan Cheng4f563382006-03-29 01:30:51 +00001021 [(set VR128:$dst, (v2f64 (vector_shuffle
1022 VR128:$src1, VR128:$src2,
1023 SHUFP_shuffle_mask:$src3)))]>;
Evan Cheng2da953f2006-03-22 07:10:28 +00001024def SHUFPDrm : PDIi8<0xC6, MRMSrcMem,
1025 (ops VR128:$dst, VR128:$src1, f128mem:$src2, i8imm:$src3),
Evan Cheng0038e592006-03-28 00:39:58 +00001026 "shufpd {$src3, $src2, $dst|$dst, $src2, $src3}",
Evan Cheng4f563382006-03-29 01:30:51 +00001027 [(set VR128:$dst, (v2f64 (vector_shuffle
1028 VR128:$src1, (load addr:$src2),
1029 SHUFP_shuffle_mask:$src3)))]>;
Evan Cheng470a6ad2006-02-22 02:26:30 +00001030
1031def UNPCKHPSrr : PSI<0x15, MRMSrcReg,
Evan Cheng2246f842006-03-18 01:23:20 +00001032 (ops VR128:$dst, VR128:$src1, VR128:$src2),
Evan Cheng4fcb9222006-03-28 02:43:26 +00001033 "unpckhps {$src2, $dst|$dst, $src2}",
Evan Cheng4f563382006-03-29 01:30:51 +00001034 [(set VR128:$dst, (v4f32 (vector_shuffle
1035 VR128:$src1, VR128:$src2,
1036 UNPCKH_shuffle_mask)))]>;
Evan Cheng470a6ad2006-02-22 02:26:30 +00001037def UNPCKHPSrm : PSI<0x15, MRMSrcMem,
Evan Cheng2246f842006-03-18 01:23:20 +00001038 (ops VR128:$dst, VR128:$src1, f128mem:$src2),
Evan Cheng4fcb9222006-03-28 02:43:26 +00001039 "unpckhps {$src2, $dst|$dst, $src2}",
Evan Cheng4f563382006-03-29 01:30:51 +00001040 [(set VR128:$dst, (v4f32 (vector_shuffle
1041 VR128:$src1, (load addr:$src2),
1042 UNPCKH_shuffle_mask)))]>;
Evan Cheng470a6ad2006-02-22 02:26:30 +00001043def UNPCKHPDrr : PDI<0x15, MRMSrcReg,
Evan Cheng2246f842006-03-18 01:23:20 +00001044 (ops VR128:$dst, VR128:$src1, VR128:$src2),
Evan Cheng4fcb9222006-03-28 02:43:26 +00001045 "unpckhpd {$src2, $dst|$dst, $src2}",
Evan Cheng4f563382006-03-29 01:30:51 +00001046 [(set VR128:$dst, (v2f64 (vector_shuffle
1047 VR128:$src1, VR128:$src2,
1048 UNPCKH_shuffle_mask)))]>;
Evan Cheng470a6ad2006-02-22 02:26:30 +00001049def UNPCKHPDrm : PDI<0x15, MRMSrcMem,
Evan Cheng2246f842006-03-18 01:23:20 +00001050 (ops VR128:$dst, VR128:$src1, f128mem:$src2),
Evan Cheng4fcb9222006-03-28 02:43:26 +00001051 "unpckhpd {$src2, $dst|$dst, $src2}",
Evan Cheng4f563382006-03-29 01:30:51 +00001052 [(set VR128:$dst, (v2f64 (vector_shuffle
1053 VR128:$src1, (load addr:$src2),
1054 UNPCKH_shuffle_mask)))]>;
Evan Cheng4fcb9222006-03-28 02:43:26 +00001055
Evan Cheng470a6ad2006-02-22 02:26:30 +00001056def UNPCKLPSrr : PSI<0x14, MRMSrcReg,
Evan Cheng2246f842006-03-18 01:23:20 +00001057 (ops VR128:$dst, VR128:$src1, VR128:$src2),
Evan Chengc60bd972006-03-25 09:37:23 +00001058 "unpcklps {$src2, $dst|$dst, $src2}",
Evan Cheng4f563382006-03-29 01:30:51 +00001059 [(set VR128:$dst, (v4f32 (vector_shuffle
1060 VR128:$src1, VR128:$src2,
1061 UNPCKL_shuffle_mask)))]>;
Evan Cheng470a6ad2006-02-22 02:26:30 +00001062def UNPCKLPSrm : PSI<0x14, MRMSrcMem,
Evan Cheng2246f842006-03-18 01:23:20 +00001063 (ops VR128:$dst, VR128:$src1, f128mem:$src2),
Evan Chengc60bd972006-03-25 09:37:23 +00001064 "unpcklps {$src2, $dst|$dst, $src2}",
Evan Cheng4f563382006-03-29 01:30:51 +00001065 [(set VR128:$dst, (v4f32 (vector_shuffle
1066 VR128:$src1, (load addr:$src2),
1067 UNPCKL_shuffle_mask)))]>;
Evan Cheng470a6ad2006-02-22 02:26:30 +00001068def UNPCKLPDrr : PDI<0x14, MRMSrcReg,
Evan Cheng2246f842006-03-18 01:23:20 +00001069 (ops VR128:$dst, VR128:$src1, VR128:$src2),
Evan Cheng4fcb9222006-03-28 02:43:26 +00001070 "unpcklpd {$src2, $dst|$dst, $src2}",
Evan Cheng4f563382006-03-29 01:30:51 +00001071 [(set VR128:$dst, (v2f64 (vector_shuffle
1072 VR128:$src1, VR128:$src2,
1073 UNPCKL_shuffle_mask)))]>;
Evan Cheng470a6ad2006-02-22 02:26:30 +00001074def UNPCKLPDrm : PDI<0x14, MRMSrcMem,
Evan Cheng2246f842006-03-18 01:23:20 +00001075 (ops VR128:$dst, VR128:$src1, f128mem:$src2),
Evan Cheng4fcb9222006-03-28 02:43:26 +00001076 "unpcklpd {$src2, $dst|$dst, $src2}",
Evan Cheng4f563382006-03-29 01:30:51 +00001077 [(set VR128:$dst, (v2f64 (vector_shuffle
1078 VR128:$src1, (load addr:$src2),
1079 UNPCKL_shuffle_mask)))]>;
Evan Cheng2c0dbd02006-03-24 02:58:06 +00001080}
Evan Cheng470a6ad2006-02-22 02:26:30 +00001081
Evan Cheng4b1734f2006-03-31 21:29:33 +00001082// Horizontal ops
1083let isTwoAddress = 1 in {
1084def HADDPSrr : S3S_Intrr<0x7C, "haddps {$src2, $dst|$dst, $src2}",
1085 int_x86_sse3_hadd_ps>;
1086def HADDPSrm : S3S_Intrm<0x7C, "haddps {$src2, $dst|$dst, $src2}",
1087 int_x86_sse3_hadd_ps>;
1088def HADDPDrr : S3D_Intrr<0x7C, "haddpd {$src2, $dst|$dst, $src2}",
1089 int_x86_sse3_hadd_pd>;
1090def HADDPDrm : S3D_Intrm<0x7C, "haddpd {$src2, $dst|$dst, $src2}",
1091 int_x86_sse3_hadd_pd>;
1092def HSUBPSrr : S3S_Intrr<0x7C, "hsubps {$src2, $dst|$dst, $src2}",
1093 int_x86_sse3_hsub_ps>;
1094def HSUBPSrm : S3S_Intrm<0x7C, "hsubps {$src2, $dst|$dst, $src2}",
1095 int_x86_sse3_hsub_ps>;
1096def HSUBPDrr : S3D_Intrr<0x7C, "hsubpd {$src2, $dst|$dst, $src2}",
1097 int_x86_sse3_hsub_pd>;
1098def HSUBPDrm : S3D_Intrm<0x7C, "hsubpd {$src2, $dst|$dst, $src2}",
1099 int_x86_sse3_hsub_pd>;
1100}
1101
Evan Chengbf156d12006-02-21 19:26:52 +00001102//===----------------------------------------------------------------------===//
Evan Cheng4e4c71e2006-02-21 20:00:20 +00001103// SSE integer instructions
Evan Chengbf156d12006-02-21 19:26:52 +00001104//===----------------------------------------------------------------------===//
1105
Evan Cheng4e4c71e2006-02-21 20:00:20 +00001106// Move Instructions
Evan Cheng24dc1f52006-03-23 07:44:07 +00001107def MOVDQArr : PDI<0x6F, MRMSrcReg, (ops VR128:$dst, VR128:$src),
1108 "movdqa {$src, $dst|$dst, $src}", []>;
1109def MOVDQArm : PDI<0x6F, MRMSrcMem, (ops VR128:$dst, i128mem:$src),
1110 "movdqa {$src, $dst|$dst, $src}",
1111 [(set VR128:$dst, (loadv4i32 addr:$src))]>;
1112def MOVDQAmr : PDI<0x7F, MRMDestMem, (ops i128mem:$dst, VR128:$src),
1113 "movdqa {$src, $dst|$dst, $src}",
1114 [(store (v4i32 VR128:$src), addr:$dst)]>;
1115
Evan Chenga971f6f2006-03-23 01:57:24 +00001116// 128-bit Integer Arithmetic
1117let isTwoAddress = 1 in {
1118let isCommutable = 1 in {
1119def PADDBrr : PDI<0xFC, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
1120 "paddb {$src2, $dst|$dst, $src2}",
1121 [(set VR128:$dst, (v16i8 (add VR128:$src1, VR128:$src2)))]>;
1122def PADDWrr : PDI<0xFD, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
1123 "paddw {$src2, $dst|$dst, $src2}",
1124 [(set VR128:$dst, (v8i16 (add VR128:$src1, VR128:$src2)))]>;
1125def PADDDrr : PDI<0xFE, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
1126 "paddd {$src2, $dst|$dst, $src2}",
1127 [(set VR128:$dst, (v4i32 (add VR128:$src1, VR128:$src2)))]>;
Evan Cheng506d3df2006-03-29 23:07:14 +00001128
1129def PADDQrr : PDI<0xD4, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
1130 "paddq {$src2, $dst|$dst, $src2}",
1131 [(set VR128:$dst, (v2i64 (add VR128:$src1, VR128:$src2)))]>;
Evan Chenga971f6f2006-03-23 01:57:24 +00001132}
1133def PADDBrm : PDI<0xFC, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
1134 "paddb {$src2, $dst|$dst, $src2}",
1135 [(set VR128:$dst, (v16i8 (add VR128:$src1,
1136 (load addr:$src2))))]>;
1137def PADDWrm : PDI<0xFD, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
1138 "paddw {$src2, $dst|$dst, $src2}",
1139 [(set VR128:$dst, (v8i16 (add VR128:$src1,
1140 (load addr:$src2))))]>;
1141def PADDDrm : PDI<0xFE, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
1142 "paddd {$src2, $dst|$dst, $src2}",
1143 [(set VR128:$dst, (v4i32 (add VR128:$src1,
1144 (load addr:$src2))))]>;
Evan Cheng506d3df2006-03-29 23:07:14 +00001145def PADDQrm : PDI<0xD4, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
1146 "paddd {$src2, $dst|$dst, $src2}",
1147 [(set VR128:$dst, (v2i64 (add VR128:$src1,
1148 (load addr:$src2))))]>;
Evan Cheng7b1d34b2006-03-25 01:33:37 +00001149
1150def PSUBBrr : PDI<0xF8, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
1151 "psubb {$src2, $dst|$dst, $src2}",
1152 [(set VR128:$dst, (v16i8 (sub VR128:$src1, VR128:$src2)))]>;
1153def PSUBWrr : PDI<0xF9, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
1154 "psubw {$src2, $dst|$dst, $src2}",
1155 [(set VR128:$dst, (v8i16 (sub VR128:$src1, VR128:$src2)))]>;
1156def PSUBDrr : PDI<0xFA, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
1157 "psubd {$src2, $dst|$dst, $src2}",
1158 [(set VR128:$dst, (v4i32 (sub VR128:$src1, VR128:$src2)))]>;
Evan Cheng506d3df2006-03-29 23:07:14 +00001159def PSUBQrr : PDI<0xFB, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
1160 "psubq {$src2, $dst|$dst, $src2}",
1161 [(set VR128:$dst, (v2i64 (sub VR128:$src1, VR128:$src2)))]>;
Evan Cheng7b1d34b2006-03-25 01:33:37 +00001162
1163def PSUBBrm : PDI<0xF8, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
1164 "psubb {$src2, $dst|$dst, $src2}",
1165 [(set VR128:$dst, (v16i8 (sub VR128:$src1,
1166 (load addr:$src2))))]>;
1167def PSUBWrm : PDI<0xF9, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
1168 "psubw {$src2, $dst|$dst, $src2}",
1169 [(set VR128:$dst, (v8i16 (sub VR128:$src1,
1170 (load addr:$src2))))]>;
1171def PSUBDrm : PDI<0xFA, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
1172 "psubd {$src2, $dst|$dst, $src2}",
1173 [(set VR128:$dst, (v4i32 (sub VR128:$src1,
1174 (load addr:$src2))))]>;
Evan Cheng506d3df2006-03-29 23:07:14 +00001175def PSUBQrm : PDI<0xFB, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
1176 "psubd {$src2, $dst|$dst, $src2}",
1177 [(set VR128:$dst, (v2i64 (sub VR128:$src1,
1178 (load addr:$src2))))]>;
1179}
Evan Chengc60bd972006-03-25 09:37:23 +00001180
Evan Cheng506d3df2006-03-29 23:07:14 +00001181// Logical
1182let isTwoAddress = 1 in {
1183let isCommutable = 1 in {
1184def PANDrr : PDI<0xDB, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
1185 "pand {$src2, $dst|$dst, $src2}",
1186 [(set VR128:$dst, (v2i64 (and VR128:$src1, VR128:$src2)))]>;
1187
1188def PANDrm : PDI<0xDB, MRMSrcMem, (ops VR128:$dst, VR128:$src1, i128mem:$src2),
1189 "pand {$src2, $dst|$dst, $src2}",
1190 [(set VR128:$dst, (v2i64 (and VR128:$src1,
1191 (load addr:$src2))))]>;
1192def PORrr : PDI<0xDB, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
1193 "por {$src2, $dst|$dst, $src2}",
1194 [(set VR128:$dst, (v2i64 (or VR128:$src1, VR128:$src2)))]>;
1195
1196def PORrm : PDI<0xDB, MRMSrcMem, (ops VR128:$dst, VR128:$src1, i128mem:$src2),
1197 "por {$src2, $dst|$dst, $src2}",
1198 [(set VR128:$dst, (v2i64 (or VR128:$src1,
1199 (load addr:$src2))))]>;
1200def PXORrr : PDI<0xEF, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
1201 "pxor {$src2, $dst|$dst, $src2}",
1202 [(set VR128:$dst, (v2i64 (xor VR128:$src1, VR128:$src2)))]>;
1203
1204def PXORrm : PDI<0xEF, MRMSrcMem, (ops VR128:$dst, VR128:$src1, i128mem:$src2),
1205 "pxor {$src2, $dst|$dst, $src2}",
1206 [(set VR128:$dst, (v2i64 (xor VR128:$src1,
1207 (load addr:$src2))))]>;
1208}
1209
1210def PANDNrr : PDI<0xDF, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
1211 "pandn {$src2, $dst|$dst, $src2}",
1212 [(set VR128:$dst, (v2i64 (and (vnot VR128:$src1),
1213 VR128:$src2)))]>;
1214
1215def PANDNrm : PDI<0xDF, MRMSrcMem, (ops VR128:$dst, VR128:$src1, i128mem:$src2),
1216 "pandn {$src2, $dst|$dst, $src2}",
1217 [(set VR128:$dst, (v2i64 (and (vnot VR128:$src1),
1218 (load addr:$src2))))]>;
1219}
1220
1221// Pack instructions
1222let isTwoAddress = 1 in {
1223def PACKSSWBrr : PDI<0x63, MRMSrcReg, (ops VR128:$dst, VR128:$src1,
1224 VR128:$src2),
1225 "packsswb {$src2, $dst|$dst, $src2}",
Evan Cheng591f7402006-03-29 23:53:14 +00001226 [(set VR128:$dst, (v8i16 (int_x86_sse2_packsswb_128
1227 VR128:$src1,
1228 VR128:$src2)))]>;
Evan Cheng506d3df2006-03-29 23:07:14 +00001229def PACKSSWBrm : PDI<0x63, MRMSrcMem, (ops VR128:$dst, VR128:$src1,
1230 i128mem:$src2),
1231 "packsswb {$src2, $dst|$dst, $src2}",
Evan Cheng591f7402006-03-29 23:53:14 +00001232 [(set VR128:$dst, (v8i16 (int_x86_sse2_packsswb_128
1233 VR128:$src1,
1234 (bc_v8i16 (loadv2f64 addr:$src2)))))]>;
Evan Cheng506d3df2006-03-29 23:07:14 +00001235def PACKSSDWrr : PDI<0x6B, MRMSrcReg, (ops VR128:$dst, VR128:$src1,
1236 VR128:$src2),
Evan Cheng591f7402006-03-29 23:53:14 +00001237 "packssdw {$src2, $dst|$dst, $src2}",
1238 [(set VR128:$dst, (v4i32 (int_x86_sse2_packssdw_128
1239 VR128:$src1,
1240 VR128:$src2)))]>;
Evan Cheng506d3df2006-03-29 23:07:14 +00001241def PACKSSDWrm : PDI<0x6B, MRMSrcReg, (ops VR128:$dst, VR128:$src1,
1242 i128mem:$src2),
Evan Cheng591f7402006-03-29 23:53:14 +00001243 "packssdw {$src2, $dst|$dst, $src2}",
1244 [(set VR128:$dst, (v4i32 (int_x86_sse2_packssdw_128
1245 VR128:$src1,
1246 (bc_v4i32 (loadv2i64 addr:$src2)))))]>;
Evan Cheng506d3df2006-03-29 23:07:14 +00001247def PACKUSWBrr : PDI<0x67, MRMSrcReg, (ops VR128:$dst, VR128:$src1,
1248 VR128:$src2),
1249 "packuswb {$src2, $dst|$dst, $src2}",
Evan Cheng591f7402006-03-29 23:53:14 +00001250 [(set VR128:$dst, (v8i16 (int_x86_sse2_packuswb_128
1251 VR128:$src1,
1252 VR128:$src2)))]>;
Evan Cheng506d3df2006-03-29 23:07:14 +00001253def PACKUSWBrm : PDI<0x67, MRMSrcReg, (ops VR128:$dst, VR128:$src1,
1254 i128mem:$src2),
1255 "packuswb {$src2, $dst|$dst, $src2}",
Evan Cheng591f7402006-03-29 23:53:14 +00001256 [(set VR128:$dst, (v8i16 (int_x86_sse2_packuswb_128
1257 VR128:$src1,
1258 (bc_v8i16 (loadv2i64 addr:$src2)))))]>;
Evan Cheng506d3df2006-03-29 23:07:14 +00001259}
1260
1261// Shuffle and unpack instructions
1262def PSHUFWrr : PSIi8<0x70, MRMDestReg,
1263 (ops VR64:$dst, VR64:$src1, i8imm:$src2),
1264 "pshufw {$src2, $src1, $dst|$dst, $src1, $src2}", []>;
1265def PSHUFWrm : PSIi8<0x70, MRMSrcMem,
1266 (ops VR64:$dst, i64mem:$src1, i8imm:$src2),
1267 "pshufw {$src2, $src1, $dst|$dst, $src1, $src2}", []>;
1268
1269def PSHUFDrr : PDIi8<0x70, MRMDestReg,
1270 (ops VR128:$dst, VR128:$src1, i8imm:$src2),
1271 "pshufd {$src2, $src1, $dst|$dst, $src1, $src2}",
1272 [(set VR128:$dst, (v4i32 (vector_shuffle
1273 VR128:$src1, (undef),
1274 PSHUFD_shuffle_mask:$src2)))]>;
1275def PSHUFDrm : PDIi8<0x70, MRMSrcMem,
1276 (ops VR128:$dst, i128mem:$src1, i8imm:$src2),
1277 "pshufd {$src2, $src1, $dst|$dst, $src1, $src2}",
1278 [(set VR128:$dst, (v4i32 (vector_shuffle
1279 (load addr:$src1), (undef),
1280 PSHUFD_shuffle_mask:$src2)))]>;
1281
1282// SSE2 with ImmT == Imm8 and XS prefix.
1283def PSHUFHWrr : Ii8<0x70, MRMDestReg,
1284 (ops VR128:$dst, VR128:$src1, i8imm:$src2),
1285 "pshufhw {$src2, $src1, $dst|$dst, $src1, $src2}",
1286 [(set VR128:$dst, (v8i16 (vector_shuffle
1287 VR128:$src1, (undef),
1288 PSHUFHW_shuffle_mask:$src2)))]>,
1289 XS, Requires<[HasSSE2]>;
1290def PSHUFHWrm : Ii8<0x70, MRMDestMem,
1291 (ops VR128:$dst, i128mem:$src1, i8imm:$src2),
1292 "pshufhw {$src2, $src1, $dst|$dst, $src1, $src2}",
1293 [(set VR128:$dst, (v8i16 (vector_shuffle
1294 (bc_v8i16 (loadv2i64 addr:$src1)), (undef),
1295 PSHUFHW_shuffle_mask:$src2)))]>,
1296 XS, Requires<[HasSSE2]>;
1297
1298// SSE2 with ImmT == Imm8 and XD prefix.
1299def PSHUFLWrr : Ii8<0x70, MRMDestReg,
1300 (ops VR128:$dst, VR128:$src1, i32i8imm:$src2),
Evan Cheng7d9061e2006-03-30 19:54:57 +00001301 "pshuflw {$src2, $src1, $dst|$dst, $src1, $src2}",
Evan Cheng506d3df2006-03-29 23:07:14 +00001302 [(set VR128:$dst, (v8i16 (vector_shuffle
1303 VR128:$src1, (undef),
1304 PSHUFLW_shuffle_mask:$src2)))]>,
1305 XD, Requires<[HasSSE2]>;
1306def PSHUFLWrm : Ii8<0x70, MRMDestMem,
1307 (ops VR128:$dst, i128mem:$src1, i32i8imm:$src2),
Evan Cheng7d9061e2006-03-30 19:54:57 +00001308 "pshuflw {$src2, $src1, $dst|$dst, $src1, $src2}",
Evan Cheng506d3df2006-03-29 23:07:14 +00001309 [(set VR128:$dst, (v8i16 (vector_shuffle
1310 (bc_v8i16 (loadv2i64 addr:$src1)), (undef),
1311 PSHUFLW_shuffle_mask:$src2)))]>,
1312 XD, Requires<[HasSSE2]>;
1313
1314let isTwoAddress = 1 in {
Evan Chengc60bd972006-03-25 09:37:23 +00001315def PUNPCKLBWrr : PDI<0x60, MRMSrcReg,
1316 (ops VR128:$dst, VR128:$src1, VR128:$src2),
1317 "punpcklbw {$src2, $dst|$dst, $src2}",
Evan Cheng0038e592006-03-28 00:39:58 +00001318 [(set VR128:$dst,
1319 (v16i8 (vector_shuffle VR128:$src1, VR128:$src2,
1320 UNPCKL_shuffle_mask)))]>;
Evan Chengc60bd972006-03-25 09:37:23 +00001321def PUNPCKLBWrm : PDI<0x60, MRMSrcMem,
1322 (ops VR128:$dst, VR128:$src1, i128mem:$src2),
1323 "punpcklbw {$src2, $dst|$dst, $src2}",
Evan Cheng0038e592006-03-28 00:39:58 +00001324 [(set VR128:$dst,
1325 (v16i8 (vector_shuffle VR128:$src1, (load addr:$src2),
1326 UNPCKL_shuffle_mask)))]>;
Evan Chengc60bd972006-03-25 09:37:23 +00001327def PUNPCKLWDrr : PDI<0x61, MRMSrcReg,
1328 (ops VR128:$dst, VR128:$src1, VR128:$src2),
1329 "punpcklwd {$src2, $dst|$dst, $src2}",
Evan Cheng0038e592006-03-28 00:39:58 +00001330 [(set VR128:$dst,
1331 (v8i16 (vector_shuffle VR128:$src1, VR128:$src2,
1332 UNPCKL_shuffle_mask)))]>;
Evan Chengc60bd972006-03-25 09:37:23 +00001333def PUNPCKLWDrm : PDI<0x61, MRMSrcMem,
1334 (ops VR128:$dst, VR128:$src1, i128mem:$src2),
1335 "punpcklwd {$src2, $dst|$dst, $src2}",
Evan Cheng0038e592006-03-28 00:39:58 +00001336 [(set VR128:$dst,
1337 (v8i16 (vector_shuffle VR128:$src1, (load addr:$src2),
1338 UNPCKL_shuffle_mask)))]>;
Evan Chengc60bd972006-03-25 09:37:23 +00001339def PUNPCKLDQrr : PDI<0x62, MRMSrcReg,
1340 (ops VR128:$dst, VR128:$src1, VR128:$src2),
1341 "punpckldq {$src2, $dst|$dst, $src2}",
Evan Cheng0038e592006-03-28 00:39:58 +00001342 [(set VR128:$dst,
1343 (v4i32 (vector_shuffle VR128:$src1, VR128:$src2,
1344 UNPCKL_shuffle_mask)))]>;
Evan Chengc60bd972006-03-25 09:37:23 +00001345def PUNPCKLDQrm : PDI<0x62, MRMSrcMem,
1346 (ops VR128:$dst, VR128:$src1, i128mem:$src2),
1347 "punpckldq {$src2, $dst|$dst, $src2}",
Evan Cheng0038e592006-03-28 00:39:58 +00001348 [(set VR128:$dst,
1349 (v4i32 (vector_shuffle VR128:$src1, (load addr:$src2),
1350 UNPCKL_shuffle_mask)))]>;
Evan Chengc60bd972006-03-25 09:37:23 +00001351def PUNPCKLQDQrr : PDI<0x6C, MRMSrcReg,
1352 (ops VR128:$dst, VR128:$src1, VR128:$src2),
Evan Cheng4fcb9222006-03-28 02:43:26 +00001353 "punpcklqdq {$src2, $dst|$dst, $src2}",
1354 [(set VR128:$dst,
1355 (v2i64 (vector_shuffle VR128:$src1, VR128:$src2,
1356 UNPCKL_shuffle_mask)))]>;
Evan Chengc60bd972006-03-25 09:37:23 +00001357def PUNPCKLQDQrm : PDI<0x6C, MRMSrcMem,
1358 (ops VR128:$dst, VR128:$src1, i128mem:$src2),
Evan Cheng4fcb9222006-03-28 02:43:26 +00001359 "punpcklqdq {$src2, $dst|$dst, $src2}",
1360 [(set VR128:$dst,
1361 (v2i64 (vector_shuffle VR128:$src1, (load addr:$src2),
1362 UNPCKL_shuffle_mask)))]>;
Evan Chengc60bd972006-03-25 09:37:23 +00001363
1364def PUNPCKHBWrr : PDI<0x68, MRMSrcReg,
1365 (ops VR128:$dst, VR128:$src1, VR128:$src2),
Evan Cheng4fcb9222006-03-28 02:43:26 +00001366 "punpckhbw {$src2, $dst|$dst, $src2}",
1367 [(set VR128:$dst,
1368 (v16i8 (vector_shuffle VR128:$src1, VR128:$src2,
1369 UNPCKH_shuffle_mask)))]>;
Evan Chengc60bd972006-03-25 09:37:23 +00001370def PUNPCKHBWrm : PDI<0x68, MRMSrcMem,
1371 (ops VR128:$dst, VR128:$src1, i128mem:$src2),
Evan Cheng4fcb9222006-03-28 02:43:26 +00001372 "punpckhbw {$src2, $dst|$dst, $src2}",
1373 [(set VR128:$dst,
1374 (v16i8 (vector_shuffle VR128:$src1, (load addr:$src2),
1375 UNPCKH_shuffle_mask)))]>;
Evan Chengc60bd972006-03-25 09:37:23 +00001376def PUNPCKHWDrr : PDI<0x69, MRMSrcReg,
1377 (ops VR128:$dst, VR128:$src1, VR128:$src2),
Evan Cheng4fcb9222006-03-28 02:43:26 +00001378 "punpckhwd {$src2, $dst|$dst, $src2}",
1379 [(set VR128:$dst,
1380 (v8i16 (vector_shuffle VR128:$src1, VR128:$src2,
1381 UNPCKH_shuffle_mask)))]>;
Evan Chengc60bd972006-03-25 09:37:23 +00001382def PUNPCKHWDrm : PDI<0x69, MRMSrcMem,
1383 (ops VR128:$dst, VR128:$src1, i128mem:$src2),
Evan Cheng4fcb9222006-03-28 02:43:26 +00001384 "punpckhwd {$src2, $dst|$dst, $src2}",
1385 [(set VR128:$dst,
1386 (v8i16 (vector_shuffle VR128:$src1, (load addr:$src2),
1387 UNPCKH_shuffle_mask)))]>;
Evan Chengc60bd972006-03-25 09:37:23 +00001388def PUNPCKHDQrr : PDI<0x6A, MRMSrcReg,
1389 (ops VR128:$dst, VR128:$src1, VR128:$src2),
Evan Cheng4fcb9222006-03-28 02:43:26 +00001390 "punpckhdq {$src2, $dst|$dst, $src2}",
1391 [(set VR128:$dst,
1392 (v4i32 (vector_shuffle VR128:$src1, VR128:$src2,
1393 UNPCKH_shuffle_mask)))]>;
Evan Chengc60bd972006-03-25 09:37:23 +00001394def PUNPCKHDQrm : PDI<0x6A, MRMSrcMem,
1395 (ops VR128:$dst, VR128:$src1, i128mem:$src2),
Evan Cheng4fcb9222006-03-28 02:43:26 +00001396 "punpckhdq {$src2, $dst|$dst, $src2}",
1397 [(set VR128:$dst,
1398 (v4i32 (vector_shuffle VR128:$src1, (load addr:$src2),
1399 UNPCKH_shuffle_mask)))]>;
Evan Chengc60bd972006-03-25 09:37:23 +00001400def PUNPCKHQDQrr : PDI<0x6D, MRMSrcReg,
1401 (ops VR128:$dst, VR128:$src1, VR128:$src2),
Evan Cheng4fcb9222006-03-28 02:43:26 +00001402 "punpckhdq {$src2, $dst|$dst, $src2}",
1403 [(set VR128:$dst,
1404 (v2i64 (vector_shuffle VR128:$src1, VR128:$src2,
1405 UNPCKH_shuffle_mask)))]>;
Evan Chengc60bd972006-03-25 09:37:23 +00001406def PUNPCKHQDQrm : PDI<0x6D, MRMSrcMem,
1407 (ops VR128:$dst, VR128:$src1, i128mem:$src2),
Evan Cheng4fcb9222006-03-28 02:43:26 +00001408 "punpckhqdq {$src2, $dst|$dst, $src2}",
1409 [(set VR128:$dst,
1410 (v2i64 (vector_shuffle VR128:$src1, (load addr:$src2),
1411 UNPCKH_shuffle_mask)))]>;
Evan Chenga971f6f2006-03-23 01:57:24 +00001412}
Evan Cheng82521dd2006-03-21 07:09:35 +00001413
Evan Chengb067a1e2006-03-31 19:22:53 +00001414// Extract / Insert
1415def PEXTRWrr : PDIi8<0xC5, MRMSrcReg,
1416 (ops R32:$dst, VR128:$src1, i32i8imm:$src2),
1417 "pextrw {$src2, $src1, $dst|$dst, $src1, $src2}",
1418 [(set R32:$dst, (X86pextrw (v8i16 VR128:$src1),
1419 (i32 imm:$src2)))]>;
1420def PEXTRWrm : PDIi8<0xC5, MRMSrcMem,
1421 (ops R32:$dst, i128mem:$src1, i32i8imm:$src2),
1422 "pextrw {$src2, $src1, $dst|$dst, $src1, $src2}",
1423 [(set R32:$dst, (X86pextrw (loadv8i16 addr:$src1),
1424 (i32 imm:$src2)))]>;
1425
1426let isTwoAddress = 1 in {
1427def PINSRWrr : PDIi8<0xC4, MRMSrcReg,
1428 (ops VR128:$dst, VR128:$src1, R32:$src2, i32i8imm:$src3),
1429 "pinsrw {$src3, $src2, $dst|$dst, $src2, $src3}",
Evan Cheng653159f2006-03-31 21:55:24 +00001430 [(set VR128:$dst, (v8i16 (X86pinsrw (v8i16 VR128:$src1),
1431 R32:$src2, (i32 imm:$src3))))]>;
Evan Chengb067a1e2006-03-31 19:22:53 +00001432def PINSRWrm : PDIi8<0xC4, MRMSrcMem,
1433 (ops VR128:$dst, VR128:$src1, i16mem:$src2, i32i8imm:$src3),
1434 "pinsrw {$src3, $src2, $dst|$dst, $src2, $src3}",
1435 [(set VR128:$dst,
Evan Cheng653159f2006-03-31 21:55:24 +00001436 (v8i16 (X86pinsrw (v8i16 VR128:$src1),
Evan Chengb067a1e2006-03-31 19:22:53 +00001437 (i32 (anyext (loadi16 addr:$src2))),
1438 (i32 imm:$src3))))]>;
1439}
1440
Evan Cheng82521dd2006-03-21 07:09:35 +00001441//===----------------------------------------------------------------------===//
Evan Chengc653d482006-03-24 22:28:37 +00001442// Miscellaneous Instructions
1443//===----------------------------------------------------------------------===//
1444
Evan Chengc5fb2b12006-03-30 00:33:26 +00001445// Mask creation
1446def MOVMSKPSrr : PSI<0x50, MRMSrcReg, (ops R32:$dst, VR128:$src),
1447 "movmskps {$src, $dst|$dst, $src}",
1448 [(set R32:$dst, (int_x86_sse_movmsk_ps VR128:$src))]>;
1449def MOVMSKPDrr : PSI<0x50, MRMSrcReg, (ops R32:$dst, VR128:$src),
1450 "movmskpd {$src, $dst|$dst, $src}",
1451 [(set R32:$dst, (int_x86_sse2_movmskpd VR128:$src))]>;
1452
1453def PMOVMSKBrr : PDI<0xD7, MRMSrcReg, (ops R32:$dst, VR128:$src),
1454 "pmovmskb {$src, $dst|$dst, $src}",
1455 [(set R32:$dst, (int_x86_sse2_pmovmskb_128 VR128:$src))]>;
1456
Evan Chengecac9cb2006-03-25 06:03:26 +00001457// Prefetching loads
1458def PREFETCHT0 : I<0x18, MRM1m, (ops i8mem:$src),
1459 "prefetcht0 $src", []>, TB,
1460 Requires<[HasSSE1]>;
1461def PREFETCHT1 : I<0x18, MRM2m, (ops i8mem:$src),
1462 "prefetcht0 $src", []>, TB,
1463 Requires<[HasSSE1]>;
1464def PREFETCHT2 : I<0x18, MRM3m, (ops i8mem:$src),
1465 "prefetcht0 $src", []>, TB,
1466 Requires<[HasSSE1]>;
1467def PREFETCHTNTA : I<0x18, MRM0m, (ops i8mem:$src),
1468 "prefetcht0 $src", []>, TB,
1469 Requires<[HasSSE1]>;
1470
1471// Non-temporal stores
1472def MOVNTQ : I<0xE7, MRMDestMem, (ops i64mem:$dst, VR64:$src),
1473 "movntq {$src, $dst|$dst, $src}", []>, TB,
1474 Requires<[HasSSE1]>;
1475def MOVNTPS : I<0x2B, MRMDestMem, (ops i128mem:$dst, VR128:$src),
1476 "movntps {$src, $dst|$dst, $src}", []>, TB,
1477 Requires<[HasSSE1]>;
1478def MASKMOVQ : I<0xF7, MRMDestMem, (ops i64mem:$dst, VR64:$src),
1479 "maskmovq {$src, $dst|$dst, $src}", []>, TB,
1480 Requires<[HasSSE1]>;
1481
1482// Store fence
1483def SFENCE : I<0xAE, MRM7m, (ops),
1484 "sfence", []>, TB, Requires<[HasSSE1]>;
1485
1486// Load MXCSR register
Evan Chengc653d482006-03-24 22:28:37 +00001487def LDMXCSR : I<0xAE, MRM2m, (ops i32mem:$src),
1488 "ldmxcsr {$src|$src}", []>, TB, Requires<[HasSSE1]>;
1489
1490//===----------------------------------------------------------------------===//
Evan Cheng82521dd2006-03-21 07:09:35 +00001491// Alias Instructions
1492//===----------------------------------------------------------------------===//
1493
Evan Chengffea91e2006-03-26 09:53:12 +00001494// Alias instructions that map zero vector to pxor / xorp* for sse.
Evan Cheng386031a2006-03-24 07:29:27 +00001495// FIXME: remove when we can teach regalloc that xor reg, reg is ok.
Evan Chengffea91e2006-03-26 09:53:12 +00001496def V_SET0_PI : PDI<0xEF, MRMInitReg, (ops VR128:$dst),
1497 "pxor $dst, $dst",
1498 [(set VR128:$dst, (v2i64 immAllZerosV))]>;
1499def V_SET0_PS : PSI<0x57, MRMInitReg, (ops VR128:$dst),
1500 "xorps $dst, $dst",
1501 [(set VR128:$dst, (v4f32 immAllZerosV))]>;
1502def V_SET0_PD : PDI<0x57, MRMInitReg, (ops VR128:$dst),
1503 "xorpd $dst, $dst",
1504 [(set VR128:$dst, (v2f64 immAllZerosV))]>;
Evan Cheng386031a2006-03-24 07:29:27 +00001505
Evan Chenga0b3afb2006-03-27 07:00:16 +00001506def V_SETALLONES : PDI<0x76, MRMInitReg, (ops VR128:$dst),
1507 "pcmpeqd $dst, $dst",
1508 [(set VR128:$dst, (v2f64 immAllOnesV))]>;
1509
Evan Cheng11e15b32006-04-03 20:53:28 +00001510// FR32 / FR64 to 128-bit vector conversion.
1511def MOVSS2PSrr : SSI<0x10, MRMSrcReg, (ops VR128:$dst, FR32:$src),
1512 "movss {$src, $dst|$dst, $src}",
1513 [(set VR128:$dst,
1514 (v4f32 (scalar_to_vector FR32:$src)))]>;
1515def MOVSS2PSrm : SSI<0x10, MRMSrcMem, (ops VR128:$dst, f32mem:$src),
1516 "movss {$src, $dst|$dst, $src}",
1517 [(set VR128:$dst,
1518 (v4f32 (scalar_to_vector (loadf32 addr:$src))))]>;
1519def MOVSD2PDrr : SDI<0x10, MRMSrcReg, (ops VR128:$dst, FR64:$src),
1520 "movsd {$src, $dst|$dst, $src}",
1521 [(set VR128:$dst,
1522 (v2f64 (scalar_to_vector FR64:$src)))]>;
1523def MOVSD2PDrm : SDI<0x10, MRMSrcMem, (ops VR128:$dst, f64mem:$src),
1524 "movsd {$src, $dst|$dst, $src}",
1525 [(set VR128:$dst,
1526 (v2f64 (scalar_to_vector (loadf64 addr:$src))))]>;
1527
1528def MOVDI2PDIrr : PDI<0x6E, MRMSrcReg, (ops VR128:$dst, R32:$src),
1529 "movd {$src, $dst|$dst, $src}",
1530 [(set VR128:$dst,
1531 (v4i32 (scalar_to_vector R32:$src)))]>;
1532def MOVDI2PDIrm : PDI<0x6E, MRMSrcMem, (ops VR128:$dst, i32mem:$src),
1533 "movd {$src, $dst|$dst, $src}",
1534 [(set VR128:$dst,
1535 (v4i32 (scalar_to_vector (loadi32 addr:$src))))]>;
1536// SSE2 instructions with XS prefix
1537def MOVQI2PQIrr : I<0x7E, MRMSrcReg, (ops VR128:$dst, VR64:$src),
1538 "movq {$src, $dst|$dst, $src}",
1539 [(set VR128:$dst,
1540 (v2i64 (scalar_to_vector VR64:$src)))]>, XS,
1541 Requires<[HasSSE2]>;
1542def MOVQI2PQIrm : I<0x7E, MRMSrcMem, (ops VR128:$dst, i64mem:$src),
1543 "movq {$src, $dst|$dst, $src}",
1544 [(set VR128:$dst,
1545 (v2i64 (scalar_to_vector (loadi64 addr:$src))))]>, XS,
1546 Requires<[HasSSE2]>;
1547// FIXME: may not be able to eliminate this movss with coalescing the src and
1548// dest register classes are different. We really want to write this pattern
1549// like this:
1550// def : Pat<(f32 (vector_extract (v4f32 VR128:$src), (i32 0))),
1551// (f32 FR32:$src)>;
1552def MOVPS2SSrr : SSI<0x10, MRMSrcReg, (ops FR32:$dst, VR128:$src),
1553 "movss {$src, $dst|$dst, $src}",
1554 [(set FR32:$dst, (vector_extract (v4f32 VR128:$src),
1555 (i32 0)))]>;
1556def MOVPS2SSmr : SSI<0x10, MRMDestMem, (ops f32mem:$dst, VR128:$src),
1557 "movss {$src, $dst|$dst, $src}",
1558 [(store (f32 (vector_extract (v4f32 VR128:$src),
1559 (i32 0))), addr:$dst)]>;
1560def MOVPD2SDrr : SDI<0x10, MRMSrcReg, (ops FR64:$dst, VR128:$src),
1561 "movsd {$src, $dst|$dst, $src}",
1562 [(set FR64:$dst, (vector_extract (v2f64 VR128:$src),
1563 (i32 0)))]>;
1564def MOVPD2SDmr : SDI<0x10, MRMDestMem, (ops f64mem:$dst, VR128:$src),
1565 "movsd {$src, $dst|$dst, $src}",
1566 [(store (f64 (vector_extract (v2f64 VR128:$src),
1567 (i32 0))), addr:$dst)]>;
1568def MOVPDI2DIrr : PDI<0x7E, MRMSrcReg, (ops R32:$dst, VR128:$src),
1569 "movd {$src, $dst|$dst, $src}",
1570 [(set R32:$dst, (vector_extract (v4i32 VR128:$src),
1571 (i32 0)))]>;
1572def MOVPDI2DImr : PDI<0x7E, MRMDestMem, (ops i32mem:$dst, VR128:$src),
1573 "movd {$src, $dst|$dst, $src}",
1574 [(store (i32 (vector_extract (v4i32 VR128:$src),
1575 (i32 0))), addr:$dst)]>;
1576
1577// Move to lower bits of a VR128, leaving upper bits alone.
Evan Chengbc4832b2006-03-24 23:15:12 +00001578// Three operand (but two address) aliases.
1579let isTwoAddress = 1 in {
Evan Cheng11e15b32006-04-03 20:53:28 +00001580def MOVLSS2PSrr : SSI<0x10, MRMSrcReg, (ops VR128:$dst, VR128:$src1, FR32:$src2),
Evan Chengbc4832b2006-03-24 23:15:12 +00001581 "movss {$src2, $dst|$dst, $src2}", []>;
Evan Cheng11e15b32006-04-03 20:53:28 +00001582def MOVLSD2PDrr : SDI<0x10, MRMSrcReg, (ops VR128:$dst, VR128:$src1, FR64:$src2),
Evan Chengbc4832b2006-03-24 23:15:12 +00001583 "movsd {$src2, $dst|$dst, $src2}", []>;
Evan Cheng11e15b32006-04-03 20:53:28 +00001584def MOVLDI2PDIrr : PDI<0x6E, MRMSrcReg, (ops VR128:$dst, VR128:$src1, R32:$src2),
Evan Chengbc4832b2006-03-24 23:15:12 +00001585 "movd {$src2, $dst|$dst, $src2}", []>;
Evan Chengbc4832b2006-03-24 23:15:12 +00001586}
Evan Cheng82521dd2006-03-21 07:09:35 +00001587
Evan Cheng11e15b32006-04-03 20:53:28 +00001588// Move to lower bits of a VR128 and zeroing upper bits.
Evan Chengbc4832b2006-03-24 23:15:12 +00001589// Loading from memory automatically zeroing upper bits.
Evan Cheng11e15b32006-04-03 20:53:28 +00001590def MOVZSS2PSrm : SSI<0x10, MRMSrcMem, (ops VR128:$dst, f32mem:$src),
Evan Chengbc4832b2006-03-24 23:15:12 +00001591 "movss {$src, $dst|$dst, $src}",
Evan Cheng82521dd2006-03-21 07:09:35 +00001592 [(set VR128:$dst,
Evan Chengbc4832b2006-03-24 23:15:12 +00001593 (v4f32 (X86zexts2vec (loadf32 addr:$src))))]>;
Evan Cheng11e15b32006-04-03 20:53:28 +00001594def MOVZSD2PDrm : SDI<0x10, MRMSrcMem, (ops VR128:$dst, f64mem:$src),
Evan Chengbc4832b2006-03-24 23:15:12 +00001595 "movsd {$src, $dst|$dst, $src}",
1596 [(set VR128:$dst,
1597 (v2f64 (X86zexts2vec (loadf64 addr:$src))))]>;
Evan Cheng11e15b32006-04-03 20:53:28 +00001598def MOVZDI2PDIrm : PDI<0x6E, MRMSrcMem, (ops VR128:$dst, i32mem:$src),
1599 "movd {$src, $dst|$dst, $src}",
1600 [(set VR128:$dst,
1601 (v4i32 (X86zexts2vec (loadi32 addr:$src))))]>;
1602def MOVZQI2PQIrm : PDI<0x7E, MRMSrcMem, (ops VR128:$dst, i64mem:$src),
1603 "movd {$src, $dst|$dst, $src}",
1604 [(set VR128:$dst,
1605 (v2i64 (X86zexts2vec (loadi64 addr:$src))))]>;
Evan Cheng48090aa2006-03-21 23:01:21 +00001606
1607//===----------------------------------------------------------------------===//
1608// Non-Instruction Patterns
1609//===----------------------------------------------------------------------===//
1610
1611// 128-bit vector undef's.
1612def : Pat<(v2f64 (undef)), (IMPLICIT_DEF_VR128)>, Requires<[HasSSE2]>;
1613def : Pat<(v16i8 (undef)), (IMPLICIT_DEF_VR128)>, Requires<[HasSSE2]>;
1614def : Pat<(v8i16 (undef)), (IMPLICIT_DEF_VR128)>, Requires<[HasSSE2]>;
1615def : Pat<(v4i32 (undef)), (IMPLICIT_DEF_VR128)>, Requires<[HasSSE2]>;
1616def : Pat<(v2i64 (undef)), (IMPLICIT_DEF_VR128)>, Requires<[HasSSE2]>;
1617
Evan Chengffea91e2006-03-26 09:53:12 +00001618// 128-bit vector all zero's.
1619def : Pat<(v16i8 immAllZerosV), (v16i8 (V_SET0_PI))>, Requires<[HasSSE2]>;
1620def : Pat<(v8i16 immAllZerosV), (v8i16 (V_SET0_PI))>, Requires<[HasSSE2]>;
1621def : Pat<(v4i32 immAllZerosV), (v4i32 (V_SET0_PI))>, Requires<[HasSSE2]>;
1622
Evan Chenga0b3afb2006-03-27 07:00:16 +00001623// 128-bit vector all one's.
1624def : Pat<(v16i8 immAllOnesV), (v16i8 (V_SETALLONES))>, Requires<[HasSSE2]>;
1625def : Pat<(v8i16 immAllOnesV), (v8i16 (V_SETALLONES))>, Requires<[HasSSE2]>;
1626def : Pat<(v4i32 immAllOnesV), (v4i32 (V_SETALLONES))>, Requires<[HasSSE2]>;
1627def : Pat<(v2i64 immAllOnesV), (v2i64 (V_SETALLONES))>, Requires<[HasSSE2]>;
1628def : Pat<(v4f32 immAllOnesV), (v4f32 (V_SETALLONES))>, Requires<[HasSSE1]>;
1629
Evan Chenga971f6f2006-03-23 01:57:24 +00001630// Load 128-bit integer vector values.
Evan Cheng24dc1f52006-03-23 07:44:07 +00001631def : Pat<(v16i8 (load addr:$src)), (MOVDQArm addr:$src)>,
Evan Chengffea91e2006-03-26 09:53:12 +00001632 Requires<[HasSSE2]>;
Evan Cheng24dc1f52006-03-23 07:44:07 +00001633def : Pat<(v8i16 (load addr:$src)), (MOVDQArm addr:$src)>,
Evan Chengffea91e2006-03-26 09:53:12 +00001634 Requires<[HasSSE2]>;
Evan Cheng24dc1f52006-03-23 07:44:07 +00001635def : Pat<(v4i32 (load addr:$src)), (MOVDQArm addr:$src)>,
Evan Chengffea91e2006-03-26 09:53:12 +00001636 Requires<[HasSSE2]>;
Evan Cheng24dc1f52006-03-23 07:44:07 +00001637def : Pat<(v2i64 (load addr:$src)), (MOVDQArm addr:$src)>,
Evan Chengffea91e2006-03-26 09:53:12 +00001638 Requires<[HasSSE2]>;
Evan Chenga971f6f2006-03-23 01:57:24 +00001639
Evan Cheng48090aa2006-03-21 23:01:21 +00001640// Store 128-bit integer vector values.
Evan Cheng24dc1f52006-03-23 07:44:07 +00001641def : Pat<(store (v16i8 VR128:$src), addr:$dst),
Evan Chengffea91e2006-03-26 09:53:12 +00001642 (MOVDQAmr addr:$dst, VR128:$src)>, Requires<[HasSSE2]>;
Evan Cheng24dc1f52006-03-23 07:44:07 +00001643def : Pat<(store (v8i16 VR128:$src), addr:$dst),
Evan Chengffea91e2006-03-26 09:53:12 +00001644 (MOVDQAmr addr:$dst, VR128:$src)>, Requires<[HasSSE2]>;
Evan Cheng24dc1f52006-03-23 07:44:07 +00001645def : Pat<(store (v4i32 VR128:$src), addr:$dst),
Evan Chengffea91e2006-03-26 09:53:12 +00001646 (MOVDQAmr addr:$dst, VR128:$src)>, Requires<[HasSSE2]>;
Evan Cheng24dc1f52006-03-23 07:44:07 +00001647def : Pat<(store (v2i64 VR128:$src), addr:$dst),
1648 (MOVDQAmr addr:$dst, VR128:$src)>, Requires<[HasSSE2]>;
Evan Cheng48090aa2006-03-21 23:01:21 +00001649
1650// Scalar to v8i16 / v16i8. The source may be a R32, but only the lower 8 or
1651// 16-bits matter.
Evan Cheng11e15b32006-04-03 20:53:28 +00001652def : Pat<(v8i16 (X86s2vec R32:$src)), (MOVDI2PDIrr R32:$src)>,
Evan Chengffea91e2006-03-26 09:53:12 +00001653 Requires<[HasSSE2]>;
Evan Cheng11e15b32006-04-03 20:53:28 +00001654def : Pat<(v16i8 (X86s2vec R32:$src)), (MOVDI2PDIrr R32:$src)>,
Evan Chengffea91e2006-03-26 09:53:12 +00001655 Requires<[HasSSE2]>;
Evan Cheng48090aa2006-03-21 23:01:21 +00001656
Evan Cheng2c0dbd02006-03-24 02:58:06 +00001657// bit_convert
Evan Cheng475aecf2006-03-29 03:04:49 +00001658def : Pat<(v2i64 (bitconvert (v4i32 VR128:$src))), (v2i64 VR128:$src)>,
1659 Requires<[HasSSE2]>;
Evan Cheng506d3df2006-03-29 23:07:14 +00001660def : Pat<(v2i64 (bitconvert (v8i16 VR128:$src))), (v2i64 VR128:$src)>,
1661 Requires<[HasSSE2]>;
1662def : Pat<(v2i64 (bitconvert (v16i8 VR128:$src))), (v2i64 VR128:$src)>,
1663 Requires<[HasSSE2]>;
1664def : Pat<(v4i32 (bitconvert (v2i64 VR128:$src))), (v4i32 VR128:$src)>,
1665 Requires<[HasSSE2]>;
1666def : Pat<(v4i32 (bitconvert (v8i16 VR128:$src))), (v4i32 VR128:$src)>,
1667 Requires<[HasSSE2]>;
1668def : Pat<(v4i32 (bitconvert (v16i8 VR128:$src))), (v4i32 VR128:$src)>,
1669 Requires<[HasSSE2]>;
1670def : Pat<(v8i16 (bitconvert (v2i64 VR128:$src))), (v4i32 VR128:$src)>,
1671 Requires<[HasSSE2]>;
1672def : Pat<(v8i16 (bitconvert (v4i32 VR128:$src))), (v4i32 VR128:$src)>,
1673 Requires<[HasSSE2]>;
1674def : Pat<(v8i16 (bitconvert (v16i8 VR128:$src))), (v4i32 VR128:$src)>,
1675 Requires<[HasSSE2]>;
1676def : Pat<(v16i8 (bitconvert (v2i64 VR128:$src))), (v4i32 VR128:$src)>,
1677 Requires<[HasSSE2]>;
1678def : Pat<(v16i8 (bitconvert (v4i32 VR128:$src))), (v4i32 VR128:$src)>,
1679 Requires<[HasSSE2]>;
1680def : Pat<(v16i8 (bitconvert (v8i16 VR128:$src))), (v4i32 VR128:$src)>,
1681 Requires<[HasSSE2]>;
1682
Evan Chengffea91e2006-03-26 09:53:12 +00001683def : Pat<(v4i32 (bitconvert (v4f32 VR128:$src))), (v4i32 VR128:$src)>,
1684 Requires<[HasSSE2]>;
1685def : Pat<(v4f32 (bitconvert (v4i32 VR128:$src))), (v4f32 VR128:$src)>,
1686 Requires<[HasSSE2]>;
Evan Chengb9df0ca2006-03-22 02:53:00 +00001687
Evan Chengbc4832b2006-03-24 23:15:12 +00001688// Zeroing a VR128 then do a MOVS* to the lower bits.
1689def : Pat<(v2f64 (X86zexts2vec FR64:$src)),
Evan Cheng11e15b32006-04-03 20:53:28 +00001690 (MOVLSD2PDrr (V_SET0_PD), FR64:$src)>, Requires<[HasSSE2]>;
Evan Chengbc4832b2006-03-24 23:15:12 +00001691def : Pat<(v4f32 (X86zexts2vec FR32:$src)),
Evan Cheng11e15b32006-04-03 20:53:28 +00001692 (MOVLSS2PSrr (V_SET0_PS), FR32:$src)>, Requires<[HasSSE2]>;
Evan Chengbc4832b2006-03-24 23:15:12 +00001693def : Pat<(v4i32 (X86zexts2vec R32:$src)),
Evan Cheng11e15b32006-04-03 20:53:28 +00001694 (MOVLDI2PDIrr (V_SET0_PI), R32:$src)>, Requires<[HasSSE2]>;
Evan Chengbc4832b2006-03-24 23:15:12 +00001695def : Pat<(v8i16 (X86zexts2vec R16:$src)),
Evan Cheng11e15b32006-04-03 20:53:28 +00001696 (MOVLDI2PDIrr (V_SET0_PI), (MOVZX32rr16 R16:$src))>, Requires<[HasSSE2]>;
Evan Chengbc4832b2006-03-24 23:15:12 +00001697def : Pat<(v16i8 (X86zexts2vec R8:$src)),
Evan Cheng11e15b32006-04-03 20:53:28 +00001698 (MOVLDI2PDIrr (V_SET0_PI), (MOVZX32rr8 R8:$src))>, Requires<[HasSSE2]>;
Evan Chengbc4832b2006-03-24 23:15:12 +00001699
Evan Chengb9df0ca2006-03-22 02:53:00 +00001700// Splat v2f64 / v2i64
Evan Cheng691c9232006-03-29 19:02:40 +00001701def : Pat<(vector_shuffle (v2f64 VR128:$src), (undef), SSE_splat_mask:$sm),
1702 (v2f64 (UNPCKLPDrr VR128:$src, VR128:$src))>, Requires<[HasSSE2]>;
1703def : Pat<(vector_shuffle (v2i64 VR128:$src), (undef), SSE_splat_mask:$sm),
Evan Cheng475aecf2006-03-29 03:04:49 +00001704 (v2i64 (PUNPCKLQDQrr VR128:$src, VR128:$src))>, Requires<[HasSSE2]>;
1705
Evan Cheng691c9232006-03-29 19:02:40 +00001706// Splat v4f32
1707def : Pat<(vector_shuffle (v4f32 VR128:$src), (undef), SSE_splat_mask:$sm),
1708 (v4f32 (SHUFPSrr VR128:$src, VR128:$src, SSE_splat_mask:$sm))>,
1709 Requires<[HasSSE1]>;
1710
Evan Cheng7d9061e2006-03-30 19:54:57 +00001711// Shuffle v4i32 with SHUFP* if others do not match.
Evan Cheng475aecf2006-03-29 03:04:49 +00001712def : Pat<(vector_shuffle (v4i32 VR128:$src1), (v4i32 VR128:$src2),
Evan Cheng7d9061e2006-03-30 19:54:57 +00001713 SHUFP_int_shuffle_mask:$sm),
Evan Cheng475aecf2006-03-29 03:04:49 +00001714 (v4i32 (SHUFPSrr VR128:$src1, VR128:$src2,
Evan Cheng7d9061e2006-03-30 19:54:57 +00001715 SHUFP_int_shuffle_mask:$sm))>, Requires<[HasSSE2]>;
Evan Cheng475aecf2006-03-29 03:04:49 +00001716def : Pat<(vector_shuffle (v4i32 VR128:$src1), (load addr:$src2),
Evan Cheng7d9061e2006-03-30 19:54:57 +00001717 SHUFP_int_shuffle_mask:$sm),
Evan Cheng475aecf2006-03-29 03:04:49 +00001718 (v4i32 (SHUFPSrm VR128:$src1, addr:$src2,
Evan Cheng7d9061e2006-03-30 19:54:57 +00001719 SHUFP_int_shuffle_mask:$sm))>, Requires<[HasSSE2]>;
1720
1721// Shuffle v4f32 with PSHUF* if others do not match.
1722def : Pat<(vector_shuffle (v4f32 VR128:$src1), (undef),
1723 PSHUFD_fp_shuffle_mask:$sm),
1724 (v4f32 (PSHUFDrr VR128:$src1, PSHUFD_fp_shuffle_mask:$sm))>,
1725 Requires<[HasSSE2]>;
1726def : Pat<(vector_shuffle (loadv4f32 addr:$src1), (undef),
1727 PSHUFD_fp_shuffle_mask:$sm),
1728 (v4f32 (PSHUFDrm addr:$src1, PSHUFD_fp_shuffle_mask:$sm))>,
1729 Requires<[HasSSE2]>;
1730def : Pat<(vector_shuffle (v4f32 VR128:$src1), (undef),
1731 PSHUFHW_fp_shuffle_mask:$sm),
1732 (v4f32 (PSHUFHWrr VR128:$src1, PSHUFHW_fp_shuffle_mask:$sm))>,
1733 Requires<[HasSSE2]>;
1734def : Pat<(vector_shuffle (loadv4f32 addr:$src1), (undef),
1735 PSHUFHW_fp_shuffle_mask:$sm),
1736 (v4f32 (PSHUFHWrm addr:$src1, PSHUFHW_fp_shuffle_mask:$sm))>,
1737 Requires<[HasSSE2]>;
1738def : Pat<(vector_shuffle (v4f32 VR128:$src1), (undef),
1739 PSHUFLW_fp_shuffle_mask:$sm),
1740 (v4f32 (PSHUFLWrr VR128:$src1, PSHUFLW_fp_shuffle_mask:$sm))>,
1741 Requires<[HasSSE2]>;
1742def : Pat<(vector_shuffle (loadv4f32 addr:$src1), (undef),
1743 PSHUFLW_fp_shuffle_mask:$sm),
1744 (v4f32 (PSHUFLWrm addr:$src1, PSHUFLW_fp_shuffle_mask:$sm))>,
1745 Requires<[HasSSE2]>;
Evan Cheng1b32f222006-03-30 07:33:32 +00001746
1747// Logical ops
1748def : Pat<(and (bc_v4i32 (v4f32 VR128:$src1)), (loadv4i32 addr:$src2)),
1749 (ANDPSrm VR128:$src1, addr:$src2)>;
1750def : Pat<(and (bc_v2i64 (v2f64 VR128:$src1)), (loadv2i64 addr:$src2)),
1751 (ANDPDrm VR128:$src1, addr:$src2)>;
1752def : Pat<(or (bc_v4i32 (v4f32 VR128:$src1)), (loadv4i32 addr:$src2)),
1753 (ORPSrm VR128:$src1, addr:$src2)>;
1754def : Pat<(or (bc_v2i64 (v2f64 VR128:$src1)), (loadv2i64 addr:$src2)),
1755 (ORPDrm VR128:$src1, addr:$src2)>;
1756def : Pat<(xor (bc_v4i32 (v4f32 VR128:$src1)), (loadv4i32 addr:$src2)),
1757 (XORPSrm VR128:$src1, addr:$src2)>;
1758def : Pat<(xor (bc_v2i64 (v2f64 VR128:$src1)), (loadv2i64 addr:$src2)),
1759 (XORPDrm VR128:$src1, addr:$src2)>;
1760def : Pat<(and (vnot (bc_v4i32 (v4f32 VR128:$src1))), (loadv4i32 addr:$src2)),
1761 (ANDNPSrm VR128:$src1, addr:$src2)>;
1762def : Pat<(and (vnot (bc_v2i64 (v2f64 VR128:$src1))), (loadv2i64 addr:$src2)),
1763 (ANDNPDrm VR128:$src1, addr:$src2)>;
1764
1765def : Pat<(bc_v4f32 (v4i32 (and VR128:$src1, VR128:$src2))),
1766 (ANDPSrr VR128:$src1, VR128:$src2)>;
1767def : Pat<(bc_v4f32 (v4i32 (or VR128:$src1, VR128:$src2))),
1768 (ORPSrr VR128:$src1, VR128:$src2)>;
1769def : Pat<(bc_v4f32 (v4i32 (xor VR128:$src1, VR128:$src2))),
1770 (XORPSrr VR128:$src1, VR128:$src2)>;
1771def : Pat<(bc_v4f32 (v4i32 (and (vnot VR128:$src1), VR128:$src2))),
1772 (ANDNPSrr VR128:$src1, VR128:$src2)>;
1773
1774def : Pat<(bc_v4f32 (v4i32 (and VR128:$src1, (load addr:$src2)))),
1775 (ANDPSrm (v4i32 VR128:$src1), addr:$src2)>;
1776def : Pat<(bc_v4f32 (v4i32 (or VR128:$src1, (load addr:$src2)))),
1777 (ORPSrm VR128:$src1, addr:$src2)>;
1778def : Pat<(bc_v4f32 (v4i32 (xor VR128:$src1, (load addr:$src2)))),
1779 (XORPSrm VR128:$src1, addr:$src2)>;
1780def : Pat<(bc_v4f32 (v4i32 (and (vnot VR128:$src1), (load addr:$src2)))),
1781 (ANDNPSrm VR128:$src1, addr:$src2)>;
1782
1783def : Pat<(bc_v2f64 (v2i64 (and VR128:$src1, VR128:$src2))),
1784 (ANDPDrr VR128:$src1, VR128:$src2)>;
1785def : Pat<(bc_v2f64 (v2i64 (or VR128:$src1, VR128:$src2))),
1786 (ORPDrr VR128:$src1, VR128:$src2)>;
1787def : Pat<(bc_v2f64 (v2i64 (xor VR128:$src1, VR128:$src2))),
1788 (XORPDrr VR128:$src1, VR128:$src2)>;
1789def : Pat<(bc_v2f64 (v2i64 (and (vnot VR128:$src1), VR128:$src2))),
1790 (ANDNPDrr VR128:$src1, VR128:$src2)>;
1791
1792def : Pat<(bc_v2f64 (v2i64 (and VR128:$src1, (load addr:$src2)))),
1793 (ANDPSrm (v2i64 VR128:$src1), addr:$src2)>;
1794def : Pat<(bc_v2f64 (v2i64 (or VR128:$src1, (load addr:$src2)))),
1795 (ORPSrm VR128:$src1, addr:$src2)>;
1796def : Pat<(bc_v2f64 (v2i64 (xor VR128:$src1, (load addr:$src2)))),
1797 (XORPSrm VR128:$src1, addr:$src2)>;
1798def : Pat<(bc_v2f64 (v2i64 (and (vnot VR128:$src1), (load addr:$src2)))),
1799 (ANDNPSrm VR128:$src1, addr:$src2)>;
1800
1801def : Pat<(v4i32 (and VR128:$src1, VR128:$src2)),
1802 (PANDrr VR128:$src1, VR128:$src2)>;
1803def : Pat<(v8i16 (and VR128:$src1, VR128:$src2)),
1804 (PANDrr VR128:$src1, VR128:$src2)>;
1805def : Pat<(v16i8 (and VR128:$src1, VR128:$src2)),
1806 (PANDrr VR128:$src1, VR128:$src2)>;
1807def : Pat<(v4i32 (or VR128:$src1, VR128:$src2)),
1808 (PORrr VR128:$src1, VR128:$src2)>;
1809def : Pat<(v8i16 (or VR128:$src1, VR128:$src2)),
1810 (PORrr VR128:$src1, VR128:$src2)>;
1811def : Pat<(v16i8 (or VR128:$src1, VR128:$src2)),
1812 (PORrr VR128:$src1, VR128:$src2)>;
1813def : Pat<(v4i32 (xor VR128:$src1, VR128:$src2)),
1814 (PXORrr VR128:$src1, VR128:$src2)>;
1815def : Pat<(v8i16 (xor VR128:$src1, VR128:$src2)),
1816 (PXORrr VR128:$src1, VR128:$src2)>;
1817def : Pat<(v16i8 (xor VR128:$src1, VR128:$src2)),
1818 (PXORrr VR128:$src1, VR128:$src2)>;
1819def : Pat<(v4i32 (and (vnot VR128:$src1), VR128:$src2)),
1820 (PANDNrr VR128:$src1, VR128:$src2)>;
1821def : Pat<(v8i16 (and (vnot VR128:$src1), VR128:$src2)),
1822 (PANDNrr VR128:$src1, VR128:$src2)>;
1823def : Pat<(v16i8 (and (vnot VR128:$src1), VR128:$src2)),
1824 (PANDNrr VR128:$src1, VR128:$src2)>;
1825
1826def : Pat<(v4i32 (and VR128:$src1, (load addr:$src2))),
1827 (PANDrm VR128:$src1, addr:$src2)>;
1828def : Pat<(v8i16 (and VR128:$src1, (load addr:$src2))),
1829 (PANDrm VR128:$src1, addr:$src2)>;
1830def : Pat<(v16i8 (and VR128:$src1, (load addr:$src2))),
1831 (PANDrm VR128:$src1, addr:$src2)>;
1832def : Pat<(v4i32 (or VR128:$src1, (load addr:$src2))),
1833 (PORrm VR128:$src1, addr:$src2)>;
1834def : Pat<(v8i16 (or VR128:$src1, (load addr:$src2))),
1835 (PORrm VR128:$src1, addr:$src2)>;
1836def : Pat<(v16i8 (or VR128:$src1, (load addr:$src2))),
1837 (PORrm VR128:$src1, addr:$src2)>;
1838def : Pat<(v4i32 (xor VR128:$src1, (load addr:$src2))),
1839 (PXORrm VR128:$src1, addr:$src2)>;
1840def : Pat<(v8i16 (xor VR128:$src1, (load addr:$src2))),
1841 (PXORrm VR128:$src1, addr:$src2)>;
1842def : Pat<(v16i8 (xor VR128:$src1, (load addr:$src2))),
1843 (PXORrm VR128:$src1, addr:$src2)>;
1844def : Pat<(v4i32 (and (vnot VR128:$src1), (load addr:$src2))),
1845 (PANDNrm VR128:$src1, addr:$src2)>;
1846def : Pat<(v8i16 (and (vnot VR128:$src1), (load addr:$src2))),
1847 (PANDNrm VR128:$src1, addr:$src2)>;
1848def : Pat<(v16i8 (and (vnot VR128:$src1), (load addr:$src2))),
1849 (PANDNrm VR128:$src1, addr:$src2)>;