blob: 08efcc119850c632f9741f483e31767a68744707 [file] [log] [blame]
Bill Wendlingbc9bffa2007-03-07 05:43:18 +00001//====- X86InstrMMX.td - Describe the X86 Instruction Set --*- tablegen -*-===//
Evan Chengffcb95b2006-02-21 19:13:53 +00002//
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 MMX 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
Bill Wendlinga31bd272007-03-06 18:53:42 +000016//===----------------------------------------------------------------------===//
Evan Chengfcf5e212006-04-11 06:57:30 +000017// Instruction templates
Bill Wendlinga31bd272007-03-06 18:53:42 +000018//===----------------------------------------------------------------------===//
19
Evan Chengd2a6d542006-04-12 23:42:44 +000020// MMXI - MMX instructions with TB prefix.
21// MMX2I - MMX / SSE2 instructions with TB and OpSize prefixes.
22// MMXIi8 - MMX instructions with ImmT == Imm8 and TB prefix.
23class MMXI<bits<8> o, Format F, dag ops, string asm, list<dag> pattern>
24 : I<o, F, ops, asm, pattern>, TB, Requires<[HasMMX]>;
25class MMX2I<bits<8> o, Format F, dag ops, string asm, list<dag> pattern>
Bill Wendlingb8440a02007-03-23 22:35:46 +000026 : I<o, F, ops, asm, pattern>, TB, OpSize, Requires<[HasMMX]>;
Evan Chengfcf5e212006-04-11 06:57:30 +000027class MMXIi8<bits<8> o, Format F, dag ops, string asm, list<dag> pattern>
Evan Cheng1693e482006-07-19 00:27:29 +000028 : Ii8<o, F, ops, asm, pattern>, TB, Requires<[HasMMX]>;
Evan Chengfcf5e212006-04-11 06:57:30 +000029
Evan Chengba753c62006-03-20 06:04:52 +000030// Some 'special' instructions
31def IMPLICIT_DEF_VR64 : I<0, Pseudo, (ops VR64:$dst),
32 "#IMPLICIT_DEF $dst",
33 [(set VR64:$dst, (v8i8 (undef)))]>,
34 Requires<[HasMMX]>;
35
Bill Wendlingbc9bffa2007-03-07 05:43:18 +000036// 64-bit vector undef's.
37def : Pat<(v8i8 (undef)), (IMPLICIT_DEF_VR64)>;
38def : Pat<(v4i16 (undef)), (IMPLICIT_DEF_VR64)>;
39def : Pat<(v2i32 (undef)), (IMPLICIT_DEF_VR64)>;
Bill Wendlingeebc8a12007-03-26 07:53:08 +000040def : Pat<(v1i64 (undef)), (IMPLICIT_DEF_VR64)>;
Evan Chengba753c62006-03-20 06:04:52 +000041
Bill Wendlinga31bd272007-03-06 18:53:42 +000042//===----------------------------------------------------------------------===//
43// MMX Pattern Fragments
44//===----------------------------------------------------------------------===//
45
Bill Wendlingeebc8a12007-03-26 07:53:08 +000046def loadv1i64 : PatFrag<(ops node:$ptr), (v1i64 (load node:$ptr))>;
Bill Wendlinga31bd272007-03-06 18:53:42 +000047
Bill Wendlinga348c562007-03-22 18:42:45 +000048def bc_v8i8 : PatFrag<(ops node:$in), (v8i8 (bitconvert node:$in))>;
49def bc_v4i16 : PatFrag<(ops node:$in), (v4i16 (bitconvert node:$in))>;
50def bc_v2i32 : PatFrag<(ops node:$in), (v2i32 (bitconvert node:$in))>;
51
Bill Wendlinga31bd272007-03-06 18:53:42 +000052//===----------------------------------------------------------------------===//
Bill Wendling2f88dcd2007-03-08 22:09:11 +000053// MMX Multiclasses
54//===----------------------------------------------------------------------===//
55
56let isTwoAddress = 1 in {
57 // MMXI_binop_rm - Simple MMX binary operator.
58 multiclass MMXI_binop_rm<bits<8> opc, string OpcodeStr, SDNode OpNode,
59 ValueType OpVT, bit Commutable = 0> {
60 def rr : MMXI<opc, MRMSrcReg, (ops VR64:$dst, VR64:$src1, VR64:$src2),
61 !strconcat(OpcodeStr, " {$src2, $dst|$dst, $src2}"),
62 [(set VR64:$dst, (OpVT (OpNode VR64:$src1, VR64:$src2)))]> {
63 let isCommutable = Commutable;
64 }
65 def rm : MMXI<opc, MRMSrcMem, (ops VR64:$dst, VR64:$src1, i64mem:$src2),
66 !strconcat(OpcodeStr, " {$src2, $dst|$dst, $src2}"),
67 [(set VR64:$dst, (OpVT (OpNode VR64:$src1,
68 (bitconvert
Bill Wendlingeebc8a12007-03-26 07:53:08 +000069 (loadv1i64 addr:$src2)))))]>;
Bill Wendling2f88dcd2007-03-08 22:09:11 +000070 }
Bill Wendling2f88dcd2007-03-08 22:09:11 +000071
Bill Wendling2f88dcd2007-03-08 22:09:11 +000072 multiclass MMXI_binop_rm_int<bits<8> opc, string OpcodeStr, Intrinsic IntId,
73 bit Commutable = 0> {
74 def rr : MMXI<opc, MRMSrcReg, (ops VR64:$dst, VR64:$src1, VR64:$src2),
75 !strconcat(OpcodeStr, " {$src2, $dst|$dst, $src2}"),
76 [(set VR64:$dst, (IntId VR64:$src1, VR64:$src2))]> {
77 let isCommutable = Commutable;
78 }
79 def rm : MMXI<opc, MRMSrcMem, (ops VR64:$dst, VR64:$src1, i64mem:$src2),
80 !strconcat(OpcodeStr, " {$src2, $dst|$dst, $src2}"),
81 [(set VR64:$dst, (IntId VR64:$src1,
Bill Wendlingeebc8a12007-03-26 07:53:08 +000082 (bitconvert (loadv1i64 addr:$src2))))]>;
Bill Wendling2f88dcd2007-03-08 22:09:11 +000083 }
Bill Wendling1b7a81d2007-03-16 09:44:46 +000084
Bill Wendlingeebc8a12007-03-26 07:53:08 +000085 // MMXI_binop_rm_v1i64 - Simple MMX binary operator whose type is v1i64.
Bill Wendling1b7a81d2007-03-16 09:44:46 +000086 //
87 // FIXME: we could eliminate this and use MMXI_binop_rm instead if tblgen knew
88 // to collapse (bitconvert VT to VT) into its operand.
89 //
Bill Wendlingeebc8a12007-03-26 07:53:08 +000090 multiclass MMXI_binop_rm_v1i64<bits<8> opc, string OpcodeStr, SDNode OpNode,
Bill Wendling1b7a81d2007-03-16 09:44:46 +000091 bit Commutable = 0> {
92 def rr : MMXI<opc, MRMSrcReg, (ops VR64:$dst, VR64:$src1, VR64:$src2),
93 !strconcat(OpcodeStr, " {$src2, $dst|$dst, $src2}"),
Bill Wendlingeebc8a12007-03-26 07:53:08 +000094 [(set VR64:$dst, (v1i64 (OpNode VR64:$src1, VR64:$src2)))]> {
Bill Wendling1b7a81d2007-03-16 09:44:46 +000095 let isCommutable = Commutable;
96 }
97 def rm : MMXI<opc, MRMSrcMem, (ops VR64:$dst, VR64:$src1, i64mem:$src2),
98 !strconcat(OpcodeStr, " {$src2, $dst|$dst, $src2}"),
99 [(set VR64:$dst,
Bill Wendlingeebc8a12007-03-26 07:53:08 +0000100 (OpNode VR64:$src1,(loadv1i64 addr:$src2)))]>;
Bill Wendling1b7a81d2007-03-16 09:44:46 +0000101 }
Bill Wendlinga348c562007-03-22 18:42:45 +0000102
103 multiclass MMXI_binop_rmi_int<bits<8> opc, bits<8> opc2, Format ImmForm,
104 string OpcodeStr, Intrinsic IntId> {
105 def rr : MMXI<opc, MRMSrcReg, (ops VR64:$dst, VR64:$src1, VR64:$src2),
106 !strconcat(OpcodeStr, " {$src2, $dst|$dst, $src2}"),
107 [(set VR64:$dst, (IntId VR64:$src1, VR64:$src2))]>;
108 def rm : MMXI<opc, MRMSrcMem, (ops VR64:$dst, VR64:$src1, i64mem:$src2),
109 !strconcat(OpcodeStr, " {$src2, $dst|$dst, $src2}"),
110 [(set VR64:$dst, (IntId VR64:$src1,
Bill Wendlingeebc8a12007-03-26 07:53:08 +0000111 (bitconvert (loadv1i64 addr:$src2))))]>;
Bill Wendlinga348c562007-03-22 18:42:45 +0000112 def ri : MMXIi8<opc2, ImmForm, (ops VR64:$dst, VR64:$src1, i32i8imm:$src2),
113 !strconcat(OpcodeStr, " {$src2, $dst|$dst, $src2}"),
114 [(set VR64:$dst, (IntId VR64:$src1,
115 (scalar_to_vector (i32 imm:$src2))))]>;
116 }
Bill Wendling2f88dcd2007-03-08 22:09:11 +0000117}
118
119//===----------------------------------------------------------------------===//
Bill Wendlinga31bd272007-03-06 18:53:42 +0000120// MMX EMMS Instruction
121//===----------------------------------------------------------------------===//
122
Bill Wendlinga348c562007-03-22 18:42:45 +0000123def MMX_EMMS : MMXI<0x77, RawFrm, (ops), "emms", [(int_x86_mmx_emms)]>;
Bill Wendlinga31bd272007-03-06 18:53:42 +0000124
125//===----------------------------------------------------------------------===//
126// MMX Scalar Instructions
127//===----------------------------------------------------------------------===//
Bill Wendling229baff2007-03-05 23:09:45 +0000128
Bill Wendling2f88dcd2007-03-08 22:09:11 +0000129// Arithmetic Instructions
130defm MMX_PADDB : MMXI_binop_rm<0xFC, "paddb", add, v8i8, 1>;
131defm MMX_PADDW : MMXI_binop_rm<0xFD, "paddw", add, v4i16, 1>;
132defm MMX_PADDD : MMXI_binop_rm<0xFE, "paddd", add, v2i32, 1>;
133
134defm MMX_PADDSB : MMXI_binop_rm_int<0xEC, "paddsb" , int_x86_mmx_padds_b, 1>;
135defm MMX_PADDSW : MMXI_binop_rm_int<0xED, "paddsw" , int_x86_mmx_padds_w, 1>;
136
137defm MMX_PADDUSB : MMXI_binop_rm_int<0xDC, "paddusb", int_x86_mmx_paddus_b, 1>;
138defm MMX_PADDUSW : MMXI_binop_rm_int<0xDD, "paddusw", int_x86_mmx_paddus_w, 1>;
139
Bill Wendlingc1fb0472007-03-10 09:57:05 +0000140defm MMX_PSUBB : MMXI_binop_rm<0xF8, "psubb", sub, v8i8>;
141defm MMX_PSUBW : MMXI_binop_rm<0xF9, "psubw", sub, v4i16>;
142defm MMX_PSUBD : MMXI_binop_rm<0xFA, "psubd", sub, v2i32>;
143
144defm MMX_PSUBSB : MMXI_binop_rm_int<0xE8, "psubsb" , int_x86_mmx_psubs_b>;
145defm MMX_PSUBSW : MMXI_binop_rm_int<0xE9, "psubsw" , int_x86_mmx_psubs_w>;
146
147defm MMX_PSUBUSB : MMXI_binop_rm_int<0xD8, "psubusb", int_x86_mmx_psubus_b>;
148defm MMX_PSUBUSW : MMXI_binop_rm_int<0xD9, "psubusw", int_x86_mmx_psubus_w>;
149
Bill Wendling74027e92007-03-15 21:24:36 +0000150defm MMX_PMULLW : MMXI_binop_rm<0xD5, "pmullw", mul, v4i16, 1>;
151
152defm MMX_PMULHW : MMXI_binop_rm_int<0xE5, "pmulhw" , int_x86_mmx_pmulh_w , 1>;
153defm MMX_PMADDWD : MMXI_binop_rm_int<0xF5, "pmaddwd", int_x86_mmx_pmadd_wd, 1>;
154
Bill Wendling02ced832007-03-22 20:29:26 +0000155// MMX_SHUFFLE_get_shuf_imm xform function: convert vector_shuffle mask to
156// MMX_PSHUF*, MMX_SHUFP* etc. imm.
157def MMX_SHUFFLE_get_shuf_imm : SDNodeXForm<build_vector, [{
158 return getI8Imm(X86::getShuffleSHUFImmediate(N));
159}]>;
160
161def MMX_splat_mask : PatLeaf<(build_vector), [{
162 return X86::isSplatMask(N);
163}], MMX_SHUFFLE_get_shuf_imm>;
164
Bill Wendlinga348c562007-03-22 18:42:45 +0000165def MMX_UNPCKH_shuffle_mask : PatLeaf<(build_vector), [{
166 return X86::isUNPCKHMask(N);
167}]>;
168
169let isTwoAddress = 1 in {
170def MMX_PUNPCKHBWrr : MMXI<0x68, MRMSrcReg,
171 (ops VR64:$dst, VR64:$src1, VR64:$src2),
172 "punpckhbw {$src2, $dst|$dst, $src2}",
173 [(set VR64:$dst,
174 (v8i8 (vector_shuffle VR64:$src1, VR64:$src2,
175 MMX_UNPCKH_shuffle_mask)))]>;
176def MMX_PUNPCKHBWrm : MMXI<0x68, MRMSrcMem,
177 (ops VR64:$dst, VR64:$src1, i64mem:$src2),
178 "punpckhbw {$src2, $dst|$dst, $src2}",
179 [(set VR64:$dst,
180 (v8i8 (vector_shuffle VR64:$src1,
Bill Wendlingeebc8a12007-03-26 07:53:08 +0000181 (bc_v8i8 (loadv1i64 addr:$src2)),
Bill Wendlinga348c562007-03-22 18:42:45 +0000182 MMX_UNPCKH_shuffle_mask)))]>;
183def MMX_PUNPCKHWDrr : MMXI<0x69, MRMSrcReg,
184 (ops VR64:$dst, VR64:$src1, VR64:$src2),
185 "punpckhwd {$src2, $dst|$dst, $src2}",
186 [(set VR64:$dst,
187 (v4i16 (vector_shuffle VR64:$src1, VR64:$src2,
188 MMX_UNPCKH_shuffle_mask)))]>;
189def MMX_PUNPCKHWDrm : MMXI<0x69, MRMSrcMem,
190 (ops VR64:$dst, VR64:$src1, i64mem:$src2),
191 "punpckhwd {$src2, $dst|$dst, $src2}",
192 [(set VR64:$dst,
193 (v4i16 (vector_shuffle VR64:$src1,
Bill Wendlingeebc8a12007-03-26 07:53:08 +0000194 (bc_v4i16 (loadv1i64 addr:$src2)),
Bill Wendlinga348c562007-03-22 18:42:45 +0000195 MMX_UNPCKH_shuffle_mask)))]>;
196def MMX_PUNPCKHDQrr : MMXI<0x6A, MRMSrcReg,
197 (ops VR64:$dst, VR64:$src1, VR64:$src2),
198 "punpckhdq {$src2, $dst|$dst, $src2}",
199 [(set VR64:$dst,
Bill Wendlingeebc8a12007-03-26 07:53:08 +0000200 (v1i64 (vector_shuffle VR64:$src1, VR64:$src2,
Bill Wendlinga348c562007-03-22 18:42:45 +0000201 MMX_UNPCKH_shuffle_mask)))]>;
202def MMX_PUNPCKHDQrm : MMXI<0x6A, MRMSrcMem,
203 (ops VR64:$dst, VR64:$src1, i64mem:$src2),
204 "punpckhdq {$src2, $dst|$dst, $src2}",
205 [(set VR64:$dst,
Bill Wendlingeebc8a12007-03-26 07:53:08 +0000206 (v1i64 (vector_shuffle VR64:$src1,
207 (loadv1i64 addr:$src2),
Bill Wendlinga348c562007-03-22 18:42:45 +0000208 MMX_UNPCKH_shuffle_mask)))]>;
209}
210
Bill Wendling1b7a81d2007-03-16 09:44:46 +0000211// Logical Instructions
Bill Wendlingeebc8a12007-03-26 07:53:08 +0000212defm MMX_PAND : MMXI_binop_rm_v1i64<0xDB, "pand", and, 1>;
213defm MMX_POR : MMXI_binop_rm_v1i64<0xEB, "por" , or, 1>;
214defm MMX_PXOR : MMXI_binop_rm_v1i64<0xEF, "pxor", xor, 1>;
Bill Wendling1b7a81d2007-03-16 09:44:46 +0000215
216let isTwoAddress = 1 in {
217 def MMX_PANDNrr : MMXI<0xDF, MRMSrcReg,
218 (ops VR64:$dst, VR64:$src1, VR64:$src2),
219 "pandn {$src2, $dst|$dst, $src2}",
Bill Wendlingeebc8a12007-03-26 07:53:08 +0000220 [(set VR64:$dst, (v1i64 (and (vnot VR64:$src1),
Bill Wendling1b7a81d2007-03-16 09:44:46 +0000221 VR64:$src2)))]>;
222 def MMX_PANDNrm : MMXI<0xDF, MRMSrcMem,
223 (ops VR64:$dst, VR64:$src1, i64mem:$src2),
224 "pandn {$src2, $dst|$dst, $src2}",
Bill Wendlingeebc8a12007-03-26 07:53:08 +0000225 [(set VR64:$dst, (v1i64 (and (vnot VR64:$src1),
Bill Wendling1b7a81d2007-03-16 09:44:46 +0000226 (load addr:$src2))))]>;
227}
228
Bill Wendlinga348c562007-03-22 18:42:45 +0000229// Shift Instructions
230defm MMX_PSRLW : MMXI_binop_rmi_int<0xD1, 0x71, MRM2r, "psrlw",
231 int_x86_mmx_psrl_w>;
232defm MMX_PSRLD : MMXI_binop_rmi_int<0xD2, 0x72, MRM2r, "psrld",
233 int_x86_mmx_psrl_d>;
234defm MMX_PSRLQ : MMXI_binop_rmi_int<0xD3, 0x73, MRM2r, "psrlq",
235 int_x86_mmx_psrl_q>;
236
237defm MMX_PSLLW : MMXI_binop_rmi_int<0xF1, 0x71, MRM6r, "psllw",
238 int_x86_mmx_psll_w>;
239defm MMX_PSLLD : MMXI_binop_rmi_int<0xF2, 0x72, MRM6r, "pslld",
240 int_x86_mmx_psll_d>;
241defm MMX_PSLLQ : MMXI_binop_rmi_int<0xF3, 0x73, MRM6r, "psllq",
242 int_x86_mmx_psll_q>;
243
244defm MMX_PSRAW : MMXI_binop_rmi_int<0xE1, 0x71, MRM4r, "psraw",
245 int_x86_mmx_psra_w>;
246defm MMX_PSRAD : MMXI_binop_rmi_int<0xE2, 0x72, MRM4r, "psrad",
247 int_x86_mmx_psra_d>;
248
Bill Wendlingb8440a02007-03-23 22:35:46 +0000249// Pack instructions
250defm MMX_PACKSSWB : MMXI_binop_rm_int<0x63, "packsswb", int_x86_mmx_packsswb>;
251defm MMX_PACKSSDW : MMXI_binop_rm_int<0x6B, "packssdw", int_x86_mmx_packssdw>;
252defm MMX_PACKUSWB : MMXI_binop_rm_int<0x67, "packuswb", int_x86_mmx_packuswb>;
253
Evan Chengffcb95b2006-02-21 19:13:53 +0000254// Move Instructions
Bill Wendlinga31bd272007-03-06 18:53:42 +0000255def MOVD64rr : MMXI<0x6E, MRMSrcReg, (ops VR64:$dst, GR32:$src),
256 "movd {$src, $dst|$dst, $src}", []>;
257def MOVD64rm : MMXI<0x6E, MRMSrcMem, (ops VR64:$dst, i32mem:$src),
258 "movd {$src, $dst|$dst, $src}", []>;
259def MOVD64mr : MMXI<0x7E, MRMDestMem, (ops i32mem:$dst, VR64:$src),
260 "movd {$src, $dst|$dst, $src}", []>;
Evan Chengffcb95b2006-02-21 19:13:53 +0000261
Bill Wendlinga31bd272007-03-06 18:53:42 +0000262def MOVQ64rr : MMXI<0x6F, MRMSrcReg, (ops VR64:$dst, VR64:$src),
263 "movq {$src, $dst|$dst, $src}", []>;
264def MOVQ64rm : MMXI<0x6F, MRMSrcMem, (ops VR64:$dst, i64mem:$src),
265 "movq {$src, $dst|$dst, $src}",
Bill Wendlingeebc8a12007-03-26 07:53:08 +0000266 [(set VR64:$dst, (loadv1i64 addr:$src))]>;
Bill Wendlinga31bd272007-03-06 18:53:42 +0000267def MOVQ64mr : MMXI<0x7F, MRMDestMem, (ops i64mem:$dst, VR64:$src),
268 "movq {$src, $dst|$dst, $src}",
Bill Wendlingeebc8a12007-03-26 07:53:08 +0000269 [(store (v1i64 VR64:$src), addr:$dst)]>;
Evan Cheng3246e062006-03-25 01:31:59 +0000270
271// Conversion instructions
Evan Chengd2a6d542006-04-12 23:42:44 +0000272def CVTPI2PSrr : MMXI<0x2A, MRMSrcReg, (ops VR128:$dst, VR64:$src),
273 "cvtpi2ps {$src, $dst|$dst, $src}", []>;
274def CVTPI2PSrm : MMXI<0x2A, MRMSrcMem, (ops VR128:$dst, i64mem:$src),
275 "cvtpi2ps {$src, $dst|$dst, $src}", []>;
276def CVTPI2PDrr : MMX2I<0x2A, MRMSrcReg, (ops VR128:$dst, VR64:$src),
277 "cvtpi2pd {$src, $dst|$dst, $src}", []>;
278def CVTPI2PDrm : MMX2I<0x2A, MRMSrcMem, (ops VR128:$dst, i64mem:$src),
279 "cvtpi2pd {$src, $dst|$dst, $src}", []>;
Evan Cheng3246e062006-03-25 01:31:59 +0000280def CVTTPS2PIrr: I<0x2C, MRMSrcReg, (ops VR64:$dst, VR128:$src),
281 "cvttps2pi {$src, $dst|$dst, $src}", []>, TB,
Bill Wendling74027e92007-03-15 21:24:36 +0000282 Requires<[HasMMX]>;
Evan Chengcc4f0472006-03-25 06:00:03 +0000283def CVTTPS2PIrm: I<0x2C, MRMSrcMem, (ops VR64:$dst, f64mem:$src),
Evan Cheng3246e062006-03-25 01:31:59 +0000284 "cvttps2pi {$src, $dst|$dst, $src}", []>, TB,
285 Requires<[HasMMX]>;
Evan Chengd2a6d542006-04-12 23:42:44 +0000286def CVTPS2PIrr : MMXI<0x2D, MRMSrcReg, (ops VR64:$dst, VR128:$src),
287 "cvtps2pi {$src, $dst|$dst, $src}", []>;
288def CVTPS2PIrm : MMXI<0x2D, MRMSrcMem, (ops VR64:$dst, f64mem:$src),
289 "cvtps2pi {$src, $dst|$dst, $src}", []>;
290def CVTPD2PIrr : MMX2I<0x2D, MRMSrcReg, (ops VR64:$dst, VR128:$src),
291 "cvtpd2pi {$src, $dst|$dst, $src}", []>;
292def CVTPD2PIrm : MMX2I<0x2D, MRMSrcMem, (ops VR64:$dst, f128mem:$src),
293 "cvtpd2pi {$src, $dst|$dst, $src}", []>;
Evan Chengfcf5e212006-04-11 06:57:30 +0000294
295// Shuffle and unpack instructions
296def PSHUFWri : MMXIi8<0x70, MRMSrcReg,
297 (ops VR64:$dst, VR64:$src1, i8imm:$src2),
298 "pshufw {$src2, $src1, $dst|$dst, $src1, $src2}", []>;
299def PSHUFWmi : MMXIi8<0x70, MRMSrcMem,
300 (ops VR64:$dst, i64mem:$src1, i8imm:$src2),
301 "pshufw {$src2, $src1, $dst|$dst, $src1, $src2}", []>;
302
303// Misc.
304def MOVNTQ : I<0xE7, MRMDestMem, (ops i64mem:$dst, VR64:$src),
305 "movntq {$src, $dst|$dst, $src}", []>, TB,
306 Requires<[HasMMX]>;
307
308def MASKMOVQ : I<0xF7, MRMDestMem, (ops VR64:$src, VR64:$mask),
309 "maskmovq {$mask, $src|$src, $mask}", []>, TB,
310 Requires<[HasMMX]>;
Bill Wendlinga31bd272007-03-06 18:53:42 +0000311
312//===----------------------------------------------------------------------===//
Bill Wendlingeebc8a12007-03-26 07:53:08 +0000313// Alias Instructions
314//===----------------------------------------------------------------------===//
315
316// Alias instructions that map zero vector to pxor.
317// FIXME: remove when we can teach regalloc that xor reg, reg is ok.
318let isReMaterializable = 1 in {
319def MMX_V_SET0 : MMXI<0xEF, MRMInitReg, (ops VR64:$dst),
320 "pxor $dst, $dst",
321 [(set VR64:$dst, (v1i64 immAllZerosV))]>;
322}
323
324//===----------------------------------------------------------------------===//
Bill Wendlinga31bd272007-03-06 18:53:42 +0000325// Non-Instruction Patterns
326//===----------------------------------------------------------------------===//
327
328// Store 64-bit integer vector values.
329def : Pat<(store (v8i8 VR64:$src), addr:$dst),
330 (MOVQ64mr addr:$dst, VR64:$src)>;
331def : Pat<(store (v4i16 VR64:$src), addr:$dst),
332 (MOVQ64mr addr:$dst, VR64:$src)>;
Bill Wendlingeebc8a12007-03-26 07:53:08 +0000333def : Pat<(store (v2i32 VR64:$src), addr:$dst),
334 (MOVQ64mr addr:$dst, VR64:$src)>;
335
336// 128-bit vector all zero's.
337def : Pat<(v8i8 immAllZerosV), (MMX_V_SET0)>;
338def : Pat<(v4i16 immAllZerosV), (MMX_V_SET0)>;
339def : Pat<(v2i32 immAllZerosV), (MMX_V_SET0)>;
340def : Pat<(v1i64 immAllZerosV), (MMX_V_SET0)>;
Bill Wendlingbc9bffa2007-03-07 05:43:18 +0000341
342// Bit convert.
Bill Wendlingeebc8a12007-03-26 07:53:08 +0000343def : Pat<(v8i8 (bitconvert (v1i64 VR64:$src))), (v8i8 VR64:$src)>;
Bill Wendlingbc9bffa2007-03-07 05:43:18 +0000344def : Pat<(v8i8 (bitconvert (v2i32 VR64:$src))), (v8i8 VR64:$src)>;
345def : Pat<(v8i8 (bitconvert (v4i16 VR64:$src))), (v8i8 VR64:$src)>;
Bill Wendlingeebc8a12007-03-26 07:53:08 +0000346def : Pat<(v4i16 (bitconvert (v1i64 VR64:$src))), (v4i16 VR64:$src)>;
Bill Wendlingbc9bffa2007-03-07 05:43:18 +0000347def : Pat<(v4i16 (bitconvert (v2i32 VR64:$src))), (v4i16 VR64:$src)>;
348def : Pat<(v4i16 (bitconvert (v8i8 VR64:$src))), (v4i16 VR64:$src)>;
Bill Wendlingeebc8a12007-03-26 07:53:08 +0000349def : Pat<(v2i32 (bitconvert (v1i64 VR64:$src))), (v2i32 VR64:$src)>;
Bill Wendlingbc9bffa2007-03-07 05:43:18 +0000350def : Pat<(v2i32 (bitconvert (v4i16 VR64:$src))), (v2i32 VR64:$src)>;
351def : Pat<(v2i32 (bitconvert (v8i8 VR64:$src))), (v2i32 VR64:$src)>;
Bill Wendlingeebc8a12007-03-26 07:53:08 +0000352def : Pat<(v1i64 (bitconvert (v2i32 VR64:$src))), (v1i64 VR64:$src)>;
353def : Pat<(v1i64 (bitconvert (v4i16 VR64:$src))), (v1i64 VR64:$src)>;
354def : Pat<(v1i64 (bitconvert (v8i8 VR64:$src))), (v1i64 VR64:$src)>;
Bill Wendlinga348c562007-03-22 18:42:45 +0000355
Bill Wendlingeebc8a12007-03-26 07:53:08 +0000356// Splat v1i64
Bill Wendlinga348c562007-03-22 18:42:45 +0000357let AddedComplexity = 10 in {
Bill Wendlingeebc8a12007-03-26 07:53:08 +0000358 def : Pat<(vector_shuffle (v1i64 VR64:$src), (undef),
Bill Wendling02ced832007-03-22 20:29:26 +0000359 MMX_splat_mask:$sm),
360 (MMX_PUNPCKHDQrr VR64:$src, VR64:$src)>;
Bill Wendlingeebc8a12007-03-26 07:53:08 +0000361 def : Pat<(vector_shuffle (v1i64 VR64:$src), (undef),
Bill Wendlinga348c562007-03-22 18:42:45 +0000362 MMX_UNPCKH_shuffle_mask:$sm),
363 (MMX_PUNPCKHDQrr VR64:$src, VR64:$src)>;
364}
365
Bill Wendlinga348c562007-03-22 18:42:45 +0000366def MMX_X86s2vec : SDNode<"X86ISD::S2VEC", SDTypeProfile<1, 1, []>, []>;
367
368// Scalar to v4i16 / v8i8. The source may be a GR32, but only the lower 8 or
369// 16-bits matter.
Bill Wendlingeebc8a12007-03-26 07:53:08 +0000370def : Pat<(v8i8 (MMX_X86s2vec GR32:$src)), (MOVD64rr GR32:$src)>;
Bill Wendlinga348c562007-03-22 18:42:45 +0000371def : Pat<(v4i16 (MMX_X86s2vec GR32:$src)), (MOVD64rr GR32:$src)>;