[ARM] Adjust how NEON shifts are lowered
[llvm-core.git] / test / CodeGen / ARM / acle-intrinsics-rot.ll
blobfab4d0e765c38475cbb4d7c499650baa6604d0fb
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) {
10 entry:
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
18 ; CHECK-LABEL: sxtb16_ror_16
19 ; CHECK: sxtb16 r0, r0, ror #16
20 define i32 @sxtb16_ror_16(i32 %a) {
21 entry:
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
29 ; CHECK-LABEL: sxtb16_ror_24
30 ; CHECK: sxtb16 r0, r0, ror #24
31 define i32 @sxtb16_ror_24(i32 %a) {
32 entry:
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
40 ; CHECK-LABEL: uxtb16_ror_8
41 ; CHECK: uxtb16 r0, r0, ror #8
42 define i32 @uxtb16_ror_8(i32 %a) {
43 entry:
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
51 ; CHECK-LABEL: uxtb16_ror_16
52 ; CHECK: uxtb16 r0, r0, ror #16
53 define i32 @uxtb16_ror_16(i32 %a) {
54 entry:
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
62 ; CHECK-LABEL: uxtb16_ror_24
63 ; CHECK: uxtb16 r0, r0, ror #24
64 define i32 @uxtb16_ror_24(i32 %a) {
65 entry:
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
73 ; CHECK-LABEL: sxtab16_ror_8
74 ; CHECK: sxtab16 r0, r0, r1, ror #8
75 define i32 @sxtab16_ror_8(i32 %a, i32 %b) {
76 entry:
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
84 ; CHECK-LABEL: sxtab16_ror_16
85 ; CHECK: sxtab16 r0, r0, r1, ror #16
86 define i32 @sxtab16_ror_16(i32 %a, i32 %b) {
87 entry:
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
95 ; CHECK-LABEL: sxtab16_ror_24
96 ; CHECK: sxtab16 r0, r0, r1, ror #24
97 define i32 @sxtab16_ror_24(i32 %a, i32 %b) {
98 entry:
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
106 ; CHECK-LABEL: uxtab16_ror_8
107 ; CHECK: uxtab16 r0, r0, r1, ror #8
108 define i32 @uxtab16_ror_8(i32 %a, i32 %b) {
109 entry:
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
117 ; CHECK-LABEL: uxtab16_ror_16
118 ; CHECK: uxtab16 r0, r0, r1, ror #16
119 define i32 @uxtab16_ror_16(i32 %a, i32 %b) {
120 entry:
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
128 ; CHECK-LABEL: uxtab16_ror_24
129 ; CHECK: uxtab16 r0, r0, r1, ror #24
130 define i32 @uxtab16_ror_24(i32 %a, i32 %b) {
131 entry:
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
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)