xref: /llvm-project/llvm/test/CodeGen/LoongArch/lsx/bitreverse.ll (revision 953838dceaff3728b9aa53ea4259efca15f38f66)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
2; RUN: llc --mtriple=loongarch64 -mattr=+lsx --verify-machineinstrs < %s \
3; RUN:   | FileCheck %s
4
5declare <16 x i8> @llvm.bitreverse.v16i8(<16 x i8>)
6
7define <16 x i8> @test_bitreverse_v16i8(<16 x i8> %a) nounwind {
8; CHECK-LABEL: test_bitreverse_v16i8:
9; CHECK:       # %bb.0:
10; CHECK-NEXT:    vpickve2gr.d $a0, $vr0, 0
11; CHECK-NEXT:    bitrev.8b $a0, $a0
12; CHECK-NEXT:    vinsgr2vr.d $vr1, $a0, 0
13; CHECK-NEXT:    vpickve2gr.d $a0, $vr0, 1
14; CHECK-NEXT:    bitrev.8b $a0, $a0
15; CHECK-NEXT:    vinsgr2vr.d $vr1, $a0, 1
16; CHECK-NEXT:    vori.b $vr0, $vr1, 0
17; CHECK-NEXT:    ret
18  %b = call <16 x i8> @llvm.bitreverse.v16i8(<16 x i8> %a)
19  ret <16 x i8> %b
20}
21
22declare <8 x i16> @llvm.bitreverse.v8i16(<8 x i16>)
23
24define <8 x i16> @test_bitreverse_v8i16(<8 x i16> %a) nounwind {
25; CHECK-LABEL: test_bitreverse_v8i16:
26; CHECK:       # %bb.0:
27; CHECK-NEXT:    vpickve2gr.d $a0, $vr0, 0
28; CHECK-NEXT:    bitrev.d $a0, $a0
29; CHECK-NEXT:    vinsgr2vr.d $vr1, $a0, 0
30; CHECK-NEXT:    vpickve2gr.d $a0, $vr0, 1
31; CHECK-NEXT:    bitrev.d $a0, $a0
32; CHECK-NEXT:    vinsgr2vr.d $vr1, $a0, 1
33; CHECK-NEXT:    vshuf4i.h $vr0, $vr1, 27
34; CHECK-NEXT:    ret
35  %b = call <8 x i16> @llvm.bitreverse.v8i16(<8 x i16> %a)
36  ret <8 x i16> %b
37}
38
39declare <4 x i32> @llvm.bitreverse.v4i32(<4 x i32>)
40
41define <4 x i32> @test_bitreverse_v4i32(<4 x i32> %a) nounwind {
42; CHECK-LABEL: test_bitreverse_v4i32:
43; CHECK:       # %bb.0:
44; CHECK-NEXT:    vpickve2gr.d $a0, $vr0, 0
45; CHECK-NEXT:    bitrev.d $a0, $a0
46; CHECK-NEXT:    vinsgr2vr.d $vr1, $a0, 0
47; CHECK-NEXT:    vpickve2gr.d $a0, $vr0, 1
48; CHECK-NEXT:    bitrev.d $a0, $a0
49; CHECK-NEXT:    vinsgr2vr.d $vr1, $a0, 1
50; CHECK-NEXT:    vshuf4i.w $vr0, $vr1, 177
51; CHECK-NEXT:    ret
52  %b = call <4 x i32> @llvm.bitreverse.v4i32(<4 x i32> %a)
53  ret <4 x i32> %b
54}
55
56declare <2 x i64> @llvm.bitreverse.v2i64(<2 x i64>)
57
58define <2 x i64> @test_bitreverse_v2i64(<2 x i64> %a) nounwind {
59; CHECK-LABEL: test_bitreverse_v2i64:
60; CHECK:       # %bb.0:
61; CHECK-NEXT:    vpickve2gr.d $a0, $vr0, 0
62; CHECK-NEXT:    bitrev.d $a0, $a0
63; CHECK-NEXT:    vinsgr2vr.d $vr1, $a0, 0
64; CHECK-NEXT:    vpickve2gr.d $a0, $vr0, 1
65; CHECK-NEXT:    bitrev.d $a0, $a0
66; CHECK-NEXT:    vinsgr2vr.d $vr1, $a0, 1
67; CHECK-NEXT:    vori.b $vr0, $vr1, 0
68; CHECK-NEXT:    ret
69  %b = call <2 x i64> @llvm.bitreverse.v2i64(<2 x i64> %a)
70  ret <2 x i64> %b
71}
72