blob: 132da07a679c00556135e28d68c09dedd35da5f3 [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 Cheng2246f842006-03-18 01:23:20 +000030
Evan Chengc60bd972006-03-25 09:37:23 +000031def SDTUnpckl : SDTypeProfile<1, 2,
32 [SDTCisSameAs<0, 1>, SDTCisSameAs<1, 2>]>;
Evan Chengc60bd972006-03-25 09:37:23 +000033
Evan Cheng2246f842006-03-18 01:23:20 +000034//===----------------------------------------------------------------------===//
Evan Cheng06a8aa12006-03-17 19:55:52 +000035// SSE pattern fragments
36//===----------------------------------------------------------------------===//
37
38def X86loadpf32 : PatFrag<(ops node:$ptr), (f32 (X86loadp node:$ptr))>;
39def X86loadpf64 : PatFrag<(ops node:$ptr), (f64 (X86loadp node:$ptr))>;
40
Evan Cheng2246f842006-03-18 01:23:20 +000041def loadv4f32 : PatFrag<(ops node:$ptr), (v4f32 (load node:$ptr))>;
42def loadv2f64 : PatFrag<(ops node:$ptr), (v2f64 (load node:$ptr))>;
Evan Cheng24dc1f52006-03-23 07:44:07 +000043def loadv16i8 : PatFrag<(ops node:$ptr), (v16i8 (load node:$ptr))>;
44def loadv8i16 : PatFrag<(ops node:$ptr), (v8i16 (load node:$ptr))>;
45def loadv4i32 : PatFrag<(ops node:$ptr), (v4i32 (load node:$ptr))>;
46def loadv2i64 : PatFrag<(ops node:$ptr), (v2i64 (load node:$ptr))>;
Evan Cheng06a8aa12006-03-17 19:55:52 +000047
Evan Cheng506d3df2006-03-29 23:07:14 +000048def bc_v16i8 : PatFrag<(ops node:$in), (v16i8 (bitconvert node:$in))>;
49def bc_v8i16 : PatFrag<(ops node:$in), (v8i16 (bitconvert node:$in))>;
Evan Cheng5aa97b22006-03-29 18:47:40 +000050def bc_v4i32 : PatFrag<(ops node:$in), (v4i32 (bitconvert node:$in))>;
51def bc_v2i64 : PatFrag<(ops node:$in), (v2i64 (bitconvert node:$in))>;
52
Evan Cheng386031a2006-03-24 07:29:27 +000053def fp32imm0 : PatLeaf<(f32 fpimm), [{
54 return N->isExactlyValue(+0.0);
55}]>;
56
Evan Cheng63d33002006-03-22 08:01:21 +000057// SHUFFLE_get_shuf_imm xform function: convert vector_shuffle mask to PSHUF*,
58// SHUFP* etc. imm.
59def SHUFFLE_get_shuf_imm : SDNodeXForm<build_vector, [{
60 return getI8Imm(X86::getShuffleSHUFImmediate(N));
Evan Chengb9df0ca2006-03-22 02:53:00 +000061}]>;
62
Evan Cheng506d3df2006-03-29 23:07:14 +000063// SHUFFLE_get_pshufhw_imm xform function: convert vector_shuffle mask to
64// PSHUFHW imm.
65def SHUFFLE_get_pshufhw_imm : SDNodeXForm<build_vector, [{
66 return getI8Imm(X86::getShufflePSHUFHWImmediate(N));
67}]>;
68
69// SHUFFLE_get_pshuflw_imm xform function: convert vector_shuffle mask to
70// PSHUFLW imm.
71def SHUFFLE_get_pshuflw_imm : SDNodeXForm<build_vector, [{
72 return getI8Imm(X86::getShufflePSHUFLWImmediate(N));
73}]>;
74
Evan Cheng691c9232006-03-29 19:02:40 +000075def SSE_splat_mask : PatLeaf<(build_vector), [{
Evan Cheng0188ecb2006-03-22 18:59:22 +000076 return X86::isSplatMask(N);
Evan Cheng691c9232006-03-29 19:02:40 +000077}], SHUFFLE_get_shuf_imm>;
Evan Cheng0188ecb2006-03-22 18:59:22 +000078
Evan Cheng2064a2b2006-03-28 06:50:32 +000079def MOVLHPS_shuffle_mask : PatLeaf<(build_vector), [{
80 return X86::isMOVLHPSMask(N);
81}]>;
82
Evan Cheng2c0dbd02006-03-24 02:58:06 +000083def MOVHLPS_shuffle_mask : PatLeaf<(build_vector), [{
84 return X86::isMOVHLPSMask(N);
Evan Cheng4fcb9222006-03-28 02:43:26 +000085}]>;
Evan Cheng2c0dbd02006-03-24 02:58:06 +000086
Evan Cheng0038e592006-03-28 00:39:58 +000087def UNPCKL_shuffle_mask : PatLeaf<(build_vector), [{
88 return X86::isUNPCKLMask(N);
89}]>;
90
Evan Cheng4fcb9222006-03-28 02:43:26 +000091def UNPCKH_shuffle_mask : PatLeaf<(build_vector), [{
92 return X86::isUNPCKHMask(N);
93}]>;
94
Evan Cheng0188ecb2006-03-22 18:59:22 +000095def PSHUFD_shuffle_mask : PatLeaf<(build_vector), [{
Evan Cheng4f563382006-03-29 01:30:51 +000096 return X86::isPSHUFDMask(N);
Evan Cheng14aed5e2006-03-24 01:18:28 +000097}], SHUFFLE_get_shuf_imm>;
Evan Cheng0188ecb2006-03-22 18:59:22 +000098
Evan Cheng506d3df2006-03-29 23:07:14 +000099def PSHUFHW_shuffle_mask : PatLeaf<(build_vector), [{
100 return X86::isPSHUFHWMask(N);
101}], SHUFFLE_get_pshufhw_imm>;
102
103def PSHUFLW_shuffle_mask : PatLeaf<(build_vector), [{
104 return X86::isPSHUFLWMask(N);
105}], SHUFFLE_get_pshuflw_imm>;
106
Evan Cheng14aed5e2006-03-24 01:18:28 +0000107def SHUFP_shuffle_mask : PatLeaf<(build_vector), [{
108 return X86::isSHUFPMask(N);
109}], SHUFFLE_get_shuf_imm>;
Evan Chengb9df0ca2006-03-22 02:53:00 +0000110
Evan Cheng475aecf2006-03-29 03:04:49 +0000111// Only use SHUFP for v4i32 if no other options are available.
112// FIXME: add tblgen hook to reduce the complexity of pattern.
113def SHUFP_v4i32_shuffle_mask : PatLeaf<(build_vector), [{
114 return !X86::isUNPCKHMask(N) && !X86::isPSHUFDMask(N) && X86::isSHUFPMask(N);
115}], SHUFFLE_get_shuf_imm>;
116
Evan Cheng06a8aa12006-03-17 19:55:52 +0000117//===----------------------------------------------------------------------===//
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000118// SSE scalar FP Instructions
119//===----------------------------------------------------------------------===//
120
Evan Cheng470a6ad2006-02-22 02:26:30 +0000121// Instruction templates
122// SSI - SSE1 instructions with XS prefix.
123// SDI - SSE2 instructions with XD prefix.
124// PSI - SSE1 instructions with TB prefix.
125// PDI - SSE2 instructions with TB and OpSize prefixes.
Evan Cheng2da953f2006-03-22 07:10:28 +0000126// PSIi8 - SSE1 instructions with ImmT == Imm8 and TB prefix.
127// PDIi8 - SSE2 instructions with ImmT == Imm8 and TB and OpSize prefixes.
Evan Cheng470a6ad2006-02-22 02:26:30 +0000128class SSI<bits<8> o, Format F, dag ops, string asm, list<dag> pattern>
129 : I<o, F, ops, asm, pattern>, XS, Requires<[HasSSE1]>;
130class SDI<bits<8> o, Format F, dag ops, string asm, list<dag> pattern>
131 : I<o, F, ops, asm, pattern>, XD, Requires<[HasSSE2]>;
132class PSI<bits<8> o, Format F, dag ops, string asm, list<dag> pattern>
133 : I<o, F, ops, asm, pattern>, TB, Requires<[HasSSE1]>;
134class PDI<bits<8> o, Format F, dag ops, string asm, list<dag> pattern>
135 : I<o, F, ops, asm, pattern>, TB, OpSize, Requires<[HasSSE2]>;
Evan Cheng2da953f2006-03-22 07:10:28 +0000136class PSIi8<bits<8> o, Format F, dag ops, string asm, list<dag> pattern>
137 : X86Inst<o, F, Imm8, ops, asm>, TB, Requires<[HasSSE1]> {
138 let Pattern = pattern;
139}
140class PDIi8<bits<8> o, Format F, dag ops, string asm, list<dag> pattern>
141 : X86Inst<o, F, Imm8, ops, asm>, TB, OpSize, Requires<[HasSSE2]> {
142 let Pattern = pattern;
143}
Evan Cheng470a6ad2006-02-22 02:26:30 +0000144
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000145// Some 'special' instructions
146def IMPLICIT_DEF_FR32 : I<0, Pseudo, (ops FR32:$dst),
147 "#IMPLICIT_DEF $dst",
148 [(set FR32:$dst, (undef))]>, Requires<[HasSSE2]>;
149def IMPLICIT_DEF_FR64 : I<0, Pseudo, (ops FR64:$dst),
150 "#IMPLICIT_DEF $dst",
151 [(set FR64:$dst, (undef))]>, Requires<[HasSSE2]>;
152
153// CMOV* - Used to implement the SSE SELECT DAG operation. Expanded by the
154// scheduler into a branch sequence.
155let usesCustomDAGSchedInserter = 1 in { // Expanded by the scheduler.
156 def CMOV_FR32 : I<0, Pseudo,
157 (ops FR32:$dst, FR32:$t, FR32:$f, i8imm:$cond),
158 "#CMOV_FR32 PSEUDO!",
159 [(set FR32:$dst, (X86cmov FR32:$t, FR32:$f, imm:$cond))]>;
160 def CMOV_FR64 : I<0, Pseudo,
161 (ops FR64:$dst, FR64:$t, FR64:$f, i8imm:$cond),
162 "#CMOV_FR64 PSEUDO!",
163 [(set FR64:$dst, (X86cmov FR64:$t, FR64:$f, imm:$cond))]>;
164}
165
166// Move Instructions
Evan Cheng470a6ad2006-02-22 02:26:30 +0000167def MOVSSrr : SSI<0x10, MRMSrcReg, (ops FR32:$dst, FR32:$src),
168 "movss {$src, $dst|$dst, $src}", []>;
169def MOVSSrm : SSI<0x10, MRMSrcMem, (ops FR32:$dst, f32mem:$src),
170 "movss {$src, $dst|$dst, $src}",
171 [(set FR32:$dst, (loadf32 addr:$src))]>;
172def MOVSDrr : SDI<0x10, MRMSrcReg, (ops FR64:$dst, FR64:$src),
173 "movsd {$src, $dst|$dst, $src}", []>;
174def MOVSDrm : SDI<0x10, MRMSrcMem, (ops FR64:$dst, f64mem:$src),
175 "movsd {$src, $dst|$dst, $src}",
176 [(set FR64:$dst, (loadf64 addr:$src))]>;
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000177
Evan Cheng470a6ad2006-02-22 02:26:30 +0000178def MOVSSmr : SSI<0x11, MRMDestMem, (ops f32mem:$dst, FR32:$src),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000179 "movss {$src, $dst|$dst, $src}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000180 [(store FR32:$src, addr:$dst)]>;
181def MOVSDmr : SDI<0x11, MRMDestMem, (ops f64mem:$dst, FR64:$src),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000182 "movsd {$src, $dst|$dst, $src}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000183 [(store FR64:$src, addr:$dst)]>;
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000184
Evan Chengbc4832b2006-03-24 23:15:12 +0000185// FR32 / FR64 to 128-bit vector conversion.
186def MOVSS128rr : SSI<0x10, MRMSrcReg, (ops VR128:$dst, FR32:$src),
187 "movss {$src, $dst|$dst, $src}",
188 [(set VR128:$dst,
189 (v4f32 (scalar_to_vector FR32:$src)))]>;
190def MOVSS128rm : SSI<0x10, MRMSrcMem, (ops VR128:$dst, f32mem:$src),
191 "movss {$src, $dst|$dst, $src}",
192 [(set VR128:$dst,
193 (v4f32 (scalar_to_vector (loadf32 addr:$src))))]>;
194def MOVSD128rr : SDI<0x10, MRMSrcReg, (ops VR128:$dst, FR64:$src),
195 "movsd {$src, $dst|$dst, $src}",
196 [(set VR128:$dst,
197 (v2f64 (scalar_to_vector FR64:$src)))]>;
198def MOVSD128rm : SDI<0x10, MRMSrcMem, (ops VR128:$dst, f64mem:$src),
199 "movsd {$src, $dst|$dst, $src}",
200 [(set VR128:$dst,
Evan Cheng4fcb9222006-03-28 02:43:26 +0000201 (v2f64 (scalar_to_vector (loadf64 addr:$src))))]>;
Evan Chengbc4832b2006-03-24 23:15:12 +0000202
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000203// Arithmetic instructions
204let isTwoAddress = 1 in {
205let isCommutable = 1 in {
Evan Cheng470a6ad2006-02-22 02:26:30 +0000206def ADDSSrr : SSI<0x58, MRMSrcReg, (ops FR32:$dst, FR32:$src1, FR32:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000207 "addss {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000208 [(set FR32:$dst, (fadd FR32:$src1, FR32:$src2))]>;
209def ADDSDrr : SDI<0x58, MRMSrcReg, (ops FR64:$dst, FR64:$src1, FR64:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000210 "addsd {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000211 [(set FR64:$dst, (fadd FR64:$src1, FR64:$src2))]>;
212def MULSSrr : SSI<0x59, MRMSrcReg, (ops FR32:$dst, FR32:$src1, FR32:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000213 "mulss {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000214 [(set FR32:$dst, (fmul FR32:$src1, FR32:$src2))]>;
215def MULSDrr : SDI<0x59, MRMSrcReg, (ops FR64:$dst, FR64:$src1, FR64:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000216 "mulsd {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000217 [(set FR64:$dst, (fmul FR64:$src1, FR64:$src2))]>;
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000218}
219
Evan Cheng470a6ad2006-02-22 02:26:30 +0000220def ADDSSrm : SSI<0x58, MRMSrcMem, (ops FR32:$dst, FR32:$src1, f32mem:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000221 "addss {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000222 [(set FR32:$dst, (fadd FR32:$src1, (loadf32 addr:$src2)))]>;
223def ADDSDrm : SDI<0x58, MRMSrcMem, (ops FR64:$dst, FR64:$src1, f64mem:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000224 "addsd {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000225 [(set FR64:$dst, (fadd FR64:$src1, (loadf64 addr:$src2)))]>;
226def MULSSrm : SSI<0x59, MRMSrcMem, (ops FR32:$dst, FR32:$src1, f32mem:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000227 "mulss {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000228 [(set FR32:$dst, (fmul FR32:$src1, (loadf32 addr:$src2)))]>;
229def MULSDrm : SDI<0x59, MRMSrcMem, (ops FR64:$dst, FR64:$src1, f64mem:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000230 "mulsd {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000231 [(set FR64:$dst, (fmul FR64:$src1, (loadf64 addr:$src2)))]>;
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000232
Evan Cheng470a6ad2006-02-22 02:26:30 +0000233def DIVSSrr : SSI<0x5E, MRMSrcReg, (ops FR32:$dst, FR32:$src1, FR32:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000234 "divss {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000235 [(set FR32:$dst, (fdiv FR32:$src1, FR32:$src2))]>;
236def DIVSSrm : SSI<0x5E, MRMSrcMem, (ops FR32:$dst, FR32:$src1, f32mem:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000237 "divss {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000238 [(set FR32:$dst, (fdiv FR32:$src1, (loadf32 addr:$src2)))]>;
239def DIVSDrr : SDI<0x5E, MRMSrcReg, (ops FR64:$dst, FR64:$src1, FR64:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000240 "divsd {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000241 [(set FR64:$dst, (fdiv FR64:$src1, FR64:$src2))]>;
242def DIVSDrm : SDI<0x5E, MRMSrcMem, (ops FR64:$dst, FR64:$src1, f64mem:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000243 "divsd {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000244 [(set FR64:$dst, (fdiv FR64:$src1, (loadf64 addr:$src2)))]>;
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000245
Evan Cheng470a6ad2006-02-22 02:26:30 +0000246def SUBSSrr : SSI<0x5C, MRMSrcReg, (ops FR32:$dst, FR32:$src1, FR32:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000247 "subss {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000248 [(set FR32:$dst, (fsub FR32:$src1, FR32:$src2))]>;
249def SUBSSrm : SSI<0x5C, MRMSrcMem, (ops FR32:$dst, FR32:$src1, f32mem:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000250 "subss {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000251 [(set FR32:$dst, (fsub FR32:$src1, (loadf32 addr:$src2)))]>;
252def SUBSDrr : SDI<0x5C, MRMSrcReg, (ops FR64:$dst, FR64:$src1, FR64:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000253 "subsd {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000254 [(set FR64:$dst, (fsub FR64:$src1, FR64:$src2))]>;
255def SUBSDrm : SDI<0x5C, MRMSrcMem, (ops FR64:$dst, FR64:$src1, f64mem:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000256 "subsd {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000257 [(set FR64:$dst, (fsub FR64:$src1, (loadf64 addr:$src2)))]>;
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000258}
259
Evan Cheng470a6ad2006-02-22 02:26:30 +0000260def SQRTSSrr : SSI<0x51, MRMSrcReg, (ops FR32:$dst, FR32:$src),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000261 "sqrtss {$src, $dst|$dst, $src}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000262 [(set FR32:$dst, (fsqrt FR32:$src))]>;
263def SQRTSSrm : SSI<0x51, MRMSrcMem, (ops FR32:$dst, f32mem:$src),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000264 "sqrtss {$src, $dst|$dst, $src}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000265 [(set FR32:$dst, (fsqrt (loadf32 addr:$src)))]>;
266def SQRTSDrr : SDI<0x51, MRMSrcReg, (ops FR64:$dst, FR64:$src),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000267 "sqrtsd {$src, $dst|$dst, $src}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000268 [(set FR64:$dst, (fsqrt FR64:$src))]>;
269def SQRTSDrm : SDI<0x51, MRMSrcMem, (ops FR64:$dst, f64mem:$src),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000270 "sqrtsd {$src, $dst|$dst, $src}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000271 [(set FR64:$dst, (fsqrt (loadf64 addr:$src)))]>;
272
273def RSQRTSSrr : SSI<0x52, MRMSrcReg, (ops FR32:$dst, FR32:$src),
274 "rsqrtss {$src, $dst|$dst, $src}", []>;
275def RSQRTSSrm : SSI<0x52, MRMSrcMem, (ops FR32:$dst, f32mem:$src),
276 "rsqrtss {$src, $dst|$dst, $src}", []>;
277def RCPSSrr : SSI<0x53, MRMSrcReg, (ops FR32:$dst, FR32:$src),
278 "rcpss {$src, $dst|$dst, $src}", []>;
279def RCPSSrm : SSI<0x53, MRMSrcMem, (ops FR32:$dst, f32mem:$src),
280 "rcpss {$src, $dst|$dst, $src}", []>;
281
282def MAXSSrr : SSI<0x5F, MRMSrcReg, (ops FR32:$dst, FR32:$src),
283 "maxss {$src, $dst|$dst, $src}", []>;
284def MAXSSrm : SSI<0x5F, MRMSrcMem, (ops FR32:$dst, f32mem:$src),
285 "maxss {$src, $dst|$dst, $src}", []>;
286def MAXSDrr : SDI<0x5F, MRMSrcReg, (ops FR64:$dst, FR64:$src),
287 "maxsd {$src, $dst|$dst, $src}", []>;
288def MAXSDrm : SDI<0x5F, MRMSrcMem, (ops FR64:$dst, f64mem:$src),
289 "maxsd {$src, $dst|$dst, $src}", []>;
290def MINSSrr : SSI<0x5D, MRMSrcReg, (ops FR32:$dst, FR32:$src),
291 "minss {$src, $dst|$dst, $src}", []>;
292def MINSSrm : SSI<0x5D, MRMSrcMem, (ops FR32:$dst, f32mem:$src),
293 "minss {$src, $dst|$dst, $src}", []>;
294def MINSDrr : SDI<0x5D, MRMSrcReg, (ops FR64:$dst, FR64:$src),
295 "minsd {$src, $dst|$dst, $src}", []>;
296def MINSDrm : SDI<0x5D, MRMSrcMem, (ops FR64:$dst, f64mem:$src),
297 "minsd {$src, $dst|$dst, $src}", []>;
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000298
Evan Chengc46349d2006-03-28 23:51:43 +0000299
300// Aliases to match intrinsics which expect XMM operand(s).
301let isTwoAddress = 1 in {
302let isCommutable = 1 in {
303def Int_ADDSSrr : SSI<0x58, MRMSrcReg, (ops VR128:$dst, VR128:$src1,
304 VR128:$src2),
305 "addss {$src2, $dst|$dst, $src2}",
306 [(set VR128:$dst, (int_x86_sse_add_ss VR128:$src1,
307 VR128:$src2))]>;
308def Int_ADDSDrr : SDI<0x58, MRMSrcReg, (ops VR128:$dst, VR128:$src1,
309 VR128:$src2),
310 "addsd {$src2, $dst|$dst, $src2}",
311 [(set VR128:$dst, (int_x86_sse2_add_sd VR128:$src1,
312 VR128:$src2))]>;
313def Int_MULSSrr : SSI<0x59, MRMSrcReg, (ops VR128:$dst, VR128:$src1,
314 VR128:$src2),
315 "mulss {$src2, $dst|$dst, $src2}",
316 [(set VR128:$dst, (int_x86_sse_mul_ss VR128:$src1,
317 VR128:$src2))]>;
318def Int_MULSDrr : SDI<0x59, MRMSrcReg, (ops VR128:$dst, VR128:$src1,
319 VR128:$src2),
320 "mulsd {$src2, $dst|$dst, $src2}",
321 [(set VR128:$dst, (int_x86_sse2_mul_sd VR128:$src1,
322 VR128:$src2))]>;
323}
324
325def Int_ADDSSrm : SSI<0x58, MRMSrcMem, (ops VR128:$dst, VR128:$src1,
326 f32mem:$src2),
327 "addss {$src2, $dst|$dst, $src2}",
328 [(set VR128:$dst, (int_x86_sse_add_ss VR128:$src1,
329 (load addr:$src2)))]>;
330def Int_ADDSDrm : SDI<0x58, MRMSrcMem, (ops VR128:$dst, VR128:$src1,
331 f64mem:$src2),
332 "addsd {$src2, $dst|$dst, $src2}",
333 [(set VR128:$dst, (int_x86_sse2_add_sd VR128:$src1,
334 (load addr:$src2)))]>;
335def Int_MULSSrm : SSI<0x59, MRMSrcMem, (ops VR128:$dst, VR128:$src1,
336 f32mem:$src2),
337 "mulss {$src2, $dst|$dst, $src2}",
338 [(set VR128:$dst, (int_x86_sse_mul_ss VR128:$src1,
339 (load addr:$src2)))]>;
340def Int_MULSDrm : SDI<0x59, MRMSrcMem, (ops VR128:$dst, VR128:$src1,
341 f64mem:$src2),
342 "mulsd {$src2, $dst|$dst, $src2}",
343 [(set VR128:$dst, (int_x86_sse2_mul_sd VR128:$src1,
344 (load addr:$src2)))]>;
345
346def Int_DIVSSrr : SSI<0x5E, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
347 "divss {$src2, $dst|$dst, $src2}",
348 [(set VR128:$dst, (int_x86_sse_div_ss VR128:$src1,
349 VR128:$src2))]>;
350def Int_DIVSSrm : SSI<0x5E, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f32mem:$src2),
351 "divss {$src2, $dst|$dst, $src2}",
352 [(set VR128:$dst, (int_x86_sse_div_ss VR128:$src1,
353 (load addr:$src2)))]>;
354def Int_DIVSDrr : SDI<0x5E, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
355 "divsd {$src2, $dst|$dst, $src2}",
356 [(set VR128:$dst, (int_x86_sse2_div_sd VR128:$src1,
357 VR128:$src2))]>;
358def Int_DIVSDrm : SDI<0x5E, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f64mem:$src2),
359 "divsd {$src2, $dst|$dst, $src2}",
360 [(set VR128:$dst, (int_x86_sse2_div_sd VR128:$src1,
361 (load addr:$src2)))]>;
362
363def Int_SUBSSrr : SSI<0x5C, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
364 "subss {$src2, $dst|$dst, $src2}",
365 [(set VR128:$dst, (int_x86_sse_sub_ss VR128:$src1,
366 VR128:$src2))]>;
367def Int_SUBSSrm : SSI<0x5C, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f32mem:$src2),
368 "subss {$src2, $dst|$dst, $src2}",
369 [(set VR128:$dst, (int_x86_sse_sub_ss VR128:$src1,
370 (load addr:$src2)))]>;
371def Int_SUBSDrr : SDI<0x5C, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
372 "subsd {$src2, $dst|$dst, $src2}",
373 [(set VR128:$dst, (int_x86_sse2_sub_sd VR128:$src1,
374 VR128:$src2))]>;
375def Int_SUBSDrm : SDI<0x5C, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f64mem:$src2),
376 "subsd {$src2, $dst|$dst, $src2}",
377 [(set VR128:$dst, (int_x86_sse2_sub_sd VR128:$src1,
378 (load addr:$src2)))]>;
379}
380
381def Int_SQRTSSrr : SSI<0x51, MRMSrcReg, (ops VR128:$dst, VR128:$src),
382 "sqrtss {$src, $dst|$dst, $src}",
383 [(set VR128:$dst, (int_x86_sse_sqrt_ss VR128:$src))]>;
384def Int_SQRTSSrm : SSI<0x51, MRMSrcMem, (ops VR128:$dst, f32mem:$src),
385 "sqrtss {$src, $dst|$dst, $src}",
386 [(set VR128:$dst, (int_x86_sse_sqrt_ss
387 (load addr:$src)))]>;
388def Int_SQRTSDrr : SDI<0x51, MRMSrcReg, (ops VR128:$dst, VR128:$src),
389 "sqrtsd {$src, $dst|$dst, $src}",
390 [(set VR128:$dst, (int_x86_sse2_sqrt_sd VR128:$src))]>;
391def Int_SQRTSDrm : SDI<0x51, MRMSrcMem, (ops VR128:$dst, f64mem:$src),
392 "sqrtsd {$src, $dst|$dst, $src}",
393 [(set VR128:$dst, (int_x86_sse2_sqrt_sd
394 (load addr:$src)))]>;
395
396def Int_RSQRTSSrr : SSI<0x52, MRMSrcReg, (ops VR128:$dst, VR128:$src),
397 "rsqrtss {$src, $dst|$dst, $src}",
398 [(set VR128:$dst, (int_x86_sse_rsqrt_ss VR128:$src))]>;
399def Int_RSQRTSSrm : SSI<0x52, MRMSrcMem, (ops VR128:$dst, f32mem:$src),
400 "rsqrtss {$src, $dst|$dst, $src}",
401 [(set VR128:$dst, (int_x86_sse_rsqrt_ss
402 (load addr:$src)))]>;
403def Int_RCPSSrr : SSI<0x53, MRMSrcReg, (ops VR128:$dst, VR128:$src),
404 "rcpss {$src, $dst|$dst, $src}",
405 [(set VR128:$dst, (int_x86_sse_rcp_ss VR128:$src))]>;
406def Int_RCPSSrm : SSI<0x53, MRMSrcMem, (ops VR128:$dst, f32mem:$src),
407 "rcpss {$src, $dst|$dst, $src}",
408 [(set VR128:$dst, (int_x86_sse_rcp_ss
409 (load addr:$src)))]>;
410
411let isTwoAddress = 1 in {
412def Int_MAXSSrr : SSI<0x5F, MRMSrcReg, (ops VR128:$dst, VR128:$src1,
413 VR128:$src2),
414 "maxss {$src2, $dst|$dst, $src2}",
415 [(set VR128:$dst, (int_x86_sse_max_ss VR128:$src1,
416 VR128:$src2))]>;
417def Int_MAXSSrm : SSI<0x5F, MRMSrcMem, (ops VR128:$dst, VR128:$src1,
418 f32mem:$src2),
419 "maxss {$src2, $dst|$dst, $src2}",
420 [(set VR128:$dst, (int_x86_sse_max_ss VR128:$src1,
421 (load addr:$src2)))]>;
422def Int_MAXSDrr : SDI<0x5F, MRMSrcReg, (ops VR128:$dst, VR128:$src1,
423 VR128:$src2),
424 "maxsd {$src2, $dst|$dst, $src2}",
425 [(set VR128:$dst, (int_x86_sse2_max_sd VR128:$src1,
426 VR128:$src2))]>;
427def Int_MAXSDrm : SDI<0x5F, MRMSrcMem, (ops VR128:$dst, VR128:$src1,
428 f64mem:$src2),
429 "maxsd {$src2, $dst|$dst, $src2}",
430 [(set VR128:$dst, (int_x86_sse2_max_sd VR128:$src1,
431 (load addr:$src2)))]>;
432def Int_MINSSrr : SSI<0x5D, MRMSrcReg, (ops VR128:$dst, VR128:$src1,
433 VR128:$src2),
434 "minss {$src2, $dst|$dst, $src2}",
435 [(set VR128:$dst, (int_x86_sse_min_ss VR128:$src1,
436 VR128:$src2))]>;
437def Int_MINSSrm : SSI<0x5D, MRMSrcMem, (ops VR128:$dst, VR128:$src1,
438 f32mem:$src2),
439 "minss {$src2, $dst|$dst, $src2}",
440 [(set VR128:$dst, (int_x86_sse_min_ss VR128:$src1,
441 (load addr:$src2)))]>;
442def Int_MINSDrr : SDI<0x5D, MRMSrcReg, (ops VR128:$dst, VR128:$src1,
443 VR128:$src2),
444 "minsd {$src2, $dst|$dst, $src2}",
445 [(set VR128:$dst, (int_x86_sse2_min_sd VR128:$src1,
446 VR128:$src2))]>;
447def Int_MINSDrm : SDI<0x5D, MRMSrcMem, (ops VR128:$dst, VR128:$src1,
448 f64mem:$src2),
449 "minsd {$src2, $dst|$dst, $src2}",
450 [(set VR128:$dst, (int_x86_sse2_min_sd VR128:$src1,
451 (load addr:$src2)))]>;
452}
453
454// Conversion instructions
455def CVTSS2SIrr: SSI<0x2D, MRMSrcReg, (ops R32:$dst, FR32:$src),
456 "cvtss2si {$src, $dst|$dst, $src}", []>;
457def CVTSS2SIrm: SSI<0x2D, MRMSrcMem, (ops R32:$dst, f32mem:$src),
458 "cvtss2si {$src, $dst|$dst, $src}", []>;
459
460def CVTTSS2SIrr: SSI<0x2C, MRMSrcReg, (ops R32:$dst, FR32:$src),
461 "cvttss2si {$src, $dst|$dst, $src}",
462 [(set R32:$dst, (fp_to_sint FR32:$src))]>;
463def CVTTSS2SIrm: SSI<0x2C, MRMSrcMem, (ops R32:$dst, f32mem:$src),
464 "cvttss2si {$src, $dst|$dst, $src}",
465 [(set R32:$dst, (fp_to_sint (loadf32 addr:$src)))]>;
466def CVTTSD2SIrr: SDI<0x2C, MRMSrcReg, (ops R32:$dst, FR64:$src),
467 "cvttsd2si {$src, $dst|$dst, $src}",
468 [(set R32:$dst, (fp_to_sint FR64:$src))]>;
469def CVTTSD2SIrm: SDI<0x2C, MRMSrcMem, (ops R32:$dst, f64mem:$src),
470 "cvttsd2si {$src, $dst|$dst, $src}",
471 [(set R32:$dst, (fp_to_sint (loadf64 addr:$src)))]>;
472def CVTSD2SSrr: SDI<0x5A, MRMSrcReg, (ops FR32:$dst, FR64:$src),
473 "cvtsd2ss {$src, $dst|$dst, $src}",
474 [(set FR32:$dst, (fround FR64:$src))]>;
475def CVTSD2SSrm: SDI<0x5A, MRMSrcMem, (ops FR32:$dst, f64mem:$src),
476 "cvtsd2ss {$src, $dst|$dst, $src}",
477 [(set FR32:$dst, (fround (loadf64 addr:$src)))]>;
478def CVTSI2SSrr: SSI<0x2A, MRMSrcReg, (ops FR32:$dst, R32:$src),
479 "cvtsi2ss {$src, $dst|$dst, $src}",
480 [(set FR32:$dst, (sint_to_fp R32:$src))]>;
481def CVTSI2SSrm: SSI<0x2A, MRMSrcMem, (ops FR32:$dst, i32mem:$src),
482 "cvtsi2ss {$src, $dst|$dst, $src}",
483 [(set FR32:$dst, (sint_to_fp (loadi32 addr:$src)))]>;
484def CVTSI2SDrr: SDI<0x2A, MRMSrcReg, (ops FR64:$dst, R32:$src),
485 "cvtsi2sd {$src, $dst|$dst, $src}",
486 [(set FR64:$dst, (sint_to_fp R32:$src))]>;
487def CVTSI2SDrm: SDI<0x2A, MRMSrcMem, (ops FR64:$dst, i32mem:$src),
488 "cvtsi2sd {$src, $dst|$dst, $src}",
489 [(set FR64:$dst, (sint_to_fp (loadi32 addr:$src)))]>;
490// SSE2 instructions with XS prefix
491def CVTSS2SDrr: I<0x5A, MRMSrcReg, (ops FR64:$dst, FR32:$src),
492 "cvtss2sd {$src, $dst|$dst, $src}",
493 [(set FR64:$dst, (fextend FR32:$src))]>, XS,
494 Requires<[HasSSE2]>;
495def CVTSS2SDrm: I<0x5A, MRMSrcMem, (ops FR64:$dst, f32mem:$src),
496 "cvtss2sd {$src, $dst|$dst, $src}",
497 [(set FR64:$dst, (fextend (loadf32 addr:$src)))]>, XS,
498 Requires<[HasSSE2]>;
499
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000500// Comparison instructions
501let isTwoAddress = 1 in {
Evan Cheng470a6ad2006-02-22 02:26:30 +0000502def CMPSSrr : SSI<0xC2, MRMSrcReg,
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000503 (ops FR32:$dst, FR32:$src1, FR32:$src, SSECC:$cc),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000504 "cmp${cc}ss {$src, $dst|$dst, $src}", []>;
505def CMPSSrm : SSI<0xC2, MRMSrcMem,
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000506 (ops FR32:$dst, FR32:$src1, f32mem:$src, SSECC:$cc),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000507 "cmp${cc}ss {$src, $dst|$dst, $src}", []>;
508def CMPSDrr : SDI<0xC2, MRMSrcReg,
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000509 (ops FR64:$dst, FR64:$src1, FR64:$src, SSECC:$cc),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000510 "cmp${cc}sd {$src, $dst|$dst, $src}", []>;
511def CMPSDrm : SDI<0xC2, MRMSrcMem,
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000512 (ops FR64:$dst, FR64:$src1, f64mem:$src, SSECC:$cc),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000513 "cmp${cc}sd {$src, $dst|$dst, $src}", []>;
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000514}
515
Evan Cheng470a6ad2006-02-22 02:26:30 +0000516def UCOMISSrr: PSI<0x2E, MRMSrcReg, (ops FR32:$src1, FR32:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000517 "ucomiss {$src2, $src1|$src1, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000518 [(X86cmp FR32:$src1, FR32:$src2)]>;
519def UCOMISSrm: PSI<0x2E, MRMSrcMem, (ops FR32:$src1, f32mem:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000520 "ucomiss {$src2, $src1|$src1, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000521 [(X86cmp FR32:$src1, (loadf32 addr:$src2))]>;
522def UCOMISDrr: PDI<0x2E, MRMSrcReg, (ops FR64:$src1, FR64:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000523 "ucomisd {$src2, $src1|$src1, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000524 [(X86cmp FR64:$src1, FR64:$src2)]>;
525def UCOMISDrm: PDI<0x2E, MRMSrcMem, (ops FR64:$src1, f64mem:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000526 "ucomisd {$src2, $src1|$src1, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000527 [(X86cmp FR64:$src1, (loadf64 addr:$src2))]>;
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000528
529// Aliases of packed instructions for scalar use. These all have names that
530// start with 'Fs'.
531
532// Alias instructions that map fld0 to pxor for sse.
533// FIXME: remove when we can teach regalloc that xor reg, reg is ok.
534def FsFLD0SS : I<0xEF, MRMInitReg, (ops FR32:$dst),
535 "pxor $dst, $dst", [(set FR32:$dst, fp32imm0)]>,
536 Requires<[HasSSE1]>, TB, OpSize;
537def FsFLD0SD : I<0xEF, MRMInitReg, (ops FR64:$dst),
538 "pxor $dst, $dst", [(set FR64:$dst, fp64imm0)]>,
539 Requires<[HasSSE2]>, TB, OpSize;
540
541// Alias instructions to do FR32 / FR64 reg-to-reg copy using movaps / movapd.
542// Upper bits are disregarded.
Evan Cheng470a6ad2006-02-22 02:26:30 +0000543def FsMOVAPSrr : PSI<0x28, MRMSrcReg, (ops FR32:$dst, FR32:$src),
544 "movaps {$src, $dst|$dst, $src}", []>;
545def FsMOVAPDrr : PDI<0x28, MRMSrcReg, (ops FR64:$dst, FR64:$src),
546 "movapd {$src, $dst|$dst, $src}", []>;
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000547
548// Alias instructions to load FR32 / FR64 from f128mem using movaps / movapd.
549// Upper bits are disregarded.
Evan Cheng470a6ad2006-02-22 02:26:30 +0000550def FsMOVAPSrm : PSI<0x28, MRMSrcMem, (ops FR32:$dst, f128mem:$src),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000551 "movaps {$src, $dst|$dst, $src}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000552 [(set FR32:$dst, (X86loadpf32 addr:$src))]>;
553def FsMOVAPDrm : PDI<0x28, MRMSrcMem, (ops FR64:$dst, f128mem:$src),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000554 "movapd {$src, $dst|$dst, $src}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000555 [(set FR64:$dst, (X86loadpf64 addr:$src))]>;
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000556
557// Alias bitwise logical operations using SSE logical ops on packed FP values.
558let isTwoAddress = 1 in {
559let isCommutable = 1 in {
Evan Cheng470a6ad2006-02-22 02:26:30 +0000560def FsANDPSrr : PSI<0x54, MRMSrcReg, (ops FR32:$dst, FR32:$src1, FR32:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000561 "andps {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000562 [(set FR32:$dst, (X86fand FR32:$src1, FR32:$src2))]>;
563def FsANDPDrr : PDI<0x54, MRMSrcReg, (ops FR64:$dst, FR64:$src1, FR64:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000564 "andpd {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000565 [(set FR64:$dst, (X86fand FR64:$src1, FR64:$src2))]>;
566def FsORPSrr : PSI<0x56, MRMSrcReg, (ops FR32:$dst, FR32:$src1, FR32:$src2),
567 "orps {$src2, $dst|$dst, $src2}", []>;
568def FsORPDrr : PDI<0x56, MRMSrcReg, (ops FR64:$dst, FR64:$src1, FR64:$src2),
569 "orpd {$src2, $dst|$dst, $src2}", []>;
570def FsXORPSrr : PSI<0x57, MRMSrcReg, (ops FR32:$dst, FR32:$src1, FR32:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000571 "xorps {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000572 [(set FR32:$dst, (X86fxor FR32:$src1, FR32:$src2))]>;
573def FsXORPDrr : PDI<0x57, MRMSrcReg, (ops FR64:$dst, FR64:$src1, FR64:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000574 "xorpd {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000575 [(set FR64:$dst, (X86fxor FR64:$src1, FR64:$src2))]>;
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000576}
Evan Cheng470a6ad2006-02-22 02:26:30 +0000577def FsANDPSrm : PSI<0x54, MRMSrcMem, (ops FR32:$dst, FR32:$src1, f128mem:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000578 "andps {$src2, $dst|$dst, $src2}",
579 [(set FR32:$dst, (X86fand FR32:$src1,
Evan Cheng470a6ad2006-02-22 02:26:30 +0000580 (X86loadpf32 addr:$src2)))]>;
581def FsANDPDrm : PDI<0x54, MRMSrcMem, (ops FR64:$dst, FR64:$src1, f128mem:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000582 "andpd {$src2, $dst|$dst, $src2}",
583 [(set FR64:$dst, (X86fand FR64:$src1,
Evan Cheng470a6ad2006-02-22 02:26:30 +0000584 (X86loadpf64 addr:$src2)))]>;
585def FsORPSrm : PSI<0x56, MRMSrcMem, (ops FR32:$dst, FR32:$src1, f128mem:$src2),
586 "orps {$src2, $dst|$dst, $src2}", []>;
587def FsORPDrm : PDI<0x56, MRMSrcMem, (ops FR64:$dst, FR64:$src1, f128mem:$src2),
588 "orpd {$src2, $dst|$dst, $src2}", []>;
589def FsXORPSrm : PSI<0x57, MRMSrcMem, (ops FR32:$dst, FR32:$src1, f128mem:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000590 "xorps {$src2, $dst|$dst, $src2}",
591 [(set FR32:$dst, (X86fxor FR32:$src1,
Evan Cheng470a6ad2006-02-22 02:26:30 +0000592 (X86loadpf32 addr:$src2)))]>;
593def FsXORPDrm : PDI<0x57, MRMSrcMem, (ops FR64:$dst, FR64:$src1, f128mem:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000594 "xorpd {$src2, $dst|$dst, $src2}",
595 [(set FR64:$dst, (X86fxor FR64:$src1,
Evan Cheng470a6ad2006-02-22 02:26:30 +0000596 (X86loadpf64 addr:$src2)))]>;
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000597
Evan Cheng470a6ad2006-02-22 02:26:30 +0000598def FsANDNPSrr : PSI<0x55, MRMSrcReg, (ops FR32:$dst, FR32:$src1, FR32:$src2),
599 "andnps {$src2, $dst|$dst, $src2}", []>;
600def FsANDNPSrm : PSI<0x55, MRMSrcMem, (ops FR32:$dst, FR32:$src1, f128mem:$src2),
601 "andnps {$src2, $dst|$dst, $src2}", []>;
602def FsANDNPDrr : PDI<0x55, MRMSrcReg, (ops FR64:$dst, FR64:$src1, FR64:$src2),
603 "andnpd {$src2, $dst|$dst, $src2}", []>;
604def FsANDNPDrm : PDI<0x55, MRMSrcMem, (ops FR64:$dst, FR64:$src1, f128mem:$src2),
605 "andnpd {$src2, $dst|$dst, $src2}", []>;
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000606}
607
608//===----------------------------------------------------------------------===//
609// SSE packed FP Instructions
610//===----------------------------------------------------------------------===//
611
Evan Chengc12e6c42006-03-19 09:38:54 +0000612// Some 'special' instructions
613def IMPLICIT_DEF_VR128 : I<0, Pseudo, (ops VR128:$dst),
614 "#IMPLICIT_DEF $dst",
615 [(set VR128:$dst, (v4f32 (undef)))]>,
616 Requires<[HasSSE1]>;
617
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000618// Move Instructions
Evan Cheng2246f842006-03-18 01:23:20 +0000619def MOVAPSrr : PSI<0x28, MRMSrcReg, (ops VR128:$dst, VR128:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000620 "movaps {$src, $dst|$dst, $src}", []>;
Evan Cheng2246f842006-03-18 01:23:20 +0000621def MOVAPSrm : PSI<0x28, MRMSrcMem, (ops VR128:$dst, f128mem:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000622 "movaps {$src, $dst|$dst, $src}",
Evan Cheng2246f842006-03-18 01:23:20 +0000623 [(set VR128:$dst, (loadv4f32 addr:$src))]>;
624def MOVAPDrr : PDI<0x28, MRMSrcReg, (ops VR128:$dst, VR128:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000625 "movapd {$src, $dst|$dst, $src}", []>;
Evan Cheng2246f842006-03-18 01:23:20 +0000626def MOVAPDrm : PDI<0x28, MRMSrcMem, (ops VR128:$dst, f128mem:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000627 "movapd {$src, $dst|$dst, $src}",
Evan Cheng2246f842006-03-18 01:23:20 +0000628 [(set VR128:$dst, (loadv2f64 addr:$src))]>;
Evan Chengffcb95b2006-02-21 19:13:53 +0000629
Evan Cheng2246f842006-03-18 01:23:20 +0000630def MOVAPSmr : PSI<0x29, MRMDestMem, (ops f128mem:$dst, VR128:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000631 "movaps {$src, $dst|$dst, $src}",
Evan Cheng2246f842006-03-18 01:23:20 +0000632 [(store (v4f32 VR128:$src), addr:$dst)]>;
633def MOVAPDmr : PDI<0x29, MRMDestMem, (ops f128mem:$dst, VR128:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000634 "movapd {$src, $dst|$dst, $src}",
Evan Cheng2246f842006-03-18 01:23:20 +0000635 [(store (v2f64 VR128:$src), addr:$dst)]>;
Evan Cheng470a6ad2006-02-22 02:26:30 +0000636
Evan Cheng2246f842006-03-18 01:23:20 +0000637def MOVUPSrr : PSI<0x10, MRMSrcReg, (ops VR128:$dst, VR128:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000638 "movups {$src, $dst|$dst, $src}", []>;
Evan Cheng2246f842006-03-18 01:23:20 +0000639def MOVUPSrm : PSI<0x10, MRMSrcMem, (ops VR128:$dst, f128mem:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000640 "movups {$src, $dst|$dst, $src}", []>;
Evan Cheng2246f842006-03-18 01:23:20 +0000641def MOVUPSmr : PSI<0x11, MRMDestMem, (ops f128mem:$dst, VR128:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000642 "movups {$src, $dst|$dst, $src}", []>;
Evan Cheng2246f842006-03-18 01:23:20 +0000643def MOVUPDrr : PDI<0x10, MRMSrcReg, (ops VR128:$dst, VR128:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000644 "movupd {$src, $dst|$dst, $src}", []>;
Evan Cheng2246f842006-03-18 01:23:20 +0000645def MOVUPDrm : PDI<0x10, MRMSrcMem, (ops VR128:$dst, f128mem:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000646 "movupd {$src, $dst|$dst, $src}", []>;
Evan Cheng2246f842006-03-18 01:23:20 +0000647def MOVUPDmr : PDI<0x11, MRMDestMem, (ops f128mem:$dst, VR128:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000648 "movupd {$src, $dst|$dst, $src}", []>;
649
Evan Cheng4fcb9222006-03-28 02:43:26 +0000650let isTwoAddress = 1 in {
Evan Cheng9bbfd4f2006-03-28 07:01:28 +0000651def MOVLPSrm : PSI<0x12, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f64mem:$src2),
652 "movlps {$src2, $dst|$dst, $src2}", []>;
653def MOVLPDrm : PDI<0x12, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f64mem:$src2),
654 "movlpd {$src2, $dst|$dst, $src2}", []>;
Evan Cheng4fcb9222006-03-28 02:43:26 +0000655def MOVHPSrm : PSI<0x16, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f64mem:$src2),
656 "movhps {$src2, $dst|$dst, $src2}", []>;
657def MOVHPDrm : PDI<0x16, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f64mem:$src2),
658 "movhpd {$src2, $dst|$dst, $src2}",
659 [(set VR128:$dst,
660 (v2f64 (vector_shuffle VR128:$src1,
661 (scalar_to_vector (loadf64 addr:$src2)),
662 UNPCKL_shuffle_mask)))]>;
663}
664
Evan Cheng9bbfd4f2006-03-28 07:01:28 +0000665def MOVLPSmr : PSI<0x13, MRMDestMem, (ops f64mem:$dst, VR128:$src),
666 "movlps {$src, $dst|$dst, $src}", []>;
667def MOVLPDmr : PDI<0x13, MRMDestMem, (ops f64mem:$dst, VR128:$src),
668 "movlpd {$src, $dst|$dst, $src}", []>;
669
Evan Cheng2246f842006-03-18 01:23:20 +0000670def MOVHPSmr : PSI<0x17, MRMDestMem, (ops f64mem:$dst, VR128:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000671 "movhps {$src, $dst|$dst, $src}", []>;
Evan Cheng2246f842006-03-18 01:23:20 +0000672def MOVHPDmr : PDI<0x17, MRMDestMem, (ops f64mem:$dst, VR128:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000673 "movhpd {$src, $dst|$dst, $src}", []>;
674
Evan Cheng14aed5e2006-03-24 01:18:28 +0000675let isTwoAddress = 1 in {
676def MOVLHPSrr : PSI<0x16, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
Evan Cheng4fcb9222006-03-28 02:43:26 +0000677 "movlhps {$src2, $dst|$dst, $src2}",
678 [(set VR128:$dst,
Evan Cheng2064a2b2006-03-28 06:50:32 +0000679 (v4f32 (vector_shuffle VR128:$src1, VR128:$src2,
680 MOVLHPS_shuffle_mask)))]>;
Evan Cheng2c0dbd02006-03-24 02:58:06 +0000681
Evan Cheng14aed5e2006-03-24 01:18:28 +0000682def MOVHLPSrr : PSI<0x12, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
Evan Chengbe296ac2006-03-28 06:53:49 +0000683 "movhlps {$src2, $dst|$dst, $src2}",
Evan Cheng4fcb9222006-03-28 02:43:26 +0000684 [(set VR128:$dst,
Evan Cheng2064a2b2006-03-28 06:50:32 +0000685 (v4f32 (vector_shuffle VR128:$src1, VR128:$src2,
Evan Cheng4fcb9222006-03-28 02:43:26 +0000686 MOVHLPS_shuffle_mask)))]>;
Evan Cheng14aed5e2006-03-24 01:18:28 +0000687}
Evan Cheng470a6ad2006-02-22 02:26:30 +0000688
Evan Cheng2246f842006-03-18 01:23:20 +0000689def MOVMSKPSrr : PSI<0x50, MRMSrcReg, (ops R32:$dst, VR128:$src),
Chris Lattnerac53ead2006-03-24 21:49:18 +0000690 "movmskps {$src, $dst|$dst, $src}",
Chris Lattner749b7582006-03-27 16:52:45 +0000691 [(set R32:$dst, (int_x86_sse_movmsk_ps VR128:$src))]>;
Evan Cheng2246f842006-03-18 01:23:20 +0000692def MOVMSKPDrr : PSI<0x50, MRMSrcReg, (ops R32:$dst, VR128:$src),
Chris Lattnerac53ead2006-03-24 21:49:18 +0000693 "movmskpd {$src, $dst|$dst, $src}",
694 [(set R32:$dst, (int_x86_sse2_movmskpd VR128:$src))]>;
Evan Cheng470a6ad2006-02-22 02:26:30 +0000695
696// Conversion instructions
Evan Cheng2246f842006-03-18 01:23:20 +0000697def CVTPI2PSrr : PSI<0x2A, MRMSrcReg, (ops VR128:$dst, VR64:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000698 "cvtpi2ps {$src, $dst|$dst, $src}", []>;
Evan Cheng2246f842006-03-18 01:23:20 +0000699def CVTPI2PSrm : PSI<0x2A, MRMSrcMem, (ops VR128:$dst, i64mem:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000700 "cvtpi2ps {$src, $dst|$dst, $src}", []>;
Evan Cheng2246f842006-03-18 01:23:20 +0000701def CVTPI2PDrr : PDI<0x2A, MRMSrcReg, (ops VR128:$dst, VR64:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000702 "cvtpi2pd {$src, $dst|$dst, $src}", []>;
Evan Cheng2246f842006-03-18 01:23:20 +0000703def CVTPI2PDrm : PDI<0x2A, MRMSrcMem, (ops VR128:$dst, i64mem:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000704 "cvtpi2pd {$src, $dst|$dst, $src}", []>;
705
706// SSE2 instructions without OpSize prefix
Evan Cheng2246f842006-03-18 01:23:20 +0000707def CVTDQ2PSrr : I<0x5B, MRMSrcReg, (ops VR128:$dst, VR128:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000708 "cvtdq2ps {$src, $dst|$dst, $src}", []>, TB,
709 Requires<[HasSSE2]>;
Evan Cheng2246f842006-03-18 01:23:20 +0000710def CVTDQ2PSrm : I<0x5B, MRMSrcMem, (ops VR128:$dst, i128mem:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000711 "cvtdq2ps {$src, $dst|$dst, $src}", []>, TB,
712 Requires<[HasSSE2]>;
713
714// SSE2 instructions with XS prefix
Evan Cheng2246f842006-03-18 01:23:20 +0000715def CVTDQ2PDrr : I<0xE6, MRMSrcReg, (ops VR128:$dst, VR64:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000716 "cvtdq2pd {$src, $dst|$dst, $src}", []>,
717 XS, Requires<[HasSSE2]>;
Evan Cheng2246f842006-03-18 01:23:20 +0000718def CVTDQ2PDrm : I<0xE6, MRMSrcMem, (ops VR128:$dst, i64mem:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000719 "cvtdq2pd {$src, $dst|$dst, $src}", []>,
720 XS, Requires<[HasSSE2]>;
721
Evan Cheng2246f842006-03-18 01:23:20 +0000722def CVTPS2PIrr : PSI<0x2D, MRMSrcReg, (ops VR64:$dst, VR128:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000723 "cvtps2pi {$src, $dst|$dst, $src}", []>;
Evan Cheng2246f842006-03-18 01:23:20 +0000724def CVTPS2PIrm : PSI<0x2D, MRMSrcMem, (ops VR64:$dst, f64mem:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000725 "cvtps2pi {$src, $dst|$dst, $src}", []>;
Evan Cheng2246f842006-03-18 01:23:20 +0000726def CVTPD2PIrr : PDI<0x2D, MRMSrcReg, (ops VR64:$dst, VR128:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000727 "cvtpd2pi {$src, $dst|$dst, $src}", []>;
Evan Cheng2246f842006-03-18 01:23:20 +0000728def CVTPD2PIrm : PDI<0x2D, MRMSrcMem, (ops VR64:$dst, f128mem:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000729 "cvtpd2pi {$src, $dst|$dst, $src}", []>;
730
Evan Cheng2246f842006-03-18 01:23:20 +0000731def CVTPS2DQrr : PDI<0x5B, MRMSrcReg, (ops VR128:$dst, VR128:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000732 "cvtps2dq {$src, $dst|$dst, $src}", []>;
Evan Cheng2246f842006-03-18 01:23:20 +0000733def CVTPS2DQrm : PDI<0x5B, MRMSrcMem, (ops VR128:$dst, f128mem:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000734 "cvtps2dq {$src, $dst|$dst, $src}", []>;
735// SSE2 packed instructions with XD prefix
Evan Cheng2246f842006-03-18 01:23:20 +0000736def CVTPD2DQrr : SDI<0xE6, MRMSrcReg, (ops VR128:$dst, VR128:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000737 "cvtpd2dq {$src, $dst|$dst, $src}", []>;
Evan Cheng2246f842006-03-18 01:23:20 +0000738def CVTPD2DQrm : SDI<0xE6, MRMSrcMem, (ops VR128:$dst, f128mem:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000739 "cvtpd2dq {$src, $dst|$dst, $src}", []>;
740
741// SSE2 instructions without OpSize prefix
Evan Cheng2246f842006-03-18 01:23:20 +0000742def CVTPS2PDrr : I<0x5A, MRMSrcReg, (ops VR128:$dst, VR128:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000743 "cvtps2pd {$src, $dst|$dst, $src}", []>, TB,
744 Requires<[HasSSE2]>;
Evan Cheng2246f842006-03-18 01:23:20 +0000745def CVTPS2PDrm : I<0x5A, MRMSrcReg, (ops VR128:$dst, f64mem:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000746 "cvtps2pd {$src, $dst|$dst, $src}", []>, TB,
747 Requires<[HasSSE2]>;
748
Evan Cheng2246f842006-03-18 01:23:20 +0000749def CVTPD2PSrr : PDI<0x5A, MRMSrcReg, (ops VR128:$dst, VR128:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000750 "cvtpd2ps {$src, $dst|$dst, $src}", []>;
Evan Cheng2246f842006-03-18 01:23:20 +0000751def CVTPD2PSrm : PDI<0x5A, MRMSrcReg, (ops VR128:$dst, f128mem:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000752 "cvtpd2ps {$src, $dst|$dst, $src}", []>;
753
754// Arithmetic
755let isTwoAddress = 1 in {
756let isCommutable = 1 in {
Evan Cheng2246f842006-03-18 01:23:20 +0000757def ADDPSrr : PSI<0x58, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000758 "addps {$src2, $dst|$dst, $src2}",
Evan Cheng2246f842006-03-18 01:23:20 +0000759 [(set VR128:$dst, (v4f32 (fadd VR128:$src1, VR128:$src2)))]>;
760def ADDPDrr : PDI<0x58, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000761 "addpd {$src2, $dst|$dst, $src2}",
Evan Cheng2246f842006-03-18 01:23:20 +0000762 [(set VR128:$dst, (v2f64 (fadd VR128:$src1, VR128:$src2)))]>;
763def MULPSrr : PSI<0x59, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000764 "mulps {$src2, $dst|$dst, $src2}",
Evan Cheng2246f842006-03-18 01:23:20 +0000765 [(set VR128:$dst, (v4f32 (fmul VR128:$src1, VR128:$src2)))]>;
766def MULPDrr : PDI<0x59, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000767 "mulpd {$src2, $dst|$dst, $src2}",
Evan Cheng2246f842006-03-18 01:23:20 +0000768 [(set VR128:$dst, (v2f64 (fmul VR128:$src1, VR128:$src2)))]>;
Evan Cheng470a6ad2006-02-22 02:26:30 +0000769}
770
Evan Cheng2246f842006-03-18 01:23:20 +0000771def ADDPSrm : PSI<0x58, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000772 "addps {$src2, $dst|$dst, $src2}",
Evan Cheng2246f842006-03-18 01:23:20 +0000773 [(set VR128:$dst, (v4f32 (fadd VR128:$src1,
774 (load addr:$src2))))]>;
775def ADDPDrm : PDI<0x58, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000776 "addpd {$src2, $dst|$dst, $src2}",
Evan Cheng2246f842006-03-18 01:23:20 +0000777 [(set VR128:$dst, (v2f64 (fadd VR128:$src1,
778 (load addr:$src2))))]>;
779def MULPSrm : PSI<0x59, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000780 "mulps {$src2, $dst|$dst, $src2}",
Evan Cheng2246f842006-03-18 01:23:20 +0000781 [(set VR128:$dst, (v4f32 (fmul VR128:$src1,
782 (load addr:$src2))))]>;
783def MULPDrm : PDI<0x59, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000784 "mulpd {$src2, $dst|$dst, $src2}",
Evan Cheng2246f842006-03-18 01:23:20 +0000785 [(set VR128:$dst, (v2f64 (fmul VR128:$src1,
786 (load addr:$src2))))]>;
Evan Cheng470a6ad2006-02-22 02:26:30 +0000787
Evan Cheng2246f842006-03-18 01:23:20 +0000788def DIVPSrr : PSI<0x5E, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
789 "divps {$src2, $dst|$dst, $src2}",
790 [(set VR128:$dst, (v4f32 (fdiv VR128:$src1, VR128:$src2)))]>;
791def DIVPSrm : PSI<0x5E, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
792 "divps {$src2, $dst|$dst, $src2}",
793 [(set VR128:$dst, (v4f32 (fdiv VR128:$src1,
794 (load addr:$src2))))]>;
795def DIVPDrr : PDI<0x5E, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000796 "divpd {$src2, $dst|$dst, $src2}",
Evan Cheng2246f842006-03-18 01:23:20 +0000797 [(set VR128:$dst, (v2f64 (fdiv VR128:$src1, VR128:$src2)))]>;
798def DIVPDrm : PDI<0x5E, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000799 "divpd {$src2, $dst|$dst, $src2}",
Evan Cheng2246f842006-03-18 01:23:20 +0000800 [(set VR128:$dst, (v2f64 (fdiv VR128:$src1,
801 (load addr:$src2))))]>;
Evan Cheng470a6ad2006-02-22 02:26:30 +0000802
Evan Cheng2246f842006-03-18 01:23:20 +0000803def SUBPSrr : PSI<0x5C, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
804 "subps {$src2, $dst|$dst, $src2}",
805 [(set VR128:$dst, (v4f32 (fsub VR128:$src1, VR128:$src2)))]>;
806def SUBPSrm : PSI<0x5C, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
807 "subps {$src2, $dst|$dst, $src2}",
808 [(set VR128:$dst, (v4f32 (fsub VR128:$src1,
809 (load addr:$src2))))]>;
810def SUBPDrr : PDI<0x5C, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
811 "subpd {$src2, $dst|$dst, $src2}",
Evan Cheng2c0dbd02006-03-24 02:58:06 +0000812 [(set VR128:$dst, (v2f64 (fsub VR128:$src1, VR128:$src2)))]>;
Evan Cheng2246f842006-03-18 01:23:20 +0000813def SUBPDrm : PDI<0x5C, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
814 "subpd {$src2, $dst|$dst, $src2}",
Evan Cheng2c0dbd02006-03-24 02:58:06 +0000815 [(set VR128:$dst, (v2f64 (fsub VR128:$src1,
816 (load addr:$src2))))]>;
Evan Cheng470a6ad2006-02-22 02:26:30 +0000817}
818
Evan Cheng2246f842006-03-18 01:23:20 +0000819def SQRTPSrr : PSI<0x51, MRMSrcReg, (ops VR128:$dst, VR128:$src),
820 "sqrtps {$src, $dst|$dst, $src}",
821 [(set VR128:$dst, (v4f32 (fsqrt VR128:$src)))]>;
822def SQRTPSrm : PSI<0x51, MRMSrcMem, (ops VR128:$dst, f128mem:$src),
823 "sqrtps {$src, $dst|$dst, $src}",
824 [(set VR128:$dst, (v4f32 (fsqrt (load addr:$src))))]>;
825def SQRTPDrr : PDI<0x51, MRMSrcReg, (ops VR128:$dst, VR128:$src),
826 "sqrtpd {$src, $dst|$dst, $src}",
827 [(set VR128:$dst, (v2f64 (fsqrt VR128:$src)))]>;
828def SQRTPDrm : PDI<0x51, MRMSrcMem, (ops VR128:$dst, f128mem:$src),
829 "sqrtpd {$src, $dst|$dst, $src}",
830 [(set VR128:$dst, (v2f64 (fsqrt (load addr:$src))))]>;
Evan Cheng470a6ad2006-02-22 02:26:30 +0000831
Evan Cheng2246f842006-03-18 01:23:20 +0000832def RSQRTPSrr : PSI<0x52, MRMSrcReg, (ops VR128:$dst, VR128:$src),
833 "rsqrtps {$src, $dst|$dst, $src}", []>;
834def RSQRTPSrm : PSI<0x52, MRMSrcMem, (ops VR128:$dst, f128mem:$src),
835 "rsqrtps {$src, $dst|$dst, $src}", []>;
836def RCPPSrr : PSI<0x53, MRMSrcReg, (ops VR128:$dst, VR128:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000837 "rcpps {$src, $dst|$dst, $src}", []>;
Evan Cheng2246f842006-03-18 01:23:20 +0000838def RCPPSrm : PSI<0x53, MRMSrcMem, (ops VR128:$dst, f128mem:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000839 "rcpps {$src, $dst|$dst, $src}", []>;
840
Evan Cheng2246f842006-03-18 01:23:20 +0000841def MAXPSrr : PSI<0x5F, MRMSrcReg, (ops VR128:$dst, VR128:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000842 "maxps {$src, $dst|$dst, $src}", []>;
Evan Cheng2246f842006-03-18 01:23:20 +0000843def MAXPSrm : PSI<0x5F, MRMSrcMem, (ops VR128:$dst, f128mem:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000844 "maxps {$src, $dst|$dst, $src}", []>;
Evan Cheng2246f842006-03-18 01:23:20 +0000845def MAXPDrr : PDI<0x5F, MRMSrcReg, (ops VR128:$dst, VR128:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000846 "maxpd {$src, $dst|$dst, $src}", []>;
Evan Cheng2246f842006-03-18 01:23:20 +0000847def MAXPDrm : PDI<0x5F, MRMSrcMem, (ops VR128:$dst, f128mem:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000848 "maxpd {$src, $dst|$dst, $src}", []>;
Evan Cheng2246f842006-03-18 01:23:20 +0000849def MINPSrr : PSI<0x5D, MRMSrcReg, (ops VR128:$dst, VR128:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000850 "minps {$src, $dst|$dst, $src}", []>;
Evan Cheng2246f842006-03-18 01:23:20 +0000851def MINPSrm : PSI<0x5D, MRMSrcMem, (ops VR128:$dst, f128mem:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000852 "minps {$src, $dst|$dst, $src}", []>;
Evan Cheng2246f842006-03-18 01:23:20 +0000853def MINPDrr : PDI<0x5D, MRMSrcReg, (ops VR128:$dst, VR128:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000854 "minpd {$src, $dst|$dst, $src}", []>;
Evan Cheng2246f842006-03-18 01:23:20 +0000855def MINPDrm : PDI<0x5D, MRMSrcMem, (ops VR128:$dst, f128mem:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000856 "minpd {$src, $dst|$dst, $src}", []>;
Evan Chengffcb95b2006-02-21 19:13:53 +0000857
858// Logical
859let isTwoAddress = 1 in {
860let isCommutable = 1 in {
Evan Cheng2246f842006-03-18 01:23:20 +0000861def ANDPSrr : PSI<0x54, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
862 "andps {$src2, $dst|$dst, $src2}",
Evan Cheng5aa97b22006-03-29 18:47:40 +0000863 [(set VR128:$dst,
864 (and (bc_v4i32 (v4f32 VR128:$src1)),
865 (bc_v4i32 (v4f32 VR128:$src2))))]>;
Evan Cheng2246f842006-03-18 01:23:20 +0000866def ANDPDrr : PDI<0x54, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
Evan Chengffcb95b2006-02-21 19:13:53 +0000867 "andpd {$src2, $dst|$dst, $src2}",
Evan Cheng5aa97b22006-03-29 18:47:40 +0000868 [(set VR128:$dst,
869 (and (bc_v2i64 (v2f64 VR128:$src1)),
870 (bc_v2i64 (v2f64 VR128:$src2))))]>;
Evan Cheng2246f842006-03-18 01:23:20 +0000871def ORPSrr : PSI<0x56, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
872 "orps {$src2, $dst|$dst, $src2}",
Evan Cheng5aa97b22006-03-29 18:47:40 +0000873 [(set VR128:$dst,
874 (or (bc_v4i32 (v4f32 VR128:$src1)),
875 (bc_v4i32 (v4f32 VR128:$src2))))]>;
Evan Cheng2246f842006-03-18 01:23:20 +0000876def ORPDrr : PDI<0x56, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
877 "orpd {$src2, $dst|$dst, $src2}",
Evan Cheng5aa97b22006-03-29 18:47:40 +0000878 [(set VR128:$dst,
879 (or (bc_v2i64 (v2f64 VR128:$src1)),
880 (bc_v2i64 (v2f64 VR128:$src2))))]>;
Evan Cheng2246f842006-03-18 01:23:20 +0000881def XORPSrr : PSI<0x57, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
882 "xorps {$src2, $dst|$dst, $src2}",
Evan Cheng5aa97b22006-03-29 18:47:40 +0000883 [(set VR128:$dst,
884 (xor (bc_v4i32 (v4f32 VR128:$src1)),
885 (bc_v4i32 (v4f32 VR128:$src2))))]>;
Evan Cheng2246f842006-03-18 01:23:20 +0000886def XORPDrr : PDI<0x57, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
887 "xorpd {$src2, $dst|$dst, $src2}",
Evan Cheng5aa97b22006-03-29 18:47:40 +0000888 [(set VR128:$dst,
889 (xor (bc_v2i64 (v2f64 VR128:$src1)),
890 (bc_v2i64 (v2f64 VR128:$src2))))]>;
Evan Chengffcb95b2006-02-21 19:13:53 +0000891}
Evan Cheng2246f842006-03-18 01:23:20 +0000892def ANDPSrm : PSI<0x54, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
893 "andps {$src2, $dst|$dst, $src2}",
Evan Cheng5aa97b22006-03-29 18:47:40 +0000894 [(set VR128:$dst,
895 (and (bc_v4i32 (v4f32 VR128:$src1)),
896 (bc_v4i32 (loadv4f32 addr:$src2))))]>;
Evan Cheng2246f842006-03-18 01:23:20 +0000897def ANDPDrm : PDI<0x54, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
898 "andpd {$src2, $dst|$dst, $src2}",
Evan Cheng5aa97b22006-03-29 18:47:40 +0000899 [(set VR128:$dst,
900 (and (bc_v2i64 (v2f64 VR128:$src1)),
901 (bc_v2i64 (loadv2f64 addr:$src2))))]>;
Evan Cheng2246f842006-03-18 01:23:20 +0000902def ORPSrm : PSI<0x56, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
903 "orps {$src2, $dst|$dst, $src2}",
Evan Cheng5aa97b22006-03-29 18:47:40 +0000904 [(set VR128:$dst,
905 (or (bc_v4i32 (v4f32 VR128:$src1)),
906 (bc_v4i32 (loadv4f32 addr:$src2))))]>;
Evan Cheng2246f842006-03-18 01:23:20 +0000907def ORPDrm : PDI<0x56, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
908 "orpd {$src2, $dst|$dst, $src2}",
Evan Cheng5aa97b22006-03-29 18:47:40 +0000909 [(set VR128:$dst,
910 (or (bc_v2i64 (v2f64 VR128:$src1)),
911 (bc_v2i64 (loadv2f64 addr:$src2))))]>;
Evan Cheng2246f842006-03-18 01:23:20 +0000912def XORPSrm : PSI<0x57, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
913 "xorps {$src2, $dst|$dst, $src2}",
Evan Cheng5aa97b22006-03-29 18:47:40 +0000914 [(set VR128:$dst,
915 (xor (bc_v4i32 (v4f32 VR128:$src1)),
916 (bc_v4i32 (loadv4f32 addr:$src2))))]>;
Evan Cheng2246f842006-03-18 01:23:20 +0000917def XORPDrm : PDI<0x57, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
918 "xorpd {$src2, $dst|$dst, $src2}",
Evan Cheng5aa97b22006-03-29 18:47:40 +0000919 [(set VR128:$dst,
920 (xor (bc_v2i64 (v2f64 VR128:$src1)),
921 (bc_v2i64 (loadv2f64 addr:$src2))))]>;
Evan Cheng2246f842006-03-18 01:23:20 +0000922def ANDNPSrr : PSI<0x55, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
923 "andnps {$src2, $dst|$dst, $src2}",
Evan Cheng5aa97b22006-03-29 18:47:40 +0000924 [(set VR128:$dst,
925 (and (vnot (bc_v4i32 (v4f32 VR128:$src1))),
926 (bc_v4i32 (v4f32 VR128:$src2))))]>;
927def ANDNPSrm : PSI<0x55, MRMSrcMem, (ops VR128:$dst, VR128:$src1,f128mem:$src2),
Evan Cheng2246f842006-03-18 01:23:20 +0000928 "andnps {$src2, $dst|$dst, $src2}",
Evan Cheng5aa97b22006-03-29 18:47:40 +0000929 [(set VR128:$dst,
930 (and (vnot (bc_v4i32 (v4f32 VR128:$src1))),
931 (bc_v4i32 (loadv4f32 addr:$src2))))]>;
Evan Cheng2246f842006-03-18 01:23:20 +0000932def ANDNPDrr : PDI<0x55, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
933 "andnpd {$src2, $dst|$dst, $src2}",
Evan Cheng5aa97b22006-03-29 18:47:40 +0000934 [(set VR128:$dst,
935 (and (vnot (bc_v2i64 (v2f64 VR128:$src1))),
936 (bc_v2i64 (v2f64 VR128:$src2))))]>;
937def ANDNPDrm : PDI<0x55, MRMSrcMem, (ops VR128:$dst, VR128:$src1,f128mem:$src2),
Evan Cheng2246f842006-03-18 01:23:20 +0000938 "andnpd {$src2, $dst|$dst, $src2}",
Evan Cheng5aa97b22006-03-29 18:47:40 +0000939 [(set VR128:$dst,
940 (and (vnot (bc_v2i64 (v2f64 VR128:$src1))),
941 (bc_v2i64 (loadv2f64 addr:$src2))))]>;
Evan Chengffcb95b2006-02-21 19:13:53 +0000942}
Evan Chengbf156d12006-02-21 19:26:52 +0000943
Evan Cheng470a6ad2006-02-22 02:26:30 +0000944let isTwoAddress = 1 in {
945def CMPPSrr : PSI<0xC2, MRMSrcReg,
Evan Cheng2246f842006-03-18 01:23:20 +0000946 (ops VR128:$dst, VR128:$src1, VR128:$src, SSECC:$cc),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000947 "cmp${cc}ps {$src, $dst|$dst, $src}", []>;
948def CMPPSrm : PSI<0xC2, MRMSrcMem,
Evan Cheng2246f842006-03-18 01:23:20 +0000949 (ops VR128:$dst, VR128:$src1, f128mem:$src, SSECC:$cc),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000950 "cmp${cc}ps {$src, $dst|$dst, $src}", []>;
951def CMPPDrr : PDI<0xC2, MRMSrcReg,
Evan Cheng2246f842006-03-18 01:23:20 +0000952 (ops VR128:$dst, VR128:$src1, VR128:$src, SSECC:$cc),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000953 "cmp${cc}pd {$src, $dst|$dst, $src}", []>;
954def CMPPDrm : PDI<0xC2, MRMSrcMem,
Evan Cheng2246f842006-03-18 01:23:20 +0000955 (ops VR128:$dst, VR128:$src1, f128mem:$src, SSECC:$cc),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000956 "cmp${cc}pd {$src, $dst|$dst, $src}", []>;
957}
958
959// Shuffle and unpack instructions
Evan Cheng0cea6d22006-03-22 20:08:18 +0000960let isTwoAddress = 1 in {
Evan Cheng2da953f2006-03-22 07:10:28 +0000961def SHUFPSrr : PSIi8<0xC6, MRMSrcReg,
Evan Cheng0038e592006-03-28 00:39:58 +0000962 (ops VR128:$dst, VR128:$src1, VR128:$src2, i32i8imm:$src3),
Evan Cheng14aed5e2006-03-24 01:18:28 +0000963 "shufps {$src3, $src2, $dst|$dst, $src2, $src3}",
Evan Cheng4f563382006-03-29 01:30:51 +0000964 [(set VR128:$dst, (v4f32 (vector_shuffle
965 VR128:$src1, VR128:$src2,
966 SHUFP_shuffle_mask:$src3)))]>;
Evan Cheng2da953f2006-03-22 07:10:28 +0000967def SHUFPSrm : PSIi8<0xC6, MRMSrcMem,
Evan Cheng0038e592006-03-28 00:39:58 +0000968 (ops VR128:$dst, VR128:$src1, f128mem:$src2, i32i8imm:$src3),
969 "shufps {$src3, $src2, $dst|$dst, $src2, $src3}",
Evan Cheng4f563382006-03-29 01:30:51 +0000970 [(set VR128:$dst, (v4f32 (vector_shuffle
971 VR128:$src1, (load addr:$src2),
972 SHUFP_shuffle_mask:$src3)))]>;
Evan Cheng2da953f2006-03-22 07:10:28 +0000973def SHUFPDrr : PDIi8<0xC6, MRMSrcReg,
974 (ops VR128:$dst, VR128:$src1, VR128:$src2, i8imm:$src3),
Evan Cheng14aed5e2006-03-24 01:18:28 +0000975 "shufpd {$src3, $src2, $dst|$dst, $src2, $src3}",
Evan Cheng4f563382006-03-29 01:30:51 +0000976 [(set VR128:$dst, (v2f64 (vector_shuffle
977 VR128:$src1, VR128:$src2,
978 SHUFP_shuffle_mask:$src3)))]>;
Evan Cheng2da953f2006-03-22 07:10:28 +0000979def SHUFPDrm : PDIi8<0xC6, MRMSrcMem,
980 (ops VR128:$dst, VR128:$src1, f128mem:$src2, i8imm:$src3),
Evan Cheng0038e592006-03-28 00:39:58 +0000981 "shufpd {$src3, $src2, $dst|$dst, $src2, $src3}",
Evan Cheng4f563382006-03-29 01:30:51 +0000982 [(set VR128:$dst, (v2f64 (vector_shuffle
983 VR128:$src1, (load addr:$src2),
984 SHUFP_shuffle_mask:$src3)))]>;
Evan Cheng470a6ad2006-02-22 02:26:30 +0000985
986def UNPCKHPSrr : PSI<0x15, MRMSrcReg,
Evan Cheng2246f842006-03-18 01:23:20 +0000987 (ops VR128:$dst, VR128:$src1, VR128:$src2),
Evan Cheng4fcb9222006-03-28 02:43:26 +0000988 "unpckhps {$src2, $dst|$dst, $src2}",
Evan Cheng4f563382006-03-29 01:30:51 +0000989 [(set VR128:$dst, (v4f32 (vector_shuffle
990 VR128:$src1, VR128:$src2,
991 UNPCKH_shuffle_mask)))]>;
Evan Cheng470a6ad2006-02-22 02:26:30 +0000992def UNPCKHPSrm : PSI<0x15, MRMSrcMem,
Evan Cheng2246f842006-03-18 01:23:20 +0000993 (ops VR128:$dst, VR128:$src1, f128mem:$src2),
Evan Cheng4fcb9222006-03-28 02:43:26 +0000994 "unpckhps {$src2, $dst|$dst, $src2}",
Evan Cheng4f563382006-03-29 01:30:51 +0000995 [(set VR128:$dst, (v4f32 (vector_shuffle
996 VR128:$src1, (load addr:$src2),
997 UNPCKH_shuffle_mask)))]>;
Evan Cheng470a6ad2006-02-22 02:26:30 +0000998def UNPCKHPDrr : PDI<0x15, MRMSrcReg,
Evan Cheng2246f842006-03-18 01:23:20 +0000999 (ops VR128:$dst, VR128:$src1, VR128:$src2),
Evan Cheng4fcb9222006-03-28 02:43:26 +00001000 "unpckhpd {$src2, $dst|$dst, $src2}",
Evan Cheng4f563382006-03-29 01:30:51 +00001001 [(set VR128:$dst, (v2f64 (vector_shuffle
1002 VR128:$src1, VR128:$src2,
1003 UNPCKH_shuffle_mask)))]>;
Evan Cheng470a6ad2006-02-22 02:26:30 +00001004def UNPCKHPDrm : PDI<0x15, MRMSrcMem,
Evan Cheng2246f842006-03-18 01:23:20 +00001005 (ops VR128:$dst, VR128:$src1, f128mem:$src2),
Evan Cheng4fcb9222006-03-28 02:43:26 +00001006 "unpckhpd {$src2, $dst|$dst, $src2}",
Evan Cheng4f563382006-03-29 01:30:51 +00001007 [(set VR128:$dst, (v2f64 (vector_shuffle
1008 VR128:$src1, (load addr:$src2),
1009 UNPCKH_shuffle_mask)))]>;
Evan Cheng4fcb9222006-03-28 02:43:26 +00001010
Evan Cheng470a6ad2006-02-22 02:26:30 +00001011def UNPCKLPSrr : PSI<0x14, MRMSrcReg,
Evan Cheng2246f842006-03-18 01:23:20 +00001012 (ops VR128:$dst, VR128:$src1, VR128:$src2),
Evan Chengc60bd972006-03-25 09:37:23 +00001013 "unpcklps {$src2, $dst|$dst, $src2}",
Evan Cheng4f563382006-03-29 01:30:51 +00001014 [(set VR128:$dst, (v4f32 (vector_shuffle
1015 VR128:$src1, VR128:$src2,
1016 UNPCKL_shuffle_mask)))]>;
Evan Cheng470a6ad2006-02-22 02:26:30 +00001017def UNPCKLPSrm : PSI<0x14, MRMSrcMem,
Evan Cheng2246f842006-03-18 01:23:20 +00001018 (ops VR128:$dst, VR128:$src1, f128mem:$src2),
Evan Chengc60bd972006-03-25 09:37:23 +00001019 "unpcklps {$src2, $dst|$dst, $src2}",
Evan Cheng4f563382006-03-29 01:30:51 +00001020 [(set VR128:$dst, (v4f32 (vector_shuffle
1021 VR128:$src1, (load addr:$src2),
1022 UNPCKL_shuffle_mask)))]>;
Evan Cheng470a6ad2006-02-22 02:26:30 +00001023def UNPCKLPDrr : PDI<0x14, MRMSrcReg,
Evan Cheng2246f842006-03-18 01:23:20 +00001024 (ops VR128:$dst, VR128:$src1, VR128:$src2),
Evan Cheng4fcb9222006-03-28 02:43:26 +00001025 "unpcklpd {$src2, $dst|$dst, $src2}",
Evan Cheng4f563382006-03-29 01:30:51 +00001026 [(set VR128:$dst, (v2f64 (vector_shuffle
1027 VR128:$src1, VR128:$src2,
1028 UNPCKL_shuffle_mask)))]>;
Evan Cheng470a6ad2006-02-22 02:26:30 +00001029def UNPCKLPDrm : PDI<0x14, MRMSrcMem,
Evan Cheng2246f842006-03-18 01:23:20 +00001030 (ops VR128:$dst, VR128:$src1, f128mem:$src2),
Evan Cheng4fcb9222006-03-28 02:43:26 +00001031 "unpcklpd {$src2, $dst|$dst, $src2}",
Evan Cheng4f563382006-03-29 01:30:51 +00001032 [(set VR128:$dst, (v2f64 (vector_shuffle
1033 VR128:$src1, (load addr:$src2),
1034 UNPCKL_shuffle_mask)))]>;
Evan Cheng2c0dbd02006-03-24 02:58:06 +00001035}
Evan Cheng470a6ad2006-02-22 02:26:30 +00001036
Evan Chengbf156d12006-02-21 19:26:52 +00001037//===----------------------------------------------------------------------===//
Evan Cheng4e4c71e2006-02-21 20:00:20 +00001038// SSE integer instructions
Evan Chengbf156d12006-02-21 19:26:52 +00001039//===----------------------------------------------------------------------===//
1040
Evan Cheng4e4c71e2006-02-21 20:00:20 +00001041// Move Instructions
Evan Cheng470a6ad2006-02-22 02:26:30 +00001042def MOVD128rr : PDI<0x6E, MRMSrcReg, (ops VR128:$dst, R32:$src),
Evan Cheng24dc1f52006-03-23 07:44:07 +00001043 "movd {$src, $dst|$dst, $src}",
Evan Cheng48090aa2006-03-21 23:01:21 +00001044 [(set VR128:$dst,
1045 (v4i32 (scalar_to_vector R32:$src)))]>;
Evan Cheng470a6ad2006-02-22 02:26:30 +00001046def MOVD128rm : PDI<0x6E, MRMSrcMem, (ops VR128:$dst, i32mem:$src),
Evan Chengbc4832b2006-03-24 23:15:12 +00001047 "movd {$src, $dst|$dst, $src}",
1048 [(set VR128:$dst,
1049 (v4i32 (scalar_to_vector (loadi32 addr:$src))))]>;
1050
Evan Cheng470a6ad2006-02-22 02:26:30 +00001051def MOVD128mr : PDI<0x7E, MRMDestMem, (ops i32mem:$dst, VR128:$src),
1052 "movd {$src, $dst|$dst, $src}", []>;
Evan Chengbf156d12006-02-21 19:26:52 +00001053
Evan Cheng24dc1f52006-03-23 07:44:07 +00001054def MOVDQArr : PDI<0x6F, MRMSrcReg, (ops VR128:$dst, VR128:$src),
1055 "movdqa {$src, $dst|$dst, $src}", []>;
1056def MOVDQArm : PDI<0x6F, MRMSrcMem, (ops VR128:$dst, i128mem:$src),
1057 "movdqa {$src, $dst|$dst, $src}",
1058 [(set VR128:$dst, (loadv4i32 addr:$src))]>;
1059def MOVDQAmr : PDI<0x7F, MRMDestMem, (ops i128mem:$dst, VR128:$src),
1060 "movdqa {$src, $dst|$dst, $src}",
1061 [(store (v4i32 VR128:$src), addr:$dst)]>;
1062
Evan Cheng470a6ad2006-02-22 02:26:30 +00001063// SSE2 instructions with XS prefix
Evan Cheng4e4c71e2006-02-21 20:00:20 +00001064def MOVQ128rr : I<0x7E, MRMSrcReg, (ops VR128:$dst, VR64:$src),
Evan Cheng48090aa2006-03-21 23:01:21 +00001065 "movq {$src, $dst|$dst, $src}",
1066 [(set VR128:$dst,
1067 (v2i64 (scalar_to_vector VR64:$src)))]>, XS,
Evan Cheng4e4c71e2006-02-21 20:00:20 +00001068 Requires<[HasSSE2]>;
1069def MOVQ128rm : I<0x7E, MRMSrcMem, (ops VR128:$dst, i64mem:$src),
Evan Chengbc4832b2006-03-24 23:15:12 +00001070 "movq {$src, $dst|$dst, $src}", []>, XS,
1071 Requires<[HasSSE2]>;
Evan Cheng470a6ad2006-02-22 02:26:30 +00001072def MOVQ128mr : PDI<0xD6, MRMSrcMem, (ops i64mem:$dst, VR128:$src),
1073 "movq {$src, $dst|$dst, $src}", []>;
Evan Cheng82521dd2006-03-21 07:09:35 +00001074
Evan Chenga971f6f2006-03-23 01:57:24 +00001075// 128-bit Integer Arithmetic
1076let isTwoAddress = 1 in {
1077let isCommutable = 1 in {
1078def PADDBrr : PDI<0xFC, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
1079 "paddb {$src2, $dst|$dst, $src2}",
1080 [(set VR128:$dst, (v16i8 (add VR128:$src1, VR128:$src2)))]>;
1081def PADDWrr : PDI<0xFD, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
1082 "paddw {$src2, $dst|$dst, $src2}",
1083 [(set VR128:$dst, (v8i16 (add VR128:$src1, VR128:$src2)))]>;
1084def PADDDrr : PDI<0xFE, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
1085 "paddd {$src2, $dst|$dst, $src2}",
1086 [(set VR128:$dst, (v4i32 (add VR128:$src1, VR128:$src2)))]>;
Evan Cheng506d3df2006-03-29 23:07:14 +00001087
1088def PADDQrr : PDI<0xD4, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
1089 "paddq {$src2, $dst|$dst, $src2}",
1090 [(set VR128:$dst, (v2i64 (add VR128:$src1, VR128:$src2)))]>;
Evan Chenga971f6f2006-03-23 01:57:24 +00001091}
1092def PADDBrm : PDI<0xFC, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
1093 "paddb {$src2, $dst|$dst, $src2}",
1094 [(set VR128:$dst, (v16i8 (add VR128:$src1,
1095 (load addr:$src2))))]>;
1096def PADDWrm : PDI<0xFD, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
1097 "paddw {$src2, $dst|$dst, $src2}",
1098 [(set VR128:$dst, (v8i16 (add VR128:$src1,
1099 (load addr:$src2))))]>;
1100def PADDDrm : PDI<0xFE, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
1101 "paddd {$src2, $dst|$dst, $src2}",
1102 [(set VR128:$dst, (v4i32 (add VR128:$src1,
1103 (load addr:$src2))))]>;
Evan Cheng506d3df2006-03-29 23:07:14 +00001104def PADDQrm : PDI<0xD4, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
1105 "paddd {$src2, $dst|$dst, $src2}",
1106 [(set VR128:$dst, (v2i64 (add VR128:$src1,
1107 (load addr:$src2))))]>;
Evan Cheng7b1d34b2006-03-25 01:33:37 +00001108
1109def PSUBBrr : PDI<0xF8, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
1110 "psubb {$src2, $dst|$dst, $src2}",
1111 [(set VR128:$dst, (v16i8 (sub VR128:$src1, VR128:$src2)))]>;
1112def PSUBWrr : PDI<0xF9, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
1113 "psubw {$src2, $dst|$dst, $src2}",
1114 [(set VR128:$dst, (v8i16 (sub VR128:$src1, VR128:$src2)))]>;
1115def PSUBDrr : PDI<0xFA, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
1116 "psubd {$src2, $dst|$dst, $src2}",
1117 [(set VR128:$dst, (v4i32 (sub VR128:$src1, VR128:$src2)))]>;
Evan Cheng506d3df2006-03-29 23:07:14 +00001118def PSUBQrr : PDI<0xFB, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
1119 "psubq {$src2, $dst|$dst, $src2}",
1120 [(set VR128:$dst, (v2i64 (sub VR128:$src1, VR128:$src2)))]>;
Evan Cheng7b1d34b2006-03-25 01:33:37 +00001121
1122def PSUBBrm : PDI<0xF8, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
1123 "psubb {$src2, $dst|$dst, $src2}",
1124 [(set VR128:$dst, (v16i8 (sub VR128:$src1,
1125 (load addr:$src2))))]>;
1126def PSUBWrm : PDI<0xF9, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
1127 "psubw {$src2, $dst|$dst, $src2}",
1128 [(set VR128:$dst, (v8i16 (sub VR128:$src1,
1129 (load addr:$src2))))]>;
1130def PSUBDrm : PDI<0xFA, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
1131 "psubd {$src2, $dst|$dst, $src2}",
1132 [(set VR128:$dst, (v4i32 (sub VR128:$src1,
1133 (load addr:$src2))))]>;
Evan Cheng506d3df2006-03-29 23:07:14 +00001134def PSUBQrm : PDI<0xFB, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
1135 "psubd {$src2, $dst|$dst, $src2}",
1136 [(set VR128:$dst, (v2i64 (sub VR128:$src1,
1137 (load addr:$src2))))]>;
1138}
Evan Chengc60bd972006-03-25 09:37:23 +00001139
Evan Cheng506d3df2006-03-29 23:07:14 +00001140// Logical
1141let isTwoAddress = 1 in {
1142let isCommutable = 1 in {
1143def PANDrr : PDI<0xDB, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
1144 "pand {$src2, $dst|$dst, $src2}",
1145 [(set VR128:$dst, (v2i64 (and VR128:$src1, VR128:$src2)))]>;
1146
1147def PANDrm : PDI<0xDB, MRMSrcMem, (ops VR128:$dst, VR128:$src1, i128mem:$src2),
1148 "pand {$src2, $dst|$dst, $src2}",
1149 [(set VR128:$dst, (v2i64 (and VR128:$src1,
1150 (load addr:$src2))))]>;
1151def PORrr : PDI<0xDB, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
1152 "por {$src2, $dst|$dst, $src2}",
1153 [(set VR128:$dst, (v2i64 (or VR128:$src1, VR128:$src2)))]>;
1154
1155def PORrm : PDI<0xDB, MRMSrcMem, (ops VR128:$dst, VR128:$src1, i128mem:$src2),
1156 "por {$src2, $dst|$dst, $src2}",
1157 [(set VR128:$dst, (v2i64 (or VR128:$src1,
1158 (load addr:$src2))))]>;
1159def PXORrr : PDI<0xEF, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
1160 "pxor {$src2, $dst|$dst, $src2}",
1161 [(set VR128:$dst, (v2i64 (xor VR128:$src1, VR128:$src2)))]>;
1162
1163def PXORrm : PDI<0xEF, MRMSrcMem, (ops VR128:$dst, VR128:$src1, i128mem:$src2),
1164 "pxor {$src2, $dst|$dst, $src2}",
1165 [(set VR128:$dst, (v2i64 (xor VR128:$src1,
1166 (load addr:$src2))))]>;
1167}
1168
1169def PANDNrr : PDI<0xDF, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
1170 "pandn {$src2, $dst|$dst, $src2}",
1171 [(set VR128:$dst, (v2i64 (and (vnot VR128:$src1),
1172 VR128:$src2)))]>;
1173
1174def PANDNrm : PDI<0xDF, MRMSrcMem, (ops VR128:$dst, VR128:$src1, i128mem:$src2),
1175 "pandn {$src2, $dst|$dst, $src2}",
1176 [(set VR128:$dst, (v2i64 (and (vnot VR128:$src1),
1177 (load addr:$src2))))]>;
1178}
1179
1180// Pack instructions
1181let isTwoAddress = 1 in {
1182def PACKSSWBrr : PDI<0x63, MRMSrcReg, (ops VR128:$dst, VR128:$src1,
1183 VR128:$src2),
1184 "packsswb {$src2, $dst|$dst, $src2}",
Evan Cheng591f7402006-03-29 23:53:14 +00001185 [(set VR128:$dst, (v8i16 (int_x86_sse2_packsswb_128
1186 VR128:$src1,
1187 VR128:$src2)))]>;
Evan Cheng506d3df2006-03-29 23:07:14 +00001188def PACKSSWBrm : PDI<0x63, MRMSrcMem, (ops VR128:$dst, VR128:$src1,
1189 i128mem:$src2),
1190 "packsswb {$src2, $dst|$dst, $src2}",
Evan Cheng591f7402006-03-29 23:53:14 +00001191 [(set VR128:$dst, (v8i16 (int_x86_sse2_packsswb_128
1192 VR128:$src1,
1193 (bc_v8i16 (loadv2f64 addr:$src2)))))]>;
Evan Cheng506d3df2006-03-29 23:07:14 +00001194def PACKSSDWrr : PDI<0x6B, MRMSrcReg, (ops VR128:$dst, VR128:$src1,
1195 VR128:$src2),
Evan Cheng591f7402006-03-29 23:53:14 +00001196 "packssdw {$src2, $dst|$dst, $src2}",
1197 [(set VR128:$dst, (v4i32 (int_x86_sse2_packssdw_128
1198 VR128:$src1,
1199 VR128:$src2)))]>;
Evan Cheng506d3df2006-03-29 23:07:14 +00001200def PACKSSDWrm : PDI<0x6B, MRMSrcReg, (ops VR128:$dst, VR128:$src1,
1201 i128mem:$src2),
Evan Cheng591f7402006-03-29 23:53:14 +00001202 "packssdw {$src2, $dst|$dst, $src2}",
1203 [(set VR128:$dst, (v4i32 (int_x86_sse2_packssdw_128
1204 VR128:$src1,
1205 (bc_v4i32 (loadv2i64 addr:$src2)))))]>;
Evan Cheng506d3df2006-03-29 23:07:14 +00001206def PACKUSWBrr : PDI<0x67, MRMSrcReg, (ops VR128:$dst, VR128:$src1,
1207 VR128:$src2),
1208 "packuswb {$src2, $dst|$dst, $src2}",
Evan Cheng591f7402006-03-29 23:53:14 +00001209 [(set VR128:$dst, (v8i16 (int_x86_sse2_packuswb_128
1210 VR128:$src1,
1211 VR128:$src2)))]>;
Evan Cheng506d3df2006-03-29 23:07:14 +00001212def PACKUSWBrm : PDI<0x67, MRMSrcReg, (ops VR128:$dst, VR128:$src1,
1213 i128mem:$src2),
1214 "packuswb {$src2, $dst|$dst, $src2}",
Evan Cheng591f7402006-03-29 23:53:14 +00001215 [(set VR128:$dst, (v8i16 (int_x86_sse2_packuswb_128
1216 VR128:$src1,
1217 (bc_v8i16 (loadv2i64 addr:$src2)))))]>;
Evan Cheng506d3df2006-03-29 23:07:14 +00001218}
1219
1220// Shuffle and unpack instructions
1221def PSHUFWrr : PSIi8<0x70, MRMDestReg,
1222 (ops VR64:$dst, VR64:$src1, i8imm:$src2),
1223 "pshufw {$src2, $src1, $dst|$dst, $src1, $src2}", []>;
1224def PSHUFWrm : PSIi8<0x70, MRMSrcMem,
1225 (ops VR64:$dst, i64mem:$src1, i8imm:$src2),
1226 "pshufw {$src2, $src1, $dst|$dst, $src1, $src2}", []>;
1227
1228def PSHUFDrr : PDIi8<0x70, MRMDestReg,
1229 (ops VR128:$dst, VR128:$src1, i8imm:$src2),
1230 "pshufd {$src2, $src1, $dst|$dst, $src1, $src2}",
1231 [(set VR128:$dst, (v4i32 (vector_shuffle
1232 VR128:$src1, (undef),
1233 PSHUFD_shuffle_mask:$src2)))]>;
1234def PSHUFDrm : PDIi8<0x70, MRMSrcMem,
1235 (ops VR128:$dst, i128mem:$src1, i8imm:$src2),
1236 "pshufd {$src2, $src1, $dst|$dst, $src1, $src2}",
1237 [(set VR128:$dst, (v4i32 (vector_shuffle
1238 (load addr:$src1), (undef),
1239 PSHUFD_shuffle_mask:$src2)))]>;
1240
1241// SSE2 with ImmT == Imm8 and XS prefix.
1242def PSHUFHWrr : Ii8<0x70, MRMDestReg,
1243 (ops VR128:$dst, VR128:$src1, i8imm:$src2),
1244 "pshufhw {$src2, $src1, $dst|$dst, $src1, $src2}",
1245 [(set VR128:$dst, (v8i16 (vector_shuffle
1246 VR128:$src1, (undef),
1247 PSHUFHW_shuffle_mask:$src2)))]>,
1248 XS, Requires<[HasSSE2]>;
1249def PSHUFHWrm : Ii8<0x70, MRMDestMem,
1250 (ops VR128:$dst, i128mem:$src1, i8imm:$src2),
1251 "pshufhw {$src2, $src1, $dst|$dst, $src1, $src2}",
1252 [(set VR128:$dst, (v8i16 (vector_shuffle
1253 (bc_v8i16 (loadv2i64 addr:$src1)), (undef),
1254 PSHUFHW_shuffle_mask:$src2)))]>,
1255 XS, Requires<[HasSSE2]>;
1256
1257// SSE2 with ImmT == Imm8 and XD prefix.
1258def PSHUFLWrr : Ii8<0x70, MRMDestReg,
1259 (ops VR128:$dst, VR128:$src1, i32i8imm:$src2),
1260 "pshufLw {$src2, $src1, $dst|$dst, $src1, $src2}",
1261 [(set VR128:$dst, (v8i16 (vector_shuffle
1262 VR128:$src1, (undef),
1263 PSHUFLW_shuffle_mask:$src2)))]>,
1264 XD, Requires<[HasSSE2]>;
1265def PSHUFLWrm : Ii8<0x70, MRMDestMem,
1266 (ops VR128:$dst, i128mem:$src1, i32i8imm:$src2),
1267 "pshufLw {$src2, $src1, $dst|$dst, $src1, $src2}",
1268 [(set VR128:$dst, (v8i16 (vector_shuffle
1269 (bc_v8i16 (loadv2i64 addr:$src1)), (undef),
1270 PSHUFLW_shuffle_mask:$src2)))]>,
1271 XD, Requires<[HasSSE2]>;
1272
1273let isTwoAddress = 1 in {
Evan Chengc60bd972006-03-25 09:37:23 +00001274def PUNPCKLBWrr : PDI<0x60, MRMSrcReg,
1275 (ops VR128:$dst, VR128:$src1, VR128:$src2),
1276 "punpcklbw {$src2, $dst|$dst, $src2}",
Evan Cheng0038e592006-03-28 00:39:58 +00001277 [(set VR128:$dst,
1278 (v16i8 (vector_shuffle VR128:$src1, VR128:$src2,
1279 UNPCKL_shuffle_mask)))]>;
Evan Chengc60bd972006-03-25 09:37:23 +00001280def PUNPCKLBWrm : PDI<0x60, MRMSrcMem,
1281 (ops VR128:$dst, VR128:$src1, i128mem:$src2),
1282 "punpcklbw {$src2, $dst|$dst, $src2}",
Evan Cheng0038e592006-03-28 00:39:58 +00001283 [(set VR128:$dst,
1284 (v16i8 (vector_shuffle VR128:$src1, (load addr:$src2),
1285 UNPCKL_shuffle_mask)))]>;
Evan Chengc60bd972006-03-25 09:37:23 +00001286def PUNPCKLWDrr : PDI<0x61, MRMSrcReg,
1287 (ops VR128:$dst, VR128:$src1, VR128:$src2),
1288 "punpcklwd {$src2, $dst|$dst, $src2}",
Evan Cheng0038e592006-03-28 00:39:58 +00001289 [(set VR128:$dst,
1290 (v8i16 (vector_shuffle VR128:$src1, VR128:$src2,
1291 UNPCKL_shuffle_mask)))]>;
Evan Chengc60bd972006-03-25 09:37:23 +00001292def PUNPCKLWDrm : PDI<0x61, MRMSrcMem,
1293 (ops VR128:$dst, VR128:$src1, i128mem:$src2),
1294 "punpcklwd {$src2, $dst|$dst, $src2}",
Evan Cheng0038e592006-03-28 00:39:58 +00001295 [(set VR128:$dst,
1296 (v8i16 (vector_shuffle VR128:$src1, (load addr:$src2),
1297 UNPCKL_shuffle_mask)))]>;
Evan Chengc60bd972006-03-25 09:37:23 +00001298def PUNPCKLDQrr : PDI<0x62, MRMSrcReg,
1299 (ops VR128:$dst, VR128:$src1, VR128:$src2),
1300 "punpckldq {$src2, $dst|$dst, $src2}",
Evan Cheng0038e592006-03-28 00:39:58 +00001301 [(set VR128:$dst,
1302 (v4i32 (vector_shuffle VR128:$src1, VR128:$src2,
1303 UNPCKL_shuffle_mask)))]>;
Evan Chengc60bd972006-03-25 09:37:23 +00001304def PUNPCKLDQrm : PDI<0x62, MRMSrcMem,
1305 (ops VR128:$dst, VR128:$src1, i128mem:$src2),
1306 "punpckldq {$src2, $dst|$dst, $src2}",
Evan Cheng0038e592006-03-28 00:39:58 +00001307 [(set VR128:$dst,
1308 (v4i32 (vector_shuffle VR128:$src1, (load addr:$src2),
1309 UNPCKL_shuffle_mask)))]>;
Evan Chengc60bd972006-03-25 09:37:23 +00001310def PUNPCKLQDQrr : PDI<0x6C, MRMSrcReg,
1311 (ops VR128:$dst, VR128:$src1, VR128:$src2),
Evan Cheng4fcb9222006-03-28 02:43:26 +00001312 "punpcklqdq {$src2, $dst|$dst, $src2}",
1313 [(set VR128:$dst,
1314 (v2i64 (vector_shuffle VR128:$src1, VR128:$src2,
1315 UNPCKL_shuffle_mask)))]>;
Evan Chengc60bd972006-03-25 09:37:23 +00001316def PUNPCKLQDQrm : PDI<0x6C, MRMSrcMem,
1317 (ops VR128:$dst, VR128:$src1, i128mem:$src2),
Evan Cheng4fcb9222006-03-28 02:43:26 +00001318 "punpcklqdq {$src2, $dst|$dst, $src2}",
1319 [(set VR128:$dst,
1320 (v2i64 (vector_shuffle VR128:$src1, (load addr:$src2),
1321 UNPCKL_shuffle_mask)))]>;
Evan Chengc60bd972006-03-25 09:37:23 +00001322
1323def PUNPCKHBWrr : PDI<0x68, MRMSrcReg,
1324 (ops VR128:$dst, VR128:$src1, VR128:$src2),
Evan Cheng4fcb9222006-03-28 02:43:26 +00001325 "punpckhbw {$src2, $dst|$dst, $src2}",
1326 [(set VR128:$dst,
1327 (v16i8 (vector_shuffle VR128:$src1, VR128:$src2,
1328 UNPCKH_shuffle_mask)))]>;
Evan Chengc60bd972006-03-25 09:37:23 +00001329def PUNPCKHBWrm : PDI<0x68, MRMSrcMem,
1330 (ops VR128:$dst, VR128:$src1, i128mem:$src2),
Evan Cheng4fcb9222006-03-28 02:43:26 +00001331 "punpckhbw {$src2, $dst|$dst, $src2}",
1332 [(set VR128:$dst,
1333 (v16i8 (vector_shuffle VR128:$src1, (load addr:$src2),
1334 UNPCKH_shuffle_mask)))]>;
Evan Chengc60bd972006-03-25 09:37:23 +00001335def PUNPCKHWDrr : PDI<0x69, MRMSrcReg,
1336 (ops VR128:$dst, VR128:$src1, VR128:$src2),
Evan Cheng4fcb9222006-03-28 02:43:26 +00001337 "punpckhwd {$src2, $dst|$dst, $src2}",
1338 [(set VR128:$dst,
1339 (v8i16 (vector_shuffle VR128:$src1, VR128:$src2,
1340 UNPCKH_shuffle_mask)))]>;
Evan Chengc60bd972006-03-25 09:37:23 +00001341def PUNPCKHWDrm : PDI<0x69, MRMSrcMem,
1342 (ops VR128:$dst, VR128:$src1, i128mem:$src2),
Evan Cheng4fcb9222006-03-28 02:43:26 +00001343 "punpckhwd {$src2, $dst|$dst, $src2}",
1344 [(set VR128:$dst,
1345 (v8i16 (vector_shuffle VR128:$src1, (load addr:$src2),
1346 UNPCKH_shuffle_mask)))]>;
Evan Chengc60bd972006-03-25 09:37:23 +00001347def PUNPCKHDQrr : PDI<0x6A, MRMSrcReg,
1348 (ops VR128:$dst, VR128:$src1, VR128:$src2),
Evan Cheng4fcb9222006-03-28 02:43:26 +00001349 "punpckhdq {$src2, $dst|$dst, $src2}",
1350 [(set VR128:$dst,
1351 (v4i32 (vector_shuffle VR128:$src1, VR128:$src2,
1352 UNPCKH_shuffle_mask)))]>;
Evan Chengc60bd972006-03-25 09:37:23 +00001353def PUNPCKHDQrm : PDI<0x6A, MRMSrcMem,
1354 (ops VR128:$dst, VR128:$src1, i128mem:$src2),
Evan Cheng4fcb9222006-03-28 02:43:26 +00001355 "punpckhdq {$src2, $dst|$dst, $src2}",
1356 [(set VR128:$dst,
1357 (v4i32 (vector_shuffle VR128:$src1, (load addr:$src2),
1358 UNPCKH_shuffle_mask)))]>;
Evan Chengc60bd972006-03-25 09:37:23 +00001359def PUNPCKHQDQrr : PDI<0x6D, MRMSrcReg,
1360 (ops VR128:$dst, VR128:$src1, VR128:$src2),
Evan Cheng4fcb9222006-03-28 02:43:26 +00001361 "punpckhdq {$src2, $dst|$dst, $src2}",
1362 [(set VR128:$dst,
1363 (v2i64 (vector_shuffle VR128:$src1, VR128:$src2,
1364 UNPCKH_shuffle_mask)))]>;
Evan Chengc60bd972006-03-25 09:37:23 +00001365def PUNPCKHQDQrm : PDI<0x6D, MRMSrcMem,
1366 (ops VR128:$dst, VR128:$src1, i128mem:$src2),
Evan Cheng4fcb9222006-03-28 02:43:26 +00001367 "punpckhqdq {$src2, $dst|$dst, $src2}",
1368 [(set VR128:$dst,
1369 (v2i64 (vector_shuffle VR128:$src1, (load addr:$src2),
1370 UNPCKH_shuffle_mask)))]>;
Evan Chenga971f6f2006-03-23 01:57:24 +00001371}
Evan Cheng82521dd2006-03-21 07:09:35 +00001372
1373//===----------------------------------------------------------------------===//
Evan Chengc653d482006-03-24 22:28:37 +00001374// Miscellaneous Instructions
1375//===----------------------------------------------------------------------===//
1376
Evan Chengecac9cb2006-03-25 06:03:26 +00001377// Prefetching loads
1378def PREFETCHT0 : I<0x18, MRM1m, (ops i8mem:$src),
1379 "prefetcht0 $src", []>, TB,
1380 Requires<[HasSSE1]>;
1381def PREFETCHT1 : I<0x18, MRM2m, (ops i8mem:$src),
1382 "prefetcht0 $src", []>, TB,
1383 Requires<[HasSSE1]>;
1384def PREFETCHT2 : I<0x18, MRM3m, (ops i8mem:$src),
1385 "prefetcht0 $src", []>, TB,
1386 Requires<[HasSSE1]>;
1387def PREFETCHTNTA : I<0x18, MRM0m, (ops i8mem:$src),
1388 "prefetcht0 $src", []>, TB,
1389 Requires<[HasSSE1]>;
1390
1391// Non-temporal stores
1392def MOVNTQ : I<0xE7, MRMDestMem, (ops i64mem:$dst, VR64:$src),
1393 "movntq {$src, $dst|$dst, $src}", []>, TB,
1394 Requires<[HasSSE1]>;
1395def MOVNTPS : I<0x2B, MRMDestMem, (ops i128mem:$dst, VR128:$src),
1396 "movntps {$src, $dst|$dst, $src}", []>, TB,
1397 Requires<[HasSSE1]>;
1398def MASKMOVQ : I<0xF7, MRMDestMem, (ops i64mem:$dst, VR64:$src),
1399 "maskmovq {$src, $dst|$dst, $src}", []>, TB,
1400 Requires<[HasSSE1]>;
1401
1402// Store fence
1403def SFENCE : I<0xAE, MRM7m, (ops),
1404 "sfence", []>, TB, Requires<[HasSSE1]>;
1405
1406// Load MXCSR register
Evan Chengc653d482006-03-24 22:28:37 +00001407def LDMXCSR : I<0xAE, MRM2m, (ops i32mem:$src),
1408 "ldmxcsr {$src|$src}", []>, TB, Requires<[HasSSE1]>;
1409
1410//===----------------------------------------------------------------------===//
Evan Cheng82521dd2006-03-21 07:09:35 +00001411// Alias Instructions
1412//===----------------------------------------------------------------------===//
1413
Evan Chengffea91e2006-03-26 09:53:12 +00001414// Alias instructions that map zero vector to pxor / xorp* for sse.
Evan Cheng386031a2006-03-24 07:29:27 +00001415// FIXME: remove when we can teach regalloc that xor reg, reg is ok.
Evan Chengffea91e2006-03-26 09:53:12 +00001416def V_SET0_PI : PDI<0xEF, MRMInitReg, (ops VR128:$dst),
1417 "pxor $dst, $dst",
1418 [(set VR128:$dst, (v2i64 immAllZerosV))]>;
1419def V_SET0_PS : PSI<0x57, MRMInitReg, (ops VR128:$dst),
1420 "xorps $dst, $dst",
1421 [(set VR128:$dst, (v4f32 immAllZerosV))]>;
1422def V_SET0_PD : PDI<0x57, MRMInitReg, (ops VR128:$dst),
1423 "xorpd $dst, $dst",
1424 [(set VR128:$dst, (v2f64 immAllZerosV))]>;
Evan Cheng386031a2006-03-24 07:29:27 +00001425
Evan Chenga0b3afb2006-03-27 07:00:16 +00001426def V_SETALLONES : PDI<0x76, MRMInitReg, (ops VR128:$dst),
1427 "pcmpeqd $dst, $dst",
1428 [(set VR128:$dst, (v2f64 immAllOnesV))]>;
1429
Evan Chengbc4832b2006-03-24 23:15:12 +00001430// Scalar to 128-bit vector with zero extension.
1431// Three operand (but two address) aliases.
1432let isTwoAddress = 1 in {
1433def MOVZSS128rr : SSI<0x10, MRMSrcReg, (ops VR128:$dst, VR128:$src1, FR32:$src2),
1434 "movss {$src2, $dst|$dst, $src2}", []>;
1435def MOVZSD128rr : SDI<0x10, MRMSrcReg, (ops VR128:$dst, VR128:$src1, FR64:$src2),
1436 "movsd {$src2, $dst|$dst, $src2}", []>;
1437def MOVZD128rr : PDI<0x6E, MRMSrcReg, (ops VR128:$dst, VR128:$src1, R32:$src2),
1438 "movd {$src2, $dst|$dst, $src2}", []>;
1439def MOVZQ128rr : I<0x7E, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR64:$src2),
1440 "movq {$src2, $dst|$dst, $src2}", []>;
1441}
Evan Cheng82521dd2006-03-21 07:09:35 +00001442
Evan Chengbc4832b2006-03-24 23:15:12 +00001443// Loading from memory automatically zeroing upper bits.
1444def MOVZSS128rm : SSI<0x10, MRMSrcMem, (ops VR128:$dst, f32mem:$src),
1445 "movss {$src, $dst|$dst, $src}",
Evan Cheng82521dd2006-03-21 07:09:35 +00001446 [(set VR128:$dst,
Evan Chengbc4832b2006-03-24 23:15:12 +00001447 (v4f32 (X86zexts2vec (loadf32 addr:$src))))]>;
1448def MOVZSD128rm : SDI<0x10, MRMSrcMem, (ops VR128:$dst, f64mem:$src),
1449 "movsd {$src, $dst|$dst, $src}",
1450 [(set VR128:$dst,
1451 (v2f64 (X86zexts2vec (loadf64 addr:$src))))]>;
1452def MOVZD128rm : PDI<0x6E, MRMSrcMem, (ops VR128:$dst, i32mem:$src),
1453 "movd {$src, $dst|$dst, $src}",
1454 [(set VR128:$dst,
1455 (v4i32 (X86zexts2vec (loadi32 addr:$src))))]>;
Evan Cheng48090aa2006-03-21 23:01:21 +00001456
1457//===----------------------------------------------------------------------===//
1458// Non-Instruction Patterns
1459//===----------------------------------------------------------------------===//
1460
1461// 128-bit vector undef's.
1462def : Pat<(v2f64 (undef)), (IMPLICIT_DEF_VR128)>, Requires<[HasSSE2]>;
1463def : Pat<(v16i8 (undef)), (IMPLICIT_DEF_VR128)>, Requires<[HasSSE2]>;
1464def : Pat<(v8i16 (undef)), (IMPLICIT_DEF_VR128)>, Requires<[HasSSE2]>;
1465def : Pat<(v4i32 (undef)), (IMPLICIT_DEF_VR128)>, Requires<[HasSSE2]>;
1466def : Pat<(v2i64 (undef)), (IMPLICIT_DEF_VR128)>, Requires<[HasSSE2]>;
1467
Evan Chengffea91e2006-03-26 09:53:12 +00001468// 128-bit vector all zero's.
1469def : Pat<(v16i8 immAllZerosV), (v16i8 (V_SET0_PI))>, Requires<[HasSSE2]>;
1470def : Pat<(v8i16 immAllZerosV), (v8i16 (V_SET0_PI))>, Requires<[HasSSE2]>;
1471def : Pat<(v4i32 immAllZerosV), (v4i32 (V_SET0_PI))>, Requires<[HasSSE2]>;
1472
Evan Chenga0b3afb2006-03-27 07:00:16 +00001473// 128-bit vector all one's.
1474def : Pat<(v16i8 immAllOnesV), (v16i8 (V_SETALLONES))>, Requires<[HasSSE2]>;
1475def : Pat<(v8i16 immAllOnesV), (v8i16 (V_SETALLONES))>, Requires<[HasSSE2]>;
1476def : Pat<(v4i32 immAllOnesV), (v4i32 (V_SETALLONES))>, Requires<[HasSSE2]>;
1477def : Pat<(v2i64 immAllOnesV), (v2i64 (V_SETALLONES))>, Requires<[HasSSE2]>;
1478def : Pat<(v4f32 immAllOnesV), (v4f32 (V_SETALLONES))>, Requires<[HasSSE1]>;
1479
Evan Chenga971f6f2006-03-23 01:57:24 +00001480// Load 128-bit integer vector values.
Evan Cheng24dc1f52006-03-23 07:44:07 +00001481def : Pat<(v16i8 (load addr:$src)), (MOVDQArm addr:$src)>,
Evan Chengffea91e2006-03-26 09:53:12 +00001482 Requires<[HasSSE2]>;
Evan Cheng24dc1f52006-03-23 07:44:07 +00001483def : Pat<(v8i16 (load addr:$src)), (MOVDQArm addr:$src)>,
Evan Chengffea91e2006-03-26 09:53:12 +00001484 Requires<[HasSSE2]>;
Evan Cheng24dc1f52006-03-23 07:44:07 +00001485def : Pat<(v4i32 (load addr:$src)), (MOVDQArm addr:$src)>,
Evan Chengffea91e2006-03-26 09:53:12 +00001486 Requires<[HasSSE2]>;
Evan Cheng24dc1f52006-03-23 07:44:07 +00001487def : Pat<(v2i64 (load addr:$src)), (MOVDQArm addr:$src)>,
Evan Chengffea91e2006-03-26 09:53:12 +00001488 Requires<[HasSSE2]>;
Evan Chenga971f6f2006-03-23 01:57:24 +00001489
Evan Cheng48090aa2006-03-21 23:01:21 +00001490// Store 128-bit integer vector values.
Evan Cheng24dc1f52006-03-23 07:44:07 +00001491def : Pat<(store (v16i8 VR128:$src), addr:$dst),
Evan Chengffea91e2006-03-26 09:53:12 +00001492 (MOVDQAmr addr:$dst, VR128:$src)>, Requires<[HasSSE2]>;
Evan Cheng24dc1f52006-03-23 07:44:07 +00001493def : Pat<(store (v8i16 VR128:$src), addr:$dst),
Evan Chengffea91e2006-03-26 09:53:12 +00001494 (MOVDQAmr addr:$dst, VR128:$src)>, Requires<[HasSSE2]>;
Evan Cheng24dc1f52006-03-23 07:44:07 +00001495def : Pat<(store (v4i32 VR128:$src), addr:$dst),
Evan Chengffea91e2006-03-26 09:53:12 +00001496 (MOVDQAmr addr:$dst, VR128:$src)>, Requires<[HasSSE2]>;
Evan Cheng24dc1f52006-03-23 07:44:07 +00001497def : Pat<(store (v2i64 VR128:$src), addr:$dst),
1498 (MOVDQAmr addr:$dst, VR128:$src)>, Requires<[HasSSE2]>;
Evan Cheng48090aa2006-03-21 23:01:21 +00001499
1500// Scalar to v8i16 / v16i8. The source may be a R32, but only the lower 8 or
1501// 16-bits matter.
1502def : Pat<(v8i16 (X86s2vec R32:$src)), (MOVD128rr R32:$src)>,
Evan Chengffea91e2006-03-26 09:53:12 +00001503 Requires<[HasSSE2]>;
Evan Cheng48090aa2006-03-21 23:01:21 +00001504def : Pat<(v16i8 (X86s2vec R32:$src)), (MOVD128rr R32:$src)>,
Evan Chengffea91e2006-03-26 09:53:12 +00001505 Requires<[HasSSE2]>;
Evan Cheng48090aa2006-03-21 23:01:21 +00001506
Evan Cheng2c0dbd02006-03-24 02:58:06 +00001507// bit_convert
Evan Cheng475aecf2006-03-29 03:04:49 +00001508def : Pat<(v2i64 (bitconvert (v4i32 VR128:$src))), (v2i64 VR128:$src)>,
1509 Requires<[HasSSE2]>;
Evan Cheng506d3df2006-03-29 23:07:14 +00001510def : Pat<(v2i64 (bitconvert (v8i16 VR128:$src))), (v2i64 VR128:$src)>,
1511 Requires<[HasSSE2]>;
1512def : Pat<(v2i64 (bitconvert (v16i8 VR128:$src))), (v2i64 VR128:$src)>,
1513 Requires<[HasSSE2]>;
1514def : Pat<(v4i32 (bitconvert (v2i64 VR128:$src))), (v4i32 VR128:$src)>,
1515 Requires<[HasSSE2]>;
1516def : Pat<(v4i32 (bitconvert (v8i16 VR128:$src))), (v4i32 VR128:$src)>,
1517 Requires<[HasSSE2]>;
1518def : Pat<(v4i32 (bitconvert (v16i8 VR128:$src))), (v4i32 VR128:$src)>,
1519 Requires<[HasSSE2]>;
1520def : Pat<(v8i16 (bitconvert (v2i64 VR128:$src))), (v4i32 VR128:$src)>,
1521 Requires<[HasSSE2]>;
1522def : Pat<(v8i16 (bitconvert (v4i32 VR128:$src))), (v4i32 VR128:$src)>,
1523 Requires<[HasSSE2]>;
1524def : Pat<(v8i16 (bitconvert (v16i8 VR128:$src))), (v4i32 VR128:$src)>,
1525 Requires<[HasSSE2]>;
1526def : Pat<(v16i8 (bitconvert (v2i64 VR128:$src))), (v4i32 VR128:$src)>,
1527 Requires<[HasSSE2]>;
1528def : Pat<(v16i8 (bitconvert (v4i32 VR128:$src))), (v4i32 VR128:$src)>,
1529 Requires<[HasSSE2]>;
1530def : Pat<(v16i8 (bitconvert (v8i16 VR128:$src))), (v4i32 VR128:$src)>,
1531 Requires<[HasSSE2]>;
1532
Evan Chengffea91e2006-03-26 09:53:12 +00001533def : Pat<(v4i32 (bitconvert (v4f32 VR128:$src))), (v4i32 VR128:$src)>,
1534 Requires<[HasSSE2]>;
1535def : Pat<(v4f32 (bitconvert (v4i32 VR128:$src))), (v4f32 VR128:$src)>,
1536 Requires<[HasSSE2]>;
Evan Chengb9df0ca2006-03-22 02:53:00 +00001537
Evan Chengbc4832b2006-03-24 23:15:12 +00001538// Zeroing a VR128 then do a MOVS* to the lower bits.
1539def : Pat<(v2f64 (X86zexts2vec FR64:$src)),
Evan Chengffea91e2006-03-26 09:53:12 +00001540 (MOVZSD128rr (V_SET0_PD), FR64:$src)>, Requires<[HasSSE2]>;
Evan Chengbc4832b2006-03-24 23:15:12 +00001541def : Pat<(v4f32 (X86zexts2vec FR32:$src)),
Evan Chengffea91e2006-03-26 09:53:12 +00001542 (MOVZSS128rr (V_SET0_PS), FR32:$src)>, Requires<[HasSSE2]>;
Evan Chengbc4832b2006-03-24 23:15:12 +00001543def : Pat<(v2i64 (X86zexts2vec VR64:$src)),
Evan Chengffea91e2006-03-26 09:53:12 +00001544 (MOVZQ128rr (V_SET0_PI), VR64:$src)>, Requires<[HasSSE2]>;
Evan Chengbc4832b2006-03-24 23:15:12 +00001545def : Pat<(v4i32 (X86zexts2vec R32:$src)),
Evan Chengffea91e2006-03-26 09:53:12 +00001546 (MOVZD128rr (V_SET0_PI), R32:$src)>, Requires<[HasSSE2]>;
Evan Chengbc4832b2006-03-24 23:15:12 +00001547def : Pat<(v8i16 (X86zexts2vec R16:$src)),
Evan Chengffea91e2006-03-26 09:53:12 +00001548 (MOVZD128rr (V_SET0_PI), (MOVZX32rr16 R16:$src))>, Requires<[HasSSE2]>;
Evan Chengbc4832b2006-03-24 23:15:12 +00001549def : Pat<(v16i8 (X86zexts2vec R8:$src)),
Evan Chengffea91e2006-03-26 09:53:12 +00001550 (MOVZD128rr (V_SET0_PI), (MOVZX32rr8 R8:$src))>, Requires<[HasSSE2]>;
Evan Chengbc4832b2006-03-24 23:15:12 +00001551
Evan Chengb9df0ca2006-03-22 02:53:00 +00001552// Splat v2f64 / v2i64
Evan Cheng691c9232006-03-29 19:02:40 +00001553def : Pat<(vector_shuffle (v2f64 VR128:$src), (undef), SSE_splat_mask:$sm),
1554 (v2f64 (UNPCKLPDrr VR128:$src, VR128:$src))>, Requires<[HasSSE2]>;
1555def : Pat<(vector_shuffle (v2i64 VR128:$src), (undef), SSE_splat_mask:$sm),
Evan Cheng475aecf2006-03-29 03:04:49 +00001556 (v2i64 (PUNPCKLQDQrr VR128:$src, VR128:$src))>, Requires<[HasSSE2]>;
1557
Evan Cheng691c9232006-03-29 19:02:40 +00001558// Splat v4f32
1559def : Pat<(vector_shuffle (v4f32 VR128:$src), (undef), SSE_splat_mask:$sm),
1560 (v4f32 (SHUFPSrr VR128:$src, VR128:$src, SSE_splat_mask:$sm))>,
1561 Requires<[HasSSE1]>;
1562
Evan Cheng475aecf2006-03-29 03:04:49 +00001563// Shuffle v4i32 if others do not match
1564def : Pat<(vector_shuffle (v4i32 VR128:$src1), (v4i32 VR128:$src2),
1565 SHUFP_shuffle_mask:$sm),
1566 (v4i32 (SHUFPSrr VR128:$src1, VR128:$src2,
1567 SHUFP_v4i32_shuffle_mask:$sm))>, Requires<[HasSSE2]>;
1568def : Pat<(vector_shuffle (v4i32 VR128:$src1), (load addr:$src2),
1569 SHUFP_shuffle_mask:$sm),
1570 (v4i32 (SHUFPSrm VR128:$src1, addr:$src2,
1571 SHUFP_v4i32_shuffle_mask:$sm))>, Requires<[HasSSE2]>;