1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mtriple=armv7-linux-gnueabihf %s -o - | FileCheck %s --check-prefixes=CHECK-COMMON,CHECK-ARM 3; RUN: llc -mtriple=armv7eb-linux-gnueabihf %s -o - | FileCheck %s --check-prefixes=CHECK-BE 4; RUN: llc -mtriple=thumbv7-linux-gnueabihf %s -o - | FileCheck %s --check-prefixes=CHECK-COMMON,CHECK-THUMB 5; RUN: llc -mtriple=thumbv7m %s -o - | FileCheck %s --check-prefixes=CHECK-COMMON,CHECK-THUMB 6; RUN: llc -mtriple=thumbv7m -mattr=+strict-align %s -o - | FileCheck %s --check-prefixes=CHECK-COMMON,CHECK-ALIGN 7; RUN: llc -mtriple=thumbv6m %s -o - | FileCheck %s --check-prefix=CHECK-V6M 8 9@array = weak global [4 x i32] zeroinitializer 10 11define i32 @test_lshr_and1(i32 %x) { 12; CHECK-COMMON-LABEL: test_lshr_and1: 13; CHECK-COMMON: @ %bb.0: @ %entry 14; CHECK-COMMON-NEXT: movw r1, :lower16:array 15; CHECK-COMMON-NEXT: and r0, r0, #12 16; CHECK-COMMON-NEXT: movt r1, :upper16:array 17; CHECK-COMMON-NEXT: ldr r0, [r1, r0] 18; CHECK-COMMON-NEXT: bx lr 19; 20; CHECK-BE-LABEL: test_lshr_and1: 21; CHECK-BE: @ %bb.0: @ %entry 22; CHECK-BE-NEXT: movw r1, :lower16:array 23; CHECK-BE-NEXT: and r0, r0, #12 24; CHECK-BE-NEXT: movt r1, :upper16:array 25; CHECK-BE-NEXT: ldr r0, [r1, r0] 26; CHECK-BE-NEXT: bx lr 27; 28; CHECK-V6M-LABEL: test_lshr_and1: 29; CHECK-V6M: @ %bb.0: @ %entry 30; CHECK-V6M-NEXT: movs r1, #12 31; CHECK-V6M-NEXT: ands r1, r0 32; CHECK-V6M-NEXT: ldr r0, .LCPI0_0 33; CHECK-V6M-NEXT: ldr r0, [r0, r1] 34; CHECK-V6M-NEXT: bx lr 35; CHECK-V6M-NEXT: .p2align 2 36; CHECK-V6M-NEXT: @ %bb.1: 37; CHECK-V6M-NEXT: .LCPI0_0: 38; CHECK-V6M-NEXT: .long array 39entry: 40 %tmp2 = lshr i32 %x, 2 41 %tmp3 = and i32 %tmp2, 3 42 %tmp4 = getelementptr [4 x i32], ptr @array, i32 0, i32 %tmp3 43 %tmp5 = load i32, ptr %tmp4, align 4 44 ret i32 %tmp5 45} 46define i32 @test_lshr_and2(i32 %x) { 47; CHECK-ARM-LABEL: test_lshr_and2: 48; CHECK-ARM: @ %bb.0: @ %entry 49; CHECK-ARM-NEXT: ubfx r0, r0, #1, #15 50; CHECK-ARM-NEXT: add r0, r0, r0 51; CHECK-ARM-NEXT: bx lr 52; 53; CHECK-BE-LABEL: test_lshr_and2: 54; CHECK-BE: @ %bb.0: @ %entry 55; CHECK-BE-NEXT: ubfx r0, r0, #1, #15 56; CHECK-BE-NEXT: add r0, r0, r0 57; CHECK-BE-NEXT: bx lr 58; 59; CHECK-THUMB-LABEL: test_lshr_and2: 60; CHECK-THUMB: @ %bb.0: @ %entry 61; CHECK-THUMB-NEXT: ubfx r0, r0, #1, #15 62; CHECK-THUMB-NEXT: add r0, r0 63; CHECK-THUMB-NEXT: bx lr 64; 65; CHECK-ALIGN-LABEL: test_lshr_and2: 66; CHECK-ALIGN: @ %bb.0: @ %entry 67; CHECK-ALIGN-NEXT: ubfx r0, r0, #1, #15 68; CHECK-ALIGN-NEXT: add r0, r0 69; CHECK-ALIGN-NEXT: bx lr 70; 71; CHECK-V6M-LABEL: test_lshr_and2: 72; CHECK-V6M: @ %bb.0: @ %entry 73; CHECK-V6M-NEXT: lsls r0, r0, #16 74; CHECK-V6M-NEXT: lsrs r0, r0, #17 75; CHECK-V6M-NEXT: adds r0, r0, r0 76; CHECK-V6M-NEXT: bx lr 77entry: 78 %a = and i32 %x, 65534 79 %b = lshr i32 %a, 1 80 %c = and i32 %x, 65535 81 %d = lshr i32 %c, 1 82 %e = add i32 %b, %d 83 ret i32 %e 84} 85 86define arm_aapcscc i32 @test_lshr_load1(ptr %a) { 87; CHECK-COMMON-LABEL: test_lshr_load1: 88; CHECK-COMMON: @ %bb.0: @ %entry 89; CHECK-COMMON-NEXT: ldrb r0, [r0, #1] 90; CHECK-COMMON-NEXT: bx lr 91; 92; CHECK-BE-LABEL: test_lshr_load1: 93; CHECK-BE: @ %bb.0: @ %entry 94; CHECK-BE-NEXT: ldrb r0, [r0] 95; CHECK-BE-NEXT: bx lr 96; 97; CHECK-V6M-LABEL: test_lshr_load1: 98; CHECK-V6M: @ %bb.0: @ %entry 99; CHECK-V6M-NEXT: ldrb r0, [r0, #1] 100; CHECK-V6M-NEXT: bx lr 101entry: 102 %0 = load i16, ptr %a, align 2 103 %conv1 = zext i16 %0 to i32 104 %1 = lshr i32 %conv1, 8 105 ret i32 %1 106} 107 108define arm_aapcscc i32 @test_lshr_load1_sext(ptr %a) { 109; CHECK-ARM-LABEL: test_lshr_load1_sext: 110; CHECK-ARM: @ %bb.0: @ %entry 111; CHECK-ARM-NEXT: ldrsh r0, [r0] 112; CHECK-ARM-NEXT: lsr r0, r0, #8 113; CHECK-ARM-NEXT: bx lr 114; 115; CHECK-BE-LABEL: test_lshr_load1_sext: 116; CHECK-BE: @ %bb.0: @ %entry 117; CHECK-BE-NEXT: ldrsh r0, [r0] 118; CHECK-BE-NEXT: lsr r0, r0, #8 119; CHECK-BE-NEXT: bx lr 120; 121; CHECK-THUMB-LABEL: test_lshr_load1_sext: 122; CHECK-THUMB: @ %bb.0: @ %entry 123; CHECK-THUMB-NEXT: ldrsh.w r0, [r0] 124; CHECK-THUMB-NEXT: lsrs r0, r0, #8 125; CHECK-THUMB-NEXT: bx lr 126; 127; CHECK-ALIGN-LABEL: test_lshr_load1_sext: 128; CHECK-ALIGN: @ %bb.0: @ %entry 129; CHECK-ALIGN-NEXT: ldrsh.w r0, [r0] 130; CHECK-ALIGN-NEXT: lsrs r0, r0, #8 131; CHECK-ALIGN-NEXT: bx lr 132; 133; CHECK-V6M-LABEL: test_lshr_load1_sext: 134; CHECK-V6M: @ %bb.0: @ %entry 135; CHECK-V6M-NEXT: movs r1, #0 136; CHECK-V6M-NEXT: ldrsh r0, [r0, r1] 137; CHECK-V6M-NEXT: lsrs r0, r0, #8 138; CHECK-V6M-NEXT: bx lr 139entry: 140 %0 = load i16, ptr %a, align 2 141 %conv1 = sext i16 %0 to i32 142 %1 = lshr i32 %conv1, 8 143 ret i32 %1 144} 145 146define arm_aapcscc i32 @test_lshr_load1_fail(ptr %a) { 147; CHECK-ARM-LABEL: test_lshr_load1_fail: 148; CHECK-ARM: @ %bb.0: @ %entry 149; CHECK-ARM-NEXT: ldrh r0, [r0] 150; CHECK-ARM-NEXT: lsr r0, r0, #9 151; CHECK-ARM-NEXT: bx lr 152; 153; CHECK-BE-LABEL: test_lshr_load1_fail: 154; CHECK-BE: @ %bb.0: @ %entry 155; CHECK-BE-NEXT: ldrh r0, [r0] 156; CHECK-BE-NEXT: lsr r0, r0, #9 157; CHECK-BE-NEXT: bx lr 158; 159; CHECK-THUMB-LABEL: test_lshr_load1_fail: 160; CHECK-THUMB: @ %bb.0: @ %entry 161; CHECK-THUMB-NEXT: ldrh r0, [r0] 162; CHECK-THUMB-NEXT: lsrs r0, r0, #9 163; CHECK-THUMB-NEXT: bx lr 164; 165; CHECK-ALIGN-LABEL: test_lshr_load1_fail: 166; CHECK-ALIGN: @ %bb.0: @ %entry 167; CHECK-ALIGN-NEXT: ldrh r0, [r0] 168; CHECK-ALIGN-NEXT: lsrs r0, r0, #9 169; CHECK-ALIGN-NEXT: bx lr 170; 171; CHECK-V6M-LABEL: test_lshr_load1_fail: 172; CHECK-V6M: @ %bb.0: @ %entry 173; CHECK-V6M-NEXT: ldrh r0, [r0] 174; CHECK-V6M-NEXT: lsrs r0, r0, #9 175; CHECK-V6M-NEXT: bx lr 176entry: 177 %0 = load i16, ptr %a, align 2 178 %conv1 = zext i16 %0 to i32 179 %1 = lshr i32 %conv1, 9 180 ret i32 %1 181} 182 183define arm_aapcscc i32 @test_lshr_load32(ptr %a) { 184; CHECK-ARM-LABEL: test_lshr_load32: 185; CHECK-ARM: @ %bb.0: @ %entry 186; CHECK-ARM-NEXT: ldr r0, [r0] 187; CHECK-ARM-NEXT: lsr r0, r0, #8 188; CHECK-ARM-NEXT: bx lr 189; 190; CHECK-BE-LABEL: test_lshr_load32: 191; CHECK-BE: @ %bb.0: @ %entry 192; CHECK-BE-NEXT: ldr r0, [r0] 193; CHECK-BE-NEXT: lsr r0, r0, #8 194; CHECK-BE-NEXT: bx lr 195; 196; CHECK-THUMB-LABEL: test_lshr_load32: 197; CHECK-THUMB: @ %bb.0: @ %entry 198; CHECK-THUMB-NEXT: ldr r0, [r0] 199; CHECK-THUMB-NEXT: lsrs r0, r0, #8 200; CHECK-THUMB-NEXT: bx lr 201; 202; CHECK-ALIGN-LABEL: test_lshr_load32: 203; CHECK-ALIGN: @ %bb.0: @ %entry 204; CHECK-ALIGN-NEXT: ldr r0, [r0] 205; CHECK-ALIGN-NEXT: lsrs r0, r0, #8 206; CHECK-ALIGN-NEXT: bx lr 207; 208; CHECK-V6M-LABEL: test_lshr_load32: 209; CHECK-V6M: @ %bb.0: @ %entry 210; CHECK-V6M-NEXT: ldr r0, [r0] 211; CHECK-V6M-NEXT: lsrs r0, r0, #8 212; CHECK-V6M-NEXT: bx lr 213entry: 214 %0 = load i32, ptr %a, align 4 215 %1 = lshr i32 %0, 8 216 ret i32 %1 217} 218 219define arm_aapcscc i32 @test_lshr_load32_2(ptr %a) { 220; CHECK-COMMON-LABEL: test_lshr_load32_2: 221; CHECK-COMMON: @ %bb.0: @ %entry 222; CHECK-COMMON-NEXT: ldrh r0, [r0, #2] 223; CHECK-COMMON-NEXT: bx lr 224; 225; CHECK-BE-LABEL: test_lshr_load32_2: 226; CHECK-BE: @ %bb.0: @ %entry 227; CHECK-BE-NEXT: ldrh r0, [r0] 228; CHECK-BE-NEXT: bx lr 229; 230; CHECK-V6M-LABEL: test_lshr_load32_2: 231; CHECK-V6M: @ %bb.0: @ %entry 232; CHECK-V6M-NEXT: ldrh r0, [r0, #2] 233; CHECK-V6M-NEXT: bx lr 234entry: 235 %0 = load i32, ptr %a, align 4 236 %1 = lshr i32 %0, 16 237 ret i32 %1 238} 239 240define arm_aapcscc i32 @test_lshr_load32_1(ptr %a) { 241; CHECK-COMMON-LABEL: test_lshr_load32_1: 242; CHECK-COMMON: @ %bb.0: @ %entry 243; CHECK-COMMON-NEXT: ldrb r0, [r0, #3] 244; CHECK-COMMON-NEXT: bx lr 245; 246; CHECK-BE-LABEL: test_lshr_load32_1: 247; CHECK-BE: @ %bb.0: @ %entry 248; CHECK-BE-NEXT: ldrb r0, [r0] 249; CHECK-BE-NEXT: bx lr 250; 251; CHECK-V6M-LABEL: test_lshr_load32_1: 252; CHECK-V6M: @ %bb.0: @ %entry 253; CHECK-V6M-NEXT: ldrb r0, [r0, #3] 254; CHECK-V6M-NEXT: bx lr 255entry: 256 %0 = load i32, ptr %a, align 4 257 %1 = lshr i32 %0, 24 258 ret i32 %1 259} 260 261define arm_aapcscc i32 @test_lshr_load32_fail(ptr %a) { 262; CHECK-ARM-LABEL: test_lshr_load32_fail: 263; CHECK-ARM: @ %bb.0: @ %entry 264; CHECK-ARM-NEXT: ldr r0, [r0] 265; CHECK-ARM-NEXT: lsr r0, r0, #15 266; CHECK-ARM-NEXT: bx lr 267; 268; CHECK-BE-LABEL: test_lshr_load32_fail: 269; CHECK-BE: @ %bb.0: @ %entry 270; CHECK-BE-NEXT: ldr r0, [r0] 271; CHECK-BE-NEXT: lsr r0, r0, #15 272; CHECK-BE-NEXT: bx lr 273; 274; CHECK-THUMB-LABEL: test_lshr_load32_fail: 275; CHECK-THUMB: @ %bb.0: @ %entry 276; CHECK-THUMB-NEXT: ldr r0, [r0] 277; CHECK-THUMB-NEXT: lsrs r0, r0, #15 278; CHECK-THUMB-NEXT: bx lr 279; 280; CHECK-ALIGN-LABEL: test_lshr_load32_fail: 281; CHECK-ALIGN: @ %bb.0: @ %entry 282; CHECK-ALIGN-NEXT: ldr r0, [r0] 283; CHECK-ALIGN-NEXT: lsrs r0, r0, #15 284; CHECK-ALIGN-NEXT: bx lr 285; 286; CHECK-V6M-LABEL: test_lshr_load32_fail: 287; CHECK-V6M: @ %bb.0: @ %entry 288; CHECK-V6M-NEXT: ldr r0, [r0] 289; CHECK-V6M-NEXT: lsrs r0, r0, #15 290; CHECK-V6M-NEXT: bx lr 291entry: 292 %0 = load i32, ptr %a, align 4 293 %1 = lshr i32 %0, 15 294 ret i32 %1 295} 296 297define arm_aapcscc i32 @test_lshr_load64_4_unaligned(ptr %a) { 298; CHECK-ARM-LABEL: test_lshr_load64_4_unaligned: 299; CHECK-ARM: @ %bb.0: @ %entry 300; CHECK-ARM-NEXT: ldr r0, [r0, #2] 301; CHECK-ARM-NEXT: bx lr 302; 303; CHECK-BE-LABEL: test_lshr_load64_4_unaligned: 304; CHECK-BE: @ %bb.0: @ %entry 305; CHECK-BE-NEXT: ldr r0, [r0, #2] 306; CHECK-BE-NEXT: bx lr 307; 308; CHECK-THUMB-LABEL: test_lshr_load64_4_unaligned: 309; CHECK-THUMB: @ %bb.0: @ %entry 310; CHECK-THUMB-NEXT: ldr.w r0, [r0, #2] 311; CHECK-THUMB-NEXT: bx lr 312; 313; CHECK-ALIGN-LABEL: test_lshr_load64_4_unaligned: 314; CHECK-ALIGN: @ %bb.0: @ %entry 315; CHECK-ALIGN-NEXT: ldr r1, [r0, #4] 316; CHECK-ALIGN-NEXT: ldrh r0, [r0, #2] 317; CHECK-ALIGN-NEXT: orr.w r0, r0, r1, lsl #16 318; CHECK-ALIGN-NEXT: bx lr 319; 320; CHECK-V6M-LABEL: test_lshr_load64_4_unaligned: 321; CHECK-V6M: @ %bb.0: @ %entry 322; CHECK-V6M-NEXT: ldrh r1, [r0, #2] 323; CHECK-V6M-NEXT: ldr r0, [r0, #4] 324; CHECK-V6M-NEXT: lsls r0, r0, #16 325; CHECK-V6M-NEXT: adds r0, r1, r0 326; CHECK-V6M-NEXT: bx lr 327entry: 328 %0 = load i64, ptr %a, align 8 329 %1 = lshr i64 %0, 16 330 %conv = trunc i64 %1 to i32 331 ret i32 %conv 332} 333 334define arm_aapcscc i32 @test_lshr_load64_1_lsb(ptr %a) { 335; CHECK-ARM-LABEL: test_lshr_load64_1_lsb: 336; CHECK-ARM: @ %bb.0: @ %entry 337; CHECK-ARM-NEXT: ldr r0, [r0, #3] 338; CHECK-ARM-NEXT: bx lr 339; 340; CHECK-BE-LABEL: test_lshr_load64_1_lsb: 341; CHECK-BE: @ %bb.0: @ %entry 342; CHECK-BE-NEXT: ldr r0, [r0, #1] 343; CHECK-BE-NEXT: bx lr 344; 345; CHECK-THUMB-LABEL: test_lshr_load64_1_lsb: 346; CHECK-THUMB: @ %bb.0: @ %entry 347; CHECK-THUMB-NEXT: ldr.w r0, [r0, #3] 348; CHECK-THUMB-NEXT: bx lr 349; 350; CHECK-ALIGN-LABEL: test_lshr_load64_1_lsb: 351; CHECK-ALIGN: @ %bb.0: @ %entry 352; CHECK-ALIGN-NEXT: ldr r1, [r0, #4] 353; CHECK-ALIGN-NEXT: ldrb r0, [r0, #3] 354; CHECK-ALIGN-NEXT: orr.w r0, r0, r1, lsl #8 355; CHECK-ALIGN-NEXT: bx lr 356; 357; CHECK-V6M-LABEL: test_lshr_load64_1_lsb: 358; CHECK-V6M: @ %bb.0: @ %entry 359; CHECK-V6M-NEXT: ldrb r1, [r0, #3] 360; CHECK-V6M-NEXT: ldr r0, [r0, #4] 361; CHECK-V6M-NEXT: lsls r0, r0, #8 362; CHECK-V6M-NEXT: adds r0, r1, r0 363; CHECK-V6M-NEXT: bx lr 364entry: 365 %0 = load i64, ptr %a, align 8 366 %1 = lshr i64 %0, 24 367 %conv = trunc i64 %1 to i32 368 ret i32 %conv 369} 370 371define arm_aapcscc i32 @test_lshr_load64_1_msb(ptr %a) { 372; CHECK-COMMON-LABEL: test_lshr_load64_1_msb: 373; CHECK-COMMON: @ %bb.0: @ %entry 374; CHECK-COMMON-NEXT: ldrb r0, [r0, #7] 375; CHECK-COMMON-NEXT: bx lr 376; 377; CHECK-BE-LABEL: test_lshr_load64_1_msb: 378; CHECK-BE: @ %bb.0: @ %entry 379; CHECK-BE-NEXT: ldrb r0, [r0] 380; CHECK-BE-NEXT: bx lr 381; 382; CHECK-V6M-LABEL: test_lshr_load64_1_msb: 383; CHECK-V6M: @ %bb.0: @ %entry 384; CHECK-V6M-NEXT: ldrb r0, [r0, #7] 385; CHECK-V6M-NEXT: bx lr 386entry: 387 %0 = load i64, ptr %a, align 8 388 %1 = lshr i64 %0, 56 389 %conv = trunc i64 %1 to i32 390 ret i32 %conv 391} 392 393define arm_aapcscc i32 @test_lshr_load64_4(ptr %a) { 394; CHECK-COMMON-LABEL: test_lshr_load64_4: 395; CHECK-COMMON: @ %bb.0: @ %entry 396; CHECK-COMMON-NEXT: ldr r0, [r0, #4] 397; CHECK-COMMON-NEXT: bx lr 398; 399; CHECK-BE-LABEL: test_lshr_load64_4: 400; CHECK-BE: @ %bb.0: @ %entry 401; CHECK-BE-NEXT: ldr r0, [r0] 402; CHECK-BE-NEXT: bx lr 403; 404; CHECK-V6M-LABEL: test_lshr_load64_4: 405; CHECK-V6M: @ %bb.0: @ %entry 406; CHECK-V6M-NEXT: ldr r0, [r0, #4] 407; CHECK-V6M-NEXT: bx lr 408entry: 409 %0 = load i64, ptr %a, align 8 410 %1 = lshr i64 %0, 32 411 %conv = trunc i64 %1 to i32 412 ret i32 %conv 413} 414 415define arm_aapcscc i32 @test_lshr_load64_2(ptr %a) { 416; CHECK-COMMON-LABEL: test_lshr_load64_2: 417; CHECK-COMMON: @ %bb.0: @ %entry 418; CHECK-COMMON-NEXT: ldrh r0, [r0, #6] 419; CHECK-COMMON-NEXT: bx lr 420; 421; CHECK-BE-LABEL: test_lshr_load64_2: 422; CHECK-BE: @ %bb.0: @ %entry 423; CHECK-BE-NEXT: ldrh r0, [r0] 424; CHECK-BE-NEXT: bx lr 425; 426; CHECK-V6M-LABEL: test_lshr_load64_2: 427; CHECK-V6M: @ %bb.0: @ %entry 428; CHECK-V6M-NEXT: ldrh r0, [r0, #6] 429; CHECK-V6M-NEXT: bx lr 430entry: 431 %0 = load i64, ptr %a, align 8 432 %1 = lshr i64 %0, 48 433 %conv = trunc i64 %1 to i32 434 ret i32 %conv 435} 436 437define arm_aapcscc i32 @test_lshr_load4_fail(ptr %a) { 438; CHECK-ARM-LABEL: test_lshr_load4_fail: 439; CHECK-ARM: @ %bb.0: @ %entry 440; CHECK-ARM-NEXT: ldr r0, [r0, #1] 441; CHECK-ARM-NEXT: bx lr 442; 443; CHECK-BE-LABEL: test_lshr_load4_fail: 444; CHECK-BE: @ %bb.0: @ %entry 445; CHECK-BE-NEXT: ldr r0, [r0, #3] 446; CHECK-BE-NEXT: bx lr 447; 448; CHECK-THUMB-LABEL: test_lshr_load4_fail: 449; CHECK-THUMB: @ %bb.0: @ %entry 450; CHECK-THUMB-NEXT: ldr.w r0, [r0, #1] 451; CHECK-THUMB-NEXT: bx lr 452; 453; CHECK-ALIGN-LABEL: test_lshr_load4_fail: 454; CHECK-ALIGN: @ %bb.0: @ %entry 455; CHECK-ALIGN-NEXT: ldrd r0, r1, [r0] 456; CHECK-ALIGN-NEXT: lsrs r0, r0, #8 457; CHECK-ALIGN-NEXT: orr.w r0, r0, r1, lsl #24 458; CHECK-ALIGN-NEXT: bx lr 459; 460; CHECK-V6M-LABEL: test_lshr_load4_fail: 461; CHECK-V6M: @ %bb.0: @ %entry 462; CHECK-V6M-NEXT: ldr r1, [r0] 463; CHECK-V6M-NEXT: ldr r0, [r0, #4] 464; CHECK-V6M-NEXT: lsls r0, r0, #24 465; CHECK-V6M-NEXT: lsrs r1, r1, #8 466; CHECK-V6M-NEXT: adds r0, r1, r0 467; CHECK-V6M-NEXT: bx lr 468entry: 469 %0 = load i64, ptr %a, align 8 470 %1 = lshr i64 %0, 8 471 %conv = trunc i64 %1 to i32 472 ret i32 %conv 473} 474 475define arm_aapcscc void @test_shift7_mask8(ptr nocapture %p) { 476; CHECK-COMMON-LABEL: test_shift7_mask8: 477; CHECK-COMMON: @ %bb.0: @ %entry 478; CHECK-COMMON-NEXT: ldr r1, [r0] 479; CHECK-COMMON-NEXT: ubfx r1, r1, #7, #8 480; CHECK-COMMON-NEXT: str r1, [r0] 481; CHECK-COMMON-NEXT: bx lr 482; 483; CHECK-BE-LABEL: test_shift7_mask8: 484; CHECK-BE: @ %bb.0: @ %entry 485; CHECK-BE-NEXT: ldr r1, [r0] 486; CHECK-BE-NEXT: ubfx r1, r1, #7, #8 487; CHECK-BE-NEXT: str r1, [r0] 488; CHECK-BE-NEXT: bx lr 489; 490; CHECK-V6M-LABEL: test_shift7_mask8: 491; CHECK-V6M: @ %bb.0: @ %entry 492; CHECK-V6M-NEXT: ldr r1, [r0] 493; CHECK-V6M-NEXT: lsrs r1, r1, #7 494; CHECK-V6M-NEXT: uxtb r1, r1 495; CHECK-V6M-NEXT: str r1, [r0] 496; CHECK-V6M-NEXT: bx lr 497entry: 498 %0 = load i32, ptr %p, align 4 499 %shl = lshr i32 %0, 7 500 %and = and i32 %shl, 255 501 store i32 %and, ptr %p, align 4 502 ret void 503} 504 505define arm_aapcscc void @test_shift8_mask8(ptr nocapture %p) { 506; CHECK-COMMON-LABEL: test_shift8_mask8: 507; CHECK-COMMON: @ %bb.0: @ %entry 508; CHECK-COMMON-NEXT: ldrb r1, [r0, #1] 509; CHECK-COMMON-NEXT: str r1, [r0] 510; CHECK-COMMON-NEXT: bx lr 511; 512; CHECK-BE-LABEL: test_shift8_mask8: 513; CHECK-BE: @ %bb.0: @ %entry 514; CHECK-BE-NEXT: ldrb r1, [r0, #2] 515; CHECK-BE-NEXT: str r1, [r0] 516; CHECK-BE-NEXT: bx lr 517; 518; CHECK-V6M-LABEL: test_shift8_mask8: 519; CHECK-V6M: @ %bb.0: @ %entry 520; CHECK-V6M-NEXT: ldrb r1, [r0, #1] 521; CHECK-V6M-NEXT: str r1, [r0] 522; CHECK-V6M-NEXT: bx lr 523entry: 524 %0 = load i32, ptr %p, align 4 525 %shl = lshr i32 %0, 8 526 %and = and i32 %shl, 255 527 store i32 %and, ptr %p, align 4 528 ret void 529} 530 531define arm_aapcscc void @test_shift8_mask7(ptr nocapture %p) { 532; CHECK-COMMON-LABEL: test_shift8_mask7: 533; CHECK-COMMON: @ %bb.0: @ %entry 534; CHECK-COMMON-NEXT: ldr r1, [r0] 535; CHECK-COMMON-NEXT: ubfx r1, r1, #8, #7 536; CHECK-COMMON-NEXT: str r1, [r0] 537; CHECK-COMMON-NEXT: bx lr 538; 539; CHECK-BE-LABEL: test_shift8_mask7: 540; CHECK-BE: @ %bb.0: @ %entry 541; CHECK-BE-NEXT: ldr r1, [r0] 542; CHECK-BE-NEXT: ubfx r1, r1, #8, #7 543; CHECK-BE-NEXT: str r1, [r0] 544; CHECK-BE-NEXT: bx lr 545; 546; CHECK-V6M-LABEL: test_shift8_mask7: 547; CHECK-V6M: @ %bb.0: @ %entry 548; CHECK-V6M-NEXT: ldr r1, [r0] 549; CHECK-V6M-NEXT: lsls r1, r1, #17 550; CHECK-V6M-NEXT: lsrs r1, r1, #25 551; CHECK-V6M-NEXT: str r1, [r0] 552; CHECK-V6M-NEXT: bx lr 553entry: 554 %0 = load i32, ptr %p, align 4 555 %shl = lshr i32 %0, 8 556 %and = and i32 %shl, 127 557 store i32 %and, ptr %p, align 4 558 ret void 559} 560 561define arm_aapcscc void @test_shift9_mask8(ptr nocapture %p) { 562; CHECK-COMMON-LABEL: test_shift9_mask8: 563; CHECK-COMMON: @ %bb.0: @ %entry 564; CHECK-COMMON-NEXT: ldr r1, [r0] 565; CHECK-COMMON-NEXT: ubfx r1, r1, #9, #8 566; CHECK-COMMON-NEXT: str r1, [r0] 567; CHECK-COMMON-NEXT: bx lr 568; 569; CHECK-BE-LABEL: test_shift9_mask8: 570; CHECK-BE: @ %bb.0: @ %entry 571; CHECK-BE-NEXT: ldr r1, [r0] 572; CHECK-BE-NEXT: ubfx r1, r1, #9, #8 573; CHECK-BE-NEXT: str r1, [r0] 574; CHECK-BE-NEXT: bx lr 575; 576; CHECK-V6M-LABEL: test_shift9_mask8: 577; CHECK-V6M: @ %bb.0: @ %entry 578; CHECK-V6M-NEXT: ldr r1, [r0] 579; CHECK-V6M-NEXT: lsrs r1, r1, #9 580; CHECK-V6M-NEXT: uxtb r1, r1 581; CHECK-V6M-NEXT: str r1, [r0] 582; CHECK-V6M-NEXT: bx lr 583entry: 584 %0 = load i32, ptr %p, align 4 585 %shl = lshr i32 %0, 9 586 %and = and i32 %shl, 255 587 store i32 %and, ptr %p, align 4 588 ret void 589} 590 591define arm_aapcscc void @test_shift8_mask16(ptr nocapture %p) { 592; CHECK-ARM-LABEL: test_shift8_mask16: 593; CHECK-ARM: @ %bb.0: @ %entry 594; CHECK-ARM-NEXT: ldrh r1, [r0, #1] 595; CHECK-ARM-NEXT: str r1, [r0] 596; CHECK-ARM-NEXT: bx lr 597; 598; CHECK-BE-LABEL: test_shift8_mask16: 599; CHECK-BE: @ %bb.0: @ %entry 600; CHECK-BE-NEXT: ldrh r1, [r0, #1] 601; CHECK-BE-NEXT: str r1, [r0] 602; CHECK-BE-NEXT: bx lr 603; 604; CHECK-THUMB-LABEL: test_shift8_mask16: 605; CHECK-THUMB: @ %bb.0: @ %entry 606; CHECK-THUMB-NEXT: ldrh.w r1, [r0, #1] 607; CHECK-THUMB-NEXT: str r1, [r0] 608; CHECK-THUMB-NEXT: bx lr 609; 610; CHECK-ALIGN-LABEL: test_shift8_mask16: 611; CHECK-ALIGN: @ %bb.0: @ %entry 612; CHECK-ALIGN-NEXT: ldr r1, [r0] 613; CHECK-ALIGN-NEXT: ubfx r1, r1, #8, #16 614; CHECK-ALIGN-NEXT: str r1, [r0] 615; CHECK-ALIGN-NEXT: bx lr 616; 617; CHECK-V6M-LABEL: test_shift8_mask16: 618; CHECK-V6M: @ %bb.0: @ %entry 619; CHECK-V6M-NEXT: ldr r1, [r0] 620; CHECK-V6M-NEXT: lsrs r1, r1, #8 621; CHECK-V6M-NEXT: uxth r1, r1 622; CHECK-V6M-NEXT: str r1, [r0] 623; CHECK-V6M-NEXT: bx lr 624entry: 625 %0 = load i32, ptr %p, align 4 626 %shl = lshr i32 %0, 8 627 %and = and i32 %shl, 65535 628 store i32 %and, ptr %p, align 4 629 ret void 630} 631 632define arm_aapcscc void @test_shift15_mask16(ptr nocapture %p) { 633; CHECK-COMMON-LABEL: test_shift15_mask16: 634; CHECK-COMMON: @ %bb.0: @ %entry 635; CHECK-COMMON-NEXT: ldr r1, [r0] 636; CHECK-COMMON-NEXT: ubfx r1, r1, #15, #16 637; CHECK-COMMON-NEXT: str r1, [r0] 638; CHECK-COMMON-NEXT: bx lr 639; 640; CHECK-BE-LABEL: test_shift15_mask16: 641; CHECK-BE: @ %bb.0: @ %entry 642; CHECK-BE-NEXT: ldr r1, [r0] 643; CHECK-BE-NEXT: ubfx r1, r1, #15, #16 644; CHECK-BE-NEXT: str r1, [r0] 645; CHECK-BE-NEXT: bx lr 646; 647; CHECK-V6M-LABEL: test_shift15_mask16: 648; CHECK-V6M: @ %bb.0: @ %entry 649; CHECK-V6M-NEXT: ldr r1, [r0] 650; CHECK-V6M-NEXT: lsrs r1, r1, #15 651; CHECK-V6M-NEXT: uxth r1, r1 652; CHECK-V6M-NEXT: str r1, [r0] 653; CHECK-V6M-NEXT: bx lr 654entry: 655 %0 = load i32, ptr %p, align 4 656 %shl = lshr i32 %0, 15 657 %and = and i32 %shl, 65535 658 store i32 %and, ptr %p, align 4 659 ret void 660} 661 662define arm_aapcscc void @test_shift16_mask15(ptr nocapture %p) { 663; CHECK-COMMON-LABEL: test_shift16_mask15: 664; CHECK-COMMON: @ %bb.0: @ %entry 665; CHECK-COMMON-NEXT: ldrh r1, [r0, #2] 666; CHECK-COMMON-NEXT: bfc r1, #15, #17 667; CHECK-COMMON-NEXT: str r1, [r0] 668; CHECK-COMMON-NEXT: bx lr 669; 670; CHECK-BE-LABEL: test_shift16_mask15: 671; CHECK-BE: @ %bb.0: @ %entry 672; CHECK-BE-NEXT: ldrh r1, [r0] 673; CHECK-BE-NEXT: bfc r1, #15, #17 674; CHECK-BE-NEXT: str r1, [r0] 675; CHECK-BE-NEXT: bx lr 676; 677; CHECK-V6M-LABEL: test_shift16_mask15: 678; CHECK-V6M: @ %bb.0: @ %entry 679; CHECK-V6M-NEXT: ldrh r1, [r0, #2] 680; CHECK-V6M-NEXT: ldr r2, .LCPI21_0 681; CHECK-V6M-NEXT: ands r2, r1 682; CHECK-V6M-NEXT: str r2, [r0] 683; CHECK-V6M-NEXT: bx lr 684; CHECK-V6M-NEXT: .p2align 2 685; CHECK-V6M-NEXT: @ %bb.1: 686; CHECK-V6M-NEXT: .LCPI21_0: 687; CHECK-V6M-NEXT: .long 32767 @ 0x7fff 688entry: 689 %0 = load i32, ptr %p, align 4 690 %shl = lshr i32 %0, 16 691 %and = and i32 %shl, 32767 692 store i32 %and, ptr %p, align 4 693 ret void 694} 695 696define arm_aapcscc void @test_shift8_mask24(ptr nocapture %p) { 697; CHECK-ARM-LABEL: test_shift8_mask24: 698; CHECK-ARM: @ %bb.0: @ %entry 699; CHECK-ARM-NEXT: ldr r1, [r0] 700; CHECK-ARM-NEXT: lsr r1, r1, #8 701; CHECK-ARM-NEXT: str r1, [r0] 702; CHECK-ARM-NEXT: bx lr 703; 704; CHECK-BE-LABEL: test_shift8_mask24: 705; CHECK-BE: @ %bb.0: @ %entry 706; CHECK-BE-NEXT: ldr r1, [r0] 707; CHECK-BE-NEXT: lsr r1, r1, #8 708; CHECK-BE-NEXT: str r1, [r0] 709; CHECK-BE-NEXT: bx lr 710; 711; CHECK-THUMB-LABEL: test_shift8_mask24: 712; CHECK-THUMB: @ %bb.0: @ %entry 713; CHECK-THUMB-NEXT: ldr r1, [r0] 714; CHECK-THUMB-NEXT: lsrs r1, r1, #8 715; CHECK-THUMB-NEXT: str r1, [r0] 716; CHECK-THUMB-NEXT: bx lr 717; 718; CHECK-ALIGN-LABEL: test_shift8_mask24: 719; CHECK-ALIGN: @ %bb.0: @ %entry 720; CHECK-ALIGN-NEXT: ldr r1, [r0] 721; CHECK-ALIGN-NEXT: lsrs r1, r1, #8 722; CHECK-ALIGN-NEXT: str r1, [r0] 723; CHECK-ALIGN-NEXT: bx lr 724; 725; CHECK-V6M-LABEL: test_shift8_mask24: 726; CHECK-V6M: @ %bb.0: @ %entry 727; CHECK-V6M-NEXT: ldr r1, [r0] 728; CHECK-V6M-NEXT: lsrs r1, r1, #8 729; CHECK-V6M-NEXT: str r1, [r0] 730; CHECK-V6M-NEXT: bx lr 731entry: 732 %0 = load i32, ptr %p, align 4 733 %shl = lshr i32 %0, 8 734 %and = and i32 %shl, 16777215 735 store i32 %and, ptr %p, align 4 736 ret void 737} 738 739define arm_aapcscc void @test_shift24_mask16(ptr nocapture %p) { 740; CHECK-COMMON-LABEL: test_shift24_mask16: 741; CHECK-COMMON: @ %bb.0: @ %entry 742; CHECK-COMMON-NEXT: ldrb r1, [r0, #3] 743; CHECK-COMMON-NEXT: str r1, [r0] 744; CHECK-COMMON-NEXT: bx lr 745; 746; CHECK-BE-LABEL: test_shift24_mask16: 747; CHECK-BE: @ %bb.0: @ %entry 748; CHECK-BE-NEXT: ldrb r1, [r0] 749; CHECK-BE-NEXT: str r1, [r0] 750; CHECK-BE-NEXT: bx lr 751; 752; CHECK-V6M-LABEL: test_shift24_mask16: 753; CHECK-V6M: @ %bb.0: @ %entry 754; CHECK-V6M-NEXT: ldrb r1, [r0, #3] 755; CHECK-V6M-NEXT: str r1, [r0] 756; CHECK-V6M-NEXT: bx lr 757entry: 758 %0 = load i32, ptr %p, align 4 759 %shl = lshr i32 %0, 24 760 %and = and i32 %shl, 65535 761 store i32 %and, ptr %p, align 4 762 ret void 763} 764 765define arm_aapcscc void @test_sext_shift8_mask8(ptr %p, ptr %q) { 766; CHECK-COMMON-LABEL: test_sext_shift8_mask8: 767; CHECK-COMMON: @ %bb.0: @ %entry 768; CHECK-COMMON-NEXT: ldrb r0, [r0, #1] 769; CHECK-COMMON-NEXT: str r0, [r1] 770; CHECK-COMMON-NEXT: bx lr 771; 772; CHECK-BE-LABEL: test_sext_shift8_mask8: 773; CHECK-BE: @ %bb.0: @ %entry 774; CHECK-BE-NEXT: ldrb r0, [r0] 775; CHECK-BE-NEXT: str r0, [r1] 776; CHECK-BE-NEXT: bx lr 777; 778; CHECK-V6M-LABEL: test_sext_shift8_mask8: 779; CHECK-V6M: @ %bb.0: @ %entry 780; CHECK-V6M-NEXT: ldrb r0, [r0, #1] 781; CHECK-V6M-NEXT: str r0, [r1] 782; CHECK-V6M-NEXT: bx lr 783entry: 784 %0 = load i16, ptr %p, align 4 785 %1 = sext i16 %0 to i32 786 %shl = lshr i32 %1, 8 787 %and = and i32 %shl, 255 788 store i32 %and, ptr %q, align 4 789 ret void 790} 791 792define arm_aapcscc void @test_sext_shift8_mask16(ptr %p, ptr %q) { 793; CHECK-ARM-LABEL: test_sext_shift8_mask16: 794; CHECK-ARM: @ %bb.0: @ %entry 795; CHECK-ARM-NEXT: ldrsh r0, [r0] 796; CHECK-ARM-NEXT: ubfx r0, r0, #8, #16 797; CHECK-ARM-NEXT: str r0, [r1] 798; CHECK-ARM-NEXT: bx lr 799; 800; CHECK-BE-LABEL: test_sext_shift8_mask16: 801; CHECK-BE: @ %bb.0: @ %entry 802; CHECK-BE-NEXT: ldrsh r0, [r0] 803; CHECK-BE-NEXT: ubfx r0, r0, #8, #16 804; CHECK-BE-NEXT: str r0, [r1] 805; CHECK-BE-NEXT: bx lr 806; 807; CHECK-THUMB-LABEL: test_sext_shift8_mask16: 808; CHECK-THUMB: @ %bb.0: @ %entry 809; CHECK-THUMB-NEXT: ldrsh.w r0, [r0] 810; CHECK-THUMB-NEXT: ubfx r0, r0, #8, #16 811; CHECK-THUMB-NEXT: str r0, [r1] 812; CHECK-THUMB-NEXT: bx lr 813; 814; CHECK-ALIGN-LABEL: test_sext_shift8_mask16: 815; CHECK-ALIGN: @ %bb.0: @ %entry 816; CHECK-ALIGN-NEXT: ldrsh.w r0, [r0] 817; CHECK-ALIGN-NEXT: ubfx r0, r0, #8, #16 818; CHECK-ALIGN-NEXT: str r0, [r1] 819; CHECK-ALIGN-NEXT: bx lr 820; 821; CHECK-V6M-LABEL: test_sext_shift8_mask16: 822; CHECK-V6M: @ %bb.0: @ %entry 823; CHECK-V6M-NEXT: movs r2, #0 824; CHECK-V6M-NEXT: ldrsh r0, [r0, r2] 825; CHECK-V6M-NEXT: lsrs r0, r0, #8 826; CHECK-V6M-NEXT: uxth r0, r0 827; CHECK-V6M-NEXT: str r0, [r1] 828; CHECK-V6M-NEXT: bx lr 829entry: 830 %0 = load i16, ptr %p, align 4 831 %1 = sext i16 %0 to i32 832 %shl = lshr i32 %1, 8 833 %and = and i32 %shl, 65535 834 store i32 %and, ptr %q, align 4 835 ret void 836} 837 838define i1 @trunc_i64_mask_srl(i32 zeroext %AttrArgNo, ptr %ptr) { 839; CHECK-ARM-LABEL: trunc_i64_mask_srl: 840; CHECK-ARM: @ %bb.0: @ %entry 841; CHECK-ARM-NEXT: ldrh r2, [r1, #4] 842; CHECK-ARM-NEXT: mov r1, #0 843; CHECK-ARM-NEXT: cmp r2, r0 844; CHECK-ARM-NEXT: movwhi r1, #1 845; CHECK-ARM-NEXT: mov r0, r1 846; CHECK-ARM-NEXT: bx lr 847; 848; CHECK-BE-LABEL: trunc_i64_mask_srl: 849; CHECK-BE: @ %bb.0: @ %entry 850; CHECK-BE-NEXT: ldrh r2, [r1, #2] 851; CHECK-BE-NEXT: mov r1, #0 852; CHECK-BE-NEXT: cmp r2, r0 853; CHECK-BE-NEXT: movwhi r1, #1 854; CHECK-BE-NEXT: mov r0, r1 855; CHECK-BE-NEXT: bx lr 856; 857; CHECK-THUMB-LABEL: trunc_i64_mask_srl: 858; CHECK-THUMB: @ %bb.0: @ %entry 859; CHECK-THUMB-NEXT: ldrh r2, [r1, #4] 860; CHECK-THUMB-NEXT: movs r1, #0 861; CHECK-THUMB-NEXT: cmp r2, r0 862; CHECK-THUMB-NEXT: it hi 863; CHECK-THUMB-NEXT: movhi r1, #1 864; CHECK-THUMB-NEXT: mov r0, r1 865; CHECK-THUMB-NEXT: bx lr 866; 867; CHECK-ALIGN-LABEL: trunc_i64_mask_srl: 868; CHECK-ALIGN: @ %bb.0: @ %entry 869; CHECK-ALIGN-NEXT: ldrh r2, [r1, #4] 870; CHECK-ALIGN-NEXT: movs r1, #0 871; CHECK-ALIGN-NEXT: cmp r2, r0 872; CHECK-ALIGN-NEXT: it hi 873; CHECK-ALIGN-NEXT: movhi r1, #1 874; CHECK-ALIGN-NEXT: mov r0, r1 875; CHECK-ALIGN-NEXT: bx lr 876; 877; CHECK-V6M-LABEL: trunc_i64_mask_srl: 878; CHECK-V6M: @ %bb.0: @ %entry 879; CHECK-V6M-NEXT: ldrh r1, [r1, #4] 880; CHECK-V6M-NEXT: cmp r1, r0 881; CHECK-V6M-NEXT: bhi .LBB26_2 882; CHECK-V6M-NEXT: @ %bb.1: @ %entry 883; CHECK-V6M-NEXT: movs r0, #0 884; CHECK-V6M-NEXT: bx lr 885; CHECK-V6M-NEXT: .LBB26_2: 886; CHECK-V6M-NEXT: movs r0, #1 887; CHECK-V6M-NEXT: bx lr 888entry: 889 %bf.load.i = load i64, ptr %ptr, align 8 890 %bf.lshr.i = lshr i64 %bf.load.i, 32 891 %0 = trunc i64 %bf.lshr.i to i32 892 %bf.cast.i = and i32 %0, 65535 893 %cmp.i = icmp ugt i32 %bf.cast.i, %AttrArgNo 894 ret i1 %cmp.i 895} 896 897define i64 @or_tree_with_shifts_i64(i64 %a, i64 %b, i64 %c, i64 %d) { 898; CHECK-ARM-LABEL: or_tree_with_shifts_i64: 899; CHECK-ARM: @ %bb.0: 900; CHECK-ARM-NEXT: .save {r11, lr} 901; CHECK-ARM-NEXT: push {r11, lr} 902; CHECK-ARM-NEXT: ldr lr, [sp, #16] 903; CHECK-ARM-NEXT: orr r0, r0, r2, lsl #16 904; CHECK-ARM-NEXT: ldr r12, [sp, #8] 905; CHECK-ARM-NEXT: orr r3, lr, r3 906; CHECK-ARM-NEXT: orr r1, r1, r3, lsl #16 907; CHECK-ARM-NEXT: orr r1, r1, r2, lsr #16 908; CHECK-ARM-NEXT: orr r1, r1, r12 909; CHECK-ARM-NEXT: pop {r11, pc} 910; 911; CHECK-BE-LABEL: or_tree_with_shifts_i64: 912; CHECK-BE: @ %bb.0: 913; CHECK-BE-NEXT: .save {r11, lr} 914; CHECK-BE-NEXT: push {r11, lr} 915; CHECK-BE-NEXT: ldr lr, [sp, #20] 916; CHECK-BE-NEXT: orr r1, r1, r3, lsl #16 917; CHECK-BE-NEXT: ldr r12, [sp, #12] 918; CHECK-BE-NEXT: orr r2, lr, r2 919; CHECK-BE-NEXT: orr r0, r0, r2, lsl #16 920; CHECK-BE-NEXT: orr r0, r0, r3, lsr #16 921; CHECK-BE-NEXT: orr r0, r0, r12 922; CHECK-BE-NEXT: pop {r11, pc} 923; 924; CHECK-ALIGN-LABEL: or_tree_with_shifts_i64: 925; CHECK-ALIGN: @ %bb.0: 926; CHECK-ALIGN-NEXT: ldr.w r12, [sp, #8] 927; CHECK-ALIGN-NEXT: orr.w r0, r0, r2, lsl #16 928; CHECK-ALIGN-NEXT: orr.w r3, r3, r12 929; CHECK-ALIGN-NEXT: orr.w r1, r1, r3, lsl #16 930; CHECK-ALIGN-NEXT: orr.w r1, r1, r2, lsr #16 931; CHECK-ALIGN-NEXT: ldr r2, [sp] 932; CHECK-ALIGN-NEXT: orrs r1, r2 933; CHECK-ALIGN-NEXT: bx lr 934; 935; CHECK-V6M-LABEL: or_tree_with_shifts_i64: 936; CHECK-V6M: @ %bb.0: 937; CHECK-V6M-NEXT: push {r4, lr} 938; CHECK-V6M-NEXT: lsls r4, r2, #16 939; CHECK-V6M-NEXT: orrs r0, r4 940; CHECK-V6M-NEXT: ldr r4, [sp, #16] 941; CHECK-V6M-NEXT: orrs r4, r3 942; CHECK-V6M-NEXT: lsls r3, r4, #16 943; CHECK-V6M-NEXT: orrs r1, r3 944; CHECK-V6M-NEXT: lsrs r2, r2, #16 945; CHECK-V6M-NEXT: orrs r1, r2 946; CHECK-V6M-NEXT: ldr r2, [sp, #8] 947; CHECK-V6M-NEXT: orrs r1, r2 948; CHECK-V6M-NEXT: pop {r4, pc} 949 %b.shifted = shl i64 %b, 16 950 %c.shifted = shl i64 %c, 32 951 %d.shifted = shl i64 %d, 48 952 %or.ad = or i64 %a, %d.shifted 953 %or.adb = or i64 %or.ad, %b.shifted 954 %or.adbc = or i64 %or.adb, %c.shifted 955 ret i64 %or.adbc 956} 957 958define i32 @or_tree_with_shifts_i32(i32 %a, i32 %b, i32 %c, i32 %d) { 959; CHECK-ARM-LABEL: or_tree_with_shifts_i32: 960; CHECK-ARM: @ %bb.0: 961; CHECK-ARM-NEXT: orr r0, r0, r2 962; CHECK-ARM-NEXT: orr r0, r1, r0, lsl #16 963; CHECK-ARM-NEXT: orr r0, r0, r3 964; CHECK-ARM-NEXT: bx lr 965; 966; CHECK-BE-LABEL: or_tree_with_shifts_i32: 967; CHECK-BE: @ %bb.0: 968; CHECK-BE-NEXT: orr r0, r0, r2 969; CHECK-BE-NEXT: orr r0, r1, r0, lsl #16 970; CHECK-BE-NEXT: orr r0, r0, r3 971; CHECK-BE-NEXT: bx lr 972; 973; CHECK-THUMB-LABEL: or_tree_with_shifts_i32: 974; CHECK-THUMB: @ %bb.0: 975; CHECK-THUMB-NEXT: orrs r0, r2 976; CHECK-THUMB-NEXT: orr.w r0, r1, r0, lsl #16 977; CHECK-THUMB-NEXT: orrs r0, r3 978; CHECK-THUMB-NEXT: bx lr 979; 980; CHECK-ALIGN-LABEL: or_tree_with_shifts_i32: 981; CHECK-ALIGN: @ %bb.0: 982; CHECK-ALIGN-NEXT: orrs r0, r2 983; CHECK-ALIGN-NEXT: orr.w r0, r1, r0, lsl #16 984; CHECK-ALIGN-NEXT: orrs r0, r3 985; CHECK-ALIGN-NEXT: bx lr 986; 987; CHECK-V6M-LABEL: or_tree_with_shifts_i32: 988; CHECK-V6M: @ %bb.0: 989; CHECK-V6M-NEXT: orrs r0, r2 990; CHECK-V6M-NEXT: lsls r0, r0, #16 991; CHECK-V6M-NEXT: orrs r0, r1 992; CHECK-V6M-NEXT: orrs r0, r3 993; CHECK-V6M-NEXT: bx lr 994 %a.shifted = shl i32 %a, 16 995 %c.shifted = shl i32 %c, 16 996 %or.ab = or i32 %a.shifted, %b 997 %or.cd = or i32 %c.shifted, %d 998 %r = or i32 %or.ab, %or.cd 999 ret i32 %r 1000} 1001 1002define i32 @xor_tree_with_shifts_i32(i32 %a, i32 %b, i32 %c, i32 %d) { 1003; CHECK-ARM-LABEL: xor_tree_with_shifts_i32: 1004; CHECK-ARM: @ %bb.0: 1005; CHECK-ARM-NEXT: eor r0, r0, r2 1006; CHECK-ARM-NEXT: eor r0, r1, r0, lsr #16 1007; CHECK-ARM-NEXT: eor r0, r0, r3 1008; CHECK-ARM-NEXT: bx lr 1009; 1010; CHECK-BE-LABEL: xor_tree_with_shifts_i32: 1011; CHECK-BE: @ %bb.0: 1012; CHECK-BE-NEXT: eor r0, r0, r2 1013; CHECK-BE-NEXT: eor r0, r1, r0, lsr #16 1014; CHECK-BE-NEXT: eor r0, r0, r3 1015; CHECK-BE-NEXT: bx lr 1016; 1017; CHECK-THUMB-LABEL: xor_tree_with_shifts_i32: 1018; CHECK-THUMB: @ %bb.0: 1019; CHECK-THUMB-NEXT: eors r0, r2 1020; CHECK-THUMB-NEXT: eor.w r0, r1, r0, lsr #16 1021; CHECK-THUMB-NEXT: eors r0, r3 1022; CHECK-THUMB-NEXT: bx lr 1023; 1024; CHECK-ALIGN-LABEL: xor_tree_with_shifts_i32: 1025; CHECK-ALIGN: @ %bb.0: 1026; CHECK-ALIGN-NEXT: eors r0, r2 1027; CHECK-ALIGN-NEXT: eor.w r0, r1, r0, lsr #16 1028; CHECK-ALIGN-NEXT: eors r0, r3 1029; CHECK-ALIGN-NEXT: bx lr 1030; 1031; CHECK-V6M-LABEL: xor_tree_with_shifts_i32: 1032; CHECK-V6M: @ %bb.0: 1033; CHECK-V6M-NEXT: eors r0, r2 1034; CHECK-V6M-NEXT: lsrs r0, r0, #16 1035; CHECK-V6M-NEXT: eors r0, r1 1036; CHECK-V6M-NEXT: eors r0, r3 1037; CHECK-V6M-NEXT: bx lr 1038 %a.shifted = lshr i32 %a, 16 1039 %c.shifted = lshr i32 %c, 16 1040 %xor.ab = xor i32 %a.shifted, %b 1041 %xor.cd = xor i32 %d, %c.shifted 1042 %r = xor i32 %xor.ab, %xor.cd 1043 ret i32 %r 1044} 1045 1046define i32 @and_tree_with_shifts_i32(i32 %a, i32 %b, i32 %c, i32 %d) { 1047; CHECK-ARM-LABEL: and_tree_with_shifts_i32: 1048; CHECK-ARM: @ %bb.0: 1049; CHECK-ARM-NEXT: and r0, r0, r2 1050; CHECK-ARM-NEXT: and r0, r1, r0, asr #16 1051; CHECK-ARM-NEXT: and r0, r0, r3 1052; CHECK-ARM-NEXT: bx lr 1053; 1054; CHECK-BE-LABEL: and_tree_with_shifts_i32: 1055; CHECK-BE: @ %bb.0: 1056; CHECK-BE-NEXT: and r0, r0, r2 1057; CHECK-BE-NEXT: and r0, r1, r0, asr #16 1058; CHECK-BE-NEXT: and r0, r0, r3 1059; CHECK-BE-NEXT: bx lr 1060; 1061; CHECK-THUMB-LABEL: and_tree_with_shifts_i32: 1062; CHECK-THUMB: @ %bb.0: 1063; CHECK-THUMB-NEXT: ands r0, r2 1064; CHECK-THUMB-NEXT: and.w r0, r1, r0, asr #16 1065; CHECK-THUMB-NEXT: ands r0, r3 1066; CHECK-THUMB-NEXT: bx lr 1067; 1068; CHECK-ALIGN-LABEL: and_tree_with_shifts_i32: 1069; CHECK-ALIGN: @ %bb.0: 1070; CHECK-ALIGN-NEXT: ands r0, r2 1071; CHECK-ALIGN-NEXT: and.w r0, r1, r0, asr #16 1072; CHECK-ALIGN-NEXT: ands r0, r3 1073; CHECK-ALIGN-NEXT: bx lr 1074; 1075; CHECK-V6M-LABEL: and_tree_with_shifts_i32: 1076; CHECK-V6M: @ %bb.0: 1077; CHECK-V6M-NEXT: ands r0, r2 1078; CHECK-V6M-NEXT: asrs r0, r0, #16 1079; CHECK-V6M-NEXT: ands r0, r1 1080; CHECK-V6M-NEXT: ands r0, r3 1081; CHECK-V6M-NEXT: bx lr 1082 %a.shifted = ashr i32 %a, 16 1083 %c.shifted = ashr i32 %c, 16 1084 %and.ab = and i32 %b, %a.shifted 1085 %and.cd = and i32 %c.shifted, %d 1086 %r = and i32 %and.ab, %and.cd 1087 ret i32 %r 1088} 1089 1090define i32 @logic_tree_with_shifts_var_i32(i32 %a, i32 %b, i32 %c, i32 %d, i32 %s) { 1091; CHECK-ARM-LABEL: logic_tree_with_shifts_var_i32: 1092; CHECK-ARM: @ %bb.0: 1093; CHECK-ARM-NEXT: ldr r12, [sp] 1094; CHECK-ARM-NEXT: orr r0, r0, r2 1095; CHECK-ARM-NEXT: orr r0, r1, r0, lsl r12 1096; CHECK-ARM-NEXT: orr r0, r0, r3 1097; CHECK-ARM-NEXT: bx lr 1098; 1099; CHECK-BE-LABEL: logic_tree_with_shifts_var_i32: 1100; CHECK-BE: @ %bb.0: 1101; CHECK-BE-NEXT: ldr r12, [sp] 1102; CHECK-BE-NEXT: orr r0, r0, r2 1103; CHECK-BE-NEXT: orr r0, r1, r0, lsl r12 1104; CHECK-BE-NEXT: orr r0, r0, r3 1105; CHECK-BE-NEXT: bx lr 1106; 1107; CHECK-ALIGN-LABEL: logic_tree_with_shifts_var_i32: 1108; CHECK-ALIGN: @ %bb.0: 1109; CHECK-ALIGN-NEXT: orrs r0, r2 1110; CHECK-ALIGN-NEXT: ldr r2, [sp] 1111; CHECK-ALIGN-NEXT: lsls r0, r2 1112; CHECK-ALIGN-NEXT: orrs r0, r1 1113; CHECK-ALIGN-NEXT: orrs r0, r3 1114; CHECK-ALIGN-NEXT: bx lr 1115; 1116; CHECK-V6M-LABEL: logic_tree_with_shifts_var_i32: 1117; CHECK-V6M: @ %bb.0: 1118; CHECK-V6M-NEXT: orrs r0, r2 1119; CHECK-V6M-NEXT: ldr r2, [sp] 1120; CHECK-V6M-NEXT: lsls r0, r2 1121; CHECK-V6M-NEXT: orrs r0, r1 1122; CHECK-V6M-NEXT: orrs r0, r3 1123; CHECK-V6M-NEXT: bx lr 1124 %a.shifted = shl i32 %a, %s 1125 %c.shifted = shl i32 %c, %s 1126 %or.ab = or i32 %b, %a.shifted 1127 %or.cd = or i32 %d, %c.shifted 1128 %r = or i32 %or.ab, %or.cd 1129 ret i32 %r 1130} 1131 1132define i32 @logic_tree_with_mismatching_shifts_i32(i32 %a, i32 %b, i32 %c, i32 %d) { 1133; CHECK-ARM-LABEL: logic_tree_with_mismatching_shifts_i32: 1134; CHECK-ARM: @ %bb.0: 1135; CHECK-ARM-NEXT: orr r2, r3, r2, lsl #16 1136; CHECK-ARM-NEXT: orr r0, r1, r0, lsl #15 1137; CHECK-ARM-NEXT: orr r0, r0, r2 1138; CHECK-ARM-NEXT: bx lr 1139; 1140; CHECK-BE-LABEL: logic_tree_with_mismatching_shifts_i32: 1141; CHECK-BE: @ %bb.0: 1142; CHECK-BE-NEXT: orr r2, r3, r2, lsl #16 1143; CHECK-BE-NEXT: orr r0, r1, r0, lsl #15 1144; CHECK-BE-NEXT: orr r0, r0, r2 1145; CHECK-BE-NEXT: bx lr 1146; 1147; CHECK-THUMB-LABEL: logic_tree_with_mismatching_shifts_i32: 1148; CHECK-THUMB: @ %bb.0: 1149; CHECK-THUMB-NEXT: orr.w r2, r3, r2, lsl #16 1150; CHECK-THUMB-NEXT: orr.w r0, r1, r0, lsl #15 1151; CHECK-THUMB-NEXT: orrs r0, r2 1152; CHECK-THUMB-NEXT: bx lr 1153; 1154; CHECK-ALIGN-LABEL: logic_tree_with_mismatching_shifts_i32: 1155; CHECK-ALIGN: @ %bb.0: 1156; CHECK-ALIGN-NEXT: orr.w r2, r3, r2, lsl #16 1157; CHECK-ALIGN-NEXT: orr.w r0, r1, r0, lsl #15 1158; CHECK-ALIGN-NEXT: orrs r0, r2 1159; CHECK-ALIGN-NEXT: bx lr 1160; 1161; CHECK-V6M-LABEL: logic_tree_with_mismatching_shifts_i32: 1162; CHECK-V6M: @ %bb.0: 1163; CHECK-V6M-NEXT: lsls r2, r2, #16 1164; CHECK-V6M-NEXT: orrs r2, r3 1165; CHECK-V6M-NEXT: lsls r0, r0, #15 1166; CHECK-V6M-NEXT: orrs r0, r1 1167; CHECK-V6M-NEXT: orrs r0, r2 1168; CHECK-V6M-NEXT: bx lr 1169 %a.shifted = shl i32 %a, 15 1170 %c.shifted = shl i32 %c, 16 1171 %or.ab = or i32 %a.shifted, %b 1172 %or.cd = or i32 %c.shifted, %d 1173 %r = or i32 %or.ab, %or.cd 1174 ret i32 %r 1175} 1176 1177define i32 @logic_tree_with_mismatching_shifts2_i32(i32 %a, i32 %b, i32 %c, i32 %d) { 1178; CHECK-ARM-LABEL: logic_tree_with_mismatching_shifts2_i32: 1179; CHECK-ARM: @ %bb.0: 1180; CHECK-ARM-NEXT: orr r2, r3, r2, lsr #16 1181; CHECK-ARM-NEXT: orr r0, r1, r0, lsl #16 1182; CHECK-ARM-NEXT: orr r0, r0, r2 1183; CHECK-ARM-NEXT: bx lr 1184; 1185; CHECK-BE-LABEL: logic_tree_with_mismatching_shifts2_i32: 1186; CHECK-BE: @ %bb.0: 1187; CHECK-BE-NEXT: orr r2, r3, r2, lsr #16 1188; CHECK-BE-NEXT: orr r0, r1, r0, lsl #16 1189; CHECK-BE-NEXT: orr r0, r0, r2 1190; CHECK-BE-NEXT: bx lr 1191; 1192; CHECK-THUMB-LABEL: logic_tree_with_mismatching_shifts2_i32: 1193; CHECK-THUMB: @ %bb.0: 1194; CHECK-THUMB-NEXT: orr.w r2, r3, r2, lsr #16 1195; CHECK-THUMB-NEXT: orr.w r0, r1, r0, lsl #16 1196; CHECK-THUMB-NEXT: orrs r0, r2 1197; CHECK-THUMB-NEXT: bx lr 1198; 1199; CHECK-ALIGN-LABEL: logic_tree_with_mismatching_shifts2_i32: 1200; CHECK-ALIGN: @ %bb.0: 1201; CHECK-ALIGN-NEXT: orr.w r2, r3, r2, lsr #16 1202; CHECK-ALIGN-NEXT: orr.w r0, r1, r0, lsl #16 1203; CHECK-ALIGN-NEXT: orrs r0, r2 1204; CHECK-ALIGN-NEXT: bx lr 1205; 1206; CHECK-V6M-LABEL: logic_tree_with_mismatching_shifts2_i32: 1207; CHECK-V6M: @ %bb.0: 1208; CHECK-V6M-NEXT: lsrs r2, r2, #16 1209; CHECK-V6M-NEXT: orrs r2, r3 1210; CHECK-V6M-NEXT: lsls r0, r0, #16 1211; CHECK-V6M-NEXT: orrs r0, r1 1212; CHECK-V6M-NEXT: orrs r0, r2 1213; CHECK-V6M-NEXT: bx lr 1214 %a.shifted = shl i32 %a, 16 1215 %c.shifted = lshr i32 %c, 16 1216 %or.ab = or i32 %a.shifted, %b 1217 %or.cd = or i32 %c.shifted, %d 1218 %r = or i32 %or.ab, %or.cd 1219 ret i32 %r 1220} 1221 1222define <4 x i32> @or_tree_with_shifts_vec_i32(<4 x i32> %a, <4 x i32> %b, <4 x i32> %c, <4 x i32> %d) { 1223; CHECK-ARM-LABEL: or_tree_with_shifts_vec_i32: 1224; CHECK-ARM: @ %bb.0: 1225; CHECK-ARM-NEXT: vorr q8, q0, q2 1226; CHECK-ARM-NEXT: vshl.i32 q8, q8, #16 1227; CHECK-ARM-NEXT: vorr q8, q8, q1 1228; CHECK-ARM-NEXT: vorr q0, q8, q3 1229; CHECK-ARM-NEXT: bx lr 1230; 1231; CHECK-BE-LABEL: or_tree_with_shifts_vec_i32: 1232; CHECK-BE: @ %bb.0: 1233; CHECK-BE-NEXT: vrev64.32 q8, q2 1234; CHECK-BE-NEXT: vrev64.32 q9, q0 1235; CHECK-BE-NEXT: vorr q8, q9, q8 1236; CHECK-BE-NEXT: vrev64.32 q9, q1 1237; CHECK-BE-NEXT: vrev64.32 q10, q3 1238; CHECK-BE-NEXT: vshl.i32 q8, q8, #16 1239; CHECK-BE-NEXT: vorr q8, q8, q9 1240; CHECK-BE-NEXT: vorr q8, q8, q10 1241; CHECK-BE-NEXT: vrev64.32 q0, q8 1242; CHECK-BE-NEXT: bx lr 1243 %a.shifted = shl <4 x i32> %a, <i32 16, i32 16, i32 16, i32 16> 1244 %c.shifted = shl <4 x i32> %c, <i32 16, i32 16, i32 16, i32 16> 1245 %or.ab = or <4 x i32> %a.shifted, %b 1246 %or.cd = or <4 x i32> %c.shifted, %d 1247 %r = or <4 x i32> %or.ab, %or.cd 1248 ret <4 x i32> %r 1249} 1250 1251define <4 x i32> @or_tree_with_mismatching_shifts_vec_i32(<4 x i32> %a, <4 x i32> %b, <4 x i32> %c, <4 x i32> %d) { 1252; CHECK-ARM-LABEL: or_tree_with_mismatching_shifts_vec_i32: 1253; CHECK-ARM: @ %bb.0: 1254; CHECK-ARM-NEXT: vshl.i32 q8, q2, #17 1255; CHECK-ARM-NEXT: vshl.i32 q9, q0, #16 1256; CHECK-ARM-NEXT: vorr q8, q8, q3 1257; CHECK-ARM-NEXT: vorr q9, q9, q1 1258; CHECK-ARM-NEXT: vorr q0, q9, q8 1259; CHECK-ARM-NEXT: bx lr 1260; 1261; CHECK-BE-LABEL: or_tree_with_mismatching_shifts_vec_i32: 1262; CHECK-BE: @ %bb.0: 1263; CHECK-BE-NEXT: vrev64.32 q8, q2 1264; CHECK-BE-NEXT: vrev64.32 q9, q0 1265; CHECK-BE-NEXT: vshl.i32 q8, q8, #17 1266; CHECK-BE-NEXT: vrev64.32 q10, q3 1267; CHECK-BE-NEXT: vshl.i32 q9, q9, #16 1268; CHECK-BE-NEXT: vrev64.32 q11, q1 1269; CHECK-BE-NEXT: vorr q8, q8, q10 1270; CHECK-BE-NEXT: vorr q9, q9, q11 1271; CHECK-BE-NEXT: vorr q8, q9, q8 1272; CHECK-BE-NEXT: vrev64.32 q0, q8 1273; CHECK-BE-NEXT: bx lr 1274 %a.shifted = shl <4 x i32> %a, <i32 16, i32 16, i32 16, i32 16> 1275 %c.shifted = shl <4 x i32> %c, <i32 17, i32 17, i32 17, i32 17> 1276 %or.ab = or <4 x i32> %a.shifted, %b 1277 %or.cd = or <4 x i32> %c.shifted, %d 1278 %r = or <4 x i32> %or.ab, %or.cd 1279 ret <4 x i32> %r 1280} 1281 1282define arm_aapcscc i32 @test_shift15_and510(ptr nocapture %p) { 1283; CHECK-ARM-LABEL: test_shift15_and510: 1284; CHECK-ARM: @ %bb.0: @ %entry 1285; CHECK-ARM-NEXT: ldrb r0, [r0, #2] 1286; CHECK-ARM-NEXT: lsl r0, r0, #1 1287; CHECK-ARM-NEXT: bx lr 1288; 1289; CHECK-BE-LABEL: test_shift15_and510: 1290; CHECK-BE: @ %bb.0: @ %entry 1291; CHECK-BE-NEXT: ldrb r0, [r0, #1] 1292; CHECK-BE-NEXT: lsl r0, r0, #1 1293; CHECK-BE-NEXT: bx lr 1294; 1295; CHECK-THUMB-LABEL: test_shift15_and510: 1296; CHECK-THUMB: @ %bb.0: @ %entry 1297; CHECK-THUMB-NEXT: ldrb r0, [r0, #2] 1298; CHECK-THUMB-NEXT: lsls r0, r0, #1 1299; CHECK-THUMB-NEXT: bx lr 1300; 1301; CHECK-ALIGN-LABEL: test_shift15_and510: 1302; CHECK-ALIGN: @ %bb.0: @ %entry 1303; CHECK-ALIGN-NEXT: ldrb r0, [r0, #2] 1304; CHECK-ALIGN-NEXT: lsls r0, r0, #1 1305; CHECK-ALIGN-NEXT: bx lr 1306; 1307; CHECK-V6M-LABEL: test_shift15_and510: 1308; CHECK-V6M: @ %bb.0: @ %entry 1309; CHECK-V6M-NEXT: ldrb r0, [r0, #2] 1310; CHECK-V6M-NEXT: lsls r0, r0, #1 1311; CHECK-V6M-NEXT: bx lr 1312entry: 1313 %load = load i32, ptr %p, align 4 1314 %lshr = lshr i32 %load, 15 1315 %and = and i32 %lshr, 510 1316 ret i32 %and 1317} 1318 1319define arm_aapcscc i32 @test_shift22_and1020(ptr nocapture %p) { 1320; CHECK-ARM-LABEL: test_shift22_and1020: 1321; CHECK-ARM: @ %bb.0: @ %entry 1322; CHECK-ARM-NEXT: ldrb r0, [r0, #3] 1323; CHECK-ARM-NEXT: lsl r0, r0, #2 1324; CHECK-ARM-NEXT: bx lr 1325; 1326; CHECK-BE-LABEL: test_shift22_and1020: 1327; CHECK-BE: @ %bb.0: @ %entry 1328; CHECK-BE-NEXT: ldrb r0, [r0] 1329; CHECK-BE-NEXT: lsl r0, r0, #2 1330; CHECK-BE-NEXT: bx lr 1331; 1332; CHECK-THUMB-LABEL: test_shift22_and1020: 1333; CHECK-THUMB: @ %bb.0: @ %entry 1334; CHECK-THUMB-NEXT: ldrb r0, [r0, #3] 1335; CHECK-THUMB-NEXT: lsls r0, r0, #2 1336; CHECK-THUMB-NEXT: bx lr 1337; 1338; CHECK-ALIGN-LABEL: test_shift22_and1020: 1339; CHECK-ALIGN: @ %bb.0: @ %entry 1340; CHECK-ALIGN-NEXT: ldrb r0, [r0, #3] 1341; CHECK-ALIGN-NEXT: lsls r0, r0, #2 1342; CHECK-ALIGN-NEXT: bx lr 1343; 1344; CHECK-V6M-LABEL: test_shift22_and1020: 1345; CHECK-V6M: @ %bb.0: @ %entry 1346; CHECK-V6M-NEXT: ldrb r0, [r0, #3] 1347; CHECK-V6M-NEXT: lsls r0, r0, #2 1348; CHECK-V6M-NEXT: bx lr 1349entry: 1350 %load = load i32, ptr %p, align 4 1351 %lshr = lshr i32 %load, 22 1352 %and = and i32 %lshr, 1020 1353 ret i32 %and 1354} 1355 1356define arm_aapcscc i32 @test_zext_shift5_and2040(ptr nocapture %p) { 1357; CHECK-ARM-LABEL: test_zext_shift5_and2040: 1358; CHECK-ARM: @ %bb.0: @ %entry 1359; CHECK-ARM-NEXT: ldrb r0, [r0, #1] 1360; CHECK-ARM-NEXT: lsl r0, r0, #3 1361; CHECK-ARM-NEXT: bx lr 1362; 1363; CHECK-BE-LABEL: test_zext_shift5_and2040: 1364; CHECK-BE: @ %bb.0: @ %entry 1365; CHECK-BE-NEXT: ldrb r0, [r0] 1366; CHECK-BE-NEXT: lsl r0, r0, #3 1367; CHECK-BE-NEXT: bx lr 1368; 1369; CHECK-THUMB-LABEL: test_zext_shift5_and2040: 1370; CHECK-THUMB: @ %bb.0: @ %entry 1371; CHECK-THUMB-NEXT: ldrb r0, [r0, #1] 1372; CHECK-THUMB-NEXT: lsls r0, r0, #3 1373; CHECK-THUMB-NEXT: bx lr 1374; 1375; CHECK-ALIGN-LABEL: test_zext_shift5_and2040: 1376; CHECK-ALIGN: @ %bb.0: @ %entry 1377; CHECK-ALIGN-NEXT: ldrb r0, [r0, #1] 1378; CHECK-ALIGN-NEXT: lsls r0, r0, #3 1379; CHECK-ALIGN-NEXT: bx lr 1380; 1381; CHECK-V6M-LABEL: test_zext_shift5_and2040: 1382; CHECK-V6M: @ %bb.0: @ %entry 1383; CHECK-V6M-NEXT: ldrb r0, [r0, #1] 1384; CHECK-V6M-NEXT: lsls r0, r0, #3 1385; CHECK-V6M-NEXT: bx lr 1386entry: 1387 %load = load i16, ptr %p, align 2 1388 %zext = zext i16 %load to i32 1389 %lshr = lshr i32 %zext, 5 1390 %and = and i32 %lshr, 2040 1391 ret i32 %and 1392} 1393