blob: f254112ec4b4b85a149ba0bee6c386d8fb59bccb [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 SDTX86Unpcklp : SDTypeProfile<1, 2,
21 [SDTCisSameAs<0, 1>, SDTCisSameAs<0, 2>]>;
22
23def X86loadp : SDNode<"X86ISD::LOAD_PACK", SDTLoad,
24 [SDNPHasChain]>;
25def X86fand : SDNode<"X86ISD::FAND", SDTFPBinOp,
26 [SDNPCommutative, SDNPAssociative]>;
27def X86fxor : SDNode<"X86ISD::FXOR", SDTFPBinOp,
28 [SDNPCommutative, SDNPAssociative]>;
29def X86s2vec : SDNode<"X86ISD::SCALAR_TO_VECTOR",
30 SDTypeProfile<1, 1, []>, []>;
31def X86unpcklp : SDNode<"X86ISD::UNPCKLP",
32 SDTX86Unpcklp, []>;
Evan Cheng2246f842006-03-18 01:23:20 +000033
34//===----------------------------------------------------------------------===//
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 Cheng06a8aa12006-03-17 19:55:52 +000043
Evan Cheng63d33002006-03-22 08:01:21 +000044// SHUFFLE_get_shuf_imm xform function: convert vector_shuffle mask to PSHUF*,
45// SHUFP* etc. imm.
46def SHUFFLE_get_shuf_imm : SDNodeXForm<build_vector, [{
47 return getI8Imm(X86::getShuffleSHUFImmediate(N));
Evan Chengb9df0ca2006-03-22 02:53:00 +000048}]>;
49
Evan Cheng63d33002006-03-22 08:01:21 +000050def SHUFFLE_get_pshufd_imm : SDNodeXForm<build_vector, [{
51 return getI8Imm(X86::getShufflePSHUFDImmediate(N));
52}]>;
Evan Chengb9df0ca2006-03-22 02:53:00 +000053
Evan Cheng63d33002006-03-22 08:01:21 +000054def SHUFP_splat_mask : PatLeaf<(build_vector), [{
55 return X86::isSplatMask(N);
56}], SHUFFLE_get_shuf_imm>;
57
Evan Cheng1bffadd2006-03-22 19:16:21 +000058def MOVLHPS_splat_mask : PatLeaf<(build_vector), [{
Evan Cheng0188ecb2006-03-22 18:59:22 +000059 return X86::isSplatMask(N);
60}]>;
61
62// Only use PSHUF if it is not a splat.
63def PSHUFD_shuffle_mask : PatLeaf<(build_vector), [{
64 return !X86::isSplatMask(N) && X86::isPSHUFDMask(N);
65}], SHUFFLE_get_pshufd_imm>;
66
Evan Chengb9df0ca2006-03-22 02:53:00 +000067
Evan Cheng06a8aa12006-03-17 19:55:52 +000068//===----------------------------------------------------------------------===//
Evan Cheng4e4c71e2006-02-21 20:00:20 +000069// SSE scalar FP Instructions
70//===----------------------------------------------------------------------===//
71
Evan Cheng470a6ad2006-02-22 02:26:30 +000072// Instruction templates
73// SSI - SSE1 instructions with XS prefix.
74// SDI - SSE2 instructions with XD prefix.
75// PSI - SSE1 instructions with TB prefix.
76// PDI - SSE2 instructions with TB and OpSize prefixes.
Evan Cheng2da953f2006-03-22 07:10:28 +000077// PSIi8 - SSE1 instructions with ImmT == Imm8 and TB prefix.
78// PDIi8 - SSE2 instructions with ImmT == Imm8 and TB and OpSize prefixes.
Evan Cheng470a6ad2006-02-22 02:26:30 +000079class SSI<bits<8> o, Format F, dag ops, string asm, list<dag> pattern>
80 : I<o, F, ops, asm, pattern>, XS, Requires<[HasSSE1]>;
81class SDI<bits<8> o, Format F, dag ops, string asm, list<dag> pattern>
82 : I<o, F, ops, asm, pattern>, XD, Requires<[HasSSE2]>;
83class PSI<bits<8> o, Format F, dag ops, string asm, list<dag> pattern>
84 : I<o, F, ops, asm, pattern>, TB, Requires<[HasSSE1]>;
85class PDI<bits<8> o, Format F, dag ops, string asm, list<dag> pattern>
86 : I<o, F, ops, asm, pattern>, TB, OpSize, Requires<[HasSSE2]>;
Evan Cheng2da953f2006-03-22 07:10:28 +000087class PSIi8<bits<8> o, Format F, dag ops, string asm, list<dag> pattern>
88 : X86Inst<o, F, Imm8, ops, asm>, TB, Requires<[HasSSE1]> {
89 let Pattern = pattern;
90}
91class PDIi8<bits<8> o, Format F, dag ops, string asm, list<dag> pattern>
92 : X86Inst<o, F, Imm8, ops, asm>, TB, OpSize, Requires<[HasSSE2]> {
93 let Pattern = pattern;
94}
Evan Cheng470a6ad2006-02-22 02:26:30 +000095
Evan Cheng4e4c71e2006-02-21 20:00:20 +000096// Some 'special' instructions
97def IMPLICIT_DEF_FR32 : I<0, Pseudo, (ops FR32:$dst),
98 "#IMPLICIT_DEF $dst",
99 [(set FR32:$dst, (undef))]>, Requires<[HasSSE2]>;
100def IMPLICIT_DEF_FR64 : I<0, Pseudo, (ops FR64:$dst),
101 "#IMPLICIT_DEF $dst",
102 [(set FR64:$dst, (undef))]>, Requires<[HasSSE2]>;
103
104// CMOV* - Used to implement the SSE SELECT DAG operation. Expanded by the
105// scheduler into a branch sequence.
106let usesCustomDAGSchedInserter = 1 in { // Expanded by the scheduler.
107 def CMOV_FR32 : I<0, Pseudo,
108 (ops FR32:$dst, FR32:$t, FR32:$f, i8imm:$cond),
109 "#CMOV_FR32 PSEUDO!",
110 [(set FR32:$dst, (X86cmov FR32:$t, FR32:$f, imm:$cond))]>;
111 def CMOV_FR64 : I<0, Pseudo,
112 (ops FR64:$dst, FR64:$t, FR64:$f, i8imm:$cond),
113 "#CMOV_FR64 PSEUDO!",
114 [(set FR64:$dst, (X86cmov FR64:$t, FR64:$f, imm:$cond))]>;
115}
116
117// Move Instructions
Evan Cheng470a6ad2006-02-22 02:26:30 +0000118def MOVSSrr : SSI<0x10, MRMSrcReg, (ops FR32:$dst, FR32:$src),
119 "movss {$src, $dst|$dst, $src}", []>;
120def MOVSSrm : SSI<0x10, MRMSrcMem, (ops FR32:$dst, f32mem:$src),
121 "movss {$src, $dst|$dst, $src}",
122 [(set FR32:$dst, (loadf32 addr:$src))]>;
123def MOVSDrr : SDI<0x10, MRMSrcReg, (ops FR64:$dst, FR64:$src),
124 "movsd {$src, $dst|$dst, $src}", []>;
125def MOVSDrm : SDI<0x10, MRMSrcMem, (ops FR64:$dst, f64mem:$src),
126 "movsd {$src, $dst|$dst, $src}",
127 [(set FR64:$dst, (loadf64 addr:$src))]>;
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000128
Evan Cheng470a6ad2006-02-22 02:26:30 +0000129def MOVSSmr : SSI<0x11, MRMDestMem, (ops f32mem:$dst, FR32:$src),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000130 "movss {$src, $dst|$dst, $src}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000131 [(store FR32:$src, addr:$dst)]>;
132def MOVSDmr : SDI<0x11, MRMDestMem, (ops f64mem:$dst, FR64:$src),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000133 "movsd {$src, $dst|$dst, $src}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000134 [(store FR64:$src, addr:$dst)]>;
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000135
136// Conversion instructions
Evan Cheng470a6ad2006-02-22 02:26:30 +0000137def CVTTSS2SIrr: SSI<0x2C, MRMSrcReg, (ops R32:$dst, FR32:$src),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000138 "cvttss2si {$src, $dst|$dst, $src}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000139 [(set R32:$dst, (fp_to_sint FR32:$src))]>;
140def CVTTSS2SIrm: SSI<0x2C, MRMSrcMem, (ops R32:$dst, f32mem:$src),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000141 "cvttss2si {$src, $dst|$dst, $src}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000142 [(set R32:$dst, (fp_to_sint (loadf32 addr:$src)))]>;
143def CVTTSD2SIrr: SDI<0x2C, MRMSrcReg, (ops R32:$dst, FR64:$src),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000144 "cvttsd2si {$src, $dst|$dst, $src}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000145 [(set R32:$dst, (fp_to_sint FR64:$src))]>;
146def CVTTSD2SIrm: SDI<0x2C, MRMSrcMem, (ops R32:$dst, f64mem:$src),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000147 "cvttsd2si {$src, $dst|$dst, $src}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000148 [(set R32:$dst, (fp_to_sint (loadf64 addr:$src)))]>;
149def CVTSD2SSrr: SDI<0x5A, MRMSrcReg, (ops FR32:$dst, FR64:$src),
150 "cvtsd2ss {$src, $dst|$dst, $src}",
151 [(set FR32:$dst, (fround FR64:$src))]>;
152def CVTSD2SSrm: SDI<0x5A, MRMSrcMem, (ops FR32:$dst, f64mem:$src),
153 "cvtsd2ss {$src, $dst|$dst, $src}",
154 [(set FR32:$dst, (fround (loadf64 addr:$src)))]>;
155def CVTSI2SSrr: SSI<0x2A, MRMSrcReg, (ops FR32:$dst, R32:$src),
156 "cvtsi2ss {$src, $dst|$dst, $src}",
157 [(set FR32:$dst, (sint_to_fp R32:$src))]>;
158def CVTSI2SSrm: SSI<0x2A, MRMSrcMem, (ops FR32:$dst, i32mem:$src),
159 "cvtsi2ss {$src, $dst|$dst, $src}",
160 [(set FR32:$dst, (sint_to_fp (loadi32 addr:$src)))]>;
161def CVTSI2SDrr: SDI<0x2A, MRMSrcReg, (ops FR64:$dst, R32:$src),
162 "cvtsi2sd {$src, $dst|$dst, $src}",
163 [(set FR64:$dst, (sint_to_fp R32:$src))]>;
164def CVTSI2SDrm: SDI<0x2A, MRMSrcMem, (ops FR64:$dst, i32mem:$src),
165 "cvtsi2sd {$src, $dst|$dst, $src}",
166 [(set FR64:$dst, (sint_to_fp (loadi32 addr:$src)))]>;
167// SSE2 instructions with XS prefix
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000168def CVTSS2SDrr: I<0x5A, MRMSrcReg, (ops FR64:$dst, FR32:$src),
169 "cvtss2sd {$src, $dst|$dst, $src}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000170 [(set FR64:$dst, (fextend FR32:$src))]>, XS,
171 Requires<[HasSSE2]>;
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000172def CVTSS2SDrm: I<0x5A, MRMSrcMem, (ops FR64:$dst, f32mem:$src),
173 "cvtss2sd {$src, $dst|$dst, $src}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000174 [(set FR64:$dst, (fextend (loadf32 addr:$src)))]>, XS,
175 Requires<[HasSSE2]>;
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000176
177// Arithmetic instructions
178let isTwoAddress = 1 in {
179let isCommutable = 1 in {
Evan Cheng470a6ad2006-02-22 02:26:30 +0000180def ADDSSrr : SSI<0x58, MRMSrcReg, (ops FR32:$dst, FR32:$src1, FR32:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000181 "addss {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000182 [(set FR32:$dst, (fadd FR32:$src1, FR32:$src2))]>;
183def ADDSDrr : SDI<0x58, MRMSrcReg, (ops FR64:$dst, FR64:$src1, FR64:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000184 "addsd {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000185 [(set FR64:$dst, (fadd FR64:$src1, FR64:$src2))]>;
186def MULSSrr : SSI<0x59, MRMSrcReg, (ops FR32:$dst, FR32:$src1, FR32:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000187 "mulss {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000188 [(set FR32:$dst, (fmul FR32:$src1, FR32:$src2))]>;
189def MULSDrr : SDI<0x59, MRMSrcReg, (ops FR64:$dst, FR64:$src1, FR64:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000190 "mulsd {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000191 [(set FR64:$dst, (fmul FR64:$src1, FR64:$src2))]>;
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000192}
193
Evan Cheng470a6ad2006-02-22 02:26:30 +0000194def ADDSSrm : SSI<0x58, MRMSrcMem, (ops FR32:$dst, FR32:$src1, f32mem:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000195 "addss {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000196 [(set FR32:$dst, (fadd FR32:$src1, (loadf32 addr:$src2)))]>;
197def ADDSDrm : SDI<0x58, MRMSrcMem, (ops FR64:$dst, FR64:$src1, f64mem:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000198 "addsd {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000199 [(set FR64:$dst, (fadd FR64:$src1, (loadf64 addr:$src2)))]>;
200def MULSSrm : SSI<0x59, MRMSrcMem, (ops FR32:$dst, FR32:$src1, f32mem:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000201 "mulss {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000202 [(set FR32:$dst, (fmul FR32:$src1, (loadf32 addr:$src2)))]>;
203def MULSDrm : SDI<0x59, MRMSrcMem, (ops FR64:$dst, FR64:$src1, f64mem:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000204 "mulsd {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000205 [(set FR64:$dst, (fmul FR64:$src1, (loadf64 addr:$src2)))]>;
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000206
Evan Cheng470a6ad2006-02-22 02:26:30 +0000207def DIVSSrr : SSI<0x5E, MRMSrcReg, (ops FR32:$dst, FR32:$src1, FR32:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000208 "divss {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000209 [(set FR32:$dst, (fdiv FR32:$src1, FR32:$src2))]>;
210def DIVSSrm : SSI<0x5E, MRMSrcMem, (ops FR32:$dst, FR32:$src1, f32mem:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000211 "divss {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000212 [(set FR32:$dst, (fdiv FR32:$src1, (loadf32 addr:$src2)))]>;
213def DIVSDrr : SDI<0x5E, MRMSrcReg, (ops FR64:$dst, FR64:$src1, FR64:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000214 "divsd {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000215 [(set FR64:$dst, (fdiv FR64:$src1, FR64:$src2))]>;
216def DIVSDrm : SDI<0x5E, MRMSrcMem, (ops FR64:$dst, FR64:$src1, f64mem:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000217 "divsd {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000218 [(set FR64:$dst, (fdiv FR64:$src1, (loadf64 addr:$src2)))]>;
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000219
Evan Cheng470a6ad2006-02-22 02:26:30 +0000220def SUBSSrr : SSI<0x5C, MRMSrcReg, (ops FR32:$dst, FR32:$src1, FR32:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000221 "subss {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000222 [(set FR32:$dst, (fsub FR32:$src1, FR32:$src2))]>;
223def SUBSSrm : SSI<0x5C, MRMSrcMem, (ops FR32:$dst, FR32:$src1, f32mem:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000224 "subss {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000225 [(set FR32:$dst, (fsub FR32:$src1, (loadf32 addr:$src2)))]>;
226def SUBSDrr : SDI<0x5C, MRMSrcReg, (ops FR64:$dst, FR64:$src1, FR64:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000227 "subsd {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000228 [(set FR64:$dst, (fsub FR64:$src1, FR64:$src2))]>;
229def SUBSDrm : SDI<0x5C, MRMSrcMem, (ops FR64:$dst, FR64:$src1, f64mem:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000230 "subsd {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000231 [(set FR64:$dst, (fsub FR64:$src1, (loadf64 addr:$src2)))]>;
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000232}
233
Evan Cheng470a6ad2006-02-22 02:26:30 +0000234def SQRTSSrr : SSI<0x51, MRMSrcReg, (ops FR32:$dst, FR32:$src),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000235 "sqrtss {$src, $dst|$dst, $src}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000236 [(set FR32:$dst, (fsqrt FR32:$src))]>;
237def SQRTSSrm : SSI<0x51, MRMSrcMem, (ops FR32:$dst, f32mem:$src),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000238 "sqrtss {$src, $dst|$dst, $src}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000239 [(set FR32:$dst, (fsqrt (loadf32 addr:$src)))]>;
240def SQRTSDrr : SDI<0x51, MRMSrcReg, (ops FR64:$dst, FR64:$src),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000241 "sqrtsd {$src, $dst|$dst, $src}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000242 [(set FR64:$dst, (fsqrt FR64:$src))]>;
243def SQRTSDrm : SDI<0x51, MRMSrcMem, (ops FR64:$dst, f64mem:$src),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000244 "sqrtsd {$src, $dst|$dst, $src}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000245 [(set FR64:$dst, (fsqrt (loadf64 addr:$src)))]>;
246
247def RSQRTSSrr : SSI<0x52, MRMSrcReg, (ops FR32:$dst, FR32:$src),
248 "rsqrtss {$src, $dst|$dst, $src}", []>;
249def RSQRTSSrm : SSI<0x52, MRMSrcMem, (ops FR32:$dst, f32mem:$src),
250 "rsqrtss {$src, $dst|$dst, $src}", []>;
251def RCPSSrr : SSI<0x53, MRMSrcReg, (ops FR32:$dst, FR32:$src),
252 "rcpss {$src, $dst|$dst, $src}", []>;
253def RCPSSrm : SSI<0x53, MRMSrcMem, (ops FR32:$dst, f32mem:$src),
254 "rcpss {$src, $dst|$dst, $src}", []>;
255
256def MAXSSrr : SSI<0x5F, MRMSrcReg, (ops FR32:$dst, FR32:$src),
257 "maxss {$src, $dst|$dst, $src}", []>;
258def MAXSSrm : SSI<0x5F, MRMSrcMem, (ops FR32:$dst, f32mem:$src),
259 "maxss {$src, $dst|$dst, $src}", []>;
260def MAXSDrr : SDI<0x5F, MRMSrcReg, (ops FR64:$dst, FR64:$src),
261 "maxsd {$src, $dst|$dst, $src}", []>;
262def MAXSDrm : SDI<0x5F, MRMSrcMem, (ops FR64:$dst, f64mem:$src),
263 "maxsd {$src, $dst|$dst, $src}", []>;
264def MINSSrr : SSI<0x5D, MRMSrcReg, (ops FR32:$dst, FR32:$src),
265 "minss {$src, $dst|$dst, $src}", []>;
266def MINSSrm : SSI<0x5D, MRMSrcMem, (ops FR32:$dst, f32mem:$src),
267 "minss {$src, $dst|$dst, $src}", []>;
268def MINSDrr : SDI<0x5D, MRMSrcReg, (ops FR64:$dst, FR64:$src),
269 "minsd {$src, $dst|$dst, $src}", []>;
270def MINSDrm : SDI<0x5D, MRMSrcMem, (ops FR64:$dst, f64mem:$src),
271 "minsd {$src, $dst|$dst, $src}", []>;
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000272
273// Comparison instructions
274let isTwoAddress = 1 in {
Evan Cheng470a6ad2006-02-22 02:26:30 +0000275def CMPSSrr : SSI<0xC2, MRMSrcReg,
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000276 (ops FR32:$dst, FR32:$src1, FR32:$src, SSECC:$cc),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000277 "cmp${cc}ss {$src, $dst|$dst, $src}", []>;
278def CMPSSrm : SSI<0xC2, MRMSrcMem,
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000279 (ops FR32:$dst, FR32:$src1, f32mem:$src, SSECC:$cc),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000280 "cmp${cc}ss {$src, $dst|$dst, $src}", []>;
281def CMPSDrr : SDI<0xC2, MRMSrcReg,
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000282 (ops FR64:$dst, FR64:$src1, FR64:$src, SSECC:$cc),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000283 "cmp${cc}sd {$src, $dst|$dst, $src}", []>;
284def CMPSDrm : SDI<0xC2, MRMSrcMem,
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000285 (ops FR64:$dst, FR64:$src1, f64mem:$src, SSECC:$cc),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000286 "cmp${cc}sd {$src, $dst|$dst, $src}", []>;
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000287}
288
Evan Cheng470a6ad2006-02-22 02:26:30 +0000289def UCOMISSrr: PSI<0x2E, MRMSrcReg, (ops FR32:$src1, FR32:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000290 "ucomiss {$src2, $src1|$src1, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000291 [(X86cmp FR32:$src1, FR32:$src2)]>;
292def UCOMISSrm: PSI<0x2E, MRMSrcMem, (ops FR32:$src1, f32mem:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000293 "ucomiss {$src2, $src1|$src1, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000294 [(X86cmp FR32:$src1, (loadf32 addr:$src2))]>;
295def UCOMISDrr: PDI<0x2E, MRMSrcReg, (ops FR64:$src1, FR64:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000296 "ucomisd {$src2, $src1|$src1, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000297 [(X86cmp FR64:$src1, FR64:$src2)]>;
298def UCOMISDrm: PDI<0x2E, MRMSrcMem, (ops FR64:$src1, f64mem:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000299 "ucomisd {$src2, $src1|$src1, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000300 [(X86cmp FR64:$src1, (loadf64 addr:$src2))]>;
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000301
302// Aliases of packed instructions for scalar use. These all have names that
303// start with 'Fs'.
304
305// Alias instructions that map fld0 to pxor for sse.
306// FIXME: remove when we can teach regalloc that xor reg, reg is ok.
307def FsFLD0SS : I<0xEF, MRMInitReg, (ops FR32:$dst),
308 "pxor $dst, $dst", [(set FR32:$dst, fp32imm0)]>,
309 Requires<[HasSSE1]>, TB, OpSize;
310def FsFLD0SD : I<0xEF, MRMInitReg, (ops FR64:$dst),
311 "pxor $dst, $dst", [(set FR64:$dst, fp64imm0)]>,
312 Requires<[HasSSE2]>, TB, OpSize;
313
314// Alias instructions to do FR32 / FR64 reg-to-reg copy using movaps / movapd.
315// Upper bits are disregarded.
Evan Cheng470a6ad2006-02-22 02:26:30 +0000316def FsMOVAPSrr : PSI<0x28, MRMSrcReg, (ops FR32:$dst, FR32:$src),
317 "movaps {$src, $dst|$dst, $src}", []>;
318def FsMOVAPDrr : PDI<0x28, MRMSrcReg, (ops FR64:$dst, FR64:$src),
319 "movapd {$src, $dst|$dst, $src}", []>;
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000320
321// Alias instructions to load FR32 / FR64 from f128mem using movaps / movapd.
322// Upper bits are disregarded.
Evan Cheng470a6ad2006-02-22 02:26:30 +0000323def FsMOVAPSrm : PSI<0x28, MRMSrcMem, (ops FR32:$dst, f128mem:$src),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000324 "movaps {$src, $dst|$dst, $src}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000325 [(set FR32:$dst, (X86loadpf32 addr:$src))]>;
326def FsMOVAPDrm : PDI<0x28, MRMSrcMem, (ops FR64:$dst, f128mem:$src),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000327 "movapd {$src, $dst|$dst, $src}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000328 [(set FR64:$dst, (X86loadpf64 addr:$src))]>;
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000329
330// Alias bitwise logical operations using SSE logical ops on packed FP values.
331let isTwoAddress = 1 in {
332let isCommutable = 1 in {
Evan Cheng470a6ad2006-02-22 02:26:30 +0000333def FsANDPSrr : PSI<0x54, MRMSrcReg, (ops FR32:$dst, FR32:$src1, FR32:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000334 "andps {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000335 [(set FR32:$dst, (X86fand FR32:$src1, FR32:$src2))]>;
336def FsANDPDrr : PDI<0x54, MRMSrcReg, (ops FR64:$dst, FR64:$src1, FR64:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000337 "andpd {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000338 [(set FR64:$dst, (X86fand FR64:$src1, FR64:$src2))]>;
339def FsORPSrr : PSI<0x56, MRMSrcReg, (ops FR32:$dst, FR32:$src1, FR32:$src2),
340 "orps {$src2, $dst|$dst, $src2}", []>;
341def FsORPDrr : PDI<0x56, MRMSrcReg, (ops FR64:$dst, FR64:$src1, FR64:$src2),
342 "orpd {$src2, $dst|$dst, $src2}", []>;
343def FsXORPSrr : PSI<0x57, MRMSrcReg, (ops FR32:$dst, FR32:$src1, FR32:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000344 "xorps {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000345 [(set FR32:$dst, (X86fxor FR32:$src1, FR32:$src2))]>;
346def FsXORPDrr : PDI<0x57, MRMSrcReg, (ops FR64:$dst, FR64:$src1, FR64:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000347 "xorpd {$src2, $dst|$dst, $src2}",
Evan Cheng470a6ad2006-02-22 02:26:30 +0000348 [(set FR64:$dst, (X86fxor FR64:$src1, FR64:$src2))]>;
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000349}
Evan Cheng470a6ad2006-02-22 02:26:30 +0000350def FsANDPSrm : PSI<0x54, MRMSrcMem, (ops FR32:$dst, FR32:$src1, f128mem:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000351 "andps {$src2, $dst|$dst, $src2}",
352 [(set FR32:$dst, (X86fand FR32:$src1,
Evan Cheng470a6ad2006-02-22 02:26:30 +0000353 (X86loadpf32 addr:$src2)))]>;
354def FsANDPDrm : PDI<0x54, MRMSrcMem, (ops FR64:$dst, FR64:$src1, f128mem:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000355 "andpd {$src2, $dst|$dst, $src2}",
356 [(set FR64:$dst, (X86fand FR64:$src1,
Evan Cheng470a6ad2006-02-22 02:26:30 +0000357 (X86loadpf64 addr:$src2)))]>;
358def FsORPSrm : PSI<0x56, MRMSrcMem, (ops FR32:$dst, FR32:$src1, f128mem:$src2),
359 "orps {$src2, $dst|$dst, $src2}", []>;
360def FsORPDrm : PDI<0x56, MRMSrcMem, (ops FR64:$dst, FR64:$src1, f128mem:$src2),
361 "orpd {$src2, $dst|$dst, $src2}", []>;
362def FsXORPSrm : PSI<0x57, MRMSrcMem, (ops FR32:$dst, FR32:$src1, f128mem:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000363 "xorps {$src2, $dst|$dst, $src2}",
364 [(set FR32:$dst, (X86fxor FR32:$src1,
Evan Cheng470a6ad2006-02-22 02:26:30 +0000365 (X86loadpf32 addr:$src2)))]>;
366def FsXORPDrm : PDI<0x57, MRMSrcMem, (ops FR64:$dst, FR64:$src1, f128mem:$src2),
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000367 "xorpd {$src2, $dst|$dst, $src2}",
368 [(set FR64:$dst, (X86fxor FR64:$src1,
Evan Cheng470a6ad2006-02-22 02:26:30 +0000369 (X86loadpf64 addr:$src2)))]>;
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000370
Evan Cheng470a6ad2006-02-22 02:26:30 +0000371def FsANDNPSrr : PSI<0x55, MRMSrcReg, (ops FR32:$dst, FR32:$src1, FR32:$src2),
372 "andnps {$src2, $dst|$dst, $src2}", []>;
373def FsANDNPSrm : PSI<0x55, MRMSrcMem, (ops FR32:$dst, FR32:$src1, f128mem:$src2),
374 "andnps {$src2, $dst|$dst, $src2}", []>;
375def FsANDNPDrr : PDI<0x55, MRMSrcReg, (ops FR64:$dst, FR64:$src1, FR64:$src2),
376 "andnpd {$src2, $dst|$dst, $src2}", []>;
377def FsANDNPDrm : PDI<0x55, MRMSrcMem, (ops FR64:$dst, FR64:$src1, f128mem:$src2),
378 "andnpd {$src2, $dst|$dst, $src2}", []>;
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000379}
380
381//===----------------------------------------------------------------------===//
382// SSE packed FP Instructions
383//===----------------------------------------------------------------------===//
384
Evan Chengc12e6c42006-03-19 09:38:54 +0000385// Some 'special' instructions
386def IMPLICIT_DEF_VR128 : I<0, Pseudo, (ops VR128:$dst),
387 "#IMPLICIT_DEF $dst",
388 [(set VR128:$dst, (v4f32 (undef)))]>,
389 Requires<[HasSSE1]>;
390
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000391// Move Instructions
Evan Cheng2246f842006-03-18 01:23:20 +0000392def MOVAPSrr : PSI<0x28, MRMSrcReg, (ops VR128:$dst, VR128:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000393 "movaps {$src, $dst|$dst, $src}", []>;
Evan Cheng2246f842006-03-18 01:23:20 +0000394def MOVAPSrm : PSI<0x28, MRMSrcMem, (ops VR128:$dst, f128mem:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000395 "movaps {$src, $dst|$dst, $src}",
Evan Cheng2246f842006-03-18 01:23:20 +0000396 [(set VR128:$dst, (loadv4f32 addr:$src))]>;
397def MOVAPDrr : PDI<0x28, MRMSrcReg, (ops VR128:$dst, VR128:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000398 "movapd {$src, $dst|$dst, $src}", []>;
Evan Cheng2246f842006-03-18 01:23:20 +0000399def MOVAPDrm : PDI<0x28, MRMSrcMem, (ops VR128:$dst, f128mem:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000400 "movapd {$src, $dst|$dst, $src}",
Evan Cheng2246f842006-03-18 01:23:20 +0000401 [(set VR128:$dst, (loadv2f64 addr:$src))]>;
Evan Chengffcb95b2006-02-21 19:13:53 +0000402
Evan Cheng2246f842006-03-18 01:23:20 +0000403def MOVAPSmr : PSI<0x29, MRMDestMem, (ops f128mem:$dst, VR128:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000404 "movaps {$src, $dst|$dst, $src}",
Evan Cheng2246f842006-03-18 01:23:20 +0000405 [(store (v4f32 VR128:$src), addr:$dst)]>;
406def MOVAPDmr : PDI<0x29, MRMDestMem, (ops f128mem:$dst, VR128:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000407 "movapd {$src, $dst|$dst, $src}",
Evan Cheng2246f842006-03-18 01:23:20 +0000408 [(store (v2f64 VR128:$src), addr:$dst)]>;
Evan Cheng470a6ad2006-02-22 02:26:30 +0000409
Evan Cheng2246f842006-03-18 01:23:20 +0000410def MOVUPSrr : PSI<0x10, MRMSrcReg, (ops VR128:$dst, VR128:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000411 "movups {$src, $dst|$dst, $src}", []>;
Evan Cheng2246f842006-03-18 01:23:20 +0000412def MOVUPSrm : PSI<0x10, MRMSrcMem, (ops VR128:$dst, f128mem:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000413 "movups {$src, $dst|$dst, $src}", []>;
Evan Cheng2246f842006-03-18 01:23:20 +0000414def MOVUPSmr : PSI<0x11, MRMDestMem, (ops f128mem:$dst, VR128:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000415 "movups {$src, $dst|$dst, $src}", []>;
Evan Cheng2246f842006-03-18 01:23:20 +0000416def MOVUPDrr : PDI<0x10, MRMSrcReg, (ops VR128:$dst, VR128:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000417 "movupd {$src, $dst|$dst, $src}", []>;
Evan Cheng2246f842006-03-18 01:23:20 +0000418def MOVUPDrm : PDI<0x10, MRMSrcMem, (ops VR128:$dst, f128mem:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000419 "movupd {$src, $dst|$dst, $src}", []>;
Evan Cheng2246f842006-03-18 01:23:20 +0000420def MOVUPDmr : PDI<0x11, MRMDestMem, (ops f128mem:$dst, VR128:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000421 "movupd {$src, $dst|$dst, $src}", []>;
422
Evan Cheng2246f842006-03-18 01:23:20 +0000423def MOVLPSrm : PSI<0x12, MRMSrcMem, (ops VR128:$dst, f64mem:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000424 "movlps {$src, $dst|$dst, $src}", []>;
Evan Cheng2246f842006-03-18 01:23:20 +0000425def MOVLPSmr : PSI<0x13, MRMDestMem, (ops f64mem:$dst, VR128:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000426 "movlps {$src, $dst|$dst, $src}", []>;
Evan Cheng2246f842006-03-18 01:23:20 +0000427def MOVLPDrm : PDI<0x12, MRMSrcMem, (ops VR128:$dst, f64mem:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000428 "movlpd {$src, $dst|$dst, $src}", []>;
Evan Cheng2246f842006-03-18 01:23:20 +0000429def MOVLPDmr : PDI<0x13, MRMDestMem, (ops f64mem:$dst, VR128:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000430 "movlpd {$src, $dst|$dst, $src}", []>;
431
Evan Cheng2246f842006-03-18 01:23:20 +0000432def MOVHPSrm : PSI<0x16, MRMSrcMem, (ops VR128:$dst, f64mem:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000433 "movhps {$src, $dst|$dst, $src}", []>;
Evan Cheng2246f842006-03-18 01:23:20 +0000434def MOVHPSmr : PSI<0x17, MRMDestMem, (ops f64mem:$dst, VR128:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000435 "movhps {$src, $dst|$dst, $src}", []>;
Evan Cheng2246f842006-03-18 01:23:20 +0000436def MOVHPDrm : PDI<0x16, MRMSrcMem, (ops VR128:$dst, f64mem:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000437 "movhpd {$src, $dst|$dst, $src}", []>;
Evan Cheng2246f842006-03-18 01:23:20 +0000438def MOVHPDmr : PDI<0x17, MRMDestMem, (ops f64mem:$dst, VR128:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000439 "movhpd {$src, $dst|$dst, $src}", []>;
440
Evan Cheng2246f842006-03-18 01:23:20 +0000441def MOVLHPSrr : PSI<0x16, MRMSrcReg, (ops VR128:$dst, VR128:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000442 "movlhps {$src, $dst|$dst, $src}", []>;
Evan Cheng2246f842006-03-18 01:23:20 +0000443def MOVHLPSrr : PSI<0x12, MRMSrcReg, (ops VR128:$dst, VR128:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000444 "movlhps {$src, $dst|$dst, $src}", []>;
445
Evan Cheng2246f842006-03-18 01:23:20 +0000446def MOVMSKPSrr : PSI<0x50, MRMSrcReg, (ops R32:$dst, VR128:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000447 "movmskps {$src, $dst|$dst, $src}", []>;
Evan Cheng2246f842006-03-18 01:23:20 +0000448def MOVMSKPDrr : PSI<0x50, MRMSrcReg, (ops R32:$dst, VR128:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000449 "movmskpd {$src, $dst|$dst, $src}", []>;
450
451// Conversion instructions
Evan Cheng2246f842006-03-18 01:23:20 +0000452def CVTPI2PSrr : PSI<0x2A, MRMSrcReg, (ops VR128:$dst, VR64:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000453 "cvtpi2ps {$src, $dst|$dst, $src}", []>;
Evan Cheng2246f842006-03-18 01:23:20 +0000454def CVTPI2PSrm : PSI<0x2A, MRMSrcMem, (ops VR128:$dst, i64mem:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000455 "cvtpi2ps {$src, $dst|$dst, $src}", []>;
Evan Cheng2246f842006-03-18 01:23:20 +0000456def CVTPI2PDrr : PDI<0x2A, MRMSrcReg, (ops VR128:$dst, VR64:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000457 "cvtpi2pd {$src, $dst|$dst, $src}", []>;
Evan Cheng2246f842006-03-18 01:23:20 +0000458def CVTPI2PDrm : PDI<0x2A, MRMSrcMem, (ops VR128:$dst, i64mem:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000459 "cvtpi2pd {$src, $dst|$dst, $src}", []>;
460
461// SSE2 instructions without OpSize prefix
Evan Cheng2246f842006-03-18 01:23:20 +0000462def CVTDQ2PSrr : I<0x5B, MRMSrcReg, (ops VR128:$dst, VR128:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000463 "cvtdq2ps {$src, $dst|$dst, $src}", []>, TB,
464 Requires<[HasSSE2]>;
Evan Cheng2246f842006-03-18 01:23:20 +0000465def CVTDQ2PSrm : I<0x5B, MRMSrcMem, (ops VR128:$dst, i128mem:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000466 "cvtdq2ps {$src, $dst|$dst, $src}", []>, TB,
467 Requires<[HasSSE2]>;
468
469// SSE2 instructions with XS prefix
Evan Cheng2246f842006-03-18 01:23:20 +0000470def CVTDQ2PDrr : I<0xE6, MRMSrcReg, (ops VR128:$dst, VR64:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000471 "cvtdq2pd {$src, $dst|$dst, $src}", []>,
472 XS, Requires<[HasSSE2]>;
Evan Cheng2246f842006-03-18 01:23:20 +0000473def CVTDQ2PDrm : I<0xE6, MRMSrcMem, (ops VR128:$dst, i64mem:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000474 "cvtdq2pd {$src, $dst|$dst, $src}", []>,
475 XS, Requires<[HasSSE2]>;
476
Evan Cheng2246f842006-03-18 01:23:20 +0000477def CVTPS2PIrr : PSI<0x2D, MRMSrcReg, (ops VR64:$dst, VR128:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000478 "cvtps2pi {$src, $dst|$dst, $src}", []>;
Evan Cheng2246f842006-03-18 01:23:20 +0000479def CVTPS2PIrm : PSI<0x2D, MRMSrcMem, (ops VR64:$dst, f64mem:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000480 "cvtps2pi {$src, $dst|$dst, $src}", []>;
Evan Cheng2246f842006-03-18 01:23:20 +0000481def CVTPD2PIrr : PDI<0x2D, MRMSrcReg, (ops VR64:$dst, VR128:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000482 "cvtpd2pi {$src, $dst|$dst, $src}", []>;
Evan Cheng2246f842006-03-18 01:23:20 +0000483def CVTPD2PIrm : PDI<0x2D, MRMSrcMem, (ops VR64:$dst, f128mem:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000484 "cvtpd2pi {$src, $dst|$dst, $src}", []>;
485
Evan Cheng2246f842006-03-18 01:23:20 +0000486def CVTPS2DQrr : PDI<0x5B, MRMSrcReg, (ops VR128:$dst, VR128:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000487 "cvtps2dq {$src, $dst|$dst, $src}", []>;
Evan Cheng2246f842006-03-18 01:23:20 +0000488def CVTPS2DQrm : PDI<0x5B, MRMSrcMem, (ops VR128:$dst, f128mem:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000489 "cvtps2dq {$src, $dst|$dst, $src}", []>;
490// SSE2 packed instructions with XD prefix
Evan Cheng2246f842006-03-18 01:23:20 +0000491def CVTPD2DQrr : SDI<0xE6, MRMSrcReg, (ops VR128:$dst, VR128:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000492 "cvtpd2dq {$src, $dst|$dst, $src}", []>;
Evan Cheng2246f842006-03-18 01:23:20 +0000493def CVTPD2DQrm : SDI<0xE6, MRMSrcMem, (ops VR128:$dst, f128mem:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000494 "cvtpd2dq {$src, $dst|$dst, $src}", []>;
495
496// SSE2 instructions without OpSize prefix
Evan Cheng2246f842006-03-18 01:23:20 +0000497def CVTPS2PDrr : I<0x5A, MRMSrcReg, (ops VR128:$dst, VR128:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000498 "cvtps2pd {$src, $dst|$dst, $src}", []>, TB,
499 Requires<[HasSSE2]>;
Evan Cheng2246f842006-03-18 01:23:20 +0000500def CVTPS2PDrm : I<0x5A, MRMSrcReg, (ops VR128:$dst, f64mem:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000501 "cvtps2pd {$src, $dst|$dst, $src}", []>, TB,
502 Requires<[HasSSE2]>;
503
Evan Cheng2246f842006-03-18 01:23:20 +0000504def CVTPD2PSrr : PDI<0x5A, MRMSrcReg, (ops VR128:$dst, VR128:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000505 "cvtpd2ps {$src, $dst|$dst, $src}", []>;
Evan Cheng2246f842006-03-18 01:23:20 +0000506def CVTPD2PSrm : PDI<0x5A, MRMSrcReg, (ops VR128:$dst, f128mem:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000507 "cvtpd2ps {$src, $dst|$dst, $src}", []>;
508
509// Arithmetic
510let isTwoAddress = 1 in {
511let isCommutable = 1 in {
Evan Cheng2246f842006-03-18 01:23:20 +0000512def ADDPSrr : PSI<0x58, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000513 "addps {$src2, $dst|$dst, $src2}",
Evan Cheng2246f842006-03-18 01:23:20 +0000514 [(set VR128:$dst, (v4f32 (fadd VR128:$src1, VR128:$src2)))]>;
515def ADDPDrr : PDI<0x58, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000516 "addpd {$src2, $dst|$dst, $src2}",
Evan Cheng2246f842006-03-18 01:23:20 +0000517 [(set VR128:$dst, (v2f64 (fadd VR128:$src1, VR128:$src2)))]>;
518def MULPSrr : PSI<0x59, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000519 "mulps {$src2, $dst|$dst, $src2}",
Evan Cheng2246f842006-03-18 01:23:20 +0000520 [(set VR128:$dst, (v4f32 (fmul VR128:$src1, VR128:$src2)))]>;
521def MULPDrr : PDI<0x59, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000522 "mulpd {$src2, $dst|$dst, $src2}",
Evan Cheng2246f842006-03-18 01:23:20 +0000523 [(set VR128:$dst, (v2f64 (fmul VR128:$src1, VR128:$src2)))]>;
Evan Cheng470a6ad2006-02-22 02:26:30 +0000524}
525
Evan Cheng2246f842006-03-18 01:23:20 +0000526def ADDPSrm : PSI<0x58, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000527 "addps {$src2, $dst|$dst, $src2}",
Evan Cheng2246f842006-03-18 01:23:20 +0000528 [(set VR128:$dst, (v4f32 (fadd VR128:$src1,
529 (load addr:$src2))))]>;
530def ADDPDrm : PDI<0x58, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000531 "addpd {$src2, $dst|$dst, $src2}",
Evan Cheng2246f842006-03-18 01:23:20 +0000532 [(set VR128:$dst, (v2f64 (fadd VR128:$src1,
533 (load addr:$src2))))]>;
534def MULPSrm : PSI<0x59, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000535 "mulps {$src2, $dst|$dst, $src2}",
Evan Cheng2246f842006-03-18 01:23:20 +0000536 [(set VR128:$dst, (v4f32 (fmul VR128:$src1,
537 (load addr:$src2))))]>;
538def MULPDrm : PDI<0x59, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000539 "mulpd {$src2, $dst|$dst, $src2}",
Evan Cheng2246f842006-03-18 01:23:20 +0000540 [(set VR128:$dst, (v2f64 (fmul VR128:$src1,
541 (load addr:$src2))))]>;
Evan Cheng470a6ad2006-02-22 02:26:30 +0000542
Evan Cheng2246f842006-03-18 01:23:20 +0000543def DIVPSrr : PSI<0x5E, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
544 "divps {$src2, $dst|$dst, $src2}",
545 [(set VR128:$dst, (v4f32 (fdiv VR128:$src1, VR128:$src2)))]>;
546def DIVPSrm : PSI<0x5E, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
547 "divps {$src2, $dst|$dst, $src2}",
548 [(set VR128:$dst, (v4f32 (fdiv VR128:$src1,
549 (load addr:$src2))))]>;
550def DIVPDrr : PDI<0x5E, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000551 "divpd {$src2, $dst|$dst, $src2}",
Evan Cheng2246f842006-03-18 01:23:20 +0000552 [(set VR128:$dst, (v2f64 (fdiv VR128:$src1, VR128:$src2)))]>;
553def DIVPDrm : PDI<0x5E, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000554 "divpd {$src2, $dst|$dst, $src2}",
Evan Cheng2246f842006-03-18 01:23:20 +0000555 [(set VR128:$dst, (v2f64 (fdiv VR128:$src1,
556 (load addr:$src2))))]>;
Evan Cheng470a6ad2006-02-22 02:26:30 +0000557
Evan Cheng2246f842006-03-18 01:23:20 +0000558def SUBPSrr : PSI<0x5C, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
559 "subps {$src2, $dst|$dst, $src2}",
560 [(set VR128:$dst, (v4f32 (fsub VR128:$src1, VR128:$src2)))]>;
561def SUBPSrm : PSI<0x5C, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
562 "subps {$src2, $dst|$dst, $src2}",
563 [(set VR128:$dst, (v4f32 (fsub VR128:$src1,
564 (load addr:$src2))))]>;
565def SUBPDrr : PDI<0x5C, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
566 "subpd {$src2, $dst|$dst, $src2}",
567 [(set VR128:$dst, (fsub VR128:$src1, VR128:$src2))]>;
568def SUBPDrm : PDI<0x5C, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
569 "subpd {$src2, $dst|$dst, $src2}",
570 [(set VR128:$dst, (fsub VR128:$src1,
571 (load addr:$src2)))]>;
Evan Cheng470a6ad2006-02-22 02:26:30 +0000572}
573
Evan Cheng2246f842006-03-18 01:23:20 +0000574def SQRTPSrr : PSI<0x51, MRMSrcReg, (ops VR128:$dst, VR128:$src),
575 "sqrtps {$src, $dst|$dst, $src}",
576 [(set VR128:$dst, (v4f32 (fsqrt VR128:$src)))]>;
577def SQRTPSrm : PSI<0x51, MRMSrcMem, (ops VR128:$dst, f128mem:$src),
578 "sqrtps {$src, $dst|$dst, $src}",
579 [(set VR128:$dst, (v4f32 (fsqrt (load addr:$src))))]>;
580def SQRTPDrr : PDI<0x51, MRMSrcReg, (ops VR128:$dst, VR128:$src),
581 "sqrtpd {$src, $dst|$dst, $src}",
582 [(set VR128:$dst, (v2f64 (fsqrt VR128:$src)))]>;
583def SQRTPDrm : PDI<0x51, MRMSrcMem, (ops VR128:$dst, f128mem:$src),
584 "sqrtpd {$src, $dst|$dst, $src}",
585 [(set VR128:$dst, (v2f64 (fsqrt (load addr:$src))))]>;
Evan Cheng470a6ad2006-02-22 02:26:30 +0000586
Evan Cheng2246f842006-03-18 01:23:20 +0000587def RSQRTPSrr : PSI<0x52, MRMSrcReg, (ops VR128:$dst, VR128:$src),
588 "rsqrtps {$src, $dst|$dst, $src}", []>;
589def RSQRTPSrm : PSI<0x52, MRMSrcMem, (ops VR128:$dst, f128mem:$src),
590 "rsqrtps {$src, $dst|$dst, $src}", []>;
591def RCPPSrr : PSI<0x53, MRMSrcReg, (ops VR128:$dst, VR128:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000592 "rcpps {$src, $dst|$dst, $src}", []>;
Evan Cheng2246f842006-03-18 01:23:20 +0000593def RCPPSrm : PSI<0x53, MRMSrcMem, (ops VR128:$dst, f128mem:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000594 "rcpps {$src, $dst|$dst, $src}", []>;
595
Evan Cheng2246f842006-03-18 01:23:20 +0000596def MAXPSrr : PSI<0x5F, MRMSrcReg, (ops VR128:$dst, VR128:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000597 "maxps {$src, $dst|$dst, $src}", []>;
Evan Cheng2246f842006-03-18 01:23:20 +0000598def MAXPSrm : PSI<0x5F, MRMSrcMem, (ops VR128:$dst, f128mem:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000599 "maxps {$src, $dst|$dst, $src}", []>;
Evan Cheng2246f842006-03-18 01:23:20 +0000600def MAXPDrr : PDI<0x5F, MRMSrcReg, (ops VR128:$dst, VR128:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000601 "maxpd {$src, $dst|$dst, $src}", []>;
Evan Cheng2246f842006-03-18 01:23:20 +0000602def MAXPDrm : PDI<0x5F, MRMSrcMem, (ops VR128:$dst, f128mem:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000603 "maxpd {$src, $dst|$dst, $src}", []>;
Evan Cheng2246f842006-03-18 01:23:20 +0000604def MINPSrr : PSI<0x5D, MRMSrcReg, (ops VR128:$dst, VR128:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000605 "minps {$src, $dst|$dst, $src}", []>;
Evan Cheng2246f842006-03-18 01:23:20 +0000606def MINPSrm : PSI<0x5D, MRMSrcMem, (ops VR128:$dst, f128mem:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000607 "minps {$src, $dst|$dst, $src}", []>;
Evan Cheng2246f842006-03-18 01:23:20 +0000608def MINPDrr : PDI<0x5D, MRMSrcReg, (ops VR128:$dst, VR128:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000609 "minpd {$src, $dst|$dst, $src}", []>;
Evan Cheng2246f842006-03-18 01:23:20 +0000610def MINPDrm : PDI<0x5D, MRMSrcMem, (ops VR128:$dst, f128mem:$src),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000611 "minpd {$src, $dst|$dst, $src}", []>;
Evan Chengffcb95b2006-02-21 19:13:53 +0000612
613// Logical
614let isTwoAddress = 1 in {
615let isCommutable = 1 in {
Evan Cheng2246f842006-03-18 01:23:20 +0000616def ANDPSrr : PSI<0x54, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
617 "andps {$src2, $dst|$dst, $src2}",
618 [(set VR128:$dst, (v4i32 (and VR128:$src1, VR128:$src2)))]>;
619def ANDPDrr : PDI<0x54, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
Evan Chengffcb95b2006-02-21 19:13:53 +0000620 "andpd {$src2, $dst|$dst, $src2}",
Evan Cheng2246f842006-03-18 01:23:20 +0000621 [(set VR128:$dst, (v2i64 (and VR128:$src1, VR128:$src2)))]>;
622def ORPSrr : PSI<0x56, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
623 "orps {$src2, $dst|$dst, $src2}",
624 [(set VR128:$dst, (v4i32 (or VR128:$src1, VR128:$src2)))]>;
625def ORPDrr : PDI<0x56, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
626 "orpd {$src2, $dst|$dst, $src2}",
627 [(set VR128:$dst, (v2i64 (or VR128:$src1, VR128:$src2)))]>;
628def XORPSrr : PSI<0x57, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
629 "xorps {$src2, $dst|$dst, $src2}",
630 [(set VR128:$dst, (v4i32 (xor VR128:$src1, VR128:$src2)))]>;
631def XORPDrr : PDI<0x57, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
632 "xorpd {$src2, $dst|$dst, $src2}",
633 [(set VR128:$dst, (v2i64 (xor VR128:$src1, VR128:$src2)))]>;
Evan Chengffcb95b2006-02-21 19:13:53 +0000634}
Evan Cheng2246f842006-03-18 01:23:20 +0000635def ANDPSrm : PSI<0x54, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
636 "andps {$src2, $dst|$dst, $src2}",
637 [(set VR128:$dst, (v4i32 (and VR128:$src1,
638 (load addr:$src2))))]>;
639def ANDPDrm : PDI<0x54, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
640 "andpd {$src2, $dst|$dst, $src2}",
641 [(set VR128:$dst, (v2i64 (and VR128:$src1,
642 (load addr:$src2))))]>;
643def ORPSrm : PSI<0x56, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
644 "orps {$src2, $dst|$dst, $src2}",
645 [(set VR128:$dst, (v4i32 (or VR128:$src1,
646 (load addr:$src2))))]>;
647def ORPDrm : PDI<0x56, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
648 "orpd {$src2, $dst|$dst, $src2}",
649 [(set VR128:$dst, (v2i64 (or VR128:$src1,
650 (load addr:$src2))))]>;
651def XORPSrm : PSI<0x57, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
652 "xorps {$src2, $dst|$dst, $src2}",
653 [(set VR128:$dst, (v4i32 (xor VR128:$src1,
654 (load addr:$src2))))]>;
655def XORPDrm : PDI<0x57, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
656 "xorpd {$src2, $dst|$dst, $src2}",
657 [(set VR128:$dst, (v2i64 (xor VR128:$src1,
658 (load addr:$src2))))]>;
659def ANDNPSrr : PSI<0x55, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
660 "andnps {$src2, $dst|$dst, $src2}",
661 [(set VR128:$dst, (v4i32 (and (not VR128:$src1),
662 VR128:$src2)))]>;
663def ANDNPSrm : PSI<0x55, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
664 "andnps {$src2, $dst|$dst, $src2}",
665 [(set VR128:$dst, (v4i32 (and (not VR128:$src1),
666 (load addr:$src2))))]>;
667def ANDNPDrr : PDI<0x55, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
668 "andnpd {$src2, $dst|$dst, $src2}",
669 [(set VR128:$dst, (v2i64 (and (not VR128:$src1),
670 VR128:$src2)))]>;
671
672def ANDNPDrm : PDI<0x55, MRMSrcMem, (ops VR128:$dst, VR128:$src1, f128mem:$src2),
673 "andnpd {$src2, $dst|$dst, $src2}",
674 [(set VR128:$dst, (v2i64 (and VR128:$src1,
675 (load addr:$src2))))]>;
Evan Chengffcb95b2006-02-21 19:13:53 +0000676}
Evan Chengbf156d12006-02-21 19:26:52 +0000677
Evan Cheng470a6ad2006-02-22 02:26:30 +0000678let isTwoAddress = 1 in {
679def CMPPSrr : PSI<0xC2, MRMSrcReg,
Evan Cheng2246f842006-03-18 01:23:20 +0000680 (ops VR128:$dst, VR128:$src1, VR128:$src, SSECC:$cc),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000681 "cmp${cc}ps {$src, $dst|$dst, $src}", []>;
682def CMPPSrm : PSI<0xC2, MRMSrcMem,
Evan Cheng2246f842006-03-18 01:23:20 +0000683 (ops VR128:$dst, VR128:$src1, f128mem:$src, SSECC:$cc),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000684 "cmp${cc}ps {$src, $dst|$dst, $src}", []>;
685def CMPPDrr : PDI<0xC2, MRMSrcReg,
Evan Cheng2246f842006-03-18 01:23:20 +0000686 (ops VR128:$dst, VR128:$src1, VR128:$src, SSECC:$cc),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000687 "cmp${cc}pd {$src, $dst|$dst, $src}", []>;
688def CMPPDrm : PDI<0xC2, MRMSrcMem,
Evan Cheng2246f842006-03-18 01:23:20 +0000689 (ops VR128:$dst, VR128:$src1, f128mem:$src, SSECC:$cc),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000690 "cmp${cc}pd {$src, $dst|$dst, $src}", []>;
691}
692
693// Shuffle and unpack instructions
Evan Cheng2da953f2006-03-22 07:10:28 +0000694def PSHUFWrr : PSIi8<0x70, MRMDestReg,
695 (ops VR64:$dst, VR64:$src1, i8imm:$src2),
696 "pshufw {$src2, $src1, $dst|$dst, $src1, $src2}", []>;
697def PSHUFWrm : PSIi8<0x70, MRMSrcMem,
698 (ops VR64:$dst, i64mem:$src1, i8imm:$src2),
699 "pshufw {$src2, $src1, $dst|$dst, $src1, $src2}", []>;
700def PSHUFDrr : PDIi8<0x70, MRMDestReg,
701 (ops VR128:$dst, VR128:$src1, i8imm:$src2),
Evan Cheng0188ecb2006-03-22 18:59:22 +0000702 "pshufd {$src2, $src1, $dst|$dst, $src1, $src2}", []>;
Evan Cheng2da953f2006-03-22 07:10:28 +0000703def PSHUFDrm : PDIi8<0x70, MRMSrcMem,
704 (ops VR128:$dst, i128mem:$src1, i8imm:$src2),
705 "pshufd {$src2, $src1, $dst|$dst, $src1, $src2}", []>;
Evan Chengb9df0ca2006-03-22 02:53:00 +0000706
Evan Cheng0cea6d22006-03-22 20:08:18 +0000707let isTwoAddress = 1 in {
Evan Cheng2da953f2006-03-22 07:10:28 +0000708def SHUFPSrr : PSIi8<0xC6, MRMSrcReg,
709 (ops VR128:$dst, VR128:$src1, VR128:$src2, i8imm:$src3),
710 "shufps {$src3, $src2, $dst|$dst, $src2, $src3}", []>;
711def SHUFPSrm : PSIi8<0xC6, MRMSrcMem,
712 (ops VR128:$dst, VR128:$src1, f128mem:$src2, i8imm:$src3),
713 "shufps {$src3, $src2, $dst|$dst, $src2, $src3}", []>;
714def SHUFPDrr : PDIi8<0xC6, MRMSrcReg,
715 (ops VR128:$dst, VR128:$src1, VR128:$src2, i8imm:$src3),
716 "shufpd {$src3, $src2, $dst|$dst, $src2, $src3}", []>;
717def SHUFPDrm : PDIi8<0xC6, MRMSrcMem,
718 (ops VR128:$dst, VR128:$src1, f128mem:$src2, i8imm:$src3),
719 "shufpd {$src3, $src2, $dst|$dst, $src2, $src3}", []>;
Evan Cheng0cea6d22006-03-22 20:08:18 +0000720}
Evan Cheng470a6ad2006-02-22 02:26:30 +0000721
722def UNPCKHPSrr : PSI<0x15, MRMSrcReg,
Evan Cheng2246f842006-03-18 01:23:20 +0000723 (ops VR128:$dst, VR128:$src1, VR128:$src2),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000724 "unpckhps {$src2, $dst|$dst, $src2}", []>;
725def UNPCKHPSrm : PSI<0x15, MRMSrcMem,
Evan Cheng2246f842006-03-18 01:23:20 +0000726 (ops VR128:$dst, VR128:$src1, f128mem:$src2),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000727 "unpckhps {$src2, $dst|$dst, $src2}", []>;
728def UNPCKHPDrr : PDI<0x15, MRMSrcReg,
Evan Cheng2246f842006-03-18 01:23:20 +0000729 (ops VR128:$dst, VR128:$src1, VR128:$src2),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000730 "unpckhpd {$src2, $dst|$dst, $src2}", []>;
731def UNPCKHPDrm : PDI<0x15, MRMSrcMem,
Evan Cheng2246f842006-03-18 01:23:20 +0000732 (ops VR128:$dst, VR128:$src1, f128mem:$src2),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000733 "unpckhpd {$src2, $dst|$dst, $src2}", []>;
734def UNPCKLPSrr : PSI<0x14, MRMSrcReg,
Evan Cheng2246f842006-03-18 01:23:20 +0000735 (ops VR128:$dst, VR128:$src1, VR128:$src2),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000736 "unpcklps {$src2, $dst|$dst, $src2}", []>;
737def UNPCKLPSrm : PSI<0x14, MRMSrcMem,
Evan Cheng2246f842006-03-18 01:23:20 +0000738 (ops VR128:$dst, VR128:$src1, f128mem:$src2),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000739 "unpcklps {$src2, $dst|$dst, $src2}", []>;
740def UNPCKLPDrr : PDI<0x14, MRMSrcReg,
Evan Cheng2246f842006-03-18 01:23:20 +0000741 (ops VR128:$dst, VR128:$src1, VR128:$src2),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000742 "unpcklpd {$src2, $dst|$dst, $src2}", []>;
743def UNPCKLPDrm : PDI<0x14, MRMSrcMem,
Evan Cheng2246f842006-03-18 01:23:20 +0000744 (ops VR128:$dst, VR128:$src1, f128mem:$src2),
Evan Cheng470a6ad2006-02-22 02:26:30 +0000745 "unpcklpd {$src2, $dst|$dst, $src2}", []>;
746
Evan Chengbf156d12006-02-21 19:26:52 +0000747//===----------------------------------------------------------------------===//
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000748// SSE integer instructions
Evan Chengbf156d12006-02-21 19:26:52 +0000749//===----------------------------------------------------------------------===//
750
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000751// Move Instructions
Evan Cheng470a6ad2006-02-22 02:26:30 +0000752def MOVD128rr : PDI<0x6E, MRMSrcReg, (ops VR128:$dst, R32:$src),
Evan Cheng48090aa2006-03-21 23:01:21 +0000753 "movd {$src, $dst|$dst, $src}",
754 [(set VR128:$dst,
755 (v4i32 (scalar_to_vector R32:$src)))]>;
Evan Cheng470a6ad2006-02-22 02:26:30 +0000756def MOVD128rm : PDI<0x6E, MRMSrcMem, (ops VR128:$dst, i32mem:$src),
757 "movd {$src, $dst|$dst, $src}", []>;
758def MOVD128mr : PDI<0x7E, MRMDestMem, (ops i32mem:$dst, VR128:$src),
759 "movd {$src, $dst|$dst, $src}", []>;
Evan Chengbf156d12006-02-21 19:26:52 +0000760
Evan Cheng470a6ad2006-02-22 02:26:30 +0000761// SSE2 instructions with XS prefix
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000762def MOVQ128rr : I<0x7E, MRMSrcReg, (ops VR128:$dst, VR64:$src),
Evan Cheng48090aa2006-03-21 23:01:21 +0000763 "movq {$src, $dst|$dst, $src}",
764 [(set VR128:$dst,
765 (v2i64 (scalar_to_vector VR64:$src)))]>, XS,
Evan Cheng4e4c71e2006-02-21 20:00:20 +0000766 Requires<[HasSSE2]>;
767def MOVQ128rm : I<0x7E, MRMSrcMem, (ops VR128:$dst, i64mem:$src),
Evan Cheng48090aa2006-03-21 23:01:21 +0000768 "movq {$src, $dst|$dst, $src}", []>, XS;
Evan Cheng470a6ad2006-02-22 02:26:30 +0000769
770def MOVQ128mr : PDI<0xD6, MRMSrcMem, (ops i64mem:$dst, VR128:$src),
771 "movq {$src, $dst|$dst, $src}", []>;
Evan Cheng82521dd2006-03-21 07:09:35 +0000772
773
774//===----------------------------------------------------------------------===//
775// Alias Instructions
776//===----------------------------------------------------------------------===//
777
778def FR32ToV4F32 : PSI<0x28, MRMSrcReg, (ops VR128:$dst, FR32:$src),
779 "movaps {$src, $dst|$dst, $src}",
780 [(set VR128:$dst,
781 (v4f32 (scalar_to_vector FR32:$src)))]>;
782
783def FR64ToV2F64 : PDI<0x28, MRMSrcReg, (ops VR128:$dst, FR64:$src),
784 "movapd {$src, $dst|$dst, $src}",
785 [(set VR128:$dst,
786 (v2f64 (scalar_to_vector FR64:$src)))]>;
Evan Cheng48090aa2006-03-21 23:01:21 +0000787
788//===----------------------------------------------------------------------===//
789// Non-Instruction Patterns
790//===----------------------------------------------------------------------===//
791
792// 128-bit vector undef's.
793def : Pat<(v2f64 (undef)), (IMPLICIT_DEF_VR128)>, Requires<[HasSSE2]>;
794def : Pat<(v16i8 (undef)), (IMPLICIT_DEF_VR128)>, Requires<[HasSSE2]>;
795def : Pat<(v8i16 (undef)), (IMPLICIT_DEF_VR128)>, Requires<[HasSSE2]>;
796def : Pat<(v4i32 (undef)), (IMPLICIT_DEF_VR128)>, Requires<[HasSSE2]>;
797def : Pat<(v2i64 (undef)), (IMPLICIT_DEF_VR128)>, Requires<[HasSSE2]>;
798
799// Store 128-bit integer vector values.
800def : Pat<(store (v16i8 VR128:$src), addr:$dst), (MOVAPSmr addr:$dst, VR128:$src)>;
801def : Pat<(store (v8i16 VR128:$src), addr:$dst), (MOVAPSmr addr:$dst, VR128:$src)>;
802def : Pat<(store (v4i32 VR128:$src), addr:$dst), (MOVAPSmr addr:$dst, VR128:$src)>;
803def : Pat<(store (v2i64 VR128:$src), addr:$dst), (MOVAPSmr addr:$dst, VR128:$src)>;
804
805// Scalar to v8i16 / v16i8. The source may be a R32, but only the lower 8 or
806// 16-bits matter.
807def : Pat<(v8i16 (X86s2vec R32:$src)), (MOVD128rr R32:$src)>,
808 Requires<[HasSSE2]>;
809def : Pat<(v16i8 (X86s2vec R32:$src)), (MOVD128rr R32:$src)>,
810 Requires<[HasSSE2]>;
811
Evan Chengb9df0ca2006-03-22 02:53:00 +0000812
813// Splat v4f32 / v4i32
Evan Cheng63d33002006-03-22 08:01:21 +0000814def : Pat<(vector_shuffle (v4f32 VR128:$src), (undef), SHUFP_splat_mask:$sm),
Evan Cheng1bffadd2006-03-22 19:16:21 +0000815 (v4f32 (SHUFPSrr VR128:$src, VR128:$src, SHUFP_splat_mask:$sm))>,
816 Requires<[HasSSE1]>;
Evan Cheng63d33002006-03-22 08:01:21 +0000817def : Pat<(vector_shuffle (v4i32 VR128:$src), (undef), SHUFP_splat_mask:$sm),
Evan Cheng1bffadd2006-03-22 19:16:21 +0000818 (v4i32 (SHUFPSrr VR128:$src, VR128:$src, SHUFP_splat_mask:$sm))>,
819 Requires<[HasSSE1]>;
Evan Chengb9df0ca2006-03-22 02:53:00 +0000820
821// Splat v2f64 / v2i64
Evan Cheng1bffadd2006-03-22 19:16:21 +0000822def : Pat<(vector_shuffle (v2f64 VR128:$src), (undef), MOVLHPS_splat_mask:$sm),
823 (v2f64 (MOVLHPSrr VR128:$src))>, Requires<[HasSSE1]>;
824def : Pat<(vector_shuffle (v2i64 VR128:$src), (undef), MOVLHPS_splat_mask:$sm),
825 (v2i64 (MOVLHPSrr VR128:$src))>, Requires<[HasSSE1]>;
Evan Cheng63d33002006-03-22 08:01:21 +0000826
Evan Cheng0188ecb2006-03-22 18:59:22 +0000827// Shuffle v4f32 / v4i32, undef. These should only match if splat cases do not.
828def : Pat<(vector_shuffle (v4f32 VR128:$src), (undef), PSHUFD_shuffle_mask:$sm),
Evan Cheng1bffadd2006-03-22 19:16:21 +0000829 (v4f32 (PSHUFDrr VR128:$src, PSHUFD_shuffle_mask:$sm))>,
830 Requires<[HasSSE2]>;
Evan Cheng0188ecb2006-03-22 18:59:22 +0000831def : Pat<(vector_shuffle (v4i32 VR128:$src), (undef), PSHUFD_shuffle_mask:$sm),
Evan Cheng1bffadd2006-03-22 19:16:21 +0000832 (v4i32 (PSHUFDrr VR128:$src, PSHUFD_shuffle_mask:$sm))>,
833 Requires<[HasSSE2]>;