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