diff options
Diffstat (limited to 'llvm/lib/Target/X86/X86ScheduleBdVer2.td')
-rw-r--r-- | llvm/lib/Target/X86/X86ScheduleBdVer2.td | 43 |
1 files changed, 39 insertions, 4 deletions
diff --git a/llvm/lib/Target/X86/X86ScheduleBdVer2.td b/llvm/lib/Target/X86/X86ScheduleBdVer2.td index d7aea3cf4e9d3..0a201bc74a482 100644 --- a/llvm/lib/Target/X86/X86ScheduleBdVer2.td +++ b/llvm/lib/Target/X86/X86ScheduleBdVer2.td @@ -545,8 +545,40 @@ def PdWriteBTSRm : SchedWriteRes<[PdEX01, PdLoad]> { def : SchedAlias<WriteBitTestSetRegRMW, PdWriteBTSRm>; // This is for simple LEAs with one or two input operands. -// FIXME: SAGU 3-operand LEA -def : WriteRes<WriteLEA, [PdEX01]> { let NumMicroOps = 2; } +def : WriteRes<WriteLEA, [PdEX01]> { let ResourceCycles = [2]; } + +// This write is used for slow LEA instructions. +def PdWrite3OpsLEA : SchedWriteRes<[PdEX01]> { + let Latency = 2; + let ResourceCycles = [2]; +} + +// On Piledriver, a slow LEA is either a 3Ops LEA (base, index, offset), +// or an LEA with a `Scale` value different than 1. +def PdSlowLEAPredicate : MCSchedPredicate< + CheckAny<[ + // A 3-operand LEA (base, index, offset). + IsThreeOperandsLEAFn, + // An LEA with a "Scale" different than 1. + CheckAll<[ + CheckIsImmOperand<2>, + CheckNot<CheckImmOperand<2, 1>> + ]> + ]> +>; + +def PdWriteLEA : SchedWriteVariant<[ + SchedVar<PdSlowLEAPredicate, [PdWrite3OpsLEA]>, + SchedVar<NoSchedPred, [WriteLEA]> +]>; + +def : InstRW<[PdWriteLEA], (instrs LEA32r, LEA64r, LEA64_32r)>; + +def PdWriteLEA16r : SchedWriteRes<[PdEX01]> { + let ResourceCycles = [3]; + let NumMicroOps = 2; +} +def : InstRW<[PdWriteLEA16r], (instrs LEA16r)>; // Bit counts. defm : PdWriteResExPair<WriteBSF, [PdEX01], 3, [6], 6, 2>; @@ -766,6 +798,7 @@ defm : PdWriteResYMMPair<WriteFCmp64Y, [PdFPU0, PdFPFMA], 2, [1, 2]>; defm : X86WriteResPairUnsupported<WriteFCmp64Z>; defm : PdWriteResXMMPair<WriteFCom, [PdFPU0, PdFPFMA, PdEX0], 1, [], 2>; +defm : PdWriteResXMMPair<WriteFComX, [PdFPU0, PdFPFMA, PdEX0], 1, [], 2>; def PdWriteFCOMPm : SchedWriteRes<[PdFPU1, PdFPFMA]> { let Latency = 6; @@ -1060,8 +1093,10 @@ def : InstRW<[PdWriteVMOVDQUYmr], (instrs VMOVDQUYmr)>; defm : PdWriteRes<WriteVecStoreNT, [PdStore, PdFPU1, PdFPSTO], 2>; defm : PdWriteRes<WriteVecStoreNTY, [PdStore, PdFPU1, PdFPSTO], 2, [2, 2, 2], 4>; -defm : PdWriteRes<WriteVecMaskedStore, [PdStore, PdFPU01, PdFPMAL], 6, [1, 1, 4]>; -defm : PdWriteRes<WriteVecMaskedStoreY, [PdStore, PdFPU01, PdFPMAL], 6, [2, 2, 4], 2>; +defm : X86WriteResUnsupported<WriteVecMaskedStore32>; +defm : X86WriteResUnsupported<WriteVecMaskedStore32Y>; +defm : X86WriteResUnsupported<WriteVecMaskedStore64>; +defm : X86WriteResUnsupported<WriteVecMaskedStore64Y>; defm : PdWriteRes<WriteVecMove, [PdFPU01, PdFPMAL], 2>; defm : PdWriteRes<WriteVecMoveX, [PdFPU01, PdFPMAL], 1, [1, 2]>; |