xref: /aosp_15_r20/external/llvm/lib/Target/X86/X86InstrMMX.td (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker//===-- X86InstrMMX.td - Describe the MMX Instruction Set --*- tablegen -*-===//
2*9880d681SAndroid Build Coastguard Worker//
3*9880d681SAndroid Build Coastguard Worker//                     The LLVM Compiler Infrastructure
4*9880d681SAndroid Build Coastguard Worker//
5*9880d681SAndroid Build Coastguard Worker// This file is distributed under the University of Illinois Open Source
6*9880d681SAndroid Build Coastguard Worker// License. See LICENSE.TXT for details.
7*9880d681SAndroid Build Coastguard Worker//
8*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
9*9880d681SAndroid Build Coastguard Worker//
10*9880d681SAndroid Build Coastguard Worker// This file describes the X86 MMX instruction set, defining the instructions,
11*9880d681SAndroid Build Coastguard Worker// and properties of the instructions which are needed for code generation,
12*9880d681SAndroid Build Coastguard Worker// machine code emission, and analysis.
13*9880d681SAndroid Build Coastguard Worker//
14*9880d681SAndroid Build Coastguard Worker// All instructions that use MMX should be in this file, even if they also use
15*9880d681SAndroid Build Coastguard Worker// SSE.
16*9880d681SAndroid Build Coastguard Worker//
17*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
18*9880d681SAndroid Build Coastguard Worker
19*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
20*9880d681SAndroid Build Coastguard Worker// MMX Multiclasses
21*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
22*9880d681SAndroid Build Coastguard Worker
23*9880d681SAndroid Build Coastguard Workerlet Sched = WriteVecALU in {
24*9880d681SAndroid Build Coastguard Workerdef MMX_INTALU_ITINS : OpndItins<
25*9880d681SAndroid Build Coastguard Worker  IIC_MMX_ALU_RR, IIC_MMX_ALU_RM
26*9880d681SAndroid Build Coastguard Worker>;
27*9880d681SAndroid Build Coastguard Worker
28*9880d681SAndroid Build Coastguard Workerdef MMX_INTALUQ_ITINS : OpndItins<
29*9880d681SAndroid Build Coastguard Worker  IIC_MMX_ALUQ_RR, IIC_MMX_ALUQ_RM
30*9880d681SAndroid Build Coastguard Worker>;
31*9880d681SAndroid Build Coastguard Worker
32*9880d681SAndroid Build Coastguard Workerdef MMX_PHADDSUBW : OpndItins<
33*9880d681SAndroid Build Coastguard Worker  IIC_MMX_PHADDSUBW_RR, IIC_MMX_PHADDSUBW_RM
34*9880d681SAndroid Build Coastguard Worker>;
35*9880d681SAndroid Build Coastguard Worker
36*9880d681SAndroid Build Coastguard Workerdef MMX_PHADDSUBD : OpndItins<
37*9880d681SAndroid Build Coastguard Worker  IIC_MMX_PHADDSUBD_RR, IIC_MMX_PHADDSUBD_RM
38*9880d681SAndroid Build Coastguard Worker>;
39*9880d681SAndroid Build Coastguard Worker}
40*9880d681SAndroid Build Coastguard Worker
41*9880d681SAndroid Build Coastguard Workerlet Sched = WriteVecLogic in
42*9880d681SAndroid Build Coastguard Workerdef MMX_INTALU_ITINS_VECLOGICSCHED : OpndItins<
43*9880d681SAndroid Build Coastguard Worker  IIC_MMX_ALU_RR, IIC_MMX_ALU_RM
44*9880d681SAndroid Build Coastguard Worker>;
45*9880d681SAndroid Build Coastguard Worker
46*9880d681SAndroid Build Coastguard Workerlet Sched = WriteVecIMul in
47*9880d681SAndroid Build Coastguard Workerdef MMX_PMUL_ITINS : OpndItins<
48*9880d681SAndroid Build Coastguard Worker  IIC_MMX_PMUL, IIC_MMX_PMUL
49*9880d681SAndroid Build Coastguard Worker>;
50*9880d681SAndroid Build Coastguard Worker
51*9880d681SAndroid Build Coastguard Workerlet Sched = WriteVecIMul in {
52*9880d681SAndroid Build Coastguard Workerdef MMX_PSADBW_ITINS : OpndItins<
53*9880d681SAndroid Build Coastguard Worker  IIC_MMX_PSADBW, IIC_MMX_PSADBW
54*9880d681SAndroid Build Coastguard Worker>;
55*9880d681SAndroid Build Coastguard Worker
56*9880d681SAndroid Build Coastguard Workerdef MMX_MISC_FUNC_ITINS : OpndItins<
57*9880d681SAndroid Build Coastguard Worker  IIC_MMX_MISC_FUNC_MEM, IIC_MMX_MISC_FUNC_REG
58*9880d681SAndroid Build Coastguard Worker>;
59*9880d681SAndroid Build Coastguard Worker}
60*9880d681SAndroid Build Coastguard Worker
61*9880d681SAndroid Build Coastguard Workerdef MMX_SHIFT_ITINS : ShiftOpndItins<
62*9880d681SAndroid Build Coastguard Worker  IIC_MMX_SHIFT_RR, IIC_MMX_SHIFT_RM, IIC_MMX_SHIFT_RI
63*9880d681SAndroid Build Coastguard Worker>;
64*9880d681SAndroid Build Coastguard Worker
65*9880d681SAndroid Build Coastguard Workerlet Sched = WriteShuffle in {
66*9880d681SAndroid Build Coastguard Workerdef MMX_UNPCK_H_ITINS : OpndItins<
67*9880d681SAndroid Build Coastguard Worker  IIC_MMX_UNPCK_H_RR, IIC_MMX_UNPCK_H_RM
68*9880d681SAndroid Build Coastguard Worker>;
69*9880d681SAndroid Build Coastguard Worker
70*9880d681SAndroid Build Coastguard Workerdef MMX_UNPCK_L_ITINS : OpndItins<
71*9880d681SAndroid Build Coastguard Worker  IIC_MMX_UNPCK_L, IIC_MMX_UNPCK_L
72*9880d681SAndroid Build Coastguard Worker>;
73*9880d681SAndroid Build Coastguard Worker
74*9880d681SAndroid Build Coastguard Workerdef MMX_PCK_ITINS : OpndItins<
75*9880d681SAndroid Build Coastguard Worker  IIC_MMX_PCK_RR, IIC_MMX_PCK_RM
76*9880d681SAndroid Build Coastguard Worker>;
77*9880d681SAndroid Build Coastguard Worker
78*9880d681SAndroid Build Coastguard Workerdef MMX_PSHUF_ITINS : OpndItins<
79*9880d681SAndroid Build Coastguard Worker  IIC_MMX_PSHUF, IIC_MMX_PSHUF
80*9880d681SAndroid Build Coastguard Worker>;
81*9880d681SAndroid Build Coastguard Worker} // Sched
82*9880d681SAndroid Build Coastguard Worker
83*9880d681SAndroid Build Coastguard Workerlet Sched = WriteCvtF2I in {
84*9880d681SAndroid Build Coastguard Workerdef MMX_CVT_PD_ITINS : OpndItins<
85*9880d681SAndroid Build Coastguard Worker  IIC_MMX_CVT_PD_RR, IIC_MMX_CVT_PD_RM
86*9880d681SAndroid Build Coastguard Worker>;
87*9880d681SAndroid Build Coastguard Worker
88*9880d681SAndroid Build Coastguard Workerdef MMX_CVT_PS_ITINS : OpndItins<
89*9880d681SAndroid Build Coastguard Worker  IIC_MMX_CVT_PS_RR, IIC_MMX_CVT_PS_RM
90*9880d681SAndroid Build Coastguard Worker>;
91*9880d681SAndroid Build Coastguard Worker}
92*9880d681SAndroid Build Coastguard Worker
93*9880d681SAndroid Build Coastguard Workerlet Constraints = "$src1 = $dst" in {
94*9880d681SAndroid Build Coastguard Worker  // MMXI_binop_rm_int - Simple MMX binary operator based on intrinsic.
95*9880d681SAndroid Build Coastguard Worker  // When this is cleaned up, remove the FIXME from X86RecognizableInstr.cpp.
96*9880d681SAndroid Build Coastguard Worker  multiclass MMXI_binop_rm_int<bits<8> opc, string OpcodeStr, Intrinsic IntId,
97*9880d681SAndroid Build Coastguard Worker                               OpndItins itins, bit Commutable = 0> {
98*9880d681SAndroid Build Coastguard Worker    def irr : MMXI<opc, MRMSrcReg, (outs VR64:$dst),
99*9880d681SAndroid Build Coastguard Worker                 (ins VR64:$src1, VR64:$src2),
100*9880d681SAndroid Build Coastguard Worker                 !strconcat(OpcodeStr, "\t{$src2, $dst|$dst, $src2}"),
101*9880d681SAndroid Build Coastguard Worker                 [(set VR64:$dst, (IntId VR64:$src1, VR64:$src2))], itins.rr>,
102*9880d681SAndroid Build Coastguard Worker              Sched<[itins.Sched]> {
103*9880d681SAndroid Build Coastguard Worker      let isCommutable = Commutable;
104*9880d681SAndroid Build Coastguard Worker    }
105*9880d681SAndroid Build Coastguard Worker    def irm : MMXI<opc, MRMSrcMem, (outs VR64:$dst),
106*9880d681SAndroid Build Coastguard Worker                 (ins VR64:$src1, i64mem:$src2),
107*9880d681SAndroid Build Coastguard Worker                 !strconcat(OpcodeStr, "\t{$src2, $dst|$dst, $src2}"),
108*9880d681SAndroid Build Coastguard Worker                 [(set VR64:$dst, (IntId VR64:$src1,
109*9880d681SAndroid Build Coastguard Worker                                   (bitconvert (load_mmx addr:$src2))))],
110*9880d681SAndroid Build Coastguard Worker                 itins.rm>, Sched<[itins.Sched.Folded, ReadAfterLd]>;
111*9880d681SAndroid Build Coastguard Worker  }
112*9880d681SAndroid Build Coastguard Worker
113*9880d681SAndroid Build Coastguard Worker  multiclass MMXI_binop_rmi_int<bits<8> opc, bits<8> opc2, Format ImmForm,
114*9880d681SAndroid Build Coastguard Worker                                string OpcodeStr, Intrinsic IntId,
115*9880d681SAndroid Build Coastguard Worker                                Intrinsic IntId2, ShiftOpndItins itins> {
116*9880d681SAndroid Build Coastguard Worker    def rr : MMXI<opc, MRMSrcReg, (outs VR64:$dst),
117*9880d681SAndroid Build Coastguard Worker                                  (ins VR64:$src1, VR64:$src2),
118*9880d681SAndroid Build Coastguard Worker                  !strconcat(OpcodeStr, "\t{$src2, $dst|$dst, $src2}"),
119*9880d681SAndroid Build Coastguard Worker                  [(set VR64:$dst, (IntId VR64:$src1, VR64:$src2))], itins.rr>,
120*9880d681SAndroid Build Coastguard Worker             Sched<[WriteVecShift]>;
121*9880d681SAndroid Build Coastguard Worker    def rm : MMXI<opc, MRMSrcMem, (outs VR64:$dst),
122*9880d681SAndroid Build Coastguard Worker                                  (ins VR64:$src1, i64mem:$src2),
123*9880d681SAndroid Build Coastguard Worker                  !strconcat(OpcodeStr, "\t{$src2, $dst|$dst, $src2}"),
124*9880d681SAndroid Build Coastguard Worker                  [(set VR64:$dst, (IntId VR64:$src1,
125*9880d681SAndroid Build Coastguard Worker                                    (bitconvert (load_mmx addr:$src2))))],
126*9880d681SAndroid Build Coastguard Worker                  itins.rm>, Sched<[WriteVecShiftLd, ReadAfterLd]>;
127*9880d681SAndroid Build Coastguard Worker    def ri : MMXIi8<opc2, ImmForm, (outs VR64:$dst),
128*9880d681SAndroid Build Coastguard Worker                                   (ins VR64:$src1, i32u8imm:$src2),
129*9880d681SAndroid Build Coastguard Worker                    !strconcat(OpcodeStr, "\t{$src2, $dst|$dst, $src2}"),
130*9880d681SAndroid Build Coastguard Worker           [(set VR64:$dst, (IntId2 VR64:$src1, imm:$src2))], itins.ri>,
131*9880d681SAndroid Build Coastguard Worker           Sched<[WriteVecShift]>;
132*9880d681SAndroid Build Coastguard Worker  }
133*9880d681SAndroid Build Coastguard Worker}
134*9880d681SAndroid Build Coastguard Worker
135*9880d681SAndroid Build Coastguard Worker/// Unary MMX instructions requiring SSSE3.
136*9880d681SAndroid Build Coastguard Workermulticlass SS3I_unop_rm_int_mm<bits<8> opc, string OpcodeStr,
137*9880d681SAndroid Build Coastguard Worker                               Intrinsic IntId64, OpndItins itins> {
138*9880d681SAndroid Build Coastguard Worker  def rr64 : MMXSS38I<opc, MRMSrcReg, (outs VR64:$dst), (ins VR64:$src),
139*9880d681SAndroid Build Coastguard Worker                   !strconcat(OpcodeStr, "\t{$src, $dst|$dst, $src}"),
140*9880d681SAndroid Build Coastguard Worker                   [(set VR64:$dst, (IntId64 VR64:$src))], itins.rr>,
141*9880d681SAndroid Build Coastguard Worker             Sched<[itins.Sched]>;
142*9880d681SAndroid Build Coastguard Worker
143*9880d681SAndroid Build Coastguard Worker  def rm64 : MMXSS38I<opc, MRMSrcMem, (outs VR64:$dst), (ins i64mem:$src),
144*9880d681SAndroid Build Coastguard Worker                   !strconcat(OpcodeStr, "\t{$src, $dst|$dst, $src}"),
145*9880d681SAndroid Build Coastguard Worker                   [(set VR64:$dst,
146*9880d681SAndroid Build Coastguard Worker                     (IntId64 (bitconvert (memopmmx addr:$src))))],
147*9880d681SAndroid Build Coastguard Worker                   itins.rm>, Sched<[itins.Sched.Folded]>;
148*9880d681SAndroid Build Coastguard Worker}
149*9880d681SAndroid Build Coastguard Worker
150*9880d681SAndroid Build Coastguard Worker/// Binary MMX instructions requiring SSSE3.
151*9880d681SAndroid Build Coastguard Workerlet ImmT = NoImm, Constraints = "$src1 = $dst" in {
152*9880d681SAndroid Build Coastguard Workermulticlass SS3I_binop_rm_int_mm<bits<8> opc, string OpcodeStr,
153*9880d681SAndroid Build Coastguard Worker                             Intrinsic IntId64, OpndItins itins> {
154*9880d681SAndroid Build Coastguard Worker  let isCommutable = 0 in
155*9880d681SAndroid Build Coastguard Worker  def rr64 : MMXSS38I<opc, MRMSrcReg, (outs VR64:$dst),
156*9880d681SAndroid Build Coastguard Worker       (ins VR64:$src1, VR64:$src2),
157*9880d681SAndroid Build Coastguard Worker        !strconcat(OpcodeStr, "\t{$src2, $dst|$dst, $src2}"),
158*9880d681SAndroid Build Coastguard Worker       [(set VR64:$dst, (IntId64 VR64:$src1, VR64:$src2))], itins.rr>,
159*9880d681SAndroid Build Coastguard Worker      Sched<[itins.Sched]>;
160*9880d681SAndroid Build Coastguard Worker  def rm64 : MMXSS38I<opc, MRMSrcMem, (outs VR64:$dst),
161*9880d681SAndroid Build Coastguard Worker       (ins VR64:$src1, i64mem:$src2),
162*9880d681SAndroid Build Coastguard Worker        !strconcat(OpcodeStr, "\t{$src2, $dst|$dst, $src2}"),
163*9880d681SAndroid Build Coastguard Worker       [(set VR64:$dst,
164*9880d681SAndroid Build Coastguard Worker         (IntId64 VR64:$src1,
165*9880d681SAndroid Build Coastguard Worker          (bitconvert (memopmmx addr:$src2))))], itins.rm>,
166*9880d681SAndroid Build Coastguard Worker      Sched<[itins.Sched.Folded, ReadAfterLd]>;
167*9880d681SAndroid Build Coastguard Worker}
168*9880d681SAndroid Build Coastguard Worker}
169*9880d681SAndroid Build Coastguard Worker
170*9880d681SAndroid Build Coastguard Worker/// PALIGN MMX instructions (require SSSE3).
171*9880d681SAndroid Build Coastguard Workermulticlass ssse3_palign_mm<string asm, Intrinsic IntId> {
172*9880d681SAndroid Build Coastguard Worker  def R64irr  : MMXSS3AI<0x0F, MRMSrcReg, (outs VR64:$dst),
173*9880d681SAndroid Build Coastguard Worker      (ins VR64:$src1, VR64:$src2, u8imm:$src3),
174*9880d681SAndroid Build Coastguard Worker      !strconcat(asm, "\t{$src3, $src2, $dst|$dst, $src2, $src3}"),
175*9880d681SAndroid Build Coastguard Worker      [(set VR64:$dst, (IntId VR64:$src1, VR64:$src2, (i8 imm:$src3)))]>,
176*9880d681SAndroid Build Coastguard Worker      Sched<[WriteShuffle]>;
177*9880d681SAndroid Build Coastguard Worker  def R64irm  : MMXSS3AI<0x0F, MRMSrcMem, (outs VR64:$dst),
178*9880d681SAndroid Build Coastguard Worker      (ins VR64:$src1, i64mem:$src2, u8imm:$src3),
179*9880d681SAndroid Build Coastguard Worker      !strconcat(asm, "\t{$src3, $src2, $dst|$dst, $src2, $src3}"),
180*9880d681SAndroid Build Coastguard Worker      [(set VR64:$dst, (IntId VR64:$src1,
181*9880d681SAndroid Build Coastguard Worker                       (bitconvert (load_mmx addr:$src2)), (i8 imm:$src3)))]>,
182*9880d681SAndroid Build Coastguard Worker      Sched<[WriteShuffleLd, ReadAfterLd]>;
183*9880d681SAndroid Build Coastguard Worker}
184*9880d681SAndroid Build Coastguard Worker
185*9880d681SAndroid Build Coastguard Workermulticlass sse12_cvt_pint<bits<8> opc, RegisterClass SrcRC, RegisterClass DstRC,
186*9880d681SAndroid Build Coastguard Worker                         Intrinsic Int, X86MemOperand x86memop, PatFrag ld_frag,
187*9880d681SAndroid Build Coastguard Worker                         string asm, OpndItins itins, Domain d> {
188*9880d681SAndroid Build Coastguard Worker  def irr : MMXPI<opc, MRMSrcReg, (outs DstRC:$dst), (ins SrcRC:$src), asm,
189*9880d681SAndroid Build Coastguard Worker                  [(set DstRC:$dst, (Int SrcRC:$src))], itins.rr, d>,
190*9880d681SAndroid Build Coastguard Worker            Sched<[itins.Sched]>;
191*9880d681SAndroid Build Coastguard Worker  def irm : MMXPI<opc, MRMSrcMem, (outs DstRC:$dst), (ins x86memop:$src), asm,
192*9880d681SAndroid Build Coastguard Worker                  [(set DstRC:$dst, (Int (ld_frag addr:$src)))], itins.rm, d>,
193*9880d681SAndroid Build Coastguard Worker            Sched<[itins.Sched.Folded]>;
194*9880d681SAndroid Build Coastguard Worker}
195*9880d681SAndroid Build Coastguard Worker
196*9880d681SAndroid Build Coastguard Workermulticlass sse12_cvt_pint_3addr<bits<8> opc, RegisterClass SrcRC,
197*9880d681SAndroid Build Coastguard Worker                    RegisterClass DstRC, Intrinsic Int, X86MemOperand x86memop,
198*9880d681SAndroid Build Coastguard Worker                    PatFrag ld_frag, string asm, Domain d> {
199*9880d681SAndroid Build Coastguard Worker  def irr : MMXPI<opc, MRMSrcReg, (outs DstRC:$dst),
200*9880d681SAndroid Build Coastguard Worker                  (ins DstRC:$src1, SrcRC:$src2), asm,
201*9880d681SAndroid Build Coastguard Worker                  [(set DstRC:$dst, (Int DstRC:$src1, SrcRC:$src2))],
202*9880d681SAndroid Build Coastguard Worker                  NoItinerary, d>, Sched<[WriteCvtI2F]>;
203*9880d681SAndroid Build Coastguard Worker  def irm : MMXPI<opc, MRMSrcMem, (outs DstRC:$dst),
204*9880d681SAndroid Build Coastguard Worker                  (ins DstRC:$src1, x86memop:$src2), asm,
205*9880d681SAndroid Build Coastguard Worker                  [(set DstRC:$dst, (Int DstRC:$src1, (ld_frag addr:$src2)))],
206*9880d681SAndroid Build Coastguard Worker                  NoItinerary, d>, Sched<[WriteCvtI2FLd]>;
207*9880d681SAndroid Build Coastguard Worker}
208*9880d681SAndroid Build Coastguard Worker
209*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
210*9880d681SAndroid Build Coastguard Worker// MMX EMMS Instruction
211*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
212*9880d681SAndroid Build Coastguard Worker
213*9880d681SAndroid Build Coastguard Workerdef MMX_EMMS  : MMXI<0x77, RawFrm, (outs), (ins), "emms",
214*9880d681SAndroid Build Coastguard Worker                     [(int_x86_mmx_emms)], IIC_MMX_EMMS>;
215*9880d681SAndroid Build Coastguard Worker
216*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
217*9880d681SAndroid Build Coastguard Worker// MMX Scalar Instructions
218*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
219*9880d681SAndroid Build Coastguard Worker
220*9880d681SAndroid Build Coastguard Worker// Data Transfer Instructions
221*9880d681SAndroid Build Coastguard Workerdef MMX_MOVD64rr : MMXI<0x6E, MRMSrcReg, (outs VR64:$dst), (ins GR32:$src),
222*9880d681SAndroid Build Coastguard Worker                        "movd\t{$src, $dst|$dst, $src}",
223*9880d681SAndroid Build Coastguard Worker                        [(set VR64:$dst,
224*9880d681SAndroid Build Coastguard Worker                         (x86mmx (scalar_to_vector GR32:$src)))],
225*9880d681SAndroid Build Coastguard Worker                        IIC_MMX_MOV_MM_RM>, Sched<[WriteMove]>;
226*9880d681SAndroid Build Coastguard Workerdef MMX_MOVD64rm : MMXI<0x6E, MRMSrcMem, (outs VR64:$dst), (ins i32mem:$src),
227*9880d681SAndroid Build Coastguard Worker                        "movd\t{$src, $dst|$dst, $src}",
228*9880d681SAndroid Build Coastguard Worker                        [(set VR64:$dst,
229*9880d681SAndroid Build Coastguard Worker                        (x86mmx (scalar_to_vector (loadi32 addr:$src))))],
230*9880d681SAndroid Build Coastguard Worker                        IIC_MMX_MOV_MM_RM>, Sched<[WriteLoad]>;
231*9880d681SAndroid Build Coastguard Worker
232*9880d681SAndroid Build Coastguard Workerlet Predicates = [HasMMX] in {
233*9880d681SAndroid Build Coastguard Worker  let AddedComplexity = 15 in
234*9880d681SAndroid Build Coastguard Worker    def : Pat<(x86mmx (MMX_X86movw2d GR32:$src)),
235*9880d681SAndroid Build Coastguard Worker              (MMX_MOVD64rr GR32:$src)>;
236*9880d681SAndroid Build Coastguard Worker  let AddedComplexity = 20 in
237*9880d681SAndroid Build Coastguard Worker    def : Pat<(x86mmx (MMX_X86movw2d (loadi32 addr:$src))),
238*9880d681SAndroid Build Coastguard Worker              (MMX_MOVD64rm addr:$src)>;
239*9880d681SAndroid Build Coastguard Worker}
240*9880d681SAndroid Build Coastguard Worker
241*9880d681SAndroid Build Coastguard Workerlet mayStore = 1 in
242*9880d681SAndroid Build Coastguard Workerdef MMX_MOVD64mr : MMXI<0x7E, MRMDestMem, (outs), (ins i32mem:$dst, VR64:$src),
243*9880d681SAndroid Build Coastguard Worker                        "movd\t{$src, $dst|$dst, $src}", [], IIC_MMX_MOV_MM_RM>,
244*9880d681SAndroid Build Coastguard Worker                   Sched<[WriteStore]>;
245*9880d681SAndroid Build Coastguard Worker
246*9880d681SAndroid Build Coastguard Workerdef MMX_MOVD64grr : MMXI<0x7E, MRMDestReg, (outs GR32:$dst), (ins VR64:$src),
247*9880d681SAndroid Build Coastguard Worker                         "movd\t{$src, $dst|$dst, $src}",
248*9880d681SAndroid Build Coastguard Worker                         [(set GR32:$dst,
249*9880d681SAndroid Build Coastguard Worker                          (MMX_X86movd2w (x86mmx VR64:$src)))],
250*9880d681SAndroid Build Coastguard Worker                          IIC_MMX_MOV_REG_MM>, Sched<[WriteMove]>;
251*9880d681SAndroid Build Coastguard Worker
252*9880d681SAndroid Build Coastguard Workerlet isBitcast = 1 in
253*9880d681SAndroid Build Coastguard Workerdef MMX_MOVD64to64rr : MMXRI<0x6E, MRMSrcReg, (outs VR64:$dst), (ins GR64:$src),
254*9880d681SAndroid Build Coastguard Worker                             "movd\t{$src, $dst|$dst, $src}",
255*9880d681SAndroid Build Coastguard Worker                             [(set VR64:$dst, (bitconvert GR64:$src))],
256*9880d681SAndroid Build Coastguard Worker                             IIC_MMX_MOV_MM_RM>, Sched<[WriteMove]>;
257*9880d681SAndroid Build Coastguard Worker
258*9880d681SAndroid Build Coastguard Workerlet isCodeGenOnly = 1, ForceDisassemble = 1, hasSideEffects = 0, mayLoad = 1 in
259*9880d681SAndroid Build Coastguard Workerdef MMX_MOVD64to64rm : MMXRI<0x6E, MRMSrcMem, (outs VR64:$dst),
260*9880d681SAndroid Build Coastguard Worker                             (ins i64mem:$src), "movd\t{$src, $dst|$dst, $src}",
261*9880d681SAndroid Build Coastguard Worker                             [], IIC_MMX_MOVQ_RM>, Sched<[WriteLoad]>;
262*9880d681SAndroid Build Coastguard Worker
263*9880d681SAndroid Build Coastguard Worker// These are 64 bit moves, but since the OS X assembler doesn't
264*9880d681SAndroid Build Coastguard Worker// recognize a register-register movq, we write them as
265*9880d681SAndroid Build Coastguard Worker// movd.
266*9880d681SAndroid Build Coastguard Workerlet SchedRW = [WriteMove], isBitcast = 1 in {
267*9880d681SAndroid Build Coastguard Workerdef MMX_MOVD64from64rr : MMXRI<0x7E, MRMDestReg,
268*9880d681SAndroid Build Coastguard Worker                               (outs GR64:$dst), (ins VR64:$src),
269*9880d681SAndroid Build Coastguard Worker                               "movd\t{$src, $dst|$dst, $src}",
270*9880d681SAndroid Build Coastguard Worker                             [(set GR64:$dst,
271*9880d681SAndroid Build Coastguard Worker                              (bitconvert VR64:$src))], IIC_MMX_MOV_REG_MM>;
272*9880d681SAndroid Build Coastguard Workerlet hasSideEffects = 0 in
273*9880d681SAndroid Build Coastguard Workerdef MMX_MOVQ64rr : MMXI<0x6F, MRMSrcReg, (outs VR64:$dst), (ins VR64:$src),
274*9880d681SAndroid Build Coastguard Worker                        "movq\t{$src, $dst|$dst, $src}", [],
275*9880d681SAndroid Build Coastguard Worker                        IIC_MMX_MOVQ_RR>;
276*9880d681SAndroid Build Coastguard Workerlet isCodeGenOnly = 1, ForceDisassemble = 1, hasSideEffects = 0 in {
277*9880d681SAndroid Build Coastguard Workerdef MMX_MOVQ64rr_REV : MMXI<0x7F, MRMDestReg, (outs VR64:$dst), (ins VR64:$src),
278*9880d681SAndroid Build Coastguard Worker                        "movq\t{$src, $dst|$dst, $src}", [],
279*9880d681SAndroid Build Coastguard Worker                        IIC_MMX_MOVQ_RR>;
280*9880d681SAndroid Build Coastguard Worker}
281*9880d681SAndroid Build Coastguard Worker} // SchedRW
282*9880d681SAndroid Build Coastguard Worker
283*9880d681SAndroid Build Coastguard Workerlet isCodeGenOnly = 1, ForceDisassemble = 1, hasSideEffects = 0, mayStore = 1 in
284*9880d681SAndroid Build Coastguard Workerdef MMX_MOVD64from64rm : MMXRI<0x7E, MRMDestMem,
285*9880d681SAndroid Build Coastguard Worker                               (outs), (ins i64mem:$dst, VR64:$src),
286*9880d681SAndroid Build Coastguard Worker                               "movd\t{$src, $dst|$dst, $src}",
287*9880d681SAndroid Build Coastguard Worker                               [], IIC_MMX_MOV_REG_MM>, Sched<[WriteStore]>;
288*9880d681SAndroid Build Coastguard Worker
289*9880d681SAndroid Build Coastguard Workerlet SchedRW = [WriteLoad] in {
290*9880d681SAndroid Build Coastguard Workerlet canFoldAsLoad = 1 in
291*9880d681SAndroid Build Coastguard Workerdef MMX_MOVQ64rm : MMXI<0x6F, MRMSrcMem, (outs VR64:$dst), (ins i64mem:$src),
292*9880d681SAndroid Build Coastguard Worker                        "movq\t{$src, $dst|$dst, $src}",
293*9880d681SAndroid Build Coastguard Worker                        [(set VR64:$dst, (load_mmx addr:$src))],
294*9880d681SAndroid Build Coastguard Worker                        IIC_MMX_MOVQ_RM>;
295*9880d681SAndroid Build Coastguard Worker} // SchedRW
296*9880d681SAndroid Build Coastguard Workerlet SchedRW = [WriteStore] in
297*9880d681SAndroid Build Coastguard Workerdef MMX_MOVQ64mr : MMXI<0x7F, MRMDestMem, (outs), (ins i64mem:$dst, VR64:$src),
298*9880d681SAndroid Build Coastguard Worker                        "movq\t{$src, $dst|$dst, $src}",
299*9880d681SAndroid Build Coastguard Worker                        [(store (x86mmx VR64:$src), addr:$dst)],
300*9880d681SAndroid Build Coastguard Worker                        IIC_MMX_MOVQ_RM>;
301*9880d681SAndroid Build Coastguard Worker
302*9880d681SAndroid Build Coastguard Workerlet SchedRW = [WriteMove] in {
303*9880d681SAndroid Build Coastguard Workerdef MMX_MOVDQ2Qrr : MMXSDIi8<0xD6, MRMSrcReg, (outs VR64:$dst),
304*9880d681SAndroid Build Coastguard Worker                             (ins VR128:$src), "movdq2q\t{$src, $dst|$dst, $src}",
305*9880d681SAndroid Build Coastguard Worker                             [(set VR64:$dst,
306*9880d681SAndroid Build Coastguard Worker                               (x86mmx (bitconvert
307*9880d681SAndroid Build Coastguard Worker                               (i64 (extractelt (v2i64 VR128:$src),
308*9880d681SAndroid Build Coastguard Worker                                     (iPTR 0))))))],
309*9880d681SAndroid Build Coastguard Worker                             IIC_MMX_MOVQ_RR>;
310*9880d681SAndroid Build Coastguard Worker
311*9880d681SAndroid Build Coastguard Workerdef MMX_MOVQ2DQrr : MMXS2SIi8<0xD6, MRMSrcReg, (outs VR128:$dst),
312*9880d681SAndroid Build Coastguard Worker                              (ins VR64:$src), "movq2dq\t{$src, $dst|$dst, $src}",
313*9880d681SAndroid Build Coastguard Worker                              [(set VR128:$dst,
314*9880d681SAndroid Build Coastguard Worker                                (v2i64
315*9880d681SAndroid Build Coastguard Worker                                  (scalar_to_vector
316*9880d681SAndroid Build Coastguard Worker                                    (i64 (bitconvert (x86mmx VR64:$src))))))],
317*9880d681SAndroid Build Coastguard Worker                              IIC_MMX_MOVQ_RR>;
318*9880d681SAndroid Build Coastguard Worker
319*9880d681SAndroid Build Coastguard Workerlet isCodeGenOnly = 1, hasSideEffects = 1 in {
320*9880d681SAndroid Build Coastguard Workerdef MMX_MOVQ2FR64rr: MMXS2SIi8<0xD6, MRMSrcReg, (outs FR64:$dst),
321*9880d681SAndroid Build Coastguard Worker                               (ins VR64:$src), "movq2dq\t{$src, $dst|$dst, $src}",
322*9880d681SAndroid Build Coastguard Worker                               [], IIC_MMX_MOVQ_RR>;
323*9880d681SAndroid Build Coastguard Worker
324*9880d681SAndroid Build Coastguard Workerdef MMX_MOVFR642Qrr: MMXSDIi8<0xD6, MRMSrcReg, (outs VR64:$dst),
325*9880d681SAndroid Build Coastguard Worker                              (ins FR64:$src), "movdq2q\t{$src, $dst|$dst, $src}",
326*9880d681SAndroid Build Coastguard Worker                              [], IIC_MMX_MOVQ_RR>;
327*9880d681SAndroid Build Coastguard Worker}
328*9880d681SAndroid Build Coastguard Worker} // SchedRW
329*9880d681SAndroid Build Coastguard Worker
330*9880d681SAndroid Build Coastguard Workerlet Predicates = [HasSSE1] in
331*9880d681SAndroid Build Coastguard Workerdef MMX_MOVNTQmr  : MMXI<0xE7, MRMDestMem, (outs), (ins i64mem:$dst, VR64:$src),
332*9880d681SAndroid Build Coastguard Worker                         "movntq\t{$src, $dst|$dst, $src}",
333*9880d681SAndroid Build Coastguard Worker                         [(int_x86_mmx_movnt_dq addr:$dst, VR64:$src)],
334*9880d681SAndroid Build Coastguard Worker                         IIC_MMX_MOVQ_RM>, Sched<[WriteStore]>;
335*9880d681SAndroid Build Coastguard Worker
336*9880d681SAndroid Build Coastguard Workerlet Predicates = [HasMMX] in {
337*9880d681SAndroid Build Coastguard Worker  let AddedComplexity = 15 in
338*9880d681SAndroid Build Coastguard Worker  // movd to MMX register zero-extends
339*9880d681SAndroid Build Coastguard Worker  def : Pat<(x86mmx (X86vzmovl (x86mmx (scalar_to_vector GR32:$src)))),
340*9880d681SAndroid Build Coastguard Worker            (MMX_MOVD64rr GR32:$src)>;
341*9880d681SAndroid Build Coastguard Worker  let AddedComplexity = 20 in
342*9880d681SAndroid Build Coastguard Worker  def : Pat<(x86mmx (X86vzmovl (x86mmx (scalar_to_vector (loadi32 addr:$src))))),
343*9880d681SAndroid Build Coastguard Worker            (MMX_MOVD64rm addr:$src)>;
344*9880d681SAndroid Build Coastguard Worker}
345*9880d681SAndroid Build Coastguard Worker
346*9880d681SAndroid Build Coastguard Worker// Arithmetic Instructions
347*9880d681SAndroid Build Coastguard Workerdefm MMX_PABSB : SS3I_unop_rm_int_mm<0x1C, "pabsb", int_x86_ssse3_pabs_b,
348*9880d681SAndroid Build Coastguard Worker                                     MMX_INTALU_ITINS>;
349*9880d681SAndroid Build Coastguard Workerdefm MMX_PABSW : SS3I_unop_rm_int_mm<0x1D, "pabsw", int_x86_ssse3_pabs_w,
350*9880d681SAndroid Build Coastguard Worker                                     MMX_INTALU_ITINS>;
351*9880d681SAndroid Build Coastguard Workerdefm MMX_PABSD : SS3I_unop_rm_int_mm<0x1E, "pabsd", int_x86_ssse3_pabs_d,
352*9880d681SAndroid Build Coastguard Worker                                     MMX_INTALU_ITINS>;
353*9880d681SAndroid Build Coastguard Worker// -- Addition
354*9880d681SAndroid Build Coastguard Workerdefm MMX_PADDB : MMXI_binop_rm_int<0xFC, "paddb", int_x86_mmx_padd_b,
355*9880d681SAndroid Build Coastguard Worker                                   MMX_INTALU_ITINS, 1>;
356*9880d681SAndroid Build Coastguard Workerdefm MMX_PADDW : MMXI_binop_rm_int<0xFD, "paddw", int_x86_mmx_padd_w,
357*9880d681SAndroid Build Coastguard Worker                                   MMX_INTALU_ITINS, 1>;
358*9880d681SAndroid Build Coastguard Workerdefm MMX_PADDD : MMXI_binop_rm_int<0xFE, "paddd", int_x86_mmx_padd_d,
359*9880d681SAndroid Build Coastguard Worker                                   MMX_INTALU_ITINS, 1>;
360*9880d681SAndroid Build Coastguard Workerlet Predicates = [HasSSE2] in
361*9880d681SAndroid Build Coastguard Workerdefm MMX_PADDQ : MMXI_binop_rm_int<0xD4, "paddq", int_x86_mmx_padd_q,
362*9880d681SAndroid Build Coastguard Worker                                   MMX_INTALUQ_ITINS, 1>;
363*9880d681SAndroid Build Coastguard Workerdefm MMX_PADDSB  : MMXI_binop_rm_int<0xEC, "paddsb" , int_x86_mmx_padds_b,
364*9880d681SAndroid Build Coastguard Worker                                   MMX_INTALU_ITINS, 1>;
365*9880d681SAndroid Build Coastguard Workerdefm MMX_PADDSW  : MMXI_binop_rm_int<0xED, "paddsw" , int_x86_mmx_padds_w,
366*9880d681SAndroid Build Coastguard Worker                                   MMX_INTALU_ITINS, 1>;
367*9880d681SAndroid Build Coastguard Worker
368*9880d681SAndroid Build Coastguard Workerdefm MMX_PADDUSB : MMXI_binop_rm_int<0xDC, "paddusb", int_x86_mmx_paddus_b,
369*9880d681SAndroid Build Coastguard Worker                                   MMX_INTALU_ITINS, 1>;
370*9880d681SAndroid Build Coastguard Workerdefm MMX_PADDUSW : MMXI_binop_rm_int<0xDD, "paddusw", int_x86_mmx_paddus_w,
371*9880d681SAndroid Build Coastguard Worker                                   MMX_INTALU_ITINS, 1>;
372*9880d681SAndroid Build Coastguard Worker
373*9880d681SAndroid Build Coastguard Workerdefm MMX_PHADDW  : SS3I_binop_rm_int_mm<0x01, "phaddw", int_x86_ssse3_phadd_w,
374*9880d681SAndroid Build Coastguard Worker                                   MMX_PHADDSUBW>;
375*9880d681SAndroid Build Coastguard Workerdefm MMX_PHADD   : SS3I_binop_rm_int_mm<0x02, "phaddd", int_x86_ssse3_phadd_d,
376*9880d681SAndroid Build Coastguard Worker                                   MMX_PHADDSUBD>;
377*9880d681SAndroid Build Coastguard Workerdefm MMX_PHADDSW : SS3I_binop_rm_int_mm<0x03, "phaddsw",int_x86_ssse3_phadd_sw,
378*9880d681SAndroid Build Coastguard Worker                                   MMX_PHADDSUBW>;
379*9880d681SAndroid Build Coastguard Worker
380*9880d681SAndroid Build Coastguard Worker
381*9880d681SAndroid Build Coastguard Worker// -- Subtraction
382*9880d681SAndroid Build Coastguard Workerdefm MMX_PSUBB : MMXI_binop_rm_int<0xF8, "psubb", int_x86_mmx_psub_b,
383*9880d681SAndroid Build Coastguard Worker                                   MMX_INTALU_ITINS>;
384*9880d681SAndroid Build Coastguard Workerdefm MMX_PSUBW : MMXI_binop_rm_int<0xF9, "psubw", int_x86_mmx_psub_w,
385*9880d681SAndroid Build Coastguard Worker                                   MMX_INTALU_ITINS>;
386*9880d681SAndroid Build Coastguard Workerdefm MMX_PSUBD : MMXI_binop_rm_int<0xFA, "psubd", int_x86_mmx_psub_d,
387*9880d681SAndroid Build Coastguard Worker                                   MMX_INTALU_ITINS>;
388*9880d681SAndroid Build Coastguard Workerlet Predicates = [HasSSE2] in
389*9880d681SAndroid Build Coastguard Workerdefm MMX_PSUBQ : MMXI_binop_rm_int<0xFB, "psubq", int_x86_mmx_psub_q,
390*9880d681SAndroid Build Coastguard Worker                                   MMX_INTALUQ_ITINS>;
391*9880d681SAndroid Build Coastguard Worker
392*9880d681SAndroid Build Coastguard Workerdefm MMX_PSUBSB  : MMXI_binop_rm_int<0xE8, "psubsb" , int_x86_mmx_psubs_b,
393*9880d681SAndroid Build Coastguard Worker                                   MMX_INTALU_ITINS>;
394*9880d681SAndroid Build Coastguard Workerdefm MMX_PSUBSW  : MMXI_binop_rm_int<0xE9, "psubsw" , int_x86_mmx_psubs_w,
395*9880d681SAndroid Build Coastguard Worker                                   MMX_INTALU_ITINS>;
396*9880d681SAndroid Build Coastguard Worker
397*9880d681SAndroid Build Coastguard Workerdefm MMX_PSUBUSB : MMXI_binop_rm_int<0xD8, "psubusb", int_x86_mmx_psubus_b,
398*9880d681SAndroid Build Coastguard Worker                                   MMX_INTALU_ITINS>;
399*9880d681SAndroid Build Coastguard Workerdefm MMX_PSUBUSW : MMXI_binop_rm_int<0xD9, "psubusw", int_x86_mmx_psubus_w,
400*9880d681SAndroid Build Coastguard Worker                                   MMX_INTALU_ITINS>;
401*9880d681SAndroid Build Coastguard Worker
402*9880d681SAndroid Build Coastguard Workerdefm MMX_PHSUBW  : SS3I_binop_rm_int_mm<0x05, "phsubw", int_x86_ssse3_phsub_w,
403*9880d681SAndroid Build Coastguard Worker                                   MMX_PHADDSUBW>;
404*9880d681SAndroid Build Coastguard Workerdefm MMX_PHSUBD  : SS3I_binop_rm_int_mm<0x06, "phsubd", int_x86_ssse3_phsub_d,
405*9880d681SAndroid Build Coastguard Worker                                   MMX_PHADDSUBD>;
406*9880d681SAndroid Build Coastguard Workerdefm MMX_PHSUBSW : SS3I_binop_rm_int_mm<0x07, "phsubsw",int_x86_ssse3_phsub_sw,
407*9880d681SAndroid Build Coastguard Worker                                   MMX_PHADDSUBW>;
408*9880d681SAndroid Build Coastguard Worker
409*9880d681SAndroid Build Coastguard Worker// -- Multiplication
410*9880d681SAndroid Build Coastguard Workerdefm MMX_PMULLW  : MMXI_binop_rm_int<0xD5, "pmullw", int_x86_mmx_pmull_w,
411*9880d681SAndroid Build Coastguard Worker                                     MMX_PMUL_ITINS, 1>;
412*9880d681SAndroid Build Coastguard Worker
413*9880d681SAndroid Build Coastguard Workerdefm MMX_PMULHW  : MMXI_binop_rm_int<0xE5, "pmulhw",  int_x86_mmx_pmulh_w,
414*9880d681SAndroid Build Coastguard Worker                                     MMX_PMUL_ITINS, 1>;
415*9880d681SAndroid Build Coastguard Workerlet Predicates = [HasSSE1] in
416*9880d681SAndroid Build Coastguard Workerdefm MMX_PMULHUW : MMXI_binop_rm_int<0xE4, "pmulhuw", int_x86_mmx_pmulhu_w,
417*9880d681SAndroid Build Coastguard Worker                                     MMX_PMUL_ITINS, 1>;
418*9880d681SAndroid Build Coastguard Workerlet Predicates = [HasSSE2] in
419*9880d681SAndroid Build Coastguard Workerdefm MMX_PMULUDQ : MMXI_binop_rm_int<0xF4, "pmuludq", int_x86_mmx_pmulu_dq,
420*9880d681SAndroid Build Coastguard Worker                                     MMX_PMUL_ITINS, 1>;
421*9880d681SAndroid Build Coastguard Workerlet isCommutable = 1 in
422*9880d681SAndroid Build Coastguard Workerdefm MMX_PMULHRSW : SS3I_binop_rm_int_mm<0x0B, "pmulhrsw",
423*9880d681SAndroid Build Coastguard Worker                                     int_x86_ssse3_pmul_hr_sw, MMX_PMUL_ITINS>;
424*9880d681SAndroid Build Coastguard Worker
425*9880d681SAndroid Build Coastguard Worker// -- Miscellanea
426*9880d681SAndroid Build Coastguard Workerdefm MMX_PMADDWD : MMXI_binop_rm_int<0xF5, "pmaddwd", int_x86_mmx_pmadd_wd,
427*9880d681SAndroid Build Coastguard Worker                                     MMX_PMUL_ITINS, 1>;
428*9880d681SAndroid Build Coastguard Worker
429*9880d681SAndroid Build Coastguard Workerdefm MMX_PMADDUBSW : SS3I_binop_rm_int_mm<0x04, "pmaddubsw",
430*9880d681SAndroid Build Coastguard Worker                                     int_x86_ssse3_pmadd_ub_sw, MMX_PMUL_ITINS>;
431*9880d681SAndroid Build Coastguard Workerlet Predicates = [HasSSE1] in {
432*9880d681SAndroid Build Coastguard Workerdefm MMX_PAVGB   : MMXI_binop_rm_int<0xE0, "pavgb", int_x86_mmx_pavg_b,
433*9880d681SAndroid Build Coastguard Worker                                     MMX_MISC_FUNC_ITINS, 1>;
434*9880d681SAndroid Build Coastguard Workerdefm MMX_PAVGW   : MMXI_binop_rm_int<0xE3, "pavgw", int_x86_mmx_pavg_w,
435*9880d681SAndroid Build Coastguard Worker                                     MMX_MISC_FUNC_ITINS, 1>;
436*9880d681SAndroid Build Coastguard Worker
437*9880d681SAndroid Build Coastguard Workerdefm MMX_PMINUB  : MMXI_binop_rm_int<0xDA, "pminub", int_x86_mmx_pminu_b,
438*9880d681SAndroid Build Coastguard Worker                                     MMX_MISC_FUNC_ITINS, 1>;
439*9880d681SAndroid Build Coastguard Workerdefm MMX_PMINSW  : MMXI_binop_rm_int<0xEA, "pminsw", int_x86_mmx_pmins_w,
440*9880d681SAndroid Build Coastguard Worker                                     MMX_MISC_FUNC_ITINS, 1>;
441*9880d681SAndroid Build Coastguard Worker
442*9880d681SAndroid Build Coastguard Workerdefm MMX_PMAXUB  : MMXI_binop_rm_int<0xDE, "pmaxub", int_x86_mmx_pmaxu_b,
443*9880d681SAndroid Build Coastguard Worker                                     MMX_MISC_FUNC_ITINS, 1>;
444*9880d681SAndroid Build Coastguard Workerdefm MMX_PMAXSW  : MMXI_binop_rm_int<0xEE, "pmaxsw", int_x86_mmx_pmaxs_w,
445*9880d681SAndroid Build Coastguard Worker                                     MMX_MISC_FUNC_ITINS, 1>;
446*9880d681SAndroid Build Coastguard Worker
447*9880d681SAndroid Build Coastguard Workerdefm MMX_PSADBW  : MMXI_binop_rm_int<0xF6, "psadbw", int_x86_mmx_psad_bw,
448*9880d681SAndroid Build Coastguard Worker                                     MMX_PSADBW_ITINS, 1>;
449*9880d681SAndroid Build Coastguard Worker}
450*9880d681SAndroid Build Coastguard Worker
451*9880d681SAndroid Build Coastguard Workerdefm MMX_PSIGNB :  SS3I_binop_rm_int_mm<0x08, "psignb", int_x86_ssse3_psign_b,
452*9880d681SAndroid Build Coastguard Worker                                        MMX_MISC_FUNC_ITINS>;
453*9880d681SAndroid Build Coastguard Workerdefm MMX_PSIGNW :  SS3I_binop_rm_int_mm<0x09, "psignw", int_x86_ssse3_psign_w,
454*9880d681SAndroid Build Coastguard Worker                                        MMX_MISC_FUNC_ITINS>;
455*9880d681SAndroid Build Coastguard Workerdefm MMX_PSIGND :  SS3I_binop_rm_int_mm<0x0A, "psignd", int_x86_ssse3_psign_d,
456*9880d681SAndroid Build Coastguard Worker                                        MMX_MISC_FUNC_ITINS>;
457*9880d681SAndroid Build Coastguard Workerlet Constraints = "$src1 = $dst" in
458*9880d681SAndroid Build Coastguard Worker  defm MMX_PALIGN : ssse3_palign_mm<"palignr", int_x86_mmx_palignr_b>;
459*9880d681SAndroid Build Coastguard Worker
460*9880d681SAndroid Build Coastguard Worker// Logical Instructions
461*9880d681SAndroid Build Coastguard Workerdefm MMX_PAND : MMXI_binop_rm_int<0xDB, "pand", int_x86_mmx_pand,
462*9880d681SAndroid Build Coastguard Worker                                  MMX_INTALU_ITINS_VECLOGICSCHED, 1>;
463*9880d681SAndroid Build Coastguard Workerdefm MMX_POR  : MMXI_binop_rm_int<0xEB, "por" , int_x86_mmx_por,
464*9880d681SAndroid Build Coastguard Worker                                  MMX_INTALU_ITINS_VECLOGICSCHED, 1>;
465*9880d681SAndroid Build Coastguard Workerdefm MMX_PXOR : MMXI_binop_rm_int<0xEF, "pxor", int_x86_mmx_pxor,
466*9880d681SAndroid Build Coastguard Worker                                  MMX_INTALU_ITINS_VECLOGICSCHED, 1>;
467*9880d681SAndroid Build Coastguard Workerdefm MMX_PANDN : MMXI_binop_rm_int<0xDF, "pandn", int_x86_mmx_pandn,
468*9880d681SAndroid Build Coastguard Worker                                  MMX_INTALU_ITINS_VECLOGICSCHED>;
469*9880d681SAndroid Build Coastguard Worker
470*9880d681SAndroid Build Coastguard Worker// Shift Instructions
471*9880d681SAndroid Build Coastguard Workerdefm MMX_PSRLW : MMXI_binop_rmi_int<0xD1, 0x71, MRM2r, "psrlw",
472*9880d681SAndroid Build Coastguard Worker                                    int_x86_mmx_psrl_w, int_x86_mmx_psrli_w,
473*9880d681SAndroid Build Coastguard Worker                                    MMX_SHIFT_ITINS>;
474*9880d681SAndroid Build Coastguard Workerdefm MMX_PSRLD : MMXI_binop_rmi_int<0xD2, 0x72, MRM2r, "psrld",
475*9880d681SAndroid Build Coastguard Worker                                    int_x86_mmx_psrl_d, int_x86_mmx_psrli_d,
476*9880d681SAndroid Build Coastguard Worker                                    MMX_SHIFT_ITINS>;
477*9880d681SAndroid Build Coastguard Workerdefm MMX_PSRLQ : MMXI_binop_rmi_int<0xD3, 0x73, MRM2r, "psrlq",
478*9880d681SAndroid Build Coastguard Worker                                    int_x86_mmx_psrl_q, int_x86_mmx_psrli_q,
479*9880d681SAndroid Build Coastguard Worker                                    MMX_SHIFT_ITINS>;
480*9880d681SAndroid Build Coastguard Worker
481*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_x86_mmx_psrl_w VR64:$src1, (load_mvmmx addr:$src2)),
482*9880d681SAndroid Build Coastguard Worker          (MMX_PSRLWrm VR64:$src1, addr:$src2)>;
483*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_x86_mmx_psrl_d VR64:$src1, (load_mvmmx addr:$src2)),
484*9880d681SAndroid Build Coastguard Worker          (MMX_PSRLDrm VR64:$src1, addr:$src2)>;
485*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_x86_mmx_psrl_q VR64:$src1, (load_mvmmx addr:$src2)),
486*9880d681SAndroid Build Coastguard Worker          (MMX_PSRLQrm VR64:$src1, addr:$src2)>;
487*9880d681SAndroid Build Coastguard Worker
488*9880d681SAndroid Build Coastguard Workerdefm MMX_PSLLW : MMXI_binop_rmi_int<0xF1, 0x71, MRM6r, "psllw",
489*9880d681SAndroid Build Coastguard Worker                                    int_x86_mmx_psll_w, int_x86_mmx_pslli_w,
490*9880d681SAndroid Build Coastguard Worker                                    MMX_SHIFT_ITINS>;
491*9880d681SAndroid Build Coastguard Workerdefm MMX_PSLLD : MMXI_binop_rmi_int<0xF2, 0x72, MRM6r, "pslld",
492*9880d681SAndroid Build Coastguard Worker                                    int_x86_mmx_psll_d, int_x86_mmx_pslli_d,
493*9880d681SAndroid Build Coastguard Worker                                    MMX_SHIFT_ITINS>;
494*9880d681SAndroid Build Coastguard Workerdefm MMX_PSLLQ : MMXI_binop_rmi_int<0xF3, 0x73, MRM6r, "psllq",
495*9880d681SAndroid Build Coastguard Worker                                    int_x86_mmx_psll_q, int_x86_mmx_pslli_q,
496*9880d681SAndroid Build Coastguard Worker                                    MMX_SHIFT_ITINS>;
497*9880d681SAndroid Build Coastguard Worker
498*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_x86_mmx_psll_w VR64:$src1, (load_mvmmx addr:$src2)),
499*9880d681SAndroid Build Coastguard Worker          (MMX_PSLLWrm VR64:$src1, addr:$src2)>;
500*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_x86_mmx_psll_d VR64:$src1, (load_mvmmx addr:$src2)),
501*9880d681SAndroid Build Coastguard Worker          (MMX_PSLLDrm VR64:$src1, addr:$src2)>;
502*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_x86_mmx_psll_q VR64:$src1, (load_mvmmx addr:$src2)),
503*9880d681SAndroid Build Coastguard Worker          (MMX_PSLLQrm VR64:$src1, addr:$src2)>;
504*9880d681SAndroid Build Coastguard Worker
505*9880d681SAndroid Build Coastguard Workerdefm MMX_PSRAW : MMXI_binop_rmi_int<0xE1, 0x71, MRM4r, "psraw",
506*9880d681SAndroid Build Coastguard Worker                                    int_x86_mmx_psra_w, int_x86_mmx_psrai_w,
507*9880d681SAndroid Build Coastguard Worker                                    MMX_SHIFT_ITINS>;
508*9880d681SAndroid Build Coastguard Workerdefm MMX_PSRAD : MMXI_binop_rmi_int<0xE2, 0x72, MRM4r, "psrad",
509*9880d681SAndroid Build Coastguard Worker                                    int_x86_mmx_psra_d, int_x86_mmx_psrai_d,
510*9880d681SAndroid Build Coastguard Worker                                    MMX_SHIFT_ITINS>;
511*9880d681SAndroid Build Coastguard Worker
512*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_x86_mmx_psra_w VR64:$src1, (load_mvmmx addr:$src2)),
513*9880d681SAndroid Build Coastguard Worker          (MMX_PSRAWrm VR64:$src1, addr:$src2)>;
514*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_x86_mmx_psra_d VR64:$src1, (load_mvmmx addr:$src2)),
515*9880d681SAndroid Build Coastguard Worker          (MMX_PSRADrm VR64:$src1, addr:$src2)>;
516*9880d681SAndroid Build Coastguard Worker
517*9880d681SAndroid Build Coastguard Worker// Comparison Instructions
518*9880d681SAndroid Build Coastguard Workerdefm MMX_PCMPEQB : MMXI_binop_rm_int<0x74, "pcmpeqb", int_x86_mmx_pcmpeq_b,
519*9880d681SAndroid Build Coastguard Worker                                     MMX_INTALU_ITINS>;
520*9880d681SAndroid Build Coastguard Workerdefm MMX_PCMPEQW : MMXI_binop_rm_int<0x75, "pcmpeqw", int_x86_mmx_pcmpeq_w,
521*9880d681SAndroid Build Coastguard Worker                                     MMX_INTALU_ITINS>;
522*9880d681SAndroid Build Coastguard Workerdefm MMX_PCMPEQD : MMXI_binop_rm_int<0x76, "pcmpeqd", int_x86_mmx_pcmpeq_d,
523*9880d681SAndroid Build Coastguard Worker                                     MMX_INTALU_ITINS>;
524*9880d681SAndroid Build Coastguard Worker
525*9880d681SAndroid Build Coastguard Workerdefm MMX_PCMPGTB : MMXI_binop_rm_int<0x64, "pcmpgtb", int_x86_mmx_pcmpgt_b,
526*9880d681SAndroid Build Coastguard Worker                                     MMX_INTALU_ITINS>;
527*9880d681SAndroid Build Coastguard Workerdefm MMX_PCMPGTW : MMXI_binop_rm_int<0x65, "pcmpgtw", int_x86_mmx_pcmpgt_w,
528*9880d681SAndroid Build Coastguard Worker                                     MMX_INTALU_ITINS>;
529*9880d681SAndroid Build Coastguard Workerdefm MMX_PCMPGTD : MMXI_binop_rm_int<0x66, "pcmpgtd", int_x86_mmx_pcmpgt_d,
530*9880d681SAndroid Build Coastguard Worker                                     MMX_INTALU_ITINS>;
531*9880d681SAndroid Build Coastguard Worker
532*9880d681SAndroid Build Coastguard Worker// -- Unpack Instructions
533*9880d681SAndroid Build Coastguard Workerdefm MMX_PUNPCKHBW : MMXI_binop_rm_int<0x68, "punpckhbw",
534*9880d681SAndroid Build Coastguard Worker                                       int_x86_mmx_punpckhbw,
535*9880d681SAndroid Build Coastguard Worker                                       MMX_UNPCK_H_ITINS>;
536*9880d681SAndroid Build Coastguard Workerdefm MMX_PUNPCKHWD : MMXI_binop_rm_int<0x69, "punpckhwd",
537*9880d681SAndroid Build Coastguard Worker                                       int_x86_mmx_punpckhwd,
538*9880d681SAndroid Build Coastguard Worker                                       MMX_UNPCK_H_ITINS>;
539*9880d681SAndroid Build Coastguard Workerdefm MMX_PUNPCKHDQ : MMXI_binop_rm_int<0x6A, "punpckhdq",
540*9880d681SAndroid Build Coastguard Worker                                       int_x86_mmx_punpckhdq,
541*9880d681SAndroid Build Coastguard Worker                                       MMX_UNPCK_H_ITINS>;
542*9880d681SAndroid Build Coastguard Workerdefm MMX_PUNPCKLBW : MMXI_binop_rm_int<0x60, "punpcklbw",
543*9880d681SAndroid Build Coastguard Worker                                       int_x86_mmx_punpcklbw,
544*9880d681SAndroid Build Coastguard Worker                                       MMX_UNPCK_L_ITINS>;
545*9880d681SAndroid Build Coastguard Workerdefm MMX_PUNPCKLWD : MMXI_binop_rm_int<0x61, "punpcklwd",
546*9880d681SAndroid Build Coastguard Worker                                       int_x86_mmx_punpcklwd,
547*9880d681SAndroid Build Coastguard Worker                                       MMX_UNPCK_L_ITINS>;
548*9880d681SAndroid Build Coastguard Workerdefm MMX_PUNPCKLDQ : MMXI_binop_rm_int<0x62, "punpckldq",
549*9880d681SAndroid Build Coastguard Worker                                       int_x86_mmx_punpckldq,
550*9880d681SAndroid Build Coastguard Worker                                       MMX_UNPCK_L_ITINS>;
551*9880d681SAndroid Build Coastguard Worker
552*9880d681SAndroid Build Coastguard Worker// -- Pack Instructions
553*9880d681SAndroid Build Coastguard Workerdefm MMX_PACKSSWB : MMXI_binop_rm_int<0x63, "packsswb", int_x86_mmx_packsswb,
554*9880d681SAndroid Build Coastguard Worker                                      MMX_PCK_ITINS>;
555*9880d681SAndroid Build Coastguard Workerdefm MMX_PACKSSDW : MMXI_binop_rm_int<0x6B, "packssdw", int_x86_mmx_packssdw,
556*9880d681SAndroid Build Coastguard Worker                                      MMX_PCK_ITINS>;
557*9880d681SAndroid Build Coastguard Workerdefm MMX_PACKUSWB : MMXI_binop_rm_int<0x67, "packuswb", int_x86_mmx_packuswb,
558*9880d681SAndroid Build Coastguard Worker                                      MMX_PCK_ITINS>;
559*9880d681SAndroid Build Coastguard Worker
560*9880d681SAndroid Build Coastguard Worker// -- Shuffle Instructions
561*9880d681SAndroid Build Coastguard Workerdefm MMX_PSHUFB : SS3I_binop_rm_int_mm<0x00, "pshufb", int_x86_ssse3_pshuf_b,
562*9880d681SAndroid Build Coastguard Worker                                       MMX_PSHUF_ITINS>;
563*9880d681SAndroid Build Coastguard Worker
564*9880d681SAndroid Build Coastguard Workerdef MMX_PSHUFWri : MMXIi8<0x70, MRMSrcReg,
565*9880d681SAndroid Build Coastguard Worker                          (outs VR64:$dst), (ins VR64:$src1, u8imm:$src2),
566*9880d681SAndroid Build Coastguard Worker                          "pshufw\t{$src2, $src1, $dst|$dst, $src1, $src2}",
567*9880d681SAndroid Build Coastguard Worker                          [(set VR64:$dst,
568*9880d681SAndroid Build Coastguard Worker                             (int_x86_sse_pshuf_w VR64:$src1, imm:$src2))],
569*9880d681SAndroid Build Coastguard Worker                          IIC_MMX_PSHUF>, Sched<[WriteShuffle]>;
570*9880d681SAndroid Build Coastguard Workerdef MMX_PSHUFWmi : MMXIi8<0x70, MRMSrcMem,
571*9880d681SAndroid Build Coastguard Worker                          (outs VR64:$dst), (ins i64mem:$src1, u8imm:$src2),
572*9880d681SAndroid Build Coastguard Worker                          "pshufw\t{$src2, $src1, $dst|$dst, $src1, $src2}",
573*9880d681SAndroid Build Coastguard Worker                          [(set VR64:$dst,
574*9880d681SAndroid Build Coastguard Worker                             (int_x86_sse_pshuf_w (load_mmx addr:$src1),
575*9880d681SAndroid Build Coastguard Worker                                                   imm:$src2))],
576*9880d681SAndroid Build Coastguard Worker                          IIC_MMX_PSHUF>, Sched<[WriteShuffleLd]>;
577*9880d681SAndroid Build Coastguard Worker
578*9880d681SAndroid Build Coastguard Worker
579*9880d681SAndroid Build Coastguard Worker
580*9880d681SAndroid Build Coastguard Worker
581*9880d681SAndroid Build Coastguard Worker// -- Conversion Instructions
582*9880d681SAndroid Build Coastguard Workerdefm MMX_CVTPS2PI : sse12_cvt_pint<0x2D, VR128, VR64, int_x86_sse_cvtps2pi,
583*9880d681SAndroid Build Coastguard Worker                      f64mem, load, "cvtps2pi\t{$src, $dst|$dst, $src}",
584*9880d681SAndroid Build Coastguard Worker                      MMX_CVT_PS_ITINS, SSEPackedSingle>, PS;
585*9880d681SAndroid Build Coastguard Workerdefm MMX_CVTPD2PI : sse12_cvt_pint<0x2D, VR128, VR64, int_x86_sse_cvtpd2pi,
586*9880d681SAndroid Build Coastguard Worker                      f128mem, memop, "cvtpd2pi\t{$src, $dst|$dst, $src}",
587*9880d681SAndroid Build Coastguard Worker                      MMX_CVT_PD_ITINS, SSEPackedDouble>, PD;
588*9880d681SAndroid Build Coastguard Workerdefm MMX_CVTTPS2PI : sse12_cvt_pint<0x2C, VR128, VR64, int_x86_sse_cvttps2pi,
589*9880d681SAndroid Build Coastguard Worker                       f64mem, load, "cvttps2pi\t{$src, $dst|$dst, $src}",
590*9880d681SAndroid Build Coastguard Worker                       MMX_CVT_PS_ITINS, SSEPackedSingle>, PS;
591*9880d681SAndroid Build Coastguard Workerdefm MMX_CVTTPD2PI : sse12_cvt_pint<0x2C, VR128, VR64, int_x86_sse_cvttpd2pi,
592*9880d681SAndroid Build Coastguard Worker                       f128mem, memop, "cvttpd2pi\t{$src, $dst|$dst, $src}",
593*9880d681SAndroid Build Coastguard Worker                       MMX_CVT_PD_ITINS, SSEPackedDouble>, PD;
594*9880d681SAndroid Build Coastguard Workerdefm MMX_CVTPI2PD : sse12_cvt_pint<0x2A, VR64, VR128, int_x86_sse_cvtpi2pd,
595*9880d681SAndroid Build Coastguard Worker                         i64mem, load, "cvtpi2pd\t{$src, $dst|$dst, $src}",
596*9880d681SAndroid Build Coastguard Worker                         MMX_CVT_PD_ITINS, SSEPackedDouble>, PD;
597*9880d681SAndroid Build Coastguard Workerlet Constraints = "$src1 = $dst" in {
598*9880d681SAndroid Build Coastguard Worker  defm MMX_CVTPI2PS : sse12_cvt_pint_3addr<0x2A, VR64, VR128,
599*9880d681SAndroid Build Coastguard Worker                         int_x86_sse_cvtpi2ps,
600*9880d681SAndroid Build Coastguard Worker                         i64mem, load, "cvtpi2ps\t{$src2, $dst|$dst, $src2}",
601*9880d681SAndroid Build Coastguard Worker                          SSEPackedSingle>, PS;
602*9880d681SAndroid Build Coastguard Worker}
603*9880d681SAndroid Build Coastguard Worker
604*9880d681SAndroid Build Coastguard Worker// Extract / Insert
605*9880d681SAndroid Build Coastguard Workerlet Predicates = [HasSSE1] in
606*9880d681SAndroid Build Coastguard Workerdef MMX_PEXTRWirri: MMXIi8<0xC5, MRMSrcReg,
607*9880d681SAndroid Build Coastguard Worker                       (outs GR32orGR64:$dst), (ins VR64:$src1, i32u8imm:$src2),
608*9880d681SAndroid Build Coastguard Worker                       "pextrw\t{$src2, $src1, $dst|$dst, $src1, $src2}",
609*9880d681SAndroid Build Coastguard Worker                       [(set GR32orGR64:$dst, (int_x86_mmx_pextr_w VR64:$src1,
610*9880d681SAndroid Build Coastguard Worker                                               imm:$src2))],
611*9880d681SAndroid Build Coastguard Worker                       IIC_MMX_PEXTR>, Sched<[WriteShuffle]>;
612*9880d681SAndroid Build Coastguard Workerlet Constraints = "$src1 = $dst" in {
613*9880d681SAndroid Build Coastguard Workerlet Predicates = [HasSSE1] in {
614*9880d681SAndroid Build Coastguard Worker  def MMX_PINSRWirri : MMXIi8<0xC4, MRMSrcReg,
615*9880d681SAndroid Build Coastguard Worker                      (outs VR64:$dst),
616*9880d681SAndroid Build Coastguard Worker                      (ins VR64:$src1, GR32orGR64:$src2, i32u8imm:$src3),
617*9880d681SAndroid Build Coastguard Worker                      "pinsrw\t{$src3, $src2, $dst|$dst, $src2, $src3}",
618*9880d681SAndroid Build Coastguard Worker                      [(set VR64:$dst, (int_x86_mmx_pinsr_w VR64:$src1,
619*9880d681SAndroid Build Coastguard Worker                                        GR32orGR64:$src2, imm:$src3))],
620*9880d681SAndroid Build Coastguard Worker                      IIC_MMX_PINSRW>, Sched<[WriteShuffle]>;
621*9880d681SAndroid Build Coastguard Worker
622*9880d681SAndroid Build Coastguard Worker  def MMX_PINSRWirmi : MMXIi8<0xC4, MRMSrcMem,
623*9880d681SAndroid Build Coastguard Worker                     (outs VR64:$dst),
624*9880d681SAndroid Build Coastguard Worker                     (ins VR64:$src1, i16mem:$src2, i32u8imm:$src3),
625*9880d681SAndroid Build Coastguard Worker                     "pinsrw\t{$src3, $src2, $dst|$dst, $src2, $src3}",
626*9880d681SAndroid Build Coastguard Worker                     [(set VR64:$dst, (int_x86_mmx_pinsr_w VR64:$src1,
627*9880d681SAndroid Build Coastguard Worker                                         (i32 (anyext (loadi16 addr:$src2))),
628*9880d681SAndroid Build Coastguard Worker                                       imm:$src3))],
629*9880d681SAndroid Build Coastguard Worker                     IIC_MMX_PINSRW>, Sched<[WriteShuffleLd, ReadAfterLd]>;
630*9880d681SAndroid Build Coastguard Worker}
631*9880d681SAndroid Build Coastguard Worker}
632*9880d681SAndroid Build Coastguard Worker
633*9880d681SAndroid Build Coastguard Worker// Mask creation
634*9880d681SAndroid Build Coastguard Workerlet Predicates = [HasSSE1] in
635*9880d681SAndroid Build Coastguard Workerdef MMX_PMOVMSKBrr : MMXI<0xD7, MRMSrcReg, (outs GR32orGR64:$dst),
636*9880d681SAndroid Build Coastguard Worker                          (ins VR64:$src),
637*9880d681SAndroid Build Coastguard Worker                          "pmovmskb\t{$src, $dst|$dst, $src}",
638*9880d681SAndroid Build Coastguard Worker                          [(set GR32orGR64:$dst,
639*9880d681SAndroid Build Coastguard Worker                                (int_x86_mmx_pmovmskb VR64:$src))]>;
640*9880d681SAndroid Build Coastguard Worker
641*9880d681SAndroid Build Coastguard Worker
642*9880d681SAndroid Build Coastguard Worker// Low word of XMM to MMX.
643*9880d681SAndroid Build Coastguard Workerdef MMX_X86movdq2q : SDNode<"X86ISD::MOVDQ2Q", SDTypeProfile<1, 1,
644*9880d681SAndroid Build Coastguard Worker                            [SDTCisVT<0, x86mmx>, SDTCisVT<1, v2i64>]>>;
645*9880d681SAndroid Build Coastguard Worker
646*9880d681SAndroid Build Coastguard Workerdef : Pat<(x86mmx (MMX_X86movdq2q VR128:$src)),
647*9880d681SAndroid Build Coastguard Worker          (x86mmx (MMX_MOVDQ2Qrr VR128:$src))>;
648*9880d681SAndroid Build Coastguard Worker
649*9880d681SAndroid Build Coastguard Workerdef : Pat<(x86mmx (MMX_X86movdq2q (loadv2i64 addr:$src))),
650*9880d681SAndroid Build Coastguard Worker          (x86mmx (MMX_MOVQ64rm addr:$src))>;
651*9880d681SAndroid Build Coastguard Worker
652*9880d681SAndroid Build Coastguard Worker// Misc.
653*9880d681SAndroid Build Coastguard Workerlet SchedRW = [WriteShuffle] in {
654*9880d681SAndroid Build Coastguard Workerlet Uses = [EDI], Predicates = [HasSSE1,Not64BitMode] in
655*9880d681SAndroid Build Coastguard Workerdef MMX_MASKMOVQ : MMXI32<0xF7, MRMSrcReg, (outs), (ins VR64:$src, VR64:$mask),
656*9880d681SAndroid Build Coastguard Worker                          "maskmovq\t{$mask, $src|$src, $mask}",
657*9880d681SAndroid Build Coastguard Worker                          [(int_x86_mmx_maskmovq VR64:$src, VR64:$mask, EDI)],
658*9880d681SAndroid Build Coastguard Worker                          IIC_MMX_MASKMOV>;
659*9880d681SAndroid Build Coastguard Workerlet Uses = [RDI], Predicates = [HasSSE1,In64BitMode] in
660*9880d681SAndroid Build Coastguard Workerdef MMX_MASKMOVQ64: MMXI64<0xF7, MRMSrcReg, (outs), (ins VR64:$src, VR64:$mask),
661*9880d681SAndroid Build Coastguard Worker                           "maskmovq\t{$mask, $src|$src, $mask}",
662*9880d681SAndroid Build Coastguard Worker                           [(int_x86_mmx_maskmovq VR64:$src, VR64:$mask, RDI)],
663*9880d681SAndroid Build Coastguard Worker                           IIC_MMX_MASKMOV>;
664*9880d681SAndroid Build Coastguard Worker}
665*9880d681SAndroid Build Coastguard Worker
666*9880d681SAndroid Build Coastguard Worker// 64-bit bit convert.
667*9880d681SAndroid Build Coastguard Workerlet Predicates = [HasSSE2] in {
668*9880d681SAndroid Build Coastguard Workerdef : Pat<(f64 (bitconvert (x86mmx VR64:$src))),
669*9880d681SAndroid Build Coastguard Worker          (MMX_MOVQ2FR64rr VR64:$src)>;
670*9880d681SAndroid Build Coastguard Workerdef : Pat<(x86mmx (bitconvert (f64 FR64:$src))),
671*9880d681SAndroid Build Coastguard Worker          (MMX_MOVFR642Qrr FR64:$src)>;
672*9880d681SAndroid Build Coastguard Worker}
673*9880d681SAndroid Build Coastguard Worker
674*9880d681SAndroid Build Coastguard Worker
675