Skip to content

Commit 6c5277b

Browse files
committed
[X86] Decode VPTERNLOG truth tables when disassembling
Alongside something like: vpternlogq zmm0, zmm2, zmm1, 64 We will now have a comment on the right like: # zmm0 = zmm0 & zmm2 & ~zmm1 This makes it easy to tell at a glance what sort of truth table the instruction will provide.
1 parent 53943de commit 6c5277b

17 files changed

+1370
-1021
lines changed

llvm/lib/Target/X86/MCTargetDesc/X86InstComments.cpp

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,11 @@ using namespace llvm;
3939
CASE_MASK_INS_COMMON(Inst, Suffix, src) \
4040
CASE_MASKZ_INS_COMMON(Inst, Suffix, src)
4141

42+
#define CASE_PTERNLOG(Inst, src) \
43+
CASE_AVX512_INS_COMMON(Inst, Z, r##src##i) \
44+
CASE_AVX512_INS_COMMON(Inst, Z256, r##src##i) \
45+
CASE_AVX512_INS_COMMON(Inst, Z128, r##src##i)
46+
4247
#define CASE_MOVDUP(Inst, src) \
4348
CASE_AVX512_INS_COMMON(Inst, Z, r##src) \
4449
CASE_AVX512_INS_COMMON(Inst, Z256, r##src) \
@@ -617,6 +622,90 @@ static bool printFMAComments(const MCInst *MI, raw_ostream &OS,
617622
return true;
618623
}
619624

625+
static bool printPTERNLOGComments(const MCInst *MI, raw_ostream &OS,
626+
const MCInstrInfo &MCII) {
627+
unsigned NumOperands = MI->getNumOperands();
628+
629+
int Src2Idx;
630+
int Src3Idx;
631+
switch (MI->getOpcode()) {
632+
// dest, src1, src2, src3, tbl
633+
// dest, src1, mask, src2, src3, tbl
634+
CASE_PTERNLOG(PTERNLOGD, r)
635+
CASE_PTERNLOG(PTERNLOGQ, r)
636+
Src2Idx = NumOperands - 3;
637+
Src3Idx = NumOperands - 2;
638+
break;
639+
640+
// dest, src1, src2, memory, tbl
641+
// dest, src1, mask, src2, memory, tbl
642+
CASE_PTERNLOG(PTERNLOGD, m)
643+
CASE_PTERNLOG(PTERNLOGQ, m)
644+
CASE_PTERNLOG(PTERNLOGD, mb)
645+
CASE_PTERNLOG(PTERNLOGQ, mb)
646+
Src2Idx = NumOperands - 7;
647+
Src3Idx = -1;
648+
break;
649+
650+
default:
651+
return false;
652+
}
653+
const char *DestName = getRegName(MI->getOperand(0).getReg());
654+
const char *Src1Name = getRegName(MI->getOperand(1).getReg());
655+
const char *Src2Name = getRegName(MI->getOperand(Src2Idx).getReg());
656+
const char *Src3Name =
657+
Src3Idx != -1 ? getRegName(MI->getOperand(Src3Idx).getReg()) : "mem";
658+
uint8_t TruthTable = MI->getOperand(NumOperands - 1).getImm();
659+
660+
OS << DestName;
661+
printMasking(OS, MI, MCII);
662+
OS << " = ";
663+
664+
constexpr unsigned kNumVariables = 3;
665+
constexpr unsigned kNumTruthTableEntries = 1 << kNumVariables;
666+
int NumMinterms = llvm::popcount(TruthTable);
667+
if (NumMinterms == 0) {
668+
OS << '0';
669+
} else if (NumMinterms == kNumTruthTableEntries) {
670+
OS << "-1";
671+
} else {
672+
while (TruthTable != 0) {
673+
// Index of the lowest bit set.
674+
unsigned I = llvm::countr_zero(TruthTable);
675+
// Clear the lowest bit set.
676+
TruthTable &= TruthTable - 1;
677+
// Our index tells us which sources are and are not complemented. Note
678+
// that the indexing goes left-to-right.
679+
bool Src1 = I & 0b100;
680+
bool Src2 = I & 0b010;
681+
bool Src3 = I & 0b001;
682+
683+
// Group in parenthesis to make the output more obvious but only if there
684+
// are multiple terms.
685+
if (NumMinterms > 1)
686+
OS << '(';
687+
688+
if (!Src1)
689+
OS << '~';
690+
OS << Src1Name << " & ";
691+
if (!Src2)
692+
OS << '~';
693+
OS << Src2Name << " & ";
694+
if (!Src3)
695+
OS << '~';
696+
OS << Src3Name;
697+
698+
if (NumMinterms > 1)
699+
OS << ')';
700+
701+
// Output an OR if there is another term in the table.
702+
if (TruthTable != 0)
703+
OS << " | ";
704+
}
705+
}
706+
OS << '\n';
707+
return true;
708+
}
620709

621710
//===----------------------------------------------------------------------===//
622711
// Top Level Entrypoint
@@ -636,6 +725,9 @@ bool llvm::EmitAnyX86InstComments(const MCInst *MI, raw_ostream &OS,
636725
if (printFMAComments(MI, OS, MCII))
637726
return true;
638727

728+
if (printPTERNLOGComments(MI, OS, MCII))
729+
return true;
730+
639731
switch (MI->getOpcode()) {
640732
default:
641733
// Not an instruction for which we can decode comments.

llvm/test/CodeGen/X86/avx512-gfni-intrinsics.ll

Lines changed: 74 additions & 0 deletions
Large diffs are not rendered by default.

llvm/test/CodeGen/X86/avx512-intrinsics-upgrade.ll

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7682,6 +7682,7 @@ define <16 x i32>@test_int_x86_avx512_pternlog_d_512(<16 x i32> %x0, <16 x i32>
76827682
; CHECK-LABEL: test_int_x86_avx512_pternlog_d_512:
76837683
; CHECK: ## %bb.0:
76847684
; CHECK-NEXT: vpternlogd $33, %zmm2, %zmm1, %zmm0 ## encoding: [0x62,0xf3,0x75,0x48,0x25,0xc2,0x21]
7685+
; CHECK-NEXT: ## zmm0 = (~zmm0 & ~zmm1 & ~zmm2) | (zmm0 & ~zmm1 & zmm2)
76857686
; CHECK-NEXT: ret{{[l|q]}} ## encoding: [0xc3]
76867687
%res = call <16 x i32> @llvm.x86.avx512.mask.pternlog.d.512(<16 x i32> %x0, <16 x i32> %x1, <16 x i32> %x2, i32 33, i16 -1)
76877688
ret <16 x i32> %res
@@ -7692,12 +7693,14 @@ define <16 x i32>@test_int_x86_avx512_mask_pternlog_d_512(<16 x i32> %x0, <16 x
76927693
; X86: ## %bb.0:
76937694
; X86-NEXT: kmovw {{[0-9]+}}(%esp), %k1 ## encoding: [0xc5,0xf8,0x90,0x4c,0x24,0x04]
76947695
; X86-NEXT: vpternlogd $33, %zmm2, %zmm1, %zmm0 {%k1} ## encoding: [0x62,0xf3,0x75,0x49,0x25,0xc2,0x21]
7696+
; X86-NEXT: ## zmm0 {%k1} = (~zmm0 & ~zmm1 & ~zmm2) | (zmm0 & ~zmm1 & zmm2)
76957697
; X86-NEXT: retl ## encoding: [0xc3]
76967698
;
76977699
; X64-LABEL: test_int_x86_avx512_mask_pternlog_d_512:
76987700
; X64: ## %bb.0:
76997701
; X64-NEXT: kmovw %edi, %k1 ## encoding: [0xc5,0xf8,0x92,0xcf]
77007702
; X64-NEXT: vpternlogd $33, %zmm2, %zmm1, %zmm0 {%k1} ## encoding: [0x62,0xf3,0x75,0x49,0x25,0xc2,0x21]
7703+
; X64-NEXT: ## zmm0 {%k1} = (~zmm0 & ~zmm1 & ~zmm2) | (zmm0 & ~zmm1 & zmm2)
77017704
; X64-NEXT: retq ## encoding: [0xc3]
77027705
%res = call <16 x i32> @llvm.x86.avx512.mask.pternlog.d.512(<16 x i32> %x0, <16 x i32> %x1, <16 x i32> %x2, i32 33, i16 %x4)
77037706
ret <16 x i32> %res
@@ -7710,12 +7713,14 @@ define <16 x i32>@test_int_x86_avx512_maskz_pternlog_d_512(<16 x i32> %x0, <16 x
77107713
; X86: ## %bb.0:
77117714
; X86-NEXT: kmovw {{[0-9]+}}(%esp), %k1 ## encoding: [0xc5,0xf8,0x90,0x4c,0x24,0x04]
77127715
; X86-NEXT: vpternlogd $33, %zmm2, %zmm1, %zmm0 {%k1} {z} ## encoding: [0x62,0xf3,0x75,0xc9,0x25,0xc2,0x21]
7716+
; X86-NEXT: ## zmm0 {%k1} {z} = (~zmm0 & ~zmm1 & ~zmm2) | (zmm0 & ~zmm1 & zmm2)
77137717
; X86-NEXT: retl ## encoding: [0xc3]
77147718
;
77157719
; X64-LABEL: test_int_x86_avx512_maskz_pternlog_d_512:
77167720
; X64: ## %bb.0:
77177721
; X64-NEXT: kmovw %edi, %k1 ## encoding: [0xc5,0xf8,0x92,0xcf]
77187722
; X64-NEXT: vpternlogd $33, %zmm2, %zmm1, %zmm0 {%k1} {z} ## encoding: [0x62,0xf3,0x75,0xc9,0x25,0xc2,0x21]
7723+
; X64-NEXT: ## zmm0 {%k1} {z} = (~zmm0 & ~zmm1 & ~zmm2) | (zmm0 & ~zmm1 & zmm2)
77197724
; X64-NEXT: retq ## encoding: [0xc3]
77207725
%res = call <16 x i32> @llvm.x86.avx512.maskz.pternlog.d.512(<16 x i32> %x0, <16 x i32> %x1, <16 x i32> %x2, i32 33, i16 %x4)
77217726
ret <16 x i32> %res
@@ -7727,6 +7732,7 @@ define <8 x i64>@test_int_x86_avx512_pternlog_q_512(<8 x i64> %x0, <8 x i64> %x1
77277732
; CHECK-LABEL: test_int_x86_avx512_pternlog_q_512:
77287733
; CHECK: ## %bb.0:
77297734
; CHECK-NEXT: vpternlogq $33, %zmm2, %zmm1, %zmm0 ## encoding: [0x62,0xf3,0xf5,0x48,0x25,0xc2,0x21]
7735+
; CHECK-NEXT: ## zmm0 = (~zmm0 & ~zmm1 & ~zmm2) | (zmm0 & ~zmm1 & zmm2)
77307736
; CHECK-NEXT: ret{{[l|q]}} ## encoding: [0xc3]
77317737
%res = call <8 x i64> @llvm.x86.avx512.mask.pternlog.q.512(<8 x i64> %x0, <8 x i64> %x1, <8 x i64> %x2, i32 33, i8 -1)
77327738
ret <8 x i64> %res
@@ -7738,12 +7744,14 @@ define <8 x i64>@test_int_x86_avx512_mask_pternlog_q_512(<8 x i64> %x0, <8 x i64
77387744
; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax ## encoding: [0x0f,0xb6,0x44,0x24,0x04]
77397745
; X86-NEXT: kmovw %eax, %k1 ## encoding: [0xc5,0xf8,0x92,0xc8]
77407746
; X86-NEXT: vpternlogq $33, %zmm2, %zmm1, %zmm0 {%k1} ## encoding: [0x62,0xf3,0xf5,0x49,0x25,0xc2,0x21]
7747+
; X86-NEXT: ## zmm0 {%k1} = (~zmm0 & ~zmm1 & ~zmm2) | (zmm0 & ~zmm1 & zmm2)
77417748
; X86-NEXT: retl ## encoding: [0xc3]
77427749
;
77437750
; X64-LABEL: test_int_x86_avx512_mask_pternlog_q_512:
77447751
; X64: ## %bb.0:
77457752
; X64-NEXT: kmovw %edi, %k1 ## encoding: [0xc5,0xf8,0x92,0xcf]
77467753
; X64-NEXT: vpternlogq $33, %zmm2, %zmm1, %zmm0 {%k1} ## encoding: [0x62,0xf3,0xf5,0x49,0x25,0xc2,0x21]
7754+
; X64-NEXT: ## zmm0 {%k1} = (~zmm0 & ~zmm1 & ~zmm2) | (zmm0 & ~zmm1 & zmm2)
77477755
; X64-NEXT: retq ## encoding: [0xc3]
77487756
%res = call <8 x i64> @llvm.x86.avx512.mask.pternlog.q.512(<8 x i64> %x0, <8 x i64> %x1, <8 x i64> %x2, i32 33, i8 %x4)
77497757
ret <8 x i64> %res
@@ -7757,12 +7765,14 @@ define <8 x i64>@test_int_x86_avx512_maskz_pternlog_q_512(<8 x i64> %x0, <8 x i6
77577765
; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax ## encoding: [0x0f,0xb6,0x44,0x24,0x04]
77587766
; X86-NEXT: kmovw %eax, %k1 ## encoding: [0xc5,0xf8,0x92,0xc8]
77597767
; X86-NEXT: vpternlogq $33, %zmm2, %zmm1, %zmm0 {%k1} {z} ## encoding: [0x62,0xf3,0xf5,0xc9,0x25,0xc2,0x21]
7768+
; X86-NEXT: ## zmm0 {%k1} {z} = (~zmm0 & ~zmm1 & ~zmm2) | (zmm0 & ~zmm1 & zmm2)
77607769
; X86-NEXT: retl ## encoding: [0xc3]
77617770
;
77627771
; X64-LABEL: test_int_x86_avx512_maskz_pternlog_q_512:
77637772
; X64: ## %bb.0:
77647773
; X64-NEXT: kmovw %edi, %k1 ## encoding: [0xc5,0xf8,0x92,0xcf]
77657774
; X64-NEXT: vpternlogq $33, %zmm2, %zmm1, %zmm0 {%k1} {z} ## encoding: [0x62,0xf3,0xf5,0xc9,0x25,0xc2,0x21]
7775+
; X64-NEXT: ## zmm0 {%k1} {z} = (~zmm0 & ~zmm1 & ~zmm2) | (zmm0 & ~zmm1 & zmm2)
77667776
; X64-NEXT: retq ## encoding: [0xc3]
77677777
%res = call <8 x i64> @llvm.x86.avx512.maskz.pternlog.q.512(<8 x i64> %x0, <8 x i64> %x1, <8 x i64> %x2, i32 33, i8 %x4)
77687778
ret <8 x i64> %res

llvm/test/CodeGen/X86/avx512-vec-cmp.ll

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -301,6 +301,7 @@ define <16 x i32> @test13(<16 x float>%a, <16 x float>%b)
301301
; AVX512: ## %bb.0:
302302
; AVX512-NEXT: vcmpeqps %zmm1, %zmm0, %k1 ## encoding: [0x62,0xf1,0x7c,0x48,0xc2,0xc9,0x00]
303303
; AVX512-NEXT: vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z} ## encoding: [0x62,0xf3,0x7d,0xc9,0x25,0xc0,0xff]
304+
; AVX512-NEXT: ## zmm0 {%k1} {z} = -1
304305
; AVX512-NEXT: vpsrld $31, %zmm0, %zmm0 ## encoding: [0x62,0xf1,0x7d,0x48,0x72,0xd0,0x1f]
305306
; AVX512-NEXT: retq ## encoding: [0xc3]
306307
;
@@ -520,6 +521,7 @@ define <8 x i32>@test28(<8 x i64> %x, <8 x i64> %y, <8 x i64> %x1, <8 x i64> %y1
520521
; AVX512-NEXT: vpcmpgtq %zmm3, %zmm2, %k1 ## encoding: [0x62,0xf2,0xed,0x48,0x37,0xcb]
521522
; AVX512-NEXT: kxnorw %k1, %k0, %k1 ## encoding: [0xc5,0xfc,0x46,0xc9]
522523
; AVX512-NEXT: vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z} ## encoding: [0x62,0xf3,0x7d,0xc9,0x25,0xc0,0xff]
524+
; AVX512-NEXT: ## zmm0 {%k1} {z} = -1
523525
; AVX512-NEXT: ## kill: def $ymm0 killed $ymm0 killed $zmm0
524526
; AVX512-NEXT: retq ## encoding: [0xc3]
525527
;
@@ -544,6 +546,7 @@ define <16 x i8>@test29(<16 x i32> %x, <16 x i32> %y, <16 x i32> %x1, <16 x i32>
544546
; KNL-NEXT: vpcmpgtd %zmm3, %zmm2, %k1 ## encoding: [0x62,0xf1,0x6d,0x48,0x66,0xcb]
545547
; KNL-NEXT: kxorw %k1, %k0, %k1 ## encoding: [0xc5,0xfc,0x47,0xc9]
546548
; KNL-NEXT: vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z} ## encoding: [0x62,0xf3,0x7d,0xc9,0x25,0xc0,0xff]
549+
; KNL-NEXT: ## zmm0 {%k1} {z} = -1
547550
; KNL-NEXT: vpmovdb %zmm0, %xmm0 ## encoding: [0x62,0xf2,0x7e,0x48,0x31,0xc0]
548551
; KNL-NEXT: vzeroupper ## encoding: [0xc5,0xf8,0x77]
549552
; KNL-NEXT: retq ## encoding: [0xc3]
@@ -1233,6 +1236,7 @@ define <16 x i8> @test47(<16 x i32> %a, <16 x i8> %b, <16 x i8> %c) {
12331236
; KNL: ## %bb.0:
12341237
; KNL-NEXT: vptestnmd %zmm0, %zmm0, %k1 ## encoding: [0x62,0xf2,0x7e,0x48,0x27,0xc8]
12351238
; KNL-NEXT: vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z} ## encoding: [0x62,0xf3,0x7d,0xc9,0x25,0xc0,0xff]
1239+
; KNL-NEXT: ## zmm0 {%k1} {z} = -1
12361240
; KNL-NEXT: vpmovdb %zmm0, %xmm0 ## encoding: [0x62,0xf2,0x7e,0x48,0x31,0xc0]
12371241
; KNL-NEXT: vpblendvb %xmm0, %xmm1, %xmm2, %xmm0 ## encoding: [0xc4,0xe3,0x69,0x4c,0xc1,0x00]
12381242
; KNL-NEXT: vzeroupper ## encoding: [0xc5,0xf8,0x77]
@@ -1264,6 +1268,7 @@ define <16 x i16> @test48(<16 x i32> %a, <16 x i16> %b, <16 x i16> %c) {
12641268
; KNL: ## %bb.0:
12651269
; KNL-NEXT: vptestnmd %zmm0, %zmm0, %k1 ## encoding: [0x62,0xf2,0x7e,0x48,0x27,0xc8]
12661270
; KNL-NEXT: vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z} ## encoding: [0x62,0xf3,0x7d,0xc9,0x25,0xc0,0xff]
1271+
; KNL-NEXT: ## zmm0 {%k1} {z} = -1
12671272
; KNL-NEXT: vpmovdw %zmm0, %ymm0 ## encoding: [0x62,0xf2,0x7e,0x48,0x33,0xc0]
12681273
; KNL-NEXT: vpblendvb %ymm0, %ymm1, %ymm2, %ymm0 ## encoding: [0xc4,0xe3,0x6d,0x4c,0xc1,0x00]
12691274
; KNL-NEXT: retq ## encoding: [0xc3]
@@ -1292,6 +1297,7 @@ define <8 x i16> @test49(<8 x i64> %a, <8 x i16> %b, <8 x i16> %c) {
12921297
; KNL: ## %bb.0:
12931298
; KNL-NEXT: vptestnmq %zmm0, %zmm0, %k1 ## encoding: [0x62,0xf2,0xfe,0x48,0x27,0xc8]
12941299
; KNL-NEXT: vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z} ## encoding: [0x62,0xf3,0x7d,0xc9,0x25,0xc0,0xff]
1300+
; KNL-NEXT: ## zmm0 {%k1} {z} = -1
12951301
; KNL-NEXT: vpmovdw %zmm0, %ymm0 ## encoding: [0x62,0xf2,0x7e,0x48,0x33,0xc0]
12961302
; KNL-NEXT: vpblendvb %xmm0, %xmm1, %xmm2, %xmm0 ## encoding: [0xc4,0xe3,0x69,0x4c,0xc1,0x00]
12971303
; KNL-NEXT: vzeroupper ## encoding: [0xc5,0xf8,0x77]
@@ -1408,6 +1414,7 @@ define <4 x i32> @zext_bool_logic(<4 x i64> %cond1, <4 x i64> %cond2, <4 x i32>
14081414
; AVX512-NEXT: vptestnmq %zmm1, %zmm1, %k1 ## encoding: [0x62,0xf2,0xf6,0x48,0x27,0xc9]
14091415
; AVX512-NEXT: korw %k1, %k0, %k1 ## encoding: [0xc5,0xfc,0x45,0xc9]
14101416
; AVX512-NEXT: vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z} ## encoding: [0x62,0xf3,0x7d,0xc9,0x25,0xc0,0xff]
1417+
; AVX512-NEXT: ## zmm0 {%k1} {z} = -1
14111418
; AVX512-NEXT: vpsubd %xmm0, %xmm2, %xmm0 ## encoding: [0xc5,0xe9,0xfa,0xc0]
14121419
; AVX512-NEXT: vzeroupper ## encoding: [0xc5,0xf8,0x77]
14131420
; AVX512-NEXT: retq ## encoding: [0xc3]

0 commit comments

Comments
 (0)