xref: /llvm-project/llvm/test/CodeGen/LoongArch/bitreverse.ll (revision 9d4f7f44b64d87d1068859906f43b7ce03a7388b)
1326f7aedSWANG Xuerui; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2*9d4f7f44Swanglei; RUN: llc --mtriple=loongarch32 -mattr=+d --verify-machineinstrs < %s \
3326f7aedSWANG Xuerui; RUN:   | FileCheck %s --check-prefix=LA32
4*9d4f7f44Swanglei; RUN: llc --mtriple=loongarch64 -mattr=+d --verify-machineinstrs < %s \
5326f7aedSWANG Xuerui; RUN:   | FileCheck %s --check-prefix=LA64
6326f7aedSWANG Xuerui
7326f7aedSWANG Xueruideclare i7 @llvm.bitreverse.i7(i7)
8326f7aedSWANG Xueruideclare i8 @llvm.bitreverse.i8(i8)
9326f7aedSWANG Xueruideclare i16 @llvm.bitreverse.i16(i16)
10326f7aedSWANG Xueruideclare i24 @llvm.bitreverse.i24(i24)
11326f7aedSWANG Xueruideclare i32 @llvm.bitreverse.i32(i32)
12326f7aedSWANG Xueruideclare i48 @llvm.bitreverse.i48(i48)
13326f7aedSWANG Xueruideclare i64 @llvm.bitreverse.i64(i64)
14326f7aedSWANG Xueruideclare i77 @llvm.bitreverse.i77(i77)
15326f7aedSWANG Xueruideclare i128 @llvm.bitreverse.i128(i128)
16326f7aedSWANG Xuerui
17326f7aedSWANG Xueruidefine i8 @test_bitreverse_i8(i8 %a) nounwind {
18326f7aedSWANG Xuerui; LA32-LABEL: test_bitreverse_i8:
19326f7aedSWANG Xuerui; LA32:       # %bb.0:
20326f7aedSWANG Xuerui; LA32-NEXT:    bitrev.4b $a0, $a0
21ed078c48SWANG Xuerui; LA32-NEXT:    ret
22326f7aedSWANG Xuerui;
23326f7aedSWANG Xuerui; LA64-LABEL: test_bitreverse_i8:
24326f7aedSWANG Xuerui; LA64:       # %bb.0:
25326f7aedSWANG Xuerui; LA64-NEXT:    bitrev.4b $a0, $a0
26ed078c48SWANG Xuerui; LA64-NEXT:    ret
27326f7aedSWANG Xuerui  %tmp = call i8 @llvm.bitreverse.i8(i8 %a)
28326f7aedSWANG Xuerui  ret i8 %tmp
29326f7aedSWANG Xuerui}
30326f7aedSWANG Xuerui
31326f7aedSWANG Xueruidefine i16 @test_bitreverse_i16(i16 %a) nounwind {
32326f7aedSWANG Xuerui; LA32-LABEL: test_bitreverse_i16:
33326f7aedSWANG Xuerui; LA32:       # %bb.0:
34326f7aedSWANG Xuerui; LA32-NEXT:    bitrev.w $a0, $a0
35326f7aedSWANG Xuerui; LA32-NEXT:    srli.w $a0, $a0, 16
36ed078c48SWANG Xuerui; LA32-NEXT:    ret
37326f7aedSWANG Xuerui;
38326f7aedSWANG Xuerui; LA64-LABEL: test_bitreverse_i16:
39326f7aedSWANG Xuerui; LA64:       # %bb.0:
40326f7aedSWANG Xuerui; LA64-NEXT:    bitrev.d $a0, $a0
41326f7aedSWANG Xuerui; LA64-NEXT:    srli.d $a0, $a0, 48
42ed078c48SWANG Xuerui; LA64-NEXT:    ret
43326f7aedSWANG Xuerui  %tmp = call i16 @llvm.bitreverse.i16(i16 %a)
44326f7aedSWANG Xuerui  ret i16 %tmp
45326f7aedSWANG Xuerui}
46326f7aedSWANG Xuerui
47326f7aedSWANG Xueruidefine i32 @test_bitreverse_i32(i32 %a) nounwind {
48326f7aedSWANG Xuerui; LA32-LABEL: test_bitreverse_i32:
49326f7aedSWANG Xuerui; LA32:       # %bb.0:
50326f7aedSWANG Xuerui; LA32-NEXT:    bitrev.w $a0, $a0
51ed078c48SWANG Xuerui; LA32-NEXT:    ret
52326f7aedSWANG Xuerui;
53326f7aedSWANG Xuerui; LA64-LABEL: test_bitreverse_i32:
54326f7aedSWANG Xuerui; LA64:       # %bb.0:
55326f7aedSWANG Xuerui; LA64-NEXT:    bitrev.w $a0, $a0
56ed078c48SWANG Xuerui; LA64-NEXT:    ret
57326f7aedSWANG Xuerui  %tmp = call i32 @llvm.bitreverse.i32(i32 %a)
58326f7aedSWANG Xuerui  ret i32 %tmp
59326f7aedSWANG Xuerui}
60326f7aedSWANG Xuerui
61326f7aedSWANG Xueruidefine i64 @test_bitreverse_i64(i64 %a) nounwind {
62326f7aedSWANG Xuerui; LA32-LABEL: test_bitreverse_i64:
63326f7aedSWANG Xuerui; LA32:       # %bb.0:
64326f7aedSWANG Xuerui; LA32-NEXT:    bitrev.w $a2, $a1
65326f7aedSWANG Xuerui; LA32-NEXT:    bitrev.w $a1, $a0
66326f7aedSWANG Xuerui; LA32-NEXT:    move $a0, $a2
67ed078c48SWANG Xuerui; LA32-NEXT:    ret
68326f7aedSWANG Xuerui;
69326f7aedSWANG Xuerui; LA64-LABEL: test_bitreverse_i64:
70326f7aedSWANG Xuerui; LA64:       # %bb.0:
71326f7aedSWANG Xuerui; LA64-NEXT:    bitrev.d $a0, $a0
72ed078c48SWANG Xuerui; LA64-NEXT:    ret
73326f7aedSWANG Xuerui  %tmp = call i64 @llvm.bitreverse.i64(i64 %a)
74326f7aedSWANG Xuerui  ret i64 %tmp
75326f7aedSWANG Xuerui}
76326f7aedSWANG Xuerui
77326f7aedSWANG Xuerui;; Bitreverse on non-native integer widths.
78326f7aedSWANG Xuerui
79326f7aedSWANG Xueruidefine i7 @test_bitreverse_i7(i7 %a) nounwind {
80326f7aedSWANG Xuerui; LA32-LABEL: test_bitreverse_i7:
81326f7aedSWANG Xuerui; LA32:       # %bb.0:
82326f7aedSWANG Xuerui; LA32-NEXT:    bitrev.w $a0, $a0
83326f7aedSWANG Xuerui; LA32-NEXT:    srli.w $a0, $a0, 25
84ed078c48SWANG Xuerui; LA32-NEXT:    ret
85326f7aedSWANG Xuerui;
86326f7aedSWANG Xuerui; LA64-LABEL: test_bitreverse_i7:
87326f7aedSWANG Xuerui; LA64:       # %bb.0:
88326f7aedSWANG Xuerui; LA64-NEXT:    bitrev.d $a0, $a0
89326f7aedSWANG Xuerui; LA64-NEXT:    srli.d $a0, $a0, 57
90ed078c48SWANG Xuerui; LA64-NEXT:    ret
91326f7aedSWANG Xuerui  %tmp = call i7 @llvm.bitreverse.i7(i7 %a)
92326f7aedSWANG Xuerui  ret i7 %tmp
93326f7aedSWANG Xuerui}
94326f7aedSWANG Xuerui
95326f7aedSWANG Xueruidefine i24 @test_bitreverse_i24(i24 %a) nounwind {
96326f7aedSWANG Xuerui; LA32-LABEL: test_bitreverse_i24:
97326f7aedSWANG Xuerui; LA32:       # %bb.0:
98326f7aedSWANG Xuerui; LA32-NEXT:    bitrev.w $a0, $a0
99326f7aedSWANG Xuerui; LA32-NEXT:    srli.w $a0, $a0, 8
100ed078c48SWANG Xuerui; LA32-NEXT:    ret
101326f7aedSWANG Xuerui;
102326f7aedSWANG Xuerui; LA64-LABEL: test_bitreverse_i24:
103326f7aedSWANG Xuerui; LA64:       # %bb.0:
104326f7aedSWANG Xuerui; LA64-NEXT:    bitrev.d $a0, $a0
105326f7aedSWANG Xuerui; LA64-NEXT:    srli.d $a0, $a0, 40
106ed078c48SWANG Xuerui; LA64-NEXT:    ret
107326f7aedSWANG Xuerui  %tmp = call i24 @llvm.bitreverse.i24(i24 %a)
108326f7aedSWANG Xuerui  ret i24 %tmp
109326f7aedSWANG Xuerui}
110326f7aedSWANG Xuerui
111326f7aedSWANG Xueruidefine i48 @test_bitreverse_i48(i48 %a) nounwind {
112326f7aedSWANG Xuerui; LA32-LABEL: test_bitreverse_i48:
113326f7aedSWANG Xuerui; LA32:       # %bb.0:
114326f7aedSWANG Xuerui; LA32-NEXT:    bitrev.w $a2, $a0
11519e2ebbfSWANG Xuerui; LA32-NEXT:    bitrev.w $a0, $a1
11619e2ebbfSWANG Xuerui; LA32-NEXT:    bytepick.w $a0, $a0, $a2, 2
117326f7aedSWANG Xuerui; LA32-NEXT:    srli.w $a1, $a2, 16
118ed078c48SWANG Xuerui; LA32-NEXT:    ret
119326f7aedSWANG Xuerui;
120326f7aedSWANG Xuerui; LA64-LABEL: test_bitreverse_i48:
121326f7aedSWANG Xuerui; LA64:       # %bb.0:
122326f7aedSWANG Xuerui; LA64-NEXT:    bitrev.d $a0, $a0
123326f7aedSWANG Xuerui; LA64-NEXT:    srli.d $a0, $a0, 16
124ed078c48SWANG Xuerui; LA64-NEXT:    ret
125326f7aedSWANG Xuerui  %tmp = call i48 @llvm.bitreverse.i48(i48 %a)
126326f7aedSWANG Xuerui  ret i48 %tmp
127326f7aedSWANG Xuerui}
128326f7aedSWANG Xuerui
129326f7aedSWANG Xueruidefine i77 @test_bitreverse_i77(i77 %a) nounwind {
130326f7aedSWANG Xuerui; LA32-LABEL: test_bitreverse_i77:
131326f7aedSWANG Xuerui; LA32:       # %bb.0:
132a5c90e48Swanglei; LA32-NEXT:    ld.w $a2, $a1, 4
133a5c90e48Swanglei; LA32-NEXT:    ld.w $a3, $a1, 8
134a5c90e48Swanglei; LA32-NEXT:    ld.w $a1, $a1, 0
135326f7aedSWANG Xuerui; LA32-NEXT:    bitrev.w $a2, $a2
136a5c90e48Swanglei; LA32-NEXT:    slli.w $a4, $a2, 13
137326f7aedSWANG Xuerui; LA32-NEXT:    bitrev.w $a3, $a3
138a5c90e48Swanglei; LA32-NEXT:    srli.w $a3, $a3, 19
139a5c90e48Swanglei; LA32-NEXT:    or $a3, $a3, $a4
140326f7aedSWANG Xuerui; LA32-NEXT:    srli.w $a2, $a2, 19
141326f7aedSWANG Xuerui; LA32-NEXT:    bitrev.w $a1, $a1
142a5c90e48Swanglei; LA32-NEXT:    slli.w $a4, $a1, 13
143a5c90e48Swanglei; LA32-NEXT:    or $a2, $a4, $a2
144326f7aedSWANG Xuerui; LA32-NEXT:    srli.w $a1, $a1, 19
145a5c90e48Swanglei; LA32-NEXT:    st.h $a1, $a0, 8
146a5c90e48Swanglei; LA32-NEXT:    st.w $a2, $a0, 4
147a5c90e48Swanglei; LA32-NEXT:    st.w $a3, $a0, 0
148ed078c48SWANG Xuerui; LA32-NEXT:    ret
149326f7aedSWANG Xuerui;
150326f7aedSWANG Xuerui; LA64-LABEL: test_bitreverse_i77:
151326f7aedSWANG Xuerui; LA64:       # %bb.0:
152326f7aedSWANG Xuerui; LA64-NEXT:    bitrev.d $a2, $a0
153326f7aedSWANG Xuerui; LA64-NEXT:    slli.d $a0, $a2, 13
154a5c90e48Swanglei; LA64-NEXT:    bitrev.d $a1, $a1
155a5c90e48Swanglei; LA64-NEXT:    srli.d $a1, $a1, 51
156326f7aedSWANG Xuerui; LA64-NEXT:    or $a0, $a1, $a0
157326f7aedSWANG Xuerui; LA64-NEXT:    srli.d $a1, $a2, 51
158ed078c48SWANG Xuerui; LA64-NEXT:    ret
159326f7aedSWANG Xuerui  %tmp = call i77 @llvm.bitreverse.i77(i77 %a)
160326f7aedSWANG Xuerui  ret i77 %tmp
161326f7aedSWANG Xuerui}
162326f7aedSWANG Xuerui
163326f7aedSWANG Xueruidefine i128 @test_bitreverse_i128(i128 %a) nounwind {
164326f7aedSWANG Xuerui; LA32-LABEL: test_bitreverse_i128:
165326f7aedSWANG Xuerui; LA32:       # %bb.0:
166a5c90e48Swanglei; LA32-NEXT:    ld.w $a2, $a1, 12
167a5c90e48Swanglei; LA32-NEXT:    ld.w $a3, $a1, 8
168a5c90e48Swanglei; LA32-NEXT:    ld.w $a4, $a1, 4
169a5c90e48Swanglei; LA32-NEXT:    ld.w $a1, $a1, 0
170326f7aedSWANG Xuerui; LA32-NEXT:    bitrev.w $a2, $a2
171a5c90e48Swanglei; LA32-NEXT:    bitrev.w $a3, $a3
172a5c90e48Swanglei; LA32-NEXT:    bitrev.w $a4, $a4
173326f7aedSWANG Xuerui; LA32-NEXT:    bitrev.w $a1, $a1
174a5c90e48Swanglei; LA32-NEXT:    st.w $a1, $a0, 12
175a5c90e48Swanglei; LA32-NEXT:    st.w $a4, $a0, 8
176a5c90e48Swanglei; LA32-NEXT:    st.w $a3, $a0, 4
177a5c90e48Swanglei; LA32-NEXT:    st.w $a2, $a0, 0
178ed078c48SWANG Xuerui; LA32-NEXT:    ret
179326f7aedSWANG Xuerui;
180326f7aedSWANG Xuerui; LA64-LABEL: test_bitreverse_i128:
181326f7aedSWANG Xuerui; LA64:       # %bb.0:
182326f7aedSWANG Xuerui; LA64-NEXT:    bitrev.d $a2, $a1
183326f7aedSWANG Xuerui; LA64-NEXT:    bitrev.d $a1, $a0
184326f7aedSWANG Xuerui; LA64-NEXT:    move $a0, $a2
185ed078c48SWANG Xuerui; LA64-NEXT:    ret
186326f7aedSWANG Xuerui  %tmp = call i128 @llvm.bitreverse.i128(i128 %a)
187326f7aedSWANG Xuerui  ret i128 %tmp
188326f7aedSWANG Xuerui}
189