xref: /llvm-project/llvm/test/CodeGen/LoongArch/bswap.ll (revision 9d4f7f44b64d87d1068859906f43b7ce03a7388b)
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
6
7declare i16 @llvm.bswap.i16(i16)
8declare i32 @llvm.bswap.i32(i32)
9declare i48 @llvm.bswap.i48(i48)
10declare i64 @llvm.bswap.i64(i64)
11declare i80 @llvm.bswap.i80(i80)
12declare i128 @llvm.bswap.i128(i128)
13
14define i16 @test_bswap_i16(i16 %a) nounwind {
15; LA32-LABEL: test_bswap_i16:
16; LA32:       # %bb.0:
17; LA32-NEXT:    revb.2h $a0, $a0
18; LA32-NEXT:    ret
19;
20; LA64-LABEL: test_bswap_i16:
21; LA64:       # %bb.0:
22; LA64-NEXT:    revb.2h $a0, $a0
23; LA64-NEXT:    ret
24  %tmp = call i16 @llvm.bswap.i16(i16 %a)
25  ret i16 %tmp
26}
27
28define i32 @test_bswap_i32(i32 %a) nounwind {
29; LA32-LABEL: test_bswap_i32:
30; LA32:       # %bb.0:
31; LA32-NEXT:    revb.2h $a0, $a0
32; LA32-NEXT:    rotri.w $a0, $a0, 16
33; LA32-NEXT:    ret
34;
35; LA64-LABEL: test_bswap_i32:
36; LA64:       # %bb.0:
37; LA64-NEXT:    revb.2w $a0, $a0
38; LA64-NEXT:    ret
39  %tmp = call i32 @llvm.bswap.i32(i32 %a)
40  ret i32 %tmp
41}
42
43define i64 @test_bswap_i64(i64 %a) nounwind {
44; LA32-LABEL: test_bswap_i64:
45; LA32:       # %bb.0:
46; LA32-NEXT:    revb.2h $a1, $a1
47; LA32-NEXT:    rotri.w $a2, $a1, 16
48; LA32-NEXT:    revb.2h $a0, $a0
49; LA32-NEXT:    rotri.w $a1, $a0, 16
50; LA32-NEXT:    move $a0, $a2
51; LA32-NEXT:    ret
52;
53; LA64-LABEL: test_bswap_i64:
54; LA64:       # %bb.0:
55; LA64-NEXT:    revb.d $a0, $a0
56; LA64-NEXT:    ret
57  %tmp = call i64 @llvm.bswap.i64(i64 %a)
58  ret i64 %tmp
59}
60
61;; Bswap on non-native integer widths.
62
63define i48 @test_bswap_i48(i48 %a) nounwind {
64; LA32-LABEL: test_bswap_i48:
65; LA32:       # %bb.0:
66; LA32-NEXT:    revb.2h $a0, $a0
67; LA32-NEXT:    rotri.w $a2, $a0, 16
68; LA32-NEXT:    revb.2h $a0, $a1
69; LA32-NEXT:    rotri.w $a0, $a0, 16
70; LA32-NEXT:    bytepick.w $a0, $a0, $a2, 2
71; LA32-NEXT:    srli.w $a1, $a2, 16
72; LA32-NEXT:    ret
73;
74; LA64-LABEL: test_bswap_i48:
75; LA64:       # %bb.0:
76; LA64-NEXT:    revb.d $a0, $a0
77; LA64-NEXT:    srli.d $a0, $a0, 16
78; LA64-NEXT:    ret
79  %tmp = call i48 @llvm.bswap.i48(i48 %a)
80  ret i48 %tmp
81}
82
83define i80 @test_bswap_i80(i80 %a) nounwind {
84; LA32-LABEL: test_bswap_i80:
85; LA32:       # %bb.0:
86; LA32-NEXT:    ld.w $a2, $a1, 4
87; LA32-NEXT:    ld.w $a3, $a1, 8
88; LA32-NEXT:    ld.w $a1, $a1, 0
89; LA32-NEXT:    revb.2h $a2, $a2
90; LA32-NEXT:    rotri.w $a2, $a2, 16
91; LA32-NEXT:    revb.2h $a3, $a3
92; LA32-NEXT:    rotri.w $a3, $a3, 16
93; LA32-NEXT:    bytepick.w $a3, $a3, $a2, 2
94; LA32-NEXT:    revb.2h $a1, $a1
95; LA32-NEXT:    rotri.w $a1, $a1, 16
96; LA32-NEXT:    bytepick.w $a2, $a2, $a1, 2
97; LA32-NEXT:    srli.w $a1, $a1, 16
98; LA32-NEXT:    st.w $a2, $a0, 4
99; LA32-NEXT:    st.w $a3, $a0, 0
100; LA32-NEXT:    st.h $a1, $a0, 8
101; LA32-NEXT:    ret
102;
103; LA64-LABEL: test_bswap_i80:
104; LA64:       # %bb.0:
105; LA64-NEXT:    revb.d $a2, $a0
106; LA64-NEXT:    revb.d $a0, $a1
107; LA64-NEXT:    bytepick.d $a0, $a0, $a2, 2
108; LA64-NEXT:    srli.d $a1, $a2, 48
109; LA64-NEXT:    ret
110  %tmp = call i80 @llvm.bswap.i80(i80 %a)
111  ret i80 %tmp
112}
113
114define i128 @test_bswap_i128(i128 %a) nounwind {
115; LA32-LABEL: test_bswap_i128:
116; LA32:       # %bb.0:
117; LA32-NEXT:    ld.w $a2, $a1, 12
118; LA32-NEXT:    ld.w $a3, $a1, 0
119; LA32-NEXT:    ld.w $a4, $a1, 8
120; LA32-NEXT:    ld.w $a1, $a1, 4
121; LA32-NEXT:    revb.2h $a2, $a2
122; LA32-NEXT:    rotri.w $a2, $a2, 16
123; LA32-NEXT:    revb.2h $a4, $a4
124; LA32-NEXT:    rotri.w $a4, $a4, 16
125; LA32-NEXT:    revb.2h $a1, $a1
126; LA32-NEXT:    rotri.w $a1, $a1, 16
127; LA32-NEXT:    revb.2h $a3, $a3
128; LA32-NEXT:    rotri.w $a3, $a3, 16
129; LA32-NEXT:    st.w $a3, $a0, 12
130; LA32-NEXT:    st.w $a1, $a0, 8
131; LA32-NEXT:    st.w $a4, $a0, 4
132; LA32-NEXT:    st.w $a2, $a0, 0
133; LA32-NEXT:    ret
134;
135; LA64-LABEL: test_bswap_i128:
136; LA64:       # %bb.0:
137; LA64-NEXT:    revb.d $a2, $a1
138; LA64-NEXT:    revb.d $a1, $a0
139; LA64-NEXT:    move $a0, $a2
140; LA64-NEXT:    ret
141  %tmp = call i128 @llvm.bswap.i128(i128 %a)
142  ret i128 %tmp
143}
144