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