mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-12 17:32:19 +00:00
Annotate x87 and mmx instructions with SchedRW lists.
This only covers the instructions that were given itinerary classes for the Atom model. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@178050 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
2bb3fcd490
commit
75f6310dc9
@ -422,7 +422,7 @@ def IST_Fp32m80 : FpI_<(outs), (ins i32mem:$op, RFP80:$src), OneArgFP, []>;
|
||||
def IST_Fp64m80 : FpI_<(outs), (ins i64mem:$op, RFP80:$src), OneArgFP, []>;
|
||||
}
|
||||
|
||||
let mayLoad = 1 in {
|
||||
let mayLoad = 1, SchedRW = [WriteLoad] in {
|
||||
def LD_F32m : FPI<0xD9, MRM0m, (outs), (ins f32mem:$src), "fld{s}\t$src",
|
||||
IIC_FLD>;
|
||||
def LD_F64m : FPI<0xDD, MRM0m, (outs), (ins f64mem:$src), "fld{l}\t$src",
|
||||
@ -436,7 +436,7 @@ def ILD_F32m : FPI<0xDB, MRM0m, (outs), (ins i32mem:$src), "fild{l}\t$src",
|
||||
def ILD_F64m : FPI<0xDF, MRM5m, (outs), (ins i64mem:$src), "fild{ll}\t$src",
|
||||
IIC_FILD>;
|
||||
}
|
||||
let mayStore = 1 in {
|
||||
let mayStore = 1, SchedRW = [WriteStore] in {
|
||||
def ST_F32m : FPI<0xD9, MRM2m, (outs), (ins f32mem:$dst), "fst{s}\t$dst",
|
||||
IIC_FST>;
|
||||
def ST_F64m : FPI<0xDD, MRM2m, (outs), (ins f64mem:$dst), "fst{l}\t$dst",
|
||||
@ -481,7 +481,7 @@ def ISTT_Fp64m80 : FpI_<(outs), (ins i64mem:$op, RFP80:$src), OneArgFP,
|
||||
[(X86fp_to_i64mem RFP80:$src, addr:$op)]>;
|
||||
} // Predicates = [HasSSE3]
|
||||
|
||||
let mayStore = 1 in {
|
||||
let mayStore = 1, SchedRW = [WriteStore] in {
|
||||
def ISTT_FP16m : FPI<0xDF, MRM1m, (outs), (ins i16mem:$dst), "fisttp{s}\t$dst",
|
||||
IIC_FST>;
|
||||
def ISTT_FP32m : FPI<0xDB, MRM1m, (outs), (ins i32mem:$dst), "fisttp{l}\t$dst",
|
||||
@ -491,6 +491,7 @@ def ISTT_FP64m : FPI<0xDD, MRM1m, (outs), (ins i64mem:$dst),
|
||||
}
|
||||
|
||||
// FP Stack manipulation instructions.
|
||||
let SchedRW = [WriteMove] in {
|
||||
def LD_Frr : FPI<0xC0, AddRegFrm, (outs), (ins RST:$op), "fld\t$op",
|
||||
IIC_FLD>, D9;
|
||||
def ST_Frr : FPI<0xD0, AddRegFrm, (outs), (ins RST:$op), "fst\t$op",
|
||||
@ -499,6 +500,7 @@ def ST_FPrr : FPI<0xD8, AddRegFrm, (outs), (ins RST:$op), "fstp\t$op",
|
||||
IIC_FST>, DD;
|
||||
def XCH_F : FPI<0xC8, AddRegFrm, (outs), (ins RST:$op), "fxch\t$op",
|
||||
IIC_FXCH>, D9;
|
||||
}
|
||||
|
||||
// Floating point constant loads.
|
||||
let isReMaterializable = 1 in {
|
||||
@ -516,19 +518,23 @@ def LD_Fp180 : FpI_<(outs RFP80:$dst), (ins), ZeroArgFP,
|
||||
[(set RFP80:$dst, fpimm1)]>;
|
||||
}
|
||||
|
||||
let SchedRW = [WriteZero] in {
|
||||
def LD_F0 : FPI<0xEE, RawFrm, (outs), (ins), "fldz", IIC_FLDZ>, D9;
|
||||
def LD_F1 : FPI<0xE8, RawFrm, (outs), (ins), "fld1", IIC_FIST>, D9;
|
||||
|
||||
}
|
||||
|
||||
// Floating point compares.
|
||||
let SchedRW = [WriteFAdd] in {
|
||||
def UCOM_Fpr32 : FpIf32<(outs), (ins RFP32:$lhs, RFP32:$rhs), CompareFP,
|
||||
[(set FPSW, (trunc (X86cmp RFP32:$lhs, RFP32:$rhs)))]>;
|
||||
def UCOM_Fpr64 : FpIf64<(outs), (ins RFP64:$lhs, RFP64:$rhs), CompareFP,
|
||||
[(set FPSW, (trunc (X86cmp RFP64:$lhs, RFP64:$rhs)))]>;
|
||||
def UCOM_Fpr80 : FpI_ <(outs), (ins RFP80:$lhs, RFP80:$rhs), CompareFP,
|
||||
[(set FPSW, (trunc (X86cmp RFP80:$lhs, RFP80:$rhs)))]>;
|
||||
} // SchedRW
|
||||
} // Defs = [FPSW]
|
||||
|
||||
let SchedRW = [WriteFAdd] in {
|
||||
// CC = ST(0) cmp ST(i)
|
||||
let Defs = [EFLAGS, FPSW] in {
|
||||
def UCOM_FpIr32: FpIf32<(outs), (ins RFP32:$lhs, RFP32:$rhs), CompareFP,
|
||||
@ -566,8 +572,10 @@ def COM_FIr : FPI<0xF0, AddRegFrm, (outs), (ins RST:$reg),
|
||||
def COM_FIPr : FPI<0xF0, AddRegFrm, (outs), (ins RST:$reg),
|
||||
"fcompi\t$reg", IIC_FCOMI>, DF;
|
||||
}
|
||||
} // SchedRW
|
||||
|
||||
// Floating point flag ops.
|
||||
let SchedRW = [WriteALU] in {
|
||||
let Defs = [AX], Uses = [FPSW] in
|
||||
def FNSTSW16r : I<0xE0, RawFrm, // AX = fp flags
|
||||
(outs), (ins), "fnstsw %ax",
|
||||
@ -576,23 +584,26 @@ def FNSTSW16r : I<0xE0, RawFrm, // AX = fp flags
|
||||
def FNSTCW16m : I<0xD9, MRM7m, // [mem16] = X87 control world
|
||||
(outs), (ins i16mem:$dst), "fnstcw\t$dst",
|
||||
[(X86fp_cwd_get16 addr:$dst)], IIC_FNSTCW>;
|
||||
|
||||
} // SchedRW
|
||||
let mayLoad = 1 in
|
||||
def FLDCW16m : I<0xD9, MRM5m, // X87 control world = [mem16]
|
||||
(outs), (ins i16mem:$dst), "fldcw\t$dst", [], IIC_FLDCW>;
|
||||
(outs), (ins i16mem:$dst), "fldcw\t$dst", [], IIC_FLDCW>,
|
||||
Sched<[WriteLoad]>;
|
||||
|
||||
// FPU control instructions
|
||||
let SchedRW = [WriteMicrocoded] in {
|
||||
let Defs = [FPSW] in
|
||||
def FNINIT : I<0xE3, RawFrm, (outs), (ins), "fninit", [], IIC_FNINIT>, DB;
|
||||
def FFREE : FPI<0xC0, AddRegFrm, (outs), (ins RST:$reg),
|
||||
"ffree\t$reg", IIC_FFREE>, DD;
|
||||
|
||||
// Clear exceptions
|
||||
|
||||
let Defs = [FPSW] in
|
||||
def FNCLEX : I<0xE2, RawFrm, (outs), (ins), "fnclex", [], IIC_FNCLEX>, DB;
|
||||
} // SchedRW
|
||||
|
||||
// Operandless floating-point instructions for the disassembler.
|
||||
let SchedRW = [WriteMicrocoded] in {
|
||||
def WAIT : I<0x9B, RawFrm, (outs), (ins), "wait", [], IIC_WAIT>;
|
||||
|
||||
def FNOP : I<0xD0, RawFrm, (outs), (ins), "fnop", [], IIC_FNOP>, D9;
|
||||
@ -627,6 +638,7 @@ def FXRSTOR : I<0xAE, MRM1m, (outs), (ins opaque512mem:$src),
|
||||
def FXRSTOR64 : I<0xAE, MRM1m, (outs), (ins opaque512mem:$src),
|
||||
"fxrstorq\t$src", [], IIC_FXRSTOR>, TB, REX_W,
|
||||
Requires<[In64BitMode]>;
|
||||
} // SchedRW
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Non-Instruction Patterns
|
||||
|
@ -20,6 +20,7 @@
|
||||
// MMX Multiclasses
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
let Sched = WriteVecALU in {
|
||||
def MMX_INTALU_ITINS : OpndItins<
|
||||
IIC_MMX_ALU_RR, IIC_MMX_ALU_RM
|
||||
>;
|
||||
@ -35,11 +36,14 @@ def MMX_PHADDSUBW : OpndItins<
|
||||
def MMX_PHADDSUBD : OpndItins<
|
||||
IIC_MMX_PHADDSUBD_RR, IIC_MMX_PHADDSUBD_RM
|
||||
>;
|
||||
}
|
||||
|
||||
let Sched = WriteVecIMul in
|
||||
def MMX_PMUL_ITINS : OpndItins<
|
||||
IIC_MMX_PMUL, IIC_MMX_PMUL
|
||||
>;
|
||||
|
||||
let Sched = WriteVecALU in {
|
||||
def MMX_PSADBW_ITINS : OpndItins<
|
||||
IIC_MMX_PSADBW, IIC_MMX_PSADBW
|
||||
>;
|
||||
@ -47,11 +51,13 @@ def MMX_PSADBW_ITINS : OpndItins<
|
||||
def MMX_MISC_FUNC_ITINS : OpndItins<
|
||||
IIC_MMX_MISC_FUNC_MEM, IIC_MMX_MISC_FUNC_REG
|
||||
>;
|
||||
}
|
||||
|
||||
def MMX_SHIFT_ITINS : ShiftOpndItins<
|
||||
IIC_MMX_SHIFT_RR, IIC_MMX_SHIFT_RM, IIC_MMX_SHIFT_RI
|
||||
>;
|
||||
|
||||
let Sched = WriteShuffle in {
|
||||
def MMX_UNPCK_H_ITINS : OpndItins<
|
||||
IIC_MMX_UNPCK_H_RR, IIC_MMX_UNPCK_H_RM
|
||||
>;
|
||||
@ -67,7 +73,9 @@ def MMX_PCK_ITINS : OpndItins<
|
||||
def MMX_PSHUF_ITINS : OpndItins<
|
||||
IIC_MMX_PSHUF, IIC_MMX_PSHUF
|
||||
>;
|
||||
} // Sched
|
||||
|
||||
let Sched = WriteCvtF2I in {
|
||||
def MMX_CVT_PD_ITINS : OpndItins<
|
||||
IIC_MMX_CVT_PD_RR, IIC_MMX_CVT_PD_RM
|
||||
>;
|
||||
@ -75,6 +83,7 @@ def MMX_CVT_PD_ITINS : OpndItins<
|
||||
def MMX_CVT_PS_ITINS : OpndItins<
|
||||
IIC_MMX_CVT_PS_RR, IIC_MMX_CVT_PS_RM
|
||||
>;
|
||||
}
|
||||
|
||||
let Constraints = "$src1 = $dst" in {
|
||||
// MMXI_binop_rm_int - Simple MMX binary operator based on intrinsic.
|
||||
@ -84,7 +93,8 @@ let Constraints = "$src1 = $dst" in {
|
||||
def irr : MMXI<opc, MRMSrcReg, (outs VR64:$dst),
|
||||
(ins VR64:$src1, VR64:$src2),
|
||||
!strconcat(OpcodeStr, "\t{$src2, $dst|$dst, $src2}"),
|
||||
[(set VR64:$dst, (IntId VR64:$src1, VR64:$src2))], itins.rr> {
|
||||
[(set VR64:$dst, (IntId VR64:$src1, VR64:$src2))], itins.rr>,
|
||||
Sched<[itins.Sched]> {
|
||||
let isCommutable = Commutable;
|
||||
}
|
||||
def irm : MMXI<opc, MRMSrcMem, (outs VR64:$dst),
|
||||
@ -92,7 +102,7 @@ let Constraints = "$src1 = $dst" in {
|
||||
!strconcat(OpcodeStr, "\t{$src2, $dst|$dst, $src2}"),
|
||||
[(set VR64:$dst, (IntId VR64:$src1,
|
||||
(bitconvert (load_mmx addr:$src2))))],
|
||||
itins.rm>;
|
||||
itins.rm>, Sched<[itins.Sched.Folded, ReadAfterLd]>;
|
||||
}
|
||||
|
||||
multiclass MMXI_binop_rmi_int<bits<8> opc, bits<8> opc2, Format ImmForm,
|
||||
@ -101,17 +111,19 @@ let Constraints = "$src1 = $dst" in {
|
||||
def rr : MMXI<opc, MRMSrcReg, (outs VR64:$dst),
|
||||
(ins VR64:$src1, VR64:$src2),
|
||||
!strconcat(OpcodeStr, "\t{$src2, $dst|$dst, $src2}"),
|
||||
[(set VR64:$dst, (IntId VR64:$src1, VR64:$src2))], itins.rr>;
|
||||
[(set VR64:$dst, (IntId VR64:$src1, VR64:$src2))], itins.rr>,
|
||||
Sched<[WriteVecShift]>;
|
||||
def rm : MMXI<opc, MRMSrcMem, (outs VR64:$dst),
|
||||
(ins VR64:$src1, i64mem:$src2),
|
||||
!strconcat(OpcodeStr, "\t{$src2, $dst|$dst, $src2}"),
|
||||
[(set VR64:$dst, (IntId VR64:$src1,
|
||||
(bitconvert (load_mmx addr:$src2))))],
|
||||
itins.rm>;
|
||||
itins.rm>, Sched<[WriteVecShiftLd, ReadAfterLd]>;
|
||||
def ri : MMXIi8<opc2, ImmForm, (outs VR64:$dst),
|
||||
(ins VR64:$src1, i32i8imm:$src2),
|
||||
!strconcat(OpcodeStr, "\t{$src2, $dst|$dst, $src2}"),
|
||||
[(set VR64:$dst, (IntId2 VR64:$src1, (i32 imm:$src2)))], itins.ri>;
|
||||
[(set VR64:$dst, (IntId2 VR64:$src1, (i32 imm:$src2)))], itins.ri>,
|
||||
Sched<[WriteVecShift]>;
|
||||
}
|
||||
}
|
||||
|
||||
@ -120,13 +132,14 @@ multiclass SS3I_unop_rm_int_mm<bits<8> opc, string OpcodeStr,
|
||||
Intrinsic IntId64, OpndItins itins> {
|
||||
def rr64 : MMXSS38I<opc, MRMSrcReg, (outs VR64:$dst), (ins VR64:$src),
|
||||
!strconcat(OpcodeStr, "\t{$src, $dst|$dst, $src}"),
|
||||
[(set VR64:$dst, (IntId64 VR64:$src))], itins.rr>;
|
||||
[(set VR64:$dst, (IntId64 VR64:$src))], itins.rr>,
|
||||
Sched<[itins.Sched]>;
|
||||
|
||||
def rm64 : MMXSS38I<opc, MRMSrcMem, (outs VR64:$dst), (ins i64mem:$src),
|
||||
!strconcat(OpcodeStr, "\t{$src, $dst|$dst, $src}"),
|
||||
[(set VR64:$dst,
|
||||
(IntId64 (bitconvert (memopmmx addr:$src))))],
|
||||
itins.rm>;
|
||||
itins.rm>, Sched<[itins.Sched.Folded]>;
|
||||
}
|
||||
|
||||
/// Binary MMX instructions requiring SSSE3.
|
||||
@ -137,13 +150,15 @@ multiclass SS3I_binop_rm_int_mm<bits<8> opc, string OpcodeStr,
|
||||
def rr64 : MMXSS38I<opc, MRMSrcReg, (outs VR64:$dst),
|
||||
(ins VR64:$src1, VR64:$src2),
|
||||
!strconcat(OpcodeStr, "\t{$src2, $dst|$dst, $src2}"),
|
||||
[(set VR64:$dst, (IntId64 VR64:$src1, VR64:$src2))], itins.rr>;
|
||||
[(set VR64:$dst, (IntId64 VR64:$src1, VR64:$src2))], itins.rr>,
|
||||
Sched<[itins.Sched]>;
|
||||
def rm64 : MMXSS38I<opc, MRMSrcMem, (outs VR64:$dst),
|
||||
(ins VR64:$src1, i64mem:$src2),
|
||||
!strconcat(OpcodeStr, "\t{$src2, $dst|$dst, $src2}"),
|
||||
[(set VR64:$dst,
|
||||
(IntId64 VR64:$src1,
|
||||
(bitconvert (memopmmx addr:$src2))))], itins.rm>;
|
||||
(bitconvert (memopmmx addr:$src2))))], itins.rm>,
|
||||
Sched<[itins.Sched.Folded, ReadAfterLd]>;
|
||||
}
|
||||
}
|
||||
|
||||
@ -164,9 +179,11 @@ multiclass sse12_cvt_pint<bits<8> opc, RegisterClass SrcRC, RegisterClass DstRC,
|
||||
Intrinsic Int, X86MemOperand x86memop, PatFrag ld_frag,
|
||||
string asm, OpndItins itins, Domain d> {
|
||||
def irr : MMXPI<opc, MRMSrcReg, (outs DstRC:$dst), (ins SrcRC:$src), asm,
|
||||
[(set DstRC:$dst, (Int SrcRC:$src))], itins.rr, d>;
|
||||
[(set DstRC:$dst, (Int SrcRC:$src))], itins.rr, d>,
|
||||
Sched<[itins.Sched]>;
|
||||
def irm : MMXPI<opc, MRMSrcMem, (outs DstRC:$dst), (ins x86memop:$src), asm,
|
||||
[(set DstRC:$dst, (Int (ld_frag addr:$src)))], itins.rm, d>;
|
||||
[(set DstRC:$dst, (Int (ld_frag addr:$src)))], itins.rm, d>,
|
||||
Sched<[itins.Sched.Folded]>;
|
||||
}
|
||||
|
||||
multiclass sse12_cvt_pint_3addr<bits<8> opc, RegisterClass SrcRC,
|
||||
@ -197,16 +214,17 @@ def MMX_MOVD64rr : MMXI<0x6E, MRMSrcReg, (outs VR64:$dst), (ins GR32:$src),
|
||||
"movd\t{$src, $dst|$dst, $src}",
|
||||
[(set VR64:$dst,
|
||||
(x86mmx (scalar_to_vector GR32:$src)))],
|
||||
IIC_MMX_MOV_MM_RM>;
|
||||
IIC_MMX_MOV_MM_RM>, Sched<[WriteMove]>;
|
||||
let canFoldAsLoad = 1 in
|
||||
def MMX_MOVD64rm : MMXI<0x6E, MRMSrcMem, (outs VR64:$dst), (ins i32mem:$src),
|
||||
"movd\t{$src, $dst|$dst, $src}",
|
||||
[(set VR64:$dst,
|
||||
(x86mmx (scalar_to_vector (loadi32 addr:$src))))],
|
||||
IIC_MMX_MOV_MM_RM>;
|
||||
IIC_MMX_MOV_MM_RM>, Sched<[WriteLoad]>;
|
||||
let mayStore = 1 in
|
||||
def MMX_MOVD64mr : MMXI<0x7E, MRMDestMem, (outs), (ins i32mem:$dst, VR64:$src),
|
||||
"movd\t{$src, $dst|$dst, $src}", [], IIC_MMX_MOV_MM_RM>;
|
||||
"movd\t{$src, $dst|$dst, $src}", [], IIC_MMX_MOV_MM_RM>,
|
||||
Sched<[WriteStore]>;
|
||||
|
||||
// Low word of MMX to GPR.
|
||||
def MMX_X86movd2w : SDNode<"X86ISD::MMX_MOVD2W", SDTypeProfile<1, 1,
|
||||
@ -214,16 +232,18 @@ def MMX_X86movd2w : SDNode<"X86ISD::MMX_MOVD2W", SDTypeProfile<1, 1,
|
||||
def MMX_MOVD64grr : MMXI<0x7E, MRMDestReg, (outs GR32:$dst), (ins VR64:$src),
|
||||
"movd\t{$src, $dst|$dst, $src}",
|
||||
[(set GR32:$dst,
|
||||
(MMX_X86movd2w (x86mmx VR64:$src)))], IIC_MMX_MOV_REG_MM>;
|
||||
(MMX_X86movd2w (x86mmx VR64:$src)))],
|
||||
IIC_MMX_MOV_REG_MM>, Sched<[WriteMove]>;
|
||||
|
||||
let neverHasSideEffects = 1 in
|
||||
def MMX_MOVD64to64rr : MMXRI<0x6E, MRMSrcReg, (outs VR64:$dst), (ins GR64:$src),
|
||||
"movd\t{$src, $dst|$dst, $src}",
|
||||
[], IIC_MMX_MOV_MM_RM>;
|
||||
[], IIC_MMX_MOV_MM_RM>, Sched<[WriteMove]>;
|
||||
|
||||
// These are 64 bit moves, but since the OS X assembler doesn't
|
||||
// recognize a register-register movq, we write them as
|
||||
// movd.
|
||||
let SchedRW = [WriteMove] in {
|
||||
def MMX_MOVD64from64rr : MMXRI<0x7E, MRMDestReg,
|
||||
(outs GR64:$dst), (ins VR64:$src),
|
||||
"movd\t{$src, $dst|$dst, $src}",
|
||||
@ -237,6 +257,9 @@ let neverHasSideEffects = 1 in
|
||||
def MMX_MOVQ64rr : MMXI<0x6F, MRMSrcReg, (outs VR64:$dst), (ins VR64:$src),
|
||||
"movq\t{$src, $dst|$dst, $src}", [],
|
||||
IIC_MMX_MOVQ_RR>;
|
||||
} // SchedRW
|
||||
|
||||
let SchedRW = [WriteLoad] in {
|
||||
let canFoldAsLoad = 1 in
|
||||
def MMX_MOVQ64rm : MMXI<0x6F, MRMSrcMem, (outs VR64:$dst), (ins i64mem:$src),
|
||||
"movq\t{$src, $dst|$dst, $src}",
|
||||
@ -246,7 +269,9 @@ def MMX_MOVQ64mr : MMXI<0x7F, MRMDestMem, (outs), (ins i64mem:$dst, VR64:$src),
|
||||
"movq\t{$src, $dst|$dst, $src}",
|
||||
[(store (x86mmx VR64:$src), addr:$dst)],
|
||||
IIC_MMX_MOVQ_RM>;
|
||||
} // SchedRW
|
||||
|
||||
let SchedRW = [WriteMove] in {
|
||||
def MMX_MOVDQ2Qrr : MMXSDIi8<0xD6, MRMSrcReg, (outs VR64:$dst),
|
||||
(ins VR128:$src), "movdq2q\t{$src, $dst|$dst, $src}",
|
||||
[(set VR64:$dst,
|
||||
@ -271,11 +296,12 @@ def MMX_MOVQ2FR64rr: MMXS2SIi8<0xD6, MRMSrcReg, (outs FR64:$dst),
|
||||
def MMX_MOVFR642Qrr: MMXSDIi8<0xD6, MRMSrcReg, (outs VR64:$dst),
|
||||
(ins FR64:$src), "movdq2q\t{$src, $dst|$dst, $src}",
|
||||
[], IIC_MMX_MOVQ_RR>;
|
||||
} // SchedRW
|
||||
|
||||
def MMX_MOVNTQmr : MMXI<0xE7, MRMDestMem, (outs), (ins i64mem:$dst, VR64:$src),
|
||||
"movntq\t{$src, $dst|$dst, $src}",
|
||||
[(int_x86_mmx_movnt_dq addr:$dst, VR64:$src)],
|
||||
IIC_MMX_MOVQ_RM>;
|
||||
IIC_MMX_MOVQ_RM>, Sched<[WriteStore]>;
|
||||
|
||||
let AddedComplexity = 15 in
|
||||
// movd to MMX register zero-extends
|
||||
@ -283,7 +309,7 @@ def MMX_MOVZDI2PDIrr : MMXI<0x6E, MRMSrcReg, (outs VR64:$dst), (ins GR32:$src),
|
||||
"movd\t{$src, $dst|$dst, $src}",
|
||||
[(set VR64:$dst,
|
||||
(x86mmx (X86vzmovl (x86mmx (scalar_to_vector GR32:$src)))))],
|
||||
IIC_MMX_MOV_MM_RM>;
|
||||
IIC_MMX_MOV_MM_RM>, Sched<[WriteMove]>;
|
||||
let AddedComplexity = 20 in
|
||||
def MMX_MOVZDI2PDIrm : MMXI<0x6E, MRMSrcMem, (outs VR64:$dst),
|
||||
(ins i32mem:$src),
|
||||
@ -291,7 +317,7 @@ def MMX_MOVZDI2PDIrm : MMXI<0x6E, MRMSrcMem, (outs VR64:$dst),
|
||||
[(set VR64:$dst,
|
||||
(x86mmx (X86vzmovl (x86mmx
|
||||
(scalar_to_vector (loadi32 addr:$src))))))],
|
||||
IIC_MMX_MOV_MM_RM>;
|
||||
IIC_MMX_MOV_MM_RM>, Sched<[WriteLoad]>;
|
||||
|
||||
// Arithmetic Instructions
|
||||
defm MMX_PABSB : SS3I_unop_rm_int_mm<0x1C, "pabsb", int_x86_ssse3_pabs_b,
|
||||
@ -491,14 +517,14 @@ def MMX_PSHUFWri : MMXIi8<0x70, MRMSrcReg,
|
||||
"pshufw\t{$src2, $src1, $dst|$dst, $src1, $src2}",
|
||||
[(set VR64:$dst,
|
||||
(int_x86_sse_pshuf_w VR64:$src1, imm:$src2))],
|
||||
IIC_MMX_PSHUF>;
|
||||
IIC_MMX_PSHUF>, Sched<[WriteShuffle]>;
|
||||
def MMX_PSHUFWmi : MMXIi8<0x70, MRMSrcMem,
|
||||
(outs VR64:$dst), (ins i64mem:$src1, i8imm:$src2),
|
||||
"pshufw\t{$src2, $src1, $dst|$dst, $src1, $src2}",
|
||||
[(set VR64:$dst,
|
||||
(int_x86_sse_pshuf_w (load_mmx addr:$src1),
|
||||
imm:$src2))],
|
||||
IIC_MMX_PSHUF>;
|
||||
IIC_MMX_PSHUF>, Sched<[WriteShuffleLd]>;
|
||||
|
||||
|
||||
|
||||
@ -532,7 +558,7 @@ def MMX_PEXTRWirri: MMXIi8<0xC5, MRMSrcReg,
|
||||
"pextrw\t{$src2, $src1, $dst|$dst, $src1, $src2}",
|
||||
[(set GR32:$dst, (int_x86_mmx_pextr_w VR64:$src1,
|
||||
(iPTR imm:$src2)))],
|
||||
IIC_MMX_PEXTR>;
|
||||
IIC_MMX_PEXTR>, Sched<[WriteShuffle]>;
|
||||
let Constraints = "$src1 = $dst" in {
|
||||
def MMX_PINSRWirri : MMXIi8<0xC4, MRMSrcReg,
|
||||
(outs VR64:$dst),
|
||||
@ -540,7 +566,7 @@ let Constraints = "$src1 = $dst" in {
|
||||
"pinsrw\t{$src3, $src2, $dst|$dst, $src2, $src3}",
|
||||
[(set VR64:$dst, (int_x86_mmx_pinsr_w VR64:$src1,
|
||||
GR32:$src2, (iPTR imm:$src3)))],
|
||||
IIC_MMX_PINSRW>;
|
||||
IIC_MMX_PINSRW>, Sched<[WriteShuffle]>;
|
||||
|
||||
def MMX_PINSRWirmi : MMXIi8<0xC4, MRMSrcMem,
|
||||
(outs VR64:$dst),
|
||||
@ -549,7 +575,7 @@ let Constraints = "$src1 = $dst" in {
|
||||
[(set VR64:$dst, (int_x86_mmx_pinsr_w VR64:$src1,
|
||||
(i32 (anyext (loadi16 addr:$src2))),
|
||||
(iPTR imm:$src3)))],
|
||||
IIC_MMX_PINSRW>;
|
||||
IIC_MMX_PINSRW>, Sched<[WriteShuffleLd, ReadAfterLd]>;
|
||||
}
|
||||
|
||||
// Mask creation
|
||||
@ -570,6 +596,7 @@ def : Pat<(x86mmx (MMX_X86movdq2q (loadv2i64 addr:$src))),
|
||||
(x86mmx (MMX_MOVQ64rm addr:$src))>;
|
||||
|
||||
// Misc.
|
||||
let SchedRW = [WriteShuffle] in {
|
||||
let Uses = [EDI] in
|
||||
def MMX_MASKMOVQ : MMXI<0xF7, MRMSrcReg, (outs), (ins VR64:$src, VR64:$mask),
|
||||
"maskmovq\t{$mask, $src|$src, $mask}",
|
||||
@ -580,6 +607,7 @@ def MMX_MASKMOVQ64: MMXI64<0xF7, MRMSrcReg, (outs), (ins VR64:$src, VR64:$mask),
|
||||
"maskmovq\t{$mask, $src|$src, $mask}",
|
||||
[(int_x86_mmx_maskmovq VR64:$src, VR64:$mask, RDI)],
|
||||
IIC_MMX_MASKMOV>;
|
||||
}
|
||||
|
||||
// 64-bit bit convert.
|
||||
let Predicates = [HasSSE2] in {
|
||||
|
Loading…
x
Reference in New Issue
Block a user