1; RUN: llc -mtriple=thumbv8m.main -mcpu=cortex-m33 %s -o - | FileCheck %s
2; RUN: llc -mtriple=thumbv7em %s -o - | FileCheck %s
3; RUN: llc -mtriple=armv6 %s -o - | FileCheck %s
4; RUN: llc -mtriple=armv7 %s -o - | FileCheck %s
5; RUN: llc -mtriple=armv8 %s -o - | FileCheck %s
6
7; CHECK-LABEL: sxtb16_ror_8
8; CHECK: sxtb16 r0, r0, ror #8
9define i32 @sxtb16_ror_8(i32 %a) {
10entry:
11  %shr.i = lshr i32 %a, 8
12  %shl.i = shl i32 %a, 24
13  %or.i = or i32 %shl.i, %shr.i
14  %0 = tail call i32 @llvm.arm.sxtb16(i32 %or.i)
15  ret i32 %0
16}
17
18; CHECK-LABEL: sxtb16_ror_16
19; CHECK: sxtb16 r0, r0, ror #16
20define i32 @sxtb16_ror_16(i32 %a) {
21entry:
22  %shr.i = lshr i32 %a, 16
23  %shl.i = shl i32 %a, 16
24  %or.i = or i32 %shl.i, %shr.i
25  %0 = tail call i32 @llvm.arm.sxtb16(i32 %or.i)
26  ret i32 %0
27}
28
29; CHECK-LABEL: sxtb16_ror_24
30; CHECK: sxtb16 r0, r0, ror #24
31define i32 @sxtb16_ror_24(i32 %a) {
32entry:
33  %shr.i = lshr i32 %a, 24
34  %shl.i = shl i32 %a, 8
35  %or.i = or i32 %shl.i, %shr.i
36  %0 = tail call i32 @llvm.arm.sxtb16(i32 %or.i)
37  ret i32 %0
38}
39
40; CHECK-LABEL: uxtb16_ror_8
41; CHECK: uxtb16 r0, r0, ror #8
42define i32 @uxtb16_ror_8(i32 %a) {
43entry:
44  %shr.i = lshr i32 %a, 8
45  %shl.i = shl i32 %a, 24
46  %or.i = or i32 %shl.i, %shr.i
47  %0 = tail call i32 @llvm.arm.uxtb16(i32 %or.i)
48  ret i32 %0
49}
50
51; CHECK-LABEL: uxtb16_ror_16
52; CHECK: uxtb16 r0, r0, ror #16
53define i32 @uxtb16_ror_16(i32 %a) {
54entry:
55  %shr.i = lshr i32 %a, 16
56  %shl.i = shl i32 %a, 16
57  %or.i = or i32 %shl.i, %shr.i
58  %0 = tail call i32 @llvm.arm.uxtb16(i32 %or.i)
59  ret i32 %0
60}
61
62; CHECK-LABEL: uxtb16_ror_24
63; CHECK: uxtb16 r0, r0, ror #24
64define i32 @uxtb16_ror_24(i32 %a) {
65entry:
66  %shr.i = lshr i32 %a, 24
67  %shl.i = shl i32 %a, 8
68  %or.i = or i32 %shl.i, %shr.i
69  %0 = tail call i32 @llvm.arm.uxtb16(i32 %or.i)
70  ret i32 %0
71}
72
73; CHECK-LABEL: sxtab16_ror_8
74; CHECK: sxtab16 r0, r0, r1, ror #8
75define i32 @sxtab16_ror_8(i32 %a, i32 %b) {
76entry:
77  %shr.i = lshr i32 %b, 8
78  %shl.i = shl i32 %b, 24
79  %or.i = or i32 %shl.i, %shr.i
80  %0 = tail call i32 @llvm.arm.sxtab16(i32 %a, i32 %or.i)
81  ret i32 %0
82}
83
84; CHECK-LABEL: sxtab16_ror_16
85; CHECK: sxtab16 r0, r0, r1, ror #16
86define i32 @sxtab16_ror_16(i32 %a, i32 %b) {
87entry:
88  %shr.i = lshr i32 %b, 16
89  %shl.i = shl i32 %b, 16
90  %or.i = or i32 %shl.i, %shr.i
91  %0 = tail call i32 @llvm.arm.sxtab16(i32 %a, i32 %or.i)
92  ret i32 %0
93}
94
95; CHECK-LABEL: sxtab16_ror_24
96; CHECK: sxtab16 r0, r0, r1, ror #24
97define i32 @sxtab16_ror_24(i32 %a, i32 %b) {
98entry:
99  %shr.i = lshr i32 %b, 24
100  %shl.i = shl i32 %b, 8
101  %or.i = or i32 %shl.i, %shr.i
102  %0 = tail call i32 @llvm.arm.sxtab16(i32 %a, i32 %or.i)
103  ret i32 %0
104}
105
106; CHECK-LABEL: uxtab16_ror_8
107; CHECK: uxtab16 r0, r0, r1, ror #8
108define i32 @uxtab16_ror_8(i32 %a, i32 %b) {
109entry:
110  %shr.i = lshr i32 %b, 8
111  %shl.i = shl i32 %b, 24
112  %or.i = or i32 %shl.i, %shr.i
113  %0 = tail call i32 @llvm.arm.uxtab16(i32 %a, i32 %or.i)
114  ret i32 %0
115}
116
117; CHECK-LABEL: uxtab16_ror_16
118; CHECK: uxtab16 r0, r0, r1, ror #16
119define i32 @uxtab16_ror_16(i32 %a, i32 %b) {
120entry:
121  %shr.i = lshr i32 %b, 16
122  %shl.i = shl i32 %b, 16
123  %or.i = or i32 %shl.i, %shr.i
124  %0 = tail call i32 @llvm.arm.uxtab16(i32 %a, i32 %or.i)
125  ret i32 %0
126}
127
128; CHECK-LABEL: uxtab16_ror_24
129; CHECK: uxtab16 r0, r0, r1, ror #24
130define i32 @uxtab16_ror_24(i32 %a, i32 %b) {
131entry:
132  %shr.i = lshr i32 %b, 24
133  %shl.i = shl i32 %b, 8
134  %or.i = or i32 %shl.i, %shr.i
135  %0 = tail call i32 @llvm.arm.uxtab16(i32 %a, i32 %or.i)
136  ret i32 %0
137}
138
139declare i32 @llvm.arm.sxtb16(i32)
140declare i32 @llvm.arm.uxtb16(i32)
141declare i32 @llvm.arm.sxtab16(i32, i32)
142declare i32 @llvm.arm.uxtab16(i32, i32)
143
144