From: Jakob Stoklund Olesen Date: Sat, 16 Mar 2013 00:02:17 +0000 (+0000) Subject: Define more SchedWrites for annotating X86 instructions. X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=e0c489d22b3152cf041255e339d8df45345ca8e4;p=oota-llvm.git Define more SchedWrites for annotating X86 instructions. Since almost all X86 instructions can fold loads, use a multiclass to define register/memory pairs of SchedWrites. An X86FoldableSchedWrite represents the register version of an instruction. It holds a reference to the SchedWrite to use when the instruction folds a load. This will be used inside multiclasses that define rr and rm instruction versions together. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@177210 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Target/X86/X86Schedule.td b/lib/Target/X86/X86Schedule.td index 5c57520fd0c..da0ca7d28ee 100644 --- a/lib/Target/X86/X86Schedule.td +++ b/lib/Target/X86/X86Schedule.td @@ -13,25 +13,71 @@ // Instructions with folded loads need to read the memory operand immediately, // but other register operands don't have to be read until the load is ready. -// These are marked with ReadAfterLd. +// These operands are marked with ReadAfterLd. def ReadAfterLd : SchedRead; // Instructions with both a load and a store folded are modeled as a folded // load + WriteRMW. def WriteRMW : SchedWrite; -// Most instructions can fold loads, so every SchedWrite comes in two variants: -// With and without a folded load. +// Most instructions can fold loads, so almost every SchedWrite comes in two +// variants: With and without a folded load. +// An X86FoldableSchedWrite holds a reference to the corresponding SchedWrite +// with a folded load. +class X86FoldableSchedWrite : SchedWrite { + // The SchedWrite to use when a load is folded into the instruction. + SchedWrite Folded; +} -// Arithmetic. -def WriteALU : SchedWrite; // Simple integer ALU op. -def WriteALULd : SchedWrite; // ALU op with folded load. -def WriteIMul : SchedWrite; // Integer multiplication. -def WriteIMulLd : SchedWrite; -def WriteIDiv : SchedWrite; // Integer division. -def WriteIDivLd : SchedWrite; -def WriteLEA : SchedWrite; // LEA instructions can't fold loads. +// Multiclass that produces a linked pair of SchedWrites. +multiclass X86SchedWritePair { + // Register-Memory operation. + def Ld : SchedWrite; + // Register-Register operation. + def NAME : X86FoldableSchedWrite { + let Folded = !cast(NAME#"Ld"); + } +} +// Arithmetic. +defm WriteALU : X86SchedWritePair; // Simple integer ALU op. +defm WriteIMul : X86SchedWritePair; // Integer multiplication. +defm WriteIDiv : X86SchedWritePair; // Integer division. +def WriteLEA : SchedWrite; // LEA instructions can't fold loads. + +// Integer shifts and rotates. +defm WriteShift : X86SchedWritePair; + +// Loads, stores, and moves, not folded with other operations. +def WriteLoad : SchedWrite; +def WriteStore : SchedWrite; +def WriteMove : SchedWrite; + +// Branches don't produce values, so they have no latency, but they still +// consume resources. Indirect branches can fold loads. +defm WriteJump : X86SchedWritePair; + +// Floating point. This covers both scalar and vector operations. +defm WriteFAdd : X86SchedWritePair; // Floating point add/sub/compare. +defm WriteFMul : X86SchedWritePair; // Floating point multiplication. +defm WriteFDiv : X86SchedWritePair; // Floating point division. +defm WriteFSqrt : X86SchedWritePair; // Floating point square root. +defm WriteFRcp : X86SchedWritePair; // Floating point reciprocal. + +// Vector integer operations. +defm WriteVecALU : X86SchedWritePair; // Vector integer ALU op, no logicals. +defm WriteVecShift : X86SchedWritePair; // Vector integer shifts. +defm WriteVecIMul : X86SchedWritePair; // Vector integer multiply. + +// Vector bitwise operations. +// These are often used on both floating point and integer vectors. +defm WriteVecLogic : X86SchedWritePair; // Vector and/or/xor. +defm WriteShuffle : X86SchedWritePair; // Vector shuffles and blends. + +// Conversion between integer and float. +defm WriteCvtF2I : X86SchedWritePair; // Float -> Integer. +defm WriteCvtI2F : X86SchedWritePair; // Integer -> Float. +defm WriteCvtF2F : X86SchedWritePair; // Float -> Float size conversion. //===----------------------------------------------------------------------===// // Instruction Itinerary classes used for X86