Index: include/llvm/Target/TargetInstrPredicate.td =================================================================== --- include/llvm/Target/TargetInstrPredicate.td +++ include/llvm/Target/TargetInstrPredicate.td @@ -111,6 +111,9 @@ Register Reg = R; } +// Check if register operand at index `Index` is the invalid register. +class CheckInvalidRegOperand : MCOperandPredicate; + // Check that the operand at position `Index` is immediate `Imm`. class CheckImmOperand : MCOperandPredicate { int ImmVal = Imm; Index: lib/Target/X86/MCTargetDesc/X86MCTargetDesc.h =================================================================== --- lib/Target/X86/MCTargetDesc/X86MCTargetDesc.h +++ lib/Target/X86/MCTargetDesc/X86MCTargetDesc.h @@ -134,6 +134,7 @@ // Defines symbolic names for the X86 instructions. // #define GET_INSTRINFO_ENUM +#define GET_GENINSTRINFO_MC_DECL #include "X86GenInstrInfo.inc" #define GET_SUBTARGETINFO_ENUM Index: lib/Target/X86/MCTargetDesc/X86MCTargetDesc.cpp =================================================================== --- lib/Target/X86/MCTargetDesc/X86MCTargetDesc.cpp +++ lib/Target/X86/MCTargetDesc/X86MCTargetDesc.cpp @@ -39,6 +39,7 @@ #include "X86GenRegisterInfo.inc" #define GET_INSTRINFO_MC_DESC +#define GET_GENINSTRINFO_MC_HELPERS #include "X86GenInstrInfo.inc" #define GET_SUBTARGETINFO_MC_DESC Index: lib/Target/X86/X86FixupLEAs.cpp =================================================================== --- lib/Target/X86/X86FixupLEAs.cpp +++ lib/Target/X86/X86FixupLEAs.cpp @@ -296,13 +296,6 @@ return (Offset.isImm() && Offset.getImm() != 0) || Offset.isGlobal(); } -// LEA instruction that has all three operands: offset, base and index -static inline bool isThreeOperandsLEA(const MachineOperand &Base, - const MachineOperand &Index, - const MachineOperand &Offset) { - return isRegOperand(Base) && isRegOperand(Index) && hasLEAOffset(Offset); -} - static inline int getADDrrFromLEA(int LEAOpcode) { switch (LEAOpcode) { default: @@ -477,7 +470,7 @@ const MachineOperand &Offset = MI.getOperand(4); const MachineOperand &Segment = MI.getOperand(5); - if (!(isThreeOperandsLEA(Base, Index, Offset) || + if (!(TII->isThreeOperandsLEA(MI) || hasInefficientLEABaseReg(Base, Index)) || !TII->isSafeToClobberEFLAGS(*MFI, MI) || Segment.getReg() != X86::NoRegister) Index: lib/Target/X86/X86Schedule.td =================================================================== --- lib/Target/X86/X86Schedule.td +++ lib/Target/X86/X86Schedule.td @@ -622,6 +622,27 @@ def ZeroIdiomPredicate : CheckSameRegOperand<1, 2>; +def IsThreeOperandsLEAPredicate: CheckAll<[ + // isRegOperand(Base) + CheckIsRegOperand<1>, + CheckNot>, + + // isRegOperand(Index) + CheckIsRegOperand<3>, + CheckNot>, + + // hasLEAOffset(Offset) + CheckAny<[ + CheckAll<[ + CheckIsImmOperand<4>, + CheckNot> + ]>, + CheckNonPortable<"MI.getOperand(4).isGlobal()"> + ]> +]>; + +def IsThreeOperandsLEAFn : TIIPredicate<"X86", "isThreeOperandsLEA", IsThreeOperandsLEAPredicate>; + //===----------------------------------------------------------------------===// // Generic Processor Scheduler Models. Index: lib/Target/X86/X86ScheduleBtVer2.td =================================================================== --- lib/Target/X86/X86ScheduleBtVer2.td +++ lib/Target/X86/X86ScheduleBtVer2.td @@ -187,7 +187,6 @@ def : WriteRes; // This is for simple LEAs with one or two input operands. -// FIXME: SAGU 3-operand LEA def : WriteRes; // Bit counts. @@ -664,4 +663,38 @@ PCMPGTDrr, VPCMPGTDrr, PCMPGTQrr, VPCMPGTQrr, PCMPGTWrr, VPCMPGTWrr)>; + +// This write is used for slow LEA instructions. +def JWrite3OpsLEA : SchedWriteRes<[JALU1, JSAGU]> { + let Latency = 2; +} + +// On Jaguar, a slow LEA is either a 3Ops LEA (base, index, offset), or an LEA +// with a `Scale` value different than 1. +def JSlowLEAPredicate : MCSchedPredicate< + CheckAny<[ + // A 3-operand LEA (base, index, offset). + IsThreeOperandsLEAFn, + // An LEA with a "Scale" different than 1. + CheckAll<[ + CheckIsImmOperand<2>, + CheckNot> + ]> + ]> +>; + +def JWriteLEA : SchedWriteVariant<[ + SchedVar, + SchedVar, [WriteLEA]> +]>; + +def : InstRW<[JWriteLEA], (instrs LEA32r, LEA64r, LEA64_32r)>; + +def JSlowLEA16r : SchedWriteRes<[JALU01]> { + let Latency = 3; + let ResourceCycles = [4]; +} + +def : InstRW<[JSlowLEA16r], (instrs LEA16r)>; + } // SchedModel Index: test/CodeGen/X86/lea32-schedule.ll =================================================================== --- test/CodeGen/X86/lea32-schedule.ll +++ test/CodeGen/X86/lea32-schedule.ll @@ -278,7 +278,7 @@ ; BTVER2: # %bb.0: ; BTVER2-NEXT: # kill: def $esi killed $esi def $rsi ; BTVER2-NEXT: # kill: def $edi killed $edi def $rdi -; BTVER2-NEXT: leal 16(%rdi,%rsi), %eax # sched: [1:0.50] +; BTVER2-NEXT: leal 16(%rdi,%rsi), %eax # sched: [2:1.00] ; BTVER2-NEXT: retq # sched: [4:1.00] ; ; ZNVER1-LABEL: test_lea_add_offset: @@ -362,7 +362,7 @@ ; BTVER2: # %bb.0: ; BTVER2-NEXT: # kill: def $esi killed $esi def $rsi ; BTVER2-NEXT: # kill: def $edi killed $edi def $rdi -; BTVER2-NEXT: leal -4096(%rdi,%rsi), %eax # sched: [1:0.50] +; BTVER2-NEXT: leal -4096(%rdi,%rsi), %eax # sched: [2:1.00] ; BTVER2-NEXT: retq # sched: [4:1.00] ; ; ZNVER1-LABEL: test_lea_add_offset_big: @@ -497,7 +497,7 @@ ; BTVER2-LABEL: test_lea_mul_offset: ; BTVER2: # %bb.0: ; BTVER2-NEXT: # kill: def $edi killed $edi def $rdi -; BTVER2-NEXT: leal -32(%rdi,%rdi,2), %eax # sched: [1:0.50] +; BTVER2-NEXT: leal -32(%rdi,%rdi,2), %eax # sched: [2:1.00] ; BTVER2-NEXT: retq # sched: [4:1.00] ; ; ZNVER1-LABEL: test_lea_mul_offset: @@ -572,7 +572,7 @@ ; BTVER2-LABEL: test_lea_mul_offset_big: ; BTVER2: # %bb.0: ; BTVER2-NEXT: # kill: def $edi killed $edi def $rdi -; BTVER2-NEXT: leal 10000(%rdi,%rdi,8), %eax # sched: [1:0.50] +; BTVER2-NEXT: leal 10000(%rdi,%rdi,8), %eax # sched: [2:1.00] ; BTVER2-NEXT: retq # sched: [4:1.00] ; ; ZNVER1-LABEL: test_lea_mul_offset_big: @@ -724,7 +724,7 @@ ; BTVER2: # %bb.0: ; BTVER2-NEXT: # kill: def $esi killed $esi def $rsi ; BTVER2-NEXT: # kill: def $edi killed $edi def $rdi -; BTVER2-NEXT: leal 96(%rdi,%rsi,4), %eax # sched: [1:0.50] +; BTVER2-NEXT: leal 96(%rdi,%rsi,4), %eax # sched: [2:1.00] ; BTVER2-NEXT: retq # sched: [4:1.00] ; ; ZNVER1-LABEL: test_lea_add_scale_offset: @@ -809,7 +809,7 @@ ; BTVER2: # %bb.0: ; BTVER2-NEXT: # kill: def $esi killed $esi def $rsi ; BTVER2-NEXT: # kill: def $edi killed $edi def $rdi -; BTVER2-NEXT: leal -1200(%rdi,%rsi,8), %eax # sched: [1:0.50] +; BTVER2-NEXT: leal -1200(%rdi,%rsi,8), %eax # sched: [2:1.00] ; BTVER2-NEXT: retq # sched: [4:1.00] ; ; ZNVER1-LABEL: test_lea_add_scale_offset_big: Index: test/CodeGen/X86/lea64-schedule.ll =================================================================== --- test/CodeGen/X86/lea64-schedule.ll +++ test/CodeGen/X86/lea64-schedule.ll @@ -226,7 +226,7 @@ ; ; BTVER2-LABEL: test_lea_add_offset: ; BTVER2: # %bb.0: -; BTVER2-NEXT: leaq 16(%rdi,%rsi), %rax # sched: [1:0.50] +; BTVER2-NEXT: leaq 16(%rdi,%rsi), %rax # sched: [2:1.00] ; BTVER2-NEXT: retq # sched: [4:1.00] ; ; ZNVER1-LABEL: test_lea_add_offset: @@ -292,7 +292,7 @@ ; ; BTVER2-LABEL: test_lea_add_offset_big: ; BTVER2: # %bb.0: -; BTVER2-NEXT: leaq -4096(%rdi,%rsi), %rax # sched: [1:0.50] +; BTVER2-NEXT: leaq -4096(%rdi,%rsi), %rax # sched: [2:1.00] ; BTVER2-NEXT: retq # sched: [4:1.00] ; ; ZNVER1-LABEL: test_lea_add_offset_big: @@ -408,7 +408,7 @@ ; ; BTVER2-LABEL: test_lea_mul_offset: ; BTVER2: # %bb.0: -; BTVER2-NEXT: leaq -32(%rdi,%rdi,2), %rax # sched: [1:0.50] +; BTVER2-NEXT: leaq -32(%rdi,%rdi,2), %rax # sched: [2:1.00] ; BTVER2-NEXT: retq # sched: [4:1.00] ; ; ZNVER1-LABEL: test_lea_mul_offset: @@ -474,7 +474,7 @@ ; ; BTVER2-LABEL: test_lea_mul_offset_big: ; BTVER2: # %bb.0: -; BTVER2-NEXT: leaq 10000(%rdi,%rdi,8), %rax # sched: [1:0.50] +; BTVER2-NEXT: leaq 10000(%rdi,%rdi,8), %rax # sched: [2:1.00] ; BTVER2-NEXT: retq # sched: [4:1.00] ; ; ZNVER1-LABEL: test_lea_mul_offset_big: @@ -591,7 +591,7 @@ ; ; BTVER2-LABEL: test_lea_add_scale_offset: ; BTVER2: # %bb.0: -; BTVER2-NEXT: leaq 96(%rdi,%rsi,4), %rax # sched: [1:0.50] +; BTVER2-NEXT: leaq 96(%rdi,%rsi,4), %rax # sched: [2:1.00] ; BTVER2-NEXT: retq # sched: [4:1.00] ; ; ZNVER1-LABEL: test_lea_add_scale_offset: @@ -658,7 +658,7 @@ ; ; BTVER2-LABEL: test_lea_add_scale_offset_big: ; BTVER2: # %bb.0: -; BTVER2-NEXT: leaq -1200(%rdi,%rsi,8), %rax # sched: [1:0.50] +; BTVER2-NEXT: leaq -1200(%rdi,%rsi,8), %rax # sched: [2:1.00] ; BTVER2-NEXT: retq # sched: [4:1.00] ; ; ZNVER1-LABEL: test_lea_add_scale_offset_big: Index: test/CodeGen/X86/mul-constant-i32.ll =================================================================== --- test/CodeGen/X86/mul-constant-i32.ll +++ test/CodeGen/X86/mul-constant-i32.ll @@ -1695,8 +1695,8 @@ ; X64-JAG-LABEL: test_mul_spec: ; X64-JAG: # %bb.0: ; X64-JAG-NEXT: # kill: def $edi killed $edi def $rdi -; X64-JAG-NEXT: leal 42(%rdi,%rdi,8), %ecx # sched: [1:0.50] -; X64-JAG-NEXT: leal 2(%rdi,%rdi,4), %eax # sched: [1:0.50] +; X64-JAG-NEXT: leal 42(%rdi,%rdi,8), %ecx # sched: [2:1.00] +; X64-JAG-NEXT: leal 2(%rdi,%rdi,4), %eax # sched: [2:1.00] ; X64-JAG-NEXT: imull %ecx, %eax # sched: [3:1.00] ; X64-JAG-NEXT: retq # sched: [4:1.00] ; @@ -1721,8 +1721,8 @@ ; JAG-NOOPT-LABEL: test_mul_spec: ; JAG-NOOPT: # %bb.0: ; JAG-NOOPT-NEXT: # kill: def $edi killed $edi def $rdi -; JAG-NOOPT-NEXT: leal 42(%rdi,%rdi,8), %ecx # sched: [1:0.50] -; JAG-NOOPT-NEXT: leal 2(%rdi,%rdi,4), %eax # sched: [1:0.50] +; JAG-NOOPT-NEXT: leal 42(%rdi,%rdi,8), %ecx # sched: [2:1.00] +; JAG-NOOPT-NEXT: leal 2(%rdi,%rdi,4), %eax # sched: [2:1.00] ; JAG-NOOPT-NEXT: imull %ecx, %eax # sched: [3:1.00] ; JAG-NOOPT-NEXT: retq # sched: [4:1.00] ; Index: test/CodeGen/X86/mul-constant-i64.ll =================================================================== --- test/CodeGen/X86/mul-constant-i64.ll +++ test/CodeGen/X86/mul-constant-i64.ll @@ -1800,8 +1800,8 @@ ; ; X64-JAG-LABEL: test_mul_spec: ; X64-JAG: # %bb.0: -; X64-JAG-NEXT: leaq 42(%rdi,%rdi,8), %rcx # sched: [1:0.50] -; X64-JAG-NEXT: leaq 2(%rdi,%rdi,4), %rax # sched: [1:0.50] +; X64-JAG-NEXT: leaq 42(%rdi,%rdi,8), %rcx # sched: [2:1.00] +; X64-JAG-NEXT: leaq 2(%rdi,%rdi,4), %rax # sched: [2:1.00] ; X64-JAG-NEXT: imulq %rcx, %rax # sched: [6:4.00] ; X64-JAG-NEXT: retq # sched: [4:1.00] ; @@ -1848,8 +1848,8 @@ ; ; JAG-NOOPT-LABEL: test_mul_spec: ; JAG-NOOPT: # %bb.0: -; JAG-NOOPT-NEXT: leaq 42(%rdi,%rdi,8), %rcx # sched: [1:0.50] -; JAG-NOOPT-NEXT: leaq 2(%rdi,%rdi,4), %rax # sched: [1:0.50] +; JAG-NOOPT-NEXT: leaq 42(%rdi,%rdi,8), %rcx # sched: [2:1.00] +; JAG-NOOPT-NEXT: leaq 2(%rdi,%rdi,4), %rax # sched: [2:1.00] ; JAG-NOOPT-NEXT: imulq %rcx, %rax # sched: [6:4.00] ; JAG-NOOPT-NEXT: retq # sched: [4:1.00] ; Index: test/tools/llvm-mca/X86/BtVer2/resources-lea.s =================================================================== --- test/tools/llvm-mca/X86/BtVer2/resources-lea.s +++ test/tools/llvm-mca/X86/BtVer2/resources-lea.s @@ -148,141 +148,141 @@ # CHECK-NEXT: [6]: HasSideEffects (U) # CHECK: [1] [2] [3] [4] [5] [6] Instructions: -# CHECK-NEXT: 1 1 0.50 leaw 0, %cx +# CHECK-NEXT: 1 3 2.00 leaw 0, %cx # CHECK-NEXT: 1 1 0.50 leal 0, %ecx # CHECK-NEXT: 1 1 0.50 leaq 0, %rcx -# CHECK-NEXT: 1 1 0.50 leaw (%eax), %cx +# CHECK-NEXT: 1 3 2.00 leaw (%eax), %cx # CHECK-NEXT: 1 1 0.50 leal (%eax), %ecx # CHECK-NEXT: 1 1 0.50 leaq (%eax), %rcx -# CHECK-NEXT: 1 1 0.50 leaw (%rax), %cx +# CHECK-NEXT: 1 3 2.00 leaw (%rax), %cx # CHECK-NEXT: 1 1 0.50 leal (%rax), %ecx # CHECK-NEXT: 1 1 0.50 leaq (%rax), %rcx -# CHECK-NEXT: 1 1 0.50 leaw (,%ebx), %cx +# CHECK-NEXT: 1 3 2.00 leaw (,%ebx), %cx # CHECK-NEXT: 1 1 0.50 leal (,%ebx), %ecx # CHECK-NEXT: 1 1 0.50 leaq (,%ebx), %rcx -# CHECK-NEXT: 1 1 0.50 leaw (,%rbx), %cx +# CHECK-NEXT: 1 3 2.00 leaw (,%rbx), %cx # CHECK-NEXT: 1 1 0.50 leal (,%rbx), %ecx # CHECK-NEXT: 1 1 0.50 leaq (,%rbx), %rcx -# CHECK-NEXT: 1 1 0.50 leaw (,%ebx), %cx +# CHECK-NEXT: 1 3 2.00 leaw (,%ebx), %cx # CHECK-NEXT: 1 1 0.50 leal (,%ebx), %ecx # CHECK-NEXT: 1 1 0.50 leaq (,%ebx), %rcx -# CHECK-NEXT: 1 1 0.50 leaw (,%rbx), %cx +# CHECK-NEXT: 1 3 2.00 leaw (,%rbx), %cx # CHECK-NEXT: 1 1 0.50 leal (,%rbx), %ecx # CHECK-NEXT: 1 1 0.50 leaq (,%rbx), %rcx -# CHECK-NEXT: 1 1 0.50 leaw (,%ebx,2), %cx -# CHECK-NEXT: 1 1 0.50 leal (,%ebx,2), %ecx -# CHECK-NEXT: 1 1 0.50 leaq (,%ebx,2), %rcx -# CHECK-NEXT: 1 1 0.50 leaw (,%rbx,2), %cx -# CHECK-NEXT: 1 1 0.50 leal (,%rbx,2), %ecx -# CHECK-NEXT: 1 1 0.50 leaq (,%rbx,2), %rcx -# CHECK-NEXT: 1 1 0.50 leaw (%eax,%ebx), %cx +# CHECK-NEXT: 1 3 2.00 leaw (,%ebx,2), %cx +# CHECK-NEXT: 1 2 1.00 leal (,%ebx,2), %ecx +# CHECK-NEXT: 1 2 1.00 leaq (,%ebx,2), %rcx +# CHECK-NEXT: 1 3 2.00 leaw (,%rbx,2), %cx +# CHECK-NEXT: 1 2 1.00 leal (,%rbx,2), %ecx +# CHECK-NEXT: 1 2 1.00 leaq (,%rbx,2), %rcx +# CHECK-NEXT: 1 3 2.00 leaw (%eax,%ebx), %cx # CHECK-NEXT: 1 1 0.50 leal (%eax,%ebx), %ecx # CHECK-NEXT: 1 1 0.50 leaq (%eax,%ebx), %rcx -# CHECK-NEXT: 1 1 0.50 leaw (%rax,%rbx), %cx +# CHECK-NEXT: 1 3 2.00 leaw (%rax,%rbx), %cx # CHECK-NEXT: 1 1 0.50 leal (%rax,%rbx), %ecx # CHECK-NEXT: 1 1 0.50 leaq (%rax,%rbx), %rcx -# CHECK-NEXT: 1 1 0.50 leaw (%eax,%ebx), %cx +# CHECK-NEXT: 1 3 2.00 leaw (%eax,%ebx), %cx # CHECK-NEXT: 1 1 0.50 leal (%eax,%ebx), %ecx # CHECK-NEXT: 1 1 0.50 leaq (%eax,%ebx), %rcx -# CHECK-NEXT: 1 1 0.50 leaw (%rax,%rbx), %cx +# CHECK-NEXT: 1 3 2.00 leaw (%rax,%rbx), %cx # CHECK-NEXT: 1 1 0.50 leal (%rax,%rbx), %ecx # CHECK-NEXT: 1 1 0.50 leaq (%rax,%rbx), %rcx -# CHECK-NEXT: 1 1 0.50 leaw (%eax,%ebx,2), %cx -# CHECK-NEXT: 1 1 0.50 leal (%eax,%ebx,2), %ecx -# CHECK-NEXT: 1 1 0.50 leaq (%eax,%ebx,2), %rcx -# CHECK-NEXT: 1 1 0.50 leaw (%rax,%rbx,2), %cx -# CHECK-NEXT: 1 1 0.50 leal (%rax,%rbx,2), %ecx -# CHECK-NEXT: 1 1 0.50 leaq (%rax,%rbx,2), %rcx -# CHECK-NEXT: 1 1 0.50 leaw -16, %cx +# CHECK-NEXT: 1 3 2.00 leaw (%eax,%ebx,2), %cx +# CHECK-NEXT: 1 2 1.00 leal (%eax,%ebx,2), %ecx +# CHECK-NEXT: 1 2 1.00 leaq (%eax,%ebx,2), %rcx +# CHECK-NEXT: 1 3 2.00 leaw (%rax,%rbx,2), %cx +# CHECK-NEXT: 1 2 1.00 leal (%rax,%rbx,2), %ecx +# CHECK-NEXT: 1 2 1.00 leaq (%rax,%rbx,2), %rcx +# CHECK-NEXT: 1 3 2.00 leaw -16, %cx # CHECK-NEXT: 1 1 0.50 leal -16, %ecx # CHECK-NEXT: 1 1 0.50 leaq -16, %rcx -# CHECK-NEXT: 1 1 0.50 leaw -16(%eax), %cx +# CHECK-NEXT: 1 3 2.00 leaw -16(%eax), %cx # CHECK-NEXT: 1 1 0.50 leal -16(%eax), %ecx # CHECK-NEXT: 1 1 0.50 leaq -16(%eax), %rcx -# CHECK-NEXT: 1 1 0.50 leaw -16(%rax), %cx +# CHECK-NEXT: 1 3 2.00 leaw -16(%rax), %cx # CHECK-NEXT: 1 1 0.50 leal -16(%rax), %ecx # CHECK-NEXT: 1 1 0.50 leaq -16(%rax), %rcx -# CHECK-NEXT: 1 1 0.50 leaw -16(,%ebx), %cx +# CHECK-NEXT: 1 3 2.00 leaw -16(,%ebx), %cx # CHECK-NEXT: 1 1 0.50 leal -16(,%ebx), %ecx # CHECK-NEXT: 1 1 0.50 leaq -16(,%ebx), %rcx -# CHECK-NEXT: 1 1 0.50 leaw -16(,%rbx), %cx +# CHECK-NEXT: 1 3 2.00 leaw -16(,%rbx), %cx # CHECK-NEXT: 1 1 0.50 leal -16(,%rbx), %ecx # CHECK-NEXT: 1 1 0.50 leaq -16(,%rbx), %rcx -# CHECK-NEXT: 1 1 0.50 leaw -16(,%ebx), %cx +# CHECK-NEXT: 1 3 2.00 leaw -16(,%ebx), %cx # CHECK-NEXT: 1 1 0.50 leal -16(,%ebx), %ecx # CHECK-NEXT: 1 1 0.50 leaq -16(,%ebx), %rcx -# CHECK-NEXT: 1 1 0.50 leaw -16(,%rbx), %cx +# CHECK-NEXT: 1 3 2.00 leaw -16(,%rbx), %cx # CHECK-NEXT: 1 1 0.50 leal -16(,%rbx), %ecx # CHECK-NEXT: 1 1 0.50 leaq -16(,%rbx), %rcx -# CHECK-NEXT: 1 1 0.50 leaw -16(,%ebx,2), %cx -# CHECK-NEXT: 1 1 0.50 leal -16(,%ebx,2), %ecx -# CHECK-NEXT: 1 1 0.50 leaq -16(,%ebx,2), %rcx -# CHECK-NEXT: 1 1 0.50 leaw -16(,%rbx,2), %cx -# CHECK-NEXT: 1 1 0.50 leal -16(,%rbx,2), %ecx -# CHECK-NEXT: 1 1 0.50 leaq -16(,%rbx,2), %rcx -# CHECK-NEXT: 1 1 0.50 leaw -16(%eax,%ebx), %cx -# CHECK-NEXT: 1 1 0.50 leal -16(%eax,%ebx), %ecx -# CHECK-NEXT: 1 1 0.50 leaq -16(%eax,%ebx), %rcx -# CHECK-NEXT: 1 1 0.50 leaw -16(%rax,%rbx), %cx -# CHECK-NEXT: 1 1 0.50 leal -16(%rax,%rbx), %ecx -# CHECK-NEXT: 1 1 0.50 leaq -16(%rax,%rbx), %rcx -# CHECK-NEXT: 1 1 0.50 leaw -16(%eax,%ebx), %cx -# CHECK-NEXT: 1 1 0.50 leal -16(%eax,%ebx), %ecx -# CHECK-NEXT: 1 1 0.50 leaq -16(%eax,%ebx), %rcx -# CHECK-NEXT: 1 1 0.50 leaw -16(%rax,%rbx), %cx -# CHECK-NEXT: 1 1 0.50 leal -16(%rax,%rbx), %ecx -# CHECK-NEXT: 1 1 0.50 leaq -16(%rax,%rbx), %rcx -# CHECK-NEXT: 1 1 0.50 leaw -16(%eax,%ebx,2), %cx -# CHECK-NEXT: 1 1 0.50 leal -16(%eax,%ebx,2), %ecx -# CHECK-NEXT: 1 1 0.50 leaq -16(%eax,%ebx,2), %rcx -# CHECK-NEXT: 1 1 0.50 leaw -16(%rax,%rbx,2), %cx -# CHECK-NEXT: 1 1 0.50 leal -16(%rax,%rbx,2), %ecx -# CHECK-NEXT: 1 1 0.50 leaq -16(%rax,%rbx,2), %rcx -# CHECK-NEXT: 1 1 0.50 leaw 1024, %cx +# CHECK-NEXT: 1 3 2.00 leaw -16(,%ebx,2), %cx +# CHECK-NEXT: 1 2 1.00 leal -16(,%ebx,2), %ecx +# CHECK-NEXT: 1 2 1.00 leaq -16(,%ebx,2), %rcx +# CHECK-NEXT: 1 3 2.00 leaw -16(,%rbx,2), %cx +# CHECK-NEXT: 1 2 1.00 leal -16(,%rbx,2), %ecx +# CHECK-NEXT: 1 2 1.00 leaq -16(,%rbx,2), %rcx +# CHECK-NEXT: 1 3 2.00 leaw -16(%eax,%ebx), %cx +# CHECK-NEXT: 1 2 1.00 leal -16(%eax,%ebx), %ecx +# CHECK-NEXT: 1 2 1.00 leaq -16(%eax,%ebx), %rcx +# CHECK-NEXT: 1 3 2.00 leaw -16(%rax,%rbx), %cx +# CHECK-NEXT: 1 2 1.00 leal -16(%rax,%rbx), %ecx +# CHECK-NEXT: 1 2 1.00 leaq -16(%rax,%rbx), %rcx +# CHECK-NEXT: 1 3 2.00 leaw -16(%eax,%ebx), %cx +# CHECK-NEXT: 1 2 1.00 leal -16(%eax,%ebx), %ecx +# CHECK-NEXT: 1 2 1.00 leaq -16(%eax,%ebx), %rcx +# CHECK-NEXT: 1 3 2.00 leaw -16(%rax,%rbx), %cx +# CHECK-NEXT: 1 2 1.00 leal -16(%rax,%rbx), %ecx +# CHECK-NEXT: 1 2 1.00 leaq -16(%rax,%rbx), %rcx +# CHECK-NEXT: 1 3 2.00 leaw -16(%eax,%ebx,2), %cx +# CHECK-NEXT: 1 2 1.00 leal -16(%eax,%ebx,2), %ecx +# CHECK-NEXT: 1 2 1.00 leaq -16(%eax,%ebx,2), %rcx +# CHECK-NEXT: 1 3 2.00 leaw -16(%rax,%rbx,2), %cx +# CHECK-NEXT: 1 2 1.00 leal -16(%rax,%rbx,2), %ecx +# CHECK-NEXT: 1 2 1.00 leaq -16(%rax,%rbx,2), %rcx +# CHECK-NEXT: 1 3 2.00 leaw 1024, %cx # CHECK-NEXT: 1 1 0.50 leal 1024, %ecx # CHECK-NEXT: 1 1 0.50 leaq 1024, %rcx -# CHECK-NEXT: 1 1 0.50 leaw 1024(%eax), %cx +# CHECK-NEXT: 1 3 2.00 leaw 1024(%eax), %cx # CHECK-NEXT: 1 1 0.50 leal 1024(%eax), %ecx # CHECK-NEXT: 1 1 0.50 leaq 1024(%eax), %rcx -# CHECK-NEXT: 1 1 0.50 leaw 1024(%rax), %cx +# CHECK-NEXT: 1 3 2.00 leaw 1024(%rax), %cx # CHECK-NEXT: 1 1 0.50 leal 1024(%rax), %ecx # CHECK-NEXT: 1 1 0.50 leaq 1024(%rax), %rcx -# CHECK-NEXT: 1 1 0.50 leaw 1024(,%ebx), %cx +# CHECK-NEXT: 1 3 2.00 leaw 1024(,%ebx), %cx # CHECK-NEXT: 1 1 0.50 leal 1024(,%ebx), %ecx # CHECK-NEXT: 1 1 0.50 leaq 1024(,%ebx), %rcx -# CHECK-NEXT: 1 1 0.50 leaw 1024(,%rbx), %cx +# CHECK-NEXT: 1 3 2.00 leaw 1024(,%rbx), %cx # CHECK-NEXT: 1 1 0.50 leal 1024(,%rbx), %ecx # CHECK-NEXT: 1 1 0.50 leaq 1024(,%rbx), %rcx -# CHECK-NEXT: 1 1 0.50 leaw 1024(,%ebx), %cx +# CHECK-NEXT: 1 3 2.00 leaw 1024(,%ebx), %cx # CHECK-NEXT: 1 1 0.50 leal 1024(,%ebx), %ecx # CHECK-NEXT: 1 1 0.50 leaq 1024(,%ebx), %rcx -# CHECK-NEXT: 1 1 0.50 leaw 1024(,%rbx), %cx +# CHECK-NEXT: 1 3 2.00 leaw 1024(,%rbx), %cx # CHECK-NEXT: 1 1 0.50 leal 1024(,%rbx), %ecx # CHECK-NEXT: 1 1 0.50 leaq 1024(,%rbx), %rcx -# CHECK-NEXT: 1 1 0.50 leaw 1024(,%ebx,2), %cx -# CHECK-NEXT: 1 1 0.50 leal 1024(,%ebx,2), %ecx -# CHECK-NEXT: 1 1 0.50 leaq 1024(,%ebx,2), %rcx -# CHECK-NEXT: 1 1 0.50 leaw 1024(,%rbx,2), %cx -# CHECK-NEXT: 1 1 0.50 leal 1024(,%rbx,2), %ecx -# CHECK-NEXT: 1 1 0.50 leaq 1024(,%rbx,2), %rcx -# CHECK-NEXT: 1 1 0.50 leaw 1024(%eax,%ebx), %cx -# CHECK-NEXT: 1 1 0.50 leal 1024(%eax,%ebx), %ecx -# CHECK-NEXT: 1 1 0.50 leaq 1024(%eax,%ebx), %rcx -# CHECK-NEXT: 1 1 0.50 leaw 1024(%rax,%rbx), %cx -# CHECK-NEXT: 1 1 0.50 leal 1024(%rax,%rbx), %ecx -# CHECK-NEXT: 1 1 0.50 leaq 1024(%rax,%rbx), %rcx -# CHECK-NEXT: 1 1 0.50 leaw 1024(%eax,%ebx), %cx -# CHECK-NEXT: 1 1 0.50 leal 1024(%eax,%ebx), %ecx -# CHECK-NEXT: 1 1 0.50 leaq 1024(%eax,%ebx), %rcx -# CHECK-NEXT: 1 1 0.50 leaw 1024(%rax,%rbx), %cx -# CHECK-NEXT: 1 1 0.50 leal 1024(%rax,%rbx), %ecx -# CHECK-NEXT: 1 1 0.50 leaq 1024(%rax,%rbx), %rcx -# CHECK-NEXT: 1 1 0.50 leaw 1024(%eax,%ebx,2), %cx -# CHECK-NEXT: 1 1 0.50 leal 1024(%eax,%ebx,2), %ecx -# CHECK-NEXT: 1 1 0.50 leaq 1024(%eax,%ebx,2), %rcx -# CHECK-NEXT: 1 1 0.50 leaw 1024(%rax,%rbx,2), %cx -# CHECK-NEXT: 1 1 0.50 leal 1024(%rax,%rbx,2), %ecx -# CHECK-NEXT: 1 1 0.50 leaq 1024(%rax,%rbx,2), %rcx +# CHECK-NEXT: 1 3 2.00 leaw 1024(,%ebx,2), %cx +# CHECK-NEXT: 1 2 1.00 leal 1024(,%ebx,2), %ecx +# CHECK-NEXT: 1 2 1.00 leaq 1024(,%ebx,2), %rcx +# CHECK-NEXT: 1 3 2.00 leaw 1024(,%rbx,2), %cx +# CHECK-NEXT: 1 2 1.00 leal 1024(,%rbx,2), %ecx +# CHECK-NEXT: 1 2 1.00 leaq 1024(,%rbx,2), %rcx +# CHECK-NEXT: 1 3 2.00 leaw 1024(%eax,%ebx), %cx +# CHECK-NEXT: 1 2 1.00 leal 1024(%eax,%ebx), %ecx +# CHECK-NEXT: 1 2 1.00 leaq 1024(%eax,%ebx), %rcx +# CHECK-NEXT: 1 3 2.00 leaw 1024(%rax,%rbx), %cx +# CHECK-NEXT: 1 2 1.00 leal 1024(%rax,%rbx), %ecx +# CHECK-NEXT: 1 2 1.00 leaq 1024(%rax,%rbx), %rcx +# CHECK-NEXT: 1 3 2.00 leaw 1024(%eax,%ebx), %cx +# CHECK-NEXT: 1 2 1.00 leal 1024(%eax,%ebx), %ecx +# CHECK-NEXT: 1 2 1.00 leaq 1024(%eax,%ebx), %rcx +# CHECK-NEXT: 1 3 2.00 leaw 1024(%rax,%rbx), %cx +# CHECK-NEXT: 1 2 1.00 leal 1024(%rax,%rbx), %ecx +# CHECK-NEXT: 1 2 1.00 leaq 1024(%rax,%rbx), %rcx +# CHECK-NEXT: 1 3 2.00 leaw 1024(%eax,%ebx,2), %cx +# CHECK-NEXT: 1 2 1.00 leal 1024(%eax,%ebx,2), %ecx +# CHECK-NEXT: 1 2 1.00 leaq 1024(%eax,%ebx,2), %rcx +# CHECK-NEXT: 1 3 2.00 leaw 1024(%rax,%rbx,2), %cx +# CHECK-NEXT: 1 2 1.00 leal 1024(%rax,%rbx,2), %ecx +# CHECK-NEXT: 1 2 1.00 leaq 1024(%rax,%rbx,2), %rcx # CHECK: Resources: # CHECK-NEXT: [0] - JALU0 @@ -302,142 +302,142 @@ # CHECK: Resource pressure per iteration: # CHECK-NEXT: [0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] -# CHECK-NEXT: 67.50 67.50 - - - - - - - - - - - - +# CHECK-NEXT: 115.00 155.00 - - - - - - - 40.00 - - - - # CHECK: Resource pressure by instruction: # CHECK-NEXT: [0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] Instructions: -# CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leaw 0, %cx +# CHECK-NEXT: 2.00 2.00 - - - - - - - - - - - - leaw 0, %cx # CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leal 0, %ecx # CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leaq 0, %rcx -# CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leaw (%eax), %cx +# CHECK-NEXT: 2.00 2.00 - - - - - - - - - - - - leaw (%eax), %cx # CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leal (%eax), %ecx # CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leaq (%eax), %rcx -# CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leaw (%rax), %cx +# CHECK-NEXT: 2.00 2.00 - - - - - - - - - - - - leaw (%rax), %cx # CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leal (%rax), %ecx # CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leaq (%rax), %rcx -# CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leaw (,%ebx), %cx +# CHECK-NEXT: 2.00 2.00 - - - - - - - - - - - - leaw (,%ebx), %cx # CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leal (,%ebx), %ecx # CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leaq (,%ebx), %rcx -# CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leaw (,%rbx), %cx +# CHECK-NEXT: 2.00 2.00 - - - - - - - - - - - - leaw (,%rbx), %cx # CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leal (,%rbx), %ecx # CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leaq (,%rbx), %rcx -# CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leaw (,%ebx), %cx +# CHECK-NEXT: 2.00 2.00 - - - - - - - - - - - - leaw (,%ebx), %cx # CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leal (,%ebx), %ecx # CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leaq (,%ebx), %rcx -# CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leaw (,%rbx), %cx +# CHECK-NEXT: 2.00 2.00 - - - - - - - - - - - - leaw (,%rbx), %cx # CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leal (,%rbx), %ecx # CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leaq (,%rbx), %rcx -# CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leaw (,%ebx,2), %cx -# CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leal (,%ebx,2), %ecx -# CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leaq (,%ebx,2), %rcx -# CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leaw (,%rbx,2), %cx -# CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leal (,%rbx,2), %ecx -# CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leaq (,%rbx,2), %rcx -# CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leaw (%eax,%ebx), %cx +# CHECK-NEXT: 2.00 2.00 - - - - - - - - - - - - leaw (,%ebx,2), %cx +# CHECK-NEXT: - 1.00 - - - - - - - 1.00 - - - - leal (,%ebx,2), %ecx +# CHECK-NEXT: - 1.00 - - - - - - - 1.00 - - - - leaq (,%ebx,2), %rcx +# CHECK-NEXT: 2.00 2.00 - - - - - - - - - - - - leaw (,%rbx,2), %cx +# CHECK-NEXT: - 1.00 - - - - - - - 1.00 - - - - leal (,%rbx,2), %ecx +# CHECK-NEXT: - 1.00 - - - - - - - 1.00 - - - - leaq (,%rbx,2), %rcx +# CHECK-NEXT: 2.00 2.00 - - - - - - - - - - - - leaw (%eax,%ebx), %cx # CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leal (%eax,%ebx), %ecx # CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leaq (%eax,%ebx), %rcx -# CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leaw (%rax,%rbx), %cx +# CHECK-NEXT: 2.00 2.00 - - - - - - - - - - - - leaw (%rax,%rbx), %cx # CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leal (%rax,%rbx), %ecx # CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leaq (%rax,%rbx), %rcx -# CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leaw (%eax,%ebx), %cx +# CHECK-NEXT: 2.00 2.00 - - - - - - - - - - - - leaw (%eax,%ebx), %cx # CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leal (%eax,%ebx), %ecx # CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leaq (%eax,%ebx), %rcx -# CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leaw (%rax,%rbx), %cx +# CHECK-NEXT: 2.00 2.00 - - - - - - - - - - - - leaw (%rax,%rbx), %cx # CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leal (%rax,%rbx), %ecx # CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leaq (%rax,%rbx), %rcx -# CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leaw (%eax,%ebx,2), %cx -# CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leal (%eax,%ebx,2), %ecx -# CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leaq (%eax,%ebx,2), %rcx -# CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leaw (%rax,%rbx,2), %cx -# CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leal (%rax,%rbx,2), %ecx -# CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leaq (%rax,%rbx,2), %rcx -# CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leaw -16, %cx +# CHECK-NEXT: 2.00 2.00 - - - - - - - - - - - - leaw (%eax,%ebx,2), %cx +# CHECK-NEXT: - 1.00 - - - - - - - 1.00 - - - - leal (%eax,%ebx,2), %ecx +# CHECK-NEXT: - 1.00 - - - - - - - 1.00 - - - - leaq (%eax,%ebx,2), %rcx +# CHECK-NEXT: 2.00 2.00 - - - - - - - - - - - - leaw (%rax,%rbx,2), %cx +# CHECK-NEXT: - 1.00 - - - - - - - 1.00 - - - - leal (%rax,%rbx,2), %ecx +# CHECK-NEXT: - 1.00 - - - - - - - 1.00 - - - - leaq (%rax,%rbx,2), %rcx +# CHECK-NEXT: 2.00 2.00 - - - - - - - - - - - - leaw -16, %cx # CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leal -16, %ecx # CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leaq -16, %rcx -# CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leaw -16(%eax), %cx +# CHECK-NEXT: 2.00 2.00 - - - - - - - - - - - - leaw -16(%eax), %cx # CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leal -16(%eax), %ecx # CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leaq -16(%eax), %rcx -# CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leaw -16(%rax), %cx +# CHECK-NEXT: 2.00 2.00 - - - - - - - - - - - - leaw -16(%rax), %cx # CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leal -16(%rax), %ecx # CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leaq -16(%rax), %rcx -# CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leaw -16(,%ebx), %cx +# CHECK-NEXT: 2.00 2.00 - - - - - - - - - - - - leaw -16(,%ebx), %cx # CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leal -16(,%ebx), %ecx # CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leaq -16(,%ebx), %rcx -# CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leaw -16(,%rbx), %cx +# CHECK-NEXT: 2.00 2.00 - - - - - - - - - - - - leaw -16(,%rbx), %cx # CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leal -16(,%rbx), %ecx # CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leaq -16(,%rbx), %rcx -# CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leaw -16(,%ebx), %cx +# CHECK-NEXT: 2.00 2.00 - - - - - - - - - - - - leaw -16(,%ebx), %cx # CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leal -16(,%ebx), %ecx # CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leaq -16(,%ebx), %rcx -# CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leaw -16(,%rbx), %cx +# CHECK-NEXT: 2.00 2.00 - - - - - - - - - - - - leaw -16(,%rbx), %cx # CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leal -16(,%rbx), %ecx # CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leaq -16(,%rbx), %rcx -# CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leaw -16(,%ebx,2), %cx -# CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leal -16(,%ebx,2), %ecx -# CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leaq -16(,%ebx,2), %rcx -# CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leaw -16(,%rbx,2), %cx -# CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leal -16(,%rbx,2), %ecx -# CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leaq -16(,%rbx,2), %rcx -# CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leaw -16(%eax,%ebx), %cx -# CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leal -16(%eax,%ebx), %ecx -# CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leaq -16(%eax,%ebx), %rcx -# CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leaw -16(%rax,%rbx), %cx -# CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leal -16(%rax,%rbx), %ecx -# CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leaq -16(%rax,%rbx), %rcx -# CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leaw -16(%eax,%ebx), %cx -# CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leal -16(%eax,%ebx), %ecx -# CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leaq -16(%eax,%ebx), %rcx -# CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leaw -16(%rax,%rbx), %cx -# CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leal -16(%rax,%rbx), %ecx -# CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leaq -16(%rax,%rbx), %rcx -# CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leaw -16(%eax,%ebx,2), %cx -# CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leal -16(%eax,%ebx,2), %ecx -# CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leaq -16(%eax,%ebx,2), %rcx -# CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leaw -16(%rax,%rbx,2), %cx -# CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leal -16(%rax,%rbx,2), %ecx -# CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leaq -16(%rax,%rbx,2), %rcx -# CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leaw 1024, %cx +# CHECK-NEXT: 2.00 2.00 - - - - - - - - - - - - leaw -16(,%ebx,2), %cx +# CHECK-NEXT: - 1.00 - - - - - - - 1.00 - - - - leal -16(,%ebx,2), %ecx +# CHECK-NEXT: - 1.00 - - - - - - - 1.00 - - - - leaq -16(,%ebx,2), %rcx +# CHECK-NEXT: 2.00 2.00 - - - - - - - - - - - - leaw -16(,%rbx,2), %cx +# CHECK-NEXT: - 1.00 - - - - - - - 1.00 - - - - leal -16(,%rbx,2), %ecx +# CHECK-NEXT: - 1.00 - - - - - - - 1.00 - - - - leaq -16(,%rbx,2), %rcx +# CHECK-NEXT: 2.00 2.00 - - - - - - - - - - - - leaw -16(%eax,%ebx), %cx +# CHECK-NEXT: - 1.00 - - - - - - - 1.00 - - - - leal -16(%eax,%ebx), %ecx +# CHECK-NEXT: - 1.00 - - - - - - - 1.00 - - - - leaq -16(%eax,%ebx), %rcx +# CHECK-NEXT: 2.00 2.00 - - - - - - - - - - - - leaw -16(%rax,%rbx), %cx +# CHECK-NEXT: - 1.00 - - - - - - - 1.00 - - - - leal -16(%rax,%rbx), %ecx +# CHECK-NEXT: - 1.00 - - - - - - - 1.00 - - - - leaq -16(%rax,%rbx), %rcx +# CHECK-NEXT: 2.00 2.00 - - - - - - - - - - - - leaw -16(%eax,%ebx), %cx +# CHECK-NEXT: - 1.00 - - - - - - - 1.00 - - - - leal -16(%eax,%ebx), %ecx +# CHECK-NEXT: - 1.00 - - - - - - - 1.00 - - - - leaq -16(%eax,%ebx), %rcx +# CHECK-NEXT: 2.00 2.00 - - - - - - - - - - - - leaw -16(%rax,%rbx), %cx +# CHECK-NEXT: - 1.00 - - - - - - - 1.00 - - - - leal -16(%rax,%rbx), %ecx +# CHECK-NEXT: - 1.00 - - - - - - - 1.00 - - - - leaq -16(%rax,%rbx), %rcx +# CHECK-NEXT: 2.00 2.00 - - - - - - - - - - - - leaw -16(%eax,%ebx,2), %cx +# CHECK-NEXT: - 1.00 - - - - - - - 1.00 - - - - leal -16(%eax,%ebx,2), %ecx +# CHECK-NEXT: - 1.00 - - - - - - - 1.00 - - - - leaq -16(%eax,%ebx,2), %rcx +# CHECK-NEXT: 2.00 2.00 - - - - - - - - - - - - leaw -16(%rax,%rbx,2), %cx +# CHECK-NEXT: - 1.00 - - - - - - - 1.00 - - - - leal -16(%rax,%rbx,2), %ecx +# CHECK-NEXT: - 1.00 - - - - - - - 1.00 - - - - leaq -16(%rax,%rbx,2), %rcx +# CHECK-NEXT: 2.00 2.00 - - - - - - - - - - - - leaw 1024, %cx # CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leal 1024, %ecx # CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leaq 1024, %rcx -# CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leaw 1024(%eax), %cx +# CHECK-NEXT: 2.00 2.00 - - - - - - - - - - - - leaw 1024(%eax), %cx # CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leal 1024(%eax), %ecx # CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leaq 1024(%eax), %rcx -# CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leaw 1024(%rax), %cx +# CHECK-NEXT: 2.00 2.00 - - - - - - - - - - - - leaw 1024(%rax), %cx # CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leal 1024(%rax), %ecx # CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leaq 1024(%rax), %rcx -# CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leaw 1024(,%ebx), %cx +# CHECK-NEXT: 2.00 2.00 - - - - - - - - - - - - leaw 1024(,%ebx), %cx # CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leal 1024(,%ebx), %ecx # CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leaq 1024(,%ebx), %rcx -# CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leaw 1024(,%rbx), %cx +# CHECK-NEXT: 2.00 2.00 - - - - - - - - - - - - leaw 1024(,%rbx), %cx # CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leal 1024(,%rbx), %ecx # CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leaq 1024(,%rbx), %rcx -# CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leaw 1024(,%ebx), %cx +# CHECK-NEXT: 2.00 2.00 - - - - - - - - - - - - leaw 1024(,%ebx), %cx # CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leal 1024(,%ebx), %ecx # CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leaq 1024(,%ebx), %rcx -# CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leaw 1024(,%rbx), %cx +# CHECK-NEXT: 2.00 2.00 - - - - - - - - - - - - leaw 1024(,%rbx), %cx # CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leal 1024(,%rbx), %ecx # CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leaq 1024(,%rbx), %rcx -# CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leaw 1024(,%ebx,2), %cx -# CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leal 1024(,%ebx,2), %ecx -# CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leaq 1024(,%ebx,2), %rcx -# CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leaw 1024(,%rbx,2), %cx -# CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leal 1024(,%rbx,2), %ecx -# CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leaq 1024(,%rbx,2), %rcx -# CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leaw 1024(%eax,%ebx), %cx -# CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leal 1024(%eax,%ebx), %ecx -# CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leaq 1024(%eax,%ebx), %rcx -# CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leaw 1024(%rax,%rbx), %cx -# CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leal 1024(%rax,%rbx), %ecx -# CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leaq 1024(%rax,%rbx), %rcx -# CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leaw 1024(%eax,%ebx), %cx -# CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leal 1024(%eax,%ebx), %ecx -# CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leaq 1024(%eax,%ebx), %rcx -# CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leaw 1024(%rax,%rbx), %cx -# CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leal 1024(%rax,%rbx), %ecx -# CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leaq 1024(%rax,%rbx), %rcx -# CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leaw 1024(%eax,%ebx,2), %cx -# CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leal 1024(%eax,%ebx,2), %ecx -# CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leaq 1024(%eax,%ebx,2), %rcx -# CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leaw 1024(%rax,%rbx,2), %cx -# CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leal 1024(%rax,%rbx,2), %ecx -# CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - leaq 1024(%rax,%rbx,2), %rcx +# CHECK-NEXT: 2.00 2.00 - - - - - - - - - - - - leaw 1024(,%ebx,2), %cx +# CHECK-NEXT: - 1.00 - - - - - - - 1.00 - - - - leal 1024(,%ebx,2), %ecx +# CHECK-NEXT: - 1.00 - - - - - - - 1.00 - - - - leaq 1024(,%ebx,2), %rcx +# CHECK-NEXT: 2.00 2.00 - - - - - - - - - - - - leaw 1024(,%rbx,2), %cx +# CHECK-NEXT: - 1.00 - - - - - - - 1.00 - - - - leal 1024(,%rbx,2), %ecx +# CHECK-NEXT: - 1.00 - - - - - - - 1.00 - - - - leaq 1024(,%rbx,2), %rcx +# CHECK-NEXT: 2.00 2.00 - - - - - - - - - - - - leaw 1024(%eax,%ebx), %cx +# CHECK-NEXT: - 1.00 - - - - - - - 1.00 - - - - leal 1024(%eax,%ebx), %ecx +# CHECK-NEXT: - 1.00 - - - - - - - 1.00 - - - - leaq 1024(%eax,%ebx), %rcx +# CHECK-NEXT: 2.00 2.00 - - - - - - - - - - - - leaw 1024(%rax,%rbx), %cx +# CHECK-NEXT: - 1.00 - - - - - - - 1.00 - - - - leal 1024(%rax,%rbx), %ecx +# CHECK-NEXT: - 1.00 - - - - - - - 1.00 - - - - leaq 1024(%rax,%rbx), %rcx +# CHECK-NEXT: 2.00 2.00 - - - - - - - - - - - - leaw 1024(%eax,%ebx), %cx +# CHECK-NEXT: - 1.00 - - - - - - - 1.00 - - - - leal 1024(%eax,%ebx), %ecx +# CHECK-NEXT: - 1.00 - - - - - - - 1.00 - - - - leaq 1024(%eax,%ebx), %rcx +# CHECK-NEXT: 2.00 2.00 - - - - - - - - - - - - leaw 1024(%rax,%rbx), %cx +# CHECK-NEXT: - 1.00 - - - - - - - 1.00 - - - - leal 1024(%rax,%rbx), %ecx +# CHECK-NEXT: - 1.00 - - - - - - - 1.00 - - - - leaq 1024(%rax,%rbx), %rcx +# CHECK-NEXT: 2.00 2.00 - - - - - - - - - - - - leaw 1024(%eax,%ebx,2), %cx +# CHECK-NEXT: - 1.00 - - - - - - - 1.00 - - - - leal 1024(%eax,%ebx,2), %ecx +# CHECK-NEXT: - 1.00 - - - - - - - 1.00 - - - - leaq 1024(%eax,%ebx,2), %rcx +# CHECK-NEXT: 2.00 2.00 - - - - - - - - - - - - leaw 1024(%rax,%rbx,2), %cx +# CHECK-NEXT: - 1.00 - - - - - - - 1.00 - - - - leal 1024(%rax,%rbx,2), %ecx +# CHECK-NEXT: - 1.00 - - - - - - - 1.00 - - - - leaq 1024(%rax,%rbx,2), %rcx Index: utils/TableGen/PredicateExpander.h =================================================================== --- utils/TableGen/PredicateExpander.h +++ utils/TableGen/PredicateExpander.h @@ -73,6 +73,7 @@ StringRef MethodName); void expandCheckIsRegOperand(formatted_raw_ostream &OS, int OpIndex); void expandCheckIsImmOperand(formatted_raw_ostream &OS, int OpIndex); + void expandCheckInvalidRegOperand(formatted_raw_ostream &OS, int OpIndex); void expandCheckFunctionPredicate(formatted_raw_ostream &OS, StringRef MCInstFn, StringRef MachineInstrFn); Index: utils/TableGen/PredicateExpander.cpp =================================================================== --- utils/TableGen/PredicateExpander.cpp +++ utils/TableGen/PredicateExpander.cpp @@ -44,6 +44,12 @@ OS << Reg->getName(); } +void PredicateExpander::expandCheckInvalidRegOperand(formatted_raw_ostream &OS, + int OpIndex) { + OS << "MI" << (isByRef() ? "." : "->") << "getOperand(" << OpIndex + << ").getReg() " << (shouldNegate() ? "!= " : "== ") << "0"; +} + void PredicateExpander::expandCheckSameRegOperand(formatted_raw_ostream &OS, int First, int Second) { OS << "MI" << (isByRef() ? "." : "->") << "getOperand(" << First @@ -206,6 +212,9 @@ return expandCheckRegOperand(OS, Rec->getValueAsInt("OpIndex"), Rec->getValueAsDef("Reg")); + if (Rec->isSubClassOf("CheckInvalidRegOperand")) + return expandCheckInvalidRegOperand(OS, Rec->getValueAsInt("OpIndex")); + if (Rec->isSubClassOf("CheckImmOperand")) return expandCheckImmOperand(OS, Rec->getValueAsInt("OpIndex"), Rec->getValueAsInt("ImmVal"));