1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mtriple=thumbv6-eabi %s -o - | FileCheck %s 3 4define i32 @test1(i32 %x) { 5; CHECK-LABEL: test1: 6; CHECK: @ %bb.0: @ %entry 7; CHECK-NEXT: lsls r0, r0, #20 8; CHECK-NEXT: lsrs r0, r0, #22 9; CHECK-NEXT: bx lr 10entry: 11 %0 = lshr i32 %x, 2 12 %shr = and i32 %0, 1023 13 ret i32 %shr 14} 15 16define i32 @test2(i32 %x) { 17; CHECK-LABEL: test2: 18; CHECK: @ %bb.0: @ %entry 19; CHECK-NEXT: lsrs r1, r0, #2 20; CHECK-NEXT: ldr r0, .LCPI1_0 21; CHECK-NEXT: ands r0, r1 22; CHECK-NEXT: bx lr 23; CHECK-NEXT: .p2align 2 24; CHECK-NEXT: @ %bb.1: 25; CHECK-NEXT: .LCPI1_0: 26; CHECK-NEXT: .long 1022 @ 0x3fe 27entry: 28 %0 = lshr i32 %x, 2 29 %shr = and i32 %0, 1022 30 ret i32 %shr 31} 32 33define i32 @test3(i32 %x) { 34; CHECK-LABEL: test3: 35; CHECK: @ %bb.0: @ %entry 36; CHECK-NEXT: lsrs r0, r0, #2 37; CHECK-NEXT: uxtb r0, r0 38; CHECK-NEXT: bx lr 39entry: 40 %0 = lshr i32 %x, 2 41 %shr = and i32 %0, 255 42 ret i32 %shr 43} 44 45define i32 @test4(i32 %x) { 46; CHECK-LABEL: test4: 47; CHECK: @ %bb.0: @ %entry 48; CHECK-NEXT: lsrs r0, r0, #3 49; CHECK-NEXT: lsls r0, r0, #7 50; CHECK-NEXT: bx lr 51entry: 52 %0 = shl i32 %x, 4 53 %shr = and i32 %0, -128 54 ret i32 %shr 55} 56 57define i32 @test5(i32 %x) { 58; CHECK-LABEL: test5: 59; CHECK: @ %bb.0: @ %entry 60; CHECK-NEXT: lsls r0, r0, #31 61; CHECK-NEXT: lsrs r0, r0, #2 62; CHECK-NEXT: bx lr 63entry: 64 %0 = shl i32 %x, 29 65 %shr = and i32 %0, 536870912 66 ret i32 %shr 67} 68 69define i32 @test6(i32 %x) { 70; CHECK-LABEL: test6: 71; CHECK: @ %bb.0: @ %entry 72; CHECK-NEXT: movs r1, #5 73; CHECK-NEXT: ands r1, r0 74; CHECK-NEXT: lsls r0, r1, #29 75; CHECK-NEXT: bx lr 76entry: 77 %0 = shl i32 %x, 29 78 %shr = and i32 %0, 2684354560 79 ret i32 %shr 80} 81 82define i32 @test7(i32 %x) { 83; CHECK-LABEL: test7: 84; CHECK: @ %bb.0: @ %entry 85; CHECK-NEXT: lsrs r0, r0, #31 86; CHECK-NEXT: lsls r0, r0, #2 87; CHECK-NEXT: bx lr 88entry: 89 %0 = lshr i32 %x, 29 90 %shr = and i32 %0, 4 91 ret i32 %shr 92} 93 94define i32 @test8(i32 %x) { 95; CHECK-LABEL: test8: 96; CHECK: @ %bb.0: @ %entry 97; CHECK-NEXT: lsrs r1, r0, #29 98; CHECK-NEXT: movs r0, #5 99; CHECK-NEXT: ands r0, r1 100; CHECK-NEXT: bx lr 101entry: 102 %0 = lshr i32 %x, 29 103 %shr = and i32 %0, 5 104 ret i32 %shr 105} 106 107define i32 @test9(i32 %x) { 108; CHECK-LABEL: test9: 109; CHECK: @ %bb.0: @ %entry 110; CHECK-NEXT: lsrs r0, r0, #3 111; CHECK-NEXT: lsls r0, r0, #1 112; CHECK-NEXT: bx lr 113entry: 114 %and = lshr i32 %x, 2 115 %shr = and i32 %and, 1073741822 116 ret i32 %shr 117} 118 119define i32 @test10(i32 %x) { 120; CHECK-LABEL: test10: 121; CHECK: @ %bb.0: @ %entry 122; CHECK-NEXT: lsls r0, r0, #2 123; CHECK-NEXT: uxtb r0, r0 124; CHECK-NEXT: bx lr 125entry: 126 %0 = shl i32 %x, 2 127 %shr = and i32 %0, 255 128 ret i32 %shr 129} 130 131define i32 @test11(i32 %x) { 132; CHECK-LABEL: test11: 133; CHECK: @ %bb.0: @ %entry 134; CHECK-NEXT: lsrs r0, r0, #24 135; CHECK-NEXT: lsls r0, r0, #2 136; CHECK-NEXT: bx lr 137entry: 138 %shl = lshr i32 %x, 22 139 %and = and i32 %shl, 1020 140 ret i32 %and 141} 142 143define i32 @test12(i32 %x) { 144; CHECK-LABEL: test12: 145; CHECK: @ %bb.0: @ %entry 146; CHECK-NEXT: lsrs r0, r0, #3 147; CHECK-NEXT: lsls r0, r0, #4 148; CHECK-NEXT: bx lr 149entry: 150 %0 = shl i32 %x, 1 151 %shr = and i32 %0, -16 152 ret i32 %shr 153} 154 155define i32 @test13(i32 %x) { 156; CHECK-LABEL: test13: 157; CHECK: @ %bb.0: @ %entry 158; CHECK-NEXT: lsrs r0, r0, #3 159; CHECK-NEXT: lsls r0, r0, #4 160; CHECK-NEXT: bx lr 161entry: 162 %shr = lshr i32 %x, 3 163 %shl = shl i32 %shr, 4 164 ret i32 %shl 165} 166 167define i32 @test14(i32 %x) { 168; CHECK-LABEL: test14: 169; CHECK: @ %bb.0: @ %entry 170; CHECK-NEXT: lsrs r0, r0, #6 171; CHECK-NEXT: lsls r0, r0, #10 172; CHECK-NEXT: bx lr 173entry: 174 %shl = shl i32 %x, 4 175 %and = and i32 %shl, -1024 176 ret i32 %and 177} 178 179define i32 @test15(i32 %x) { 180; CHECK-LABEL: test15: 181; CHECK: @ %bb.0: @ %entry 182; CHECK-NEXT: lsrs r0, r0, #4 183; CHECK-NEXT: lsls r0, r0, #3 184; CHECK-NEXT: bx lr 185entry: 186 %shr = lshr i32 %x, 4 187 %shl = shl i32 %shr, 3 188 ret i32 %shl 189} 190 191define i32 @test16(i32 %x) { 192; CHECK-LABEL: test16: 193; CHECK: @ %bb.0: @ %entry 194; CHECK-NEXT: lsls r0, r0, #28 195; CHECK-NEXT: lsrs r0, r0, #26 196; CHECK-NEXT: bx lr 197entry: 198 %0 = and i32 %x, 15 199 %shl = shl i32 %0, 2 200 ret i32 %shl 201} 202 203define ptr @test17(ptr %p, i32 %x) { 204; CHECK-LABEL: test17: 205; CHECK: @ %bb.0: @ %entry 206; CHECK-NEXT: lsls r1, r1, #28 207; CHECK-NEXT: lsrs r1, r1, #26 208; CHECK-NEXT: adds r0, r0, r1 209; CHECK-NEXT: bx lr 210entry: 211 %0 = and i32 %x, 15 212 %shl = getelementptr i32, ptr %p, i32 %0 213 ret ptr %shl 214} 215 216define ptr @test18(ptr %p, i32 %x) { 217; CHECK-LABEL: test18: 218; CHECK: @ %bb.0: @ %entry 219; CHECK-NEXT: adds r1, r1, #1 220; CHECK-NEXT: lsls r1, r1, #28 221; CHECK-NEXT: lsrs r1, r1, #26 222; CHECK-NEXT: adds r0, r0, r1 223; CHECK-NEXT: bx lr 224entry: 225 %xx = add i32 %x, 1 226 %0 = and i32 %xx, 15 227 %shl = getelementptr i32, ptr %p, i32 %0 228 ret ptr %shl 229} 230 231define ptr @test19(ptr %p, i32 %x) { 232; CHECK-LABEL: test19: 233; CHECK: @ %bb.0: @ %entry 234; CHECK-NEXT: subs r1, r1, #1 235; CHECK-NEXT: lsls r1, r1, #28 236; CHECK-NEXT: lsrs r1, r1, #26 237; CHECK-NEXT: adds r0, r0, r1 238; CHECK-NEXT: bx lr 239entry: 240 %xx = sub i32 %x, 1 241 %0 = and i32 %xx, 15 242 %shl = getelementptr i32, ptr %p, i32 %0 243 ret ptr %shl 244} 245 246define ptr @test20(ptr %p, i32 %x) { 247; CHECK-LABEL: test20: 248; CHECK: @ %bb.0: @ %entry 249; CHECK-NEXT: subs r1, r1, #1 250; CHECK-NEXT: lsls r1, r1, #28 251; CHECK-NEXT: lsrs r1, r1, #26 252; CHECK-NEXT: adds r0, r0, r1 253; CHECK-NEXT: bx lr 254entry: 255 %xx = add i32 %x, 15 256 %0 = and i32 %xx, 15 257 %shl = getelementptr i32, ptr %p, i32 %0 258 ret ptr %shl 259} 260