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
7 ; CHECK-LABEL: sxtb16_ror_8
8 ; CHECK: sxtb16 r0, r0, ror #8
9 define i32 @sxtb16_ror_8(i32 %a) {
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)
18 ; CHECK-LABEL: sxtb16_ror_16
19 ; CHECK: sxtb16 r0, r0, ror #16
20 define i32 @sxtb16_ror_16(i32 %a) {
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)
29 ; CHECK-LABEL: sxtb16_ror_24
30 ; CHECK: sxtb16 r0, r0, ror #24
31 define i32 @sxtb16_ror_24(i32 %a) {
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)
40 ; CHECK-LABEL: uxtb16_ror_8
41 ; CHECK: uxtb16 r0, r0, ror #8
42 define i32 @uxtb16_ror_8(i32 %a) {
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)
51 ; CHECK-LABEL: uxtb16_ror_16
52 ; CHECK: uxtb16 r0, r0, ror #16
53 define i32 @uxtb16_ror_16(i32 %a) {
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)
62 ; CHECK-LABEL: uxtb16_ror_24
63 ; CHECK: uxtb16 r0, r0, ror #24
64 define i32 @uxtb16_ror_24(i32 %a) {
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)
73 ; CHECK-LABEL: sxtab16_ror_8
74 ; CHECK: sxtab16 r0, r0, r1, ror #8
75 define i32 @sxtab16_ror_8(i32 %a, i32 %b) {
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)
84 ; CHECK-LABEL: sxtab16_ror_16
85 ; CHECK: sxtab16 r0, r0, r1, ror #16
86 define i32 @sxtab16_ror_16(i32 %a, i32 %b) {
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)
95 ; CHECK-LABEL: sxtab16_ror_24
96 ; CHECK: sxtab16 r0, r0, r1, ror #24
97 define i32 @sxtab16_ror_24(i32 %a, i32 %b) {
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)
106 ; CHECK-LABEL: uxtab16_ror_8
107 ; CHECK: uxtab16 r0, r0, r1, ror #8
108 define i32 @uxtab16_ror_8(i32 %a, i32 %b) {
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)
117 ; CHECK-LABEL: uxtab16_ror_16
118 ; CHECK: uxtab16 r0, r0, r1, ror #16
119 define i32 @uxtab16_ror_16(i32 %a, i32 %b) {
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)
128 ; CHECK-LABEL: uxtab16_ror_24
129 ; CHECK: uxtab16 r0, r0, r1, ror #24
130 define i32 @uxtab16_ror_24(i32 %a, i32 %b) {
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)
139 declare i32 @llvm.arm.sxtb16(i32)
140 declare i32 @llvm.arm.uxtb16(i32)
141 declare i32 @llvm.arm.sxtab16(i32, i32)
142 declare i32 @llvm.arm.uxtab16(i32, i32)