Revert " [LoongArch][ISel] Check the number of sign bits in `PatGprGpr_32` (#107432)"
[llvm-project.git] / llvm / test / CodeGen / LoongArch / bswap-bitreverse.ll
blobc8f9596b9b0c11362d831e527c52883ad7b56702
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc --mtriple=loongarch32 -mattr=+d --verify-machineinstrs < %s \
3 ; RUN:   | FileCheck %s --check-prefix=LA32
4 ; RUN: llc --mtriple=loongarch64 -mattr=+d --verify-machineinstrs < %s \
5 ; RUN:   | FileCheck %s --check-prefix=LA64
7 declare i16 @llvm.bitreverse.i16(i16)
8 declare i32 @llvm.bitreverse.i32(i32)
9 declare i64 @llvm.bitreverse.i64(i64)
10 declare i16 @llvm.bswap.i16(i16)
11 declare i32 @llvm.bswap.i32(i32)
12 declare i64 @llvm.bswap.i64(i64)
14 define i16 @test_bswap_bitreverse_i16(i16 %a) nounwind {
15 ; LA32-LABEL: test_bswap_bitreverse_i16:
16 ; LA32:       # %bb.0:
17 ; LA32-NEXT:    revb.2h $a0, $a0
18 ; LA32-NEXT:    bitrev.w $a0, $a0
19 ; LA32-NEXT:    srli.w $a0, $a0, 16
20 ; LA32-NEXT:    ret
22 ; LA64-LABEL: test_bswap_bitreverse_i16:
23 ; LA64:       # %bb.0:
24 ; LA64-NEXT:    revb.2h $a0, $a0
25 ; LA64-NEXT:    bitrev.d $a0, $a0
26 ; LA64-NEXT:    srli.d $a0, $a0, 48
27 ; LA64-NEXT:    ret
28   %tmp = call i16 @llvm.bswap.i16(i16 %a)
29   %tmp2 = call i16 @llvm.bitreverse.i16(i16 %tmp)
30   ret i16 %tmp2
33 define i32 @test_bswap_bitreverse_i32(i32 %a) nounwind {
34 ; LA32-LABEL: test_bswap_bitreverse_i32:
35 ; LA32:       # %bb.0:
36 ; LA32-NEXT:    bitrev.4b $a0, $a0
37 ; LA32-NEXT:    ret
39 ; LA64-LABEL: test_bswap_bitreverse_i32:
40 ; LA64:       # %bb.0:
41 ; LA64-NEXT:    bitrev.4b $a0, $a0
42 ; LA64-NEXT:    ret
43   %tmp = call i32 @llvm.bswap.i32(i32 %a)
44   %tmp2 = call i32 @llvm.bitreverse.i32(i32 %tmp)
45   ret i32 %tmp2
48 define i64 @test_bswap_bitreverse_i64(i64 %a) nounwind {
49 ; LA32-LABEL: test_bswap_bitreverse_i64:
50 ; LA32:       # %bb.0:
51 ; LA32-NEXT:    bitrev.4b $a0, $a0
52 ; LA32-NEXT:    bitrev.4b $a1, $a1
53 ; LA32-NEXT:    ret
55 ; LA64-LABEL: test_bswap_bitreverse_i64:
56 ; LA64:       # %bb.0:
57 ; LA64-NEXT:    bitrev.8b $a0, $a0
58 ; LA64-NEXT:    ret
59   %tmp = call i64 @llvm.bswap.i64(i64 %a)
60   %tmp2 = call i64 @llvm.bitreverse.i64(i64 %tmp)
61   ret i64 %tmp2
64 define i16 @test_bitreverse_bswap_i16(i16 %a) nounwind {
65 ; LA32-LABEL: test_bitreverse_bswap_i16:
66 ; LA32:       # %bb.0:
67 ; LA32-NEXT:    revb.2h $a0, $a0
68 ; LA32-NEXT:    bitrev.w $a0, $a0
69 ; LA32-NEXT:    srli.w $a0, $a0, 16
70 ; LA32-NEXT:    ret
72 ; LA64-LABEL: test_bitreverse_bswap_i16:
73 ; LA64:       # %bb.0:
74 ; LA64-NEXT:    revb.2h $a0, $a0
75 ; LA64-NEXT:    bitrev.d $a0, $a0
76 ; LA64-NEXT:    srli.d $a0, $a0, 48
77 ; LA64-NEXT:    ret
78   %tmp = call i16 @llvm.bitreverse.i16(i16 %a)
79   %tmp2 = call i16 @llvm.bswap.i16(i16 %tmp)
80   ret i16 %tmp2
83 define i32 @test_bitreverse_bswap_i32(i32 %a) nounwind {
84 ; LA32-LABEL: test_bitreverse_bswap_i32:
85 ; LA32:       # %bb.0:
86 ; LA32-NEXT:    bitrev.4b $a0, $a0
87 ; LA32-NEXT:    ret
89 ; LA64-LABEL: test_bitreverse_bswap_i32:
90 ; LA64:       # %bb.0:
91 ; LA64-NEXT:    bitrev.4b $a0, $a0
92 ; LA64-NEXT:    ret
93   %tmp = call i32 @llvm.bitreverse.i32(i32 %a)
94   %tmp2 = call i32 @llvm.bswap.i32(i32 %tmp)
95   ret i32 %tmp2
98 define i64 @test_bitreverse_bswap_i64(i64 %a) nounwind {
99 ; LA32-LABEL: test_bitreverse_bswap_i64:
100 ; LA32:       # %bb.0:
101 ; LA32-NEXT:    bitrev.4b $a0, $a0
102 ; LA32-NEXT:    bitrev.4b $a1, $a1
103 ; LA32-NEXT:    ret
105 ; LA64-LABEL: test_bitreverse_bswap_i64:
106 ; LA64:       # %bb.0:
107 ; LA64-NEXT:    bitrev.8b $a0, $a0
108 ; LA64-NEXT:    ret
109   %tmp = call i64 @llvm.bitreverse.i64(i64 %a)
110   %tmp2 = call i64 @llvm.bswap.i64(i64 %tmp)
111   ret i64 %tmp2
114 define i32 @pr55484(i32 %0) {
115 ; LA32-LABEL: pr55484:
116 ; LA32:       # %bb.0:
117 ; LA32-NEXT:    srli.w $a1, $a0, 8
118 ; LA32-NEXT:    slli.w $a0, $a0, 8
119 ; LA32-NEXT:    or $a0, $a1, $a0
120 ; LA32-NEXT:    ext.w.h $a0, $a0
121 ; LA32-NEXT:    ret
123 ; LA64-LABEL: pr55484:
124 ; LA64:       # %bb.0:
125 ; LA64-NEXT:    srli.d $a1, $a0, 8
126 ; LA64-NEXT:    slli.d $a0, $a0, 8
127 ; LA64-NEXT:    or $a0, $a1, $a0
128 ; LA64-NEXT:    ext.w.h $a0, $a0
129 ; LA64-NEXT:    ret
130   %2 = lshr i32 %0, 8
131   %3 = shl i32 %0, 8
132   %4 = or i32 %2, %3
133   %5 = trunc i32 %4 to i16
134   %6 = sext i16 %5 to i32
135   ret i32 %6