xref: /aosp_15_r20/external/llvm/test/CodeGen/AArch64/bitreverse.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=aarch64-eabi %s -o - | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker
3*9880d681SAndroid Build Coastguard Worker; These tests just check that the plumbing is in place for @llvm.bitreverse. The
4*9880d681SAndroid Build Coastguard Worker; actual output is massive at the moment as llvm.bitreverse is not yet legal.
5*9880d681SAndroid Build Coastguard Worker
6*9880d681SAndroid Build Coastguard Workerdeclare <2 x i16> @llvm.bitreverse.v2i16(<2 x i16>) readnone
7*9880d681SAndroid Build Coastguard Worker
8*9880d681SAndroid Build Coastguard Workerdefine <2 x i16> @f(<2 x i16> %a) {
9*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f:
10*9880d681SAndroid Build Coastguard Worker; CHECK: rev32
11*9880d681SAndroid Build Coastguard Worker; CHECK: ushr
12*9880d681SAndroid Build Coastguard Worker  %b = call <2 x i16> @llvm.bitreverse.v2i16(<2 x i16> %a)
13*9880d681SAndroid Build Coastguard Worker  ret <2 x i16> %b
14*9880d681SAndroid Build Coastguard Worker}
15*9880d681SAndroid Build Coastguard Worker
16*9880d681SAndroid Build Coastguard Workerdeclare i8 @llvm.bitreverse.i8(i8) readnone
17*9880d681SAndroid Build Coastguard Worker
18*9880d681SAndroid Build Coastguard Worker; Unfortunately some of the shift-and-inserts become BFIs, and some do not :(
19*9880d681SAndroid Build Coastguard Workerdefine i8 @g(i8 %a) {
20*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: g:
21*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: lsr [[S5:w.*]], w0, #5
22*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: lsr [[S4:w.*]], w0, #4
23*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: lsr [[S3:w.*]], w0, #3
24*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: lsr [[S2:w.*]], w0, #2
25*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: lsl [[L1:w.*]], w0, #29
26*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: lsl [[L2:w.*]], w0, #19
27*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: lsl [[L3:w.*]], w0, #17
28*9880d681SAndroid Build Coastguard Worker
29*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: and [[T1:w.*]], [[L1]], #0x40000000
30*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: bfi [[T1]], w0, #31, #1
31*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: bfi [[T1]], [[S2]], #29, #1
32*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: bfi [[T1]], [[S3]], #28, #1
33*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: bfi [[T1]], [[S4]], #27, #1
34*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: bfi [[T1]], [[S5]], #26, #1
35*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: and [[T2:w.*]], [[L2]], #0x2000000
36*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: and [[T3:w.*]], [[L3]], #0x1000000
37*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: orr [[T4:w.*]], [[T1]], [[T2]]
38*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: orr [[T5:w.*]], [[T4]], [[T3]]
39*9880d681SAndroid Build Coastguard Worker; CHECK:     lsr w0, [[T5]], #24
40*9880d681SAndroid Build Coastguard Worker
41*9880d681SAndroid Build Coastguard Worker  %b = call i8 @llvm.bitreverse.i8(i8 %a)
42*9880d681SAndroid Build Coastguard Worker  ret i8 %b
43*9880d681SAndroid Build Coastguard Worker}
44*9880d681SAndroid Build Coastguard Worker
45*9880d681SAndroid Build Coastguard Workerdeclare <8 x i8> @llvm.bitreverse.v8i8(<8 x i8>) readnone
46*9880d681SAndroid Build Coastguard Worker
47*9880d681SAndroid Build Coastguard Workerdefine <8 x i8> @g_vec(<8 x i8> %a) {
48*9880d681SAndroid Build Coastguard Worker; Try and match as much of the sequence as precisely as possible.
49*9880d681SAndroid Build Coastguard Worker
50*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: g_vec:
51*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: movi [[M1:v.*]], #128
52*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: movi [[M2:v.*]], #64
53*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: movi [[M3:v.*]], #32
54*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: movi [[M4:v.*]], #16
55*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: movi [[M5:v.*]], #8{{$}}
56*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: movi [[M6:v.*]], #4{{$}}
57*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: movi [[M7:v.*]], #2{{$}}
58*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: movi [[M8:v.*]], #1{{$}}
59*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: shl  [[S1:v.*]], v0.8b, #7
60*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: shl  [[S2:v.*]], v0.8b, #5
61*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: shl  [[S3:v.*]], v0.8b, #3
62*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: shl  [[S4:v.*]], v0.8b, #1
63*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: ushr [[S5:v.*]], v0.8b, #1
64*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: ushr [[S6:v.*]], v0.8b, #3
65*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: ushr [[S7:v.*]], v0.8b, #5
66*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: ushr [[S8:v.*]], v0.8b, #7
67*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: and  [[A1:v.*]], [[S1]], [[M1]]
68*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: and  [[A2:v.*]], [[S2]], [[M2]]
69*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: and  [[A3:v.*]], [[S3]], [[M3]]
70*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: and  [[A4:v.*]], [[S4]], [[M4]]
71*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: and  [[A5:v.*]], [[S5]], [[M5]]
72*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: and  [[A6:v.*]], [[S6]], [[M6]]
73*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: and  [[A7:v.*]], [[S7]], [[M7]]
74*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: and  [[A8:v.*]], [[S8]], [[M8]]
75*9880d681SAndroid Build Coastguard Worker
76*9880d681SAndroid Build Coastguard Worker; The rest can be ORRed together in any order; it's not worth the test
77*9880d681SAndroid Build Coastguard Worker; maintenance to match them precisely.
78*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: orr
79*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: orr
80*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: orr
81*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: orr
82*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: orr
83*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: orr
84*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: orr
85*9880d681SAndroid Build Coastguard Worker; CHECK: ret
86*9880d681SAndroid Build Coastguard Worker  %b = call <8 x i8> @llvm.bitreverse.v8i8(<8 x i8> %a)
87*9880d681SAndroid Build Coastguard Worker  ret <8 x i8> %b
88*9880d681SAndroid Build Coastguard Worker}
89