Skip to content

Commit 3a15c6a

Browse files
committed
Fix #148238
1 parent 8919364 commit 3a15c6a

File tree

2 files changed

+56
-48
lines changed

2 files changed

+56
-48
lines changed

llvm/lib/Target/X86/X86ISelLowering.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1328,6 +1328,7 @@ X86TargetLowering::X86TargetLowering(const X86TargetMachine &TM,
13281328
setOperationAction(ISD::BITREVERSE, MVT::i16, Custom);
13291329
setOperationAction(ISD::BITREVERSE, MVT::i32, Custom);
13301330
setOperationAction(ISD::BITREVERSE, MVT::i64, Custom);
1331+
setOperationAction(ISD::BITREVERSE, MVT::v16i8, Custom);
13311332
}
13321333

13331334
if (!Subtarget.useSoftFloat() && Subtarget.hasSSSE3()) {
@@ -32694,7 +32695,8 @@ static SDValue LowerBITREVERSE(SDValue Op, const X86Subtarget &Subtarget,
3269432695
if (Subtarget.hasXOP() && !VT.is512BitVector())
3269532696
return LowerBITREVERSE_XOP(Op, DAG);
3269632697

32697-
assert(Subtarget.hasSSSE3() && "SSSE3 required for BITREVERSE");
32698+
assert((Subtarget.hasSSSE3() || Subtarget.hasGFNI()) &&
32699+
"SSSE3 or GFNI required for BITREVERSE");
3269832700

3269932701
SDValue In = Op.getOperand(0);
3270032702
SDLoc DL(Op);

llvm/test/CodeGen/X86/vector-bitreverse.ll

Lines changed: 53 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512vl,+avx512bw | FileCheck %s --check-prefixes=ALL,AVX,AVX512,AVX512BW
99
; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+xop,+avx | FileCheck %s --check-prefixes=ALL,XOP,XOPAVX1
1010
; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+xop,+avx2 | FileCheck %s --check-prefixes=ALL,XOP,XOPAVX2
11+
; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+gfni | FileCheck %s --check-prefixes=ALL,GFNIPURE
1112
; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+ssse3,+gfni | FileCheck %s --check-prefixes=ALL,GFNISSE
1213
; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx,+gfni | FileCheck %s --check-prefixes=ALL,GFNIAVX,GFNIAVX1
1314
; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2,+gfni | FileCheck %s --check-prefixes=ALL,GFNIAVX,GFNIAVX2
@@ -60,13 +61,13 @@ define i8 @test_bitreverse_i8(i8 %a) nounwind {
6061
; XOP-NEXT: # kill: def $al killed $al killed $eax
6162
; XOP-NEXT: retq
6263
;
63-
; GFNISSE-LABEL: test_bitreverse_i8:
64-
; GFNISSE: # %bb.0:
65-
; GFNISSE-NEXT: movd %edi, %xmm0
66-
; GFNISSE-NEXT: gf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
67-
; GFNISSE-NEXT: movd %xmm0, %eax
68-
; GFNISSE-NEXT: # kill: def $al killed $al killed $eax
69-
; GFNISSE-NEXT: retq
64+
; GFNIPURE-LABEL: test_bitreverse_i8:
65+
; GFNIPURE: # %bb.0:
66+
; GFNIPURE-NEXT: movd %edi, %xmm0
67+
; GFNIPURE-NEXT: gf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
68+
; GFNIPURE-NEXT: movd %xmm0, %eax
69+
; GFNIPURE-NEXT: # kill: def $al killed $al killed $eax
70+
; GFNIPURE-NEXT: retq
7071
;
7172
; GFNIAVX-LABEL: test_bitreverse_i8:
7273
; GFNIAVX: # %bb.0:
@@ -134,14 +135,14 @@ define i16 @test_bitreverse_i16(i16 %a) nounwind {
134135
; XOP-NEXT: # kill: def $ax killed $ax killed $eax
135136
; XOP-NEXT: retq
136137
;
137-
; GFNISSE-LABEL: test_bitreverse_i16:
138-
; GFNISSE: # %bb.0:
139-
; GFNISSE-NEXT: movd %edi, %xmm0
140-
; GFNISSE-NEXT: gf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
141-
; GFNISSE-NEXT: movd %xmm0, %eax
142-
; GFNISSE-NEXT: rolw $8, %ax
143-
; GFNISSE-NEXT: # kill: def $ax killed $ax killed $eax
144-
; GFNISSE-NEXT: retq
138+
; GFNIPURE-LABEL: test_bitreverse_i16:
139+
; GFNIPURE: # %bb.0:
140+
; GFNIPURE-NEXT: movd %edi, %xmm0
141+
; GFNIPURE-NEXT: gf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
142+
; GFNIPURE-NEXT: movd %xmm0, %eax
143+
; GFNIPURE-NEXT: rolw $8, %ax
144+
; GFNIPURE-NEXT: # kill: def $ax killed $ax killed $eax
145+
; GFNIPURE-NEXT: retq
145146
;
146147
; GFNIAVX-LABEL: test_bitreverse_i16:
147148
; GFNIAVX: # %bb.0:
@@ -207,13 +208,13 @@ define i32 @test_bitreverse_i32(i32 %a) nounwind {
207208
; XOP-NEXT: vmovd %xmm0, %eax
208209
; XOP-NEXT: retq
209210
;
210-
; GFNISSE-LABEL: test_bitreverse_i32:
211-
; GFNISSE: # %bb.0:
212-
; GFNISSE-NEXT: movd %edi, %xmm0
213-
; GFNISSE-NEXT: gf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
214-
; GFNISSE-NEXT: movd %xmm0, %eax
215-
; GFNISSE-NEXT: bswapl %eax
216-
; GFNISSE-NEXT: retq
211+
; GFNIPURE-LABEL: test_bitreverse_i32:
212+
; GFNIPURE: # %bb.0:
213+
; GFNIPURE-NEXT: movd %edi, %xmm0
214+
; GFNIPURE-NEXT: gf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
215+
; GFNIPURE-NEXT: movd %xmm0, %eax
216+
; GFNIPURE-NEXT: bswapl %eax
217+
; GFNIPURE-NEXT: retq
217218
;
218219
; GFNIAVX-LABEL: test_bitreverse_i32:
219220
; GFNIAVX: # %bb.0:
@@ -282,13 +283,13 @@ define i64 @test_bitreverse_i64(i64 %a) nounwind {
282283
; XOP-NEXT: vmovq %xmm0, %rax
283284
; XOP-NEXT: retq
284285
;
285-
; GFNISSE-LABEL: test_bitreverse_i64:
286-
; GFNISSE: # %bb.0:
287-
; GFNISSE-NEXT: movq %rdi, %xmm0
288-
; GFNISSE-NEXT: gf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
289-
; GFNISSE-NEXT: movq %xmm0, %rax
290-
; GFNISSE-NEXT: bswapq %rax
291-
; GFNISSE-NEXT: retq
286+
; GFNIPURE-LABEL: test_bitreverse_i64:
287+
; GFNIPURE: # %bb.0:
288+
; GFNIPURE-NEXT: movq %rdi, %xmm0
289+
; GFNIPURE-NEXT: gf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
290+
; GFNIPURE-NEXT: movq %xmm0, %rax
291+
; GFNIPURE-NEXT: bswapq %rax
292+
; GFNIPURE-NEXT: retq
292293
;
293294
; GFNIAVX-LABEL: test_bitreverse_i64:
294295
; GFNIAVX: # %bb.0:
@@ -386,10 +387,10 @@ define <16 x i8> @test_bitreverse_v16i8(<16 x i8> %a) nounwind {
386387
; XOP-NEXT: vpperm {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0, %xmm0
387388
; XOP-NEXT: retq
388389
;
389-
; GFNISSE-LABEL: test_bitreverse_v16i8:
390-
; GFNISSE: # %bb.0:
391-
; GFNISSE-NEXT: gf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
392-
; GFNISSE-NEXT: retq
390+
; GFNIPURE-LABEL: test_bitreverse_v16i8:
391+
; GFNIPURE: # %bb.0:
392+
; GFNIPURE-NEXT: gf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
393+
; GFNIPURE-NEXT: retq
393394
;
394395
; GFNIAVX-LABEL: test_bitreverse_v16i8:
395396
; GFNIAVX: # %bb.0:
@@ -873,12 +874,12 @@ define <32 x i8> @test_bitreverse_v32i8(<32 x i8> %a) nounwind {
873874
; XOPAVX2-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0
874875
; XOPAVX2-NEXT: retq
875876
;
876-
; GFNISSE-LABEL: test_bitreverse_v32i8:
877-
; GFNISSE: # %bb.0:
878-
; GFNISSE-NEXT: movdqa {{.*#+}} xmm2 = [1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128]
879-
; GFNISSE-NEXT: gf2p8affineqb $0, %xmm2, %xmm0
880-
; GFNISSE-NEXT: gf2p8affineqb $0, %xmm2, %xmm1
881-
; GFNISSE-NEXT: retq
877+
; GFNIPURE-LABEL: test_bitreverse_v32i8:
878+
; GFNIPURE: # %bb.0:
879+
; GFNIPURE-NEXT: movdqa {{.*#+}} xmm2 = [1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128]
880+
; GFNIPURE-NEXT: gf2p8affineqb $0, %xmm2, %xmm0
881+
; GFNIPURE-NEXT: gf2p8affineqb $0, %xmm2, %xmm1
882+
; GFNIPURE-NEXT: retq
882883
;
883884
; GFNIAVX-LABEL: test_bitreverse_v32i8:
884885
; GFNIAVX: # %bb.0:
@@ -1724,14 +1725,14 @@ define <64 x i8> @test_bitreverse_v64i8(<64 x i8> %a) nounwind {
17241725
; XOPAVX2-NEXT: vinserti128 $1, %xmm2, %ymm1, %ymm1
17251726
; XOPAVX2-NEXT: retq
17261727
;
1727-
; GFNISSE-LABEL: test_bitreverse_v64i8:
1728-
; GFNISSE: # %bb.0:
1729-
; GFNISSE-NEXT: movdqa {{.*#+}} xmm4 = [1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128]
1730-
; GFNISSE-NEXT: gf2p8affineqb $0, %xmm4, %xmm0
1731-
; GFNISSE-NEXT: gf2p8affineqb $0, %xmm4, %xmm1
1732-
; GFNISSE-NEXT: gf2p8affineqb $0, %xmm4, %xmm2
1733-
; GFNISSE-NEXT: gf2p8affineqb $0, %xmm4, %xmm3
1734-
; GFNISSE-NEXT: retq
1728+
; GFNIPURE-LABEL: test_bitreverse_v64i8:
1729+
; GFNIPURE: # %bb.0:
1730+
; GFNIPURE-NEXT: movdqa {{.*#+}} xmm4 = [1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128]
1731+
; GFNIPURE-NEXT: gf2p8affineqb $0, %xmm4, %xmm0
1732+
; GFNIPURE-NEXT: gf2p8affineqb $0, %xmm4, %xmm1
1733+
; GFNIPURE-NEXT: gf2p8affineqb $0, %xmm4, %xmm2
1734+
; GFNIPURE-NEXT: gf2p8affineqb $0, %xmm4, %xmm3
1735+
; GFNIPURE-NEXT: retq
17351736
;
17361737
; GFNIAVX1-LABEL: test_bitreverse_v64i8:
17371738
; GFNIAVX1: # %bb.0:
@@ -2849,6 +2850,11 @@ define <16 x i8> @fold_bitreverse_v16i8() nounwind {
28492850
; XOP-NEXT: vmovaps {{.*#+}} xmm0 = [0,255,64,191,32,223,96,159,16,239,80,175,48,207,112,143]
28502851
; XOP-NEXT: retq
28512852
;
2853+
; GFNIPURE-LABEL: fold_bitreverse_v16i8:
2854+
; GFNIPURE: # %bb.0:
2855+
; GFNIPURE-NEXT: movaps {{.*#+}} xmm0 = [0,255,64,191,32,223,96,159,16,239,80,175,48,207,112,143]
2856+
; GFNIPURE-NEXT: retq
2857+
;
28522858
; GFNISSE-LABEL: fold_bitreverse_v16i8:
28532859
; GFNISSE: # %bb.0:
28542860
; GFNISSE-NEXT: movaps {{.*#+}} xmm0 = [0,255,64,191,32,223,96,159,16,239,80,175,48,207,112,143]

0 commit comments

Comments
 (0)