Skip to content

Commit 5c12434

Browse files
committed
[X86] Emit comments explaining the immediate in vfpclass
This makes the assembly a lot more readable at a glance. As an example: ``` vfpclasspd $4, %zmm0, %k0 # k0 = isNegativeZero(zmm0) ```
1 parent 27ef549 commit 5c12434

11 files changed

+137
-22
lines changed

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

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,20 @@ using namespace llvm;
4040
CASE_MASK_INS_COMMON(Inst, Suffix, src) \
4141
CASE_MASKZ_INS_COMMON(Inst, Suffix, src)
4242

43+
#define CASE_FPCLASS_PACKED(Inst, src) \
44+
CASE_AVX_INS_COMMON(Inst, Z, r##src) \
45+
CASE_AVX_INS_COMMON(Inst, Z256, r##src) \
46+
CASE_AVX_INS_COMMON(Inst, Z128, r##src) \
47+
CASE_MASK_INS_COMMON(Inst, Z, r##src)
48+
49+
#define CASE_FPCLASS_PACKED_MEM(Inst) \
50+
CASE_FPCLASS_PACKED(Inst, m) \
51+
CASE_FPCLASS_PACKED(Inst, mb)
52+
53+
#define CASE_FPCLASS_SCALAR(Inst, src) \
54+
CASE_AVX_INS_COMMON(Inst, Z, r##src) \
55+
CASE_MASK_INS_COMMON(Inst, Z, r##src)
56+
4357
#define CASE_PTERNLOG(Inst, src) \
4458
CASE_AVX512_INS_COMMON(Inst, Z, r##src##i) \
4559
CASE_AVX512_INS_COMMON(Inst, Z256, r##src##i) \
@@ -949,6 +963,70 @@ static bool printPTERNLOGComments(const MCInst *MI, raw_ostream &OS,
949963
return true;
950964
}
951965

966+
static bool printFPCLASSComments(const MCInst *MI, raw_ostream &OS,
967+
const MCInstrInfo &MCII) {
968+
unsigned NumOperands = MI->getNumOperands();
969+
int SrcIdx;
970+
switch (MI->getOpcode()) {
971+
CASE_FPCLASS_PACKED(FPCLASSPBF16, r)
972+
CASE_FPCLASS_PACKED(FPCLASSPH, r)
973+
CASE_FPCLASS_PACKED(FPCLASSPS, r)
974+
CASE_FPCLASS_PACKED(FPCLASSPD, r)
975+
CASE_FPCLASS_SCALAR(FPCLASSSH, r)
976+
CASE_FPCLASS_SCALAR(FPCLASSSS, r)
977+
CASE_FPCLASS_SCALAR(FPCLASSSD, r) {
978+
SrcIdx = NumOperands - 2;
979+
break;
980+
}
981+
CASE_FPCLASS_PACKED_MEM(FPCLASSPBF16)
982+
CASE_FPCLASS_PACKED_MEM(FPCLASSPH)
983+
CASE_FPCLASS_PACKED_MEM(FPCLASSPS)
984+
CASE_FPCLASS_PACKED_MEM(FPCLASSPD)
985+
CASE_FPCLASS_SCALAR(FPCLASSSH, m)
986+
CASE_FPCLASS_SCALAR(FPCLASSSS, m)
987+
CASE_FPCLASS_SCALAR(FPCLASSSD, m) {
988+
SrcIdx = -1;
989+
break;
990+
}
991+
default:
992+
return false;
993+
}
994+
StringRef DestName = getRegName(MI->getOperand(0).getReg());
995+
StringRef SrcName =
996+
SrcIdx != -1 ? getRegName(MI->getOperand(SrcIdx).getReg()) : "mem";
997+
998+
OS << DestName;
999+
printMasking(OS, MI, MCII);
1000+
OS << " = ";
1001+
1002+
uint8_t Categories = MI->getOperand(NumOperands - 1).getImm();
1003+
if (Categories == 0) {
1004+
OS << "false";
1005+
} else {
1006+
static constexpr StringLiteral CategoryNames[] = {
1007+
"QuietNaN",
1008+
"PositiveZero",
1009+
"NegativeZero",
1010+
"PositiveInfinity",
1011+
"NegativeInfinity",
1012+
"Subnormal",
1013+
"Negative",
1014+
"SignalingNaN",
1015+
};
1016+
bool Conjoin = false;
1017+
for (size_t I = 0, E = std::size(CategoryNames); I != E; ++I) {
1018+
if (Categories & (1 << I)) {
1019+
if (Conjoin)
1020+
OS << " | ";
1021+
Conjoin = true;
1022+
OS << "is" << CategoryNames[I] << '(' << SrcName << ')';
1023+
}
1024+
}
1025+
}
1026+
OS << '\n';
1027+
return true;
1028+
}
1029+
9521030
//===----------------------------------------------------------------------===//
9531031
// Top Level Entrypoint
9541032
//===----------------------------------------------------------------------===//
@@ -970,6 +1048,9 @@ bool llvm::EmitAnyX86InstComments(const MCInst *MI, raw_ostream &OS,
9701048
if (printPTERNLOGComments(MI, OS, MCII))
9711049
return true;
9721050

1051+
if (printFPCLASSComments(MI, OS, MCII))
1052+
return true;
1053+
9731054
switch (MI->getOpcode()) {
9741055
default:
9751056
// Not an instruction for which we can decode comments.

llvm/test/CodeGen/X86/avx10_2_512bf16-intrinsics.ll

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -76,13 +76,15 @@ declare <32 x i1> @llvm.x86.avx10.fpclass.nepbf16.512(<32 x bfloat>, i32)
7676
define i32 @test_int_x86_avx512_fpclass_nepbf16_512(<32 x bfloat> %x0) {
7777
; CHECK-LABEL: test_int_x86_avx512_fpclass_nepbf16_512:
7878
; CHECK: # %bb.0:
79-
; CHECK-NEXT: vfpclasspbf16 $2, %zmm0, %k1 # encoding: [0x62,0xf3,0x7f,0x48,0x66,0xc8,0x02]
80-
; CHECK-NEXT: vfpclasspbf16 $4, %zmm0, %k0 {%k1} # encoding: [0x62,0xf3,0x7f,0x49,0x66,0xc0,0x04]
79+
; CHECK-NEXT: vfpclasspbf16 $6, %zmm0, %k1 # encoding: [0x62,0xf3,0x7f,0x48,0x66,0xc8,0x06]
80+
; CHECK-NEXT: # k1 = isPositiveZero(zmm0) | isNegativeZero(zmm0)
81+
; CHECK-NEXT: vfpclasspbf16 $0, %zmm0, %k0 {%k1} # encoding: [0x62,0xf3,0x7f,0x49,0x66,0xc0,0x00]
82+
; CHECK-NEXT: # k0 {%k1} = false
8183
; CHECK-NEXT: kmovd %k0, %eax # encoding: [0xc5,0xfb,0x93,0xc0]
8284
; CHECK-NEXT: vzeroupper # encoding: [0xc5,0xf8,0x77]
8385
; CHECK-NEXT: ret{{[l|q]}} # encoding: [0xc3]
84-
%res = call <32 x i1> @llvm.x86.avx10.fpclass.nepbf16.512(<32 x bfloat> %x0, i32 4)
85-
%res1 = call <32 x i1> @llvm.x86.avx10.fpclass.nepbf16.512(<32 x bfloat> %x0, i32 2)
86+
%res = call <32 x i1> @llvm.x86.avx10.fpclass.nepbf16.512(<32 x bfloat> %x0, i32 0)
87+
%res1 = call <32 x i1> @llvm.x86.avx10.fpclass.nepbf16.512(<32 x bfloat> %x0, i32 6)
8688
%1 = and <32 x i1> %res1, %res
8789
%2 = bitcast <32 x i1> %1 to i32
8890
ret i32 %2

llvm/test/CodeGen/X86/avx10_2bf16-intrinsics.ll

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -298,6 +298,7 @@ define i8 @test_int_x86_avx512_fpclass_nepbf16_128(<8 x bfloat> %x0) {
298298
; CHECK-LABEL: test_int_x86_avx512_fpclass_nepbf16_128:
299299
; CHECK: # %bb.0:
300300
; CHECK-NEXT: vfpclasspbf16 $2, %xmm0, %k1 # encoding: [0x62,0xf3,0x7f,0x08,0x66,0xc8,0x02]
301+
; CHECK-NEXT: # k1 = isPositiveZero(xmm0)
301302
; CHECK-NEXT: vfpclasspbf16 $4, %xmm0, %k0 {%k1} # encoding: [0x62,0xf3,0x7f,0x09,0x66,0xc0,0x04]
302303
; CHECK-NEXT: kmovd %k0, %eax # encoding: [0xc5,0xfb,0x93,0xc0]
303304
; CHECK-NEXT: # kill: def $al killed $al killed $eax
@@ -313,6 +314,7 @@ define i16 @test_int_x86_avx512_fpclass_nepbf16_256(<16 x bfloat> %x0) {
313314
; CHECK-LABEL: test_int_x86_avx512_fpclass_nepbf16_256:
314315
; CHECK: # %bb.0:
315316
; CHECK-NEXT: vfpclasspbf16 $2, %ymm0, %k1 # encoding: [0x62,0xf3,0x7f,0x28,0x66,0xc8,0x02]
317+
; CHECK-NEXT: # k1 = isPositiveZero(ymm0)
316318
; CHECK-NEXT: vfpclasspbf16 $4, %ymm0, %k0 {%k1} # encoding: [0x62,0xf3,0x7f,0x29,0x66,0xc0,0x04]
317319
; CHECK-NEXT: kmovd %k0, %eax # encoding: [0xc5,0xfb,0x93,0xc0]
318320
; CHECK-NEXT: # kill: def $ax killed $ax killed $eax

llvm/test/CodeGen/X86/avx512dq-intrinsics-fast-isel.ll

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
define zeroext i8 @test_mm512_mask_fpclass_pd_mask(i8 zeroext %__U, <8 x double> %__A) {
88
; X86-LABEL: test_mm512_mask_fpclass_pd_mask:
99
; X86: # %bb.0: # %entry
10-
; X86-NEXT: vfpclasspd $4, %zmm0, %k0
10+
; X86-NEXT: vfpclasspd $4, %zmm0, %k0 # k0 = isNegativeZero(zmm0)
1111
; X86-NEXT: kmovw %k0, %eax
1212
; X86-NEXT: andb {{[0-9]+}}(%esp), %al
1313
; X86-NEXT: # kill: def $al killed $al killed $eax
@@ -16,7 +16,7 @@ define zeroext i8 @test_mm512_mask_fpclass_pd_mask(i8 zeroext %__U, <8 x double>
1616
;
1717
; X64-LABEL: test_mm512_mask_fpclass_pd_mask:
1818
; X64: # %bb.0: # %entry
19-
; X64-NEXT: vfpclasspd $4, %zmm0, %k0
19+
; X64-NEXT: vfpclasspd $4, %zmm0, %k0 # k0 = isNegativeZero(zmm0)
2020
; X64-NEXT: kmovw %k0, %eax
2121
; X64-NEXT: andb %dil, %al
2222
; X64-NEXT: # kill: def $al killed $al killed $eax
@@ -35,7 +35,7 @@ declare <8 x i1> @llvm.x86.avx512.fpclass.pd.512(<8 x double>, i32)
3535
define zeroext i8 @test_mm512_fpclass_pd_mask(<8 x double> %__A) {
3636
; CHECK-LABEL: test_mm512_fpclass_pd_mask:
3737
; CHECK: # %bb.0: # %entry
38-
; CHECK-NEXT: vfpclasspd $4, %zmm0, %k0
38+
; CHECK-NEXT: vfpclasspd $4, %zmm0, %k0 # k0 = isNegativeZero(zmm0)
3939
; CHECK-NEXT: kmovw %k0, %eax
4040
; CHECK-NEXT: # kill: def $al killed $al killed $eax
4141
; CHECK-NEXT: vzeroupper
@@ -49,7 +49,7 @@ entry:
4949
define zeroext i16 @test_mm512_mask_fpclass_ps_mask(i16 zeroext %__U, <16 x float> %__A) {
5050
; X86-LABEL: test_mm512_mask_fpclass_ps_mask:
5151
; X86: # %bb.0: # %entry
52-
; X86-NEXT: vfpclassps $4, %zmm0, %k0
52+
; X86-NEXT: vfpclassps $4, %zmm0, %k0 # k0 = isNegativeZero(zmm0)
5353
; X86-NEXT: kmovw %k0, %eax
5454
; X86-NEXT: andw {{[0-9]+}}(%esp), %ax
5555
; X86-NEXT: # kill: def $ax killed $ax killed $eax
@@ -58,7 +58,7 @@ define zeroext i16 @test_mm512_mask_fpclass_ps_mask(i16 zeroext %__U, <16 x floa
5858
;
5959
; X64-LABEL: test_mm512_mask_fpclass_ps_mask:
6060
; X64: # %bb.0: # %entry
61-
; X64-NEXT: vfpclassps $4, %zmm0, %k0
61+
; X64-NEXT: vfpclassps $4, %zmm0, %k0 # k0 = isNegativeZero(zmm0)
6262
; X64-NEXT: kmovw %k0, %eax
6363
; X64-NEXT: andl %edi, %eax
6464
; X64-NEXT: # kill: def $ax killed $ax killed $eax
@@ -77,7 +77,7 @@ declare <16 x i1> @llvm.x86.avx512.fpclass.ps.512(<16 x float>, i32)
7777
define zeroext i16 @test_mm512_fpclass_ps_mask(<16 x float> %__A) {
7878
; CHECK-LABEL: test_mm512_fpclass_ps_mask:
7979
; CHECK: # %bb.0: # %entry
80-
; CHECK-NEXT: vfpclassps $4, %zmm0, %k0
80+
; CHECK-NEXT: vfpclassps $4, %zmm0, %k0 # k0 = isNegativeZero(zmm0)
8181
; CHECK-NEXT: kmovw %k0, %eax
8282
; CHECK-NEXT: # kill: def $ax killed $ax killed $eax
8383
; CHECK-NEXT: vzeroupper
@@ -91,7 +91,7 @@ entry:
9191
define zeroext i8 @test_mm_fpclass_sd_mask(<4 x float> %__A) {
9292
; CHECK-LABEL: test_mm_fpclass_sd_mask:
9393
; CHECK: # %bb.0: # %entry
94-
; CHECK-NEXT: vfpclasssd $2, %xmm0, %k0
94+
; CHECK-NEXT: vfpclasssd $2, %xmm0, %k0 # k0 = isPositiveZero(xmm0)
9595
; CHECK-NEXT: kmovw %k0, %eax
9696
; CHECK-NEXT: # kill: def $al killed $al killed $eax
9797
; CHECK-NEXT: ret{{[l|q]}}
@@ -107,15 +107,15 @@ define zeroext i8 @test_mm_mask_fpclass_sd_mask(i8 zeroext %__U, <4 x float> %__
107107
; X86-LABEL: test_mm_mask_fpclass_sd_mask:
108108
; X86: # %bb.0: # %entry
109109
; X86-NEXT: kmovb {{[0-9]+}}(%esp), %k1
110-
; X86-NEXT: vfpclasssd $2, %xmm0, %k0 {%k1}
110+
; X86-NEXT: vfpclasssd $2, %xmm0, %k0 {%k1} # k0 {%k1} = isPositiveZero(xmm0)
111111
; X86-NEXT: kmovw %k0, %eax
112112
; X86-NEXT: # kill: def $al killed $al killed $eax
113113
; X86-NEXT: retl
114114
;
115115
; X64-LABEL: test_mm_mask_fpclass_sd_mask:
116116
; X64: # %bb.0: # %entry
117117
; X64-NEXT: kmovw %edi, %k1
118-
; X64-NEXT: vfpclasssd $2, %xmm0, %k0 {%k1}
118+
; X64-NEXT: vfpclasssd $2, %xmm0, %k0 {%k1} # k0 {%k1} = isPositiveZero(xmm0)
119119
; X64-NEXT: kmovw %k0, %eax
120120
; X64-NEXT: # kill: def $al killed $al killed $eax
121121
; X64-NEXT: retq
@@ -128,7 +128,7 @@ entry:
128128
define zeroext i8 @test_mm_fpclass_ss_mask(<4 x float> %__A) {
129129
; CHECK-LABEL: test_mm_fpclass_ss_mask:
130130
; CHECK: # %bb.0: # %entry
131-
; CHECK-NEXT: vfpclassss $2, %xmm0, %k0
131+
; CHECK-NEXT: vfpclassss $2, %xmm0, %k0 # k0 = isPositiveZero(xmm0)
132132
; CHECK-NEXT: kmovw %k0, %eax
133133
; CHECK-NEXT: # kill: def $al killed $al killed $eax
134134
; CHECK-NEXT: ret{{[l|q]}}
@@ -143,15 +143,15 @@ define zeroext i8 @test_mm_mask_fpclass_ss_mask(i8 zeroext %__U, <4 x float> %__
143143
; X86-LABEL: test_mm_mask_fpclass_ss_mask:
144144
; X86: # %bb.0: # %entry
145145
; X86-NEXT: kmovb {{[0-9]+}}(%esp), %k1
146-
; X86-NEXT: vfpclassss $2, %xmm0, %k0 {%k1}
146+
; X86-NEXT: vfpclassss $2, %xmm0, %k0 {%k1} # k0 {%k1} = isPositiveZero(xmm0)
147147
; X86-NEXT: kmovw %k0, %eax
148148
; X86-NEXT: # kill: def $al killed $al killed $eax
149149
; X86-NEXT: retl
150150
;
151151
; X64-LABEL: test_mm_mask_fpclass_ss_mask:
152152
; X64: # %bb.0: # %entry
153153
; X64-NEXT: kmovw %edi, %k1
154-
; X64-NEXT: vfpclassss $2, %xmm0, %k0 {%k1}
154+
; X64-NEXT: vfpclassss $2, %xmm0, %k0 {%k1} # k0 {%k1} = isPositiveZero(xmm0)
155155
; X64-NEXT: kmovw %k0, %eax
156156
; X64-NEXT: # kill: def $al killed $al killed $eax
157157
; X64-NEXT: retq

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -654,7 +654,9 @@ define i8 @test_int_x86_avx512_mask_fpclass_pd_512(<8 x double> %x0) {
654654
; CHECK-LABEL: test_int_x86_avx512_mask_fpclass_pd_512:
655655
; CHECK: # %bb.0:
656656
; CHECK-NEXT: vfpclasspd $2, %zmm0, %k1 # encoding: [0x62,0xf3,0xfd,0x48,0x66,0xc8,0x02]
657+
; CHECK-NEXT: # k1 = isPositiveZero(zmm0)
657658
; CHECK-NEXT: vfpclasspd $4, %zmm0, %k0 {%k1} # encoding: [0x62,0xf3,0xfd,0x49,0x66,0xc0,0x04]
659+
; CHECK-NEXT: # k0 {%k1} = isNegativeZero(zmm0)
658660
; CHECK-NEXT: kmovw %k0, %eax # encoding: [0xc5,0xf8,0x93,0xc0]
659661
; CHECK-NEXT: # kill: def $al killed $al killed $eax
660662
; CHECK-NEXT: vzeroupper # encoding: [0xc5,0xf8,0x77]
@@ -669,7 +671,9 @@ define i16@test_int_x86_avx512_mask_fpclass_ps_512(<16 x float> %x0) {
669671
; CHECK-LABEL: test_int_x86_avx512_mask_fpclass_ps_512:
670672
; CHECK: # %bb.0:
671673
; CHECK-NEXT: vfpclassps $2, %zmm0, %k1 # encoding: [0x62,0xf3,0x7d,0x48,0x66,0xc8,0x02]
674+
; CHECK-NEXT: # k1 = isPositiveZero(zmm0)
672675
; CHECK-NEXT: vfpclassps $4, %zmm0, %k0 {%k1} # encoding: [0x62,0xf3,0x7d,0x49,0x66,0xc0,0x04]
676+
; CHECK-NEXT: # k0 {%k1} = isNegativeZero(zmm0)
673677
; CHECK-NEXT: kmovw %k0, %eax # encoding: [0xc5,0xf8,0x93,0xc0]
674678
; CHECK-NEXT: # kill: def $ax killed $ax killed $eax
675679
; CHECK-NEXT: vzeroupper # encoding: [0xc5,0xf8,0x77]

llvm/test/CodeGen/X86/avx512dq-intrinsics.ll

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -726,7 +726,9 @@ define i8 @test_int_x86_avx512_fpclass_pd_512(<8 x double> %x0) {
726726
; CHECK-LABEL: test_int_x86_avx512_fpclass_pd_512:
727727
; CHECK: # %bb.0:
728728
; CHECK-NEXT: vfpclasspd $2, %zmm0, %k1 # encoding: [0x62,0xf3,0xfd,0x48,0x66,0xc8,0x02]
729+
; CHECK-NEXT: # k1 = isPositiveZero(zmm0)
729730
; CHECK-NEXT: vfpclasspd $4, %zmm0, %k0 {%k1} # encoding: [0x62,0xf3,0xfd,0x49,0x66,0xc0,0x04]
731+
; CHECK-NEXT: # k0 {%k1} = isNegativeZero(zmm0)
730732
; CHECK-NEXT: kmovw %k0, %eax # encoding: [0xc5,0xf8,0x93,0xc0]
731733
; CHECK-NEXT: # kill: def $al killed $al killed $eax
732734
; CHECK-NEXT: vzeroupper # encoding: [0xc5,0xf8,0x77]
@@ -743,7 +745,9 @@ define i16@test_int_x86_avx512_fpclass_ps_512(<16 x float> %x0) {
743745
; CHECK-LABEL: test_int_x86_avx512_fpclass_ps_512:
744746
; CHECK: # %bb.0:
745747
; CHECK-NEXT: vfpclassps $2, %zmm0, %k1 # encoding: [0x62,0xf3,0x7d,0x48,0x66,0xc8,0x02]
748+
; CHECK-NEXT: # k1 = isPositiveZero(zmm0)
746749
; CHECK-NEXT: vfpclassps $4, %zmm0, %k0 {%k1} # encoding: [0x62,0xf3,0x7d,0x49,0x66,0xc0,0x04]
750+
; CHECK-NEXT: # k0 {%k1} = isNegativeZero(zmm0)
747751
; CHECK-NEXT: kmovw %k0, %eax # encoding: [0xc5,0xf8,0x93,0xc0]
748752
; CHECK-NEXT: # kill: def $ax killed $ax killed $eax
749753
; CHECK-NEXT: vzeroupper # encoding: [0xc5,0xf8,0x77]
@@ -761,7 +765,9 @@ define i8 @test_int_x86_avx512_mask_fpclass_sd(<2 x double> %x0) {
761765
; CHECK-LABEL: test_int_x86_avx512_mask_fpclass_sd:
762766
; CHECK: # %bb.0:
763767
; CHECK-NEXT: vfpclasssd $4, %xmm0, %k1 # encoding: [0x62,0xf3,0xfd,0x08,0x67,0xc8,0x04]
768+
; CHECK-NEXT: # k1 = isNegativeZero(xmm0)
764769
; CHECK-NEXT: vfpclasssd $2, %xmm0, %k0 {%k1} # encoding: [0x62,0xf3,0xfd,0x09,0x67,0xc0,0x02]
770+
; CHECK-NEXT: # k0 {%k1} = isPositiveZero(xmm0)
765771
; CHECK-NEXT: kmovw %k0, %eax # encoding: [0xc5,0xf8,0x93,0xc0]
766772
; CHECK-NEXT: # kill: def $al killed $al killed $eax
767773
; CHECK-NEXT: ret{{[l|q]}} # encoding: [0xc3]
@@ -775,13 +781,15 @@ define i8 @test_int_x86_avx512_mask_fpclass_sd_load(ptr %x0ptr) {
775781
; X86: # %bb.0:
776782
; X86-NEXT: movl {{[0-9]+}}(%esp), %eax # encoding: [0x8b,0x44,0x24,0x04]
777783
; X86-NEXT: vfpclasssd $4, (%eax), %k0 # encoding: [0x62,0xf3,0xfd,0x08,0x67,0x00,0x04]
784+
; X86-NEXT: # k0 = isNegativeZero(mem)
778785
; X86-NEXT: kmovw %k0, %eax # encoding: [0xc5,0xf8,0x93,0xc0]
779786
; X86-NEXT: # kill: def $al killed $al killed $eax
780787
; X86-NEXT: retl # encoding: [0xc3]
781788
;
782789
; X64-LABEL: test_int_x86_avx512_mask_fpclass_sd_load:
783790
; X64: # %bb.0:
784791
; X64-NEXT: vfpclasssd $4, (%rdi), %k0 # encoding: [0x62,0xf3,0xfd,0x08,0x67,0x07,0x04]
792+
; X64-NEXT: # k0 = isNegativeZero(mem)
785793
; X64-NEXT: kmovw %k0, %eax # encoding: [0xc5,0xf8,0x93,0xc0]
786794
; X64-NEXT: # kill: def $al killed $al killed $eax
787795
; X64-NEXT: retq # encoding: [0xc3]
@@ -796,7 +804,9 @@ define i8 @test_int_x86_avx512_mask_fpclass_ss(<4 x float> %x0) {
796804
; CHECK-LABEL: test_int_x86_avx512_mask_fpclass_ss:
797805
; CHECK: # %bb.0:
798806
; CHECK-NEXT: vfpclassss $4, %xmm0, %k1 # encoding: [0x62,0xf3,0x7d,0x08,0x67,0xc8,0x04]
807+
; CHECK-NEXT: # k1 = isNegativeZero(xmm0)
799808
; CHECK-NEXT: vfpclassss $2, %xmm0, %k0 {%k1} # encoding: [0x62,0xf3,0x7d,0x09,0x67,0xc0,0x02]
809+
; CHECK-NEXT: # k0 {%k1} = isPositiveZero(xmm0)
800810
; CHECK-NEXT: kmovw %k0, %eax # encoding: [0xc5,0xf8,0x93,0xc0]
801811
; CHECK-NEXT: # kill: def $al killed $al killed $eax
802812
; CHECK-NEXT: ret{{[l|q]}} # encoding: [0xc3]
@@ -810,13 +820,15 @@ define i8 @test_int_x86_avx512_mask_fpclass_ss_load(ptr %x0ptr, i8 %x1) {
810820
; X86: # %bb.0:
811821
; X86-NEXT: movl {{[0-9]+}}(%esp), %eax # encoding: [0x8b,0x44,0x24,0x04]
812822
; X86-NEXT: vfpclassss $4, (%eax), %k0 # encoding: [0x62,0xf3,0x7d,0x08,0x67,0x00,0x04]
823+
; X86-NEXT: # k0 = isNegativeZero(mem)
813824
; X86-NEXT: kmovw %k0, %eax # encoding: [0xc5,0xf8,0x93,0xc0]
814825
; X86-NEXT: # kill: def $al killed $al killed $eax
815826
; X86-NEXT: retl # encoding: [0xc3]
816827
;
817828
; X64-LABEL: test_int_x86_avx512_mask_fpclass_ss_load:
818829
; X64: # %bb.0:
819830
; X64-NEXT: vfpclassss $4, (%rdi), %k0 # encoding: [0x62,0xf3,0x7d,0x08,0x67,0x07,0x04]
831+
; X64-NEXT: # k0 = isNegativeZero(mem)
820832
; X64-NEXT: kmovw %k0, %eax # encoding: [0xc5,0xf8,0x93,0xc0]
821833
; X64-NEXT: # kill: def $al killed $al killed $eax
822834
; X64-NEXT: retq # encoding: [0xc3]

llvm/test/CodeGen/X86/avx512dqvl-intrinsics-fast-isel.ll

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -235,7 +235,7 @@ declare <2 x i1> @llvm.x86.avx512.fpclass.pd.128(<2 x double>, i32)
235235
define zeroext i8 @test_mm_fpclass_pd_mask(<2 x double> %__A) {
236236
; CHECK-LABEL: test_mm_fpclass_pd_mask:
237237
; CHECK: # %bb.0: # %entry
238-
; CHECK-NEXT: vfpclasspd $2, %xmm0, %k0
238+
; CHECK-NEXT: vfpclasspd $2, %xmm0, %k0 # k0 = isPositiveZero(xmm0)
239239
; CHECK-NEXT: kmovw %k0, %eax
240240
; CHECK-NEXT: # kill: def $al killed $al killed $eax
241241
; CHECK-NEXT: ret{{[l|q]}}
@@ -279,7 +279,7 @@ declare <4 x i1> @llvm.x86.avx512.fpclass.pd.256(<4 x double>, i32)
279279
define zeroext i8 @test_mm256_fpclass_pd_mask(<4 x double> %__A) {
280280
; CHECK-LABEL: test_mm256_fpclass_pd_mask:
281281
; CHECK: # %bb.0: # %entry
282-
; CHECK-NEXT: vfpclasspd $2, %ymm0, %k0
282+
; CHECK-NEXT: vfpclasspd $2, %ymm0, %k0 # k0 = isPositiveZero(ymm0)
283283
; CHECK-NEXT: kmovw %k0, %eax
284284
; CHECK-NEXT: # kill: def $al killed $al killed $eax
285285
; CHECK-NEXT: vzeroupper
@@ -322,7 +322,7 @@ declare <4 x i1> @llvm.x86.avx512.fpclass.ps.128(<4 x float>, i32)
322322
define zeroext i8 @test_mm_fpclass_ps_mask(<4 x float> %__A) {
323323
; CHECK-LABEL: test_mm_fpclass_ps_mask:
324324
; CHECK: # %bb.0: # %entry
325-
; CHECK-NEXT: vfpclassps $2, %xmm0, %k0
325+
; CHECK-NEXT: vfpclassps $2, %xmm0, %k0 # k0 = isPositiveZero(xmm0)
326326
; CHECK-NEXT: kmovw %k0, %eax
327327
; CHECK-NEXT: # kill: def $al killed $al killed $eax
328328
; CHECK-NEXT: ret{{[l|q]}}
@@ -336,7 +336,7 @@ entry:
336336
define zeroext i8 @test_mm256_mask_fpclass_ps_mask(i8 zeroext %__U, <8 x float> %__A) {
337337
; X86-LABEL: test_mm256_mask_fpclass_ps_mask:
338338
; X86: # %bb.0: # %entry
339-
; X86-NEXT: vfpclassps $2, %ymm0, %k0
339+
; X86-NEXT: vfpclassps $2, %ymm0, %k0 # k0 = isPositiveZero(ymm0)
340340
; X86-NEXT: kmovw %k0, %eax
341341
; X86-NEXT: andb {{[0-9]+}}(%esp), %al
342342
; X86-NEXT: # kill: def $al killed $al killed $eax
@@ -345,7 +345,7 @@ define zeroext i8 @test_mm256_mask_fpclass_ps_mask(i8 zeroext %__U, <8 x float>
345345
;
346346
; X64-LABEL: test_mm256_mask_fpclass_ps_mask:
347347
; X64: # %bb.0: # %entry
348-
; X64-NEXT: vfpclassps $2, %ymm0, %k0
348+
; X64-NEXT: vfpclassps $2, %ymm0, %k0 # k0 = isPositiveZero(ymm0)
349349
; X64-NEXT: kmovw %k0, %eax
350350
; X64-NEXT: andb %dil, %al
351351
; X64-NEXT: # kill: def $al killed $al killed $eax
@@ -364,7 +364,7 @@ declare <8 x i1> @llvm.x86.avx512.fpclass.ps.256(<8 x float>, i32)
364364
define zeroext i8 @test_mm256_fpclass_ps_mask(<8 x float> %__A) {
365365
; CHECK-LABEL: test_mm256_fpclass_ps_mask:
366366
; CHECK: # %bb.0: # %entry
367-
; CHECK-NEXT: vfpclassps $2, %ymm0, %k0
367+
; CHECK-NEXT: vfpclassps $2, %ymm0, %k0 # k0 = isPositiveZero(ymm0)
368368
; CHECK-NEXT: kmovw %k0, %eax
369369
; CHECK-NEXT: # kill: def $al killed $al killed $eax
370370
; CHECK-NEXT: vzeroupper

0 commit comments

Comments
 (0)