Most BMI ops are 2uop and 0.5 throughput - interestingly TZCNTrm doesn't take an extra uop but the other instructions do
Confirmed by AMD SoG + Agner
defm : ZnWriteResPair<WriteBSF, [ZnALU], 3, [12], 6, 4, 2>;
defm : ZnWriteResPair<WriteBSR, [ZnALU], 4, [16], 6, 4, 2>;
defm : ZnWriteResPair<WriteLZCNT, [ZnALU], 2>;
-defm : ZnWriteResPair<WriteTZCNT, [ZnALU], 2>;
+defm : ZnWriteResPair<WriteTZCNT, [ZnALU], 2, [2], 2, 4, 0>;
defm : ZnWriteResPair<WritePOPCNT, [ZnALU], 1>;
// Treat misc copies as a move.
def : InstRW<[WriteMove], (instrs COPY)>;
// BMI1 BEXTR, BMI2 BZHI
-defm : ZnWriteResPair<WriteBEXTR, [ZnALU], 1>;
-defm : ZnWriteResPair<WriteBLS, [ZnALU], 2, [1], 2, 4, 1>;
+defm : ZnWriteResPair<WriteBEXTR, [ZnALU], 1, [1], 1, 4, 1>;
+defm : ZnWriteResPair<WriteBLS, [ZnALU], 2, [2], 2, 4, 1>;
defm : ZnWriteResPair<WriteBZHI, [ZnALU], 1>;
// IDIV
}
def : InstRW<[ZnWritePUSH], (instregex "PUSH(16|32)rmm")>;
-//PUSHF
+// PUSHF
def : InstRW<[WriteMicrocoded], (instregex "PUSHF(16|32)")>;
// PUSHA.
defm : Zn2WriteResPair<WriteBSF, [Zn2ALU], 3, [12], 6, 4, 2>;
defm : Zn2WriteResPair<WriteBSR, [Zn2ALU], 4, [16], 6, 4, 2>;
defm : Zn2WriteResPair<WriteLZCNT, [Zn2ALU], 1>;
-defm : Zn2WriteResPair<WriteTZCNT, [Zn2ALU], 2>;
+defm : Zn2WriteResPair<WriteTZCNT, [Zn2ALU], 2, [2], 2, 4, 0>;
defm : Zn2WriteResPair<WritePOPCNT, [Zn2ALU], 1>;
// Treat misc copies as a move.
def : InstRW<[WriteMove], (instrs COPY)>;
// BMI1 BEXTR, BMI2 BZHI
-defm : Zn2WriteResPair<WriteBEXTR, [Zn2ALU], 1>;
-defm : Zn2WriteResPair<WriteBLS, [Zn2ALU], 2, [1], 2, 4, 1>;
+defm : Zn2WriteResPair<WriteBEXTR, [Zn2ALU], 1, [1], 1, 4, 1>;
+defm : Zn2WriteResPair<WriteBLS, [Zn2ALU], 2, [2], 2, 4, 1>;
defm : Zn2WriteResPair<WriteBZHI, [Zn2ALU], 1>;
// IDIV
}
def : InstRW<[Zn2WritePUSH], (instregex "PUSH(16|32)rmm")>;
-//PUSHF
+// PUSHF
def : InstRW<[WriteMicrocoded], (instregex "PUSHF(16|32)")>;
// PUSHA.
# CHECK-NEXT: 2 5 0.50 * bextrl %eax, (%rbx), %ecx
# CHECK-NEXT: 1 1 0.25 bextrq %rax, %rbx, %rcx
# CHECK-NEXT: 2 5 0.50 * bextrq %rax, (%rbx), %rcx
-# CHECK-NEXT: 2 2 0.25 blsil %eax, %ecx
+# CHECK-NEXT: 2 2 0.50 blsil %eax, %ecx
# CHECK-NEXT: 3 6 0.50 * blsil (%rax), %ecx
-# CHECK-NEXT: 2 2 0.25 blsiq %rax, %rcx
+# CHECK-NEXT: 2 2 0.50 blsiq %rax, %rcx
# CHECK-NEXT: 3 6 0.50 * blsiq (%rax), %rcx
-# CHECK-NEXT: 2 2 0.25 blsmskl %eax, %ecx
+# CHECK-NEXT: 2 2 0.50 blsmskl %eax, %ecx
# CHECK-NEXT: 3 6 0.50 * blsmskl (%rax), %ecx
-# CHECK-NEXT: 2 2 0.25 blsmskq %rax, %rcx
+# CHECK-NEXT: 2 2 0.50 blsmskq %rax, %rcx
# CHECK-NEXT: 3 6 0.50 * blsmskq (%rax), %rcx
-# CHECK-NEXT: 2 2 0.25 blsrl %eax, %ecx
+# CHECK-NEXT: 2 2 0.50 blsrl %eax, %ecx
# CHECK-NEXT: 3 6 0.50 * blsrl (%rax), %ecx
-# CHECK-NEXT: 2 2 0.25 blsrq %rax, %rcx
+# CHECK-NEXT: 2 2 0.50 blsrq %rax, %rcx
# CHECK-NEXT: 3 6 0.50 * blsrq (%rax), %rcx
-# CHECK-NEXT: 1 2 0.25 tzcntw %ax, %cx
+# CHECK-NEXT: 2 2 0.50 tzcntw %ax, %cx
# CHECK-NEXT: 2 6 0.50 * tzcntw (%rax), %cx
-# CHECK-NEXT: 1 2 0.25 tzcntl %eax, %ecx
+# CHECK-NEXT: 2 2 0.50 tzcntl %eax, %ecx
# CHECK-NEXT: 2 6 0.50 * tzcntl (%rax), %ecx
-# CHECK-NEXT: 1 2 0.25 tzcntq %rax, %rcx
+# CHECK-NEXT: 2 2 0.50 tzcntq %rax, %rcx
# CHECK-NEXT: 2 6 0.50 * tzcntq (%rax), %rcx
# CHECK: Resources:
# CHECK: Resource pressure per iteration:
# CHECK-NEXT: [0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11]
-# CHECK-NEXT: 6.50 6.50 6.50 6.50 6.50 6.50 - - - - - -
+# CHECK-NEXT: 6.50 6.50 11.00 11.00 11.00 11.00 - - - - - -
# CHECK: Resource pressure by instruction:
# CHECK-NEXT: [0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] Instructions:
# CHECK-NEXT: 0.50 0.50 0.25 0.25 0.25 0.25 - - - - - - bextrl %eax, (%rbx), %ecx
# CHECK-NEXT: - - 0.25 0.25 0.25 0.25 - - - - - - bextrq %rax, %rbx, %rcx
# CHECK-NEXT: 0.50 0.50 0.25 0.25 0.25 0.25 - - - - - - bextrq %rax, (%rbx), %rcx
-# CHECK-NEXT: - - 0.25 0.25 0.25 0.25 - - - - - - blsil %eax, %ecx
-# CHECK-NEXT: 0.50 0.50 0.25 0.25 0.25 0.25 - - - - - - blsil (%rax), %ecx
-# CHECK-NEXT: - - 0.25 0.25 0.25 0.25 - - - - - - blsiq %rax, %rcx
-# CHECK-NEXT: 0.50 0.50 0.25 0.25 0.25 0.25 - - - - - - blsiq (%rax), %rcx
-# CHECK-NEXT: - - 0.25 0.25 0.25 0.25 - - - - - - blsmskl %eax, %ecx
-# CHECK-NEXT: 0.50 0.50 0.25 0.25 0.25 0.25 - - - - - - blsmskl (%rax), %ecx
-# CHECK-NEXT: - - 0.25 0.25 0.25 0.25 - - - - - - blsmskq %rax, %rcx
-# CHECK-NEXT: 0.50 0.50 0.25 0.25 0.25 0.25 - - - - - - blsmskq (%rax), %rcx
-# CHECK-NEXT: - - 0.25 0.25 0.25 0.25 - - - - - - blsrl %eax, %ecx
-# CHECK-NEXT: 0.50 0.50 0.25 0.25 0.25 0.25 - - - - - - blsrl (%rax), %ecx
-# CHECK-NEXT: - - 0.25 0.25 0.25 0.25 - - - - - - blsrq %rax, %rcx
-# CHECK-NEXT: 0.50 0.50 0.25 0.25 0.25 0.25 - - - - - - blsrq (%rax), %rcx
-# CHECK-NEXT: - - 0.25 0.25 0.25 0.25 - - - - - - tzcntw %ax, %cx
-# CHECK-NEXT: 0.50 0.50 0.25 0.25 0.25 0.25 - - - - - - tzcntw (%rax), %cx
-# CHECK-NEXT: - - 0.25 0.25 0.25 0.25 - - - - - - tzcntl %eax, %ecx
-# CHECK-NEXT: 0.50 0.50 0.25 0.25 0.25 0.25 - - - - - - tzcntl (%rax), %ecx
-# CHECK-NEXT: - - 0.25 0.25 0.25 0.25 - - - - - - tzcntq %rax, %rcx
-# CHECK-NEXT: 0.50 0.50 0.25 0.25 0.25 0.25 - - - - - - tzcntq (%rax), %rcx
+# CHECK-NEXT: - - 0.50 0.50 0.50 0.50 - - - - - - blsil %eax, %ecx
+# CHECK-NEXT: 0.50 0.50 0.50 0.50 0.50 0.50 - - - - - - blsil (%rax), %ecx
+# CHECK-NEXT: - - 0.50 0.50 0.50 0.50 - - - - - - blsiq %rax, %rcx
+# CHECK-NEXT: 0.50 0.50 0.50 0.50 0.50 0.50 - - - - - - blsiq (%rax), %rcx
+# CHECK-NEXT: - - 0.50 0.50 0.50 0.50 - - - - - - blsmskl %eax, %ecx
+# CHECK-NEXT: 0.50 0.50 0.50 0.50 0.50 0.50 - - - - - - blsmskl (%rax), %ecx
+# CHECK-NEXT: - - 0.50 0.50 0.50 0.50 - - - - - - blsmskq %rax, %rcx
+# CHECK-NEXT: 0.50 0.50 0.50 0.50 0.50 0.50 - - - - - - blsmskq (%rax), %rcx
+# CHECK-NEXT: - - 0.50 0.50 0.50 0.50 - - - - - - blsrl %eax, %ecx
+# CHECK-NEXT: 0.50 0.50 0.50 0.50 0.50 0.50 - - - - - - blsrl (%rax), %ecx
+# CHECK-NEXT: - - 0.50 0.50 0.50 0.50 - - - - - - blsrq %rax, %rcx
+# CHECK-NEXT: 0.50 0.50 0.50 0.50 0.50 0.50 - - - - - - blsrq (%rax), %rcx
+# CHECK-NEXT: - - 0.50 0.50 0.50 0.50 - - - - - - tzcntw %ax, %cx
+# CHECK-NEXT: 0.50 0.50 0.50 0.50 0.50 0.50 - - - - - - tzcntw (%rax), %cx
+# CHECK-NEXT: - - 0.50 0.50 0.50 0.50 - - - - - - tzcntl %eax, %ecx
+# CHECK-NEXT: 0.50 0.50 0.50 0.50 0.50 0.50 - - - - - - tzcntl (%rax), %ecx
+# CHECK-NEXT: - - 0.50 0.50 0.50 0.50 - - - - - - tzcntq %rax, %rcx
+# CHECK-NEXT: 0.50 0.50 0.50 0.50 0.50 0.50 - - - - - - tzcntq (%rax), %rcx
# CHECK-NEXT: 2 5 0.33 * bextrl %eax, (%rbx), %ecx
# CHECK-NEXT: 1 1 0.25 bextrq %rax, %rbx, %rcx
# CHECK-NEXT: 2 5 0.33 * bextrq %rax, (%rbx), %rcx
-# CHECK-NEXT: 2 2 0.25 blsil %eax, %ecx
-# CHECK-NEXT: 3 6 0.33 * blsil (%rax), %ecx
-# CHECK-NEXT: 2 2 0.25 blsiq %rax, %rcx
-# CHECK-NEXT: 3 6 0.33 * blsiq (%rax), %rcx
-# CHECK-NEXT: 2 2 0.25 blsmskl %eax, %ecx
-# CHECK-NEXT: 3 6 0.33 * blsmskl (%rax), %ecx
-# CHECK-NEXT: 2 2 0.25 blsmskq %rax, %rcx
-# CHECK-NEXT: 3 6 0.33 * blsmskq (%rax), %rcx
-# CHECK-NEXT: 2 2 0.25 blsrl %eax, %ecx
-# CHECK-NEXT: 3 6 0.33 * blsrl (%rax), %ecx
-# CHECK-NEXT: 2 2 0.25 blsrq %rax, %rcx
-# CHECK-NEXT: 3 6 0.33 * blsrq (%rax), %rcx
-# CHECK-NEXT: 1 2 0.25 tzcntw %ax, %cx
-# CHECK-NEXT: 2 6 0.33 * tzcntw (%rax), %cx
-# CHECK-NEXT: 1 2 0.25 tzcntl %eax, %ecx
-# CHECK-NEXT: 2 6 0.33 * tzcntl (%rax), %ecx
-# CHECK-NEXT: 1 2 0.25 tzcntq %rax, %rcx
-# CHECK-NEXT: 2 6 0.33 * tzcntq (%rax), %rcx
+# CHECK-NEXT: 2 2 0.50 blsil %eax, %ecx
+# CHECK-NEXT: 3 6 0.50 * blsil (%rax), %ecx
+# CHECK-NEXT: 2 2 0.50 blsiq %rax, %rcx
+# CHECK-NEXT: 3 6 0.50 * blsiq (%rax), %rcx
+# CHECK-NEXT: 2 2 0.50 blsmskl %eax, %ecx
+# CHECK-NEXT: 3 6 0.50 * blsmskl (%rax), %ecx
+# CHECK-NEXT: 2 2 0.50 blsmskq %rax, %rcx
+# CHECK-NEXT: 3 6 0.50 * blsmskq (%rax), %rcx
+# CHECK-NEXT: 2 2 0.50 blsrl %eax, %ecx
+# CHECK-NEXT: 3 6 0.50 * blsrl (%rax), %ecx
+# CHECK-NEXT: 2 2 0.50 blsrq %rax, %rcx
+# CHECK-NEXT: 3 6 0.50 * blsrq (%rax), %rcx
+# CHECK-NEXT: 2 2 0.50 tzcntw %ax, %cx
+# CHECK-NEXT: 2 6 0.50 * tzcntw (%rax), %cx
+# CHECK-NEXT: 2 2 0.50 tzcntl %eax, %ecx
+# CHECK-NEXT: 2 6 0.50 * tzcntl (%rax), %ecx
+# CHECK-NEXT: 2 2 0.50 tzcntq %rax, %rcx
+# CHECK-NEXT: 2 6 0.50 * tzcntq (%rax), %rcx
# CHECK: Resources:
# CHECK-NEXT: [0] - Zn2AGU0
# CHECK: Resource pressure per iteration:
# CHECK-NEXT: [0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12]
-# CHECK-NEXT: 4.33 4.33 4.33 6.50 6.50 6.50 6.50 - - - - - -
+# CHECK-NEXT: 4.33 4.33 4.33 11.00 11.00 11.00 11.00 - - - - - -
# CHECK: Resource pressure by instruction:
# CHECK-NEXT: [0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] Instructions:
# CHECK-NEXT: 0.33 0.33 0.33 0.25 0.25 0.25 0.25 - - - - - - bextrl %eax, (%rbx), %ecx
# CHECK-NEXT: - - - 0.25 0.25 0.25 0.25 - - - - - - bextrq %rax, %rbx, %rcx
# CHECK-NEXT: 0.33 0.33 0.33 0.25 0.25 0.25 0.25 - - - - - - bextrq %rax, (%rbx), %rcx
-# CHECK-NEXT: - - - 0.25 0.25 0.25 0.25 - - - - - - blsil %eax, %ecx
-# CHECK-NEXT: 0.33 0.33 0.33 0.25 0.25 0.25 0.25 - - - - - - blsil (%rax), %ecx
-# CHECK-NEXT: - - - 0.25 0.25 0.25 0.25 - - - - - - blsiq %rax, %rcx
-# CHECK-NEXT: 0.33 0.33 0.33 0.25 0.25 0.25 0.25 - - - - - - blsiq (%rax), %rcx
-# CHECK-NEXT: - - - 0.25 0.25 0.25 0.25 - - - - - - blsmskl %eax, %ecx
-# CHECK-NEXT: 0.33 0.33 0.33 0.25 0.25 0.25 0.25 - - - - - - blsmskl (%rax), %ecx
-# CHECK-NEXT: - - - 0.25 0.25 0.25 0.25 - - - - - - blsmskq %rax, %rcx
-# CHECK-NEXT: 0.33 0.33 0.33 0.25 0.25 0.25 0.25 - - - - - - blsmskq (%rax), %rcx
-# CHECK-NEXT: - - - 0.25 0.25 0.25 0.25 - - - - - - blsrl %eax, %ecx
-# CHECK-NEXT: 0.33 0.33 0.33 0.25 0.25 0.25 0.25 - - - - - - blsrl (%rax), %ecx
-# CHECK-NEXT: - - - 0.25 0.25 0.25 0.25 - - - - - - blsrq %rax, %rcx
-# CHECK-NEXT: 0.33 0.33 0.33 0.25 0.25 0.25 0.25 - - - - - - blsrq (%rax), %rcx
-# CHECK-NEXT: - - - 0.25 0.25 0.25 0.25 - - - - - - tzcntw %ax, %cx
-# CHECK-NEXT: 0.33 0.33 0.33 0.25 0.25 0.25 0.25 - - - - - - tzcntw (%rax), %cx
-# CHECK-NEXT: - - - 0.25 0.25 0.25 0.25 - - - - - - tzcntl %eax, %ecx
-# CHECK-NEXT: 0.33 0.33 0.33 0.25 0.25 0.25 0.25 - - - - - - tzcntl (%rax), %ecx
-# CHECK-NEXT: - - - 0.25 0.25 0.25 0.25 - - - - - - tzcntq %rax, %rcx
-# CHECK-NEXT: 0.33 0.33 0.33 0.25 0.25 0.25 0.25 - - - - - - tzcntq (%rax), %rcx
+# CHECK-NEXT: - - - 0.50 0.50 0.50 0.50 - - - - - - blsil %eax, %ecx
+# CHECK-NEXT: 0.33 0.33 0.33 0.50 0.50 0.50 0.50 - - - - - - blsil (%rax), %ecx
+# CHECK-NEXT: - - - 0.50 0.50 0.50 0.50 - - - - - - blsiq %rax, %rcx
+# CHECK-NEXT: 0.33 0.33 0.33 0.50 0.50 0.50 0.50 - - - - - - blsiq (%rax), %rcx
+# CHECK-NEXT: - - - 0.50 0.50 0.50 0.50 - - - - - - blsmskl %eax, %ecx
+# CHECK-NEXT: 0.33 0.33 0.33 0.50 0.50 0.50 0.50 - - - - - - blsmskl (%rax), %ecx
+# CHECK-NEXT: - - - 0.50 0.50 0.50 0.50 - - - - - - blsmskq %rax, %rcx
+# CHECK-NEXT: 0.33 0.33 0.33 0.50 0.50 0.50 0.50 - - - - - - blsmskq (%rax), %rcx
+# CHECK-NEXT: - - - 0.50 0.50 0.50 0.50 - - - - - - blsrl %eax, %ecx
+# CHECK-NEXT: 0.33 0.33 0.33 0.50 0.50 0.50 0.50 - - - - - - blsrl (%rax), %ecx
+# CHECK-NEXT: - - - 0.50 0.50 0.50 0.50 - - - - - - blsrq %rax, %rcx
+# CHECK-NEXT: 0.33 0.33 0.33 0.50 0.50 0.50 0.50 - - - - - - blsrq (%rax), %rcx
+# CHECK-NEXT: - - - 0.50 0.50 0.50 0.50 - - - - - - tzcntw %ax, %cx
+# CHECK-NEXT: 0.33 0.33 0.33 0.50 0.50 0.50 0.50 - - - - - - tzcntw (%rax), %cx
+# CHECK-NEXT: - - - 0.50 0.50 0.50 0.50 - - - - - - tzcntl %eax, %ecx
+# CHECK-NEXT: 0.33 0.33 0.33 0.50 0.50 0.50 0.50 - - - - - - tzcntl (%rax), %ecx
+# CHECK-NEXT: - - - 0.50 0.50 0.50 0.50 - - - - - - tzcntq %rax, %rcx
+# CHECK-NEXT: 0.33 0.33 0.33 0.50 0.50 0.50 0.50 - - - - - - tzcntq (%rax), %rcx