brintos

brintos / llvm-project-archived public Read only

0
0
Text · 18.8 KiB · 604f5c1 Raw
638 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=i686-pc-linux | FileCheck %s --check-prefix=X863; RUN: llc < %s -mtriple=x86_64-pc-linux | FileCheck %s --check-prefixes=X64,X64-MASK4; RUN: llc < %s -mtriple=x86_64-pc-linux -mcpu=bdver1 | FileCheck %s --check-prefixes=X64,X64-SHIFT,X64-SHIFT25; RUN: llc < %s -mtriple=x86_64-pc-linux -mcpu=bdver2 | FileCheck %s --check-prefixes=X64,X64-SHIFT,X64-TBM6; RUN: llc < %s -mtriple=x86_64-pc-linux -mcpu=bdver3 | FileCheck %s --check-prefixes=X64,X64-SHIFT,X64-TBM7; RUN: llc < %s -mtriple=x86_64-pc-linux -mcpu=bdver4 | FileCheck %s --check-prefixes=X64,X64-SHIFT,X64-TBM8; RUN: llc < %s -mtriple=x86_64-pc-linux -mcpu=btver1 | FileCheck %s --check-prefixes=X64,X64-SHIFT,X64-SHIFT29; RUN: llc < %s -mtriple=x86_64-pc-linux -mcpu=btver2 | FileCheck %s --check-prefixes=X64,X64-SHIFT,X64-BMI,X64-BMI110; RUN: llc < %s -mtriple=x86_64-pc-linux -mcpu=znver1 | FileCheck %s --check-prefixes=X64,X64-SHIFT,X64-BMI,X64-BMI211; RUN: llc < %s -mtriple=x86_64-pc-linux -mcpu=znver2 | FileCheck %s --check-prefixes=X64,X64-SHIFT,X64-BMI,X64-BMI212; RUN: llc < %s -mtriple=x86_64-pc-linux -mattr=+fast-scalar-shift-masks | FileCheck %s --check-prefixes=X64,X64-SHIFT,X64-SHIFT213 14;15; fold (shl (lshr x, c1), c2) -> (0) (and x, MASK) or16;                                (1) (and (shl x, (sub c2, c1), MASK) or17;                                (2) (and (lshr x, (sub c1, c2), MASK)18;19 20define i8 @test_i8_shl_lshr_0(i8 %a0) {21; X86-LABEL: test_i8_shl_lshr_0:22; X86:       # %bb.0:23; X86-NEXT:    movzbl {{[0-9]+}}(%esp), %eax24; X86-NEXT:    andb $-8, %al25; X86-NEXT:    retl26;27; X64-LABEL: test_i8_shl_lshr_0:28; X64:       # %bb.0:29; X64-NEXT:    movl %edi, %eax30; X64-NEXT:    andb $-8, %al31; X64-NEXT:    # kill: def $al killed $al killed $eax32; X64-NEXT:    retq33  %1 = lshr i8 %a0, 334  %2 = shl i8 %1, 335  ret i8 %236}37 38define i8 @test_i8_shl_lshr_1(i8 %a0) {39; X86-LABEL: test_i8_shl_lshr_1:40; X86:       # %bb.0:41; X86-NEXT:    movzbl {{[0-9]+}}(%esp), %eax42; X86-NEXT:    shlb $2, %al43; X86-NEXT:    andb $-32, %al44; X86-NEXT:    retl45;46; X64-MASK-LABEL: test_i8_shl_lshr_1:47; X64-MASK:       # %bb.0:48; X64-MASK-NEXT:    # kill: def $edi killed $edi def $rdi49; X64-MASK-NEXT:    leal (,%rdi,4), %eax50; X64-MASK-NEXT:    andb $-32, %al51; X64-MASK-NEXT:    # kill: def $al killed $al killed $eax52; X64-MASK-NEXT:    retq53;54; X64-SHIFT-LABEL: test_i8_shl_lshr_1:55; X64-SHIFT:       # %bb.0:56; X64-SHIFT-NEXT:    movl %edi, %eax57; X64-SHIFT-NEXT:    shrb $3, %al58; X64-SHIFT-NEXT:    shlb $5, %al59; X64-SHIFT-NEXT:    # kill: def $al killed $al killed $eax60; X64-SHIFT-NEXT:    retq61  %1 = lshr i8 %a0, 362  %2 = shl i8 %1, 563  ret i8 %264}65 66define i8 @test_i8_shl_lshr_2(i8 %a0) {67; X86-LABEL: test_i8_shl_lshr_2:68; X86:       # %bb.0:69; X86-NEXT:    movzbl {{[0-9]+}}(%esp), %eax70; X86-NEXT:    shrb $2, %al71; X86-NEXT:    andb $56, %al72; X86-NEXT:    retl73;74; X64-MASK-LABEL: test_i8_shl_lshr_2:75; X64-MASK:       # %bb.0:76; X64-MASK-NEXT:    movl %edi, %eax77; X64-MASK-NEXT:    shrb $2, %al78; X64-MASK-NEXT:    andb $56, %al79; X64-MASK-NEXT:    # kill: def $al killed $al killed $eax80; X64-MASK-NEXT:    retq81;82; X64-SHIFT-LABEL: test_i8_shl_lshr_2:83; X64-SHIFT:       # %bb.0:84; X64-SHIFT-NEXT:    # kill: def $edi killed $edi def $rdi85; X64-SHIFT-NEXT:    shrb $5, %dil86; X64-SHIFT-NEXT:    leal (,%rdi,8), %eax87; X64-SHIFT-NEXT:    # kill: def $al killed $al killed $eax88; X64-SHIFT-NEXT:    retq89  %1 = lshr i8 %a0, 590  %2 = shl i8 %1, 391  ret i8 %292}93 94define i16 @test_i16_shl_lshr_0(i16 %a0) {95; X86-LABEL: test_i16_shl_lshr_0:96; X86:       # %bb.0:97; X86-NEXT:    movzwl {{[0-9]+}}(%esp), %eax98; X86-NEXT:    andl $-8, %eax99; X86-NEXT:    # kill: def $ax killed $ax killed $eax100; X86-NEXT:    retl101;102; X64-LABEL: test_i16_shl_lshr_0:103; X64:       # %bb.0:104; X64-NEXT:    movl %edi, %eax105; X64-NEXT:    andl $65528, %eax # imm = 0xFFF8106; X64-NEXT:    # kill: def $ax killed $ax killed $eax107; X64-NEXT:    retq108  %1 = lshr i16 %a0, 3109  %2 = shl i16 %1, 3110  ret i16 %2111}112 113define i16 @test_i16_shl_lshr_1(i16 %a0) {114; X86-LABEL: test_i16_shl_lshr_1:115; X86:       # %bb.0:116; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax117; X86-NEXT:    shll $2, %eax118; X86-NEXT:    andl $65504, %eax # imm = 0xFFE0119; X86-NEXT:    # kill: def $ax killed $ax killed $eax120; X86-NEXT:    retl121;122; X64-MASK-LABEL: test_i16_shl_lshr_1:123; X64-MASK:       # %bb.0:124; X64-MASK-NEXT:    # kill: def $edi killed $edi def $rdi125; X64-MASK-NEXT:    leal (,%rdi,4), %eax126; X64-MASK-NEXT:    andl $65504, %eax # imm = 0xFFE0127; X64-MASK-NEXT:    # kill: def $ax killed $ax killed $eax128; X64-MASK-NEXT:    retq129;130; X64-SHIFT-LABEL: test_i16_shl_lshr_1:131; X64-SHIFT:       # %bb.0:132; X64-SHIFT-NEXT:    movzwl %di, %eax133; X64-SHIFT-NEXT:    shrl $3, %eax134; X64-SHIFT-NEXT:    shll $5, %eax135; X64-SHIFT-NEXT:    # kill: def $ax killed $ax killed $eax136; X64-SHIFT-NEXT:    retq137  %1 = lshr i16 %a0, 3138  %2 = shl i16 %1, 5139  ret i16 %2140}141 142define i16 @test_i16_shl_lshr_2(i16 %a0) {143; X86-LABEL: test_i16_shl_lshr_2:144; X86:       # %bb.0:145; X86-NEXT:    movzwl {{[0-9]+}}(%esp), %eax146; X86-NEXT:    shrl $2, %eax147; X86-NEXT:    andl $-8, %eax148; X86-NEXT:    # kill: def $ax killed $ax killed $eax149; X86-NEXT:    retl150;151; X64-MASK-LABEL: test_i16_shl_lshr_2:152; X64-MASK:       # %bb.0:153; X64-MASK-NEXT:    movl %edi, %eax154; X64-MASK-NEXT:    shrl $2, %eax155; X64-MASK-NEXT:    andl $16376, %eax # imm = 0x3FF8156; X64-MASK-NEXT:    # kill: def $ax killed $ax killed $eax157; X64-MASK-NEXT:    retq158;159; X64-SHIFT-LABEL: test_i16_shl_lshr_2:160; X64-SHIFT:       # %bb.0:161; X64-SHIFT-NEXT:    movzwl %di, %eax162; X64-SHIFT-NEXT:    shrl $5, %eax163; X64-SHIFT-NEXT:    shll $3, %eax164; X64-SHIFT-NEXT:    # kill: def $ax killed $ax killed $eax165; X64-SHIFT-NEXT:    retq166  %1 = lshr i16 %a0, 5167  %2 = shl i16 %1, 3168  ret i16 %2169}170 171define i32 @test_i32_shl_lshr_0(i32 %a0) {172; X86-LABEL: test_i32_shl_lshr_0:173; X86:       # %bb.0:174; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax175; X86-NEXT:    andl $-8, %eax176; X86-NEXT:    retl177;178; X64-LABEL: test_i32_shl_lshr_0:179; X64:       # %bb.0:180; X64-NEXT:    movl %edi, %eax181; X64-NEXT:    andl $-8, %eax182; X64-NEXT:    retq183  %1 = lshr i32 %a0, 3184  %2 = shl i32 %1, 3185  ret i32 %2186}187 188define i32 @test_i32_shl_lshr_1(i32 %a0) {189; X86-LABEL: test_i32_shl_lshr_1:190; X86:       # %bb.0:191; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax192; X86-NEXT:    shll $2, %eax193; X86-NEXT:    andl $-32, %eax194; X86-NEXT:    retl195;196; X64-MASK-LABEL: test_i32_shl_lshr_1:197; X64-MASK:       # %bb.0:198; X64-MASK-NEXT:    # kill: def $edi killed $edi def $rdi199; X64-MASK-NEXT:    leal (,%rdi,4), %eax200; X64-MASK-NEXT:    andl $-32, %eax201; X64-MASK-NEXT:    retq202;203; X64-SHIFT-LABEL: test_i32_shl_lshr_1:204; X64-SHIFT:       # %bb.0:205; X64-SHIFT-NEXT:    movl %edi, %eax206; X64-SHIFT-NEXT:    shrl $3, %eax207; X64-SHIFT-NEXT:    shll $5, %eax208; X64-SHIFT-NEXT:    retq209  %1 = lshr i32 %a0, 3210  %2 = shl i32 %1, 5211  ret i32 %2212}213 214define i32 @test_i32_shl_lshr_2(i32 %a0) {215; X86-LABEL: test_i32_shl_lshr_2:216; X86:       # %bb.0:217; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax218; X86-NEXT:    shrl $2, %eax219; X86-NEXT:    andl $-8, %eax220; X86-NEXT:    retl221;222; X64-MASK-LABEL: test_i32_shl_lshr_2:223; X64-MASK:       # %bb.0:224; X64-MASK-NEXT:    movl %edi, %eax225; X64-MASK-NEXT:    shrl $2, %eax226; X64-MASK-NEXT:    andl $-8, %eax227; X64-MASK-NEXT:    retq228;229; X64-SHIFT-LABEL: test_i32_shl_lshr_2:230; X64-SHIFT:       # %bb.0:231; X64-SHIFT-NEXT:    # kill: def $edi killed $edi def $rdi232; X64-SHIFT-NEXT:    shrl $5, %edi233; X64-SHIFT-NEXT:    leal (,%rdi,8), %eax234; X64-SHIFT-NEXT:    retq235  %1 = lshr i32 %a0, 5236  %2 = shl i32 %1, 3237  ret i32 %2238}239 240define i64 @test_i64_shl_lshr_0(i64 %a0) {241; X86-LABEL: test_i64_shl_lshr_0:242; X86:       # %bb.0:243; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax244; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx245; X86-NEXT:    andl $-8, %eax246; X86-NEXT:    retl247;248; X64-LABEL: test_i64_shl_lshr_0:249; X64:       # %bb.0:250; X64-NEXT:    movq %rdi, %rax251; X64-NEXT:    andq $-8, %rax252; X64-NEXT:    retq253  %1 = lshr i64 %a0, 3254  %2 = shl i64 %1, 3255  ret i64 %2256}257 258define i64 @test_i64_shl_lshr_1(i64 %a0) {259; X86-LABEL: test_i64_shl_lshr_1:260; X86:       # %bb.0:261; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax262; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx263; X86-NEXT:    shldl $2, %eax, %edx264; X86-NEXT:    shll $2, %eax265; X86-NEXT:    andl $-32, %eax266; X86-NEXT:    retl267;268; X64-MASK-LABEL: test_i64_shl_lshr_1:269; X64-MASK:       # %bb.0:270; X64-MASK-NEXT:    leaq (,%rdi,4), %rax271; X64-MASK-NEXT:    andq $-32, %rax272; X64-MASK-NEXT:    retq273;274; X64-SHIFT-LABEL: test_i64_shl_lshr_1:275; X64-SHIFT:       # %bb.0:276; X64-SHIFT-NEXT:    movq %rdi, %rax277; X64-SHIFT-NEXT:    shrq $3, %rax278; X64-SHIFT-NEXT:    shlq $5, %rax279; X64-SHIFT-NEXT:    retq280  %1 = lshr i64 %a0, 3281  %2 = shl i64 %1, 5282  ret i64 %2283}284 285define i64 @test_i64_shl_lshr_2(i64 %a0) {286; X86-LABEL: test_i64_shl_lshr_2:287; X86:       # %bb.0:288; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax289; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx290; X86-NEXT:    shrdl $2, %edx, %eax291; X86-NEXT:    shrl $2, %edx292; X86-NEXT:    andl $-8, %eax293; X86-NEXT:    retl294;295; X64-MASK-LABEL: test_i64_shl_lshr_2:296; X64-MASK:       # %bb.0:297; X64-MASK-NEXT:    movq %rdi, %rax298; X64-MASK-NEXT:    shrq $2, %rax299; X64-MASK-NEXT:    andq $-8, %rax300; X64-MASK-NEXT:    retq301;302; X64-SHIFT-LABEL: test_i64_shl_lshr_2:303; X64-SHIFT:       # %bb.0:304; X64-SHIFT-NEXT:    shrq $5, %rdi305; X64-SHIFT-NEXT:    leaq (,%rdi,8), %rax306; X64-SHIFT-NEXT:    retq307  %1 = lshr i64 %a0, 5308  %2 = shl i64 %1, 3309  ret i64 %2310}311 312;313; fold (lshr (shl x, c1), c2) -> (0) (and x, MASK) or314;                                (1) (and (shl x, (sub c1, c2), MASK) or315;                                (2) (and (lshr x, (sub c2, c1), MASK)316;317 318define i8 @test_i8_lshr_lshr_0(i8 %a0) {319; X86-LABEL: test_i8_lshr_lshr_0:320; X86:       # %bb.0:321; X86-NEXT:    movzbl {{[0-9]+}}(%esp), %eax322; X86-NEXT:    andb $31, %al323; X86-NEXT:    retl324;325; X64-LABEL: test_i8_lshr_lshr_0:326; X64:       # %bb.0:327; X64-NEXT:    movl %edi, %eax328; X64-NEXT:    andb $31, %al329; X64-NEXT:    # kill: def $al killed $al killed $eax330; X64-NEXT:    retq331  %1 = shl i8 %a0, 3332  %2 = lshr i8 %1, 3333  ret i8 %2334}335 336define i8 @test_i8_lshr_lshr_1(i8 %a0) {337; X86-LABEL: test_i8_lshr_lshr_1:338; X86:       # %bb.0:339; X86-NEXT:    movzbl {{[0-9]+}}(%esp), %eax340; X86-NEXT:    shrb $2, %al341; X86-NEXT:    andb $7, %al342; X86-NEXT:    retl343;344; X64-MASK-LABEL: test_i8_lshr_lshr_1:345; X64-MASK:       # %bb.0:346; X64-MASK-NEXT:    movl %edi, %eax347; X64-MASK-NEXT:    shrb $2, %al348; X64-MASK-NEXT:    andb $7, %al349; X64-MASK-NEXT:    # kill: def $al killed $al killed $eax350; X64-MASK-NEXT:    retq351;352; X64-SHIFT-LABEL: test_i8_lshr_lshr_1:353; X64-SHIFT:       # %bb.0:354; X64-SHIFT-NEXT:    # kill: def $edi killed $edi def $rdi355; X64-SHIFT-NEXT:    leal (,%rdi,8), %eax356; X64-SHIFT-NEXT:    shrb $5, %al357; X64-SHIFT-NEXT:    # kill: def $al killed $al killed $eax358; X64-SHIFT-NEXT:    retq359  %1 = shl i8 %a0, 3360  %2 = lshr i8 %1, 5361  ret i8 %2362}363 364define i8 @test_i8_lshr_lshr_2(i8 %a0) {365; X86-LABEL: test_i8_lshr_lshr_2:366; X86:       # %bb.0:367; X86-NEXT:    movzbl {{[0-9]+}}(%esp), %eax368; X86-NEXT:    shlb $2, %al369; X86-NEXT:    andb $28, %al370; X86-NEXT:    retl371;372; X64-MASK-LABEL: test_i8_lshr_lshr_2:373; X64-MASK:       # %bb.0:374; X64-MASK-NEXT:    # kill: def $edi killed $edi def $rdi375; X64-MASK-NEXT:    leal (,%rdi,4), %eax376; X64-MASK-NEXT:    andb $28, %al377; X64-MASK-NEXT:    # kill: def $al killed $al killed $eax378; X64-MASK-NEXT:    retq379;380; X64-SHIFT-LABEL: test_i8_lshr_lshr_2:381; X64-SHIFT:       # %bb.0:382; X64-SHIFT-NEXT:    movl %edi, %eax383; X64-SHIFT-NEXT:    shlb $5, %al384; X64-SHIFT-NEXT:    shrb $3, %al385; X64-SHIFT-NEXT:    # kill: def $al killed $al killed $eax386; X64-SHIFT-NEXT:    retq387  %1 = shl i8 %a0, 5388  %2 = lshr i8 %1, 3389  ret i8 %2390}391 392define i16 @test_i16_lshr_lshr_0(i16 %a0) {393; X86-LABEL: test_i16_lshr_lshr_0:394; X86:       # %bb.0:395; X86-NEXT:    movzwl {{[0-9]+}}(%esp), %eax396; X86-NEXT:    andl $8191, %eax # imm = 0x1FFF397; X86-NEXT:    # kill: def $ax killed $ax killed $eax398; X86-NEXT:    retl399;400; X64-LABEL: test_i16_lshr_lshr_0:401; X64:       # %bb.0:402; X64-NEXT:    movl %edi, %eax403; X64-NEXT:    andl $8191, %eax # imm = 0x1FFF404; X64-NEXT:    # kill: def $ax killed $ax killed $eax405; X64-NEXT:    retq406  %1 = shl i16 %a0, 3407  %2 = lshr i16 %1, 3408  ret i16 %2409}410 411define i16 @test_i16_lshr_lshr_1(i16 %a0) {412; X86-LABEL: test_i16_lshr_lshr_1:413; X86:       # %bb.0:414; X86-NEXT:    movzwl {{[0-9]+}}(%esp), %eax415; X86-NEXT:    shrl $2, %eax416; X86-NEXT:    andl $2047, %eax # imm = 0x7FF417; X86-NEXT:    # kill: def $ax killed $ax killed $eax418; X86-NEXT:    retl419;420; X64-MASK-LABEL: test_i16_lshr_lshr_1:421; X64-MASK:       # %bb.0:422; X64-MASK-NEXT:    movl %edi, %eax423; X64-MASK-NEXT:    shrl $2, %eax424; X64-MASK-NEXT:    andl $2047, %eax # imm = 0x7FF425; X64-MASK-NEXT:    # kill: def $ax killed $ax killed $eax426; X64-MASK-NEXT:    retq427;428; X64-SHIFT2-LABEL: test_i16_lshr_lshr_1:429; X64-SHIFT2:       # %bb.0:430; X64-SHIFT2-NEXT:    movl %edi, %eax431; X64-SHIFT2-NEXT:    shrl $2, %eax432; X64-SHIFT2-NEXT:    andl $2047, %eax # imm = 0x7FF433; X64-SHIFT2-NEXT:    # kill: def $ax killed $ax killed $eax434; X64-SHIFT2-NEXT:    retq435;436; X64-TBM-LABEL: test_i16_lshr_lshr_1:437; X64-TBM:       # %bb.0:438; X64-TBM-NEXT:    bextrl $2818, %edi, %eax # imm = 0xB02439; X64-TBM-NEXT:    # kill: def $ax killed $ax killed $eax440; X64-TBM-NEXT:    retq441;442; X64-BMI-LABEL: test_i16_lshr_lshr_1:443; X64-BMI:       # %bb.0:444; X64-BMI-NEXT:    movl $2818, %eax # imm = 0xB02445; X64-BMI-NEXT:    bextrl %eax, %edi, %eax446; X64-BMI-NEXT:    # kill: def $ax killed $ax killed $eax447; X64-BMI-NEXT:    retq448  %1 = shl i16 %a0, 3449  %2 = lshr i16 %1, 5450  ret i16 %2451}452 453define i16 @test_i16_lshr_lshr_2(i16 %a0) {454; X86-LABEL: test_i16_lshr_lshr_2:455; X86:       # %bb.0:456; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax457; X86-NEXT:    shll $2, %eax458; X86-NEXT:    andl $8188, %eax # imm = 0x1FFC459; X86-NEXT:    # kill: def $ax killed $ax killed $eax460; X86-NEXT:    retl461;462; X64-LABEL: test_i16_lshr_lshr_2:463; X64:       # %bb.0:464; X64-NEXT:    # kill: def $edi killed $edi def $rdi465; X64-NEXT:    leal (,%rdi,4), %eax466; X64-NEXT:    andl $8188, %eax # imm = 0x1FFC467; X64-NEXT:    # kill: def $ax killed $ax killed $eax468; X64-NEXT:    retq469  %1 = shl i16 %a0, 5470  %2 = lshr i16 %1, 3471  ret i16 %2472}473 474define i32 @test_i32_lshr_lshr_0(i32 %a0) {475; X86-LABEL: test_i32_lshr_lshr_0:476; X86:       # %bb.0:477; X86-NEXT:    movl $536870911, %eax # imm = 0x1FFFFFFF478; X86-NEXT:    andl {{[0-9]+}}(%esp), %eax479; X86-NEXT:    retl480;481; X64-LABEL: test_i32_lshr_lshr_0:482; X64:       # %bb.0:483; X64-NEXT:    movl %edi, %eax484; X64-NEXT:    andl $536870911, %eax # imm = 0x1FFFFFFF485; X64-NEXT:    retq486  %1 = shl i32 %a0, 3487  %2 = lshr i32 %1, 3488  ret i32 %2489}490 491define i32 @test_i32_lshr_lshr_1(i32 %a0) {492; X86-LABEL: test_i32_lshr_lshr_1:493; X86:       # %bb.0:494; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax495; X86-NEXT:    shrl $2, %eax496; X86-NEXT:    andl $134217727, %eax # imm = 0x7FFFFFF497; X86-NEXT:    retl498;499; X64-MASK-LABEL: test_i32_lshr_lshr_1:500; X64-MASK:       # %bb.0:501; X64-MASK-NEXT:    movl %edi, %eax502; X64-MASK-NEXT:    shrl $2, %eax503; X64-MASK-NEXT:    andl $134217727, %eax # imm = 0x7FFFFFF504; X64-MASK-NEXT:    retq505;506; X64-SHIFT-LABEL: test_i32_lshr_lshr_1:507; X64-SHIFT:       # %bb.0:508; X64-SHIFT-NEXT:    # kill: def $edi killed $edi def $rdi509; X64-SHIFT-NEXT:    leal (,%rdi,8), %eax510; X64-SHIFT-NEXT:    shrl $5, %eax511; X64-SHIFT-NEXT:    retq512  %1 = shl i32 %a0, 3513  %2 = lshr i32 %1, 5514  ret i32 %2515}516 517define i32 @test_i32_lshr_lshr_2(i32 %a0) {518; X86-LABEL: test_i32_lshr_lshr_2:519; X86:       # %bb.0:520; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax521; X86-NEXT:    shll $2, %eax522; X86-NEXT:    andl $536870908, %eax # imm = 0x1FFFFFFC523; X86-NEXT:    retl524;525; X64-MASK-LABEL: test_i32_lshr_lshr_2:526; X64-MASK:       # %bb.0:527; X64-MASK-NEXT:    # kill: def $edi killed $edi def $rdi528; X64-MASK-NEXT:    leal (,%rdi,4), %eax529; X64-MASK-NEXT:    andl $536870908, %eax # imm = 0x1FFFFFFC530; X64-MASK-NEXT:    retq531;532; X64-SHIFT-LABEL: test_i32_lshr_lshr_2:533; X64-SHIFT:       # %bb.0:534; X64-SHIFT-NEXT:    movl %edi, %eax535; X64-SHIFT-NEXT:    shll $5, %eax536; X64-SHIFT-NEXT:    shrl $3, %eax537; X64-SHIFT-NEXT:    retq538  %1 = shl i32 %a0, 5539  %2 = lshr i32 %1, 3540  ret i32 %2541}542 543define i64 @test_i64_lshr_lshr_0(i64 %a0) {544; X86-LABEL: test_i64_lshr_lshr_0:545; X86:       # %bb.0:546; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax547; X86-NEXT:    movl $536870911, %edx # imm = 0x1FFFFFFF548; X86-NEXT:    andl {{[0-9]+}}(%esp), %edx549; X86-NEXT:    retl550;551; X64-MASK-LABEL: test_i64_lshr_lshr_0:552; X64-MASK:       # %bb.0:553; X64-MASK-NEXT:    movabsq $2305843009213693951, %rax # imm = 0x1FFFFFFFFFFFFFFF554; X64-MASK-NEXT:    andq %rdi, %rax555; X64-MASK-NEXT:    retq556;557; X64-SHIFT2-LABEL: test_i64_lshr_lshr_0:558; X64-SHIFT2:       # %bb.0:559; X64-SHIFT2-NEXT:    movabsq $2305843009213693951, %rax # imm = 0x1FFFFFFFFFFFFFFF560; X64-SHIFT2-NEXT:    andq %rdi, %rax561; X64-SHIFT2-NEXT:    retq562;563; X64-TBM-LABEL: test_i64_lshr_lshr_0:564; X64-TBM:       # %bb.0:565; X64-TBM-NEXT:    bextrq $15616, %rdi, %rax # imm = 0x3D00566; X64-TBM-NEXT:    retq567;568; X64-BMI1-LABEL: test_i64_lshr_lshr_0:569; X64-BMI1:       # %bb.0:570; X64-BMI1-NEXT:    movl $15616, %eax # imm = 0x3D00571; X64-BMI1-NEXT:    bextrq %rax, %rdi, %rax572; X64-BMI1-NEXT:    retq573;574; X64-BMI2-LABEL: test_i64_lshr_lshr_0:575; X64-BMI2:       # %bb.0:576; X64-BMI2-NEXT:    movb $61, %al577; X64-BMI2-NEXT:    bzhiq %rax, %rdi, %rax578; X64-BMI2-NEXT:    retq579  %1 = shl i64 %a0, 3580  %2 = lshr i64 %1, 3581  ret i64 %2582}583 584define i64 @test_i64_lshr_lshr_1(i64 %a0) {585; X86-LABEL: test_i64_lshr_lshr_1:586; X86:       # %bb.0:587; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax588; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx589; X86-NEXT:    shrdl $2, %edx, %eax590; X86-NEXT:    shrl $2, %edx591; X86-NEXT:    andl $134217727, %edx # imm = 0x7FFFFFF592; X86-NEXT:    retl593;594; X64-MASK-LABEL: test_i64_lshr_lshr_1:595; X64-MASK:       # %bb.0:596; X64-MASK-NEXT:    shrq $2, %rdi597; X64-MASK-NEXT:    movabsq $576460752303423487, %rax # imm = 0x7FFFFFFFFFFFFFF598; X64-MASK-NEXT:    andq %rdi, %rax599; X64-MASK-NEXT:    retq600;601; X64-SHIFT-LABEL: test_i64_lshr_lshr_1:602; X64-SHIFT:       # %bb.0:603; X64-SHIFT-NEXT:    leaq (,%rdi,8), %rax604; X64-SHIFT-NEXT:    shrq $5, %rax605; X64-SHIFT-NEXT:    retq606  %1 = shl i64 %a0, 3607  %2 = lshr i64 %1, 5608  ret i64 %2609}610 611define i64 @test_i64_lshr_lshr_2(i64 %a0) {612; X86-LABEL: test_i64_lshr_lshr_2:613; X86:       # %bb.0:614; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax615; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx616; X86-NEXT:    shldl $2, %eax, %edx617; X86-NEXT:    shll $2, %eax618; X86-NEXT:    andl $536870911, %edx # imm = 0x1FFFFFFF619; X86-NEXT:    retl620;621; X64-MASK-LABEL: test_i64_lshr_lshr_2:622; X64-MASK:       # %bb.0:623; X64-MASK-NEXT:    leaq (,%rdi,4), %rcx624; X64-MASK-NEXT:    movabsq $2305843009213693948, %rax # imm = 0x1FFFFFFFFFFFFFFC625; X64-MASK-NEXT:    andq %rcx, %rax626; X64-MASK-NEXT:    retq627;628; X64-SHIFT-LABEL: test_i64_lshr_lshr_2:629; X64-SHIFT:       # %bb.0:630; X64-SHIFT-NEXT:    movq %rdi, %rax631; X64-SHIFT-NEXT:    shlq $5, %rax632; X64-SHIFT-NEXT:    shrq $3, %rax633; X64-SHIFT-NEXT:    retq634  %1 = shl i64 %a0, 5635  %2 = lshr i64 %1, 3636  ret i64 %2637}638