brintos

brintos / llvm-project-archived public Read only

0
0
Text · 288.8 KiB · 90e075b Raw
8641 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=i686-unknown-linux-gnu -mattr=-bmi,-tbm,-bmi2,+fast-bextr < %s | FileCheck %s --check-prefixes=X86,X86-NOBMI3; RUN: llc -mtriple=i686-unknown-linux-gnu -mattr=+bmi,-tbm,-bmi2,+fast-bextr < %s | FileCheck %s --check-prefixes=X86,X86-BMINOTBM,X86-BMI14; RUN: llc -mtriple=i686-unknown-linux-gnu -mattr=+bmi,+tbm,-bmi2,+fast-bextr < %s | FileCheck %s --check-prefixes=X86,X86-BMITBM,X86-BMI15; RUN: llc -mtriple=i686-unknown-linux-gnu -mattr=+bmi,+tbm,+bmi2,+fast-bextr < %s | FileCheck %s --check-prefixes=X86,X86-BMITBM,X86-BMI26; RUN: llc -mtriple=i686-unknown-linux-gnu -mattr=+bmi,-tbm,+bmi2,+fast-bextr < %s | FileCheck %s --check-prefixes=X86,X86-BMINOTBM,X86-BMI27; RUN: llc -mtriple=x86_64-unknown-linux-gnu -mattr=-bmi,-tbm,-bmi2,+fast-bextr < %s | FileCheck %s --check-prefixes=X64,X64-NOBMI8; RUN: llc -mtriple=x86_64-unknown-linux-gnu -mattr=+bmi,-tbm,-bmi2,+fast-bextr < %s | FileCheck %s --check-prefixes=X64,X64-BMINOTBM,X64-BMI19; RUN: llc -mtriple=x86_64-unknown-linux-gnu -mattr=+bmi,+tbm,-bmi2,+fast-bextr < %s | FileCheck %s --check-prefixes=X64,X64-BMITBM,X64-BMI110; RUN: llc -mtriple=x86_64-unknown-linux-gnu -mattr=+bmi,+tbm,+bmi2,+fast-bextr < %s | FileCheck %s --check-prefixes=X64,X64-BMITBM,X64-BMI211; RUN: llc -mtriple=x86_64-unknown-linux-gnu -mattr=+bmi,-tbm,+bmi2,+fast-bextr < %s | FileCheck %s --check-prefixes=X64,X64-BMINOTBM,X64-BMI212 13; *Please* keep in sync with test/CodeGen/AArch64/extract-bits.ll14 15; https://bugs.llvm.org/show_bug.cgi?id=3641916; https://bugs.llvm.org/show_bug.cgi?id=3760317; https://bugs.llvm.org/show_bug.cgi?id=3761018 19; Patterns:20;   a) (x >> start) &  (1 << nbits) - 121;   b) (x >> start) & ~(-1 << nbits)22;   c) (x >> start) &  (-1 >> (32 - y))23;   d) (x >> start) << (32 - y) >> (32 - y)24; are equivalent.25 26declare void @use32(i32)27declare void @use64(i64)28 29; ---------------------------------------------------------------------------- ;30; Pattern a. 32-bit31; ---------------------------------------------------------------------------- ;32 33define i32 @bextr32_a0(i32 %val, i32 %numskipbits, i32 %numlowbits) nounwind {34; X86-NOBMI-LABEL: bextr32_a0:35; X86-NOBMI:       # %bb.0:36; X86-NOBMI-NEXT:    pushl %esi37; X86-NOBMI-NEXT:    movzbl {{[0-9]+}}(%esp), %edx38; X86-NOBMI-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx39; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %esi40; X86-NOBMI-NEXT:    shrl %cl, %esi41; X86-NOBMI-NEXT:    movl $1, %eax42; X86-NOBMI-NEXT:    movl %edx, %ecx43; X86-NOBMI-NEXT:    shll %cl, %eax44; X86-NOBMI-NEXT:    decl %eax45; X86-NOBMI-NEXT:    andl %esi, %eax46; X86-NOBMI-NEXT:    popl %esi47; X86-NOBMI-NEXT:    retl48;49; X86-BMI1-LABEL: bextr32_a0:50; X86-BMI1:       # %bb.0:51; X86-BMI1-NEXT:    movzbl {{[0-9]+}}(%esp), %eax52; X86-BMI1-NEXT:    shll $8, %eax53; X86-BMI1-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx54; X86-BMI1-NEXT:    orl %eax, %ecx55; X86-BMI1-NEXT:    bextrl %ecx, {{[0-9]+}}(%esp), %eax56; X86-BMI1-NEXT:    retl57;58; X86-BMI2-LABEL: bextr32_a0:59; X86-BMI2:       # %bb.0:60; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %eax61; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx62; X86-BMI2-NEXT:    shrxl %ecx, {{[0-9]+}}(%esp), %ecx63; X86-BMI2-NEXT:    bzhil %eax, %ecx, %eax64; X86-BMI2-NEXT:    retl65;66; X64-NOBMI-LABEL: bextr32_a0:67; X64-NOBMI:       # %bb.0:68; X64-NOBMI-NEXT:    movl %esi, %ecx69; X64-NOBMI-NEXT:    # kill: def $cl killed $cl killed $ecx70; X64-NOBMI-NEXT:    shrl %cl, %edi71; X64-NOBMI-NEXT:    movl $1, %eax72; X64-NOBMI-NEXT:    movl %edx, %ecx73; X64-NOBMI-NEXT:    shll %cl, %eax74; X64-NOBMI-NEXT:    decl %eax75; X64-NOBMI-NEXT:    andl %edi, %eax76; X64-NOBMI-NEXT:    retq77;78; X64-BMI1-LABEL: bextr32_a0:79; X64-BMI1:       # %bb.0:80; X64-BMI1-NEXT:    shll $8, %edx81; X64-BMI1-NEXT:    movzbl %sil, %eax82; X64-BMI1-NEXT:    orl %edx, %eax83; X64-BMI1-NEXT:    bextrl %eax, %edi, %eax84; X64-BMI1-NEXT:    retq85;86; X64-BMI2-LABEL: bextr32_a0:87; X64-BMI2:       # %bb.0:88; X64-BMI2-NEXT:    shrxl %esi, %edi, %eax89; X64-BMI2-NEXT:    bzhil %edx, %eax, %eax90; X64-BMI2-NEXT:    retq91  %shifted = lshr i32 %val, %numskipbits92  %onebit = shl i32 1, %numlowbits93  %mask = add nsw i32 %onebit, -194  %masked = and i32 %mask, %shifted95  ret i32 %masked96}97 98define i32 @bextr32_a0_arithmetic(i32 %val, i32 %numskipbits, i32 %numlowbits) nounwind {99; X86-NOBMI-LABEL: bextr32_a0_arithmetic:100; X86-NOBMI:       # %bb.0:101; X86-NOBMI-NEXT:    pushl %esi102; X86-NOBMI-NEXT:    movzbl {{[0-9]+}}(%esp), %edx103; X86-NOBMI-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx104; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %esi105; X86-NOBMI-NEXT:    sarl %cl, %esi106; X86-NOBMI-NEXT:    movl $1, %eax107; X86-NOBMI-NEXT:    movl %edx, %ecx108; X86-NOBMI-NEXT:    shll %cl, %eax109; X86-NOBMI-NEXT:    decl %eax110; X86-NOBMI-NEXT:    andl %esi, %eax111; X86-NOBMI-NEXT:    popl %esi112; X86-NOBMI-NEXT:    retl113;114; X86-BMI1-LABEL: bextr32_a0_arithmetic:115; X86-BMI1:       # %bb.0:116; X86-BMI1-NEXT:    movzbl {{[0-9]+}}(%esp), %eax117; X86-BMI1-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx118; X86-BMI1-NEXT:    movl {{[0-9]+}}(%esp), %edx119; X86-BMI1-NEXT:    sarl %cl, %edx120; X86-BMI1-NEXT:    shll $8, %eax121; X86-BMI1-NEXT:    bextrl %eax, %edx, %eax122; X86-BMI1-NEXT:    retl123;124; X86-BMI2-LABEL: bextr32_a0_arithmetic:125; X86-BMI2:       # %bb.0:126; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %eax127; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx128; X86-BMI2-NEXT:    sarxl %ecx, {{[0-9]+}}(%esp), %ecx129; X86-BMI2-NEXT:    bzhil %eax, %ecx, %eax130; X86-BMI2-NEXT:    retl131;132; X64-NOBMI-LABEL: bextr32_a0_arithmetic:133; X64-NOBMI:       # %bb.0:134; X64-NOBMI-NEXT:    movl %esi, %ecx135; X64-NOBMI-NEXT:    # kill: def $cl killed $cl killed $ecx136; X64-NOBMI-NEXT:    sarl %cl, %edi137; X64-NOBMI-NEXT:    movl $1, %eax138; X64-NOBMI-NEXT:    movl %edx, %ecx139; X64-NOBMI-NEXT:    shll %cl, %eax140; X64-NOBMI-NEXT:    decl %eax141; X64-NOBMI-NEXT:    andl %edi, %eax142; X64-NOBMI-NEXT:    retq143;144; X64-BMI1-LABEL: bextr32_a0_arithmetic:145; X64-BMI1:       # %bb.0:146; X64-BMI1-NEXT:    movl %esi, %ecx147; X64-BMI1-NEXT:    # kill: def $cl killed $cl killed $ecx148; X64-BMI1-NEXT:    sarl %cl, %edi149; X64-BMI1-NEXT:    shll $8, %edx150; X64-BMI1-NEXT:    bextrl %edx, %edi, %eax151; X64-BMI1-NEXT:    retq152;153; X64-BMI2-LABEL: bextr32_a0_arithmetic:154; X64-BMI2:       # %bb.0:155; X64-BMI2-NEXT:    sarxl %esi, %edi, %eax156; X64-BMI2-NEXT:    bzhil %edx, %eax, %eax157; X64-BMI2-NEXT:    retq158  %shifted = ashr i32 %val, %numskipbits159  %onebit = shl i32 1, %numlowbits160  %mask = add nsw i32 %onebit, -1161  %masked = and i32 %mask, %shifted162  ret i32 %masked163}164 165define i32 @bextr32_a1_indexzext(i32 %val, i8 zeroext %numskipbits, i8 zeroext %numlowbits) nounwind {166; X86-NOBMI-LABEL: bextr32_a1_indexzext:167; X86-NOBMI:       # %bb.0:168; X86-NOBMI-NEXT:    pushl %esi169; X86-NOBMI-NEXT:    movzbl {{[0-9]+}}(%esp), %edx170; X86-NOBMI-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx171; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %esi172; X86-NOBMI-NEXT:    shrl %cl, %esi173; X86-NOBMI-NEXT:    movl $1, %eax174; X86-NOBMI-NEXT:    movl %edx, %ecx175; X86-NOBMI-NEXT:    shll %cl, %eax176; X86-NOBMI-NEXT:    decl %eax177; X86-NOBMI-NEXT:    andl %esi, %eax178; X86-NOBMI-NEXT:    popl %esi179; X86-NOBMI-NEXT:    retl180;181; X86-BMI1-LABEL: bextr32_a1_indexzext:182; X86-BMI1:       # %bb.0:183; X86-BMI1-NEXT:    movzbl {{[0-9]+}}(%esp), %eax184; X86-BMI1-NEXT:    shll $8, %eax185; X86-BMI1-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx186; X86-BMI1-NEXT:    orl %eax, %ecx187; X86-BMI1-NEXT:    bextrl %ecx, {{[0-9]+}}(%esp), %eax188; X86-BMI1-NEXT:    retl189;190; X86-BMI2-LABEL: bextr32_a1_indexzext:191; X86-BMI2:       # %bb.0:192; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %eax193; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx194; X86-BMI2-NEXT:    shrxl %ecx, {{[0-9]+}}(%esp), %ecx195; X86-BMI2-NEXT:    bzhil %eax, %ecx, %eax196; X86-BMI2-NEXT:    retl197;198; X64-NOBMI-LABEL: bextr32_a1_indexzext:199; X64-NOBMI:       # %bb.0:200; X64-NOBMI-NEXT:    movl %esi, %ecx201; X64-NOBMI-NEXT:    # kill: def $cl killed $cl killed $ecx202; X64-NOBMI-NEXT:    shrl %cl, %edi203; X64-NOBMI-NEXT:    movl $1, %eax204; X64-NOBMI-NEXT:    movl %edx, %ecx205; X64-NOBMI-NEXT:    shll %cl, %eax206; X64-NOBMI-NEXT:    decl %eax207; X64-NOBMI-NEXT:    andl %edi, %eax208; X64-NOBMI-NEXT:    retq209;210; X64-BMI1-LABEL: bextr32_a1_indexzext:211; X64-BMI1:       # %bb.0:212; X64-BMI1-NEXT:    shll $8, %edx213; X64-BMI1-NEXT:    orl %esi, %edx214; X64-BMI1-NEXT:    bextrl %edx, %edi, %eax215; X64-BMI1-NEXT:    retq216;217; X64-BMI2-LABEL: bextr32_a1_indexzext:218; X64-BMI2:       # %bb.0:219; X64-BMI2-NEXT:    shrxl %esi, %edi, %eax220; X64-BMI2-NEXT:    bzhil %edx, %eax, %eax221; X64-BMI2-NEXT:    retq222  %skip = zext i8 %numskipbits to i32223  %shifted = lshr i32 %val, %skip224  %conv = zext i8 %numlowbits to i32225  %onebit = shl i32 1, %conv226  %mask = add nsw i32 %onebit, -1227  %masked = and i32 %mask, %shifted228  ret i32 %masked229}230 231define i32 @bextr32_a2_load(ptr %w, i32 %numskipbits, i32 %numlowbits) nounwind {232; X86-NOBMI-LABEL: bextr32_a2_load:233; X86-NOBMI:       # %bb.0:234; X86-NOBMI-NEXT:    pushl %esi235; X86-NOBMI-NEXT:    movzbl {{[0-9]+}}(%esp), %edx236; X86-NOBMI-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx237; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %eax238; X86-NOBMI-NEXT:    movl (%eax), %esi239; X86-NOBMI-NEXT:    shrl %cl, %esi240; X86-NOBMI-NEXT:    movl $1, %eax241; X86-NOBMI-NEXT:    movl %edx, %ecx242; X86-NOBMI-NEXT:    shll %cl, %eax243; X86-NOBMI-NEXT:    decl %eax244; X86-NOBMI-NEXT:    andl %esi, %eax245; X86-NOBMI-NEXT:    popl %esi246; X86-NOBMI-NEXT:    retl247;248; X86-BMI1-LABEL: bextr32_a2_load:249; X86-BMI1:       # %bb.0:250; X86-BMI1-NEXT:    movl {{[0-9]+}}(%esp), %eax251; X86-BMI1-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx252; X86-BMI1-NEXT:    shll $8, %ecx253; X86-BMI1-NEXT:    movzbl {{[0-9]+}}(%esp), %edx254; X86-BMI1-NEXT:    orl %ecx, %edx255; X86-BMI1-NEXT:    bextrl %edx, (%eax), %eax256; X86-BMI1-NEXT:    retl257;258; X86-BMI2-LABEL: bextr32_a2_load:259; X86-BMI2:       # %bb.0:260; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %eax261; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %ecx262; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %edx263; X86-BMI2-NEXT:    shrxl %edx, (%ecx), %ecx264; X86-BMI2-NEXT:    bzhil %eax, %ecx, %eax265; X86-BMI2-NEXT:    retl266;267; X64-NOBMI-LABEL: bextr32_a2_load:268; X64-NOBMI:       # %bb.0:269; X64-NOBMI-NEXT:    movl %esi, %ecx270; X64-NOBMI-NEXT:    movl (%rdi), %esi271; X64-NOBMI-NEXT:    # kill: def $cl killed $cl killed $ecx272; X64-NOBMI-NEXT:    shrl %cl, %esi273; X64-NOBMI-NEXT:    movl $1, %eax274; X64-NOBMI-NEXT:    movl %edx, %ecx275; X64-NOBMI-NEXT:    shll %cl, %eax276; X64-NOBMI-NEXT:    decl %eax277; X64-NOBMI-NEXT:    andl %esi, %eax278; X64-NOBMI-NEXT:    retq279;280; X64-BMI1-LABEL: bextr32_a2_load:281; X64-BMI1:       # %bb.0:282; X64-BMI1-NEXT:    shll $8, %edx283; X64-BMI1-NEXT:    movzbl %sil, %eax284; X64-BMI1-NEXT:    orl %edx, %eax285; X64-BMI1-NEXT:    bextrl %eax, (%rdi), %eax286; X64-BMI1-NEXT:    retq287;288; X64-BMI2-LABEL: bextr32_a2_load:289; X64-BMI2:       # %bb.0:290; X64-BMI2-NEXT:    shrxl %esi, (%rdi), %eax291; X64-BMI2-NEXT:    bzhil %edx, %eax, %eax292; X64-BMI2-NEXT:    retq293  %val = load i32, ptr %w294  %shifted = lshr i32 %val, %numskipbits295  %onebit = shl i32 1, %numlowbits296  %mask = add nsw i32 %onebit, -1297  %masked = and i32 %mask, %shifted298  ret i32 %masked299}300 301define i32 @bextr32_a3_load_indexzext(ptr %w, i8 zeroext %numskipbits, i8 zeroext %numlowbits) nounwind {302; X86-NOBMI-LABEL: bextr32_a3_load_indexzext:303; X86-NOBMI:       # %bb.0:304; X86-NOBMI-NEXT:    pushl %esi305; X86-NOBMI-NEXT:    movzbl {{[0-9]+}}(%esp), %edx306; X86-NOBMI-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx307; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %eax308; X86-NOBMI-NEXT:    movl (%eax), %esi309; X86-NOBMI-NEXT:    shrl %cl, %esi310; X86-NOBMI-NEXT:    movl $1, %eax311; X86-NOBMI-NEXT:    movl %edx, %ecx312; X86-NOBMI-NEXT:    shll %cl, %eax313; X86-NOBMI-NEXT:    decl %eax314; X86-NOBMI-NEXT:    andl %esi, %eax315; X86-NOBMI-NEXT:    popl %esi316; X86-NOBMI-NEXT:    retl317;318; X86-BMI1-LABEL: bextr32_a3_load_indexzext:319; X86-BMI1:       # %bb.0:320; X86-BMI1-NEXT:    movl {{[0-9]+}}(%esp), %eax321; X86-BMI1-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx322; X86-BMI1-NEXT:    shll $8, %ecx323; X86-BMI1-NEXT:    movzbl {{[0-9]+}}(%esp), %edx324; X86-BMI1-NEXT:    orl %ecx, %edx325; X86-BMI1-NEXT:    bextrl %edx, (%eax), %eax326; X86-BMI1-NEXT:    retl327;328; X86-BMI2-LABEL: bextr32_a3_load_indexzext:329; X86-BMI2:       # %bb.0:330; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %eax331; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %ecx332; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %edx333; X86-BMI2-NEXT:    shrxl %edx, (%ecx), %ecx334; X86-BMI2-NEXT:    bzhil %eax, %ecx, %eax335; X86-BMI2-NEXT:    retl336;337; X64-NOBMI-LABEL: bextr32_a3_load_indexzext:338; X64-NOBMI:       # %bb.0:339; X64-NOBMI-NEXT:    movl %esi, %ecx340; X64-NOBMI-NEXT:    movl (%rdi), %esi341; X64-NOBMI-NEXT:    # kill: def $cl killed $cl killed $ecx342; X64-NOBMI-NEXT:    shrl %cl, %esi343; X64-NOBMI-NEXT:    movl $1, %eax344; X64-NOBMI-NEXT:    movl %edx, %ecx345; X64-NOBMI-NEXT:    shll %cl, %eax346; X64-NOBMI-NEXT:    decl %eax347; X64-NOBMI-NEXT:    andl %esi, %eax348; X64-NOBMI-NEXT:    retq349;350; X64-BMI1-LABEL: bextr32_a3_load_indexzext:351; X64-BMI1:       # %bb.0:352; X64-BMI1-NEXT:    shll $8, %edx353; X64-BMI1-NEXT:    orl %esi, %edx354; X64-BMI1-NEXT:    bextrl %edx, (%rdi), %eax355; X64-BMI1-NEXT:    retq356;357; X64-BMI2-LABEL: bextr32_a3_load_indexzext:358; X64-BMI2:       # %bb.0:359; X64-BMI2-NEXT:    shrxl %esi, (%rdi), %eax360; X64-BMI2-NEXT:    bzhil %edx, %eax, %eax361; X64-BMI2-NEXT:    retq362  %val = load i32, ptr %w363  %skip = zext i8 %numskipbits to i32364  %shifted = lshr i32 %val, %skip365  %conv = zext i8 %numlowbits to i32366  %onebit = shl i32 1, %conv367  %mask = add nsw i32 %onebit, -1368  %masked = and i32 %mask, %shifted369  ret i32 %masked370}371 372define i32 @bextr32_a4_commutative(i32 %val, i32 %numskipbits, i32 %numlowbits) nounwind {373; X86-NOBMI-LABEL: bextr32_a4_commutative:374; X86-NOBMI:       # %bb.0:375; X86-NOBMI-NEXT:    pushl %esi376; X86-NOBMI-NEXT:    movzbl {{[0-9]+}}(%esp), %edx377; X86-NOBMI-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx378; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %esi379; X86-NOBMI-NEXT:    shrl %cl, %esi380; X86-NOBMI-NEXT:    movl $1, %eax381; X86-NOBMI-NEXT:    movl %edx, %ecx382; X86-NOBMI-NEXT:    shll %cl, %eax383; X86-NOBMI-NEXT:    decl %eax384; X86-NOBMI-NEXT:    andl %esi, %eax385; X86-NOBMI-NEXT:    popl %esi386; X86-NOBMI-NEXT:    retl387;388; X86-BMI1-LABEL: bextr32_a4_commutative:389; X86-BMI1:       # %bb.0:390; X86-BMI1-NEXT:    movzbl {{[0-9]+}}(%esp), %eax391; X86-BMI1-NEXT:    shll $8, %eax392; X86-BMI1-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx393; X86-BMI1-NEXT:    orl %eax, %ecx394; X86-BMI1-NEXT:    bextrl %ecx, {{[0-9]+}}(%esp), %eax395; X86-BMI1-NEXT:    retl396;397; X86-BMI2-LABEL: bextr32_a4_commutative:398; X86-BMI2:       # %bb.0:399; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %eax400; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx401; X86-BMI2-NEXT:    shrxl %ecx, {{[0-9]+}}(%esp), %ecx402; X86-BMI2-NEXT:    bzhil %eax, %ecx, %eax403; X86-BMI2-NEXT:    retl404;405; X64-NOBMI-LABEL: bextr32_a4_commutative:406; X64-NOBMI:       # %bb.0:407; X64-NOBMI-NEXT:    movl %esi, %ecx408; X64-NOBMI-NEXT:    # kill: def $cl killed $cl killed $ecx409; X64-NOBMI-NEXT:    shrl %cl, %edi410; X64-NOBMI-NEXT:    movl $1, %eax411; X64-NOBMI-NEXT:    movl %edx, %ecx412; X64-NOBMI-NEXT:    shll %cl, %eax413; X64-NOBMI-NEXT:    decl %eax414; X64-NOBMI-NEXT:    andl %edi, %eax415; X64-NOBMI-NEXT:    retq416;417; X64-BMI1-LABEL: bextr32_a4_commutative:418; X64-BMI1:       # %bb.0:419; X64-BMI1-NEXT:    shll $8, %edx420; X64-BMI1-NEXT:    movzbl %sil, %eax421; X64-BMI1-NEXT:    orl %edx, %eax422; X64-BMI1-NEXT:    bextrl %eax, %edi, %eax423; X64-BMI1-NEXT:    retq424;425; X64-BMI2-LABEL: bextr32_a4_commutative:426; X64-BMI2:       # %bb.0:427; X64-BMI2-NEXT:    shrxl %esi, %edi, %eax428; X64-BMI2-NEXT:    bzhil %edx, %eax, %eax429; X64-BMI2-NEXT:    retq430  %shifted = lshr i32 %val, %numskipbits431  %onebit = shl i32 1, %numlowbits432  %mask = add nsw i32 %onebit, -1433  %masked = and i32 %shifted, %mask ; swapped order434  ret i32 %masked435}436 437define i32 @bextr32_a5_skipextrauses(i32 %val, i32 %numskipbits, i32 %numlowbits) nounwind {438; X86-NOBMI-LABEL: bextr32_a5_skipextrauses:439; X86-NOBMI:       # %bb.0:440; X86-NOBMI-NEXT:    pushl %edi441; X86-NOBMI-NEXT:    pushl %esi442; X86-NOBMI-NEXT:    pushl %eax443; X86-NOBMI-NEXT:    movzbl {{[0-9]+}}(%esp), %edx444; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %edi445; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %eax446; X86-NOBMI-NEXT:    movl %eax, %ecx447; X86-NOBMI-NEXT:    shrl %cl, %edi448; X86-NOBMI-NEXT:    movl $1, %esi449; X86-NOBMI-NEXT:    movl %edx, %ecx450; X86-NOBMI-NEXT:    shll %cl, %esi451; X86-NOBMI-NEXT:    decl %esi452; X86-NOBMI-NEXT:    andl %edi, %esi453; X86-NOBMI-NEXT:    movl %eax, (%esp)454; X86-NOBMI-NEXT:    calll use32@PLT455; X86-NOBMI-NEXT:    movl %esi, %eax456; X86-NOBMI-NEXT:    addl $4, %esp457; X86-NOBMI-NEXT:    popl %esi458; X86-NOBMI-NEXT:    popl %edi459; X86-NOBMI-NEXT:    retl460;461; X86-BMI1-LABEL: bextr32_a5_skipextrauses:462; X86-BMI1:       # %bb.0:463; X86-BMI1-NEXT:    pushl %esi464; X86-BMI1-NEXT:    subl $8, %esp465; X86-BMI1-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx466; X86-BMI1-NEXT:    movl {{[0-9]+}}(%esp), %eax467; X86-BMI1-NEXT:    shll $8, %ecx468; X86-BMI1-NEXT:    movzbl %al, %edx469; X86-BMI1-NEXT:    orl %ecx, %edx470; X86-BMI1-NEXT:    bextrl %edx, {{[0-9]+}}(%esp), %esi471; X86-BMI1-NEXT:    movl %eax, (%esp)472; X86-BMI1-NEXT:    calll use32@PLT473; X86-BMI1-NEXT:    movl %esi, %eax474; X86-BMI1-NEXT:    addl $8, %esp475; X86-BMI1-NEXT:    popl %esi476; X86-BMI1-NEXT:    retl477;478; X86-BMI2-LABEL: bextr32_a5_skipextrauses:479; X86-BMI2:       # %bb.0:480; X86-BMI2-NEXT:    pushl %esi481; X86-BMI2-NEXT:    subl $8, %esp482; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %eax483; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %ecx484; X86-BMI2-NEXT:    shrxl %ecx, {{[0-9]+}}(%esp), %edx485; X86-BMI2-NEXT:    bzhil %eax, %edx, %esi486; X86-BMI2-NEXT:    movl %ecx, (%esp)487; X86-BMI2-NEXT:    calll use32@PLT488; X86-BMI2-NEXT:    movl %esi, %eax489; X86-BMI2-NEXT:    addl $8, %esp490; X86-BMI2-NEXT:    popl %esi491; X86-BMI2-NEXT:    retl492;493; X64-NOBMI-LABEL: bextr32_a5_skipextrauses:494; X64-NOBMI:       # %bb.0:495; X64-NOBMI-NEXT:    pushq %rbx496; X64-NOBMI-NEXT:    movl %esi, %ecx497; X64-NOBMI-NEXT:    shrl %cl, %edi498; X64-NOBMI-NEXT:    movl $1, %ebx499; X64-NOBMI-NEXT:    movl %edx, %ecx500; X64-NOBMI-NEXT:    shll %cl, %ebx501; X64-NOBMI-NEXT:    decl %ebx502; X64-NOBMI-NEXT:    andl %edi, %ebx503; X64-NOBMI-NEXT:    movl %esi, %edi504; X64-NOBMI-NEXT:    callq use32@PLT505; X64-NOBMI-NEXT:    movl %ebx, %eax506; X64-NOBMI-NEXT:    popq %rbx507; X64-NOBMI-NEXT:    retq508;509; X64-BMI1-LABEL: bextr32_a5_skipextrauses:510; X64-BMI1:       # %bb.0:511; X64-BMI1-NEXT:    pushq %rbx512; X64-BMI1-NEXT:    shll $8, %edx513; X64-BMI1-NEXT:    movzbl %sil, %eax514; X64-BMI1-NEXT:    orl %edx, %eax515; X64-BMI1-NEXT:    bextrl %eax, %edi, %ebx516; X64-BMI1-NEXT:    movl %esi, %edi517; X64-BMI1-NEXT:    callq use32@PLT518; X64-BMI1-NEXT:    movl %ebx, %eax519; X64-BMI1-NEXT:    popq %rbx520; X64-BMI1-NEXT:    retq521;522; X64-BMI2-LABEL: bextr32_a5_skipextrauses:523; X64-BMI2:       # %bb.0:524; X64-BMI2-NEXT:    pushq %rbx525; X64-BMI2-NEXT:    shrxl %esi, %edi, %eax526; X64-BMI2-NEXT:    bzhil %edx, %eax, %ebx527; X64-BMI2-NEXT:    movl %esi, %edi528; X64-BMI2-NEXT:    callq use32@PLT529; X64-BMI2-NEXT:    movl %ebx, %eax530; X64-BMI2-NEXT:    popq %rbx531; X64-BMI2-NEXT:    retq532  %shifted = lshr i32 %val, %numskipbits533  %onebit = shl i32 1, %numlowbits534  %mask = add nsw i32 %onebit, -1535  %masked = and i32 %mask, %shifted536  call void @use32(i32 %numskipbits)537  ret i32 %masked538}539 540; 64-bit541 542define i64 @bextr64_a0(i64 %val, i64 %numskipbits, i64 %numlowbits) nounwind {543; X86-NOBMI-LABEL: bextr64_a0:544; X86-NOBMI:       # %bb.0:545; X86-NOBMI-NEXT:    pushl %edi546; X86-NOBMI-NEXT:    pushl %esi547; X86-NOBMI-NEXT:    movb {{[0-9]+}}(%esp), %ch548; X86-NOBMI-NEXT:    movb {{[0-9]+}}(%esp), %cl549; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %esi550; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %eax551; X86-NOBMI-NEXT:    movl %eax, %edi552; X86-NOBMI-NEXT:    shrl %cl, %edi553; X86-NOBMI-NEXT:    shrdl %cl, %eax, %esi554; X86-NOBMI-NEXT:    testb $32, %cl555; X86-NOBMI-NEXT:    je .LBB7_2556; X86-NOBMI-NEXT:  # %bb.1:557; X86-NOBMI-NEXT:    movl %edi, %esi558; X86-NOBMI-NEXT:    xorl %edi, %edi559; X86-NOBMI-NEXT:  .LBB7_2:560; X86-NOBMI-NEXT:    movl $1, %eax561; X86-NOBMI-NEXT:    xorl %edx, %edx562; X86-NOBMI-NEXT:    movb %ch, %cl563; X86-NOBMI-NEXT:    shldl %cl, %eax, %edx564; X86-NOBMI-NEXT:    shll %cl, %eax565; X86-NOBMI-NEXT:    testb $32, %ch566; X86-NOBMI-NEXT:    je .LBB7_4567; X86-NOBMI-NEXT:  # %bb.3:568; X86-NOBMI-NEXT:    movl %eax, %edx569; X86-NOBMI-NEXT:    xorl %eax, %eax570; X86-NOBMI-NEXT:  .LBB7_4:571; X86-NOBMI-NEXT:    addl $-1, %eax572; X86-NOBMI-NEXT:    adcl $-1, %edx573; X86-NOBMI-NEXT:    andl %esi, %eax574; X86-NOBMI-NEXT:    andl %edi, %edx575; X86-NOBMI-NEXT:    popl %esi576; X86-NOBMI-NEXT:    popl %edi577; X86-NOBMI-NEXT:    retl578;579; X86-BMI1-LABEL: bextr64_a0:580; X86-BMI1:       # %bb.0:581; X86-BMI1-NEXT:    pushl %edi582; X86-BMI1-NEXT:    pushl %esi583; X86-BMI1-NEXT:    movb {{[0-9]+}}(%esp), %ch584; X86-BMI1-NEXT:    movb {{[0-9]+}}(%esp), %cl585; X86-BMI1-NEXT:    movl {{[0-9]+}}(%esp), %esi586; X86-BMI1-NEXT:    movl {{[0-9]+}}(%esp), %eax587; X86-BMI1-NEXT:    movl %eax, %edi588; X86-BMI1-NEXT:    shrl %cl, %edi589; X86-BMI1-NEXT:    shrdl %cl, %eax, %esi590; X86-BMI1-NEXT:    testb $32, %cl591; X86-BMI1-NEXT:    je .LBB7_2592; X86-BMI1-NEXT:  # %bb.1:593; X86-BMI1-NEXT:    movl %edi, %esi594; X86-BMI1-NEXT:    xorl %edi, %edi595; X86-BMI1-NEXT:  .LBB7_2:596; X86-BMI1-NEXT:    movl $1, %eax597; X86-BMI1-NEXT:    xorl %edx, %edx598; X86-BMI1-NEXT:    movb %ch, %cl599; X86-BMI1-NEXT:    shldl %cl, %eax, %edx600; X86-BMI1-NEXT:    shll %cl, %eax601; X86-BMI1-NEXT:    testb $32, %ch602; X86-BMI1-NEXT:    je .LBB7_4603; X86-BMI1-NEXT:  # %bb.3:604; X86-BMI1-NEXT:    movl %eax, %edx605; X86-BMI1-NEXT:    xorl %eax, %eax606; X86-BMI1-NEXT:  .LBB7_4:607; X86-BMI1-NEXT:    addl $-1, %eax608; X86-BMI1-NEXT:    adcl $-1, %edx609; X86-BMI1-NEXT:    andl %esi, %eax610; X86-BMI1-NEXT:    andl %edi, %edx611; X86-BMI1-NEXT:    popl %esi612; X86-BMI1-NEXT:    popl %edi613; X86-BMI1-NEXT:    retl614;615; X86-BMI2-LABEL: bextr64_a0:616; X86-BMI2:       # %bb.0:617; X86-BMI2-NEXT:    pushl %ebx618; X86-BMI2-NEXT:    pushl %edi619; X86-BMI2-NEXT:    pushl %esi620; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %ebx621; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx622; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %esi623; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %eax624; X86-BMI2-NEXT:    shrdl %cl, %eax, %esi625; X86-BMI2-NEXT:    shrxl %ecx, %eax, %edi626; X86-BMI2-NEXT:    testb $32, %cl627; X86-BMI2-NEXT:    je .LBB7_2628; X86-BMI2-NEXT:  # %bb.1:629; X86-BMI2-NEXT:    movl %edi, %esi630; X86-BMI2-NEXT:    xorl %edi, %edi631; X86-BMI2-NEXT:  .LBB7_2:632; X86-BMI2-NEXT:    movl $1, %eax633; X86-BMI2-NEXT:    xorl %edx, %edx634; X86-BMI2-NEXT:    movl %ebx, %ecx635; X86-BMI2-NEXT:    shldl %cl, %eax, %edx636; X86-BMI2-NEXT:    shlxl %ebx, %eax, %eax637; X86-BMI2-NEXT:    testb $32, %bl638; X86-BMI2-NEXT:    je .LBB7_4639; X86-BMI2-NEXT:  # %bb.3:640; X86-BMI2-NEXT:    movl %eax, %edx641; X86-BMI2-NEXT:    xorl %eax, %eax642; X86-BMI2-NEXT:  .LBB7_4:643; X86-BMI2-NEXT:    addl $-1, %eax644; X86-BMI2-NEXT:    adcl $-1, %edx645; X86-BMI2-NEXT:    andl %esi, %eax646; X86-BMI2-NEXT:    andl %edi, %edx647; X86-BMI2-NEXT:    popl %esi648; X86-BMI2-NEXT:    popl %edi649; X86-BMI2-NEXT:    popl %ebx650; X86-BMI2-NEXT:    retl651;652; X64-NOBMI-LABEL: bextr64_a0:653; X64-NOBMI:       # %bb.0:654; X64-NOBMI-NEXT:    movq %rsi, %rcx655; X64-NOBMI-NEXT:    # kill: def $cl killed $cl killed $rcx656; X64-NOBMI-NEXT:    shrq %cl, %rdi657; X64-NOBMI-NEXT:    movl $1, %eax658; X64-NOBMI-NEXT:    movl %edx, %ecx659; X64-NOBMI-NEXT:    shlq %cl, %rax660; X64-NOBMI-NEXT:    decq %rax661; X64-NOBMI-NEXT:    andq %rdi, %rax662; X64-NOBMI-NEXT:    retq663;664; X64-BMI1-LABEL: bextr64_a0:665; X64-BMI1:       # %bb.0:666; X64-BMI1-NEXT:    shll $8, %edx667; X64-BMI1-NEXT:    movzbl %sil, %eax668; X64-BMI1-NEXT:    orl %edx, %eax669; X64-BMI1-NEXT:    bextrq %rax, %rdi, %rax670; X64-BMI1-NEXT:    retq671;672; X64-BMI2-LABEL: bextr64_a0:673; X64-BMI2:       # %bb.0:674; X64-BMI2-NEXT:    shrxq %rsi, %rdi, %rax675; X64-BMI2-NEXT:    bzhiq %rdx, %rax, %rax676; X64-BMI2-NEXT:    retq677  %shifted = lshr i64 %val, %numskipbits678  %onebit = shl i64 1, %numlowbits679  %mask = add nsw i64 %onebit, -1680  %masked = and i64 %mask, %shifted681  ret i64 %masked682}683 684define i64 @bextr64_a0_arithmetic(i64 %val, i64 %numskipbits, i64 %numlowbits) nounwind {685; X86-NOBMI-LABEL: bextr64_a0_arithmetic:686; X86-NOBMI:       # %bb.0:687; X86-NOBMI-NEXT:    pushl %edi688; X86-NOBMI-NEXT:    pushl %esi689; X86-NOBMI-NEXT:    movb {{[0-9]+}}(%esp), %ch690; X86-NOBMI-NEXT:    movb {{[0-9]+}}(%esp), %cl691; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %edi692; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %eax693; X86-NOBMI-NEXT:    movl %eax, %esi694; X86-NOBMI-NEXT:    sarl %cl, %esi695; X86-NOBMI-NEXT:    shrdl %cl, %eax, %edi696; X86-NOBMI-NEXT:    testb $32, %cl697; X86-NOBMI-NEXT:    je .LBB8_2698; X86-NOBMI-NEXT:  # %bb.1:699; X86-NOBMI-NEXT:    sarl $31, %eax700; X86-NOBMI-NEXT:    movl %esi, %edi701; X86-NOBMI-NEXT:    movl %eax, %esi702; X86-NOBMI-NEXT:  .LBB8_2:703; X86-NOBMI-NEXT:    movl $1, %eax704; X86-NOBMI-NEXT:    xorl %edx, %edx705; X86-NOBMI-NEXT:    movb %ch, %cl706; X86-NOBMI-NEXT:    shldl %cl, %eax, %edx707; X86-NOBMI-NEXT:    shll %cl, %eax708; X86-NOBMI-NEXT:    testb $32, %ch709; X86-NOBMI-NEXT:    je .LBB8_4710; X86-NOBMI-NEXT:  # %bb.3:711; X86-NOBMI-NEXT:    movl %eax, %edx712; X86-NOBMI-NEXT:    xorl %eax, %eax713; X86-NOBMI-NEXT:  .LBB8_4:714; X86-NOBMI-NEXT:    addl $-1, %eax715; X86-NOBMI-NEXT:    adcl $-1, %edx716; X86-NOBMI-NEXT:    andl %edi, %eax717; X86-NOBMI-NEXT:    andl %esi, %edx718; X86-NOBMI-NEXT:    popl %esi719; X86-NOBMI-NEXT:    popl %edi720; X86-NOBMI-NEXT:    retl721;722; X86-BMI1-LABEL: bextr64_a0_arithmetic:723; X86-BMI1:       # %bb.0:724; X86-BMI1-NEXT:    pushl %edi725; X86-BMI1-NEXT:    pushl %esi726; X86-BMI1-NEXT:    movb {{[0-9]+}}(%esp), %ch727; X86-BMI1-NEXT:    movb {{[0-9]+}}(%esp), %cl728; X86-BMI1-NEXT:    movl {{[0-9]+}}(%esp), %edi729; X86-BMI1-NEXT:    movl {{[0-9]+}}(%esp), %eax730; X86-BMI1-NEXT:    movl %eax, %esi731; X86-BMI1-NEXT:    sarl %cl, %esi732; X86-BMI1-NEXT:    shrdl %cl, %eax, %edi733; X86-BMI1-NEXT:    testb $32, %cl734; X86-BMI1-NEXT:    je .LBB8_2735; X86-BMI1-NEXT:  # %bb.1:736; X86-BMI1-NEXT:    sarl $31, %eax737; X86-BMI1-NEXT:    movl %esi, %edi738; X86-BMI1-NEXT:    movl %eax, %esi739; X86-BMI1-NEXT:  .LBB8_2:740; X86-BMI1-NEXT:    movl $1, %eax741; X86-BMI1-NEXT:    xorl %edx, %edx742; X86-BMI1-NEXT:    movb %ch, %cl743; X86-BMI1-NEXT:    shldl %cl, %eax, %edx744; X86-BMI1-NEXT:    shll %cl, %eax745; X86-BMI1-NEXT:    testb $32, %ch746; X86-BMI1-NEXT:    je .LBB8_4747; X86-BMI1-NEXT:  # %bb.3:748; X86-BMI1-NEXT:    movl %eax, %edx749; X86-BMI1-NEXT:    xorl %eax, %eax750; X86-BMI1-NEXT:  .LBB8_4:751; X86-BMI1-NEXT:    addl $-1, %eax752; X86-BMI1-NEXT:    adcl $-1, %edx753; X86-BMI1-NEXT:    andl %edi, %eax754; X86-BMI1-NEXT:    andl %esi, %edx755; X86-BMI1-NEXT:    popl %esi756; X86-BMI1-NEXT:    popl %edi757; X86-BMI1-NEXT:    retl758;759; X86-BMI2-LABEL: bextr64_a0_arithmetic:760; X86-BMI2:       # %bb.0:761; X86-BMI2-NEXT:    pushl %ebx762; X86-BMI2-NEXT:    pushl %edi763; X86-BMI2-NEXT:    pushl %esi764; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %ebx765; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx766; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %esi767; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %eax768; X86-BMI2-NEXT:    shrdl %cl, %eax, %esi769; X86-BMI2-NEXT:    sarxl %ecx, %eax, %edi770; X86-BMI2-NEXT:    testb $32, %cl771; X86-BMI2-NEXT:    je .LBB8_2772; X86-BMI2-NEXT:  # %bb.1:773; X86-BMI2-NEXT:    sarl $31, %eax774; X86-BMI2-NEXT:    movl %edi, %esi775; X86-BMI2-NEXT:    movl %eax, %edi776; X86-BMI2-NEXT:  .LBB8_2:777; X86-BMI2-NEXT:    movl $1, %eax778; X86-BMI2-NEXT:    xorl %edx, %edx779; X86-BMI2-NEXT:    movl %ebx, %ecx780; X86-BMI2-NEXT:    shldl %cl, %eax, %edx781; X86-BMI2-NEXT:    shlxl %ebx, %eax, %eax782; X86-BMI2-NEXT:    testb $32, %bl783; X86-BMI2-NEXT:    je .LBB8_4784; X86-BMI2-NEXT:  # %bb.3:785; X86-BMI2-NEXT:    movl %eax, %edx786; X86-BMI2-NEXT:    xorl %eax, %eax787; X86-BMI2-NEXT:  .LBB8_4:788; X86-BMI2-NEXT:    addl $-1, %eax789; X86-BMI2-NEXT:    adcl $-1, %edx790; X86-BMI2-NEXT:    andl %esi, %eax791; X86-BMI2-NEXT:    andl %edi, %edx792; X86-BMI2-NEXT:    popl %esi793; X86-BMI2-NEXT:    popl %edi794; X86-BMI2-NEXT:    popl %ebx795; X86-BMI2-NEXT:    retl796;797; X64-NOBMI-LABEL: bextr64_a0_arithmetic:798; X64-NOBMI:       # %bb.0:799; X64-NOBMI-NEXT:    movq %rsi, %rcx800; X64-NOBMI-NEXT:    # kill: def $cl killed $cl killed $rcx801; X64-NOBMI-NEXT:    sarq %cl, %rdi802; X64-NOBMI-NEXT:    movl $1, %eax803; X64-NOBMI-NEXT:    movl %edx, %ecx804; X64-NOBMI-NEXT:    shlq %cl, %rax805; X64-NOBMI-NEXT:    decq %rax806; X64-NOBMI-NEXT:    andq %rdi, %rax807; X64-NOBMI-NEXT:    retq808;809; X64-BMI1-LABEL: bextr64_a0_arithmetic:810; X64-BMI1:       # %bb.0:811; X64-BMI1-NEXT:    movq %rsi, %rcx812; X64-BMI1-NEXT:    # kill: def $cl killed $cl killed $rcx813; X64-BMI1-NEXT:    sarq %cl, %rdi814; X64-BMI1-NEXT:    shll $8, %edx815; X64-BMI1-NEXT:    bextrq %rdx, %rdi, %rax816; X64-BMI1-NEXT:    retq817;818; X64-BMI2-LABEL: bextr64_a0_arithmetic:819; X64-BMI2:       # %bb.0:820; X64-BMI2-NEXT:    sarxq %rsi, %rdi, %rax821; X64-BMI2-NEXT:    bzhiq %rdx, %rax, %rax822; X64-BMI2-NEXT:    retq823  %shifted = ashr i64 %val, %numskipbits824  %onebit = shl i64 1, %numlowbits825  %mask = add nsw i64 %onebit, -1826  %masked = and i64 %mask, %shifted827  ret i64 %masked828}829 830define i64 @bextr64_a1_indexzext(i64 %val, i8 zeroext %numskipbits, i8 zeroext %numlowbits) nounwind {831; X86-NOBMI-LABEL: bextr64_a1_indexzext:832; X86-NOBMI:       # %bb.0:833; X86-NOBMI-NEXT:    pushl %edi834; X86-NOBMI-NEXT:    pushl %esi835; X86-NOBMI-NEXT:    movb {{[0-9]+}}(%esp), %ch836; X86-NOBMI-NEXT:    movb {{[0-9]+}}(%esp), %cl837; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %esi838; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %eax839; X86-NOBMI-NEXT:    movl %eax, %edi840; X86-NOBMI-NEXT:    shrl %cl, %edi841; X86-NOBMI-NEXT:    shrdl %cl, %eax, %esi842; X86-NOBMI-NEXT:    testb $32, %cl843; X86-NOBMI-NEXT:    je .LBB9_2844; X86-NOBMI-NEXT:  # %bb.1:845; X86-NOBMI-NEXT:    movl %edi, %esi846; X86-NOBMI-NEXT:    xorl %edi, %edi847; X86-NOBMI-NEXT:  .LBB9_2:848; X86-NOBMI-NEXT:    movl $1, %eax849; X86-NOBMI-NEXT:    xorl %edx, %edx850; X86-NOBMI-NEXT:    movb %ch, %cl851; X86-NOBMI-NEXT:    shldl %cl, %eax, %edx852; X86-NOBMI-NEXT:    shll %cl, %eax853; X86-NOBMI-NEXT:    testb $32, %ch854; X86-NOBMI-NEXT:    je .LBB9_4855; X86-NOBMI-NEXT:  # %bb.3:856; X86-NOBMI-NEXT:    movl %eax, %edx857; X86-NOBMI-NEXT:    xorl %eax, %eax858; X86-NOBMI-NEXT:  .LBB9_4:859; X86-NOBMI-NEXT:    addl $-1, %eax860; X86-NOBMI-NEXT:    adcl $-1, %edx861; X86-NOBMI-NEXT:    andl %esi, %eax862; X86-NOBMI-NEXT:    andl %edi, %edx863; X86-NOBMI-NEXT:    popl %esi864; X86-NOBMI-NEXT:    popl %edi865; X86-NOBMI-NEXT:    retl866;867; X86-BMI1-LABEL: bextr64_a1_indexzext:868; X86-BMI1:       # %bb.0:869; X86-BMI1-NEXT:    pushl %edi870; X86-BMI1-NEXT:    pushl %esi871; X86-BMI1-NEXT:    movb {{[0-9]+}}(%esp), %ch872; X86-BMI1-NEXT:    movb {{[0-9]+}}(%esp), %cl873; X86-BMI1-NEXT:    movl {{[0-9]+}}(%esp), %esi874; X86-BMI1-NEXT:    movl {{[0-9]+}}(%esp), %eax875; X86-BMI1-NEXT:    movl %eax, %edi876; X86-BMI1-NEXT:    shrl %cl, %edi877; X86-BMI1-NEXT:    shrdl %cl, %eax, %esi878; X86-BMI1-NEXT:    testb $32, %cl879; X86-BMI1-NEXT:    je .LBB9_2880; X86-BMI1-NEXT:  # %bb.1:881; X86-BMI1-NEXT:    movl %edi, %esi882; X86-BMI1-NEXT:    xorl %edi, %edi883; X86-BMI1-NEXT:  .LBB9_2:884; X86-BMI1-NEXT:    movl $1, %eax885; X86-BMI1-NEXT:    xorl %edx, %edx886; X86-BMI1-NEXT:    movb %ch, %cl887; X86-BMI1-NEXT:    shldl %cl, %eax, %edx888; X86-BMI1-NEXT:    shll %cl, %eax889; X86-BMI1-NEXT:    testb $32, %ch890; X86-BMI1-NEXT:    je .LBB9_4891; X86-BMI1-NEXT:  # %bb.3:892; X86-BMI1-NEXT:    movl %eax, %edx893; X86-BMI1-NEXT:    xorl %eax, %eax894; X86-BMI1-NEXT:  .LBB9_4:895; X86-BMI1-NEXT:    addl $-1, %eax896; X86-BMI1-NEXT:    adcl $-1, %edx897; X86-BMI1-NEXT:    andl %esi, %eax898; X86-BMI1-NEXT:    andl %edi, %edx899; X86-BMI1-NEXT:    popl %esi900; X86-BMI1-NEXT:    popl %edi901; X86-BMI1-NEXT:    retl902;903; X86-BMI2-LABEL: bextr64_a1_indexzext:904; X86-BMI2:       # %bb.0:905; X86-BMI2-NEXT:    pushl %ebx906; X86-BMI2-NEXT:    pushl %edi907; X86-BMI2-NEXT:    pushl %esi908; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %ebx909; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx910; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %esi911; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %eax912; X86-BMI2-NEXT:    shrdl %cl, %eax, %esi913; X86-BMI2-NEXT:    shrxl %ecx, %eax, %edi914; X86-BMI2-NEXT:    testb $32, %cl915; X86-BMI2-NEXT:    je .LBB9_2916; X86-BMI2-NEXT:  # %bb.1:917; X86-BMI2-NEXT:    movl %edi, %esi918; X86-BMI2-NEXT:    xorl %edi, %edi919; X86-BMI2-NEXT:  .LBB9_2:920; X86-BMI2-NEXT:    movl $1, %eax921; X86-BMI2-NEXT:    xorl %edx, %edx922; X86-BMI2-NEXT:    movl %ebx, %ecx923; X86-BMI2-NEXT:    shldl %cl, %eax, %edx924; X86-BMI2-NEXT:    shlxl %ebx, %eax, %eax925; X86-BMI2-NEXT:    testb $32, %bl926; X86-BMI2-NEXT:    je .LBB9_4927; X86-BMI2-NEXT:  # %bb.3:928; X86-BMI2-NEXT:    movl %eax, %edx929; X86-BMI2-NEXT:    xorl %eax, %eax930; X86-BMI2-NEXT:  .LBB9_4:931; X86-BMI2-NEXT:    addl $-1, %eax932; X86-BMI2-NEXT:    adcl $-1, %edx933; X86-BMI2-NEXT:    andl %esi, %eax934; X86-BMI2-NEXT:    andl %edi, %edx935; X86-BMI2-NEXT:    popl %esi936; X86-BMI2-NEXT:    popl %edi937; X86-BMI2-NEXT:    popl %ebx938; X86-BMI2-NEXT:    retl939;940; X64-NOBMI-LABEL: bextr64_a1_indexzext:941; X64-NOBMI:       # %bb.0:942; X64-NOBMI-NEXT:    movl %esi, %ecx943; X64-NOBMI-NEXT:    # kill: def $cl killed $cl killed $ecx944; X64-NOBMI-NEXT:    shrq %cl, %rdi945; X64-NOBMI-NEXT:    movl $1, %eax946; X64-NOBMI-NEXT:    movl %edx, %ecx947; X64-NOBMI-NEXT:    shlq %cl, %rax948; X64-NOBMI-NEXT:    decq %rax949; X64-NOBMI-NEXT:    andq %rdi, %rax950; X64-NOBMI-NEXT:    retq951;952; X64-BMI1-LABEL: bextr64_a1_indexzext:953; X64-BMI1:       # %bb.0:954; X64-BMI1-NEXT:    # kill: def $edx killed $edx def $rdx955; X64-BMI1-NEXT:    shll $8, %edx956; X64-BMI1-NEXT:    orl %esi, %edx957; X64-BMI1-NEXT:    bextrq %rdx, %rdi, %rax958; X64-BMI1-NEXT:    retq959;960; X64-BMI2-LABEL: bextr64_a1_indexzext:961; X64-BMI2:       # %bb.0:962; X64-BMI2-NEXT:    # kill: def $edx killed $edx def $rdx963; X64-BMI2-NEXT:    # kill: def $esi killed $esi def $rsi964; X64-BMI2-NEXT:    shrxq %rsi, %rdi, %rax965; X64-BMI2-NEXT:    bzhiq %rdx, %rax, %rax966; X64-BMI2-NEXT:    retq967  %skip = zext i8 %numskipbits to i64968  %shifted = lshr i64 %val, %skip969  %conv = zext i8 %numlowbits to i64970  %onebit = shl i64 1, %conv971  %mask = add nsw i64 %onebit, -1972  %masked = and i64 %mask, %shifted973  ret i64 %masked974}975 976define i64 @bextr64_a2_load(ptr %w, i64 %numskipbits, i64 %numlowbits) nounwind {977; X86-NOBMI-LABEL: bextr64_a2_load:978; X86-NOBMI:       # %bb.0:979; X86-NOBMI-NEXT:    pushl %edi980; X86-NOBMI-NEXT:    pushl %esi981; X86-NOBMI-NEXT:    movb {{[0-9]+}}(%esp), %ch982; X86-NOBMI-NEXT:    movb {{[0-9]+}}(%esp), %cl983; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %eax984; X86-NOBMI-NEXT:    movl (%eax), %esi985; X86-NOBMI-NEXT:    movl 4(%eax), %eax986; X86-NOBMI-NEXT:    movl %eax, %edi987; X86-NOBMI-NEXT:    shrl %cl, %edi988; X86-NOBMI-NEXT:    shrdl %cl, %eax, %esi989; X86-NOBMI-NEXT:    testb $32, %cl990; X86-NOBMI-NEXT:    je .LBB10_2991; X86-NOBMI-NEXT:  # %bb.1:992; X86-NOBMI-NEXT:    movl %edi, %esi993; X86-NOBMI-NEXT:    xorl %edi, %edi994; X86-NOBMI-NEXT:  .LBB10_2:995; X86-NOBMI-NEXT:    movl $1, %eax996; X86-NOBMI-NEXT:    xorl %edx, %edx997; X86-NOBMI-NEXT:    movb %ch, %cl998; X86-NOBMI-NEXT:    shldl %cl, %eax, %edx999; X86-NOBMI-NEXT:    shll %cl, %eax1000; X86-NOBMI-NEXT:    testb $32, %ch1001; X86-NOBMI-NEXT:    je .LBB10_41002; X86-NOBMI-NEXT:  # %bb.3:1003; X86-NOBMI-NEXT:    movl %eax, %edx1004; X86-NOBMI-NEXT:    xorl %eax, %eax1005; X86-NOBMI-NEXT:  .LBB10_4:1006; X86-NOBMI-NEXT:    addl $-1, %eax1007; X86-NOBMI-NEXT:    adcl $-1, %edx1008; X86-NOBMI-NEXT:    andl %esi, %eax1009; X86-NOBMI-NEXT:    andl %edi, %edx1010; X86-NOBMI-NEXT:    popl %esi1011; X86-NOBMI-NEXT:    popl %edi1012; X86-NOBMI-NEXT:    retl1013;1014; X86-BMI1-LABEL: bextr64_a2_load:1015; X86-BMI1:       # %bb.0:1016; X86-BMI1-NEXT:    pushl %edi1017; X86-BMI1-NEXT:    pushl %esi1018; X86-BMI1-NEXT:    movb {{[0-9]+}}(%esp), %ch1019; X86-BMI1-NEXT:    movb {{[0-9]+}}(%esp), %cl1020; X86-BMI1-NEXT:    movl {{[0-9]+}}(%esp), %eax1021; X86-BMI1-NEXT:    movl (%eax), %esi1022; X86-BMI1-NEXT:    movl 4(%eax), %eax1023; X86-BMI1-NEXT:    movl %eax, %edi1024; X86-BMI1-NEXT:    shrl %cl, %edi1025; X86-BMI1-NEXT:    shrdl %cl, %eax, %esi1026; X86-BMI1-NEXT:    testb $32, %cl1027; X86-BMI1-NEXT:    je .LBB10_21028; X86-BMI1-NEXT:  # %bb.1:1029; X86-BMI1-NEXT:    movl %edi, %esi1030; X86-BMI1-NEXT:    xorl %edi, %edi1031; X86-BMI1-NEXT:  .LBB10_2:1032; X86-BMI1-NEXT:    movl $1, %eax1033; X86-BMI1-NEXT:    xorl %edx, %edx1034; X86-BMI1-NEXT:    movb %ch, %cl1035; X86-BMI1-NEXT:    shldl %cl, %eax, %edx1036; X86-BMI1-NEXT:    shll %cl, %eax1037; X86-BMI1-NEXT:    testb $32, %ch1038; X86-BMI1-NEXT:    je .LBB10_41039; X86-BMI1-NEXT:  # %bb.3:1040; X86-BMI1-NEXT:    movl %eax, %edx1041; X86-BMI1-NEXT:    xorl %eax, %eax1042; X86-BMI1-NEXT:  .LBB10_4:1043; X86-BMI1-NEXT:    addl $-1, %eax1044; X86-BMI1-NEXT:    adcl $-1, %edx1045; X86-BMI1-NEXT:    andl %esi, %eax1046; X86-BMI1-NEXT:    andl %edi, %edx1047; X86-BMI1-NEXT:    popl %esi1048; X86-BMI1-NEXT:    popl %edi1049; X86-BMI1-NEXT:    retl1050;1051; X86-BMI2-LABEL: bextr64_a2_load:1052; X86-BMI2:       # %bb.0:1053; X86-BMI2-NEXT:    pushl %ebx1054; X86-BMI2-NEXT:    pushl %edi1055; X86-BMI2-NEXT:    pushl %esi1056; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %ebx1057; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx1058; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %eax1059; X86-BMI2-NEXT:    movl (%eax), %esi1060; X86-BMI2-NEXT:    movl 4(%eax), %eax1061; X86-BMI2-NEXT:    shrxl %ecx, %eax, %edi1062; X86-BMI2-NEXT:    shrdl %cl, %eax, %esi1063; X86-BMI2-NEXT:    testb $32, %cl1064; X86-BMI2-NEXT:    je .LBB10_21065; X86-BMI2-NEXT:  # %bb.1:1066; X86-BMI2-NEXT:    movl %edi, %esi1067; X86-BMI2-NEXT:    xorl %edi, %edi1068; X86-BMI2-NEXT:  .LBB10_2:1069; X86-BMI2-NEXT:    movl $1, %eax1070; X86-BMI2-NEXT:    xorl %edx, %edx1071; X86-BMI2-NEXT:    movl %ebx, %ecx1072; X86-BMI2-NEXT:    shldl %cl, %eax, %edx1073; X86-BMI2-NEXT:    shlxl %ebx, %eax, %eax1074; X86-BMI2-NEXT:    testb $32, %bl1075; X86-BMI2-NEXT:    je .LBB10_41076; X86-BMI2-NEXT:  # %bb.3:1077; X86-BMI2-NEXT:    movl %eax, %edx1078; X86-BMI2-NEXT:    xorl %eax, %eax1079; X86-BMI2-NEXT:  .LBB10_4:1080; X86-BMI2-NEXT:    addl $-1, %eax1081; X86-BMI2-NEXT:    adcl $-1, %edx1082; X86-BMI2-NEXT:    andl %esi, %eax1083; X86-BMI2-NEXT:    andl %edi, %edx1084; X86-BMI2-NEXT:    popl %esi1085; X86-BMI2-NEXT:    popl %edi1086; X86-BMI2-NEXT:    popl %ebx1087; X86-BMI2-NEXT:    retl1088;1089; X64-NOBMI-LABEL: bextr64_a2_load:1090; X64-NOBMI:       # %bb.0:1091; X64-NOBMI-NEXT:    movq %rsi, %rcx1092; X64-NOBMI-NEXT:    movq (%rdi), %rsi1093; X64-NOBMI-NEXT:    # kill: def $cl killed $cl killed $rcx1094; X64-NOBMI-NEXT:    shrq %cl, %rsi1095; X64-NOBMI-NEXT:    movl $1, %eax1096; X64-NOBMI-NEXT:    movl %edx, %ecx1097; X64-NOBMI-NEXT:    shlq %cl, %rax1098; X64-NOBMI-NEXT:    decq %rax1099; X64-NOBMI-NEXT:    andq %rsi, %rax1100; X64-NOBMI-NEXT:    retq1101;1102; X64-BMI1-LABEL: bextr64_a2_load:1103; X64-BMI1:       # %bb.0:1104; X64-BMI1-NEXT:    shll $8, %edx1105; X64-BMI1-NEXT:    movzbl %sil, %eax1106; X64-BMI1-NEXT:    orl %edx, %eax1107; X64-BMI1-NEXT:    bextrq %rax, (%rdi), %rax1108; X64-BMI1-NEXT:    retq1109;1110; X64-BMI2-LABEL: bextr64_a2_load:1111; X64-BMI2:       # %bb.0:1112; X64-BMI2-NEXT:    shrxq %rsi, (%rdi), %rax1113; X64-BMI2-NEXT:    bzhiq %rdx, %rax, %rax1114; X64-BMI2-NEXT:    retq1115  %val = load i64, ptr %w1116  %shifted = lshr i64 %val, %numskipbits1117  %onebit = shl i64 1, %numlowbits1118  %mask = add nsw i64 %onebit, -11119  %masked = and i64 %mask, %shifted1120  ret i64 %masked1121}1122 1123define i64 @bextr64_a3_load_indexzext(ptr %w, i8 zeroext %numskipbits, i8 zeroext %numlowbits) nounwind {1124; X86-NOBMI-LABEL: bextr64_a3_load_indexzext:1125; X86-NOBMI:       # %bb.0:1126; X86-NOBMI-NEXT:    pushl %edi1127; X86-NOBMI-NEXT:    pushl %esi1128; X86-NOBMI-NEXT:    movb {{[0-9]+}}(%esp), %ch1129; X86-NOBMI-NEXT:    movb {{[0-9]+}}(%esp), %cl1130; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %eax1131; X86-NOBMI-NEXT:    movl (%eax), %esi1132; X86-NOBMI-NEXT:    movl 4(%eax), %eax1133; X86-NOBMI-NEXT:    movl %eax, %edi1134; X86-NOBMI-NEXT:    shrl %cl, %edi1135; X86-NOBMI-NEXT:    shrdl %cl, %eax, %esi1136; X86-NOBMI-NEXT:    testb $32, %cl1137; X86-NOBMI-NEXT:    je .LBB11_21138; X86-NOBMI-NEXT:  # %bb.1:1139; X86-NOBMI-NEXT:    movl %edi, %esi1140; X86-NOBMI-NEXT:    xorl %edi, %edi1141; X86-NOBMI-NEXT:  .LBB11_2:1142; X86-NOBMI-NEXT:    movl $1, %eax1143; X86-NOBMI-NEXT:    xorl %edx, %edx1144; X86-NOBMI-NEXT:    movb %ch, %cl1145; X86-NOBMI-NEXT:    shldl %cl, %eax, %edx1146; X86-NOBMI-NEXT:    shll %cl, %eax1147; X86-NOBMI-NEXT:    testb $32, %ch1148; X86-NOBMI-NEXT:    je .LBB11_41149; X86-NOBMI-NEXT:  # %bb.3:1150; X86-NOBMI-NEXT:    movl %eax, %edx1151; X86-NOBMI-NEXT:    xorl %eax, %eax1152; X86-NOBMI-NEXT:  .LBB11_4:1153; X86-NOBMI-NEXT:    addl $-1, %eax1154; X86-NOBMI-NEXT:    adcl $-1, %edx1155; X86-NOBMI-NEXT:    andl %esi, %eax1156; X86-NOBMI-NEXT:    andl %edi, %edx1157; X86-NOBMI-NEXT:    popl %esi1158; X86-NOBMI-NEXT:    popl %edi1159; X86-NOBMI-NEXT:    retl1160;1161; X86-BMI1-LABEL: bextr64_a3_load_indexzext:1162; X86-BMI1:       # %bb.0:1163; X86-BMI1-NEXT:    pushl %edi1164; X86-BMI1-NEXT:    pushl %esi1165; X86-BMI1-NEXT:    movb {{[0-9]+}}(%esp), %ch1166; X86-BMI1-NEXT:    movb {{[0-9]+}}(%esp), %cl1167; X86-BMI1-NEXT:    movl {{[0-9]+}}(%esp), %eax1168; X86-BMI1-NEXT:    movl (%eax), %esi1169; X86-BMI1-NEXT:    movl 4(%eax), %eax1170; X86-BMI1-NEXT:    movl %eax, %edi1171; X86-BMI1-NEXT:    shrl %cl, %edi1172; X86-BMI1-NEXT:    shrdl %cl, %eax, %esi1173; X86-BMI1-NEXT:    testb $32, %cl1174; X86-BMI1-NEXT:    je .LBB11_21175; X86-BMI1-NEXT:  # %bb.1:1176; X86-BMI1-NEXT:    movl %edi, %esi1177; X86-BMI1-NEXT:    xorl %edi, %edi1178; X86-BMI1-NEXT:  .LBB11_2:1179; X86-BMI1-NEXT:    movl $1, %eax1180; X86-BMI1-NEXT:    xorl %edx, %edx1181; X86-BMI1-NEXT:    movb %ch, %cl1182; X86-BMI1-NEXT:    shldl %cl, %eax, %edx1183; X86-BMI1-NEXT:    shll %cl, %eax1184; X86-BMI1-NEXT:    testb $32, %ch1185; X86-BMI1-NEXT:    je .LBB11_41186; X86-BMI1-NEXT:  # %bb.3:1187; X86-BMI1-NEXT:    movl %eax, %edx1188; X86-BMI1-NEXT:    xorl %eax, %eax1189; X86-BMI1-NEXT:  .LBB11_4:1190; X86-BMI1-NEXT:    addl $-1, %eax1191; X86-BMI1-NEXT:    adcl $-1, %edx1192; X86-BMI1-NEXT:    andl %esi, %eax1193; X86-BMI1-NEXT:    andl %edi, %edx1194; X86-BMI1-NEXT:    popl %esi1195; X86-BMI1-NEXT:    popl %edi1196; X86-BMI1-NEXT:    retl1197;1198; X86-BMI2-LABEL: bextr64_a3_load_indexzext:1199; X86-BMI2:       # %bb.0:1200; X86-BMI2-NEXT:    pushl %ebx1201; X86-BMI2-NEXT:    pushl %edi1202; X86-BMI2-NEXT:    pushl %esi1203; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %ebx1204; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx1205; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %eax1206; X86-BMI2-NEXT:    movl (%eax), %esi1207; X86-BMI2-NEXT:    movl 4(%eax), %eax1208; X86-BMI2-NEXT:    shrxl %ecx, %eax, %edi1209; X86-BMI2-NEXT:    shrdl %cl, %eax, %esi1210; X86-BMI2-NEXT:    testb $32, %cl1211; X86-BMI2-NEXT:    je .LBB11_21212; X86-BMI2-NEXT:  # %bb.1:1213; X86-BMI2-NEXT:    movl %edi, %esi1214; X86-BMI2-NEXT:    xorl %edi, %edi1215; X86-BMI2-NEXT:  .LBB11_2:1216; X86-BMI2-NEXT:    movl $1, %eax1217; X86-BMI2-NEXT:    xorl %edx, %edx1218; X86-BMI2-NEXT:    movl %ebx, %ecx1219; X86-BMI2-NEXT:    shldl %cl, %eax, %edx1220; X86-BMI2-NEXT:    shlxl %ebx, %eax, %eax1221; X86-BMI2-NEXT:    testb $32, %bl1222; X86-BMI2-NEXT:    je .LBB11_41223; X86-BMI2-NEXT:  # %bb.3:1224; X86-BMI2-NEXT:    movl %eax, %edx1225; X86-BMI2-NEXT:    xorl %eax, %eax1226; X86-BMI2-NEXT:  .LBB11_4:1227; X86-BMI2-NEXT:    addl $-1, %eax1228; X86-BMI2-NEXT:    adcl $-1, %edx1229; X86-BMI2-NEXT:    andl %esi, %eax1230; X86-BMI2-NEXT:    andl %edi, %edx1231; X86-BMI2-NEXT:    popl %esi1232; X86-BMI2-NEXT:    popl %edi1233; X86-BMI2-NEXT:    popl %ebx1234; X86-BMI2-NEXT:    retl1235;1236; X64-NOBMI-LABEL: bextr64_a3_load_indexzext:1237; X64-NOBMI:       # %bb.0:1238; X64-NOBMI-NEXT:    movl %esi, %ecx1239; X64-NOBMI-NEXT:    movq (%rdi), %rsi1240; X64-NOBMI-NEXT:    # kill: def $cl killed $cl killed $ecx1241; X64-NOBMI-NEXT:    shrq %cl, %rsi1242; X64-NOBMI-NEXT:    movl $1, %eax1243; X64-NOBMI-NEXT:    movl %edx, %ecx1244; X64-NOBMI-NEXT:    shlq %cl, %rax1245; X64-NOBMI-NEXT:    decq %rax1246; X64-NOBMI-NEXT:    andq %rsi, %rax1247; X64-NOBMI-NEXT:    retq1248;1249; X64-BMI1-LABEL: bextr64_a3_load_indexzext:1250; X64-BMI1:       # %bb.0:1251; X64-BMI1-NEXT:    # kill: def $edx killed $edx def $rdx1252; X64-BMI1-NEXT:    shll $8, %edx1253; X64-BMI1-NEXT:    orl %esi, %edx1254; X64-BMI1-NEXT:    bextrq %rdx, (%rdi), %rax1255; X64-BMI1-NEXT:    retq1256;1257; X64-BMI2-LABEL: bextr64_a3_load_indexzext:1258; X64-BMI2:       # %bb.0:1259; X64-BMI2-NEXT:    # kill: def $edx killed $edx def $rdx1260; X64-BMI2-NEXT:    # kill: def $esi killed $esi def $rsi1261; X64-BMI2-NEXT:    shrxq %rsi, (%rdi), %rax1262; X64-BMI2-NEXT:    bzhiq %rdx, %rax, %rax1263; X64-BMI2-NEXT:    retq1264  %val = load i64, ptr %w1265  %skip = zext i8 %numskipbits to i641266  %shifted = lshr i64 %val, %skip1267  %conv = zext i8 %numlowbits to i641268  %onebit = shl i64 1, %conv1269  %mask = add nsw i64 %onebit, -11270  %masked = and i64 %mask, %shifted1271  ret i64 %masked1272}1273 1274define i64 @bextr64_a4_commutative(i64 %val, i64 %numskipbits, i64 %numlowbits) nounwind {1275; X86-NOBMI-LABEL: bextr64_a4_commutative:1276; X86-NOBMI:       # %bb.0:1277; X86-NOBMI-NEXT:    pushl %edi1278; X86-NOBMI-NEXT:    pushl %esi1279; X86-NOBMI-NEXT:    movb {{[0-9]+}}(%esp), %ch1280; X86-NOBMI-NEXT:    movb {{[0-9]+}}(%esp), %cl1281; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %eax1282; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %esi1283; X86-NOBMI-NEXT:    movl %esi, %edx1284; X86-NOBMI-NEXT:    shrl %cl, %edx1285; X86-NOBMI-NEXT:    shrdl %cl, %esi, %eax1286; X86-NOBMI-NEXT:    testb $32, %cl1287; X86-NOBMI-NEXT:    je .LBB12_21288; X86-NOBMI-NEXT:  # %bb.1:1289; X86-NOBMI-NEXT:    movl %edx, %eax1290; X86-NOBMI-NEXT:    xorl %edx, %edx1291; X86-NOBMI-NEXT:  .LBB12_2:1292; X86-NOBMI-NEXT:    movl $1, %esi1293; X86-NOBMI-NEXT:    xorl %edi, %edi1294; X86-NOBMI-NEXT:    movb %ch, %cl1295; X86-NOBMI-NEXT:    shldl %cl, %esi, %edi1296; X86-NOBMI-NEXT:    shll %cl, %esi1297; X86-NOBMI-NEXT:    testb $32, %ch1298; X86-NOBMI-NEXT:    je .LBB12_41299; X86-NOBMI-NEXT:  # %bb.3:1300; X86-NOBMI-NEXT:    movl %esi, %edi1301; X86-NOBMI-NEXT:    xorl %esi, %esi1302; X86-NOBMI-NEXT:  .LBB12_4:1303; X86-NOBMI-NEXT:    addl $-1, %esi1304; X86-NOBMI-NEXT:    adcl $-1, %edi1305; X86-NOBMI-NEXT:    andl %esi, %eax1306; X86-NOBMI-NEXT:    andl %edi, %edx1307; X86-NOBMI-NEXT:    popl %esi1308; X86-NOBMI-NEXT:    popl %edi1309; X86-NOBMI-NEXT:    retl1310;1311; X86-BMI1-LABEL: bextr64_a4_commutative:1312; X86-BMI1:       # %bb.0:1313; X86-BMI1-NEXT:    pushl %edi1314; X86-BMI1-NEXT:    pushl %esi1315; X86-BMI1-NEXT:    movb {{[0-9]+}}(%esp), %ch1316; X86-BMI1-NEXT:    movb {{[0-9]+}}(%esp), %cl1317; X86-BMI1-NEXT:    movl {{[0-9]+}}(%esp), %eax1318; X86-BMI1-NEXT:    movl {{[0-9]+}}(%esp), %esi1319; X86-BMI1-NEXT:    movl %esi, %edx1320; X86-BMI1-NEXT:    shrl %cl, %edx1321; X86-BMI1-NEXT:    shrdl %cl, %esi, %eax1322; X86-BMI1-NEXT:    testb $32, %cl1323; X86-BMI1-NEXT:    je .LBB12_21324; X86-BMI1-NEXT:  # %bb.1:1325; X86-BMI1-NEXT:    movl %edx, %eax1326; X86-BMI1-NEXT:    xorl %edx, %edx1327; X86-BMI1-NEXT:  .LBB12_2:1328; X86-BMI1-NEXT:    movl $1, %esi1329; X86-BMI1-NEXT:    xorl %edi, %edi1330; X86-BMI1-NEXT:    movb %ch, %cl1331; X86-BMI1-NEXT:    shldl %cl, %esi, %edi1332; X86-BMI1-NEXT:    shll %cl, %esi1333; X86-BMI1-NEXT:    testb $32, %ch1334; X86-BMI1-NEXT:    je .LBB12_41335; X86-BMI1-NEXT:  # %bb.3:1336; X86-BMI1-NEXT:    movl %esi, %edi1337; X86-BMI1-NEXT:    xorl %esi, %esi1338; X86-BMI1-NEXT:  .LBB12_4:1339; X86-BMI1-NEXT:    addl $-1, %esi1340; X86-BMI1-NEXT:    adcl $-1, %edi1341; X86-BMI1-NEXT:    andl %esi, %eax1342; X86-BMI1-NEXT:    andl %edi, %edx1343; X86-BMI1-NEXT:    popl %esi1344; X86-BMI1-NEXT:    popl %edi1345; X86-BMI1-NEXT:    retl1346;1347; X86-BMI2-LABEL: bextr64_a4_commutative:1348; X86-BMI2:       # %bb.0:1349; X86-BMI2-NEXT:    pushl %ebx1350; X86-BMI2-NEXT:    pushl %edi1351; X86-BMI2-NEXT:    pushl %esi1352; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %ebx1353; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx1354; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %eax1355; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %edx1356; X86-BMI2-NEXT:    shrdl %cl, %edx, %eax1357; X86-BMI2-NEXT:    shrxl %ecx, %edx, %edx1358; X86-BMI2-NEXT:    testb $32, %cl1359; X86-BMI2-NEXT:    je .LBB12_21360; X86-BMI2-NEXT:  # %bb.1:1361; X86-BMI2-NEXT:    movl %edx, %eax1362; X86-BMI2-NEXT:    xorl %edx, %edx1363; X86-BMI2-NEXT:  .LBB12_2:1364; X86-BMI2-NEXT:    movl $1, %edi1365; X86-BMI2-NEXT:    xorl %esi, %esi1366; X86-BMI2-NEXT:    movl %ebx, %ecx1367; X86-BMI2-NEXT:    shldl %cl, %edi, %esi1368; X86-BMI2-NEXT:    shlxl %ebx, %edi, %ecx1369; X86-BMI2-NEXT:    testb $32, %bl1370; X86-BMI2-NEXT:    je .LBB12_41371; X86-BMI2-NEXT:  # %bb.3:1372; X86-BMI2-NEXT:    movl %ecx, %esi1373; X86-BMI2-NEXT:    xorl %ecx, %ecx1374; X86-BMI2-NEXT:  .LBB12_4:1375; X86-BMI2-NEXT:    addl $-1, %ecx1376; X86-BMI2-NEXT:    adcl $-1, %esi1377; X86-BMI2-NEXT:    andl %ecx, %eax1378; X86-BMI2-NEXT:    andl %esi, %edx1379; X86-BMI2-NEXT:    popl %esi1380; X86-BMI2-NEXT:    popl %edi1381; X86-BMI2-NEXT:    popl %ebx1382; X86-BMI2-NEXT:    retl1383;1384; X64-NOBMI-LABEL: bextr64_a4_commutative:1385; X64-NOBMI:       # %bb.0:1386; X64-NOBMI-NEXT:    movq %rsi, %rcx1387; X64-NOBMI-NEXT:    # kill: def $cl killed $cl killed $rcx1388; X64-NOBMI-NEXT:    shrq %cl, %rdi1389; X64-NOBMI-NEXT:    movl $1, %eax1390; X64-NOBMI-NEXT:    movl %edx, %ecx1391; X64-NOBMI-NEXT:    shlq %cl, %rax1392; X64-NOBMI-NEXT:    decq %rax1393; X64-NOBMI-NEXT:    andq %rdi, %rax1394; X64-NOBMI-NEXT:    retq1395;1396; X64-BMI1-LABEL: bextr64_a4_commutative:1397; X64-BMI1:       # %bb.0:1398; X64-BMI1-NEXT:    shll $8, %edx1399; X64-BMI1-NEXT:    movzbl %sil, %eax1400; X64-BMI1-NEXT:    orl %edx, %eax1401; X64-BMI1-NEXT:    bextrq %rax, %rdi, %rax1402; X64-BMI1-NEXT:    retq1403;1404; X64-BMI2-LABEL: bextr64_a4_commutative:1405; X64-BMI2:       # %bb.0:1406; X64-BMI2-NEXT:    shrxq %rsi, %rdi, %rax1407; X64-BMI2-NEXT:    bzhiq %rdx, %rax, %rax1408; X64-BMI2-NEXT:    retq1409  %shifted = lshr i64 %val, %numskipbits1410  %onebit = shl i64 1, %numlowbits1411  %mask = add nsw i64 %onebit, -11412  %masked = and i64 %shifted, %mask ; swapped order1413  ret i64 %masked1414}1415 1416define i64 @bextr64_a5_skipextrauses(i64 %val, i64 %numskipbits, i64 %numlowbits) nounwind {1417; X86-NOBMI-LABEL: bextr64_a5_skipextrauses:1418; X86-NOBMI:       # %bb.0:1419; X86-NOBMI-NEXT:    pushl %ebp1420; X86-NOBMI-NEXT:    pushl %ebx1421; X86-NOBMI-NEXT:    pushl %edi1422; X86-NOBMI-NEXT:    pushl %esi1423; X86-NOBMI-NEXT:    subl $12, %esp1424; X86-NOBMI-NEXT:    movzbl {{[0-9]+}}(%esp), %edx1425; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %ebx1426; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %esi1427; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %eax1428; X86-NOBMI-NEXT:    movl %esi, %ebp1429; X86-NOBMI-NEXT:    movl %eax, %ecx1430; X86-NOBMI-NEXT:    shrl %cl, %ebp1431; X86-NOBMI-NEXT:    shrdl %cl, %esi, %ebx1432; X86-NOBMI-NEXT:    testb $32, %al1433; X86-NOBMI-NEXT:    je .LBB13_21434; X86-NOBMI-NEXT:  # %bb.1:1435; X86-NOBMI-NEXT:    movl %ebp, %ebx1436; X86-NOBMI-NEXT:    xorl %ebp, %ebp1437; X86-NOBMI-NEXT:  .LBB13_2:1438; X86-NOBMI-NEXT:    movl $1, %esi1439; X86-NOBMI-NEXT:    xorl %edi, %edi1440; X86-NOBMI-NEXT:    movl %edx, %ecx1441; X86-NOBMI-NEXT:    shldl %cl, %esi, %edi1442; X86-NOBMI-NEXT:    shll %cl, %esi1443; X86-NOBMI-NEXT:    testb $32, %dl1444; X86-NOBMI-NEXT:    je .LBB13_41445; X86-NOBMI-NEXT:  # %bb.3:1446; X86-NOBMI-NEXT:    movl %esi, %edi1447; X86-NOBMI-NEXT:    xorl %esi, %esi1448; X86-NOBMI-NEXT:  .LBB13_4:1449; X86-NOBMI-NEXT:    addl $-1, %esi1450; X86-NOBMI-NEXT:    adcl $-1, %edi1451; X86-NOBMI-NEXT:    andl %ebx, %esi1452; X86-NOBMI-NEXT:    andl %ebp, %edi1453; X86-NOBMI-NEXT:    subl $8, %esp1454; X86-NOBMI-NEXT:    pushl {{[0-9]+}}(%esp)1455; X86-NOBMI-NEXT:    pushl %eax1456; X86-NOBMI-NEXT:    calll use64@PLT1457; X86-NOBMI-NEXT:    addl $16, %esp1458; X86-NOBMI-NEXT:    movl %esi, %eax1459; X86-NOBMI-NEXT:    movl %edi, %edx1460; X86-NOBMI-NEXT:    addl $12, %esp1461; X86-NOBMI-NEXT:    popl %esi1462; X86-NOBMI-NEXT:    popl %edi1463; X86-NOBMI-NEXT:    popl %ebx1464; X86-NOBMI-NEXT:    popl %ebp1465; X86-NOBMI-NEXT:    retl1466;1467; X86-BMI1-LABEL: bextr64_a5_skipextrauses:1468; X86-BMI1:       # %bb.0:1469; X86-BMI1-NEXT:    pushl %ebp1470; X86-BMI1-NEXT:    pushl %ebx1471; X86-BMI1-NEXT:    pushl %edi1472; X86-BMI1-NEXT:    pushl %esi1473; X86-BMI1-NEXT:    subl $12, %esp1474; X86-BMI1-NEXT:    movzbl {{[0-9]+}}(%esp), %edx1475; X86-BMI1-NEXT:    movl {{[0-9]+}}(%esp), %ebx1476; X86-BMI1-NEXT:    movl {{[0-9]+}}(%esp), %esi1477; X86-BMI1-NEXT:    movl {{[0-9]+}}(%esp), %eax1478; X86-BMI1-NEXT:    movl %esi, %ebp1479; X86-BMI1-NEXT:    movl %eax, %ecx1480; X86-BMI1-NEXT:    shrl %cl, %ebp1481; X86-BMI1-NEXT:    shrdl %cl, %esi, %ebx1482; X86-BMI1-NEXT:    testb $32, %al1483; X86-BMI1-NEXT:    je .LBB13_21484; X86-BMI1-NEXT:  # %bb.1:1485; X86-BMI1-NEXT:    movl %ebp, %ebx1486; X86-BMI1-NEXT:    xorl %ebp, %ebp1487; X86-BMI1-NEXT:  .LBB13_2:1488; X86-BMI1-NEXT:    movl $1, %esi1489; X86-BMI1-NEXT:    xorl %edi, %edi1490; X86-BMI1-NEXT:    movl %edx, %ecx1491; X86-BMI1-NEXT:    shldl %cl, %esi, %edi1492; X86-BMI1-NEXT:    shll %cl, %esi1493; X86-BMI1-NEXT:    testb $32, %dl1494; X86-BMI1-NEXT:    je .LBB13_41495; X86-BMI1-NEXT:  # %bb.3:1496; X86-BMI1-NEXT:    movl %esi, %edi1497; X86-BMI1-NEXT:    xorl %esi, %esi1498; X86-BMI1-NEXT:  .LBB13_4:1499; X86-BMI1-NEXT:    addl $-1, %esi1500; X86-BMI1-NEXT:    adcl $-1, %edi1501; X86-BMI1-NEXT:    andl %ebx, %esi1502; X86-BMI1-NEXT:    andl %ebp, %edi1503; X86-BMI1-NEXT:    subl $8, %esp1504; X86-BMI1-NEXT:    pushl {{[0-9]+}}(%esp)1505; X86-BMI1-NEXT:    pushl %eax1506; X86-BMI1-NEXT:    calll use64@PLT1507; X86-BMI1-NEXT:    addl $16, %esp1508; X86-BMI1-NEXT:    movl %esi, %eax1509; X86-BMI1-NEXT:    movl %edi, %edx1510; X86-BMI1-NEXT:    addl $12, %esp1511; X86-BMI1-NEXT:    popl %esi1512; X86-BMI1-NEXT:    popl %edi1513; X86-BMI1-NEXT:    popl %ebx1514; X86-BMI1-NEXT:    popl %ebp1515; X86-BMI1-NEXT:    retl1516;1517; X86-BMI2-LABEL: bextr64_a5_skipextrauses:1518; X86-BMI2:       # %bb.0:1519; X86-BMI2-NEXT:    pushl %ebp1520; X86-BMI2-NEXT:    pushl %ebx1521; X86-BMI2-NEXT:    pushl %edi1522; X86-BMI2-NEXT:    pushl %esi1523; X86-BMI2-NEXT:    subl $12, %esp1524; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %edx1525; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %ebx1526; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %esi1527; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %eax1528; X86-BMI2-NEXT:    movl %eax, %ecx1529; X86-BMI2-NEXT:    shrdl %cl, %esi, %ebx1530; X86-BMI2-NEXT:    shrxl %eax, %esi, %ebp1531; X86-BMI2-NEXT:    testb $32, %al1532; X86-BMI2-NEXT:    je .LBB13_21533; X86-BMI2-NEXT:  # %bb.1:1534; X86-BMI2-NEXT:    movl %ebp, %ebx1535; X86-BMI2-NEXT:    xorl %ebp, %ebp1536; X86-BMI2-NEXT:  .LBB13_2:1537; X86-BMI2-NEXT:    movl $1, %edi1538; X86-BMI2-NEXT:    xorl %esi, %esi1539; X86-BMI2-NEXT:    movl %edx, %ecx1540; X86-BMI2-NEXT:    shldl %cl, %edi, %esi1541; X86-BMI2-NEXT:    shlxl %edx, %edi, %edi1542; X86-BMI2-NEXT:    testb $32, %dl1543; X86-BMI2-NEXT:    je .LBB13_41544; X86-BMI2-NEXT:  # %bb.3:1545; X86-BMI2-NEXT:    movl %edi, %esi1546; X86-BMI2-NEXT:    xorl %edi, %edi1547; X86-BMI2-NEXT:  .LBB13_4:1548; X86-BMI2-NEXT:    addl $-1, %edi1549; X86-BMI2-NEXT:    adcl $-1, %esi1550; X86-BMI2-NEXT:    andl %ebx, %edi1551; X86-BMI2-NEXT:    andl %ebp, %esi1552; X86-BMI2-NEXT:    subl $8, %esp1553; X86-BMI2-NEXT:    pushl {{[0-9]+}}(%esp)1554; X86-BMI2-NEXT:    pushl %eax1555; X86-BMI2-NEXT:    calll use64@PLT1556; X86-BMI2-NEXT:    addl $16, %esp1557; X86-BMI2-NEXT:    movl %edi, %eax1558; X86-BMI2-NEXT:    movl %esi, %edx1559; X86-BMI2-NEXT:    addl $12, %esp1560; X86-BMI2-NEXT:    popl %esi1561; X86-BMI2-NEXT:    popl %edi1562; X86-BMI2-NEXT:    popl %ebx1563; X86-BMI2-NEXT:    popl %ebp1564; X86-BMI2-NEXT:    retl1565;1566; X64-NOBMI-LABEL: bextr64_a5_skipextrauses:1567; X64-NOBMI:       # %bb.0:1568; X64-NOBMI-NEXT:    pushq %rbx1569; X64-NOBMI-NEXT:    movl %esi, %ecx1570; X64-NOBMI-NEXT:    shrq %cl, %rdi1571; X64-NOBMI-NEXT:    movl $1, %ebx1572; X64-NOBMI-NEXT:    movl %edx, %ecx1573; X64-NOBMI-NEXT:    shlq %cl, %rbx1574; X64-NOBMI-NEXT:    decq %rbx1575; X64-NOBMI-NEXT:    andq %rdi, %rbx1576; X64-NOBMI-NEXT:    movq %rsi, %rdi1577; X64-NOBMI-NEXT:    callq use64@PLT1578; X64-NOBMI-NEXT:    movq %rbx, %rax1579; X64-NOBMI-NEXT:    popq %rbx1580; X64-NOBMI-NEXT:    retq1581;1582; X64-BMI1-LABEL: bextr64_a5_skipextrauses:1583; X64-BMI1:       # %bb.0:1584; X64-BMI1-NEXT:    pushq %rbx1585; X64-BMI1-NEXT:    shll $8, %edx1586; X64-BMI1-NEXT:    movzbl %sil, %eax1587; X64-BMI1-NEXT:    orl %edx, %eax1588; X64-BMI1-NEXT:    bextrq %rax, %rdi, %rbx1589; X64-BMI1-NEXT:    movq %rsi, %rdi1590; X64-BMI1-NEXT:    callq use64@PLT1591; X64-BMI1-NEXT:    movq %rbx, %rax1592; X64-BMI1-NEXT:    popq %rbx1593; X64-BMI1-NEXT:    retq1594;1595; X64-BMI2-LABEL: bextr64_a5_skipextrauses:1596; X64-BMI2:       # %bb.0:1597; X64-BMI2-NEXT:    pushq %rbx1598; X64-BMI2-NEXT:    shrxq %rsi, %rdi, %rax1599; X64-BMI2-NEXT:    bzhiq %rdx, %rax, %rbx1600; X64-BMI2-NEXT:    movq %rsi, %rdi1601; X64-BMI2-NEXT:    callq use64@PLT1602; X64-BMI2-NEXT:    movq %rbx, %rax1603; X64-BMI2-NEXT:    popq %rbx1604; X64-BMI2-NEXT:    retq1605  %shifted = lshr i64 %val, %numskipbits1606  %onebit = shl i64 1, %numlowbits1607  %mask = add nsw i64 %onebit, -11608  %masked = and i64 %mask, %shifted1609  call void @use64(i64 %numskipbits)1610  ret i64 %masked1611}1612 1613; 64-bit, but with 32-bit output1614 1615; Everything done in 64-bit, truncation happens last.1616define i32 @bextr64_32_a0(i64 %val, i64 %numskipbits, i64 %numlowbits) nounwind {1617; X86-NOBMI-LABEL: bextr64_32_a0:1618; X86-NOBMI:       # %bb.0:1619; X86-NOBMI-NEXT:    pushl %edi1620; X86-NOBMI-NEXT:    pushl %esi1621; X86-NOBMI-NEXT:    movzbl {{[0-9]+}}(%esp), %edx1622; X86-NOBMI-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx1623; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %eax1624; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %edi1625; X86-NOBMI-NEXT:    movl %edi, %esi1626; X86-NOBMI-NEXT:    shrl %cl, %esi1627; X86-NOBMI-NEXT:    shrdl %cl, %edi, %eax1628; X86-NOBMI-NEXT:    testb $32, %cl1629; X86-NOBMI-NEXT:    jne .LBB14_21630; X86-NOBMI-NEXT:  # %bb.1:1631; X86-NOBMI-NEXT:    movl %eax, %esi1632; X86-NOBMI-NEXT:  .LBB14_2:1633; X86-NOBMI-NEXT:    movl $1, %edi1634; X86-NOBMI-NEXT:    movl %edx, %ecx1635; X86-NOBMI-NEXT:    shll %cl, %edi1636; X86-NOBMI-NEXT:    xorl %eax, %eax1637; X86-NOBMI-NEXT:    testb $32, %dl1638; X86-NOBMI-NEXT:    jne .LBB14_41639; X86-NOBMI-NEXT:  # %bb.3:1640; X86-NOBMI-NEXT:    movl %edi, %eax1641; X86-NOBMI-NEXT:  .LBB14_4:1642; X86-NOBMI-NEXT:    decl %eax1643; X86-NOBMI-NEXT:    andl %esi, %eax1644; X86-NOBMI-NEXT:    popl %esi1645; X86-NOBMI-NEXT:    popl %edi1646; X86-NOBMI-NEXT:    retl1647;1648; X86-BMI1-LABEL: bextr64_32_a0:1649; X86-BMI1:       # %bb.0:1650; X86-BMI1-NEXT:    pushl %edi1651; X86-BMI1-NEXT:    pushl %esi1652; X86-BMI1-NEXT:    movzbl {{[0-9]+}}(%esp), %edx1653; X86-BMI1-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx1654; X86-BMI1-NEXT:    movl {{[0-9]+}}(%esp), %eax1655; X86-BMI1-NEXT:    movl {{[0-9]+}}(%esp), %edi1656; X86-BMI1-NEXT:    movl %edi, %esi1657; X86-BMI1-NEXT:    shrl %cl, %esi1658; X86-BMI1-NEXT:    shrdl %cl, %edi, %eax1659; X86-BMI1-NEXT:    testb $32, %cl1660; X86-BMI1-NEXT:    jne .LBB14_21661; X86-BMI1-NEXT:  # %bb.1:1662; X86-BMI1-NEXT:    movl %eax, %esi1663; X86-BMI1-NEXT:  .LBB14_2:1664; X86-BMI1-NEXT:    movl $1, %edi1665; X86-BMI1-NEXT:    movl %edx, %ecx1666; X86-BMI1-NEXT:    shll %cl, %edi1667; X86-BMI1-NEXT:    xorl %eax, %eax1668; X86-BMI1-NEXT:    testb $32, %dl1669; X86-BMI1-NEXT:    jne .LBB14_41670; X86-BMI1-NEXT:  # %bb.3:1671; X86-BMI1-NEXT:    movl %edi, %eax1672; X86-BMI1-NEXT:  .LBB14_4:1673; X86-BMI1-NEXT:    decl %eax1674; X86-BMI1-NEXT:    andl %esi, %eax1675; X86-BMI1-NEXT:    popl %esi1676; X86-BMI1-NEXT:    popl %edi1677; X86-BMI1-NEXT:    retl1678;1679; X86-BMI2-LABEL: bextr64_32_a0:1680; X86-BMI2:       # %bb.0:1681; X86-BMI2-NEXT:    pushl %ebx1682; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %ebx1683; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx1684; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %edx1685; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %eax1686; X86-BMI2-NEXT:    shrdl %cl, %eax, %edx1687; X86-BMI2-NEXT:    testb $32, %cl1688; X86-BMI2-NEXT:    je .LBB14_21689; X86-BMI2-NEXT:  # %bb.1:1690; X86-BMI2-NEXT:    shrxl %ecx, %eax, %edx1691; X86-BMI2-NEXT:  .LBB14_2:1692; X86-BMI2-NEXT:    xorl %eax, %eax1693; X86-BMI2-NEXT:    testb $32, %bl1694; X86-BMI2-NEXT:    jne .LBB14_41695; X86-BMI2-NEXT:  # %bb.3:1696; X86-BMI2-NEXT:    movl $1, %eax1697; X86-BMI2-NEXT:    shlxl %ebx, %eax, %eax1698; X86-BMI2-NEXT:  .LBB14_4:1699; X86-BMI2-NEXT:    decl %eax1700; X86-BMI2-NEXT:    andl %edx, %eax1701; X86-BMI2-NEXT:    popl %ebx1702; X86-BMI2-NEXT:    retl1703;1704; X64-NOBMI-LABEL: bextr64_32_a0:1705; X64-NOBMI:       # %bb.0:1706; X64-NOBMI-NEXT:    movq %rsi, %rcx1707; X64-NOBMI-NEXT:    # kill: def $cl killed $cl killed $rcx1708; X64-NOBMI-NEXT:    shrq %cl, %rdi1709; X64-NOBMI-NEXT:    movl $1, %eax1710; X64-NOBMI-NEXT:    movl %edx, %ecx1711; X64-NOBMI-NEXT:    shlq %cl, %rax1712; X64-NOBMI-NEXT:    decl %eax1713; X64-NOBMI-NEXT:    andl %edi, %eax1714; X64-NOBMI-NEXT:    # kill: def $eax killed $eax killed $rax1715; X64-NOBMI-NEXT:    retq1716;1717; X64-BMI1-LABEL: bextr64_32_a0:1718; X64-BMI1:       # %bb.0:1719; X64-BMI1-NEXT:    shll $8, %edx1720; X64-BMI1-NEXT:    movzbl %sil, %eax1721; X64-BMI1-NEXT:    orl %edx, %eax1722; X64-BMI1-NEXT:    bextrq %rax, %rdi, %rax1723; X64-BMI1-NEXT:    # kill: def $eax killed $eax killed $rax1724; X64-BMI1-NEXT:    retq1725;1726; X64-BMI2-LABEL: bextr64_32_a0:1727; X64-BMI2:       # %bb.0:1728; X64-BMI2-NEXT:    shrxq %rsi, %rdi, %rax1729; X64-BMI2-NEXT:    bzhil %edx, %eax, %eax1730; X64-BMI2-NEXT:    retq1731  %shifted = lshr i64 %val, %numskipbits1732  %onebit = shl i64 1, %numlowbits1733  %mask = add nsw i64 %onebit, -11734  %masked = and i64 %mask, %shifted1735  %res = trunc i64 %masked to i321736  ret i32 %res1737}1738 1739; Shifting happens in 64-bit, then truncation. Masking is 32-bit.1740define i32 @bextr64_32_a1(i64 %val, i64 %numskipbits, i32 %numlowbits) nounwind {1741; X86-NOBMI-LABEL: bextr64_32_a1:1742; X86-NOBMI:       # %bb.0:1743; X86-NOBMI-NEXT:    pushl %edi1744; X86-NOBMI-NEXT:    pushl %esi1745; X86-NOBMI-NEXT:    movzbl {{[0-9]+}}(%esp), %edx1746; X86-NOBMI-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx1747; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %eax1748; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %edi1749; X86-NOBMI-NEXT:    movl %edi, %esi1750; X86-NOBMI-NEXT:    shrl %cl, %esi1751; X86-NOBMI-NEXT:    shrdl %cl, %edi, %eax1752; X86-NOBMI-NEXT:    testb $32, %cl1753; X86-NOBMI-NEXT:    jne .LBB15_21754; X86-NOBMI-NEXT:  # %bb.1:1755; X86-NOBMI-NEXT:    movl %eax, %esi1756; X86-NOBMI-NEXT:  .LBB15_2:1757; X86-NOBMI-NEXT:    movl $1, %eax1758; X86-NOBMI-NEXT:    movl %edx, %ecx1759; X86-NOBMI-NEXT:    shll %cl, %eax1760; X86-NOBMI-NEXT:    decl %eax1761; X86-NOBMI-NEXT:    andl %esi, %eax1762; X86-NOBMI-NEXT:    popl %esi1763; X86-NOBMI-NEXT:    popl %edi1764; X86-NOBMI-NEXT:    retl1765;1766; X86-BMI1-LABEL: bextr64_32_a1:1767; X86-BMI1:       # %bb.0:1768; X86-BMI1-NEXT:    pushl %edi1769; X86-BMI1-NEXT:    pushl %esi1770; X86-BMI1-NEXT:    movzbl {{[0-9]+}}(%esp), %eax1771; X86-BMI1-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx1772; X86-BMI1-NEXT:    movl {{[0-9]+}}(%esp), %esi1773; X86-BMI1-NEXT:    movl {{[0-9]+}}(%esp), %edi1774; X86-BMI1-NEXT:    movl %edi, %edx1775; X86-BMI1-NEXT:    shrl %cl, %edx1776; X86-BMI1-NEXT:    shrdl %cl, %edi, %esi1777; X86-BMI1-NEXT:    testb $32, %cl1778; X86-BMI1-NEXT:    jne .LBB15_21779; X86-BMI1-NEXT:  # %bb.1:1780; X86-BMI1-NEXT:    movl %esi, %edx1781; X86-BMI1-NEXT:  .LBB15_2:1782; X86-BMI1-NEXT:    shll $8, %eax1783; X86-BMI1-NEXT:    bextrl %eax, %edx, %eax1784; X86-BMI1-NEXT:    popl %esi1785; X86-BMI1-NEXT:    popl %edi1786; X86-BMI1-NEXT:    retl1787;1788; X86-BMI2-LABEL: bextr64_32_a1:1789; X86-BMI2:       # %bb.0:1790; X86-BMI2-NEXT:    pushl %esi1791; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %eax1792; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx1793; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %edx1794; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %esi1795; X86-BMI2-NEXT:    shrdl %cl, %esi, %edx1796; X86-BMI2-NEXT:    testb $32, %cl1797; X86-BMI2-NEXT:    je .LBB15_21798; X86-BMI2-NEXT:  # %bb.1:1799; X86-BMI2-NEXT:    shrxl %ecx, %esi, %edx1800; X86-BMI2-NEXT:  .LBB15_2:1801; X86-BMI2-NEXT:    bzhil %eax, %edx, %eax1802; X86-BMI2-NEXT:    popl %esi1803; X86-BMI2-NEXT:    retl1804;1805; X64-NOBMI-LABEL: bextr64_32_a1:1806; X64-NOBMI:       # %bb.0:1807; X64-NOBMI-NEXT:    movq %rsi, %rcx1808; X64-NOBMI-NEXT:    # kill: def $cl killed $cl killed $rcx1809; X64-NOBMI-NEXT:    shrq %cl, %rdi1810; X64-NOBMI-NEXT:    movl $1, %eax1811; X64-NOBMI-NEXT:    movl %edx, %ecx1812; X64-NOBMI-NEXT:    shll %cl, %eax1813; X64-NOBMI-NEXT:    decl %eax1814; X64-NOBMI-NEXT:    andl %edi, %eax1815; X64-NOBMI-NEXT:    retq1816;1817; X64-BMI1-LABEL: bextr64_32_a1:1818; X64-BMI1:       # %bb.0:1819; X64-BMI1-NEXT:    shll $8, %edx1820; X64-BMI1-NEXT:    movzbl %sil, %eax1821; X64-BMI1-NEXT:    orl %edx, %eax1822; X64-BMI1-NEXT:    bextrq %rax, %rdi, %rax1823; X64-BMI1-NEXT:    # kill: def $eax killed $eax killed $rax1824; X64-BMI1-NEXT:    retq1825;1826; X64-BMI2-LABEL: bextr64_32_a1:1827; X64-BMI2:       # %bb.0:1828; X64-BMI2-NEXT:    shrxq %rsi, %rdi, %rax1829; X64-BMI2-NEXT:    bzhil %edx, %eax, %eax1830; X64-BMI2-NEXT:    retq1831  %shifted = lshr i64 %val, %numskipbits1832  %truncshifted = trunc i64 %shifted to i321833  %onebit = shl i32 1, %numlowbits1834  %mask = add nsw i32 %onebit, -11835  %masked = and i32 %mask, %truncshifted1836  ret i32 %masked1837}1838 1839; Shifting happens in 64-bit, then truncation (with extra use).1840; Masking is 32-bit.1841define i32 @bextr64_32_a1_trunc_extrause(i64 %val, i64 %numskipbits, i32 %numlowbits) nounwind {1842; X86-NOBMI-LABEL: bextr64_32_a1_trunc_extrause:1843; X86-NOBMI:       # %bb.0:1844; X86-NOBMI-NEXT:    pushl %ebx1845; X86-NOBMI-NEXT:    pushl %esi1846; X86-NOBMI-NEXT:    pushl %eax1847; X86-NOBMI-NEXT:    movzbl {{[0-9]+}}(%esp), %ebx1848; X86-NOBMI-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx1849; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %eax1850; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %edx1851; X86-NOBMI-NEXT:    movl %edx, %esi1852; X86-NOBMI-NEXT:    shrl %cl, %esi1853; X86-NOBMI-NEXT:    shrdl %cl, %edx, %eax1854; X86-NOBMI-NEXT:    testb $32, %cl1855; X86-NOBMI-NEXT:    jne .LBB16_21856; X86-NOBMI-NEXT:  # %bb.1:1857; X86-NOBMI-NEXT:    movl %eax, %esi1858; X86-NOBMI-NEXT:  .LBB16_2:1859; X86-NOBMI-NEXT:    movl %esi, (%esp)1860; X86-NOBMI-NEXT:    calll use32@PLT1861; X86-NOBMI-NEXT:    movl $1, %eax1862; X86-NOBMI-NEXT:    movl %ebx, %ecx1863; X86-NOBMI-NEXT:    shll %cl, %eax1864; X86-NOBMI-NEXT:    decl %eax1865; X86-NOBMI-NEXT:    andl %esi, %eax1866; X86-NOBMI-NEXT:    addl $4, %esp1867; X86-NOBMI-NEXT:    popl %esi1868; X86-NOBMI-NEXT:    popl %ebx1869; X86-NOBMI-NEXT:    retl1870;1871; X86-BMI1-LABEL: bextr64_32_a1_trunc_extrause:1872; X86-BMI1:       # %bb.0:1873; X86-BMI1-NEXT:    pushl %ebx1874; X86-BMI1-NEXT:    pushl %esi1875; X86-BMI1-NEXT:    pushl %eax1876; X86-BMI1-NEXT:    movzbl {{[0-9]+}}(%esp), %ebx1877; X86-BMI1-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx1878; X86-BMI1-NEXT:    movl {{[0-9]+}}(%esp), %eax1879; X86-BMI1-NEXT:    movl {{[0-9]+}}(%esp), %edx1880; X86-BMI1-NEXT:    movl %edx, %esi1881; X86-BMI1-NEXT:    shrl %cl, %esi1882; X86-BMI1-NEXT:    shrdl %cl, %edx, %eax1883; X86-BMI1-NEXT:    testb $32, %cl1884; X86-BMI1-NEXT:    jne .LBB16_21885; X86-BMI1-NEXT:  # %bb.1:1886; X86-BMI1-NEXT:    movl %eax, %esi1887; X86-BMI1-NEXT:  .LBB16_2:1888; X86-BMI1-NEXT:    movl %esi, (%esp)1889; X86-BMI1-NEXT:    calll use32@PLT1890; X86-BMI1-NEXT:    shll $8, %ebx1891; X86-BMI1-NEXT:    bextrl %ebx, %esi, %eax1892; X86-BMI1-NEXT:    addl $4, %esp1893; X86-BMI1-NEXT:    popl %esi1894; X86-BMI1-NEXT:    popl %ebx1895; X86-BMI1-NEXT:    retl1896;1897; X86-BMI2-LABEL: bextr64_32_a1_trunc_extrause:1898; X86-BMI2:       # %bb.0:1899; X86-BMI2-NEXT:    pushl %ebx1900; X86-BMI2-NEXT:    pushl %esi1901; X86-BMI2-NEXT:    pushl %eax1902; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %ebx1903; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx1904; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %esi1905; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %eax1906; X86-BMI2-NEXT:    shrdl %cl, %eax, %esi1907; X86-BMI2-NEXT:    testb $32, %cl1908; X86-BMI2-NEXT:    je .LBB16_21909; X86-BMI2-NEXT:  # %bb.1:1910; X86-BMI2-NEXT:    shrxl %ecx, %eax, %esi1911; X86-BMI2-NEXT:  .LBB16_2:1912; X86-BMI2-NEXT:    movl %esi, (%esp)1913; X86-BMI2-NEXT:    calll use32@PLT1914; X86-BMI2-NEXT:    bzhil %ebx, %esi, %eax1915; X86-BMI2-NEXT:    addl $4, %esp1916; X86-BMI2-NEXT:    popl %esi1917; X86-BMI2-NEXT:    popl %ebx1918; X86-BMI2-NEXT:    retl1919;1920; X64-NOBMI-LABEL: bextr64_32_a1_trunc_extrause:1921; X64-NOBMI:       # %bb.0:1922; X64-NOBMI-NEXT:    pushq %r141923; X64-NOBMI-NEXT:    pushq %rbx1924; X64-NOBMI-NEXT:    pushq %rax1925; X64-NOBMI-NEXT:    movl %edx, %ebx1926; X64-NOBMI-NEXT:    movq %rsi, %rcx1927; X64-NOBMI-NEXT:    movq %rdi, %r141928; X64-NOBMI-NEXT:    # kill: def $cl killed $cl killed $rcx1929; X64-NOBMI-NEXT:    shrq %cl, %r141930; X64-NOBMI-NEXT:    movl %r14d, %edi1931; X64-NOBMI-NEXT:    callq use32@PLT1932; X64-NOBMI-NEXT:    movl $1, %eax1933; X64-NOBMI-NEXT:    movl %ebx, %ecx1934; X64-NOBMI-NEXT:    shll %cl, %eax1935; X64-NOBMI-NEXT:    decl %eax1936; X64-NOBMI-NEXT:    andl %r14d, %eax1937; X64-NOBMI-NEXT:    addq $8, %rsp1938; X64-NOBMI-NEXT:    popq %rbx1939; X64-NOBMI-NEXT:    popq %r141940; X64-NOBMI-NEXT:    retq1941;1942; X64-BMI1-LABEL: bextr64_32_a1_trunc_extrause:1943; X64-BMI1:       # %bb.0:1944; X64-BMI1-NEXT:    pushq %r141945; X64-BMI1-NEXT:    pushq %rbx1946; X64-BMI1-NEXT:    pushq %rax1947; X64-BMI1-NEXT:    movl %edx, %ebx1948; X64-BMI1-NEXT:    movq %rsi, %rcx1949; X64-BMI1-NEXT:    movq %rdi, %r141950; X64-BMI1-NEXT:    # kill: def $cl killed $cl killed $rcx1951; X64-BMI1-NEXT:    shrq %cl, %r141952; X64-BMI1-NEXT:    movl %r14d, %edi1953; X64-BMI1-NEXT:    callq use32@PLT1954; X64-BMI1-NEXT:    shll $8, %ebx1955; X64-BMI1-NEXT:    bextrl %ebx, %r14d, %eax1956; X64-BMI1-NEXT:    addq $8, %rsp1957; X64-BMI1-NEXT:    popq %rbx1958; X64-BMI1-NEXT:    popq %r141959; X64-BMI1-NEXT:    retq1960;1961; X64-BMI2-LABEL: bextr64_32_a1_trunc_extrause:1962; X64-BMI2:       # %bb.0:1963; X64-BMI2-NEXT:    pushq %r141964; X64-BMI2-NEXT:    pushq %rbx1965; X64-BMI2-NEXT:    pushq %rax1966; X64-BMI2-NEXT:    movl %edx, %ebx1967; X64-BMI2-NEXT:    shrxq %rsi, %rdi, %r141968; X64-BMI2-NEXT:    movl %r14d, %edi1969; X64-BMI2-NEXT:    callq use32@PLT1970; X64-BMI2-NEXT:    bzhil %ebx, %r14d, %eax1971; X64-BMI2-NEXT:    addq $8, %rsp1972; X64-BMI2-NEXT:    popq %rbx1973; X64-BMI2-NEXT:    popq %r141974; X64-BMI2-NEXT:    retq1975  %shifted = lshr i64 %val, %numskipbits1976  %truncshifted = trunc i64 %shifted to i321977  call void @use32(i32 %truncshifted)1978  %onebit = shl i32 1, %numlowbits1979  %mask = add nsw i32 %onebit, -11980  %masked = and i32 %mask, %truncshifted1981  ret i32 %masked1982}1983 1984; Shifting happens in 64-bit. Mask is 32-bit, but extended to 64-bit.1985; Masking is 64-bit. Then truncation.1986define i32 @bextr64_32_a2(i64 %val, i64 %numskipbits, i32 %numlowbits) nounwind {1987; X86-NOBMI-LABEL: bextr64_32_a2:1988; X86-NOBMI:       # %bb.0:1989; X86-NOBMI-NEXT:    pushl %edi1990; X86-NOBMI-NEXT:    pushl %esi1991; X86-NOBMI-NEXT:    movzbl {{[0-9]+}}(%esp), %edx1992; X86-NOBMI-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx1993; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %eax1994; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %edi1995; X86-NOBMI-NEXT:    movl %edi, %esi1996; X86-NOBMI-NEXT:    shrl %cl, %esi1997; X86-NOBMI-NEXT:    shrdl %cl, %edi, %eax1998; X86-NOBMI-NEXT:    testb $32, %cl1999; X86-NOBMI-NEXT:    jne .LBB17_22000; X86-NOBMI-NEXT:  # %bb.1:2001; X86-NOBMI-NEXT:    movl %eax, %esi2002; X86-NOBMI-NEXT:  .LBB17_2:2003; X86-NOBMI-NEXT:    movl $1, %eax2004; X86-NOBMI-NEXT:    movl %edx, %ecx2005; X86-NOBMI-NEXT:    shll %cl, %eax2006; X86-NOBMI-NEXT:    decl %eax2007; X86-NOBMI-NEXT:    andl %esi, %eax2008; X86-NOBMI-NEXT:    popl %esi2009; X86-NOBMI-NEXT:    popl %edi2010; X86-NOBMI-NEXT:    retl2011;2012; X86-BMI1-LABEL: bextr64_32_a2:2013; X86-BMI1:       # %bb.0:2014; X86-BMI1-NEXT:    pushl %edi2015; X86-BMI1-NEXT:    pushl %esi2016; X86-BMI1-NEXT:    movzbl {{[0-9]+}}(%esp), %eax2017; X86-BMI1-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx2018; X86-BMI1-NEXT:    movl {{[0-9]+}}(%esp), %esi2019; X86-BMI1-NEXT:    movl {{[0-9]+}}(%esp), %edi2020; X86-BMI1-NEXT:    movl %edi, %edx2021; X86-BMI1-NEXT:    shrl %cl, %edx2022; X86-BMI1-NEXT:    shrdl %cl, %edi, %esi2023; X86-BMI1-NEXT:    testb $32, %cl2024; X86-BMI1-NEXT:    jne .LBB17_22025; X86-BMI1-NEXT:  # %bb.1:2026; X86-BMI1-NEXT:    movl %esi, %edx2027; X86-BMI1-NEXT:  .LBB17_2:2028; X86-BMI1-NEXT:    shll $8, %eax2029; X86-BMI1-NEXT:    bextrl %eax, %edx, %eax2030; X86-BMI1-NEXT:    popl %esi2031; X86-BMI1-NEXT:    popl %edi2032; X86-BMI1-NEXT:    retl2033;2034; X86-BMI2-LABEL: bextr64_32_a2:2035; X86-BMI2:       # %bb.0:2036; X86-BMI2-NEXT:    pushl %esi2037; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %eax2038; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx2039; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %edx2040; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %esi2041; X86-BMI2-NEXT:    shrdl %cl, %esi, %edx2042; X86-BMI2-NEXT:    testb $32, %cl2043; X86-BMI2-NEXT:    je .LBB17_22044; X86-BMI2-NEXT:  # %bb.1:2045; X86-BMI2-NEXT:    shrxl %ecx, %esi, %edx2046; X86-BMI2-NEXT:  .LBB17_2:2047; X86-BMI2-NEXT:    bzhil %eax, %edx, %eax2048; X86-BMI2-NEXT:    popl %esi2049; X86-BMI2-NEXT:    retl2050;2051; X64-NOBMI-LABEL: bextr64_32_a2:2052; X64-NOBMI:       # %bb.0:2053; X64-NOBMI-NEXT:    movq %rsi, %rcx2054; X64-NOBMI-NEXT:    # kill: def $cl killed $cl killed $rcx2055; X64-NOBMI-NEXT:    shrq %cl, %rdi2056; X64-NOBMI-NEXT:    movl $1, %eax2057; X64-NOBMI-NEXT:    movl %edx, %ecx2058; X64-NOBMI-NEXT:    shll %cl, %eax2059; X64-NOBMI-NEXT:    decl %eax2060; X64-NOBMI-NEXT:    andl %edi, %eax2061; X64-NOBMI-NEXT:    retq2062;2063; X64-BMI1-LABEL: bextr64_32_a2:2064; X64-BMI1:       # %bb.0:2065; X64-BMI1-NEXT:    shll $8, %edx2066; X64-BMI1-NEXT:    movzbl %sil, %eax2067; X64-BMI1-NEXT:    orl %edx, %eax2068; X64-BMI1-NEXT:    bextrq %rax, %rdi, %rax2069; X64-BMI1-NEXT:    # kill: def $eax killed $eax killed $rax2070; X64-BMI1-NEXT:    retq2071;2072; X64-BMI2-LABEL: bextr64_32_a2:2073; X64-BMI2:       # %bb.0:2074; X64-BMI2-NEXT:    shrxq %rsi, %rdi, %rax2075; X64-BMI2-NEXT:    bzhil %edx, %eax, %eax2076; X64-BMI2-NEXT:    retq2077  %shifted = lshr i64 %val, %numskipbits2078  %onebit = shl i32 1, %numlowbits2079  %mask = add nsw i32 %onebit, -12080  %zextmask = zext i32 %mask to i642081  %masked = and i64 %zextmask, %shifted2082  %truncmasked = trunc i64 %masked to i322083  ret i32 %truncmasked2084}2085 2086; Shifting happens in 64-bit. Mask is 32-bit, but calculated in 64-bit.2087; Masking is 64-bit. Then truncation.2088define i32 @bextr64_32_a3(i64 %val, i64 %numskipbits, i64 %numlowbits) nounwind {2089; X86-NOBMI-LABEL: bextr64_32_a3:2090; X86-NOBMI:       # %bb.0:2091; X86-NOBMI-NEXT:    pushl %edi2092; X86-NOBMI-NEXT:    pushl %esi2093; X86-NOBMI-NEXT:    movzbl {{[0-9]+}}(%esp), %edx2094; X86-NOBMI-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx2095; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %eax2096; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %edi2097; X86-NOBMI-NEXT:    movl %edi, %esi2098; X86-NOBMI-NEXT:    shrl %cl, %esi2099; X86-NOBMI-NEXT:    shrdl %cl, %edi, %eax2100; X86-NOBMI-NEXT:    testb $32, %cl2101; X86-NOBMI-NEXT:    jne .LBB18_22102; X86-NOBMI-NEXT:  # %bb.1:2103; X86-NOBMI-NEXT:    movl %eax, %esi2104; X86-NOBMI-NEXT:  .LBB18_2:2105; X86-NOBMI-NEXT:    movl $1, %edi2106; X86-NOBMI-NEXT:    movl %edx, %ecx2107; X86-NOBMI-NEXT:    shll %cl, %edi2108; X86-NOBMI-NEXT:    xorl %eax, %eax2109; X86-NOBMI-NEXT:    testb $32, %dl2110; X86-NOBMI-NEXT:    jne .LBB18_42111; X86-NOBMI-NEXT:  # %bb.3:2112; X86-NOBMI-NEXT:    movl %edi, %eax2113; X86-NOBMI-NEXT:  .LBB18_4:2114; X86-NOBMI-NEXT:    decl %eax2115; X86-NOBMI-NEXT:    andl %esi, %eax2116; X86-NOBMI-NEXT:    popl %esi2117; X86-NOBMI-NEXT:    popl %edi2118; X86-NOBMI-NEXT:    retl2119;2120; X86-BMI1-LABEL: bextr64_32_a3:2121; X86-BMI1:       # %bb.0:2122; X86-BMI1-NEXT:    pushl %edi2123; X86-BMI1-NEXT:    pushl %esi2124; X86-BMI1-NEXT:    movzbl {{[0-9]+}}(%esp), %edx2125; X86-BMI1-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx2126; X86-BMI1-NEXT:    movl {{[0-9]+}}(%esp), %eax2127; X86-BMI1-NEXT:    movl {{[0-9]+}}(%esp), %edi2128; X86-BMI1-NEXT:    movl %edi, %esi2129; X86-BMI1-NEXT:    shrl %cl, %esi2130; X86-BMI1-NEXT:    shrdl %cl, %edi, %eax2131; X86-BMI1-NEXT:    testb $32, %cl2132; X86-BMI1-NEXT:    jne .LBB18_22133; X86-BMI1-NEXT:  # %bb.1:2134; X86-BMI1-NEXT:    movl %eax, %esi2135; X86-BMI1-NEXT:  .LBB18_2:2136; X86-BMI1-NEXT:    movl $1, %edi2137; X86-BMI1-NEXT:    movl %edx, %ecx2138; X86-BMI1-NEXT:    shll %cl, %edi2139; X86-BMI1-NEXT:    xorl %eax, %eax2140; X86-BMI1-NEXT:    testb $32, %dl2141; X86-BMI1-NEXT:    jne .LBB18_42142; X86-BMI1-NEXT:  # %bb.3:2143; X86-BMI1-NEXT:    movl %edi, %eax2144; X86-BMI1-NEXT:  .LBB18_4:2145; X86-BMI1-NEXT:    decl %eax2146; X86-BMI1-NEXT:    andl %esi, %eax2147; X86-BMI1-NEXT:    popl %esi2148; X86-BMI1-NEXT:    popl %edi2149; X86-BMI1-NEXT:    retl2150;2151; X86-BMI2-LABEL: bextr64_32_a3:2152; X86-BMI2:       # %bb.0:2153; X86-BMI2-NEXT:    pushl %ebx2154; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %ebx2155; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx2156; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %edx2157; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %eax2158; X86-BMI2-NEXT:    shrdl %cl, %eax, %edx2159; X86-BMI2-NEXT:    testb $32, %cl2160; X86-BMI2-NEXT:    je .LBB18_22161; X86-BMI2-NEXT:  # %bb.1:2162; X86-BMI2-NEXT:    shrxl %ecx, %eax, %edx2163; X86-BMI2-NEXT:  .LBB18_2:2164; X86-BMI2-NEXT:    xorl %eax, %eax2165; X86-BMI2-NEXT:    testb $32, %bl2166; X86-BMI2-NEXT:    jne .LBB18_42167; X86-BMI2-NEXT:  # %bb.3:2168; X86-BMI2-NEXT:    movl $1, %eax2169; X86-BMI2-NEXT:    shlxl %ebx, %eax, %eax2170; X86-BMI2-NEXT:  .LBB18_4:2171; X86-BMI2-NEXT:    decl %eax2172; X86-BMI2-NEXT:    andl %edx, %eax2173; X86-BMI2-NEXT:    popl %ebx2174; X86-BMI2-NEXT:    retl2175;2176; X64-NOBMI-LABEL: bextr64_32_a3:2177; X64-NOBMI:       # %bb.0:2178; X64-NOBMI-NEXT:    movq %rsi, %rcx2179; X64-NOBMI-NEXT:    # kill: def $cl killed $cl killed $rcx2180; X64-NOBMI-NEXT:    shrq %cl, %rdi2181; X64-NOBMI-NEXT:    movl $1, %eax2182; X64-NOBMI-NEXT:    movl %edx, %ecx2183; X64-NOBMI-NEXT:    shlq %cl, %rax2184; X64-NOBMI-NEXT:    decl %eax2185; X64-NOBMI-NEXT:    andl %edi, %eax2186; X64-NOBMI-NEXT:    # kill: def $eax killed $eax killed $rax2187; X64-NOBMI-NEXT:    retq2188;2189; X64-BMI1-LABEL: bextr64_32_a3:2190; X64-BMI1:       # %bb.0:2191; X64-BMI1-NEXT:    shll $8, %edx2192; X64-BMI1-NEXT:    movzbl %sil, %eax2193; X64-BMI1-NEXT:    orl %edx, %eax2194; X64-BMI1-NEXT:    bextrq %rax, %rdi, %rax2195; X64-BMI1-NEXT:    # kill: def $eax killed $eax killed $rax2196; X64-BMI1-NEXT:    retq2197;2198; X64-BMI2-LABEL: bextr64_32_a3:2199; X64-BMI2:       # %bb.0:2200; X64-BMI2-NEXT:    shrxq %rsi, %rdi, %rax2201; X64-BMI2-NEXT:    bzhil %edx, %eax, %eax2202; X64-BMI2-NEXT:    retq2203  %shifted = lshr i64 %val, %numskipbits2204  %onebit = shl i64 1, %numlowbits2205  %mask = add nsw i64 %onebit, 42949672952206  %masked = and i64 %mask, %shifted2207  %truncmasked = trunc i64 %masked to i322208  ret i32 %truncmasked2209}2210 2211; ---------------------------------------------------------------------------- ;2212; Pattern b. 32-bit2213; ---------------------------------------------------------------------------- ;2214 2215define i32 @bextr32_b0(i32 %val, i32 %numskipbits, i32 %numlowbits) nounwind {2216; X86-NOBMI-LABEL: bextr32_b0:2217; X86-NOBMI:       # %bb.0:2218; X86-NOBMI-NEXT:    pushl %esi2219; X86-NOBMI-NEXT:    movzbl {{[0-9]+}}(%esp), %edx2220; X86-NOBMI-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx2221; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %esi2222; X86-NOBMI-NEXT:    shrl %cl, %esi2223; X86-NOBMI-NEXT:    movl $-1, %eax2224; X86-NOBMI-NEXT:    movl %edx, %ecx2225; X86-NOBMI-NEXT:    shll %cl, %eax2226; X86-NOBMI-NEXT:    notl %eax2227; X86-NOBMI-NEXT:    andl %esi, %eax2228; X86-NOBMI-NEXT:    popl %esi2229; X86-NOBMI-NEXT:    retl2230;2231; X86-BMI1-LABEL: bextr32_b0:2232; X86-BMI1:       # %bb.0:2233; X86-BMI1-NEXT:    movzbl {{[0-9]+}}(%esp), %eax2234; X86-BMI1-NEXT:    shll $8, %eax2235; X86-BMI1-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx2236; X86-BMI1-NEXT:    orl %eax, %ecx2237; X86-BMI1-NEXT:    bextrl %ecx, {{[0-9]+}}(%esp), %eax2238; X86-BMI1-NEXT:    retl2239;2240; X86-BMI2-LABEL: bextr32_b0:2241; X86-BMI2:       # %bb.0:2242; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %eax2243; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx2244; X86-BMI2-NEXT:    shrxl %ecx, {{[0-9]+}}(%esp), %ecx2245; X86-BMI2-NEXT:    bzhil %eax, %ecx, %eax2246; X86-BMI2-NEXT:    retl2247;2248; X64-NOBMI-LABEL: bextr32_b0:2249; X64-NOBMI:       # %bb.0:2250; X64-NOBMI-NEXT:    movl %esi, %ecx2251; X64-NOBMI-NEXT:    # kill: def $cl killed $cl killed $ecx2252; X64-NOBMI-NEXT:    shrl %cl, %edi2253; X64-NOBMI-NEXT:    movl $-1, %eax2254; X64-NOBMI-NEXT:    movl %edx, %ecx2255; X64-NOBMI-NEXT:    shll %cl, %eax2256; X64-NOBMI-NEXT:    notl %eax2257; X64-NOBMI-NEXT:    andl %edi, %eax2258; X64-NOBMI-NEXT:    retq2259;2260; X64-BMI1-LABEL: bextr32_b0:2261; X64-BMI1:       # %bb.0:2262; X64-BMI1-NEXT:    shll $8, %edx2263; X64-BMI1-NEXT:    movzbl %sil, %eax2264; X64-BMI1-NEXT:    orl %edx, %eax2265; X64-BMI1-NEXT:    bextrl %eax, %edi, %eax2266; X64-BMI1-NEXT:    retq2267;2268; X64-BMI2-LABEL: bextr32_b0:2269; X64-BMI2:       # %bb.0:2270; X64-BMI2-NEXT:    shrxl %esi, %edi, %eax2271; X64-BMI2-NEXT:    bzhil %edx, %eax, %eax2272; X64-BMI2-NEXT:    retq2273  %shifted = lshr i32 %val, %numskipbits2274  %notmask = shl i32 -1, %numlowbits2275  %mask = xor i32 %notmask, -12276  %masked = and i32 %mask, %shifted2277  ret i32 %masked2278}2279 2280define i32 @bextr32_b1_indexzext(i32 %val, i8 zeroext %numskipbits, i8 zeroext %numlowbits) nounwind {2281; X86-NOBMI-LABEL: bextr32_b1_indexzext:2282; X86-NOBMI:       # %bb.0:2283; X86-NOBMI-NEXT:    pushl %esi2284; X86-NOBMI-NEXT:    movzbl {{[0-9]+}}(%esp), %edx2285; X86-NOBMI-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx2286; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %esi2287; X86-NOBMI-NEXT:    shrl %cl, %esi2288; X86-NOBMI-NEXT:    movl $-1, %eax2289; X86-NOBMI-NEXT:    movl %edx, %ecx2290; X86-NOBMI-NEXT:    shll %cl, %eax2291; X86-NOBMI-NEXT:    notl %eax2292; X86-NOBMI-NEXT:    andl %esi, %eax2293; X86-NOBMI-NEXT:    popl %esi2294; X86-NOBMI-NEXT:    retl2295;2296; X86-BMI1-LABEL: bextr32_b1_indexzext:2297; X86-BMI1:       # %bb.0:2298; X86-BMI1-NEXT:    movzbl {{[0-9]+}}(%esp), %eax2299; X86-BMI1-NEXT:    shll $8, %eax2300; X86-BMI1-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx2301; X86-BMI1-NEXT:    orl %eax, %ecx2302; X86-BMI1-NEXT:    bextrl %ecx, {{[0-9]+}}(%esp), %eax2303; X86-BMI1-NEXT:    retl2304;2305; X86-BMI2-LABEL: bextr32_b1_indexzext:2306; X86-BMI2:       # %bb.0:2307; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %eax2308; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx2309; X86-BMI2-NEXT:    shrxl %ecx, {{[0-9]+}}(%esp), %ecx2310; X86-BMI2-NEXT:    bzhil %eax, %ecx, %eax2311; X86-BMI2-NEXT:    retl2312;2313; X64-NOBMI-LABEL: bextr32_b1_indexzext:2314; X64-NOBMI:       # %bb.0:2315; X64-NOBMI-NEXT:    movl %esi, %ecx2316; X64-NOBMI-NEXT:    # kill: def $cl killed $cl killed $ecx2317; X64-NOBMI-NEXT:    shrl %cl, %edi2318; X64-NOBMI-NEXT:    movl $-1, %eax2319; X64-NOBMI-NEXT:    movl %edx, %ecx2320; X64-NOBMI-NEXT:    shll %cl, %eax2321; X64-NOBMI-NEXT:    notl %eax2322; X64-NOBMI-NEXT:    andl %edi, %eax2323; X64-NOBMI-NEXT:    retq2324;2325; X64-BMI1-LABEL: bextr32_b1_indexzext:2326; X64-BMI1:       # %bb.0:2327; X64-BMI1-NEXT:    shll $8, %edx2328; X64-BMI1-NEXT:    orl %esi, %edx2329; X64-BMI1-NEXT:    bextrl %edx, %edi, %eax2330; X64-BMI1-NEXT:    retq2331;2332; X64-BMI2-LABEL: bextr32_b1_indexzext:2333; X64-BMI2:       # %bb.0:2334; X64-BMI2-NEXT:    shrxl %esi, %edi, %eax2335; X64-BMI2-NEXT:    bzhil %edx, %eax, %eax2336; X64-BMI2-NEXT:    retq2337  %skip = zext i8 %numskipbits to i322338  %shifted = lshr i32 %val, %skip2339  %conv = zext i8 %numlowbits to i322340  %notmask = shl i32 -1, %conv2341  %mask = xor i32 %notmask, -12342  %masked = and i32 %mask, %shifted2343  ret i32 %masked2344}2345 2346define i32 @bextr32_b2_load(ptr %w, i32 %numskipbits, i32 %numlowbits) nounwind {2347; X86-NOBMI-LABEL: bextr32_b2_load:2348; X86-NOBMI:       # %bb.0:2349; X86-NOBMI-NEXT:    pushl %esi2350; X86-NOBMI-NEXT:    movzbl {{[0-9]+}}(%esp), %edx2351; X86-NOBMI-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx2352; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %eax2353; X86-NOBMI-NEXT:    movl (%eax), %esi2354; X86-NOBMI-NEXT:    shrl %cl, %esi2355; X86-NOBMI-NEXT:    movl $-1, %eax2356; X86-NOBMI-NEXT:    movl %edx, %ecx2357; X86-NOBMI-NEXT:    shll %cl, %eax2358; X86-NOBMI-NEXT:    notl %eax2359; X86-NOBMI-NEXT:    andl %esi, %eax2360; X86-NOBMI-NEXT:    popl %esi2361; X86-NOBMI-NEXT:    retl2362;2363; X86-BMI1-LABEL: bextr32_b2_load:2364; X86-BMI1:       # %bb.0:2365; X86-BMI1-NEXT:    movl {{[0-9]+}}(%esp), %eax2366; X86-BMI1-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx2367; X86-BMI1-NEXT:    shll $8, %ecx2368; X86-BMI1-NEXT:    movzbl {{[0-9]+}}(%esp), %edx2369; X86-BMI1-NEXT:    orl %ecx, %edx2370; X86-BMI1-NEXT:    bextrl %edx, (%eax), %eax2371; X86-BMI1-NEXT:    retl2372;2373; X86-BMI2-LABEL: bextr32_b2_load:2374; X86-BMI2:       # %bb.0:2375; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %eax2376; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %ecx2377; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %edx2378; X86-BMI2-NEXT:    shrxl %edx, (%ecx), %ecx2379; X86-BMI2-NEXT:    bzhil %eax, %ecx, %eax2380; X86-BMI2-NEXT:    retl2381;2382; X64-NOBMI-LABEL: bextr32_b2_load:2383; X64-NOBMI:       # %bb.0:2384; X64-NOBMI-NEXT:    movl %esi, %ecx2385; X64-NOBMI-NEXT:    movl (%rdi), %esi2386; X64-NOBMI-NEXT:    # kill: def $cl killed $cl killed $ecx2387; X64-NOBMI-NEXT:    shrl %cl, %esi2388; X64-NOBMI-NEXT:    movl $-1, %eax2389; X64-NOBMI-NEXT:    movl %edx, %ecx2390; X64-NOBMI-NEXT:    shll %cl, %eax2391; X64-NOBMI-NEXT:    notl %eax2392; X64-NOBMI-NEXT:    andl %esi, %eax2393; X64-NOBMI-NEXT:    retq2394;2395; X64-BMI1-LABEL: bextr32_b2_load:2396; X64-BMI1:       # %bb.0:2397; X64-BMI1-NEXT:    shll $8, %edx2398; X64-BMI1-NEXT:    movzbl %sil, %eax2399; X64-BMI1-NEXT:    orl %edx, %eax2400; X64-BMI1-NEXT:    bextrl %eax, (%rdi), %eax2401; X64-BMI1-NEXT:    retq2402;2403; X64-BMI2-LABEL: bextr32_b2_load:2404; X64-BMI2:       # %bb.0:2405; X64-BMI2-NEXT:    shrxl %esi, (%rdi), %eax2406; X64-BMI2-NEXT:    bzhil %edx, %eax, %eax2407; X64-BMI2-NEXT:    retq2408  %val = load i32, ptr %w2409  %shifted = lshr i32 %val, %numskipbits2410  %notmask = shl i32 -1, %numlowbits2411  %mask = xor i32 %notmask, -12412  %masked = and i32 %mask, %shifted2413  ret i32 %masked2414}2415 2416define i32 @bextr32_b3_load_indexzext(ptr %w, i8 zeroext %numskipbits, i8 zeroext %numlowbits) nounwind {2417; X86-NOBMI-LABEL: bextr32_b3_load_indexzext:2418; X86-NOBMI:       # %bb.0:2419; X86-NOBMI-NEXT:    pushl %esi2420; X86-NOBMI-NEXT:    movzbl {{[0-9]+}}(%esp), %edx2421; X86-NOBMI-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx2422; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %eax2423; X86-NOBMI-NEXT:    movl (%eax), %esi2424; X86-NOBMI-NEXT:    shrl %cl, %esi2425; X86-NOBMI-NEXT:    movl $-1, %eax2426; X86-NOBMI-NEXT:    movl %edx, %ecx2427; X86-NOBMI-NEXT:    shll %cl, %eax2428; X86-NOBMI-NEXT:    notl %eax2429; X86-NOBMI-NEXT:    andl %esi, %eax2430; X86-NOBMI-NEXT:    popl %esi2431; X86-NOBMI-NEXT:    retl2432;2433; X86-BMI1-LABEL: bextr32_b3_load_indexzext:2434; X86-BMI1:       # %bb.0:2435; X86-BMI1-NEXT:    movl {{[0-9]+}}(%esp), %eax2436; X86-BMI1-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx2437; X86-BMI1-NEXT:    shll $8, %ecx2438; X86-BMI1-NEXT:    movzbl {{[0-9]+}}(%esp), %edx2439; X86-BMI1-NEXT:    orl %ecx, %edx2440; X86-BMI1-NEXT:    bextrl %edx, (%eax), %eax2441; X86-BMI1-NEXT:    retl2442;2443; X86-BMI2-LABEL: bextr32_b3_load_indexzext:2444; X86-BMI2:       # %bb.0:2445; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %eax2446; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %ecx2447; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %edx2448; X86-BMI2-NEXT:    shrxl %edx, (%ecx), %ecx2449; X86-BMI2-NEXT:    bzhil %eax, %ecx, %eax2450; X86-BMI2-NEXT:    retl2451;2452; X64-NOBMI-LABEL: bextr32_b3_load_indexzext:2453; X64-NOBMI:       # %bb.0:2454; X64-NOBMI-NEXT:    movl %esi, %ecx2455; X64-NOBMI-NEXT:    movl (%rdi), %esi2456; X64-NOBMI-NEXT:    # kill: def $cl killed $cl killed $ecx2457; X64-NOBMI-NEXT:    shrl %cl, %esi2458; X64-NOBMI-NEXT:    movl $-1, %eax2459; X64-NOBMI-NEXT:    movl %edx, %ecx2460; X64-NOBMI-NEXT:    shll %cl, %eax2461; X64-NOBMI-NEXT:    notl %eax2462; X64-NOBMI-NEXT:    andl %esi, %eax2463; X64-NOBMI-NEXT:    retq2464;2465; X64-BMI1-LABEL: bextr32_b3_load_indexzext:2466; X64-BMI1:       # %bb.0:2467; X64-BMI1-NEXT:    shll $8, %edx2468; X64-BMI1-NEXT:    orl %esi, %edx2469; X64-BMI1-NEXT:    bextrl %edx, (%rdi), %eax2470; X64-BMI1-NEXT:    retq2471;2472; X64-BMI2-LABEL: bextr32_b3_load_indexzext:2473; X64-BMI2:       # %bb.0:2474; X64-BMI2-NEXT:    shrxl %esi, (%rdi), %eax2475; X64-BMI2-NEXT:    bzhil %edx, %eax, %eax2476; X64-BMI2-NEXT:    retq2477  %val = load i32, ptr %w2478  %skip = zext i8 %numskipbits to i322479  %shifted = lshr i32 %val, %skip2480  %conv = zext i8 %numlowbits to i322481  %notmask = shl i32 -1, %conv2482  %mask = xor i32 %notmask, -12483  %masked = and i32 %mask, %shifted2484  ret i32 %masked2485}2486 2487define i32 @bextr32_b4_commutative(i32 %val, i32 %numskipbits, i32 %numlowbits) nounwind {2488; X86-NOBMI-LABEL: bextr32_b4_commutative:2489; X86-NOBMI:       # %bb.0:2490; X86-NOBMI-NEXT:    pushl %esi2491; X86-NOBMI-NEXT:    movzbl {{[0-9]+}}(%esp), %edx2492; X86-NOBMI-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx2493; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %esi2494; X86-NOBMI-NEXT:    shrl %cl, %esi2495; X86-NOBMI-NEXT:    movl $-1, %eax2496; X86-NOBMI-NEXT:    movl %edx, %ecx2497; X86-NOBMI-NEXT:    shll %cl, %eax2498; X86-NOBMI-NEXT:    notl %eax2499; X86-NOBMI-NEXT:    andl %esi, %eax2500; X86-NOBMI-NEXT:    popl %esi2501; X86-NOBMI-NEXT:    retl2502;2503; X86-BMI1-LABEL: bextr32_b4_commutative:2504; X86-BMI1:       # %bb.0:2505; X86-BMI1-NEXT:    movzbl {{[0-9]+}}(%esp), %eax2506; X86-BMI1-NEXT:    shll $8, %eax2507; X86-BMI1-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx2508; X86-BMI1-NEXT:    orl %eax, %ecx2509; X86-BMI1-NEXT:    bextrl %ecx, {{[0-9]+}}(%esp), %eax2510; X86-BMI1-NEXT:    retl2511;2512; X86-BMI2-LABEL: bextr32_b4_commutative:2513; X86-BMI2:       # %bb.0:2514; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %eax2515; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx2516; X86-BMI2-NEXT:    shrxl %ecx, {{[0-9]+}}(%esp), %ecx2517; X86-BMI2-NEXT:    bzhil %eax, %ecx, %eax2518; X86-BMI2-NEXT:    retl2519;2520; X64-NOBMI-LABEL: bextr32_b4_commutative:2521; X64-NOBMI:       # %bb.0:2522; X64-NOBMI-NEXT:    movl %esi, %ecx2523; X64-NOBMI-NEXT:    # kill: def $cl killed $cl killed $ecx2524; X64-NOBMI-NEXT:    shrl %cl, %edi2525; X64-NOBMI-NEXT:    movl $-1, %eax2526; X64-NOBMI-NEXT:    movl %edx, %ecx2527; X64-NOBMI-NEXT:    shll %cl, %eax2528; X64-NOBMI-NEXT:    notl %eax2529; X64-NOBMI-NEXT:    andl %edi, %eax2530; X64-NOBMI-NEXT:    retq2531;2532; X64-BMI1-LABEL: bextr32_b4_commutative:2533; X64-BMI1:       # %bb.0:2534; X64-BMI1-NEXT:    shll $8, %edx2535; X64-BMI1-NEXT:    movzbl %sil, %eax2536; X64-BMI1-NEXT:    orl %edx, %eax2537; X64-BMI1-NEXT:    bextrl %eax, %edi, %eax2538; X64-BMI1-NEXT:    retq2539;2540; X64-BMI2-LABEL: bextr32_b4_commutative:2541; X64-BMI2:       # %bb.0:2542; X64-BMI2-NEXT:    shrxl %esi, %edi, %eax2543; X64-BMI2-NEXT:    bzhil %edx, %eax, %eax2544; X64-BMI2-NEXT:    retq2545  %shifted = lshr i32 %val, %numskipbits2546  %notmask = shl i32 -1, %numlowbits2547  %mask = xor i32 %notmask, -12548  %masked = and i32 %shifted, %mask ; swapped order2549  ret i32 %masked2550}2551 2552define i32 @bextr32_b5_skipextrauses(i32 %val, i32 %numskipbits, i32 %numlowbits) nounwind {2553; X86-NOBMI-LABEL: bextr32_b5_skipextrauses:2554; X86-NOBMI:       # %bb.0:2555; X86-NOBMI-NEXT:    pushl %edi2556; X86-NOBMI-NEXT:    pushl %esi2557; X86-NOBMI-NEXT:    pushl %eax2558; X86-NOBMI-NEXT:    movzbl {{[0-9]+}}(%esp), %edx2559; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %edi2560; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %eax2561; X86-NOBMI-NEXT:    movl %eax, %ecx2562; X86-NOBMI-NEXT:    shrl %cl, %edi2563; X86-NOBMI-NEXT:    movl $-1, %esi2564; X86-NOBMI-NEXT:    movl %edx, %ecx2565; X86-NOBMI-NEXT:    shll %cl, %esi2566; X86-NOBMI-NEXT:    notl %esi2567; X86-NOBMI-NEXT:    andl %edi, %esi2568; X86-NOBMI-NEXT:    movl %eax, (%esp)2569; X86-NOBMI-NEXT:    calll use32@PLT2570; X86-NOBMI-NEXT:    movl %esi, %eax2571; X86-NOBMI-NEXT:    addl $4, %esp2572; X86-NOBMI-NEXT:    popl %esi2573; X86-NOBMI-NEXT:    popl %edi2574; X86-NOBMI-NEXT:    retl2575;2576; X86-BMI1-LABEL: bextr32_b5_skipextrauses:2577; X86-BMI1:       # %bb.0:2578; X86-BMI1-NEXT:    pushl %esi2579; X86-BMI1-NEXT:    subl $8, %esp2580; X86-BMI1-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx2581; X86-BMI1-NEXT:    movl {{[0-9]+}}(%esp), %eax2582; X86-BMI1-NEXT:    shll $8, %ecx2583; X86-BMI1-NEXT:    movzbl %al, %edx2584; X86-BMI1-NEXT:    orl %ecx, %edx2585; X86-BMI1-NEXT:    bextrl %edx, {{[0-9]+}}(%esp), %esi2586; X86-BMI1-NEXT:    movl %eax, (%esp)2587; X86-BMI1-NEXT:    calll use32@PLT2588; X86-BMI1-NEXT:    movl %esi, %eax2589; X86-BMI1-NEXT:    addl $8, %esp2590; X86-BMI1-NEXT:    popl %esi2591; X86-BMI1-NEXT:    retl2592;2593; X86-BMI2-LABEL: bextr32_b5_skipextrauses:2594; X86-BMI2:       # %bb.0:2595; X86-BMI2-NEXT:    pushl %esi2596; X86-BMI2-NEXT:    subl $8, %esp2597; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %eax2598; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %ecx2599; X86-BMI2-NEXT:    shrxl %ecx, {{[0-9]+}}(%esp), %edx2600; X86-BMI2-NEXT:    bzhil %eax, %edx, %esi2601; X86-BMI2-NEXT:    movl %ecx, (%esp)2602; X86-BMI2-NEXT:    calll use32@PLT2603; X86-BMI2-NEXT:    movl %esi, %eax2604; X86-BMI2-NEXT:    addl $8, %esp2605; X86-BMI2-NEXT:    popl %esi2606; X86-BMI2-NEXT:    retl2607;2608; X64-NOBMI-LABEL: bextr32_b5_skipextrauses:2609; X64-NOBMI:       # %bb.0:2610; X64-NOBMI-NEXT:    pushq %rbx2611; X64-NOBMI-NEXT:    movl %esi, %ecx2612; X64-NOBMI-NEXT:    shrl %cl, %edi2613; X64-NOBMI-NEXT:    movl $-1, %ebx2614; X64-NOBMI-NEXT:    movl %edx, %ecx2615; X64-NOBMI-NEXT:    shll %cl, %ebx2616; X64-NOBMI-NEXT:    notl %ebx2617; X64-NOBMI-NEXT:    andl %edi, %ebx2618; X64-NOBMI-NEXT:    movl %esi, %edi2619; X64-NOBMI-NEXT:    callq use32@PLT2620; X64-NOBMI-NEXT:    movl %ebx, %eax2621; X64-NOBMI-NEXT:    popq %rbx2622; X64-NOBMI-NEXT:    retq2623;2624; X64-BMI1-LABEL: bextr32_b5_skipextrauses:2625; X64-BMI1:       # %bb.0:2626; X64-BMI1-NEXT:    pushq %rbx2627; X64-BMI1-NEXT:    shll $8, %edx2628; X64-BMI1-NEXT:    movzbl %sil, %eax2629; X64-BMI1-NEXT:    orl %edx, %eax2630; X64-BMI1-NEXT:    bextrl %eax, %edi, %ebx2631; X64-BMI1-NEXT:    movl %esi, %edi2632; X64-BMI1-NEXT:    callq use32@PLT2633; X64-BMI1-NEXT:    movl %ebx, %eax2634; X64-BMI1-NEXT:    popq %rbx2635; X64-BMI1-NEXT:    retq2636;2637; X64-BMI2-LABEL: bextr32_b5_skipextrauses:2638; X64-BMI2:       # %bb.0:2639; X64-BMI2-NEXT:    pushq %rbx2640; X64-BMI2-NEXT:    shrxl %esi, %edi, %eax2641; X64-BMI2-NEXT:    bzhil %edx, %eax, %ebx2642; X64-BMI2-NEXT:    movl %esi, %edi2643; X64-BMI2-NEXT:    callq use32@PLT2644; X64-BMI2-NEXT:    movl %ebx, %eax2645; X64-BMI2-NEXT:    popq %rbx2646; X64-BMI2-NEXT:    retq2647  %shifted = lshr i32 %val, %numskipbits2648  %notmask = shl i32 -1, %numlowbits2649  %mask = xor i32 %notmask, -12650  %masked = and i32 %mask, %shifted2651  call void @use32(i32 %numskipbits)2652  ret i32 %masked2653}2654 2655; 64-bit2656 2657define i64 @bextr64_b0(i64 %val, i64 %numskipbits, i64 %numlowbits) nounwind {2658; X86-NOBMI-LABEL: bextr64_b0:2659; X86-NOBMI:       # %bb.0:2660; X86-NOBMI-NEXT:    pushl %ebx2661; X86-NOBMI-NEXT:    pushl %edi2662; X86-NOBMI-NEXT:    pushl %esi2663; X86-NOBMI-NEXT:    movb {{[0-9]+}}(%esp), %ch2664; X86-NOBMI-NEXT:    movb {{[0-9]+}}(%esp), %cl2665; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %esi2666; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %eax2667; X86-NOBMI-NEXT:    movl %eax, %edi2668; X86-NOBMI-NEXT:    shrl %cl, %edi2669; X86-NOBMI-NEXT:    shrdl %cl, %eax, %esi2670; X86-NOBMI-NEXT:    xorl %eax, %eax2671; X86-NOBMI-NEXT:    testb $32, %cl2672; X86-NOBMI-NEXT:    je .LBB25_22673; X86-NOBMI-NEXT:  # %bb.1:2674; X86-NOBMI-NEXT:    movl %edi, %esi2675; X86-NOBMI-NEXT:    xorl %edi, %edi2676; X86-NOBMI-NEXT:  .LBB25_2:2677; X86-NOBMI-NEXT:    movl $-1, %edx2678; X86-NOBMI-NEXT:    movl $-1, %ebx2679; X86-NOBMI-NEXT:    movb %ch, %cl2680; X86-NOBMI-NEXT:    shll %cl, %ebx2681; X86-NOBMI-NEXT:    testb $32, %ch2682; X86-NOBMI-NEXT:    jne .LBB25_32683; X86-NOBMI-NEXT:  # %bb.4:2684; X86-NOBMI-NEXT:    movl %ebx, %eax2685; X86-NOBMI-NEXT:    jmp .LBB25_52686; X86-NOBMI-NEXT:  .LBB25_3:2687; X86-NOBMI-NEXT:    movl %ebx, %edx2688; X86-NOBMI-NEXT:  .LBB25_5:2689; X86-NOBMI-NEXT:    notl %edx2690; X86-NOBMI-NEXT:    andl %edi, %edx2691; X86-NOBMI-NEXT:    notl %eax2692; X86-NOBMI-NEXT:    andl %esi, %eax2693; X86-NOBMI-NEXT:    popl %esi2694; X86-NOBMI-NEXT:    popl %edi2695; X86-NOBMI-NEXT:    popl %ebx2696; X86-NOBMI-NEXT:    retl2697;2698; X86-BMI1-LABEL: bextr64_b0:2699; X86-BMI1:       # %bb.0:2700; X86-BMI1-NEXT:    pushl %ebx2701; X86-BMI1-NEXT:    pushl %edi2702; X86-BMI1-NEXT:    pushl %esi2703; X86-BMI1-NEXT:    movzbl {{[0-9]+}}(%esp), %eax2704; X86-BMI1-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx2705; X86-BMI1-NEXT:    movl {{[0-9]+}}(%esp), %esi2706; X86-BMI1-NEXT:    movl {{[0-9]+}}(%esp), %edi2707; X86-BMI1-NEXT:    movl %edi, %edx2708; X86-BMI1-NEXT:    shrl %cl, %edx2709; X86-BMI1-NEXT:    shrdl %cl, %edi, %esi2710; X86-BMI1-NEXT:    testb $32, %cl2711; X86-BMI1-NEXT:    je .LBB25_22712; X86-BMI1-NEXT:  # %bb.1:2713; X86-BMI1-NEXT:    movl %edx, %esi2714; X86-BMI1-NEXT:    xorl %edx, %edx2715; X86-BMI1-NEXT:  .LBB25_2:2716; X86-BMI1-NEXT:    movl $-1, %edi2717; X86-BMI1-NEXT:    movl $-1, %ebx2718; X86-BMI1-NEXT:    movl %eax, %ecx2719; X86-BMI1-NEXT:    shll %cl, %ebx2720; X86-BMI1-NEXT:    testb $32, %al2721; X86-BMI1-NEXT:    je .LBB25_42722; X86-BMI1-NEXT:  # %bb.3:2723; X86-BMI1-NEXT:    movl %ebx, %edi2724; X86-BMI1-NEXT:    xorl %ebx, %ebx2725; X86-BMI1-NEXT:  .LBB25_4:2726; X86-BMI1-NEXT:    andnl %edx, %edi, %edx2727; X86-BMI1-NEXT:    andnl %esi, %ebx, %eax2728; X86-BMI1-NEXT:    popl %esi2729; X86-BMI1-NEXT:    popl %edi2730; X86-BMI1-NEXT:    popl %ebx2731; X86-BMI1-NEXT:    retl2732;2733; X86-BMI2-LABEL: bextr64_b0:2734; X86-BMI2:       # %bb.0:2735; X86-BMI2-NEXT:    pushl %ebx2736; X86-BMI2-NEXT:    pushl %esi2737; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %ebx2738; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx2739; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %eax2740; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %edx2741; X86-BMI2-NEXT:    shrdl %cl, %edx, %eax2742; X86-BMI2-NEXT:    shrxl %ecx, %edx, %edx2743; X86-BMI2-NEXT:    testb $32, %cl2744; X86-BMI2-NEXT:    je .LBB25_22745; X86-BMI2-NEXT:  # %bb.1:2746; X86-BMI2-NEXT:    movl %edx, %eax2747; X86-BMI2-NEXT:    xorl %edx, %edx2748; X86-BMI2-NEXT:  .LBB25_2:2749; X86-BMI2-NEXT:    movl $-1, %esi2750; X86-BMI2-NEXT:    shlxl %ebx, %esi, %ecx2751; X86-BMI2-NEXT:    testb $32, %bl2752; X86-BMI2-NEXT:    je .LBB25_42753; X86-BMI2-NEXT:  # %bb.3:2754; X86-BMI2-NEXT:    movl %ecx, %esi2755; X86-BMI2-NEXT:    xorl %ecx, %ecx2756; X86-BMI2-NEXT:  .LBB25_4:2757; X86-BMI2-NEXT:    andnl %edx, %esi, %edx2758; X86-BMI2-NEXT:    andnl %eax, %ecx, %eax2759; X86-BMI2-NEXT:    popl %esi2760; X86-BMI2-NEXT:    popl %ebx2761; X86-BMI2-NEXT:    retl2762;2763; X64-NOBMI-LABEL: bextr64_b0:2764; X64-NOBMI:       # %bb.0:2765; X64-NOBMI-NEXT:    movq %rsi, %rcx2766; X64-NOBMI-NEXT:    # kill: def $cl killed $cl killed $rcx2767; X64-NOBMI-NEXT:    shrq %cl, %rdi2768; X64-NOBMI-NEXT:    movq $-1, %rax2769; X64-NOBMI-NEXT:    movl %edx, %ecx2770; X64-NOBMI-NEXT:    shlq %cl, %rax2771; X64-NOBMI-NEXT:    notq %rax2772; X64-NOBMI-NEXT:    andq %rdi, %rax2773; X64-NOBMI-NEXT:    retq2774;2775; X64-BMI1-LABEL: bextr64_b0:2776; X64-BMI1:       # %bb.0:2777; X64-BMI1-NEXT:    shll $8, %edx2778; X64-BMI1-NEXT:    movzbl %sil, %eax2779; X64-BMI1-NEXT:    orl %edx, %eax2780; X64-BMI1-NEXT:    bextrq %rax, %rdi, %rax2781; X64-BMI1-NEXT:    retq2782;2783; X64-BMI2-LABEL: bextr64_b0:2784; X64-BMI2:       # %bb.0:2785; X64-BMI2-NEXT:    shrxq %rsi, %rdi, %rax2786; X64-BMI2-NEXT:    bzhiq %rdx, %rax, %rax2787; X64-BMI2-NEXT:    retq2788  %shifted = lshr i64 %val, %numskipbits2789  %notmask = shl i64 -1, %numlowbits2790  %mask = xor i64 %notmask, -12791  %masked = and i64 %mask, %shifted2792  ret i64 %masked2793}2794 2795define i64 @bextr64_b1_indexzext(i64 %val, i8 zeroext %numskipbits, i8 zeroext %numlowbits) nounwind {2796; X86-NOBMI-LABEL: bextr64_b1_indexzext:2797; X86-NOBMI:       # %bb.0:2798; X86-NOBMI-NEXT:    pushl %ebx2799; X86-NOBMI-NEXT:    pushl %edi2800; X86-NOBMI-NEXT:    pushl %esi2801; X86-NOBMI-NEXT:    movb {{[0-9]+}}(%esp), %ch2802; X86-NOBMI-NEXT:    movb {{[0-9]+}}(%esp), %cl2803; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %esi2804; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %eax2805; X86-NOBMI-NEXT:    movl %eax, %edi2806; X86-NOBMI-NEXT:    shrl %cl, %edi2807; X86-NOBMI-NEXT:    shrdl %cl, %eax, %esi2808; X86-NOBMI-NEXT:    xorl %eax, %eax2809; X86-NOBMI-NEXT:    testb $32, %cl2810; X86-NOBMI-NEXT:    je .LBB26_22811; X86-NOBMI-NEXT:  # %bb.1:2812; X86-NOBMI-NEXT:    movl %edi, %esi2813; X86-NOBMI-NEXT:    xorl %edi, %edi2814; X86-NOBMI-NEXT:  .LBB26_2:2815; X86-NOBMI-NEXT:    movl $-1, %edx2816; X86-NOBMI-NEXT:    movl $-1, %ebx2817; X86-NOBMI-NEXT:    movb %ch, %cl2818; X86-NOBMI-NEXT:    shll %cl, %ebx2819; X86-NOBMI-NEXT:    testb $32, %ch2820; X86-NOBMI-NEXT:    jne .LBB26_32821; X86-NOBMI-NEXT:  # %bb.4:2822; X86-NOBMI-NEXT:    movl %ebx, %eax2823; X86-NOBMI-NEXT:    jmp .LBB26_52824; X86-NOBMI-NEXT:  .LBB26_3:2825; X86-NOBMI-NEXT:    movl %ebx, %edx2826; X86-NOBMI-NEXT:  .LBB26_5:2827; X86-NOBMI-NEXT:    notl %edx2828; X86-NOBMI-NEXT:    andl %edi, %edx2829; X86-NOBMI-NEXT:    notl %eax2830; X86-NOBMI-NEXT:    andl %esi, %eax2831; X86-NOBMI-NEXT:    popl %esi2832; X86-NOBMI-NEXT:    popl %edi2833; X86-NOBMI-NEXT:    popl %ebx2834; X86-NOBMI-NEXT:    retl2835;2836; X86-BMI1-LABEL: bextr64_b1_indexzext:2837; X86-BMI1:       # %bb.0:2838; X86-BMI1-NEXT:    pushl %ebx2839; X86-BMI1-NEXT:    pushl %edi2840; X86-BMI1-NEXT:    pushl %esi2841; X86-BMI1-NEXT:    movzbl {{[0-9]+}}(%esp), %eax2842; X86-BMI1-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx2843; X86-BMI1-NEXT:    movl {{[0-9]+}}(%esp), %esi2844; X86-BMI1-NEXT:    movl {{[0-9]+}}(%esp), %edi2845; X86-BMI1-NEXT:    movl %edi, %edx2846; X86-BMI1-NEXT:    shrl %cl, %edx2847; X86-BMI1-NEXT:    shrdl %cl, %edi, %esi2848; X86-BMI1-NEXT:    testb $32, %cl2849; X86-BMI1-NEXT:    je .LBB26_22850; X86-BMI1-NEXT:  # %bb.1:2851; X86-BMI1-NEXT:    movl %edx, %esi2852; X86-BMI1-NEXT:    xorl %edx, %edx2853; X86-BMI1-NEXT:  .LBB26_2:2854; X86-BMI1-NEXT:    movl $-1, %edi2855; X86-BMI1-NEXT:    movl $-1, %ebx2856; X86-BMI1-NEXT:    movl %eax, %ecx2857; X86-BMI1-NEXT:    shll %cl, %ebx2858; X86-BMI1-NEXT:    testb $32, %al2859; X86-BMI1-NEXT:    je .LBB26_42860; X86-BMI1-NEXT:  # %bb.3:2861; X86-BMI1-NEXT:    movl %ebx, %edi2862; X86-BMI1-NEXT:    xorl %ebx, %ebx2863; X86-BMI1-NEXT:  .LBB26_4:2864; X86-BMI1-NEXT:    andnl %edx, %edi, %edx2865; X86-BMI1-NEXT:    andnl %esi, %ebx, %eax2866; X86-BMI1-NEXT:    popl %esi2867; X86-BMI1-NEXT:    popl %edi2868; X86-BMI1-NEXT:    popl %ebx2869; X86-BMI1-NEXT:    retl2870;2871; X86-BMI2-LABEL: bextr64_b1_indexzext:2872; X86-BMI2:       # %bb.0:2873; X86-BMI2-NEXT:    pushl %ebx2874; X86-BMI2-NEXT:    pushl %esi2875; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %ebx2876; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx2877; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %eax2878; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %edx2879; X86-BMI2-NEXT:    shrdl %cl, %edx, %eax2880; X86-BMI2-NEXT:    shrxl %ecx, %edx, %edx2881; X86-BMI2-NEXT:    testb $32, %cl2882; X86-BMI2-NEXT:    je .LBB26_22883; X86-BMI2-NEXT:  # %bb.1:2884; X86-BMI2-NEXT:    movl %edx, %eax2885; X86-BMI2-NEXT:    xorl %edx, %edx2886; X86-BMI2-NEXT:  .LBB26_2:2887; X86-BMI2-NEXT:    movl $-1, %esi2888; X86-BMI2-NEXT:    shlxl %ebx, %esi, %ecx2889; X86-BMI2-NEXT:    testb $32, %bl2890; X86-BMI2-NEXT:    je .LBB26_42891; X86-BMI2-NEXT:  # %bb.3:2892; X86-BMI2-NEXT:    movl %ecx, %esi2893; X86-BMI2-NEXT:    xorl %ecx, %ecx2894; X86-BMI2-NEXT:  .LBB26_4:2895; X86-BMI2-NEXT:    andnl %edx, %esi, %edx2896; X86-BMI2-NEXT:    andnl %eax, %ecx, %eax2897; X86-BMI2-NEXT:    popl %esi2898; X86-BMI2-NEXT:    popl %ebx2899; X86-BMI2-NEXT:    retl2900;2901; X64-NOBMI-LABEL: bextr64_b1_indexzext:2902; X64-NOBMI:       # %bb.0:2903; X64-NOBMI-NEXT:    movl %esi, %ecx2904; X64-NOBMI-NEXT:    # kill: def $cl killed $cl killed $ecx2905; X64-NOBMI-NEXT:    shrq %cl, %rdi2906; X64-NOBMI-NEXT:    movq $-1, %rax2907; X64-NOBMI-NEXT:    movl %edx, %ecx2908; X64-NOBMI-NEXT:    shlq %cl, %rax2909; X64-NOBMI-NEXT:    notq %rax2910; X64-NOBMI-NEXT:    andq %rdi, %rax2911; X64-NOBMI-NEXT:    retq2912;2913; X64-BMI1-LABEL: bextr64_b1_indexzext:2914; X64-BMI1:       # %bb.0:2915; X64-BMI1-NEXT:    # kill: def $edx killed $edx def $rdx2916; X64-BMI1-NEXT:    shll $8, %edx2917; X64-BMI1-NEXT:    orl %esi, %edx2918; X64-BMI1-NEXT:    bextrq %rdx, %rdi, %rax2919; X64-BMI1-NEXT:    retq2920;2921; X64-BMI2-LABEL: bextr64_b1_indexzext:2922; X64-BMI2:       # %bb.0:2923; X64-BMI2-NEXT:    # kill: def $edx killed $edx def $rdx2924; X64-BMI2-NEXT:    # kill: def $esi killed $esi def $rsi2925; X64-BMI2-NEXT:    shrxq %rsi, %rdi, %rax2926; X64-BMI2-NEXT:    bzhiq %rdx, %rax, %rax2927; X64-BMI2-NEXT:    retq2928  %skip = zext i8 %numskipbits to i642929  %shifted = lshr i64 %val, %skip2930  %conv = zext i8 %numlowbits to i642931  %notmask = shl i64 -1, %conv2932  %mask = xor i64 %notmask, -12933  %masked = and i64 %mask, %shifted2934  ret i64 %masked2935}2936 2937define i64 @bextr64_b2_load(ptr %w, i64 %numskipbits, i64 %numlowbits) nounwind {2938; X86-NOBMI-LABEL: bextr64_b2_load:2939; X86-NOBMI:       # %bb.0:2940; X86-NOBMI-NEXT:    pushl %ebx2941; X86-NOBMI-NEXT:    pushl %edi2942; X86-NOBMI-NEXT:    pushl %esi2943; X86-NOBMI-NEXT:    movb {{[0-9]+}}(%esp), %ch2944; X86-NOBMI-NEXT:    movb {{[0-9]+}}(%esp), %cl2945; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %eax2946; X86-NOBMI-NEXT:    movl (%eax), %esi2947; X86-NOBMI-NEXT:    movl 4(%eax), %eax2948; X86-NOBMI-NEXT:    movl %eax, %edi2949; X86-NOBMI-NEXT:    shrl %cl, %edi2950; X86-NOBMI-NEXT:    shrdl %cl, %eax, %esi2951; X86-NOBMI-NEXT:    xorl %eax, %eax2952; X86-NOBMI-NEXT:    testb $32, %cl2953; X86-NOBMI-NEXT:    je .LBB27_22954; X86-NOBMI-NEXT:  # %bb.1:2955; X86-NOBMI-NEXT:    movl %edi, %esi2956; X86-NOBMI-NEXT:    xorl %edi, %edi2957; X86-NOBMI-NEXT:  .LBB27_2:2958; X86-NOBMI-NEXT:    movl $-1, %edx2959; X86-NOBMI-NEXT:    movl $-1, %ebx2960; X86-NOBMI-NEXT:    movb %ch, %cl2961; X86-NOBMI-NEXT:    shll %cl, %ebx2962; X86-NOBMI-NEXT:    testb $32, %ch2963; X86-NOBMI-NEXT:    jne .LBB27_32964; X86-NOBMI-NEXT:  # %bb.4:2965; X86-NOBMI-NEXT:    movl %ebx, %eax2966; X86-NOBMI-NEXT:    jmp .LBB27_52967; X86-NOBMI-NEXT:  .LBB27_3:2968; X86-NOBMI-NEXT:    movl %ebx, %edx2969; X86-NOBMI-NEXT:  .LBB27_5:2970; X86-NOBMI-NEXT:    notl %edx2971; X86-NOBMI-NEXT:    andl %edi, %edx2972; X86-NOBMI-NEXT:    notl %eax2973; X86-NOBMI-NEXT:    andl %esi, %eax2974; X86-NOBMI-NEXT:    popl %esi2975; X86-NOBMI-NEXT:    popl %edi2976; X86-NOBMI-NEXT:    popl %ebx2977; X86-NOBMI-NEXT:    retl2978;2979; X86-BMI1-LABEL: bextr64_b2_load:2980; X86-BMI1:       # %bb.0:2981; X86-BMI1-NEXT:    pushl %ebx2982; X86-BMI1-NEXT:    pushl %edi2983; X86-BMI1-NEXT:    pushl %esi2984; X86-BMI1-NEXT:    movzbl {{[0-9]+}}(%esp), %eax2985; X86-BMI1-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx2986; X86-BMI1-NEXT:    movl {{[0-9]+}}(%esp), %edx2987; X86-BMI1-NEXT:    movl (%edx), %esi2988; X86-BMI1-NEXT:    movl 4(%edx), %edi2989; X86-BMI1-NEXT:    movl %edi, %edx2990; X86-BMI1-NEXT:    shrl %cl, %edx2991; X86-BMI1-NEXT:    shrdl %cl, %edi, %esi2992; X86-BMI1-NEXT:    testb $32, %cl2993; X86-BMI1-NEXT:    je .LBB27_22994; X86-BMI1-NEXT:  # %bb.1:2995; X86-BMI1-NEXT:    movl %edx, %esi2996; X86-BMI1-NEXT:    xorl %edx, %edx2997; X86-BMI1-NEXT:  .LBB27_2:2998; X86-BMI1-NEXT:    movl $-1, %edi2999; X86-BMI1-NEXT:    movl $-1, %ebx3000; X86-BMI1-NEXT:    movl %eax, %ecx3001; X86-BMI1-NEXT:    shll %cl, %ebx3002; X86-BMI1-NEXT:    testb $32, %al3003; X86-BMI1-NEXT:    je .LBB27_43004; X86-BMI1-NEXT:  # %bb.3:3005; X86-BMI1-NEXT:    movl %ebx, %edi3006; X86-BMI1-NEXT:    xorl %ebx, %ebx3007; X86-BMI1-NEXT:  .LBB27_4:3008; X86-BMI1-NEXT:    andnl %edx, %edi, %edx3009; X86-BMI1-NEXT:    andnl %esi, %ebx, %eax3010; X86-BMI1-NEXT:    popl %esi3011; X86-BMI1-NEXT:    popl %edi3012; X86-BMI1-NEXT:    popl %ebx3013; X86-BMI1-NEXT:    retl3014;3015; X86-BMI2-LABEL: bextr64_b2_load:3016; X86-BMI2:       # %bb.0:3017; X86-BMI2-NEXT:    pushl %ebx3018; X86-BMI2-NEXT:    pushl %esi3019; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %ebx3020; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx3021; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %edx3022; X86-BMI2-NEXT:    movl (%edx), %eax3023; X86-BMI2-NEXT:    movl 4(%edx), %esi3024; X86-BMI2-NEXT:    shrxl %ecx, %esi, %edx3025; X86-BMI2-NEXT:    shrdl %cl, %esi, %eax3026; X86-BMI2-NEXT:    testb $32, %cl3027; X86-BMI2-NEXT:    je .LBB27_23028; X86-BMI2-NEXT:  # %bb.1:3029; X86-BMI2-NEXT:    movl %edx, %eax3030; X86-BMI2-NEXT:    xorl %edx, %edx3031; X86-BMI2-NEXT:  .LBB27_2:3032; X86-BMI2-NEXT:    movl $-1, %esi3033; X86-BMI2-NEXT:    shlxl %ebx, %esi, %ecx3034; X86-BMI2-NEXT:    testb $32, %bl3035; X86-BMI2-NEXT:    je .LBB27_43036; X86-BMI2-NEXT:  # %bb.3:3037; X86-BMI2-NEXT:    movl %ecx, %esi3038; X86-BMI2-NEXT:    xorl %ecx, %ecx3039; X86-BMI2-NEXT:  .LBB27_4:3040; X86-BMI2-NEXT:    andnl %edx, %esi, %edx3041; X86-BMI2-NEXT:    andnl %eax, %ecx, %eax3042; X86-BMI2-NEXT:    popl %esi3043; X86-BMI2-NEXT:    popl %ebx3044; X86-BMI2-NEXT:    retl3045;3046; X64-NOBMI-LABEL: bextr64_b2_load:3047; X64-NOBMI:       # %bb.0:3048; X64-NOBMI-NEXT:    movq %rsi, %rcx3049; X64-NOBMI-NEXT:    movq (%rdi), %rsi3050; X64-NOBMI-NEXT:    # kill: def $cl killed $cl killed $rcx3051; X64-NOBMI-NEXT:    shrq %cl, %rsi3052; X64-NOBMI-NEXT:    movq $-1, %rax3053; X64-NOBMI-NEXT:    movl %edx, %ecx3054; X64-NOBMI-NEXT:    shlq %cl, %rax3055; X64-NOBMI-NEXT:    notq %rax3056; X64-NOBMI-NEXT:    andq %rsi, %rax3057; X64-NOBMI-NEXT:    retq3058;3059; X64-BMI1-LABEL: bextr64_b2_load:3060; X64-BMI1:       # %bb.0:3061; X64-BMI1-NEXT:    shll $8, %edx3062; X64-BMI1-NEXT:    movzbl %sil, %eax3063; X64-BMI1-NEXT:    orl %edx, %eax3064; X64-BMI1-NEXT:    bextrq %rax, (%rdi), %rax3065; X64-BMI1-NEXT:    retq3066;3067; X64-BMI2-LABEL: bextr64_b2_load:3068; X64-BMI2:       # %bb.0:3069; X64-BMI2-NEXT:    shrxq %rsi, (%rdi), %rax3070; X64-BMI2-NEXT:    bzhiq %rdx, %rax, %rax3071; X64-BMI2-NEXT:    retq3072  %val = load i64, ptr %w3073  %shifted = lshr i64 %val, %numskipbits3074  %notmask = shl i64 -1, %numlowbits3075  %mask = xor i64 %notmask, -13076  %masked = and i64 %mask, %shifted3077  ret i64 %masked3078}3079 3080define i64 @bextr64_b3_load_indexzext(ptr %w, i8 zeroext %numskipbits, i8 zeroext %numlowbits) nounwind {3081; X86-NOBMI-LABEL: bextr64_b3_load_indexzext:3082; X86-NOBMI:       # %bb.0:3083; X86-NOBMI-NEXT:    pushl %ebx3084; X86-NOBMI-NEXT:    pushl %edi3085; X86-NOBMI-NEXT:    pushl %esi3086; X86-NOBMI-NEXT:    movb {{[0-9]+}}(%esp), %ch3087; X86-NOBMI-NEXT:    movb {{[0-9]+}}(%esp), %cl3088; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %eax3089; X86-NOBMI-NEXT:    movl (%eax), %esi3090; X86-NOBMI-NEXT:    movl 4(%eax), %eax3091; X86-NOBMI-NEXT:    movl %eax, %edi3092; X86-NOBMI-NEXT:    shrl %cl, %edi3093; X86-NOBMI-NEXT:    shrdl %cl, %eax, %esi3094; X86-NOBMI-NEXT:    xorl %eax, %eax3095; X86-NOBMI-NEXT:    testb $32, %cl3096; X86-NOBMI-NEXT:    je .LBB28_23097; X86-NOBMI-NEXT:  # %bb.1:3098; X86-NOBMI-NEXT:    movl %edi, %esi3099; X86-NOBMI-NEXT:    xorl %edi, %edi3100; X86-NOBMI-NEXT:  .LBB28_2:3101; X86-NOBMI-NEXT:    movl $-1, %edx3102; X86-NOBMI-NEXT:    movl $-1, %ebx3103; X86-NOBMI-NEXT:    movb %ch, %cl3104; X86-NOBMI-NEXT:    shll %cl, %ebx3105; X86-NOBMI-NEXT:    testb $32, %ch3106; X86-NOBMI-NEXT:    jne .LBB28_33107; X86-NOBMI-NEXT:  # %bb.4:3108; X86-NOBMI-NEXT:    movl %ebx, %eax3109; X86-NOBMI-NEXT:    jmp .LBB28_53110; X86-NOBMI-NEXT:  .LBB28_3:3111; X86-NOBMI-NEXT:    movl %ebx, %edx3112; X86-NOBMI-NEXT:  .LBB28_5:3113; X86-NOBMI-NEXT:    notl %edx3114; X86-NOBMI-NEXT:    andl %edi, %edx3115; X86-NOBMI-NEXT:    notl %eax3116; X86-NOBMI-NEXT:    andl %esi, %eax3117; X86-NOBMI-NEXT:    popl %esi3118; X86-NOBMI-NEXT:    popl %edi3119; X86-NOBMI-NEXT:    popl %ebx3120; X86-NOBMI-NEXT:    retl3121;3122; X86-BMI1-LABEL: bextr64_b3_load_indexzext:3123; X86-BMI1:       # %bb.0:3124; X86-BMI1-NEXT:    pushl %ebx3125; X86-BMI1-NEXT:    pushl %edi3126; X86-BMI1-NEXT:    pushl %esi3127; X86-BMI1-NEXT:    movzbl {{[0-9]+}}(%esp), %eax3128; X86-BMI1-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx3129; X86-BMI1-NEXT:    movl {{[0-9]+}}(%esp), %edx3130; X86-BMI1-NEXT:    movl (%edx), %esi3131; X86-BMI1-NEXT:    movl 4(%edx), %edi3132; X86-BMI1-NEXT:    movl %edi, %edx3133; X86-BMI1-NEXT:    shrl %cl, %edx3134; X86-BMI1-NEXT:    shrdl %cl, %edi, %esi3135; X86-BMI1-NEXT:    testb $32, %cl3136; X86-BMI1-NEXT:    je .LBB28_23137; X86-BMI1-NEXT:  # %bb.1:3138; X86-BMI1-NEXT:    movl %edx, %esi3139; X86-BMI1-NEXT:    xorl %edx, %edx3140; X86-BMI1-NEXT:  .LBB28_2:3141; X86-BMI1-NEXT:    movl $-1, %edi3142; X86-BMI1-NEXT:    movl $-1, %ebx3143; X86-BMI1-NEXT:    movl %eax, %ecx3144; X86-BMI1-NEXT:    shll %cl, %ebx3145; X86-BMI1-NEXT:    testb $32, %al3146; X86-BMI1-NEXT:    je .LBB28_43147; X86-BMI1-NEXT:  # %bb.3:3148; X86-BMI1-NEXT:    movl %ebx, %edi3149; X86-BMI1-NEXT:    xorl %ebx, %ebx3150; X86-BMI1-NEXT:  .LBB28_4:3151; X86-BMI1-NEXT:    andnl %edx, %edi, %edx3152; X86-BMI1-NEXT:    andnl %esi, %ebx, %eax3153; X86-BMI1-NEXT:    popl %esi3154; X86-BMI1-NEXT:    popl %edi3155; X86-BMI1-NEXT:    popl %ebx3156; X86-BMI1-NEXT:    retl3157;3158; X86-BMI2-LABEL: bextr64_b3_load_indexzext:3159; X86-BMI2:       # %bb.0:3160; X86-BMI2-NEXT:    pushl %ebx3161; X86-BMI2-NEXT:    pushl %esi3162; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %ebx3163; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx3164; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %edx3165; X86-BMI2-NEXT:    movl (%edx), %eax3166; X86-BMI2-NEXT:    movl 4(%edx), %esi3167; X86-BMI2-NEXT:    shrxl %ecx, %esi, %edx3168; X86-BMI2-NEXT:    shrdl %cl, %esi, %eax3169; X86-BMI2-NEXT:    testb $32, %cl3170; X86-BMI2-NEXT:    je .LBB28_23171; X86-BMI2-NEXT:  # %bb.1:3172; X86-BMI2-NEXT:    movl %edx, %eax3173; X86-BMI2-NEXT:    xorl %edx, %edx3174; X86-BMI2-NEXT:  .LBB28_2:3175; X86-BMI2-NEXT:    movl $-1, %esi3176; X86-BMI2-NEXT:    shlxl %ebx, %esi, %ecx3177; X86-BMI2-NEXT:    testb $32, %bl3178; X86-BMI2-NEXT:    je .LBB28_43179; X86-BMI2-NEXT:  # %bb.3:3180; X86-BMI2-NEXT:    movl %ecx, %esi3181; X86-BMI2-NEXT:    xorl %ecx, %ecx3182; X86-BMI2-NEXT:  .LBB28_4:3183; X86-BMI2-NEXT:    andnl %edx, %esi, %edx3184; X86-BMI2-NEXT:    andnl %eax, %ecx, %eax3185; X86-BMI2-NEXT:    popl %esi3186; X86-BMI2-NEXT:    popl %ebx3187; X86-BMI2-NEXT:    retl3188;3189; X64-NOBMI-LABEL: bextr64_b3_load_indexzext:3190; X64-NOBMI:       # %bb.0:3191; X64-NOBMI-NEXT:    movl %esi, %ecx3192; X64-NOBMI-NEXT:    movq (%rdi), %rsi3193; X64-NOBMI-NEXT:    # kill: def $cl killed $cl killed $ecx3194; X64-NOBMI-NEXT:    shrq %cl, %rsi3195; X64-NOBMI-NEXT:    movq $-1, %rax3196; X64-NOBMI-NEXT:    movl %edx, %ecx3197; X64-NOBMI-NEXT:    shlq %cl, %rax3198; X64-NOBMI-NEXT:    notq %rax3199; X64-NOBMI-NEXT:    andq %rsi, %rax3200; X64-NOBMI-NEXT:    retq3201;3202; X64-BMI1-LABEL: bextr64_b3_load_indexzext:3203; X64-BMI1:       # %bb.0:3204; X64-BMI1-NEXT:    # kill: def $edx killed $edx def $rdx3205; X64-BMI1-NEXT:    shll $8, %edx3206; X64-BMI1-NEXT:    orl %esi, %edx3207; X64-BMI1-NEXT:    bextrq %rdx, (%rdi), %rax3208; X64-BMI1-NEXT:    retq3209;3210; X64-BMI2-LABEL: bextr64_b3_load_indexzext:3211; X64-BMI2:       # %bb.0:3212; X64-BMI2-NEXT:    # kill: def $edx killed $edx def $rdx3213; X64-BMI2-NEXT:    # kill: def $esi killed $esi def $rsi3214; X64-BMI2-NEXT:    shrxq %rsi, (%rdi), %rax3215; X64-BMI2-NEXT:    bzhiq %rdx, %rax, %rax3216; X64-BMI2-NEXT:    retq3217  %val = load i64, ptr %w3218  %skip = zext i8 %numskipbits to i643219  %shifted = lshr i64 %val, %skip3220  %conv = zext i8 %numlowbits to i643221  %notmask = shl i64 -1, %conv3222  %mask = xor i64 %notmask, -13223  %masked = and i64 %mask, %shifted3224  ret i64 %masked3225}3226 3227define i64 @bextr64_b4_commutative(i64 %val, i64 %numskipbits, i64 %numlowbits) nounwind {3228; X86-NOBMI-LABEL: bextr64_b4_commutative:3229; X86-NOBMI:       # %bb.0:3230; X86-NOBMI-NEXT:    pushl %ebx3231; X86-NOBMI-NEXT:    pushl %edi3232; X86-NOBMI-NEXT:    pushl %esi3233; X86-NOBMI-NEXT:    movb {{[0-9]+}}(%esp), %ch3234; X86-NOBMI-NEXT:    movb {{[0-9]+}}(%esp), %cl3235; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %eax3236; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %esi3237; X86-NOBMI-NEXT:    movl %esi, %edx3238; X86-NOBMI-NEXT:    shrl %cl, %edx3239; X86-NOBMI-NEXT:    shrdl %cl, %esi, %eax3240; X86-NOBMI-NEXT:    xorl %esi, %esi3241; X86-NOBMI-NEXT:    testb $32, %cl3242; X86-NOBMI-NEXT:    je .LBB29_23243; X86-NOBMI-NEXT:  # %bb.1:3244; X86-NOBMI-NEXT:    movl %edx, %eax3245; X86-NOBMI-NEXT:    xorl %edx, %edx3246; X86-NOBMI-NEXT:  .LBB29_2:3247; X86-NOBMI-NEXT:    movl $-1, %edi3248; X86-NOBMI-NEXT:    movl $-1, %ebx3249; X86-NOBMI-NEXT:    movb %ch, %cl3250; X86-NOBMI-NEXT:    shll %cl, %ebx3251; X86-NOBMI-NEXT:    testb $32, %ch3252; X86-NOBMI-NEXT:    jne .LBB29_33253; X86-NOBMI-NEXT:  # %bb.4:3254; X86-NOBMI-NEXT:    movl %ebx, %esi3255; X86-NOBMI-NEXT:    jmp .LBB29_53256; X86-NOBMI-NEXT:  .LBB29_3:3257; X86-NOBMI-NEXT:    movl %ebx, %edi3258; X86-NOBMI-NEXT:  .LBB29_5:3259; X86-NOBMI-NEXT:    notl %edi3260; X86-NOBMI-NEXT:    andl %edi, %edx3261; X86-NOBMI-NEXT:    notl %esi3262; X86-NOBMI-NEXT:    andl %esi, %eax3263; X86-NOBMI-NEXT:    popl %esi3264; X86-NOBMI-NEXT:    popl %edi3265; X86-NOBMI-NEXT:    popl %ebx3266; X86-NOBMI-NEXT:    retl3267;3268; X86-BMI1-LABEL: bextr64_b4_commutative:3269; X86-BMI1:       # %bb.0:3270; X86-BMI1-NEXT:    pushl %ebx3271; X86-BMI1-NEXT:    pushl %edi3272; X86-BMI1-NEXT:    pushl %esi3273; X86-BMI1-NEXT:    movzbl {{[0-9]+}}(%esp), %eax3274; X86-BMI1-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx3275; X86-BMI1-NEXT:    movl {{[0-9]+}}(%esp), %esi3276; X86-BMI1-NEXT:    movl {{[0-9]+}}(%esp), %edi3277; X86-BMI1-NEXT:    movl %edi, %edx3278; X86-BMI1-NEXT:    shrl %cl, %edx3279; X86-BMI1-NEXT:    shrdl %cl, %edi, %esi3280; X86-BMI1-NEXT:    testb $32, %cl3281; X86-BMI1-NEXT:    je .LBB29_23282; X86-BMI1-NEXT:  # %bb.1:3283; X86-BMI1-NEXT:    movl %edx, %esi3284; X86-BMI1-NEXT:    xorl %edx, %edx3285; X86-BMI1-NEXT:  .LBB29_2:3286; X86-BMI1-NEXT:    movl $-1, %edi3287; X86-BMI1-NEXT:    movl $-1, %ebx3288; X86-BMI1-NEXT:    movl %eax, %ecx3289; X86-BMI1-NEXT:    shll %cl, %ebx3290; X86-BMI1-NEXT:    testb $32, %al3291; X86-BMI1-NEXT:    je .LBB29_43292; X86-BMI1-NEXT:  # %bb.3:3293; X86-BMI1-NEXT:    movl %ebx, %edi3294; X86-BMI1-NEXT:    xorl %ebx, %ebx3295; X86-BMI1-NEXT:  .LBB29_4:3296; X86-BMI1-NEXT:    andnl %edx, %edi, %edx3297; X86-BMI1-NEXT:    andnl %esi, %ebx, %eax3298; X86-BMI1-NEXT:    popl %esi3299; X86-BMI1-NEXT:    popl %edi3300; X86-BMI1-NEXT:    popl %ebx3301; X86-BMI1-NEXT:    retl3302;3303; X86-BMI2-LABEL: bextr64_b4_commutative:3304; X86-BMI2:       # %bb.0:3305; X86-BMI2-NEXT:    pushl %ebx3306; X86-BMI2-NEXT:    pushl %esi3307; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %ebx3308; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx3309; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %eax3310; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %edx3311; X86-BMI2-NEXT:    shrdl %cl, %edx, %eax3312; X86-BMI2-NEXT:    shrxl %ecx, %edx, %edx3313; X86-BMI2-NEXT:    testb $32, %cl3314; X86-BMI2-NEXT:    je .LBB29_23315; X86-BMI2-NEXT:  # %bb.1:3316; X86-BMI2-NEXT:    movl %edx, %eax3317; X86-BMI2-NEXT:    xorl %edx, %edx3318; X86-BMI2-NEXT:  .LBB29_2:3319; X86-BMI2-NEXT:    movl $-1, %esi3320; X86-BMI2-NEXT:    shlxl %ebx, %esi, %ecx3321; X86-BMI2-NEXT:    testb $32, %bl3322; X86-BMI2-NEXT:    je .LBB29_43323; X86-BMI2-NEXT:  # %bb.3:3324; X86-BMI2-NEXT:    movl %ecx, %esi3325; X86-BMI2-NEXT:    xorl %ecx, %ecx3326; X86-BMI2-NEXT:  .LBB29_4:3327; X86-BMI2-NEXT:    andnl %edx, %esi, %edx3328; X86-BMI2-NEXT:    andnl %eax, %ecx, %eax3329; X86-BMI2-NEXT:    popl %esi3330; X86-BMI2-NEXT:    popl %ebx3331; X86-BMI2-NEXT:    retl3332;3333; X64-NOBMI-LABEL: bextr64_b4_commutative:3334; X64-NOBMI:       # %bb.0:3335; X64-NOBMI-NEXT:    movq %rsi, %rcx3336; X64-NOBMI-NEXT:    # kill: def $cl killed $cl killed $rcx3337; X64-NOBMI-NEXT:    shrq %cl, %rdi3338; X64-NOBMI-NEXT:    movq $-1, %rax3339; X64-NOBMI-NEXT:    movl %edx, %ecx3340; X64-NOBMI-NEXT:    shlq %cl, %rax3341; X64-NOBMI-NEXT:    notq %rax3342; X64-NOBMI-NEXT:    andq %rdi, %rax3343; X64-NOBMI-NEXT:    retq3344;3345; X64-BMI1-LABEL: bextr64_b4_commutative:3346; X64-BMI1:       # %bb.0:3347; X64-BMI1-NEXT:    shll $8, %edx3348; X64-BMI1-NEXT:    movzbl %sil, %eax3349; X64-BMI1-NEXT:    orl %edx, %eax3350; X64-BMI1-NEXT:    bextrq %rax, %rdi, %rax3351; X64-BMI1-NEXT:    retq3352;3353; X64-BMI2-LABEL: bextr64_b4_commutative:3354; X64-BMI2:       # %bb.0:3355; X64-BMI2-NEXT:    shrxq %rsi, %rdi, %rax3356; X64-BMI2-NEXT:    bzhiq %rdx, %rax, %rax3357; X64-BMI2-NEXT:    retq3358  %shifted = lshr i64 %val, %numskipbits3359  %notmask = shl i64 -1, %numlowbits3360  %mask = xor i64 %notmask, -13361  %masked = and i64 %shifted, %mask ; swapped order3362  ret i64 %masked3363}3364 3365define i64 @bextr64_b5_skipextrauses(i64 %val, i64 %numskipbits, i64 %numlowbits) nounwind {3366; X86-NOBMI-LABEL: bextr64_b5_skipextrauses:3367; X86-NOBMI:       # %bb.0:3368; X86-NOBMI-NEXT:    pushl %ebp3369; X86-NOBMI-NEXT:    pushl %ebx3370; X86-NOBMI-NEXT:    pushl %edi3371; X86-NOBMI-NEXT:    pushl %esi3372; X86-NOBMI-NEXT:    subl $12, %esp3373; X86-NOBMI-NEXT:    movb {{[0-9]+}}(%esp), %ch3374; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %edx3375; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %esi3376; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %eax3377; X86-NOBMI-NEXT:    movl %esi, %ebp3378; X86-NOBMI-NEXT:    movb %al, %cl3379; X86-NOBMI-NEXT:    shrl %cl, %ebp3380; X86-NOBMI-NEXT:    shrdl %cl, %esi, %edx3381; X86-NOBMI-NEXT:    xorl %ebx, %ebx3382; X86-NOBMI-NEXT:    testb $32, %al3383; X86-NOBMI-NEXT:    je .LBB30_23384; X86-NOBMI-NEXT:  # %bb.1:3385; X86-NOBMI-NEXT:    movl %ebp, %edx3386; X86-NOBMI-NEXT:    xorl %ebp, %ebp3387; X86-NOBMI-NEXT:  .LBB30_2:3388; X86-NOBMI-NEXT:    movl $-1, %edi3389; X86-NOBMI-NEXT:    movl $-1, %esi3390; X86-NOBMI-NEXT:    movb %ch, %cl3391; X86-NOBMI-NEXT:    shll %cl, %esi3392; X86-NOBMI-NEXT:    testb $32, %ch3393; X86-NOBMI-NEXT:    jne .LBB30_33394; X86-NOBMI-NEXT:  # %bb.4:3395; X86-NOBMI-NEXT:    movl %esi, %ebx3396; X86-NOBMI-NEXT:    jmp .LBB30_53397; X86-NOBMI-NEXT:  .LBB30_3:3398; X86-NOBMI-NEXT:    movl %esi, %edi3399; X86-NOBMI-NEXT:  .LBB30_5:3400; X86-NOBMI-NEXT:    notl %edi3401; X86-NOBMI-NEXT:    andl %ebp, %edi3402; X86-NOBMI-NEXT:    notl %ebx3403; X86-NOBMI-NEXT:    andl %edx, %ebx3404; X86-NOBMI-NEXT:    subl $8, %esp3405; X86-NOBMI-NEXT:    pushl {{[0-9]+}}(%esp)3406; X86-NOBMI-NEXT:    pushl %eax3407; X86-NOBMI-NEXT:    calll use64@PLT3408; X86-NOBMI-NEXT:    addl $16, %esp3409; X86-NOBMI-NEXT:    movl %ebx, %eax3410; X86-NOBMI-NEXT:    movl %edi, %edx3411; X86-NOBMI-NEXT:    addl $12, %esp3412; X86-NOBMI-NEXT:    popl %esi3413; X86-NOBMI-NEXT:    popl %edi3414; X86-NOBMI-NEXT:    popl %ebx3415; X86-NOBMI-NEXT:    popl %ebp3416; X86-NOBMI-NEXT:    retl3417;3418; X86-BMI1-LABEL: bextr64_b5_skipextrauses:3419; X86-BMI1:       # %bb.0:3420; X86-BMI1-NEXT:    pushl %ebp3421; X86-BMI1-NEXT:    pushl %ebx3422; X86-BMI1-NEXT:    pushl %edi3423; X86-BMI1-NEXT:    pushl %esi3424; X86-BMI1-NEXT:    subl $12, %esp3425; X86-BMI1-NEXT:    movzbl {{[0-9]+}}(%esp), %edx3426; X86-BMI1-NEXT:    movl {{[0-9]+}}(%esp), %edi3427; X86-BMI1-NEXT:    movl {{[0-9]+}}(%esp), %ebx3428; X86-BMI1-NEXT:    movl {{[0-9]+}}(%esp), %eax3429; X86-BMI1-NEXT:    movl %ebx, %esi3430; X86-BMI1-NEXT:    movl %eax, %ecx3431; X86-BMI1-NEXT:    shrl %cl, %esi3432; X86-BMI1-NEXT:    shrdl %cl, %ebx, %edi3433; X86-BMI1-NEXT:    testb $32, %al3434; X86-BMI1-NEXT:    je .LBB30_23435; X86-BMI1-NEXT:  # %bb.1:3436; X86-BMI1-NEXT:    movl %esi, %edi3437; X86-BMI1-NEXT:    xorl %esi, %esi3438; X86-BMI1-NEXT:  .LBB30_2:3439; X86-BMI1-NEXT:    movl $-1, %ebx3440; X86-BMI1-NEXT:    movl $-1, %ebp3441; X86-BMI1-NEXT:    movl %edx, %ecx3442; X86-BMI1-NEXT:    shll %cl, %ebp3443; X86-BMI1-NEXT:    testb $32, %dl3444; X86-BMI1-NEXT:    je .LBB30_43445; X86-BMI1-NEXT:  # %bb.3:3446; X86-BMI1-NEXT:    movl %ebp, %ebx3447; X86-BMI1-NEXT:    xorl %ebp, %ebp3448; X86-BMI1-NEXT:  .LBB30_4:3449; X86-BMI1-NEXT:    andnl %esi, %ebx, %esi3450; X86-BMI1-NEXT:    andnl %edi, %ebp, %edi3451; X86-BMI1-NEXT:    subl $8, %esp3452; X86-BMI1-NEXT:    pushl {{[0-9]+}}(%esp)3453; X86-BMI1-NEXT:    pushl %eax3454; X86-BMI1-NEXT:    calll use64@PLT3455; X86-BMI1-NEXT:    addl $16, %esp3456; X86-BMI1-NEXT:    movl %edi, %eax3457; X86-BMI1-NEXT:    movl %esi, %edx3458; X86-BMI1-NEXT:    addl $12, %esp3459; X86-BMI1-NEXT:    popl %esi3460; X86-BMI1-NEXT:    popl %edi3461; X86-BMI1-NEXT:    popl %ebx3462; X86-BMI1-NEXT:    popl %ebp3463; X86-BMI1-NEXT:    retl3464;3465; X86-BMI2-LABEL: bextr64_b5_skipextrauses:3466; X86-BMI2:       # %bb.0:3467; X86-BMI2-NEXT:    pushl %ebp3468; X86-BMI2-NEXT:    pushl %ebx3469; X86-BMI2-NEXT:    pushl %edi3470; X86-BMI2-NEXT:    pushl %esi3471; X86-BMI2-NEXT:    subl $12, %esp3472; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %ebx3473; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %eax3474; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %edx3475; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %ecx3476; X86-BMI2-NEXT:    shrdl %cl, %edx, %eax3477; X86-BMI2-NEXT:    shrxl %ecx, %edx, %edx3478; X86-BMI2-NEXT:    testb $32, %cl3479; X86-BMI2-NEXT:    je .LBB30_23480; X86-BMI2-NEXT:  # %bb.1:3481; X86-BMI2-NEXT:    movl %edx, %eax3482; X86-BMI2-NEXT:    xorl %edx, %edx3483; X86-BMI2-NEXT:  .LBB30_2:3484; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %ebp3485; X86-BMI2-NEXT:    movl $-1, %esi3486; X86-BMI2-NEXT:    shlxl %ebx, %esi, %edi3487; X86-BMI2-NEXT:    testb $32, %bl3488; X86-BMI2-NEXT:    je .LBB30_43489; X86-BMI2-NEXT:  # %bb.3:3490; X86-BMI2-NEXT:    movl %edi, %esi3491; X86-BMI2-NEXT:    xorl %edi, %edi3492; X86-BMI2-NEXT:  .LBB30_4:3493; X86-BMI2-NEXT:    andnl %edx, %esi, %esi3494; X86-BMI2-NEXT:    andnl %eax, %edi, %edi3495; X86-BMI2-NEXT:    subl $8, %esp3496; X86-BMI2-NEXT:    pushl %ebp3497; X86-BMI2-NEXT:    pushl %ecx3498; X86-BMI2-NEXT:    calll use64@PLT3499; X86-BMI2-NEXT:    addl $16, %esp3500; X86-BMI2-NEXT:    movl %edi, %eax3501; X86-BMI2-NEXT:    movl %esi, %edx3502; X86-BMI2-NEXT:    addl $12, %esp3503; X86-BMI2-NEXT:    popl %esi3504; X86-BMI2-NEXT:    popl %edi3505; X86-BMI2-NEXT:    popl %ebx3506; X86-BMI2-NEXT:    popl %ebp3507; X86-BMI2-NEXT:    retl3508;3509; X64-NOBMI-LABEL: bextr64_b5_skipextrauses:3510; X64-NOBMI:       # %bb.0:3511; X64-NOBMI-NEXT:    pushq %rbx3512; X64-NOBMI-NEXT:    movl %esi, %ecx3513; X64-NOBMI-NEXT:    shrq %cl, %rdi3514; X64-NOBMI-NEXT:    movq $-1, %rbx3515; X64-NOBMI-NEXT:    movl %edx, %ecx3516; X64-NOBMI-NEXT:    shlq %cl, %rbx3517; X64-NOBMI-NEXT:    notq %rbx3518; X64-NOBMI-NEXT:    andq %rdi, %rbx3519; X64-NOBMI-NEXT:    movq %rsi, %rdi3520; X64-NOBMI-NEXT:    callq use64@PLT3521; X64-NOBMI-NEXT:    movq %rbx, %rax3522; X64-NOBMI-NEXT:    popq %rbx3523; X64-NOBMI-NEXT:    retq3524;3525; X64-BMI1-LABEL: bextr64_b5_skipextrauses:3526; X64-BMI1:       # %bb.0:3527; X64-BMI1-NEXT:    pushq %rbx3528; X64-BMI1-NEXT:    shll $8, %edx3529; X64-BMI1-NEXT:    movzbl %sil, %eax3530; X64-BMI1-NEXT:    orl %edx, %eax3531; X64-BMI1-NEXT:    bextrq %rax, %rdi, %rbx3532; X64-BMI1-NEXT:    movq %rsi, %rdi3533; X64-BMI1-NEXT:    callq use64@PLT3534; X64-BMI1-NEXT:    movq %rbx, %rax3535; X64-BMI1-NEXT:    popq %rbx3536; X64-BMI1-NEXT:    retq3537;3538; X64-BMI2-LABEL: bextr64_b5_skipextrauses:3539; X64-BMI2:       # %bb.0:3540; X64-BMI2-NEXT:    pushq %rbx3541; X64-BMI2-NEXT:    shrxq %rsi, %rdi, %rax3542; X64-BMI2-NEXT:    bzhiq %rdx, %rax, %rbx3543; X64-BMI2-NEXT:    movq %rsi, %rdi3544; X64-BMI2-NEXT:    callq use64@PLT3545; X64-BMI2-NEXT:    movq %rbx, %rax3546; X64-BMI2-NEXT:    popq %rbx3547; X64-BMI2-NEXT:    retq3548  %shifted = lshr i64 %val, %numskipbits3549  %notmask = shl i64 -1, %numlowbits3550  %mask = xor i64 %notmask, -13551  %masked = and i64 %mask, %shifted3552  call void @use64(i64 %numskipbits)3553  ret i64 %masked3554}3555 3556; 64-bit, but with 32-bit output3557 3558; Everything done in 64-bit, truncation happens last.3559define i32 @bextr64_32_b0(i64 %val, i64 %numskipbits, i8 %numlowbits) nounwind {3560; X86-NOBMI-LABEL: bextr64_32_b0:3561; X86-NOBMI:       # %bb.0:3562; X86-NOBMI-NEXT:    pushl %edi3563; X86-NOBMI-NEXT:    pushl %esi3564; X86-NOBMI-NEXT:    movzbl {{[0-9]+}}(%esp), %edx3565; X86-NOBMI-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx3566; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %esi3567; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %edi3568; X86-NOBMI-NEXT:    movl %edi, %eax3569; X86-NOBMI-NEXT:    shrl %cl, %eax3570; X86-NOBMI-NEXT:    shrdl %cl, %edi, %esi3571; X86-NOBMI-NEXT:    testb $32, %cl3572; X86-NOBMI-NEXT:    jne .LBB31_23573; X86-NOBMI-NEXT:  # %bb.1:3574; X86-NOBMI-NEXT:    movl %esi, %eax3575; X86-NOBMI-NEXT:  .LBB31_2:3576; X86-NOBMI-NEXT:    movl $-1, %esi3577; X86-NOBMI-NEXT:    movl %edx, %ecx3578; X86-NOBMI-NEXT:    shll %cl, %esi3579; X86-NOBMI-NEXT:    xorl %ecx, %ecx3580; X86-NOBMI-NEXT:    testb $32, %dl3581; X86-NOBMI-NEXT:    jne .LBB31_43582; X86-NOBMI-NEXT:  # %bb.3:3583; X86-NOBMI-NEXT:    movl %esi, %ecx3584; X86-NOBMI-NEXT:  .LBB31_4:3585; X86-NOBMI-NEXT:    notl %ecx3586; X86-NOBMI-NEXT:    andl %ecx, %eax3587; X86-NOBMI-NEXT:    popl %esi3588; X86-NOBMI-NEXT:    popl %edi3589; X86-NOBMI-NEXT:    retl3590;3591; X86-BMI1-LABEL: bextr64_32_b0:3592; X86-BMI1:       # %bb.0:3593; X86-BMI1-NEXT:    pushl %edi3594; X86-BMI1-NEXT:    pushl %esi3595; X86-BMI1-NEXT:    movzbl {{[0-9]+}}(%esp), %eax3596; X86-BMI1-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx3597; X86-BMI1-NEXT:    movl {{[0-9]+}}(%esp), %esi3598; X86-BMI1-NEXT:    movl {{[0-9]+}}(%esp), %edi3599; X86-BMI1-NEXT:    movl %edi, %edx3600; X86-BMI1-NEXT:    shrl %cl, %edx3601; X86-BMI1-NEXT:    shrdl %cl, %edi, %esi3602; X86-BMI1-NEXT:    testb $32, %cl3603; X86-BMI1-NEXT:    jne .LBB31_23604; X86-BMI1-NEXT:  # %bb.1:3605; X86-BMI1-NEXT:    movl %esi, %edx3606; X86-BMI1-NEXT:  .LBB31_2:3607; X86-BMI1-NEXT:    movl $-1, %esi3608; X86-BMI1-NEXT:    movl %eax, %ecx3609; X86-BMI1-NEXT:    shll %cl, %esi3610; X86-BMI1-NEXT:    xorl %ecx, %ecx3611; X86-BMI1-NEXT:    testb $32, %al3612; X86-BMI1-NEXT:    jne .LBB31_43613; X86-BMI1-NEXT:  # %bb.3:3614; X86-BMI1-NEXT:    movl %esi, %ecx3615; X86-BMI1-NEXT:  .LBB31_4:3616; X86-BMI1-NEXT:    andnl %edx, %ecx, %eax3617; X86-BMI1-NEXT:    popl %esi3618; X86-BMI1-NEXT:    popl %edi3619; X86-BMI1-NEXT:    retl3620;3621; X86-BMI2-LABEL: bextr64_32_b0:3622; X86-BMI2:       # %bb.0:3623; X86-BMI2-NEXT:    pushl %esi3624; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %eax3625; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx3626; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %edx3627; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %esi3628; X86-BMI2-NEXT:    shrdl %cl, %esi, %edx3629; X86-BMI2-NEXT:    testb $32, %cl3630; X86-BMI2-NEXT:    je .LBB31_23631; X86-BMI2-NEXT:  # %bb.1:3632; X86-BMI2-NEXT:    shrxl %ecx, %esi, %edx3633; X86-BMI2-NEXT:  .LBB31_2:3634; X86-BMI2-NEXT:    xorl %ecx, %ecx3635; X86-BMI2-NEXT:    testb $32, %al3636; X86-BMI2-NEXT:    jne .LBB31_43637; X86-BMI2-NEXT:  # %bb.3:3638; X86-BMI2-NEXT:    movl $-1, %ecx3639; X86-BMI2-NEXT:    shlxl %eax, %ecx, %ecx3640; X86-BMI2-NEXT:  .LBB31_4:3641; X86-BMI2-NEXT:    andnl %edx, %ecx, %eax3642; X86-BMI2-NEXT:    popl %esi3643; X86-BMI2-NEXT:    retl3644;3645; X64-NOBMI-LABEL: bextr64_32_b0:3646; X64-NOBMI:       # %bb.0:3647; X64-NOBMI-NEXT:    movq %rsi, %rcx3648; X64-NOBMI-NEXT:    # kill: def $cl killed $cl killed $rcx3649; X64-NOBMI-NEXT:    shrq %cl, %rdi3650; X64-NOBMI-NEXT:    movq $-1, %rax3651; X64-NOBMI-NEXT:    movl %edx, %ecx3652; X64-NOBMI-NEXT:    shlq %cl, %rax3653; X64-NOBMI-NEXT:    notl %eax3654; X64-NOBMI-NEXT:    andl %edi, %eax3655; X64-NOBMI-NEXT:    # kill: def $eax killed $eax killed $rax3656; X64-NOBMI-NEXT:    retq3657;3658; X64-BMI1-LABEL: bextr64_32_b0:3659; X64-BMI1:       # %bb.0:3660; X64-BMI1-NEXT:    shll $8, %edx3661; X64-BMI1-NEXT:    movzbl %sil, %eax3662; X64-BMI1-NEXT:    orl %edx, %eax3663; X64-BMI1-NEXT:    bextrq %rax, %rdi, %rax3664; X64-BMI1-NEXT:    # kill: def $eax killed $eax killed $rax3665; X64-BMI1-NEXT:    retq3666;3667; X64-BMI2-LABEL: bextr64_32_b0:3668; X64-BMI2:       # %bb.0:3669; X64-BMI2-NEXT:    shrxq %rsi, %rdi, %rax3670; X64-BMI2-NEXT:    bzhil %edx, %eax, %eax3671; X64-BMI2-NEXT:    retq3672  %shiftedval = lshr i64 %val, %numskipbits3673  %widenumlowbits = zext i8 %numlowbits to i643674  %notmask = shl nsw i64 -1, %widenumlowbits3675  %mask = xor i64 %notmask, -13676  %wideres = and i64 %shiftedval, %mask3677  %res = trunc i64 %wideres to i323678  ret i32 %res3679}3680 3681; Shifting happens in 64-bit, then truncation. Masking is 32-bit.3682define i32 @bextr64_32_b1(i64 %val, i64 %numskipbits, i8 %numlowbits) nounwind {3683; X86-NOBMI-LABEL: bextr64_32_b1:3684; X86-NOBMI:       # %bb.0:3685; X86-NOBMI-NEXT:    pushl %edi3686; X86-NOBMI-NEXT:    pushl %esi3687; X86-NOBMI-NEXT:    movzbl {{[0-9]+}}(%esp), %edx3688; X86-NOBMI-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx3689; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %eax3690; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %edi3691; X86-NOBMI-NEXT:    movl %edi, %esi3692; X86-NOBMI-NEXT:    shrl %cl, %esi3693; X86-NOBMI-NEXT:    shrdl %cl, %edi, %eax3694; X86-NOBMI-NEXT:    testb $32, %cl3695; X86-NOBMI-NEXT:    jne .LBB32_23696; X86-NOBMI-NEXT:  # %bb.1:3697; X86-NOBMI-NEXT:    movl %eax, %esi3698; X86-NOBMI-NEXT:  .LBB32_2:3699; X86-NOBMI-NEXT:    movl $-1, %eax3700; X86-NOBMI-NEXT:    movl %edx, %ecx3701; X86-NOBMI-NEXT:    shll %cl, %eax3702; X86-NOBMI-NEXT:    notl %eax3703; X86-NOBMI-NEXT:    andl %esi, %eax3704; X86-NOBMI-NEXT:    popl %esi3705; X86-NOBMI-NEXT:    popl %edi3706; X86-NOBMI-NEXT:    retl3707;3708; X86-BMI1-LABEL: bextr64_32_b1:3709; X86-BMI1:       # %bb.0:3710; X86-BMI1-NEXT:    pushl %edi3711; X86-BMI1-NEXT:    pushl %esi3712; X86-BMI1-NEXT:    movzbl {{[0-9]+}}(%esp), %eax3713; X86-BMI1-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx3714; X86-BMI1-NEXT:    movl {{[0-9]+}}(%esp), %esi3715; X86-BMI1-NEXT:    movl {{[0-9]+}}(%esp), %edi3716; X86-BMI1-NEXT:    movl %edi, %edx3717; X86-BMI1-NEXT:    shrl %cl, %edx3718; X86-BMI1-NEXT:    shrdl %cl, %edi, %esi3719; X86-BMI1-NEXT:    testb $32, %cl3720; X86-BMI1-NEXT:    jne .LBB32_23721; X86-BMI1-NEXT:  # %bb.1:3722; X86-BMI1-NEXT:    movl %esi, %edx3723; X86-BMI1-NEXT:  .LBB32_2:3724; X86-BMI1-NEXT:    shll $8, %eax3725; X86-BMI1-NEXT:    bextrl %eax, %edx, %eax3726; X86-BMI1-NEXT:    popl %esi3727; X86-BMI1-NEXT:    popl %edi3728; X86-BMI1-NEXT:    retl3729;3730; X86-BMI2-LABEL: bextr64_32_b1:3731; X86-BMI2:       # %bb.0:3732; X86-BMI2-NEXT:    pushl %esi3733; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %eax3734; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx3735; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %edx3736; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %esi3737; X86-BMI2-NEXT:    shrdl %cl, %esi, %edx3738; X86-BMI2-NEXT:    testb $32, %cl3739; X86-BMI2-NEXT:    je .LBB32_23740; X86-BMI2-NEXT:  # %bb.1:3741; X86-BMI2-NEXT:    shrxl %ecx, %esi, %edx3742; X86-BMI2-NEXT:  .LBB32_2:3743; X86-BMI2-NEXT:    bzhil %eax, %edx, %eax3744; X86-BMI2-NEXT:    popl %esi3745; X86-BMI2-NEXT:    retl3746;3747; X64-NOBMI-LABEL: bextr64_32_b1:3748; X64-NOBMI:       # %bb.0:3749; X64-NOBMI-NEXT:    movq %rsi, %rcx3750; X64-NOBMI-NEXT:    # kill: def $cl killed $cl killed $rcx3751; X64-NOBMI-NEXT:    shrq %cl, %rdi3752; X64-NOBMI-NEXT:    movl $-1, %eax3753; X64-NOBMI-NEXT:    movl %edx, %ecx3754; X64-NOBMI-NEXT:    shll %cl, %eax3755; X64-NOBMI-NEXT:    notl %eax3756; X64-NOBMI-NEXT:    andl %edi, %eax3757; X64-NOBMI-NEXT:    retq3758;3759; X64-BMI1-LABEL: bextr64_32_b1:3760; X64-BMI1:       # %bb.0:3761; X64-BMI1-NEXT:    shll $8, %edx3762; X64-BMI1-NEXT:    movzbl %sil, %eax3763; X64-BMI1-NEXT:    orl %edx, %eax3764; X64-BMI1-NEXT:    bextrq %rax, %rdi, %rax3765; X64-BMI1-NEXT:    # kill: def $eax killed $eax killed $rax3766; X64-BMI1-NEXT:    retq3767;3768; X64-BMI2-LABEL: bextr64_32_b1:3769; X64-BMI2:       # %bb.0:3770; X64-BMI2-NEXT:    shrxq %rsi, %rdi, %rax3771; X64-BMI2-NEXT:    bzhil %edx, %eax, %eax3772; X64-BMI2-NEXT:    retq3773  %shiftedval = lshr i64 %val, %numskipbits3774  %truncshiftedval = trunc i64 %shiftedval to i323775  %widenumlowbits = zext i8 %numlowbits to i323776  %notmask = shl nsw i32 -1, %widenumlowbits3777  %mask = xor i32 %notmask, -13778  %res = and i32 %truncshiftedval, %mask3779  ret i32 %res3780}3781 3782; Shifting happens in 64-bit. Mask is 32-bit, but extended to 64-bit.3783; Masking is 64-bit. Then truncation.3784define i32 @bextr64_32_b2(i64 %val, i64 %numskipbits, i8 %numlowbits) nounwind {3785; X86-NOBMI-LABEL: bextr64_32_b2:3786; X86-NOBMI:       # %bb.0:3787; X86-NOBMI-NEXT:    pushl %edi3788; X86-NOBMI-NEXT:    pushl %esi3789; X86-NOBMI-NEXT:    movzbl {{[0-9]+}}(%esp), %edx3790; X86-NOBMI-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx3791; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %eax3792; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %edi3793; X86-NOBMI-NEXT:    movl %edi, %esi3794; X86-NOBMI-NEXT:    shrl %cl, %esi3795; X86-NOBMI-NEXT:    shrdl %cl, %edi, %eax3796; X86-NOBMI-NEXT:    testb $32, %cl3797; X86-NOBMI-NEXT:    jne .LBB33_23798; X86-NOBMI-NEXT:  # %bb.1:3799; X86-NOBMI-NEXT:    movl %eax, %esi3800; X86-NOBMI-NEXT:  .LBB33_2:3801; X86-NOBMI-NEXT:    movl $-1, %eax3802; X86-NOBMI-NEXT:    movl %edx, %ecx3803; X86-NOBMI-NEXT:    shll %cl, %eax3804; X86-NOBMI-NEXT:    notl %eax3805; X86-NOBMI-NEXT:    andl %esi, %eax3806; X86-NOBMI-NEXT:    popl %esi3807; X86-NOBMI-NEXT:    popl %edi3808; X86-NOBMI-NEXT:    retl3809;3810; X86-BMI1-LABEL: bextr64_32_b2:3811; X86-BMI1:       # %bb.0:3812; X86-BMI1-NEXT:    pushl %edi3813; X86-BMI1-NEXT:    pushl %esi3814; X86-BMI1-NEXT:    movzbl {{[0-9]+}}(%esp), %eax3815; X86-BMI1-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx3816; X86-BMI1-NEXT:    movl {{[0-9]+}}(%esp), %esi3817; X86-BMI1-NEXT:    movl {{[0-9]+}}(%esp), %edi3818; X86-BMI1-NEXT:    movl %edi, %edx3819; X86-BMI1-NEXT:    shrl %cl, %edx3820; X86-BMI1-NEXT:    shrdl %cl, %edi, %esi3821; X86-BMI1-NEXT:    testb $32, %cl3822; X86-BMI1-NEXT:    jne .LBB33_23823; X86-BMI1-NEXT:  # %bb.1:3824; X86-BMI1-NEXT:    movl %esi, %edx3825; X86-BMI1-NEXT:  .LBB33_2:3826; X86-BMI1-NEXT:    shll $8, %eax3827; X86-BMI1-NEXT:    bextrl %eax, %edx, %eax3828; X86-BMI1-NEXT:    popl %esi3829; X86-BMI1-NEXT:    popl %edi3830; X86-BMI1-NEXT:    retl3831;3832; X86-BMI2-LABEL: bextr64_32_b2:3833; X86-BMI2:       # %bb.0:3834; X86-BMI2-NEXT:    pushl %esi3835; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %eax3836; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx3837; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %edx3838; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %esi3839; X86-BMI2-NEXT:    shrdl %cl, %esi, %edx3840; X86-BMI2-NEXT:    testb $32, %cl3841; X86-BMI2-NEXT:    je .LBB33_23842; X86-BMI2-NEXT:  # %bb.1:3843; X86-BMI2-NEXT:    shrxl %ecx, %esi, %edx3844; X86-BMI2-NEXT:  .LBB33_2:3845; X86-BMI2-NEXT:    bzhil %eax, %edx, %eax3846; X86-BMI2-NEXT:    popl %esi3847; X86-BMI2-NEXT:    retl3848;3849; X64-NOBMI-LABEL: bextr64_32_b2:3850; X64-NOBMI:       # %bb.0:3851; X64-NOBMI-NEXT:    movq %rsi, %rcx3852; X64-NOBMI-NEXT:    # kill: def $cl killed $cl killed $rcx3853; X64-NOBMI-NEXT:    shrq %cl, %rdi3854; X64-NOBMI-NEXT:    movl $-1, %eax3855; X64-NOBMI-NEXT:    movl %edx, %ecx3856; X64-NOBMI-NEXT:    shll %cl, %eax3857; X64-NOBMI-NEXT:    notl %eax3858; X64-NOBMI-NEXT:    andl %edi, %eax3859; X64-NOBMI-NEXT:    retq3860;3861; X64-BMI1-LABEL: bextr64_32_b2:3862; X64-BMI1:       # %bb.0:3863; X64-BMI1-NEXT:    shll $8, %edx3864; X64-BMI1-NEXT:    movzbl %sil, %eax3865; X64-BMI1-NEXT:    orl %edx, %eax3866; X64-BMI1-NEXT:    bextrq %rax, %rdi, %rax3867; X64-BMI1-NEXT:    # kill: def $eax killed $eax killed $rax3868; X64-BMI1-NEXT:    retq3869;3870; X64-BMI2-LABEL: bextr64_32_b2:3871; X64-BMI2:       # %bb.0:3872; X64-BMI2-NEXT:    shrxq %rsi, %rdi, %rax3873; X64-BMI2-NEXT:    bzhil %edx, %eax, %eax3874; X64-BMI2-NEXT:    retq3875  %shiftedval = lshr i64 %val, %numskipbits3876  %widenumlowbits = zext i8 %numlowbits to i323877  %notmask = shl nsw i32 -1, %widenumlowbits3878  %mask = xor i32 %notmask, -13879  %zextmask = zext i32 %mask to i643880  %wideres = and i64 %shiftedval, %zextmask3881  %res = trunc i64 %wideres to i323882  ret i32 %res3883}3884 3885; Shifting happens in 64-bit. Mask is 32-bit, but calculated in 64-bit.3886; Masking is 64-bit. Then truncation.3887define i32 @bextr64_32_b3(i64 %val, i64 %numskipbits, i8 %numlowbits) nounwind {3888; X86-NOBMI-LABEL: bextr64_32_b3:3889; X86-NOBMI:       # %bb.0:3890; X86-NOBMI-NEXT:    pushl %edi3891; X86-NOBMI-NEXT:    pushl %esi3892; X86-NOBMI-NEXT:    movzbl {{[0-9]+}}(%esp), %edx3893; X86-NOBMI-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx3894; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %esi3895; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %edi3896; X86-NOBMI-NEXT:    movl %edi, %eax3897; X86-NOBMI-NEXT:    shrl %cl, %eax3898; X86-NOBMI-NEXT:    shrdl %cl, %edi, %esi3899; X86-NOBMI-NEXT:    testb $32, %cl3900; X86-NOBMI-NEXT:    jne .LBB34_23901; X86-NOBMI-NEXT:  # %bb.1:3902; X86-NOBMI-NEXT:    movl %esi, %eax3903; X86-NOBMI-NEXT:  .LBB34_2:3904; X86-NOBMI-NEXT:    movl $-1, %esi3905; X86-NOBMI-NEXT:    movl %edx, %ecx3906; X86-NOBMI-NEXT:    shll %cl, %esi3907; X86-NOBMI-NEXT:    xorl %ecx, %ecx3908; X86-NOBMI-NEXT:    testb $32, %dl3909; X86-NOBMI-NEXT:    jne .LBB34_43910; X86-NOBMI-NEXT:  # %bb.3:3911; X86-NOBMI-NEXT:    movl %esi, %ecx3912; X86-NOBMI-NEXT:  .LBB34_4:3913; X86-NOBMI-NEXT:    notl %ecx3914; X86-NOBMI-NEXT:    andl %ecx, %eax3915; X86-NOBMI-NEXT:    popl %esi3916; X86-NOBMI-NEXT:    popl %edi3917; X86-NOBMI-NEXT:    retl3918;3919; X86-BMI1-LABEL: bextr64_32_b3:3920; X86-BMI1:       # %bb.0:3921; X86-BMI1-NEXT:    pushl %edi3922; X86-BMI1-NEXT:    pushl %esi3923; X86-BMI1-NEXT:    movzbl {{[0-9]+}}(%esp), %eax3924; X86-BMI1-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx3925; X86-BMI1-NEXT:    movl {{[0-9]+}}(%esp), %esi3926; X86-BMI1-NEXT:    movl {{[0-9]+}}(%esp), %edi3927; X86-BMI1-NEXT:    movl %edi, %edx3928; X86-BMI1-NEXT:    shrl %cl, %edx3929; X86-BMI1-NEXT:    shrdl %cl, %edi, %esi3930; X86-BMI1-NEXT:    testb $32, %cl3931; X86-BMI1-NEXT:    jne .LBB34_23932; X86-BMI1-NEXT:  # %bb.1:3933; X86-BMI1-NEXT:    movl %esi, %edx3934; X86-BMI1-NEXT:  .LBB34_2:3935; X86-BMI1-NEXT:    movl $-1, %esi3936; X86-BMI1-NEXT:    movl %eax, %ecx3937; X86-BMI1-NEXT:    shll %cl, %esi3938; X86-BMI1-NEXT:    xorl %ecx, %ecx3939; X86-BMI1-NEXT:    testb $32, %al3940; X86-BMI1-NEXT:    jne .LBB34_43941; X86-BMI1-NEXT:  # %bb.3:3942; X86-BMI1-NEXT:    movl %esi, %ecx3943; X86-BMI1-NEXT:  .LBB34_4:3944; X86-BMI1-NEXT:    andnl %edx, %ecx, %eax3945; X86-BMI1-NEXT:    popl %esi3946; X86-BMI1-NEXT:    popl %edi3947; X86-BMI1-NEXT:    retl3948;3949; X86-BMI2-LABEL: bextr64_32_b3:3950; X86-BMI2:       # %bb.0:3951; X86-BMI2-NEXT:    pushl %esi3952; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %eax3953; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx3954; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %edx3955; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %esi3956; X86-BMI2-NEXT:    shrdl %cl, %esi, %edx3957; X86-BMI2-NEXT:    testb $32, %cl3958; X86-BMI2-NEXT:    je .LBB34_23959; X86-BMI2-NEXT:  # %bb.1:3960; X86-BMI2-NEXT:    shrxl %ecx, %esi, %edx3961; X86-BMI2-NEXT:  .LBB34_2:3962; X86-BMI2-NEXT:    xorl %ecx, %ecx3963; X86-BMI2-NEXT:    testb $32, %al3964; X86-BMI2-NEXT:    jne .LBB34_43965; X86-BMI2-NEXT:  # %bb.3:3966; X86-BMI2-NEXT:    movl $-1, %ecx3967; X86-BMI2-NEXT:    shlxl %eax, %ecx, %ecx3968; X86-BMI2-NEXT:  .LBB34_4:3969; X86-BMI2-NEXT:    andnl %edx, %ecx, %eax3970; X86-BMI2-NEXT:    popl %esi3971; X86-BMI2-NEXT:    retl3972;3973; X64-NOBMI-LABEL: bextr64_32_b3:3974; X64-NOBMI:       # %bb.0:3975; X64-NOBMI-NEXT:    movq %rsi, %rcx3976; X64-NOBMI-NEXT:    # kill: def $cl killed $cl killed $rcx3977; X64-NOBMI-NEXT:    shrq %cl, %rdi3978; X64-NOBMI-NEXT:    movl $4294967295, %eax # imm = 0xFFFFFFFF3979; X64-NOBMI-NEXT:    movl $4294967295, %esi # imm = 0xFFFFFFFF3980; X64-NOBMI-NEXT:    movl %edx, %ecx3981; X64-NOBMI-NEXT:    shlq %cl, %rsi3982; X64-NOBMI-NEXT:    xorl %esi, %eax3983; X64-NOBMI-NEXT:    andl %edi, %eax3984; X64-NOBMI-NEXT:    # kill: def $eax killed $eax killed $rax3985; X64-NOBMI-NEXT:    retq3986;3987; X64-BMI1-LABEL: bextr64_32_b3:3988; X64-BMI1:       # %bb.0:3989; X64-BMI1-NEXT:    shll $8, %edx3990; X64-BMI1-NEXT:    movzbl %sil, %eax3991; X64-BMI1-NEXT:    orl %edx, %eax3992; X64-BMI1-NEXT:    bextrq %rax, %rdi, %rax3993; X64-BMI1-NEXT:    # kill: def $eax killed $eax killed $rax3994; X64-BMI1-NEXT:    retq3995;3996; X64-BMI2-LABEL: bextr64_32_b3:3997; X64-BMI2:       # %bb.0:3998; X64-BMI2-NEXT:    shrxq %rsi, %rdi, %rax3999; X64-BMI2-NEXT:    bzhil %edx, %eax, %eax4000; X64-BMI2-NEXT:    retq4001  %shiftedval = lshr i64 %val, %numskipbits4002  %widenumlowbits = zext i8 %numlowbits to i644003  %notmask = shl nsw i64 4294967295, %widenumlowbits4004  %mask = xor i64 %notmask, 42949672954005  %wideres = and i64 %shiftedval, %mask4006  %res = trunc i64 %wideres to i324007  ret i32 %res4008}4009 4010; ---------------------------------------------------------------------------- ;4011; Pattern c. 32-bit4012; ---------------------------------------------------------------------------- ;4013 4014define i32 @bextr32_c0(i32 %val, i32 %numskipbits, i32 %numlowbits) nounwind {4015; X86-NOBMI-LABEL: bextr32_c0:4016; X86-NOBMI:       # %bb.0:4017; X86-NOBMI-NEXT:    pushl %edi4018; X86-NOBMI-NEXT:    pushl %esi4019; X86-NOBMI-NEXT:    pushl %eax4020; X86-NOBMI-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx4021; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %edi4022; X86-NOBMI-NEXT:    shrl %cl, %edi4023; X86-NOBMI-NEXT:    xorl %ecx, %ecx4024; X86-NOBMI-NEXT:    subb {{[0-9]+}}(%esp), %cl4025; X86-NOBMI-NEXT:    movl $-1, %esi4026; X86-NOBMI-NEXT:    # kill: def $cl killed $cl killed $ecx4027; X86-NOBMI-NEXT:    shrl %cl, %esi4028; X86-NOBMI-NEXT:    movl %esi, (%esp)4029; X86-NOBMI-NEXT:    calll use32@PLT4030; X86-NOBMI-NEXT:    andl %edi, %esi4031; X86-NOBMI-NEXT:    movl %esi, %eax4032; X86-NOBMI-NEXT:    addl $4, %esp4033; X86-NOBMI-NEXT:    popl %esi4034; X86-NOBMI-NEXT:    popl %edi4035; X86-NOBMI-NEXT:    retl4036;4037; X86-BMI1-LABEL: bextr32_c0:4038; X86-BMI1:       # %bb.0:4039; X86-BMI1-NEXT:    pushl %edi4040; X86-BMI1-NEXT:    pushl %esi4041; X86-BMI1-NEXT:    pushl %eax4042; X86-BMI1-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx4043; X86-BMI1-NEXT:    movl {{[0-9]+}}(%esp), %edi4044; X86-BMI1-NEXT:    shrl %cl, %edi4045; X86-BMI1-NEXT:    xorl %ecx, %ecx4046; X86-BMI1-NEXT:    subb {{[0-9]+}}(%esp), %cl4047; X86-BMI1-NEXT:    movl $-1, %esi4048; X86-BMI1-NEXT:    # kill: def $cl killed $cl killed $ecx4049; X86-BMI1-NEXT:    shrl %cl, %esi4050; X86-BMI1-NEXT:    movl %esi, (%esp)4051; X86-BMI1-NEXT:    calll use32@PLT4052; X86-BMI1-NEXT:    andl %edi, %esi4053; X86-BMI1-NEXT:    movl %esi, %eax4054; X86-BMI1-NEXT:    addl $4, %esp4055; X86-BMI1-NEXT:    popl %esi4056; X86-BMI1-NEXT:    popl %edi4057; X86-BMI1-NEXT:    retl4058;4059; X86-BMI2-LABEL: bextr32_c0:4060; X86-BMI2:       # %bb.0:4061; X86-BMI2-NEXT:    pushl %ebx4062; X86-BMI2-NEXT:    pushl %esi4063; X86-BMI2-NEXT:    pushl %eax4064; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %ebx4065; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %eax4066; X86-BMI2-NEXT:    shrxl %eax, {{[0-9]+}}(%esp), %esi4067; X86-BMI2-NEXT:    movl $-1, %eax4068; X86-BMI2-NEXT:    bzhil %ebx, %eax, %eax4069; X86-BMI2-NEXT:    movl %eax, (%esp)4070; X86-BMI2-NEXT:    calll use32@PLT4071; X86-BMI2-NEXT:    bzhil %ebx, %esi, %eax4072; X86-BMI2-NEXT:    addl $4, %esp4073; X86-BMI2-NEXT:    popl %esi4074; X86-BMI2-NEXT:    popl %ebx4075; X86-BMI2-NEXT:    retl4076;4077; X64-NOBMI-LABEL: bextr32_c0:4078; X64-NOBMI:       # %bb.0:4079; X64-NOBMI-NEXT:    pushq %rbp4080; X64-NOBMI-NEXT:    pushq %rbx4081; X64-NOBMI-NEXT:    pushq %rax4082; X64-NOBMI-NEXT:    movl %esi, %ecx4083; X64-NOBMI-NEXT:    movl %edi, %ebx4084; X64-NOBMI-NEXT:    # kill: def $cl killed $cl killed $ecx4085; X64-NOBMI-NEXT:    shrl %cl, %ebx4086; X64-NOBMI-NEXT:    negb %dl4087; X64-NOBMI-NEXT:    movl $-1, %ebp4088; X64-NOBMI-NEXT:    movl %edx, %ecx4089; X64-NOBMI-NEXT:    shrl %cl, %ebp4090; X64-NOBMI-NEXT:    movl %ebp, %edi4091; X64-NOBMI-NEXT:    callq use32@PLT4092; X64-NOBMI-NEXT:    andl %ebx, %ebp4093; X64-NOBMI-NEXT:    movl %ebp, %eax4094; X64-NOBMI-NEXT:    addq $8, %rsp4095; X64-NOBMI-NEXT:    popq %rbx4096; X64-NOBMI-NEXT:    popq %rbp4097; X64-NOBMI-NEXT:    retq4098;4099; X64-BMI1-LABEL: bextr32_c0:4100; X64-BMI1:       # %bb.0:4101; X64-BMI1-NEXT:    pushq %rbp4102; X64-BMI1-NEXT:    pushq %rbx4103; X64-BMI1-NEXT:    pushq %rax4104; X64-BMI1-NEXT:    movl %esi, %ecx4105; X64-BMI1-NEXT:    movl %edi, %ebx4106; X64-BMI1-NEXT:    # kill: def $cl killed $cl killed $ecx4107; X64-BMI1-NEXT:    shrl %cl, %ebx4108; X64-BMI1-NEXT:    negb %dl4109; X64-BMI1-NEXT:    movl $-1, %ebp4110; X64-BMI1-NEXT:    movl %edx, %ecx4111; X64-BMI1-NEXT:    shrl %cl, %ebp4112; X64-BMI1-NEXT:    movl %ebp, %edi4113; X64-BMI1-NEXT:    callq use32@PLT4114; X64-BMI1-NEXT:    andl %ebx, %ebp4115; X64-BMI1-NEXT:    movl %ebp, %eax4116; X64-BMI1-NEXT:    addq $8, %rsp4117; X64-BMI1-NEXT:    popq %rbx4118; X64-BMI1-NEXT:    popq %rbp4119; X64-BMI1-NEXT:    retq4120;4121; X64-BMI2-LABEL: bextr32_c0:4122; X64-BMI2:       # %bb.0:4123; X64-BMI2-NEXT:    pushq %rbp4124; X64-BMI2-NEXT:    pushq %rbx4125; X64-BMI2-NEXT:    pushq %rax4126; X64-BMI2-NEXT:    movl %edx, %ebx4127; X64-BMI2-NEXT:    shrxl %esi, %edi, %ebp4128; X64-BMI2-NEXT:    movl $-1, %eax4129; X64-BMI2-NEXT:    bzhil %edx, %eax, %edi4130; X64-BMI2-NEXT:    callq use32@PLT4131; X64-BMI2-NEXT:    bzhil %ebx, %ebp, %eax4132; X64-BMI2-NEXT:    addq $8, %rsp4133; X64-BMI2-NEXT:    popq %rbx4134; X64-BMI2-NEXT:    popq %rbp4135; X64-BMI2-NEXT:    retq4136  %shifted = lshr i32 %val, %numskipbits4137  %numhighbits = sub i32 32, %numlowbits4138  %mask = lshr i32 -1, %numhighbits4139  call void @use32(i32 %mask)4140  %masked = and i32 %mask, %shifted4141  ret i32 %masked4142}4143 4144define i32 @bextr32_c1_indexzext(i32 %val, i8 %numskipbits, i8 %numlowbits) nounwind {4145; X86-NOBMI-LABEL: bextr32_c1_indexzext:4146; X86-NOBMI:       # %bb.0:4147; X86-NOBMI-NEXT:    pushl %edi4148; X86-NOBMI-NEXT:    pushl %esi4149; X86-NOBMI-NEXT:    pushl %eax4150; X86-NOBMI-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx4151; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %edi4152; X86-NOBMI-NEXT:    shrl %cl, %edi4153; X86-NOBMI-NEXT:    xorl %ecx, %ecx4154; X86-NOBMI-NEXT:    subb {{[0-9]+}}(%esp), %cl4155; X86-NOBMI-NEXT:    movl $-1, %esi4156; X86-NOBMI-NEXT:    # kill: def $cl killed $cl killed $ecx4157; X86-NOBMI-NEXT:    shrl %cl, %esi4158; X86-NOBMI-NEXT:    movl %esi, (%esp)4159; X86-NOBMI-NEXT:    calll use32@PLT4160; X86-NOBMI-NEXT:    andl %edi, %esi4161; X86-NOBMI-NEXT:    movl %esi, %eax4162; X86-NOBMI-NEXT:    addl $4, %esp4163; X86-NOBMI-NEXT:    popl %esi4164; X86-NOBMI-NEXT:    popl %edi4165; X86-NOBMI-NEXT:    retl4166;4167; X86-BMI1-LABEL: bextr32_c1_indexzext:4168; X86-BMI1:       # %bb.0:4169; X86-BMI1-NEXT:    pushl %edi4170; X86-BMI1-NEXT:    pushl %esi4171; X86-BMI1-NEXT:    pushl %eax4172; X86-BMI1-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx4173; X86-BMI1-NEXT:    movl {{[0-9]+}}(%esp), %edi4174; X86-BMI1-NEXT:    shrl %cl, %edi4175; X86-BMI1-NEXT:    xorl %ecx, %ecx4176; X86-BMI1-NEXT:    subb {{[0-9]+}}(%esp), %cl4177; X86-BMI1-NEXT:    movl $-1, %esi4178; X86-BMI1-NEXT:    # kill: def $cl killed $cl killed $ecx4179; X86-BMI1-NEXT:    shrl %cl, %esi4180; X86-BMI1-NEXT:    movl %esi, (%esp)4181; X86-BMI1-NEXT:    calll use32@PLT4182; X86-BMI1-NEXT:    andl %edi, %esi4183; X86-BMI1-NEXT:    movl %esi, %eax4184; X86-BMI1-NEXT:    addl $4, %esp4185; X86-BMI1-NEXT:    popl %esi4186; X86-BMI1-NEXT:    popl %edi4187; X86-BMI1-NEXT:    retl4188;4189; X86-BMI2-LABEL: bextr32_c1_indexzext:4190; X86-BMI2:       # %bb.0:4191; X86-BMI2-NEXT:    pushl %ebx4192; X86-BMI2-NEXT:    pushl %esi4193; X86-BMI2-NEXT:    pushl %eax4194; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %ebx4195; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %eax4196; X86-BMI2-NEXT:    shrxl %eax, {{[0-9]+}}(%esp), %esi4197; X86-BMI2-NEXT:    movl $-1, %eax4198; X86-BMI2-NEXT:    bzhil %ebx, %eax, %eax4199; X86-BMI2-NEXT:    movl %eax, (%esp)4200; X86-BMI2-NEXT:    calll use32@PLT4201; X86-BMI2-NEXT:    bzhil %ebx, %esi, %eax4202; X86-BMI2-NEXT:    addl $4, %esp4203; X86-BMI2-NEXT:    popl %esi4204; X86-BMI2-NEXT:    popl %ebx4205; X86-BMI2-NEXT:    retl4206;4207; X64-NOBMI-LABEL: bextr32_c1_indexzext:4208; X64-NOBMI:       # %bb.0:4209; X64-NOBMI-NEXT:    pushq %rbp4210; X64-NOBMI-NEXT:    pushq %rbx4211; X64-NOBMI-NEXT:    pushq %rax4212; X64-NOBMI-NEXT:    movl %esi, %ecx4213; X64-NOBMI-NEXT:    movl %edi, %ebx4214; X64-NOBMI-NEXT:    # kill: def $cl killed $cl killed $ecx4215; X64-NOBMI-NEXT:    shrl %cl, %ebx4216; X64-NOBMI-NEXT:    negb %dl4217; X64-NOBMI-NEXT:    movl $-1, %ebp4218; X64-NOBMI-NEXT:    movl %edx, %ecx4219; X64-NOBMI-NEXT:    shrl %cl, %ebp4220; X64-NOBMI-NEXT:    movl %ebp, %edi4221; X64-NOBMI-NEXT:    callq use32@PLT4222; X64-NOBMI-NEXT:    andl %ebx, %ebp4223; X64-NOBMI-NEXT:    movl %ebp, %eax4224; X64-NOBMI-NEXT:    addq $8, %rsp4225; X64-NOBMI-NEXT:    popq %rbx4226; X64-NOBMI-NEXT:    popq %rbp4227; X64-NOBMI-NEXT:    retq4228;4229; X64-BMI1-LABEL: bextr32_c1_indexzext:4230; X64-BMI1:       # %bb.0:4231; X64-BMI1-NEXT:    pushq %rbp4232; X64-BMI1-NEXT:    pushq %rbx4233; X64-BMI1-NEXT:    pushq %rax4234; X64-BMI1-NEXT:    movl %esi, %ecx4235; X64-BMI1-NEXT:    movl %edi, %ebx4236; X64-BMI1-NEXT:    # kill: def $cl killed $cl killed $ecx4237; X64-BMI1-NEXT:    shrl %cl, %ebx4238; X64-BMI1-NEXT:    negb %dl4239; X64-BMI1-NEXT:    movl $-1, %ebp4240; X64-BMI1-NEXT:    movl %edx, %ecx4241; X64-BMI1-NEXT:    shrl %cl, %ebp4242; X64-BMI1-NEXT:    movl %ebp, %edi4243; X64-BMI1-NEXT:    callq use32@PLT4244; X64-BMI1-NEXT:    andl %ebx, %ebp4245; X64-BMI1-NEXT:    movl %ebp, %eax4246; X64-BMI1-NEXT:    addq $8, %rsp4247; X64-BMI1-NEXT:    popq %rbx4248; X64-BMI1-NEXT:    popq %rbp4249; X64-BMI1-NEXT:    retq4250;4251; X64-BMI2-LABEL: bextr32_c1_indexzext:4252; X64-BMI2:       # %bb.0:4253; X64-BMI2-NEXT:    pushq %rbp4254; X64-BMI2-NEXT:    pushq %rbx4255; X64-BMI2-NEXT:    pushq %rax4256; X64-BMI2-NEXT:    movl %edx, %ebx4257; X64-BMI2-NEXT:    shrxl %esi, %edi, %ebp4258; X64-BMI2-NEXT:    movl $-1, %eax4259; X64-BMI2-NEXT:    bzhil %edx, %eax, %edi4260; X64-BMI2-NEXT:    callq use32@PLT4261; X64-BMI2-NEXT:    bzhil %ebx, %ebp, %eax4262; X64-BMI2-NEXT:    addq $8, %rsp4263; X64-BMI2-NEXT:    popq %rbx4264; X64-BMI2-NEXT:    popq %rbp4265; X64-BMI2-NEXT:    retq4266  %skip = zext i8 %numskipbits to i324267  %shifted = lshr i32 %val, %skip4268  %numhighbits = sub i8 32, %numlowbits4269  %sh_prom = zext i8 %numhighbits to i324270  %mask = lshr i32 -1, %sh_prom4271  call void @use32(i32 %mask)4272  %masked = and i32 %mask, %shifted4273  ret i32 %masked4274}4275 4276define i32 @bextr32_c2_load(ptr %w, i32 %numskipbits, i32 %numlowbits) nounwind {4277; X86-NOBMI-LABEL: bextr32_c2_load:4278; X86-NOBMI:       # %bb.0:4279; X86-NOBMI-NEXT:    pushl %edi4280; X86-NOBMI-NEXT:    pushl %esi4281; X86-NOBMI-NEXT:    pushl %eax4282; X86-NOBMI-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx4283; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %eax4284; X86-NOBMI-NEXT:    movl (%eax), %edi4285; X86-NOBMI-NEXT:    shrl %cl, %edi4286; X86-NOBMI-NEXT:    xorl %ecx, %ecx4287; X86-NOBMI-NEXT:    subb {{[0-9]+}}(%esp), %cl4288; X86-NOBMI-NEXT:    movl $-1, %esi4289; X86-NOBMI-NEXT:    # kill: def $cl killed $cl killed $ecx4290; X86-NOBMI-NEXT:    shrl %cl, %esi4291; X86-NOBMI-NEXT:    movl %esi, (%esp)4292; X86-NOBMI-NEXT:    calll use32@PLT4293; X86-NOBMI-NEXT:    andl %edi, %esi4294; X86-NOBMI-NEXT:    movl %esi, %eax4295; X86-NOBMI-NEXT:    addl $4, %esp4296; X86-NOBMI-NEXT:    popl %esi4297; X86-NOBMI-NEXT:    popl %edi4298; X86-NOBMI-NEXT:    retl4299;4300; X86-BMI1-LABEL: bextr32_c2_load:4301; X86-BMI1:       # %bb.0:4302; X86-BMI1-NEXT:    pushl %edi4303; X86-BMI1-NEXT:    pushl %esi4304; X86-BMI1-NEXT:    pushl %eax4305; X86-BMI1-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx4306; X86-BMI1-NEXT:    movl {{[0-9]+}}(%esp), %eax4307; X86-BMI1-NEXT:    movl (%eax), %edi4308; X86-BMI1-NEXT:    shrl %cl, %edi4309; X86-BMI1-NEXT:    xorl %ecx, %ecx4310; X86-BMI1-NEXT:    subb {{[0-9]+}}(%esp), %cl4311; X86-BMI1-NEXT:    movl $-1, %esi4312; X86-BMI1-NEXT:    # kill: def $cl killed $cl killed $ecx4313; X86-BMI1-NEXT:    shrl %cl, %esi4314; X86-BMI1-NEXT:    movl %esi, (%esp)4315; X86-BMI1-NEXT:    calll use32@PLT4316; X86-BMI1-NEXT:    andl %edi, %esi4317; X86-BMI1-NEXT:    movl %esi, %eax4318; X86-BMI1-NEXT:    addl $4, %esp4319; X86-BMI1-NEXT:    popl %esi4320; X86-BMI1-NEXT:    popl %edi4321; X86-BMI1-NEXT:    retl4322;4323; X86-BMI2-LABEL: bextr32_c2_load:4324; X86-BMI2:       # %bb.0:4325; X86-BMI2-NEXT:    pushl %ebx4326; X86-BMI2-NEXT:    pushl %esi4327; X86-BMI2-NEXT:    pushl %eax4328; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %ebx4329; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %eax4330; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx4331; X86-BMI2-NEXT:    shrxl %ecx, (%eax), %esi4332; X86-BMI2-NEXT:    movl $-1, %eax4333; X86-BMI2-NEXT:    bzhil %ebx, %eax, %eax4334; X86-BMI2-NEXT:    movl %eax, (%esp)4335; X86-BMI2-NEXT:    calll use32@PLT4336; X86-BMI2-NEXT:    bzhil %ebx, %esi, %eax4337; X86-BMI2-NEXT:    addl $4, %esp4338; X86-BMI2-NEXT:    popl %esi4339; X86-BMI2-NEXT:    popl %ebx4340; X86-BMI2-NEXT:    retl4341;4342; X64-NOBMI-LABEL: bextr32_c2_load:4343; X64-NOBMI:       # %bb.0:4344; X64-NOBMI-NEXT:    pushq %rbp4345; X64-NOBMI-NEXT:    pushq %rbx4346; X64-NOBMI-NEXT:    pushq %rax4347; X64-NOBMI-NEXT:    movl %esi, %ecx4348; X64-NOBMI-NEXT:    movl (%rdi), %ebp4349; X64-NOBMI-NEXT:    # kill: def $cl killed $cl killed $ecx4350; X64-NOBMI-NEXT:    shrl %cl, %ebp4351; X64-NOBMI-NEXT:    negb %dl4352; X64-NOBMI-NEXT:    movl $-1, %ebx4353; X64-NOBMI-NEXT:    movl %edx, %ecx4354; X64-NOBMI-NEXT:    shrl %cl, %ebx4355; X64-NOBMI-NEXT:    movl %ebx, %edi4356; X64-NOBMI-NEXT:    callq use32@PLT4357; X64-NOBMI-NEXT:    andl %ebp, %ebx4358; X64-NOBMI-NEXT:    movl %ebx, %eax4359; X64-NOBMI-NEXT:    addq $8, %rsp4360; X64-NOBMI-NEXT:    popq %rbx4361; X64-NOBMI-NEXT:    popq %rbp4362; X64-NOBMI-NEXT:    retq4363;4364; X64-BMI1-LABEL: bextr32_c2_load:4365; X64-BMI1:       # %bb.0:4366; X64-BMI1-NEXT:    pushq %rbp4367; X64-BMI1-NEXT:    pushq %rbx4368; X64-BMI1-NEXT:    pushq %rax4369; X64-BMI1-NEXT:    movl %esi, %ecx4370; X64-BMI1-NEXT:    movl (%rdi), %ebp4371; X64-BMI1-NEXT:    # kill: def $cl killed $cl killed $ecx4372; X64-BMI1-NEXT:    shrl %cl, %ebp4373; X64-BMI1-NEXT:    negb %dl4374; X64-BMI1-NEXT:    movl $-1, %ebx4375; X64-BMI1-NEXT:    movl %edx, %ecx4376; X64-BMI1-NEXT:    shrl %cl, %ebx4377; X64-BMI1-NEXT:    movl %ebx, %edi4378; X64-BMI1-NEXT:    callq use32@PLT4379; X64-BMI1-NEXT:    andl %ebp, %ebx4380; X64-BMI1-NEXT:    movl %ebx, %eax4381; X64-BMI1-NEXT:    addq $8, %rsp4382; X64-BMI1-NEXT:    popq %rbx4383; X64-BMI1-NEXT:    popq %rbp4384; X64-BMI1-NEXT:    retq4385;4386; X64-BMI2-LABEL: bextr32_c2_load:4387; X64-BMI2:       # %bb.0:4388; X64-BMI2-NEXT:    pushq %rbp4389; X64-BMI2-NEXT:    pushq %rbx4390; X64-BMI2-NEXT:    pushq %rax4391; X64-BMI2-NEXT:    movl %edx, %ebx4392; X64-BMI2-NEXT:    shrxl %esi, (%rdi), %ebp4393; X64-BMI2-NEXT:    movl $-1, %eax4394; X64-BMI2-NEXT:    bzhil %edx, %eax, %edi4395; X64-BMI2-NEXT:    callq use32@PLT4396; X64-BMI2-NEXT:    bzhil %ebx, %ebp, %eax4397; X64-BMI2-NEXT:    addq $8, %rsp4398; X64-BMI2-NEXT:    popq %rbx4399; X64-BMI2-NEXT:    popq %rbp4400; X64-BMI2-NEXT:    retq4401  %val = load i32, ptr %w4402  %shifted = lshr i32 %val, %numskipbits4403  %numhighbits = sub i32 32, %numlowbits4404  %mask = lshr i32 -1, %numhighbits4405  call void @use32(i32 %mask)4406  %masked = and i32 %mask, %shifted4407  ret i32 %masked4408}4409 4410define i32 @bextr32_c3_load_indexzext(ptr %w, i8 %numskipbits, i8 %numlowbits) nounwind {4411; X86-NOBMI-LABEL: bextr32_c3_load_indexzext:4412; X86-NOBMI:       # %bb.0:4413; X86-NOBMI-NEXT:    pushl %edi4414; X86-NOBMI-NEXT:    pushl %esi4415; X86-NOBMI-NEXT:    pushl %eax4416; X86-NOBMI-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx4417; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %eax4418; X86-NOBMI-NEXT:    movl (%eax), %edi4419; X86-NOBMI-NEXT:    shrl %cl, %edi4420; X86-NOBMI-NEXT:    xorl %ecx, %ecx4421; X86-NOBMI-NEXT:    subb {{[0-9]+}}(%esp), %cl4422; X86-NOBMI-NEXT:    movl $-1, %esi4423; X86-NOBMI-NEXT:    # kill: def $cl killed $cl killed $ecx4424; X86-NOBMI-NEXT:    shrl %cl, %esi4425; X86-NOBMI-NEXT:    movl %esi, (%esp)4426; X86-NOBMI-NEXT:    calll use32@PLT4427; X86-NOBMI-NEXT:    andl %edi, %esi4428; X86-NOBMI-NEXT:    movl %esi, %eax4429; X86-NOBMI-NEXT:    addl $4, %esp4430; X86-NOBMI-NEXT:    popl %esi4431; X86-NOBMI-NEXT:    popl %edi4432; X86-NOBMI-NEXT:    retl4433;4434; X86-BMI1-LABEL: bextr32_c3_load_indexzext:4435; X86-BMI1:       # %bb.0:4436; X86-BMI1-NEXT:    pushl %edi4437; X86-BMI1-NEXT:    pushl %esi4438; X86-BMI1-NEXT:    pushl %eax4439; X86-BMI1-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx4440; X86-BMI1-NEXT:    movl {{[0-9]+}}(%esp), %eax4441; X86-BMI1-NEXT:    movl (%eax), %edi4442; X86-BMI1-NEXT:    shrl %cl, %edi4443; X86-BMI1-NEXT:    xorl %ecx, %ecx4444; X86-BMI1-NEXT:    subb {{[0-9]+}}(%esp), %cl4445; X86-BMI1-NEXT:    movl $-1, %esi4446; X86-BMI1-NEXT:    # kill: def $cl killed $cl killed $ecx4447; X86-BMI1-NEXT:    shrl %cl, %esi4448; X86-BMI1-NEXT:    movl %esi, (%esp)4449; X86-BMI1-NEXT:    calll use32@PLT4450; X86-BMI1-NEXT:    andl %edi, %esi4451; X86-BMI1-NEXT:    movl %esi, %eax4452; X86-BMI1-NEXT:    addl $4, %esp4453; X86-BMI1-NEXT:    popl %esi4454; X86-BMI1-NEXT:    popl %edi4455; X86-BMI1-NEXT:    retl4456;4457; X86-BMI2-LABEL: bextr32_c3_load_indexzext:4458; X86-BMI2:       # %bb.0:4459; X86-BMI2-NEXT:    pushl %ebx4460; X86-BMI2-NEXT:    pushl %esi4461; X86-BMI2-NEXT:    pushl %eax4462; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %ebx4463; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %eax4464; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx4465; X86-BMI2-NEXT:    shrxl %ecx, (%eax), %esi4466; X86-BMI2-NEXT:    movl $-1, %eax4467; X86-BMI2-NEXT:    bzhil %ebx, %eax, %eax4468; X86-BMI2-NEXT:    movl %eax, (%esp)4469; X86-BMI2-NEXT:    calll use32@PLT4470; X86-BMI2-NEXT:    bzhil %ebx, %esi, %eax4471; X86-BMI2-NEXT:    addl $4, %esp4472; X86-BMI2-NEXT:    popl %esi4473; X86-BMI2-NEXT:    popl %ebx4474; X86-BMI2-NEXT:    retl4475;4476; X64-NOBMI-LABEL: bextr32_c3_load_indexzext:4477; X64-NOBMI:       # %bb.0:4478; X64-NOBMI-NEXT:    pushq %rbp4479; X64-NOBMI-NEXT:    pushq %rbx4480; X64-NOBMI-NEXT:    pushq %rax4481; X64-NOBMI-NEXT:    movl %esi, %ecx4482; X64-NOBMI-NEXT:    movl (%rdi), %ebp4483; X64-NOBMI-NEXT:    # kill: def $cl killed $cl killed $ecx4484; X64-NOBMI-NEXT:    shrl %cl, %ebp4485; X64-NOBMI-NEXT:    negb %dl4486; X64-NOBMI-NEXT:    movl $-1, %ebx4487; X64-NOBMI-NEXT:    movl %edx, %ecx4488; X64-NOBMI-NEXT:    shrl %cl, %ebx4489; X64-NOBMI-NEXT:    movl %ebx, %edi4490; X64-NOBMI-NEXT:    callq use32@PLT4491; X64-NOBMI-NEXT:    andl %ebp, %ebx4492; X64-NOBMI-NEXT:    movl %ebx, %eax4493; X64-NOBMI-NEXT:    addq $8, %rsp4494; X64-NOBMI-NEXT:    popq %rbx4495; X64-NOBMI-NEXT:    popq %rbp4496; X64-NOBMI-NEXT:    retq4497;4498; X64-BMI1-LABEL: bextr32_c3_load_indexzext:4499; X64-BMI1:       # %bb.0:4500; X64-BMI1-NEXT:    pushq %rbp4501; X64-BMI1-NEXT:    pushq %rbx4502; X64-BMI1-NEXT:    pushq %rax4503; X64-BMI1-NEXT:    movl %esi, %ecx4504; X64-BMI1-NEXT:    movl (%rdi), %ebp4505; X64-BMI1-NEXT:    # kill: def $cl killed $cl killed $ecx4506; X64-BMI1-NEXT:    shrl %cl, %ebp4507; X64-BMI1-NEXT:    negb %dl4508; X64-BMI1-NEXT:    movl $-1, %ebx4509; X64-BMI1-NEXT:    movl %edx, %ecx4510; X64-BMI1-NEXT:    shrl %cl, %ebx4511; X64-BMI1-NEXT:    movl %ebx, %edi4512; X64-BMI1-NEXT:    callq use32@PLT4513; X64-BMI1-NEXT:    andl %ebp, %ebx4514; X64-BMI1-NEXT:    movl %ebx, %eax4515; X64-BMI1-NEXT:    addq $8, %rsp4516; X64-BMI1-NEXT:    popq %rbx4517; X64-BMI1-NEXT:    popq %rbp4518; X64-BMI1-NEXT:    retq4519;4520; X64-BMI2-LABEL: bextr32_c3_load_indexzext:4521; X64-BMI2:       # %bb.0:4522; X64-BMI2-NEXT:    pushq %rbp4523; X64-BMI2-NEXT:    pushq %rbx4524; X64-BMI2-NEXT:    pushq %rax4525; X64-BMI2-NEXT:    movl %edx, %ebx4526; X64-BMI2-NEXT:    shrxl %esi, (%rdi), %ebp4527; X64-BMI2-NEXT:    movl $-1, %eax4528; X64-BMI2-NEXT:    bzhil %edx, %eax, %edi4529; X64-BMI2-NEXT:    callq use32@PLT4530; X64-BMI2-NEXT:    bzhil %ebx, %ebp, %eax4531; X64-BMI2-NEXT:    addq $8, %rsp4532; X64-BMI2-NEXT:    popq %rbx4533; X64-BMI2-NEXT:    popq %rbp4534; X64-BMI2-NEXT:    retq4535  %val = load i32, ptr %w4536  %skip = zext i8 %numskipbits to i324537  %shifted = lshr i32 %val, %skip4538  %numhighbits = sub i8 32, %numlowbits4539  %sh_prom = zext i8 %numhighbits to i324540  %mask = lshr i32 -1, %sh_prom4541  call void @use32(i32 %mask)4542  %masked = and i32 %mask, %shifted4543  ret i32 %masked4544}4545 4546define i32 @bextr32_c4_commutative(i32 %val, i32 %numskipbits, i32 %numlowbits) nounwind {4547; X86-NOBMI-LABEL: bextr32_c4_commutative:4548; X86-NOBMI:       # %bb.0:4549; X86-NOBMI-NEXT:    pushl %edi4550; X86-NOBMI-NEXT:    pushl %esi4551; X86-NOBMI-NEXT:    pushl %eax4552; X86-NOBMI-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx4553; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %edi4554; X86-NOBMI-NEXT:    shrl %cl, %edi4555; X86-NOBMI-NEXT:    xorl %ecx, %ecx4556; X86-NOBMI-NEXT:    subb {{[0-9]+}}(%esp), %cl4557; X86-NOBMI-NEXT:    movl $-1, %esi4558; X86-NOBMI-NEXT:    # kill: def $cl killed $cl killed $ecx4559; X86-NOBMI-NEXT:    shrl %cl, %esi4560; X86-NOBMI-NEXT:    movl %esi, (%esp)4561; X86-NOBMI-NEXT:    calll use32@PLT4562; X86-NOBMI-NEXT:    andl %edi, %esi4563; X86-NOBMI-NEXT:    movl %esi, %eax4564; X86-NOBMI-NEXT:    addl $4, %esp4565; X86-NOBMI-NEXT:    popl %esi4566; X86-NOBMI-NEXT:    popl %edi4567; X86-NOBMI-NEXT:    retl4568;4569; X86-BMI1-LABEL: bextr32_c4_commutative:4570; X86-BMI1:       # %bb.0:4571; X86-BMI1-NEXT:    pushl %edi4572; X86-BMI1-NEXT:    pushl %esi4573; X86-BMI1-NEXT:    pushl %eax4574; X86-BMI1-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx4575; X86-BMI1-NEXT:    movl {{[0-9]+}}(%esp), %edi4576; X86-BMI1-NEXT:    shrl %cl, %edi4577; X86-BMI1-NEXT:    xorl %ecx, %ecx4578; X86-BMI1-NEXT:    subb {{[0-9]+}}(%esp), %cl4579; X86-BMI1-NEXT:    movl $-1, %esi4580; X86-BMI1-NEXT:    # kill: def $cl killed $cl killed $ecx4581; X86-BMI1-NEXT:    shrl %cl, %esi4582; X86-BMI1-NEXT:    movl %esi, (%esp)4583; X86-BMI1-NEXT:    calll use32@PLT4584; X86-BMI1-NEXT:    andl %edi, %esi4585; X86-BMI1-NEXT:    movl %esi, %eax4586; X86-BMI1-NEXT:    addl $4, %esp4587; X86-BMI1-NEXT:    popl %esi4588; X86-BMI1-NEXT:    popl %edi4589; X86-BMI1-NEXT:    retl4590;4591; X86-BMI2-LABEL: bextr32_c4_commutative:4592; X86-BMI2:       # %bb.0:4593; X86-BMI2-NEXT:    pushl %ebx4594; X86-BMI2-NEXT:    pushl %esi4595; X86-BMI2-NEXT:    pushl %eax4596; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %ebx4597; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %eax4598; X86-BMI2-NEXT:    shrxl %eax, {{[0-9]+}}(%esp), %esi4599; X86-BMI2-NEXT:    movl $-1, %eax4600; X86-BMI2-NEXT:    bzhil %ebx, %eax, %eax4601; X86-BMI2-NEXT:    movl %eax, (%esp)4602; X86-BMI2-NEXT:    calll use32@PLT4603; X86-BMI2-NEXT:    bzhil %ebx, %esi, %eax4604; X86-BMI2-NEXT:    addl $4, %esp4605; X86-BMI2-NEXT:    popl %esi4606; X86-BMI2-NEXT:    popl %ebx4607; X86-BMI2-NEXT:    retl4608;4609; X64-NOBMI-LABEL: bextr32_c4_commutative:4610; X64-NOBMI:       # %bb.0:4611; X64-NOBMI-NEXT:    pushq %rbp4612; X64-NOBMI-NEXT:    pushq %rbx4613; X64-NOBMI-NEXT:    pushq %rax4614; X64-NOBMI-NEXT:    movl %esi, %ecx4615; X64-NOBMI-NEXT:    movl %edi, %ebx4616; X64-NOBMI-NEXT:    # kill: def $cl killed $cl killed $ecx4617; X64-NOBMI-NEXT:    shrl %cl, %ebx4618; X64-NOBMI-NEXT:    negb %dl4619; X64-NOBMI-NEXT:    movl $-1, %ebp4620; X64-NOBMI-NEXT:    movl %edx, %ecx4621; X64-NOBMI-NEXT:    shrl %cl, %ebp4622; X64-NOBMI-NEXT:    movl %ebp, %edi4623; X64-NOBMI-NEXT:    callq use32@PLT4624; X64-NOBMI-NEXT:    andl %ebx, %ebp4625; X64-NOBMI-NEXT:    movl %ebp, %eax4626; X64-NOBMI-NEXT:    addq $8, %rsp4627; X64-NOBMI-NEXT:    popq %rbx4628; X64-NOBMI-NEXT:    popq %rbp4629; X64-NOBMI-NEXT:    retq4630;4631; X64-BMI1-LABEL: bextr32_c4_commutative:4632; X64-BMI1:       # %bb.0:4633; X64-BMI1-NEXT:    pushq %rbp4634; X64-BMI1-NEXT:    pushq %rbx4635; X64-BMI1-NEXT:    pushq %rax4636; X64-BMI1-NEXT:    movl %esi, %ecx4637; X64-BMI1-NEXT:    movl %edi, %ebx4638; X64-BMI1-NEXT:    # kill: def $cl killed $cl killed $ecx4639; X64-BMI1-NEXT:    shrl %cl, %ebx4640; X64-BMI1-NEXT:    negb %dl4641; X64-BMI1-NEXT:    movl $-1, %ebp4642; X64-BMI1-NEXT:    movl %edx, %ecx4643; X64-BMI1-NEXT:    shrl %cl, %ebp4644; X64-BMI1-NEXT:    movl %ebp, %edi4645; X64-BMI1-NEXT:    callq use32@PLT4646; X64-BMI1-NEXT:    andl %ebx, %ebp4647; X64-BMI1-NEXT:    movl %ebp, %eax4648; X64-BMI1-NEXT:    addq $8, %rsp4649; X64-BMI1-NEXT:    popq %rbx4650; X64-BMI1-NEXT:    popq %rbp4651; X64-BMI1-NEXT:    retq4652;4653; X64-BMI2-LABEL: bextr32_c4_commutative:4654; X64-BMI2:       # %bb.0:4655; X64-BMI2-NEXT:    pushq %rbp4656; X64-BMI2-NEXT:    pushq %rbx4657; X64-BMI2-NEXT:    pushq %rax4658; X64-BMI2-NEXT:    movl %edx, %ebx4659; X64-BMI2-NEXT:    shrxl %esi, %edi, %ebp4660; X64-BMI2-NEXT:    movl $-1, %eax4661; X64-BMI2-NEXT:    bzhil %edx, %eax, %edi4662; X64-BMI2-NEXT:    callq use32@PLT4663; X64-BMI2-NEXT:    bzhil %ebx, %ebp, %eax4664; X64-BMI2-NEXT:    addq $8, %rsp4665; X64-BMI2-NEXT:    popq %rbx4666; X64-BMI2-NEXT:    popq %rbp4667; X64-BMI2-NEXT:    retq4668  %shifted = lshr i32 %val, %numskipbits4669  %numhighbits = sub i32 32, %numlowbits4670  %mask = lshr i32 -1, %numhighbits4671  call void @use32(i32 %mask)4672  %masked = and i32 %shifted, %mask ; swapped order4673  ret i32 %masked4674}4675 4676define i32 @bextr32_c5_skipextrauses(i32 %val, i32 %numskipbits, i32 %numlowbits) nounwind {4677; X86-NOBMI-LABEL: bextr32_c5_skipextrauses:4678; X86-NOBMI:       # %bb.0:4679; X86-NOBMI-NEXT:    pushl %ebx4680; X86-NOBMI-NEXT:    pushl %edi4681; X86-NOBMI-NEXT:    pushl %esi4682; X86-NOBMI-NEXT:    subl $16, %esp4683; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %edi4684; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %ebx4685; X86-NOBMI-NEXT:    movl %ebx, %ecx4686; X86-NOBMI-NEXT:    shrl %cl, %edi4687; X86-NOBMI-NEXT:    xorl %ecx, %ecx4688; X86-NOBMI-NEXT:    subb {{[0-9]+}}(%esp), %cl4689; X86-NOBMI-NEXT:    movl $-1, %esi4690; X86-NOBMI-NEXT:    # kill: def $cl killed $cl killed $ecx4691; X86-NOBMI-NEXT:    shrl %cl, %esi4692; X86-NOBMI-NEXT:    movl %esi, (%esp)4693; X86-NOBMI-NEXT:    calll use32@PLT4694; X86-NOBMI-NEXT:    andl %edi, %esi4695; X86-NOBMI-NEXT:    movl %ebx, (%esp)4696; X86-NOBMI-NEXT:    calll use32@PLT4697; X86-NOBMI-NEXT:    movl %esi, %eax4698; X86-NOBMI-NEXT:    addl $16, %esp4699; X86-NOBMI-NEXT:    popl %esi4700; X86-NOBMI-NEXT:    popl %edi4701; X86-NOBMI-NEXT:    popl %ebx4702; X86-NOBMI-NEXT:    retl4703;4704; X86-BMI1-LABEL: bextr32_c5_skipextrauses:4705; X86-BMI1:       # %bb.0:4706; X86-BMI1-NEXT:    pushl %ebx4707; X86-BMI1-NEXT:    pushl %edi4708; X86-BMI1-NEXT:    pushl %esi4709; X86-BMI1-NEXT:    subl $16, %esp4710; X86-BMI1-NEXT:    movl {{[0-9]+}}(%esp), %edi4711; X86-BMI1-NEXT:    movl {{[0-9]+}}(%esp), %ebx4712; X86-BMI1-NEXT:    movl %ebx, %ecx4713; X86-BMI1-NEXT:    shrl %cl, %edi4714; X86-BMI1-NEXT:    xorl %ecx, %ecx4715; X86-BMI1-NEXT:    subb {{[0-9]+}}(%esp), %cl4716; X86-BMI1-NEXT:    movl $-1, %esi4717; X86-BMI1-NEXT:    # kill: def $cl killed $cl killed $ecx4718; X86-BMI1-NEXT:    shrl %cl, %esi4719; X86-BMI1-NEXT:    movl %esi, (%esp)4720; X86-BMI1-NEXT:    calll use32@PLT4721; X86-BMI1-NEXT:    andl %edi, %esi4722; X86-BMI1-NEXT:    movl %ebx, (%esp)4723; X86-BMI1-NEXT:    calll use32@PLT4724; X86-BMI1-NEXT:    movl %esi, %eax4725; X86-BMI1-NEXT:    addl $16, %esp4726; X86-BMI1-NEXT:    popl %esi4727; X86-BMI1-NEXT:    popl %edi4728; X86-BMI1-NEXT:    popl %ebx4729; X86-BMI1-NEXT:    retl4730;4731; X86-BMI2-LABEL: bextr32_c5_skipextrauses:4732; X86-BMI2:       # %bb.0:4733; X86-BMI2-NEXT:    pushl %ebx4734; X86-BMI2-NEXT:    pushl %edi4735; X86-BMI2-NEXT:    pushl %esi4736; X86-BMI2-NEXT:    subl $16, %esp4737; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %ebx4738; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %edi4739; X86-BMI2-NEXT:    shrxl %edi, {{[0-9]+}}(%esp), %esi4740; X86-BMI2-NEXT:    movl $-1, %eax4741; X86-BMI2-NEXT:    bzhil %ebx, %eax, %eax4742; X86-BMI2-NEXT:    movl %eax, (%esp)4743; X86-BMI2-NEXT:    calll use32@PLT4744; X86-BMI2-NEXT:    bzhil %ebx, %esi, %esi4745; X86-BMI2-NEXT:    movl %edi, (%esp)4746; X86-BMI2-NEXT:    calll use32@PLT4747; X86-BMI2-NEXT:    movl %esi, %eax4748; X86-BMI2-NEXT:    addl $16, %esp4749; X86-BMI2-NEXT:    popl %esi4750; X86-BMI2-NEXT:    popl %edi4751; X86-BMI2-NEXT:    popl %ebx4752; X86-BMI2-NEXT:    retl4753;4754; X64-NOBMI-LABEL: bextr32_c5_skipextrauses:4755; X64-NOBMI:       # %bb.0:4756; X64-NOBMI-NEXT:    pushq %rbp4757; X64-NOBMI-NEXT:    pushq %r144758; X64-NOBMI-NEXT:    pushq %rbx4759; X64-NOBMI-NEXT:    movl %esi, %ebx4760; X64-NOBMI-NEXT:    movl %edi, %ebp4761; X64-NOBMI-NEXT:    movl %ebx, %ecx4762; X64-NOBMI-NEXT:    shrl %cl, %ebp4763; X64-NOBMI-NEXT:    negb %dl4764; X64-NOBMI-NEXT:    movl $-1, %r14d4765; X64-NOBMI-NEXT:    movl %edx, %ecx4766; X64-NOBMI-NEXT:    shrl %cl, %r14d4767; X64-NOBMI-NEXT:    movl %r14d, %edi4768; X64-NOBMI-NEXT:    callq use32@PLT4769; X64-NOBMI-NEXT:    andl %ebp, %r14d4770; X64-NOBMI-NEXT:    movl %ebx, %edi4771; X64-NOBMI-NEXT:    callq use32@PLT4772; X64-NOBMI-NEXT:    movl %r14d, %eax4773; X64-NOBMI-NEXT:    popq %rbx4774; X64-NOBMI-NEXT:    popq %r144775; X64-NOBMI-NEXT:    popq %rbp4776; X64-NOBMI-NEXT:    retq4777;4778; X64-BMI1-LABEL: bextr32_c5_skipextrauses:4779; X64-BMI1:       # %bb.0:4780; X64-BMI1-NEXT:    pushq %rbp4781; X64-BMI1-NEXT:    pushq %r144782; X64-BMI1-NEXT:    pushq %rbx4783; X64-BMI1-NEXT:    movl %esi, %ebx4784; X64-BMI1-NEXT:    movl %edi, %ebp4785; X64-BMI1-NEXT:    movl %ebx, %ecx4786; X64-BMI1-NEXT:    shrl %cl, %ebp4787; X64-BMI1-NEXT:    negb %dl4788; X64-BMI1-NEXT:    movl $-1, %r14d4789; X64-BMI1-NEXT:    movl %edx, %ecx4790; X64-BMI1-NEXT:    shrl %cl, %r14d4791; X64-BMI1-NEXT:    movl %r14d, %edi4792; X64-BMI1-NEXT:    callq use32@PLT4793; X64-BMI1-NEXT:    andl %ebp, %r14d4794; X64-BMI1-NEXT:    movl %ebx, %edi4795; X64-BMI1-NEXT:    callq use32@PLT4796; X64-BMI1-NEXT:    movl %r14d, %eax4797; X64-BMI1-NEXT:    popq %rbx4798; X64-BMI1-NEXT:    popq %r144799; X64-BMI1-NEXT:    popq %rbp4800; X64-BMI1-NEXT:    retq4801;4802; X64-BMI2-LABEL: bextr32_c5_skipextrauses:4803; X64-BMI2:       # %bb.0:4804; X64-BMI2-NEXT:    pushq %rbp4805; X64-BMI2-NEXT:    pushq %r144806; X64-BMI2-NEXT:    pushq %rbx4807; X64-BMI2-NEXT:    movl %edx, %ebx4808; X64-BMI2-NEXT:    movl %esi, %ebp4809; X64-BMI2-NEXT:    shrxl %esi, %edi, %r14d4810; X64-BMI2-NEXT:    movl $-1, %eax4811; X64-BMI2-NEXT:    bzhil %edx, %eax, %edi4812; X64-BMI2-NEXT:    callq use32@PLT4813; X64-BMI2-NEXT:    bzhil %ebx, %r14d, %ebx4814; X64-BMI2-NEXT:    movl %ebp, %edi4815; X64-BMI2-NEXT:    callq use32@PLT4816; X64-BMI2-NEXT:    movl %ebx, %eax4817; X64-BMI2-NEXT:    popq %rbx4818; X64-BMI2-NEXT:    popq %r144819; X64-BMI2-NEXT:    popq %rbp4820; X64-BMI2-NEXT:    retq4821  %shifted = lshr i32 %val, %numskipbits4822  %numhighbits = sub i32 32, %numlowbits4823  %mask = lshr i32 -1, %numhighbits4824  call void @use32(i32 %mask)4825  %masked = and i32 %mask, %shifted4826  call void @use32(i32 %numskipbits)4827  ret i32 %masked4828}4829 4830; 64-bit4831 4832define i64 @bextr64_c0(i64 %val, i64 %numskipbits, i64 %numlowbits) nounwind {4833; X86-NOBMI-LABEL: bextr64_c0:4834; X86-NOBMI:       # %bb.0:4835; X86-NOBMI-NEXT:    pushl %ebp4836; X86-NOBMI-NEXT:    pushl %ebx4837; X86-NOBMI-NEXT:    pushl %edi4838; X86-NOBMI-NEXT:    pushl %esi4839; X86-NOBMI-NEXT:    subl $12, %esp4840; X86-NOBMI-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx4841; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %esi4842; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %eax4843; X86-NOBMI-NEXT:    movl %eax, %edi4844; X86-NOBMI-NEXT:    shrl %cl, %edi4845; X86-NOBMI-NEXT:    shrdl %cl, %eax, %esi4846; X86-NOBMI-NEXT:    testb $32, %cl4847; X86-NOBMI-NEXT:    je .LBB41_24848; X86-NOBMI-NEXT:  # %bb.1:4849; X86-NOBMI-NEXT:    movl %edi, %esi4850; X86-NOBMI-NEXT:    xorl %edi, %edi4851; X86-NOBMI-NEXT:  .LBB41_2:4852; X86-NOBMI-NEXT:    movb $64, %cl4853; X86-NOBMI-NEXT:    subb {{[0-9]+}}(%esp), %cl4854; X86-NOBMI-NEXT:    movl $-1, %ebp4855; X86-NOBMI-NEXT:    movl $-1, %ebx4856; X86-NOBMI-NEXT:    shrl %cl, %ebx4857; X86-NOBMI-NEXT:    testb $32, %cl4858; X86-NOBMI-NEXT:    je .LBB41_44859; X86-NOBMI-NEXT:  # %bb.3:4860; X86-NOBMI-NEXT:    movl %ebx, %ebp4861; X86-NOBMI-NEXT:    xorl %ebx, %ebx4862; X86-NOBMI-NEXT:  .LBB41_4:4863; X86-NOBMI-NEXT:    subl $8, %esp4864; X86-NOBMI-NEXT:    pushl %ebx4865; X86-NOBMI-NEXT:    pushl %ebp4866; X86-NOBMI-NEXT:    calll use64@PLT4867; X86-NOBMI-NEXT:    addl $16, %esp4868; X86-NOBMI-NEXT:    andl %ebp, %esi4869; X86-NOBMI-NEXT:    andl %ebx, %edi4870; X86-NOBMI-NEXT:    movl %esi, %eax4871; X86-NOBMI-NEXT:    movl %edi, %edx4872; X86-NOBMI-NEXT:    addl $12, %esp4873; X86-NOBMI-NEXT:    popl %esi4874; X86-NOBMI-NEXT:    popl %edi4875; X86-NOBMI-NEXT:    popl %ebx4876; X86-NOBMI-NEXT:    popl %ebp4877; X86-NOBMI-NEXT:    retl4878;4879; X86-BMI1-LABEL: bextr64_c0:4880; X86-BMI1:       # %bb.0:4881; X86-BMI1-NEXT:    pushl %ebp4882; X86-BMI1-NEXT:    pushl %ebx4883; X86-BMI1-NEXT:    pushl %edi4884; X86-BMI1-NEXT:    pushl %esi4885; X86-BMI1-NEXT:    subl $12, %esp4886; X86-BMI1-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx4887; X86-BMI1-NEXT:    movl {{[0-9]+}}(%esp), %esi4888; X86-BMI1-NEXT:    movl {{[0-9]+}}(%esp), %eax4889; X86-BMI1-NEXT:    movl %eax, %edi4890; X86-BMI1-NEXT:    shrl %cl, %edi4891; X86-BMI1-NEXT:    shrdl %cl, %eax, %esi4892; X86-BMI1-NEXT:    testb $32, %cl4893; X86-BMI1-NEXT:    je .LBB41_24894; X86-BMI1-NEXT:  # %bb.1:4895; X86-BMI1-NEXT:    movl %edi, %esi4896; X86-BMI1-NEXT:    xorl %edi, %edi4897; X86-BMI1-NEXT:  .LBB41_2:4898; X86-BMI1-NEXT:    movb $64, %cl4899; X86-BMI1-NEXT:    subb {{[0-9]+}}(%esp), %cl4900; X86-BMI1-NEXT:    movl $-1, %ebp4901; X86-BMI1-NEXT:    movl $-1, %ebx4902; X86-BMI1-NEXT:    shrl %cl, %ebx4903; X86-BMI1-NEXT:    testb $32, %cl4904; X86-BMI1-NEXT:    je .LBB41_44905; X86-BMI1-NEXT:  # %bb.3:4906; X86-BMI1-NEXT:    movl %ebx, %ebp4907; X86-BMI1-NEXT:    xorl %ebx, %ebx4908; X86-BMI1-NEXT:  .LBB41_4:4909; X86-BMI1-NEXT:    subl $8, %esp4910; X86-BMI1-NEXT:    pushl %ebx4911; X86-BMI1-NEXT:    pushl %ebp4912; X86-BMI1-NEXT:    calll use64@PLT4913; X86-BMI1-NEXT:    addl $16, %esp4914; X86-BMI1-NEXT:    andl %ebp, %esi4915; X86-BMI1-NEXT:    andl %ebx, %edi4916; X86-BMI1-NEXT:    movl %esi, %eax4917; X86-BMI1-NEXT:    movl %edi, %edx4918; X86-BMI1-NEXT:    addl $12, %esp4919; X86-BMI1-NEXT:    popl %esi4920; X86-BMI1-NEXT:    popl %edi4921; X86-BMI1-NEXT:    popl %ebx4922; X86-BMI1-NEXT:    popl %ebp4923; X86-BMI1-NEXT:    retl4924;4925; X86-BMI2-LABEL: bextr64_c0:4926; X86-BMI2:       # %bb.0:4927; X86-BMI2-NEXT:    pushl %ebp4928; X86-BMI2-NEXT:    pushl %ebx4929; X86-BMI2-NEXT:    pushl %edi4930; X86-BMI2-NEXT:    pushl %esi4931; X86-BMI2-NEXT:    subl $12, %esp4932; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx4933; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %esi4934; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %eax4935; X86-BMI2-NEXT:    shrdl %cl, %eax, %esi4936; X86-BMI2-NEXT:    shrxl %ecx, %eax, %edi4937; X86-BMI2-NEXT:    testb $32, %cl4938; X86-BMI2-NEXT:    je .LBB41_24939; X86-BMI2-NEXT:  # %bb.1:4940; X86-BMI2-NEXT:    movl %edi, %esi4941; X86-BMI2-NEXT:    xorl %edi, %edi4942; X86-BMI2-NEXT:  .LBB41_2:4943; X86-BMI2-NEXT:    movb $64, %al4944; X86-BMI2-NEXT:    subb {{[0-9]+}}(%esp), %al4945; X86-BMI2-NEXT:    movl $-1, %ebp4946; X86-BMI2-NEXT:    shrxl %eax, %ebp, %ebx4947; X86-BMI2-NEXT:    testb $32, %al4948; X86-BMI2-NEXT:    je .LBB41_44949; X86-BMI2-NEXT:  # %bb.3:4950; X86-BMI2-NEXT:    movl %ebx, %ebp4951; X86-BMI2-NEXT:    xorl %ebx, %ebx4952; X86-BMI2-NEXT:  .LBB41_4:4953; X86-BMI2-NEXT:    subl $8, %esp4954; X86-BMI2-NEXT:    pushl %ebx4955; X86-BMI2-NEXT:    pushl %ebp4956; X86-BMI2-NEXT:    calll use64@PLT4957; X86-BMI2-NEXT:    addl $16, %esp4958; X86-BMI2-NEXT:    andl %ebp, %esi4959; X86-BMI2-NEXT:    andl %ebx, %edi4960; X86-BMI2-NEXT:    movl %esi, %eax4961; X86-BMI2-NEXT:    movl %edi, %edx4962; X86-BMI2-NEXT:    addl $12, %esp4963; X86-BMI2-NEXT:    popl %esi4964; X86-BMI2-NEXT:    popl %edi4965; X86-BMI2-NEXT:    popl %ebx4966; X86-BMI2-NEXT:    popl %ebp4967; X86-BMI2-NEXT:    retl4968;4969; X64-NOBMI-LABEL: bextr64_c0:4970; X64-NOBMI:       # %bb.0:4971; X64-NOBMI-NEXT:    pushq %r144972; X64-NOBMI-NEXT:    pushq %rbx4973; X64-NOBMI-NEXT:    pushq %rax4974; X64-NOBMI-NEXT:    movq %rsi, %rcx4975; X64-NOBMI-NEXT:    movq %rdi, %rbx4976; X64-NOBMI-NEXT:    # kill: def $cl killed $cl killed $rcx4977; X64-NOBMI-NEXT:    shrq %cl, %rbx4978; X64-NOBMI-NEXT:    negb %dl4979; X64-NOBMI-NEXT:    movq $-1, %r144980; X64-NOBMI-NEXT:    movl %edx, %ecx4981; X64-NOBMI-NEXT:    shrq %cl, %r144982; X64-NOBMI-NEXT:    movq %r14, %rdi4983; X64-NOBMI-NEXT:    callq use64@PLT4984; X64-NOBMI-NEXT:    andq %rbx, %r144985; X64-NOBMI-NEXT:    movq %r14, %rax4986; X64-NOBMI-NEXT:    addq $8, %rsp4987; X64-NOBMI-NEXT:    popq %rbx4988; X64-NOBMI-NEXT:    popq %r144989; X64-NOBMI-NEXT:    retq4990;4991; X64-BMI1-LABEL: bextr64_c0:4992; X64-BMI1:       # %bb.0:4993; X64-BMI1-NEXT:    pushq %r144994; X64-BMI1-NEXT:    pushq %rbx4995; X64-BMI1-NEXT:    pushq %rax4996; X64-BMI1-NEXT:    movq %rsi, %rcx4997; X64-BMI1-NEXT:    movq %rdi, %rbx4998; X64-BMI1-NEXT:    # kill: def $cl killed $cl killed $rcx4999; X64-BMI1-NEXT:    shrq %cl, %rbx5000; X64-BMI1-NEXT:    negb %dl5001; X64-BMI1-NEXT:    movq $-1, %r145002; X64-BMI1-NEXT:    movl %edx, %ecx5003; X64-BMI1-NEXT:    shrq %cl, %r145004; X64-BMI1-NEXT:    movq %r14, %rdi5005; X64-BMI1-NEXT:    callq use64@PLT5006; X64-BMI1-NEXT:    andq %rbx, %r145007; X64-BMI1-NEXT:    movq %r14, %rax5008; X64-BMI1-NEXT:    addq $8, %rsp5009; X64-BMI1-NEXT:    popq %rbx5010; X64-BMI1-NEXT:    popq %r145011; X64-BMI1-NEXT:    retq5012;5013; X64-BMI2-LABEL: bextr64_c0:5014; X64-BMI2:       # %bb.0:5015; X64-BMI2-NEXT:    pushq %r145016; X64-BMI2-NEXT:    pushq %rbx5017; X64-BMI2-NEXT:    pushq %rax5018; X64-BMI2-NEXT:    movq %rdx, %rbx5019; X64-BMI2-NEXT:    shrxq %rsi, %rdi, %r145020; X64-BMI2-NEXT:    movq $-1, %rax5021; X64-BMI2-NEXT:    bzhiq %rdx, %rax, %rdi5022; X64-BMI2-NEXT:    callq use64@PLT5023; X64-BMI2-NEXT:    bzhiq %rbx, %r14, %rax5024; X64-BMI2-NEXT:    addq $8, %rsp5025; X64-BMI2-NEXT:    popq %rbx5026; X64-BMI2-NEXT:    popq %r145027; X64-BMI2-NEXT:    retq5028  %shifted = lshr i64 %val, %numskipbits5029  %numhighbits = sub i64 64, %numlowbits5030  %mask = lshr i64 -1, %numhighbits5031  call void @use64(i64 %mask)5032  %masked = and i64 %mask, %shifted5033  ret i64 %masked5034}5035 5036define i64 @bextr64_c1_indexzext(i64 %val, i8 %numskipbits, i8 %numlowbits) nounwind {5037; X86-NOBMI-LABEL: bextr64_c1_indexzext:5038; X86-NOBMI:       # %bb.0:5039; X86-NOBMI-NEXT:    pushl %ebp5040; X86-NOBMI-NEXT:    pushl %ebx5041; X86-NOBMI-NEXT:    pushl %edi5042; X86-NOBMI-NEXT:    pushl %esi5043; X86-NOBMI-NEXT:    subl $12, %esp5044; X86-NOBMI-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx5045; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %esi5046; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %eax5047; X86-NOBMI-NEXT:    movl %eax, %edi5048; X86-NOBMI-NEXT:    shrl %cl, %edi5049; X86-NOBMI-NEXT:    shrdl %cl, %eax, %esi5050; X86-NOBMI-NEXT:    testb $32, %cl5051; X86-NOBMI-NEXT:    je .LBB42_25052; X86-NOBMI-NEXT:  # %bb.1:5053; X86-NOBMI-NEXT:    movl %edi, %esi5054; X86-NOBMI-NEXT:    xorl %edi, %edi5055; X86-NOBMI-NEXT:  .LBB42_2:5056; X86-NOBMI-NEXT:    movb $64, %cl5057; X86-NOBMI-NEXT:    subb {{[0-9]+}}(%esp), %cl5058; X86-NOBMI-NEXT:    movl $-1, %ebp5059; X86-NOBMI-NEXT:    movl $-1, %ebx5060; X86-NOBMI-NEXT:    shrl %cl, %ebx5061; X86-NOBMI-NEXT:    testb $32, %cl5062; X86-NOBMI-NEXT:    je .LBB42_45063; X86-NOBMI-NEXT:  # %bb.3:5064; X86-NOBMI-NEXT:    movl %ebx, %ebp5065; X86-NOBMI-NEXT:    xorl %ebx, %ebx5066; X86-NOBMI-NEXT:  .LBB42_4:5067; X86-NOBMI-NEXT:    subl $8, %esp5068; X86-NOBMI-NEXT:    pushl %ebx5069; X86-NOBMI-NEXT:    pushl %ebp5070; X86-NOBMI-NEXT:    calll use64@PLT5071; X86-NOBMI-NEXT:    addl $16, %esp5072; X86-NOBMI-NEXT:    andl %ebp, %esi5073; X86-NOBMI-NEXT:    andl %ebx, %edi5074; X86-NOBMI-NEXT:    movl %esi, %eax5075; X86-NOBMI-NEXT:    movl %edi, %edx5076; X86-NOBMI-NEXT:    addl $12, %esp5077; X86-NOBMI-NEXT:    popl %esi5078; X86-NOBMI-NEXT:    popl %edi5079; X86-NOBMI-NEXT:    popl %ebx5080; X86-NOBMI-NEXT:    popl %ebp5081; X86-NOBMI-NEXT:    retl5082;5083; X86-BMI1-LABEL: bextr64_c1_indexzext:5084; X86-BMI1:       # %bb.0:5085; X86-BMI1-NEXT:    pushl %ebp5086; X86-BMI1-NEXT:    pushl %ebx5087; X86-BMI1-NEXT:    pushl %edi5088; X86-BMI1-NEXT:    pushl %esi5089; X86-BMI1-NEXT:    subl $12, %esp5090; X86-BMI1-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx5091; X86-BMI1-NEXT:    movl {{[0-9]+}}(%esp), %esi5092; X86-BMI1-NEXT:    movl {{[0-9]+}}(%esp), %eax5093; X86-BMI1-NEXT:    movl %eax, %edi5094; X86-BMI1-NEXT:    shrl %cl, %edi5095; X86-BMI1-NEXT:    shrdl %cl, %eax, %esi5096; X86-BMI1-NEXT:    testb $32, %cl5097; X86-BMI1-NEXT:    je .LBB42_25098; X86-BMI1-NEXT:  # %bb.1:5099; X86-BMI1-NEXT:    movl %edi, %esi5100; X86-BMI1-NEXT:    xorl %edi, %edi5101; X86-BMI1-NEXT:  .LBB42_2:5102; X86-BMI1-NEXT:    movb $64, %cl5103; X86-BMI1-NEXT:    subb {{[0-9]+}}(%esp), %cl5104; X86-BMI1-NEXT:    movl $-1, %ebp5105; X86-BMI1-NEXT:    movl $-1, %ebx5106; X86-BMI1-NEXT:    shrl %cl, %ebx5107; X86-BMI1-NEXT:    testb $32, %cl5108; X86-BMI1-NEXT:    je .LBB42_45109; X86-BMI1-NEXT:  # %bb.3:5110; X86-BMI1-NEXT:    movl %ebx, %ebp5111; X86-BMI1-NEXT:    xorl %ebx, %ebx5112; X86-BMI1-NEXT:  .LBB42_4:5113; X86-BMI1-NEXT:    subl $8, %esp5114; X86-BMI1-NEXT:    pushl %ebx5115; X86-BMI1-NEXT:    pushl %ebp5116; X86-BMI1-NEXT:    calll use64@PLT5117; X86-BMI1-NEXT:    addl $16, %esp5118; X86-BMI1-NEXT:    andl %ebp, %esi5119; X86-BMI1-NEXT:    andl %ebx, %edi5120; X86-BMI1-NEXT:    movl %esi, %eax5121; X86-BMI1-NEXT:    movl %edi, %edx5122; X86-BMI1-NEXT:    addl $12, %esp5123; X86-BMI1-NEXT:    popl %esi5124; X86-BMI1-NEXT:    popl %edi5125; X86-BMI1-NEXT:    popl %ebx5126; X86-BMI1-NEXT:    popl %ebp5127; X86-BMI1-NEXT:    retl5128;5129; X86-BMI2-LABEL: bextr64_c1_indexzext:5130; X86-BMI2:       # %bb.0:5131; X86-BMI2-NEXT:    pushl %ebp5132; X86-BMI2-NEXT:    pushl %ebx5133; X86-BMI2-NEXT:    pushl %edi5134; X86-BMI2-NEXT:    pushl %esi5135; X86-BMI2-NEXT:    subl $12, %esp5136; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx5137; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %esi5138; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %eax5139; X86-BMI2-NEXT:    shrdl %cl, %eax, %esi5140; X86-BMI2-NEXT:    shrxl %ecx, %eax, %edi5141; X86-BMI2-NEXT:    testb $32, %cl5142; X86-BMI2-NEXT:    je .LBB42_25143; X86-BMI2-NEXT:  # %bb.1:5144; X86-BMI2-NEXT:    movl %edi, %esi5145; X86-BMI2-NEXT:    xorl %edi, %edi5146; X86-BMI2-NEXT:  .LBB42_2:5147; X86-BMI2-NEXT:    movb $64, %al5148; X86-BMI2-NEXT:    subb {{[0-9]+}}(%esp), %al5149; X86-BMI2-NEXT:    movl $-1, %ebp5150; X86-BMI2-NEXT:    shrxl %eax, %ebp, %ebx5151; X86-BMI2-NEXT:    testb $32, %al5152; X86-BMI2-NEXT:    je .LBB42_45153; X86-BMI2-NEXT:  # %bb.3:5154; X86-BMI2-NEXT:    movl %ebx, %ebp5155; X86-BMI2-NEXT:    xorl %ebx, %ebx5156; X86-BMI2-NEXT:  .LBB42_4:5157; X86-BMI2-NEXT:    subl $8, %esp5158; X86-BMI2-NEXT:    pushl %ebx5159; X86-BMI2-NEXT:    pushl %ebp5160; X86-BMI2-NEXT:    calll use64@PLT5161; X86-BMI2-NEXT:    addl $16, %esp5162; X86-BMI2-NEXT:    andl %ebp, %esi5163; X86-BMI2-NEXT:    andl %ebx, %edi5164; X86-BMI2-NEXT:    movl %esi, %eax5165; X86-BMI2-NEXT:    movl %edi, %edx5166; X86-BMI2-NEXT:    addl $12, %esp5167; X86-BMI2-NEXT:    popl %esi5168; X86-BMI2-NEXT:    popl %edi5169; X86-BMI2-NEXT:    popl %ebx5170; X86-BMI2-NEXT:    popl %ebp5171; X86-BMI2-NEXT:    retl5172;5173; X64-NOBMI-LABEL: bextr64_c1_indexzext:5174; X64-NOBMI:       # %bb.0:5175; X64-NOBMI-NEXT:    pushq %r145176; X64-NOBMI-NEXT:    pushq %rbx5177; X64-NOBMI-NEXT:    pushq %rax5178; X64-NOBMI-NEXT:    movl %esi, %ecx5179; X64-NOBMI-NEXT:    movq %rdi, %rbx5180; X64-NOBMI-NEXT:    # kill: def $cl killed $cl killed $ecx5181; X64-NOBMI-NEXT:    shrq %cl, %rbx5182; X64-NOBMI-NEXT:    negb %dl5183; X64-NOBMI-NEXT:    movq $-1, %r145184; X64-NOBMI-NEXT:    movl %edx, %ecx5185; X64-NOBMI-NEXT:    shrq %cl, %r145186; X64-NOBMI-NEXT:    movq %r14, %rdi5187; X64-NOBMI-NEXT:    callq use64@PLT5188; X64-NOBMI-NEXT:    andq %rbx, %r145189; X64-NOBMI-NEXT:    movq %r14, %rax5190; X64-NOBMI-NEXT:    addq $8, %rsp5191; X64-NOBMI-NEXT:    popq %rbx5192; X64-NOBMI-NEXT:    popq %r145193; X64-NOBMI-NEXT:    retq5194;5195; X64-BMI1-LABEL: bextr64_c1_indexzext:5196; X64-BMI1:       # %bb.0:5197; X64-BMI1-NEXT:    pushq %r145198; X64-BMI1-NEXT:    pushq %rbx5199; X64-BMI1-NEXT:    pushq %rax5200; X64-BMI1-NEXT:    movl %esi, %ecx5201; X64-BMI1-NEXT:    movq %rdi, %rbx5202; X64-BMI1-NEXT:    # kill: def $cl killed $cl killed $ecx5203; X64-BMI1-NEXT:    shrq %cl, %rbx5204; X64-BMI1-NEXT:    negb %dl5205; X64-BMI1-NEXT:    movq $-1, %r145206; X64-BMI1-NEXT:    movl %edx, %ecx5207; X64-BMI1-NEXT:    shrq %cl, %r145208; X64-BMI1-NEXT:    movq %r14, %rdi5209; X64-BMI1-NEXT:    callq use64@PLT5210; X64-BMI1-NEXT:    andq %rbx, %r145211; X64-BMI1-NEXT:    movq %r14, %rax5212; X64-BMI1-NEXT:    addq $8, %rsp5213; X64-BMI1-NEXT:    popq %rbx5214; X64-BMI1-NEXT:    popq %r145215; X64-BMI1-NEXT:    retq5216;5217; X64-BMI2-LABEL: bextr64_c1_indexzext:5218; X64-BMI2:       # %bb.0:5219; X64-BMI2-NEXT:    pushq %r145220; X64-BMI2-NEXT:    pushq %rbx5221; X64-BMI2-NEXT:    pushq %rax5222; X64-BMI2-NEXT:    movl %edx, %ebx5223; X64-BMI2-NEXT:    # kill: def $esi killed $esi def $rsi5224; X64-BMI2-NEXT:    shrxq %rsi, %rdi, %r145225; X64-BMI2-NEXT:    movq $-1, %rax5226; X64-BMI2-NEXT:    bzhiq %rbx, %rax, %rdi5227; X64-BMI2-NEXT:    callq use64@PLT5228; X64-BMI2-NEXT:    bzhiq %rbx, %r14, %rax5229; X64-BMI2-NEXT:    addq $8, %rsp5230; X64-BMI2-NEXT:    popq %rbx5231; X64-BMI2-NEXT:    popq %r145232; X64-BMI2-NEXT:    retq5233  %skip = zext i8 %numskipbits to i645234  %shifted = lshr i64 %val, %skip5235  %numhighbits = sub i8 64, %numlowbits5236  %sh_prom = zext i8 %numhighbits to i645237  %mask = lshr i64 -1, %sh_prom5238  call void @use64(i64 %mask)5239  %masked = and i64 %mask, %shifted5240  ret i64 %masked5241}5242 5243define i64 @bextr64_c2_load(ptr %w, i64 %numskipbits, i64 %numlowbits) nounwind {5244; X86-NOBMI-LABEL: bextr64_c2_load:5245; X86-NOBMI:       # %bb.0:5246; X86-NOBMI-NEXT:    pushl %ebp5247; X86-NOBMI-NEXT:    pushl %ebx5248; X86-NOBMI-NEXT:    pushl %edi5249; X86-NOBMI-NEXT:    pushl %esi5250; X86-NOBMI-NEXT:    subl $12, %esp5251; X86-NOBMI-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx5252; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %eax5253; X86-NOBMI-NEXT:    movl (%eax), %esi5254; X86-NOBMI-NEXT:    movl 4(%eax), %eax5255; X86-NOBMI-NEXT:    movl %eax, %edi5256; X86-NOBMI-NEXT:    shrl %cl, %edi5257; X86-NOBMI-NEXT:    shrdl %cl, %eax, %esi5258; X86-NOBMI-NEXT:    testb $32, %cl5259; X86-NOBMI-NEXT:    je .LBB43_25260; X86-NOBMI-NEXT:  # %bb.1:5261; X86-NOBMI-NEXT:    movl %edi, %esi5262; X86-NOBMI-NEXT:    xorl %edi, %edi5263; X86-NOBMI-NEXT:  .LBB43_2:5264; X86-NOBMI-NEXT:    movb $64, %cl5265; X86-NOBMI-NEXT:    subb {{[0-9]+}}(%esp), %cl5266; X86-NOBMI-NEXT:    movl $-1, %ebp5267; X86-NOBMI-NEXT:    movl $-1, %ebx5268; X86-NOBMI-NEXT:    shrl %cl, %ebx5269; X86-NOBMI-NEXT:    testb $32, %cl5270; X86-NOBMI-NEXT:    je .LBB43_45271; X86-NOBMI-NEXT:  # %bb.3:5272; X86-NOBMI-NEXT:    movl %ebx, %ebp5273; X86-NOBMI-NEXT:    xorl %ebx, %ebx5274; X86-NOBMI-NEXT:  .LBB43_4:5275; X86-NOBMI-NEXT:    subl $8, %esp5276; X86-NOBMI-NEXT:    pushl %ebx5277; X86-NOBMI-NEXT:    pushl %ebp5278; X86-NOBMI-NEXT:    calll use64@PLT5279; X86-NOBMI-NEXT:    addl $16, %esp5280; X86-NOBMI-NEXT:    andl %ebp, %esi5281; X86-NOBMI-NEXT:    andl %ebx, %edi5282; X86-NOBMI-NEXT:    movl %esi, %eax5283; X86-NOBMI-NEXT:    movl %edi, %edx5284; X86-NOBMI-NEXT:    addl $12, %esp5285; X86-NOBMI-NEXT:    popl %esi5286; X86-NOBMI-NEXT:    popl %edi5287; X86-NOBMI-NEXT:    popl %ebx5288; X86-NOBMI-NEXT:    popl %ebp5289; X86-NOBMI-NEXT:    retl5290;5291; X86-BMI1-LABEL: bextr64_c2_load:5292; X86-BMI1:       # %bb.0:5293; X86-BMI1-NEXT:    pushl %ebp5294; X86-BMI1-NEXT:    pushl %ebx5295; X86-BMI1-NEXT:    pushl %edi5296; X86-BMI1-NEXT:    pushl %esi5297; X86-BMI1-NEXT:    subl $12, %esp5298; X86-BMI1-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx5299; X86-BMI1-NEXT:    movl {{[0-9]+}}(%esp), %eax5300; X86-BMI1-NEXT:    movl (%eax), %esi5301; X86-BMI1-NEXT:    movl 4(%eax), %eax5302; X86-BMI1-NEXT:    movl %eax, %edi5303; X86-BMI1-NEXT:    shrl %cl, %edi5304; X86-BMI1-NEXT:    shrdl %cl, %eax, %esi5305; X86-BMI1-NEXT:    testb $32, %cl5306; X86-BMI1-NEXT:    je .LBB43_25307; X86-BMI1-NEXT:  # %bb.1:5308; X86-BMI1-NEXT:    movl %edi, %esi5309; X86-BMI1-NEXT:    xorl %edi, %edi5310; X86-BMI1-NEXT:  .LBB43_2:5311; X86-BMI1-NEXT:    movb $64, %cl5312; X86-BMI1-NEXT:    subb {{[0-9]+}}(%esp), %cl5313; X86-BMI1-NEXT:    movl $-1, %ebp5314; X86-BMI1-NEXT:    movl $-1, %ebx5315; X86-BMI1-NEXT:    shrl %cl, %ebx5316; X86-BMI1-NEXT:    testb $32, %cl5317; X86-BMI1-NEXT:    je .LBB43_45318; X86-BMI1-NEXT:  # %bb.3:5319; X86-BMI1-NEXT:    movl %ebx, %ebp5320; X86-BMI1-NEXT:    xorl %ebx, %ebx5321; X86-BMI1-NEXT:  .LBB43_4:5322; X86-BMI1-NEXT:    subl $8, %esp5323; X86-BMI1-NEXT:    pushl %ebx5324; X86-BMI1-NEXT:    pushl %ebp5325; X86-BMI1-NEXT:    calll use64@PLT5326; X86-BMI1-NEXT:    addl $16, %esp5327; X86-BMI1-NEXT:    andl %ebp, %esi5328; X86-BMI1-NEXT:    andl %ebx, %edi5329; X86-BMI1-NEXT:    movl %esi, %eax5330; X86-BMI1-NEXT:    movl %edi, %edx5331; X86-BMI1-NEXT:    addl $12, %esp5332; X86-BMI1-NEXT:    popl %esi5333; X86-BMI1-NEXT:    popl %edi5334; X86-BMI1-NEXT:    popl %ebx5335; X86-BMI1-NEXT:    popl %ebp5336; X86-BMI1-NEXT:    retl5337;5338; X86-BMI2-LABEL: bextr64_c2_load:5339; X86-BMI2:       # %bb.0:5340; X86-BMI2-NEXT:    pushl %ebp5341; X86-BMI2-NEXT:    pushl %ebx5342; X86-BMI2-NEXT:    pushl %edi5343; X86-BMI2-NEXT:    pushl %esi5344; X86-BMI2-NEXT:    subl $12, %esp5345; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx5346; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %eax5347; X86-BMI2-NEXT:    movl (%eax), %esi5348; X86-BMI2-NEXT:    movl 4(%eax), %eax5349; X86-BMI2-NEXT:    shrxl %ecx, %eax, %edi5350; X86-BMI2-NEXT:    shrdl %cl, %eax, %esi5351; X86-BMI2-NEXT:    testb $32, %cl5352; X86-BMI2-NEXT:    je .LBB43_25353; X86-BMI2-NEXT:  # %bb.1:5354; X86-BMI2-NEXT:    movl %edi, %esi5355; X86-BMI2-NEXT:    xorl %edi, %edi5356; X86-BMI2-NEXT:  .LBB43_2:5357; X86-BMI2-NEXT:    movb $64, %al5358; X86-BMI2-NEXT:    subb {{[0-9]+}}(%esp), %al5359; X86-BMI2-NEXT:    movl $-1, %ebp5360; X86-BMI2-NEXT:    shrxl %eax, %ebp, %ebx5361; X86-BMI2-NEXT:    testb $32, %al5362; X86-BMI2-NEXT:    je .LBB43_45363; X86-BMI2-NEXT:  # %bb.3:5364; X86-BMI2-NEXT:    movl %ebx, %ebp5365; X86-BMI2-NEXT:    xorl %ebx, %ebx5366; X86-BMI2-NEXT:  .LBB43_4:5367; X86-BMI2-NEXT:    subl $8, %esp5368; X86-BMI2-NEXT:    pushl %ebx5369; X86-BMI2-NEXT:    pushl %ebp5370; X86-BMI2-NEXT:    calll use64@PLT5371; X86-BMI2-NEXT:    addl $16, %esp5372; X86-BMI2-NEXT:    andl %ebp, %esi5373; X86-BMI2-NEXT:    andl %ebx, %edi5374; X86-BMI2-NEXT:    movl %esi, %eax5375; X86-BMI2-NEXT:    movl %edi, %edx5376; X86-BMI2-NEXT:    addl $12, %esp5377; X86-BMI2-NEXT:    popl %esi5378; X86-BMI2-NEXT:    popl %edi5379; X86-BMI2-NEXT:    popl %ebx5380; X86-BMI2-NEXT:    popl %ebp5381; X86-BMI2-NEXT:    retl5382;5383; X64-NOBMI-LABEL: bextr64_c2_load:5384; X64-NOBMI:       # %bb.0:5385; X64-NOBMI-NEXT:    pushq %r145386; X64-NOBMI-NEXT:    pushq %rbx5387; X64-NOBMI-NEXT:    pushq %rax5388; X64-NOBMI-NEXT:    movq %rsi, %rcx5389; X64-NOBMI-NEXT:    movq (%rdi), %r145390; X64-NOBMI-NEXT:    # kill: def $cl killed $cl killed $rcx5391; X64-NOBMI-NEXT:    shrq %cl, %r145392; X64-NOBMI-NEXT:    negb %dl5393; X64-NOBMI-NEXT:    movq $-1, %rbx5394; X64-NOBMI-NEXT:    movl %edx, %ecx5395; X64-NOBMI-NEXT:    shrq %cl, %rbx5396; X64-NOBMI-NEXT:    movq %rbx, %rdi5397; X64-NOBMI-NEXT:    callq use64@PLT5398; X64-NOBMI-NEXT:    andq %r14, %rbx5399; X64-NOBMI-NEXT:    movq %rbx, %rax5400; X64-NOBMI-NEXT:    addq $8, %rsp5401; X64-NOBMI-NEXT:    popq %rbx5402; X64-NOBMI-NEXT:    popq %r145403; X64-NOBMI-NEXT:    retq5404;5405; X64-BMI1-LABEL: bextr64_c2_load:5406; X64-BMI1:       # %bb.0:5407; X64-BMI1-NEXT:    pushq %r145408; X64-BMI1-NEXT:    pushq %rbx5409; X64-BMI1-NEXT:    pushq %rax5410; X64-BMI1-NEXT:    movq %rsi, %rcx5411; X64-BMI1-NEXT:    movq (%rdi), %r145412; X64-BMI1-NEXT:    # kill: def $cl killed $cl killed $rcx5413; X64-BMI1-NEXT:    shrq %cl, %r145414; X64-BMI1-NEXT:    negb %dl5415; X64-BMI1-NEXT:    movq $-1, %rbx5416; X64-BMI1-NEXT:    movl %edx, %ecx5417; X64-BMI1-NEXT:    shrq %cl, %rbx5418; X64-BMI1-NEXT:    movq %rbx, %rdi5419; X64-BMI1-NEXT:    callq use64@PLT5420; X64-BMI1-NEXT:    andq %r14, %rbx5421; X64-BMI1-NEXT:    movq %rbx, %rax5422; X64-BMI1-NEXT:    addq $8, %rsp5423; X64-BMI1-NEXT:    popq %rbx5424; X64-BMI1-NEXT:    popq %r145425; X64-BMI1-NEXT:    retq5426;5427; X64-BMI2-LABEL: bextr64_c2_load:5428; X64-BMI2:       # %bb.0:5429; X64-BMI2-NEXT:    pushq %r145430; X64-BMI2-NEXT:    pushq %rbx5431; X64-BMI2-NEXT:    pushq %rax5432; X64-BMI2-NEXT:    movq %rdx, %rbx5433; X64-BMI2-NEXT:    shrxq %rsi, (%rdi), %r145434; X64-BMI2-NEXT:    movq $-1, %rax5435; X64-BMI2-NEXT:    bzhiq %rdx, %rax, %rdi5436; X64-BMI2-NEXT:    callq use64@PLT5437; X64-BMI2-NEXT:    bzhiq %rbx, %r14, %rax5438; X64-BMI2-NEXT:    addq $8, %rsp5439; X64-BMI2-NEXT:    popq %rbx5440; X64-BMI2-NEXT:    popq %r145441; X64-BMI2-NEXT:    retq5442  %val = load i64, ptr %w5443  %shifted = lshr i64 %val, %numskipbits5444  %numhighbits = sub i64 64, %numlowbits5445  %mask = lshr i64 -1, %numhighbits5446  call void @use64(i64 %mask)5447  %masked = and i64 %mask, %shifted5448  ret i64 %masked5449}5450 5451define i64 @bextr64_c3_load_indexzext(ptr %w, i8 %numskipbits, i8 %numlowbits) nounwind {5452; X86-NOBMI-LABEL: bextr64_c3_load_indexzext:5453; X86-NOBMI:       # %bb.0:5454; X86-NOBMI-NEXT:    pushl %ebp5455; X86-NOBMI-NEXT:    pushl %ebx5456; X86-NOBMI-NEXT:    pushl %edi5457; X86-NOBMI-NEXT:    pushl %esi5458; X86-NOBMI-NEXT:    subl $12, %esp5459; X86-NOBMI-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx5460; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %eax5461; X86-NOBMI-NEXT:    movl (%eax), %esi5462; X86-NOBMI-NEXT:    movl 4(%eax), %eax5463; X86-NOBMI-NEXT:    movl %eax, %edi5464; X86-NOBMI-NEXT:    shrl %cl, %edi5465; X86-NOBMI-NEXT:    shrdl %cl, %eax, %esi5466; X86-NOBMI-NEXT:    testb $32, %cl5467; X86-NOBMI-NEXT:    je .LBB44_25468; X86-NOBMI-NEXT:  # %bb.1:5469; X86-NOBMI-NEXT:    movl %edi, %esi5470; X86-NOBMI-NEXT:    xorl %edi, %edi5471; X86-NOBMI-NEXT:  .LBB44_2:5472; X86-NOBMI-NEXT:    movb $64, %cl5473; X86-NOBMI-NEXT:    subb {{[0-9]+}}(%esp), %cl5474; X86-NOBMI-NEXT:    movl $-1, %ebp5475; X86-NOBMI-NEXT:    movl $-1, %ebx5476; X86-NOBMI-NEXT:    shrl %cl, %ebx5477; X86-NOBMI-NEXT:    testb $32, %cl5478; X86-NOBMI-NEXT:    je .LBB44_45479; X86-NOBMI-NEXT:  # %bb.3:5480; X86-NOBMI-NEXT:    movl %ebx, %ebp5481; X86-NOBMI-NEXT:    xorl %ebx, %ebx5482; X86-NOBMI-NEXT:  .LBB44_4:5483; X86-NOBMI-NEXT:    subl $8, %esp5484; X86-NOBMI-NEXT:    pushl %ebx5485; X86-NOBMI-NEXT:    pushl %ebp5486; X86-NOBMI-NEXT:    calll use64@PLT5487; X86-NOBMI-NEXT:    addl $16, %esp5488; X86-NOBMI-NEXT:    andl %ebp, %esi5489; X86-NOBMI-NEXT:    andl %ebx, %edi5490; X86-NOBMI-NEXT:    movl %esi, %eax5491; X86-NOBMI-NEXT:    movl %edi, %edx5492; X86-NOBMI-NEXT:    addl $12, %esp5493; X86-NOBMI-NEXT:    popl %esi5494; X86-NOBMI-NEXT:    popl %edi5495; X86-NOBMI-NEXT:    popl %ebx5496; X86-NOBMI-NEXT:    popl %ebp5497; X86-NOBMI-NEXT:    retl5498;5499; X86-BMI1-LABEL: bextr64_c3_load_indexzext:5500; X86-BMI1:       # %bb.0:5501; X86-BMI1-NEXT:    pushl %ebp5502; X86-BMI1-NEXT:    pushl %ebx5503; X86-BMI1-NEXT:    pushl %edi5504; X86-BMI1-NEXT:    pushl %esi5505; X86-BMI1-NEXT:    subl $12, %esp5506; X86-BMI1-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx5507; X86-BMI1-NEXT:    movl {{[0-9]+}}(%esp), %eax5508; X86-BMI1-NEXT:    movl (%eax), %esi5509; X86-BMI1-NEXT:    movl 4(%eax), %eax5510; X86-BMI1-NEXT:    movl %eax, %edi5511; X86-BMI1-NEXT:    shrl %cl, %edi5512; X86-BMI1-NEXT:    shrdl %cl, %eax, %esi5513; X86-BMI1-NEXT:    testb $32, %cl5514; X86-BMI1-NEXT:    je .LBB44_25515; X86-BMI1-NEXT:  # %bb.1:5516; X86-BMI1-NEXT:    movl %edi, %esi5517; X86-BMI1-NEXT:    xorl %edi, %edi5518; X86-BMI1-NEXT:  .LBB44_2:5519; X86-BMI1-NEXT:    movb $64, %cl5520; X86-BMI1-NEXT:    subb {{[0-9]+}}(%esp), %cl5521; X86-BMI1-NEXT:    movl $-1, %ebp5522; X86-BMI1-NEXT:    movl $-1, %ebx5523; X86-BMI1-NEXT:    shrl %cl, %ebx5524; X86-BMI1-NEXT:    testb $32, %cl5525; X86-BMI1-NEXT:    je .LBB44_45526; X86-BMI1-NEXT:  # %bb.3:5527; X86-BMI1-NEXT:    movl %ebx, %ebp5528; X86-BMI1-NEXT:    xorl %ebx, %ebx5529; X86-BMI1-NEXT:  .LBB44_4:5530; X86-BMI1-NEXT:    subl $8, %esp5531; X86-BMI1-NEXT:    pushl %ebx5532; X86-BMI1-NEXT:    pushl %ebp5533; X86-BMI1-NEXT:    calll use64@PLT5534; X86-BMI1-NEXT:    addl $16, %esp5535; X86-BMI1-NEXT:    andl %ebp, %esi5536; X86-BMI1-NEXT:    andl %ebx, %edi5537; X86-BMI1-NEXT:    movl %esi, %eax5538; X86-BMI1-NEXT:    movl %edi, %edx5539; X86-BMI1-NEXT:    addl $12, %esp5540; X86-BMI1-NEXT:    popl %esi5541; X86-BMI1-NEXT:    popl %edi5542; X86-BMI1-NEXT:    popl %ebx5543; X86-BMI1-NEXT:    popl %ebp5544; X86-BMI1-NEXT:    retl5545;5546; X86-BMI2-LABEL: bextr64_c3_load_indexzext:5547; X86-BMI2:       # %bb.0:5548; X86-BMI2-NEXT:    pushl %ebp5549; X86-BMI2-NEXT:    pushl %ebx5550; X86-BMI2-NEXT:    pushl %edi5551; X86-BMI2-NEXT:    pushl %esi5552; X86-BMI2-NEXT:    subl $12, %esp5553; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx5554; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %eax5555; X86-BMI2-NEXT:    movl (%eax), %esi5556; X86-BMI2-NEXT:    movl 4(%eax), %eax5557; X86-BMI2-NEXT:    shrxl %ecx, %eax, %edi5558; X86-BMI2-NEXT:    shrdl %cl, %eax, %esi5559; X86-BMI2-NEXT:    testb $32, %cl5560; X86-BMI2-NEXT:    je .LBB44_25561; X86-BMI2-NEXT:  # %bb.1:5562; X86-BMI2-NEXT:    movl %edi, %esi5563; X86-BMI2-NEXT:    xorl %edi, %edi5564; X86-BMI2-NEXT:  .LBB44_2:5565; X86-BMI2-NEXT:    movb $64, %al5566; X86-BMI2-NEXT:    subb {{[0-9]+}}(%esp), %al5567; X86-BMI2-NEXT:    movl $-1, %ebp5568; X86-BMI2-NEXT:    shrxl %eax, %ebp, %ebx5569; X86-BMI2-NEXT:    testb $32, %al5570; X86-BMI2-NEXT:    je .LBB44_45571; X86-BMI2-NEXT:  # %bb.3:5572; X86-BMI2-NEXT:    movl %ebx, %ebp5573; X86-BMI2-NEXT:    xorl %ebx, %ebx5574; X86-BMI2-NEXT:  .LBB44_4:5575; X86-BMI2-NEXT:    subl $8, %esp5576; X86-BMI2-NEXT:    pushl %ebx5577; X86-BMI2-NEXT:    pushl %ebp5578; X86-BMI2-NEXT:    calll use64@PLT5579; X86-BMI2-NEXT:    addl $16, %esp5580; X86-BMI2-NEXT:    andl %ebp, %esi5581; X86-BMI2-NEXT:    andl %ebx, %edi5582; X86-BMI2-NEXT:    movl %esi, %eax5583; X86-BMI2-NEXT:    movl %edi, %edx5584; X86-BMI2-NEXT:    addl $12, %esp5585; X86-BMI2-NEXT:    popl %esi5586; X86-BMI2-NEXT:    popl %edi5587; X86-BMI2-NEXT:    popl %ebx5588; X86-BMI2-NEXT:    popl %ebp5589; X86-BMI2-NEXT:    retl5590;5591; X64-NOBMI-LABEL: bextr64_c3_load_indexzext:5592; X64-NOBMI:       # %bb.0:5593; X64-NOBMI-NEXT:    pushq %r145594; X64-NOBMI-NEXT:    pushq %rbx5595; X64-NOBMI-NEXT:    pushq %rax5596; X64-NOBMI-NEXT:    movl %esi, %ecx5597; X64-NOBMI-NEXT:    movq (%rdi), %r145598; X64-NOBMI-NEXT:    # kill: def $cl killed $cl killed $ecx5599; X64-NOBMI-NEXT:    shrq %cl, %r145600; X64-NOBMI-NEXT:    negb %dl5601; X64-NOBMI-NEXT:    movq $-1, %rbx5602; X64-NOBMI-NEXT:    movl %edx, %ecx5603; X64-NOBMI-NEXT:    shrq %cl, %rbx5604; X64-NOBMI-NEXT:    movq %rbx, %rdi5605; X64-NOBMI-NEXT:    callq use64@PLT5606; X64-NOBMI-NEXT:    andq %r14, %rbx5607; X64-NOBMI-NEXT:    movq %rbx, %rax5608; X64-NOBMI-NEXT:    addq $8, %rsp5609; X64-NOBMI-NEXT:    popq %rbx5610; X64-NOBMI-NEXT:    popq %r145611; X64-NOBMI-NEXT:    retq5612;5613; X64-BMI1-LABEL: bextr64_c3_load_indexzext:5614; X64-BMI1:       # %bb.0:5615; X64-BMI1-NEXT:    pushq %r145616; X64-BMI1-NEXT:    pushq %rbx5617; X64-BMI1-NEXT:    pushq %rax5618; X64-BMI1-NEXT:    movl %esi, %ecx5619; X64-BMI1-NEXT:    movq (%rdi), %r145620; X64-BMI1-NEXT:    # kill: def $cl killed $cl killed $ecx5621; X64-BMI1-NEXT:    shrq %cl, %r145622; X64-BMI1-NEXT:    negb %dl5623; X64-BMI1-NEXT:    movq $-1, %rbx5624; X64-BMI1-NEXT:    movl %edx, %ecx5625; X64-BMI1-NEXT:    shrq %cl, %rbx5626; X64-BMI1-NEXT:    movq %rbx, %rdi5627; X64-BMI1-NEXT:    callq use64@PLT5628; X64-BMI1-NEXT:    andq %r14, %rbx5629; X64-BMI1-NEXT:    movq %rbx, %rax5630; X64-BMI1-NEXT:    addq $8, %rsp5631; X64-BMI1-NEXT:    popq %rbx5632; X64-BMI1-NEXT:    popq %r145633; X64-BMI1-NEXT:    retq5634;5635; X64-BMI2-LABEL: bextr64_c3_load_indexzext:5636; X64-BMI2:       # %bb.0:5637; X64-BMI2-NEXT:    pushq %r145638; X64-BMI2-NEXT:    pushq %rbx5639; X64-BMI2-NEXT:    pushq %rax5640; X64-BMI2-NEXT:    movl %edx, %ebx5641; X64-BMI2-NEXT:    # kill: def $esi killed $esi def $rsi5642; X64-BMI2-NEXT:    shrxq %rsi, (%rdi), %r145643; X64-BMI2-NEXT:    movq $-1, %rax5644; X64-BMI2-NEXT:    bzhiq %rbx, %rax, %rdi5645; X64-BMI2-NEXT:    callq use64@PLT5646; X64-BMI2-NEXT:    bzhiq %rbx, %r14, %rax5647; X64-BMI2-NEXT:    addq $8, %rsp5648; X64-BMI2-NEXT:    popq %rbx5649; X64-BMI2-NEXT:    popq %r145650; X64-BMI2-NEXT:    retq5651  %val = load i64, ptr %w5652  %skip = zext i8 %numskipbits to i645653  %shifted = lshr i64 %val, %skip5654  %numhighbits = sub i8 64, %numlowbits5655  %sh_prom = zext i8 %numhighbits to i645656  %mask = lshr i64 -1, %sh_prom5657  call void @use64(i64 %mask)5658  %masked = and i64 %mask, %shifted5659  ret i64 %masked5660}5661 5662define i64 @bextr64_c4_commutative(i64 %val, i64 %numskipbits, i64 %numlowbits) nounwind {5663; X86-NOBMI-LABEL: bextr64_c4_commutative:5664; X86-NOBMI:       # %bb.0:5665; X86-NOBMI-NEXT:    pushl %ebp5666; X86-NOBMI-NEXT:    pushl %ebx5667; X86-NOBMI-NEXT:    pushl %edi5668; X86-NOBMI-NEXT:    pushl %esi5669; X86-NOBMI-NEXT:    subl $12, %esp5670; X86-NOBMI-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx5671; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %esi5672; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %eax5673; X86-NOBMI-NEXT:    movl %eax, %edi5674; X86-NOBMI-NEXT:    shrl %cl, %edi5675; X86-NOBMI-NEXT:    shrdl %cl, %eax, %esi5676; X86-NOBMI-NEXT:    testb $32, %cl5677; X86-NOBMI-NEXT:    je .LBB45_25678; X86-NOBMI-NEXT:  # %bb.1:5679; X86-NOBMI-NEXT:    movl %edi, %esi5680; X86-NOBMI-NEXT:    xorl %edi, %edi5681; X86-NOBMI-NEXT:  .LBB45_2:5682; X86-NOBMI-NEXT:    movb $64, %cl5683; X86-NOBMI-NEXT:    subb {{[0-9]+}}(%esp), %cl5684; X86-NOBMI-NEXT:    movl $-1, %ebp5685; X86-NOBMI-NEXT:    movl $-1, %ebx5686; X86-NOBMI-NEXT:    shrl %cl, %ebx5687; X86-NOBMI-NEXT:    testb $32, %cl5688; X86-NOBMI-NEXT:    je .LBB45_45689; X86-NOBMI-NEXT:  # %bb.3:5690; X86-NOBMI-NEXT:    movl %ebx, %ebp5691; X86-NOBMI-NEXT:    xorl %ebx, %ebx5692; X86-NOBMI-NEXT:  .LBB45_4:5693; X86-NOBMI-NEXT:    subl $8, %esp5694; X86-NOBMI-NEXT:    pushl %ebx5695; X86-NOBMI-NEXT:    pushl %ebp5696; X86-NOBMI-NEXT:    calll use64@PLT5697; X86-NOBMI-NEXT:    addl $16, %esp5698; X86-NOBMI-NEXT:    andl %ebp, %esi5699; X86-NOBMI-NEXT:    andl %ebx, %edi5700; X86-NOBMI-NEXT:    movl %esi, %eax5701; X86-NOBMI-NEXT:    movl %edi, %edx5702; X86-NOBMI-NEXT:    addl $12, %esp5703; X86-NOBMI-NEXT:    popl %esi5704; X86-NOBMI-NEXT:    popl %edi5705; X86-NOBMI-NEXT:    popl %ebx5706; X86-NOBMI-NEXT:    popl %ebp5707; X86-NOBMI-NEXT:    retl5708;5709; X86-BMI1-LABEL: bextr64_c4_commutative:5710; X86-BMI1:       # %bb.0:5711; X86-BMI1-NEXT:    pushl %ebp5712; X86-BMI1-NEXT:    pushl %ebx5713; X86-BMI1-NEXT:    pushl %edi5714; X86-BMI1-NEXT:    pushl %esi5715; X86-BMI1-NEXT:    subl $12, %esp5716; X86-BMI1-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx5717; X86-BMI1-NEXT:    movl {{[0-9]+}}(%esp), %esi5718; X86-BMI1-NEXT:    movl {{[0-9]+}}(%esp), %eax5719; X86-BMI1-NEXT:    movl %eax, %edi5720; X86-BMI1-NEXT:    shrl %cl, %edi5721; X86-BMI1-NEXT:    shrdl %cl, %eax, %esi5722; X86-BMI1-NEXT:    testb $32, %cl5723; X86-BMI1-NEXT:    je .LBB45_25724; X86-BMI1-NEXT:  # %bb.1:5725; X86-BMI1-NEXT:    movl %edi, %esi5726; X86-BMI1-NEXT:    xorl %edi, %edi5727; X86-BMI1-NEXT:  .LBB45_2:5728; X86-BMI1-NEXT:    movb $64, %cl5729; X86-BMI1-NEXT:    subb {{[0-9]+}}(%esp), %cl5730; X86-BMI1-NEXT:    movl $-1, %ebp5731; X86-BMI1-NEXT:    movl $-1, %ebx5732; X86-BMI1-NEXT:    shrl %cl, %ebx5733; X86-BMI1-NEXT:    testb $32, %cl5734; X86-BMI1-NEXT:    je .LBB45_45735; X86-BMI1-NEXT:  # %bb.3:5736; X86-BMI1-NEXT:    movl %ebx, %ebp5737; X86-BMI1-NEXT:    xorl %ebx, %ebx5738; X86-BMI1-NEXT:  .LBB45_4:5739; X86-BMI1-NEXT:    subl $8, %esp5740; X86-BMI1-NEXT:    pushl %ebx5741; X86-BMI1-NEXT:    pushl %ebp5742; X86-BMI1-NEXT:    calll use64@PLT5743; X86-BMI1-NEXT:    addl $16, %esp5744; X86-BMI1-NEXT:    andl %ebp, %esi5745; X86-BMI1-NEXT:    andl %ebx, %edi5746; X86-BMI1-NEXT:    movl %esi, %eax5747; X86-BMI1-NEXT:    movl %edi, %edx5748; X86-BMI1-NEXT:    addl $12, %esp5749; X86-BMI1-NEXT:    popl %esi5750; X86-BMI1-NEXT:    popl %edi5751; X86-BMI1-NEXT:    popl %ebx5752; X86-BMI1-NEXT:    popl %ebp5753; X86-BMI1-NEXT:    retl5754;5755; X86-BMI2-LABEL: bextr64_c4_commutative:5756; X86-BMI2:       # %bb.0:5757; X86-BMI2-NEXT:    pushl %ebp5758; X86-BMI2-NEXT:    pushl %ebx5759; X86-BMI2-NEXT:    pushl %edi5760; X86-BMI2-NEXT:    pushl %esi5761; X86-BMI2-NEXT:    subl $12, %esp5762; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx5763; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %esi5764; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %eax5765; X86-BMI2-NEXT:    shrdl %cl, %eax, %esi5766; X86-BMI2-NEXT:    shrxl %ecx, %eax, %edi5767; X86-BMI2-NEXT:    testb $32, %cl5768; X86-BMI2-NEXT:    je .LBB45_25769; X86-BMI2-NEXT:  # %bb.1:5770; X86-BMI2-NEXT:    movl %edi, %esi5771; X86-BMI2-NEXT:    xorl %edi, %edi5772; X86-BMI2-NEXT:  .LBB45_2:5773; X86-BMI2-NEXT:    movb $64, %al5774; X86-BMI2-NEXT:    subb {{[0-9]+}}(%esp), %al5775; X86-BMI2-NEXT:    movl $-1, %ebp5776; X86-BMI2-NEXT:    shrxl %eax, %ebp, %ebx5777; X86-BMI2-NEXT:    testb $32, %al5778; X86-BMI2-NEXT:    je .LBB45_45779; X86-BMI2-NEXT:  # %bb.3:5780; X86-BMI2-NEXT:    movl %ebx, %ebp5781; X86-BMI2-NEXT:    xorl %ebx, %ebx5782; X86-BMI2-NEXT:  .LBB45_4:5783; X86-BMI2-NEXT:    subl $8, %esp5784; X86-BMI2-NEXT:    pushl %ebx5785; X86-BMI2-NEXT:    pushl %ebp5786; X86-BMI2-NEXT:    calll use64@PLT5787; X86-BMI2-NEXT:    addl $16, %esp5788; X86-BMI2-NEXT:    andl %ebp, %esi5789; X86-BMI2-NEXT:    andl %ebx, %edi5790; X86-BMI2-NEXT:    movl %esi, %eax5791; X86-BMI2-NEXT:    movl %edi, %edx5792; X86-BMI2-NEXT:    addl $12, %esp5793; X86-BMI2-NEXT:    popl %esi5794; X86-BMI2-NEXT:    popl %edi5795; X86-BMI2-NEXT:    popl %ebx5796; X86-BMI2-NEXT:    popl %ebp5797; X86-BMI2-NEXT:    retl5798;5799; X64-NOBMI-LABEL: bextr64_c4_commutative:5800; X64-NOBMI:       # %bb.0:5801; X64-NOBMI-NEXT:    pushq %r145802; X64-NOBMI-NEXT:    pushq %rbx5803; X64-NOBMI-NEXT:    pushq %rax5804; X64-NOBMI-NEXT:    movq %rsi, %rcx5805; X64-NOBMI-NEXT:    movq %rdi, %rbx5806; X64-NOBMI-NEXT:    # kill: def $cl killed $cl killed $rcx5807; X64-NOBMI-NEXT:    shrq %cl, %rbx5808; X64-NOBMI-NEXT:    negb %dl5809; X64-NOBMI-NEXT:    movq $-1, %r145810; X64-NOBMI-NEXT:    movl %edx, %ecx5811; X64-NOBMI-NEXT:    shrq %cl, %r145812; X64-NOBMI-NEXT:    movq %r14, %rdi5813; X64-NOBMI-NEXT:    callq use64@PLT5814; X64-NOBMI-NEXT:    andq %rbx, %r145815; X64-NOBMI-NEXT:    movq %r14, %rax5816; X64-NOBMI-NEXT:    addq $8, %rsp5817; X64-NOBMI-NEXT:    popq %rbx5818; X64-NOBMI-NEXT:    popq %r145819; X64-NOBMI-NEXT:    retq5820;5821; X64-BMI1-LABEL: bextr64_c4_commutative:5822; X64-BMI1:       # %bb.0:5823; X64-BMI1-NEXT:    pushq %r145824; X64-BMI1-NEXT:    pushq %rbx5825; X64-BMI1-NEXT:    pushq %rax5826; X64-BMI1-NEXT:    movq %rsi, %rcx5827; X64-BMI1-NEXT:    movq %rdi, %rbx5828; X64-BMI1-NEXT:    # kill: def $cl killed $cl killed $rcx5829; X64-BMI1-NEXT:    shrq %cl, %rbx5830; X64-BMI1-NEXT:    negb %dl5831; X64-BMI1-NEXT:    movq $-1, %r145832; X64-BMI1-NEXT:    movl %edx, %ecx5833; X64-BMI1-NEXT:    shrq %cl, %r145834; X64-BMI1-NEXT:    movq %r14, %rdi5835; X64-BMI1-NEXT:    callq use64@PLT5836; X64-BMI1-NEXT:    andq %rbx, %r145837; X64-BMI1-NEXT:    movq %r14, %rax5838; X64-BMI1-NEXT:    addq $8, %rsp5839; X64-BMI1-NEXT:    popq %rbx5840; X64-BMI1-NEXT:    popq %r145841; X64-BMI1-NEXT:    retq5842;5843; X64-BMI2-LABEL: bextr64_c4_commutative:5844; X64-BMI2:       # %bb.0:5845; X64-BMI2-NEXT:    pushq %r145846; X64-BMI2-NEXT:    pushq %rbx5847; X64-BMI2-NEXT:    pushq %rax5848; X64-BMI2-NEXT:    movq %rdx, %rbx5849; X64-BMI2-NEXT:    shrxq %rsi, %rdi, %r145850; X64-BMI2-NEXT:    movq $-1, %rax5851; X64-BMI2-NEXT:    bzhiq %rdx, %rax, %rdi5852; X64-BMI2-NEXT:    callq use64@PLT5853; X64-BMI2-NEXT:    bzhiq %rbx, %r14, %rax5854; X64-BMI2-NEXT:    addq $8, %rsp5855; X64-BMI2-NEXT:    popq %rbx5856; X64-BMI2-NEXT:    popq %r145857; X64-BMI2-NEXT:    retq5858  %shifted = lshr i64 %val, %numskipbits5859  %numhighbits = sub i64 64, %numlowbits5860  %mask = lshr i64 -1, %numhighbits5861  call void @use64(i64 %mask)5862  %masked = and i64 %shifted, %mask ; swapped order5863  ret i64 %masked5864}5865 5866define i64 @bextr64_c5_skipextrauses(i64 %val, i64 %numskipbits, i64 %numlowbits) nounwind {5867; X86-NOBMI-LABEL: bextr64_c5_skipextrauses:5868; X86-NOBMI:       # %bb.0:5869; X86-NOBMI-NEXT:    pushl %ebp5870; X86-NOBMI-NEXT:    pushl %ebx5871; X86-NOBMI-NEXT:    pushl %edi5872; X86-NOBMI-NEXT:    pushl %esi5873; X86-NOBMI-NEXT:    subl $12, %esp5874; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %esi5875; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %eax5876; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %ecx5877; X86-NOBMI-NEXT:    movl %eax, %edi5878; X86-NOBMI-NEXT:    shrl %cl, %edi5879; X86-NOBMI-NEXT:    shrdl %cl, %eax, %esi5880; X86-NOBMI-NEXT:    testb $32, %cl5881; X86-NOBMI-NEXT:    je .LBB46_25882; X86-NOBMI-NEXT:  # %bb.1:5883; X86-NOBMI-NEXT:    movl %edi, %esi5884; X86-NOBMI-NEXT:    xorl %edi, %edi5885; X86-NOBMI-NEXT:  .LBB46_2:5886; X86-NOBMI-NEXT:    movb $64, %cl5887; X86-NOBMI-NEXT:    subb {{[0-9]+}}(%esp), %cl5888; X86-NOBMI-NEXT:    movl $-1, %ebx5889; X86-NOBMI-NEXT:    movl $-1, %ebp5890; X86-NOBMI-NEXT:    shrl %cl, %ebp5891; X86-NOBMI-NEXT:    testb $32, %cl5892; X86-NOBMI-NEXT:    je .LBB46_45893; X86-NOBMI-NEXT:  # %bb.3:5894; X86-NOBMI-NEXT:    movl %ebp, %ebx5895; X86-NOBMI-NEXT:    xorl %ebp, %ebp5896; X86-NOBMI-NEXT:  .LBB46_4:5897; X86-NOBMI-NEXT:    subl $8, %esp5898; X86-NOBMI-NEXT:    pushl %ebp5899; X86-NOBMI-NEXT:    pushl %ebx5900; X86-NOBMI-NEXT:    calll use64@PLT5901; X86-NOBMI-NEXT:    addl $16, %esp5902; X86-NOBMI-NEXT:    andl %ebx, %esi5903; X86-NOBMI-NEXT:    andl %ebp, %edi5904; X86-NOBMI-NEXT:    subl $8, %esp5905; X86-NOBMI-NEXT:    pushl {{[0-9]+}}(%esp)5906; X86-NOBMI-NEXT:    pushl {{[0-9]+}}(%esp)5907; X86-NOBMI-NEXT:    calll use64@PLT5908; X86-NOBMI-NEXT:    addl $16, %esp5909; X86-NOBMI-NEXT:    movl %esi, %eax5910; X86-NOBMI-NEXT:    movl %edi, %edx5911; X86-NOBMI-NEXT:    addl $12, %esp5912; X86-NOBMI-NEXT:    popl %esi5913; X86-NOBMI-NEXT:    popl %edi5914; X86-NOBMI-NEXT:    popl %ebx5915; X86-NOBMI-NEXT:    popl %ebp5916; X86-NOBMI-NEXT:    retl5917;5918; X86-BMI1-LABEL: bextr64_c5_skipextrauses:5919; X86-BMI1:       # %bb.0:5920; X86-BMI1-NEXT:    pushl %ebp5921; X86-BMI1-NEXT:    pushl %ebx5922; X86-BMI1-NEXT:    pushl %edi5923; X86-BMI1-NEXT:    pushl %esi5924; X86-BMI1-NEXT:    subl $12, %esp5925; X86-BMI1-NEXT:    movl {{[0-9]+}}(%esp), %esi5926; X86-BMI1-NEXT:    movl {{[0-9]+}}(%esp), %eax5927; X86-BMI1-NEXT:    movl {{[0-9]+}}(%esp), %ecx5928; X86-BMI1-NEXT:    movl %eax, %edi5929; X86-BMI1-NEXT:    shrl %cl, %edi5930; X86-BMI1-NEXT:    shrdl %cl, %eax, %esi5931; X86-BMI1-NEXT:    testb $32, %cl5932; X86-BMI1-NEXT:    je .LBB46_25933; X86-BMI1-NEXT:  # %bb.1:5934; X86-BMI1-NEXT:    movl %edi, %esi5935; X86-BMI1-NEXT:    xorl %edi, %edi5936; X86-BMI1-NEXT:  .LBB46_2:5937; X86-BMI1-NEXT:    movb $64, %cl5938; X86-BMI1-NEXT:    subb {{[0-9]+}}(%esp), %cl5939; X86-BMI1-NEXT:    movl $-1, %ebx5940; X86-BMI1-NEXT:    movl $-1, %ebp5941; X86-BMI1-NEXT:    shrl %cl, %ebp5942; X86-BMI1-NEXT:    testb $32, %cl5943; X86-BMI1-NEXT:    je .LBB46_45944; X86-BMI1-NEXT:  # %bb.3:5945; X86-BMI1-NEXT:    movl %ebp, %ebx5946; X86-BMI1-NEXT:    xorl %ebp, %ebp5947; X86-BMI1-NEXT:  .LBB46_4:5948; X86-BMI1-NEXT:    subl $8, %esp5949; X86-BMI1-NEXT:    pushl %ebp5950; X86-BMI1-NEXT:    pushl %ebx5951; X86-BMI1-NEXT:    calll use64@PLT5952; X86-BMI1-NEXT:    addl $16, %esp5953; X86-BMI1-NEXT:    andl %ebx, %esi5954; X86-BMI1-NEXT:    andl %ebp, %edi5955; X86-BMI1-NEXT:    subl $8, %esp5956; X86-BMI1-NEXT:    pushl {{[0-9]+}}(%esp)5957; X86-BMI1-NEXT:    pushl {{[0-9]+}}(%esp)5958; X86-BMI1-NEXT:    calll use64@PLT5959; X86-BMI1-NEXT:    addl $16, %esp5960; X86-BMI1-NEXT:    movl %esi, %eax5961; X86-BMI1-NEXT:    movl %edi, %edx5962; X86-BMI1-NEXT:    addl $12, %esp5963; X86-BMI1-NEXT:    popl %esi5964; X86-BMI1-NEXT:    popl %edi5965; X86-BMI1-NEXT:    popl %ebx5966; X86-BMI1-NEXT:    popl %ebp5967; X86-BMI1-NEXT:    retl5968;5969; X86-BMI2-LABEL: bextr64_c5_skipextrauses:5970; X86-BMI2:       # %bb.0:5971; X86-BMI2-NEXT:    pushl %ebp5972; X86-BMI2-NEXT:    pushl %ebx5973; X86-BMI2-NEXT:    pushl %edi5974; X86-BMI2-NEXT:    pushl %esi5975; X86-BMI2-NEXT:    subl $12, %esp5976; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %esi5977; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %eax5978; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %ecx5979; X86-BMI2-NEXT:    shrdl %cl, %eax, %esi5980; X86-BMI2-NEXT:    shrxl %ecx, %eax, %edi5981; X86-BMI2-NEXT:    testb $32, %cl5982; X86-BMI2-NEXT:    je .LBB46_25983; X86-BMI2-NEXT:  # %bb.1:5984; X86-BMI2-NEXT:    movl %edi, %esi5985; X86-BMI2-NEXT:    xorl %edi, %edi5986; X86-BMI2-NEXT:  .LBB46_2:5987; X86-BMI2-NEXT:    movb $64, %al5988; X86-BMI2-NEXT:    subb {{[0-9]+}}(%esp), %al5989; X86-BMI2-NEXT:    movl $-1, %ebp5990; X86-BMI2-NEXT:    shrxl %eax, %ebp, %ebx5991; X86-BMI2-NEXT:    testb $32, %al5992; X86-BMI2-NEXT:    je .LBB46_45993; X86-BMI2-NEXT:  # %bb.3:5994; X86-BMI2-NEXT:    movl %ebx, %ebp5995; X86-BMI2-NEXT:    xorl %ebx, %ebx5996; X86-BMI2-NEXT:  .LBB46_4:5997; X86-BMI2-NEXT:    subl $8, %esp5998; X86-BMI2-NEXT:    pushl %ebx5999; X86-BMI2-NEXT:    pushl %ebp6000; X86-BMI2-NEXT:    calll use64@PLT6001; X86-BMI2-NEXT:    addl $16, %esp6002; X86-BMI2-NEXT:    andl %ebp, %esi6003; X86-BMI2-NEXT:    andl %ebx, %edi6004; X86-BMI2-NEXT:    subl $8, %esp6005; X86-BMI2-NEXT:    pushl {{[0-9]+}}(%esp)6006; X86-BMI2-NEXT:    pushl {{[0-9]+}}(%esp)6007; X86-BMI2-NEXT:    calll use64@PLT6008; X86-BMI2-NEXT:    addl $16, %esp6009; X86-BMI2-NEXT:    movl %esi, %eax6010; X86-BMI2-NEXT:    movl %edi, %edx6011; X86-BMI2-NEXT:    addl $12, %esp6012; X86-BMI2-NEXT:    popl %esi6013; X86-BMI2-NEXT:    popl %edi6014; X86-BMI2-NEXT:    popl %ebx6015; X86-BMI2-NEXT:    popl %ebp6016; X86-BMI2-NEXT:    retl6017;6018; X64-NOBMI-LABEL: bextr64_c5_skipextrauses:6019; X64-NOBMI:       # %bb.0:6020; X64-NOBMI-NEXT:    pushq %r156021; X64-NOBMI-NEXT:    pushq %r146022; X64-NOBMI-NEXT:    pushq %rbx6023; X64-NOBMI-NEXT:    movq %rsi, %rbx6024; X64-NOBMI-NEXT:    movq %rdi, %r146025; X64-NOBMI-NEXT:    movl %ebx, %ecx6026; X64-NOBMI-NEXT:    shrq %cl, %r146027; X64-NOBMI-NEXT:    negb %dl6028; X64-NOBMI-NEXT:    movq $-1, %r156029; X64-NOBMI-NEXT:    movl %edx, %ecx6030; X64-NOBMI-NEXT:    shrq %cl, %r156031; X64-NOBMI-NEXT:    movq %r15, %rdi6032; X64-NOBMI-NEXT:    callq use64@PLT6033; X64-NOBMI-NEXT:    andq %r14, %r156034; X64-NOBMI-NEXT:    movq %rbx, %rdi6035; X64-NOBMI-NEXT:    callq use64@PLT6036; X64-NOBMI-NEXT:    movq %r15, %rax6037; X64-NOBMI-NEXT:    popq %rbx6038; X64-NOBMI-NEXT:    popq %r146039; X64-NOBMI-NEXT:    popq %r156040; X64-NOBMI-NEXT:    retq6041;6042; X64-BMI1-LABEL: bextr64_c5_skipextrauses:6043; X64-BMI1:       # %bb.0:6044; X64-BMI1-NEXT:    pushq %r156045; X64-BMI1-NEXT:    pushq %r146046; X64-BMI1-NEXT:    pushq %rbx6047; X64-BMI1-NEXT:    movq %rsi, %rbx6048; X64-BMI1-NEXT:    movq %rdi, %r146049; X64-BMI1-NEXT:    movl %ebx, %ecx6050; X64-BMI1-NEXT:    shrq %cl, %r146051; X64-BMI1-NEXT:    negb %dl6052; X64-BMI1-NEXT:    movq $-1, %r156053; X64-BMI1-NEXT:    movl %edx, %ecx6054; X64-BMI1-NEXT:    shrq %cl, %r156055; X64-BMI1-NEXT:    movq %r15, %rdi6056; X64-BMI1-NEXT:    callq use64@PLT6057; X64-BMI1-NEXT:    andq %r14, %r156058; X64-BMI1-NEXT:    movq %rbx, %rdi6059; X64-BMI1-NEXT:    callq use64@PLT6060; X64-BMI1-NEXT:    movq %r15, %rax6061; X64-BMI1-NEXT:    popq %rbx6062; X64-BMI1-NEXT:    popq %r146063; X64-BMI1-NEXT:    popq %r156064; X64-BMI1-NEXT:    retq6065;6066; X64-BMI2-LABEL: bextr64_c5_skipextrauses:6067; X64-BMI2:       # %bb.0:6068; X64-BMI2-NEXT:    pushq %r156069; X64-BMI2-NEXT:    pushq %r146070; X64-BMI2-NEXT:    pushq %rbx6071; X64-BMI2-NEXT:    movq %rdx, %rbx6072; X64-BMI2-NEXT:    movq %rsi, %r146073; X64-BMI2-NEXT:    shrxq %rsi, %rdi, %r156074; X64-BMI2-NEXT:    movq $-1, %rax6075; X64-BMI2-NEXT:    bzhiq %rdx, %rax, %rdi6076; X64-BMI2-NEXT:    callq use64@PLT6077; X64-BMI2-NEXT:    bzhiq %rbx, %r15, %rbx6078; X64-BMI2-NEXT:    movq %r14, %rdi6079; X64-BMI2-NEXT:    callq use64@PLT6080; X64-BMI2-NEXT:    movq %rbx, %rax6081; X64-BMI2-NEXT:    popq %rbx6082; X64-BMI2-NEXT:    popq %r146083; X64-BMI2-NEXT:    popq %r156084; X64-BMI2-NEXT:    retq6085  %shifted = lshr i64 %val, %numskipbits6086  %numhighbits = sub i64 64, %numlowbits6087  %mask = lshr i64 -1, %numhighbits6088  call void @use64(i64 %mask)6089  %masked = and i64 %mask, %shifted6090  call void @use64(i64 %numskipbits)6091  ret i64 %masked6092}6093 6094; 64-bit, but with 32-bit output6095 6096; Everything done in 64-bit, truncation happens last.6097define i32 @bextr64_32_c0(i64 %val, i64 %numskipbits, i64 %numlowbits) nounwind {6098; X86-NOBMI-LABEL: bextr64_32_c0:6099; X86-NOBMI:       # %bb.0:6100; X86-NOBMI-NEXT:    pushl %esi6101; X86-NOBMI-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx6102; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %eax6103; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %esi6104; X86-NOBMI-NEXT:    movl %esi, %edx6105; X86-NOBMI-NEXT:    shrl %cl, %edx6106; X86-NOBMI-NEXT:    shrdl %cl, %esi, %eax6107; X86-NOBMI-NEXT:    testb $32, %cl6108; X86-NOBMI-NEXT:    jne .LBB47_26109; X86-NOBMI-NEXT:  # %bb.1:6110; X86-NOBMI-NEXT:    movl %eax, %edx6111; X86-NOBMI-NEXT:  .LBB47_2:6112; X86-NOBMI-NEXT:    movb $64, %cl6113; X86-NOBMI-NEXT:    subb {{[0-9]+}}(%esp), %cl6114; X86-NOBMI-NEXT:    movl $-1, %eax6115; X86-NOBMI-NEXT:    shrl %cl, %eax6116; X86-NOBMI-NEXT:    testb $32, %cl6117; X86-NOBMI-NEXT:    jne .LBB47_46118; X86-NOBMI-NEXT:  # %bb.3:6119; X86-NOBMI-NEXT:    movl $-1, %eax6120; X86-NOBMI-NEXT:  .LBB47_4:6121; X86-NOBMI-NEXT:    andl %edx, %eax6122; X86-NOBMI-NEXT:    popl %esi6123; X86-NOBMI-NEXT:    retl6124;6125; X86-BMI1-LABEL: bextr64_32_c0:6126; X86-BMI1:       # %bb.0:6127; X86-BMI1-NEXT:    pushl %esi6128; X86-BMI1-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx6129; X86-BMI1-NEXT:    movl {{[0-9]+}}(%esp), %eax6130; X86-BMI1-NEXT:    movl {{[0-9]+}}(%esp), %esi6131; X86-BMI1-NEXT:    movl %esi, %edx6132; X86-BMI1-NEXT:    shrl %cl, %edx6133; X86-BMI1-NEXT:    shrdl %cl, %esi, %eax6134; X86-BMI1-NEXT:    testb $32, %cl6135; X86-BMI1-NEXT:    jne .LBB47_26136; X86-BMI1-NEXT:  # %bb.1:6137; X86-BMI1-NEXT:    movl %eax, %edx6138; X86-BMI1-NEXT:  .LBB47_2:6139; X86-BMI1-NEXT:    movb $64, %cl6140; X86-BMI1-NEXT:    subb {{[0-9]+}}(%esp), %cl6141; X86-BMI1-NEXT:    movl $-1, %eax6142; X86-BMI1-NEXT:    shrl %cl, %eax6143; X86-BMI1-NEXT:    testb $32, %cl6144; X86-BMI1-NEXT:    jne .LBB47_46145; X86-BMI1-NEXT:  # %bb.3:6146; X86-BMI1-NEXT:    movl $-1, %eax6147; X86-BMI1-NEXT:  .LBB47_4:6148; X86-BMI1-NEXT:    andl %edx, %eax6149; X86-BMI1-NEXT:    popl %esi6150; X86-BMI1-NEXT:    retl6151;6152; X86-BMI2-LABEL: bextr64_32_c0:6153; X86-BMI2:       # %bb.0:6154; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx6155; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %edx6156; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %eax6157; X86-BMI2-NEXT:    shrdl %cl, %eax, %edx6158; X86-BMI2-NEXT:    testb $32, %cl6159; X86-BMI2-NEXT:    je .LBB47_26160; X86-BMI2-NEXT:  # %bb.1:6161; X86-BMI2-NEXT:    shrxl %ecx, %eax, %edx6162; X86-BMI2-NEXT:  .LBB47_2:6163; X86-BMI2-NEXT:    movb $64, %cl6164; X86-BMI2-NEXT:    subb {{[0-9]+}}(%esp), %cl6165; X86-BMI2-NEXT:    movl $-1, %eax6166; X86-BMI2-NEXT:    testb $32, %cl6167; X86-BMI2-NEXT:    je .LBB47_46168; X86-BMI2-NEXT:  # %bb.3:6169; X86-BMI2-NEXT:    shrxl %ecx, %eax, %eax6170; X86-BMI2-NEXT:  .LBB47_4:6171; X86-BMI2-NEXT:    andl %edx, %eax6172; X86-BMI2-NEXT:    retl6173;6174; X64-NOBMI-LABEL: bextr64_32_c0:6175; X64-NOBMI:       # %bb.0:6176; X64-NOBMI-NEXT:    movq %rsi, %rcx6177; X64-NOBMI-NEXT:    # kill: def $cl killed $cl killed $rcx6178; X64-NOBMI-NEXT:    shrq %cl, %rdi6179; X64-NOBMI-NEXT:    negb %dl6180; X64-NOBMI-NEXT:    movq $-1, %rax6181; X64-NOBMI-NEXT:    movl %edx, %ecx6182; X64-NOBMI-NEXT:    shrq %cl, %rax6183; X64-NOBMI-NEXT:    andl %edi, %eax6184; X64-NOBMI-NEXT:    # kill: def $eax killed $eax killed $rax6185; X64-NOBMI-NEXT:    retq6186;6187; X64-BMI1-LABEL: bextr64_32_c0:6188; X64-BMI1:       # %bb.0:6189; X64-BMI1-NEXT:    shll $8, %edx6190; X64-BMI1-NEXT:    movzbl %sil, %eax6191; X64-BMI1-NEXT:    orl %edx, %eax6192; X64-BMI1-NEXT:    bextrq %rax, %rdi, %rax6193; X64-BMI1-NEXT:    # kill: def $eax killed $eax killed $rax6194; X64-BMI1-NEXT:    retq6195;6196; X64-BMI2-LABEL: bextr64_32_c0:6197; X64-BMI2:       # %bb.0:6198; X64-BMI2-NEXT:    shrxq %rsi, %rdi, %rax6199; X64-BMI2-NEXT:    bzhil %edx, %eax, %eax6200; X64-BMI2-NEXT:    retq6201  %shifted = lshr i64 %val, %numskipbits6202  %numhighbits = sub i64 64, %numlowbits6203  %mask = lshr i64 -1, %numhighbits6204  %masked = and i64 %mask, %shifted6205  %res = trunc i64 %masked to i326206  ret i32 %res6207}6208 6209; Shifting happens in 64-bit, then truncation. Masking is 32-bit.6210define i32 @bextr64_32_c1(i64 %val, i64 %numskipbits, i32 %numlowbits) nounwind {6211; X86-NOBMI-LABEL: bextr64_32_c1:6212; X86-NOBMI:       # %bb.0:6213; X86-NOBMI-NEXT:    pushl %esi6214; X86-NOBMI-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx6215; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %edx6216; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %esi6217; X86-NOBMI-NEXT:    movl %esi, %eax6218; X86-NOBMI-NEXT:    shrl %cl, %eax6219; X86-NOBMI-NEXT:    shrdl %cl, %esi, %edx6220; X86-NOBMI-NEXT:    testb $32, %cl6221; X86-NOBMI-NEXT:    jne .LBB48_26222; X86-NOBMI-NEXT:  # %bb.1:6223; X86-NOBMI-NEXT:    movl %edx, %eax6224; X86-NOBMI-NEXT:  .LBB48_2:6225; X86-NOBMI-NEXT:    xorl %ecx, %ecx6226; X86-NOBMI-NEXT:    subb {{[0-9]+}}(%esp), %cl6227; X86-NOBMI-NEXT:    shll %cl, %eax6228; X86-NOBMI-NEXT:    # kill: def $cl killed $cl killed $ecx6229; X86-NOBMI-NEXT:    shrl %cl, %eax6230; X86-NOBMI-NEXT:    popl %esi6231; X86-NOBMI-NEXT:    retl6232;6233; X86-BMI1-LABEL: bextr64_32_c1:6234; X86-BMI1:       # %bb.0:6235; X86-BMI1-NEXT:    pushl %edi6236; X86-BMI1-NEXT:    pushl %esi6237; X86-BMI1-NEXT:    movzbl {{[0-9]+}}(%esp), %eax6238; X86-BMI1-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx6239; X86-BMI1-NEXT:    movl {{[0-9]+}}(%esp), %esi6240; X86-BMI1-NEXT:    movl {{[0-9]+}}(%esp), %edi6241; X86-BMI1-NEXT:    movl %edi, %edx6242; X86-BMI1-NEXT:    shrl %cl, %edx6243; X86-BMI1-NEXT:    shrdl %cl, %edi, %esi6244; X86-BMI1-NEXT:    testb $32, %cl6245; X86-BMI1-NEXT:    jne .LBB48_26246; X86-BMI1-NEXT:  # %bb.1:6247; X86-BMI1-NEXT:    movl %esi, %edx6248; X86-BMI1-NEXT:  .LBB48_2:6249; X86-BMI1-NEXT:    shll $8, %eax6250; X86-BMI1-NEXT:    bextrl %eax, %edx, %eax6251; X86-BMI1-NEXT:    popl %esi6252; X86-BMI1-NEXT:    popl %edi6253; X86-BMI1-NEXT:    retl6254;6255; X86-BMI2-LABEL: bextr64_32_c1:6256; X86-BMI2:       # %bb.0:6257; X86-BMI2-NEXT:    pushl %esi6258; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %eax6259; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx6260; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %edx6261; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %esi6262; X86-BMI2-NEXT:    shrdl %cl, %esi, %edx6263; X86-BMI2-NEXT:    testb $32, %cl6264; X86-BMI2-NEXT:    je .LBB48_26265; X86-BMI2-NEXT:  # %bb.1:6266; X86-BMI2-NEXT:    shrxl %ecx, %esi, %edx6267; X86-BMI2-NEXT:  .LBB48_2:6268; X86-BMI2-NEXT:    bzhil %eax, %edx, %eax6269; X86-BMI2-NEXT:    popl %esi6270; X86-BMI2-NEXT:    retl6271;6272; X64-NOBMI-LABEL: bextr64_32_c1:6273; X64-NOBMI:       # %bb.0:6274; X64-NOBMI-NEXT:    movq %rsi, %rcx6275; X64-NOBMI-NEXT:    movq %rdi, %rax6276; X64-NOBMI-NEXT:    # kill: def $cl killed $cl killed $rcx6277; X64-NOBMI-NEXT:    shrq %cl, %rax6278; X64-NOBMI-NEXT:    negb %dl6279; X64-NOBMI-NEXT:    movl %edx, %ecx6280; X64-NOBMI-NEXT:    shll %cl, %eax6281; X64-NOBMI-NEXT:    shrl %cl, %eax6282; X64-NOBMI-NEXT:    # kill: def $eax killed $eax killed $rax6283; X64-NOBMI-NEXT:    retq6284;6285; X64-BMI1-LABEL: bextr64_32_c1:6286; X64-BMI1:       # %bb.0:6287; X64-BMI1-NEXT:    shll $8, %edx6288; X64-BMI1-NEXT:    movzbl %sil, %eax6289; X64-BMI1-NEXT:    orl %edx, %eax6290; X64-BMI1-NEXT:    bextrq %rax, %rdi, %rax6291; X64-BMI1-NEXT:    # kill: def $eax killed $eax killed $rax6292; X64-BMI1-NEXT:    retq6293;6294; X64-BMI2-LABEL: bextr64_32_c1:6295; X64-BMI2:       # %bb.0:6296; X64-BMI2-NEXT:    shrxq %rsi, %rdi, %rax6297; X64-BMI2-NEXT:    bzhil %edx, %eax, %eax6298; X64-BMI2-NEXT:    retq6299  %shifted = lshr i64 %val, %numskipbits6300  %truncshifted = trunc i64 %shifted to i326301  %numhighbits = sub i32 32, %numlowbits6302  %mask = lshr i32 -1, %numhighbits6303  %masked = and i32 %mask, %truncshifted6304  ret i32 %masked6305}6306 6307; Shifting happens in 64-bit. Mask is 32-bit, but extended to 64-bit.6308; Masking is 64-bit. Then truncation.6309define i32 @bextr64_32_c2(i64 %val, i64 %numskipbits, i32 %numlowbits) nounwind {6310; X86-NOBMI-LABEL: bextr64_32_c2:6311; X86-NOBMI:       # %bb.0:6312; X86-NOBMI-NEXT:    pushl %esi6313; X86-NOBMI-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx6314; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %edx6315; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %esi6316; X86-NOBMI-NEXT:    movl %esi, %eax6317; X86-NOBMI-NEXT:    shrl %cl, %eax6318; X86-NOBMI-NEXT:    shrdl %cl, %esi, %edx6319; X86-NOBMI-NEXT:    testb $32, %cl6320; X86-NOBMI-NEXT:    jne .LBB49_26321; X86-NOBMI-NEXT:  # %bb.1:6322; X86-NOBMI-NEXT:    movl %edx, %eax6323; X86-NOBMI-NEXT:  .LBB49_2:6324; X86-NOBMI-NEXT:    xorl %ecx, %ecx6325; X86-NOBMI-NEXT:    subb {{[0-9]+}}(%esp), %cl6326; X86-NOBMI-NEXT:    shll %cl, %eax6327; X86-NOBMI-NEXT:    # kill: def $cl killed $cl killed $ecx6328; X86-NOBMI-NEXT:    shrl %cl, %eax6329; X86-NOBMI-NEXT:    popl %esi6330; X86-NOBMI-NEXT:    retl6331;6332; X86-BMI1-LABEL: bextr64_32_c2:6333; X86-BMI1:       # %bb.0:6334; X86-BMI1-NEXT:    pushl %edi6335; X86-BMI1-NEXT:    pushl %esi6336; X86-BMI1-NEXT:    movzbl {{[0-9]+}}(%esp), %eax6337; X86-BMI1-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx6338; X86-BMI1-NEXT:    movl {{[0-9]+}}(%esp), %esi6339; X86-BMI1-NEXT:    movl {{[0-9]+}}(%esp), %edi6340; X86-BMI1-NEXT:    movl %edi, %edx6341; X86-BMI1-NEXT:    shrl %cl, %edx6342; X86-BMI1-NEXT:    shrdl %cl, %edi, %esi6343; X86-BMI1-NEXT:    testb $32, %cl6344; X86-BMI1-NEXT:    jne .LBB49_26345; X86-BMI1-NEXT:  # %bb.1:6346; X86-BMI1-NEXT:    movl %esi, %edx6347; X86-BMI1-NEXT:  .LBB49_2:6348; X86-BMI1-NEXT:    shll $8, %eax6349; X86-BMI1-NEXT:    bextrl %eax, %edx, %eax6350; X86-BMI1-NEXT:    popl %esi6351; X86-BMI1-NEXT:    popl %edi6352; X86-BMI1-NEXT:    retl6353;6354; X86-BMI2-LABEL: bextr64_32_c2:6355; X86-BMI2:       # %bb.0:6356; X86-BMI2-NEXT:    pushl %esi6357; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %eax6358; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx6359; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %edx6360; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %esi6361; X86-BMI2-NEXT:    shrdl %cl, %esi, %edx6362; X86-BMI2-NEXT:    testb $32, %cl6363; X86-BMI2-NEXT:    je .LBB49_26364; X86-BMI2-NEXT:  # %bb.1:6365; X86-BMI2-NEXT:    shrxl %ecx, %esi, %edx6366; X86-BMI2-NEXT:  .LBB49_2:6367; X86-BMI2-NEXT:    bzhil %eax, %edx, %eax6368; X86-BMI2-NEXT:    popl %esi6369; X86-BMI2-NEXT:    retl6370;6371; X64-NOBMI-LABEL: bextr64_32_c2:6372; X64-NOBMI:       # %bb.0:6373; X64-NOBMI-NEXT:    movq %rsi, %rcx6374; X64-NOBMI-NEXT:    movq %rdi, %rax6375; X64-NOBMI-NEXT:    # kill: def $cl killed $cl killed $rcx6376; X64-NOBMI-NEXT:    shrq %cl, %rax6377; X64-NOBMI-NEXT:    negb %dl6378; X64-NOBMI-NEXT:    movl %edx, %ecx6379; X64-NOBMI-NEXT:    shll %cl, %eax6380; X64-NOBMI-NEXT:    shrl %cl, %eax6381; X64-NOBMI-NEXT:    # kill: def $eax killed $eax killed $rax6382; X64-NOBMI-NEXT:    retq6383;6384; X64-BMI1-LABEL: bextr64_32_c2:6385; X64-BMI1:       # %bb.0:6386; X64-BMI1-NEXT:    shll $8, %edx6387; X64-BMI1-NEXT:    movzbl %sil, %eax6388; X64-BMI1-NEXT:    orl %edx, %eax6389; X64-BMI1-NEXT:    bextrq %rax, %rdi, %rax6390; X64-BMI1-NEXT:    # kill: def $eax killed $eax killed $rax6391; X64-BMI1-NEXT:    retq6392;6393; X64-BMI2-LABEL: bextr64_32_c2:6394; X64-BMI2:       # %bb.0:6395; X64-BMI2-NEXT:    shrxq %rsi, %rdi, %rax6396; X64-BMI2-NEXT:    bzhil %edx, %eax, %eax6397; X64-BMI2-NEXT:    retq6398  %shifted = lshr i64 %val, %numskipbits6399  %numhighbits = sub i32 32, %numlowbits6400  %mask = lshr i32 -1, %numhighbits6401  %zextmask = zext i32 %mask to i646402  %masked = and i64 %zextmask, %shifted6403  %truncmasked = trunc i64 %masked to i326404  ret i32 %truncmasked6405}6406 6407; Shifting happens in 64-bit. Mask is 32-bit, but calculated in 64-bit.6408; Masking is 64-bit. Then truncation.6409define i32 @bextr64_32_c3(i64 %val, i64 %numskipbits, i64 %numlowbits) nounwind {6410; X86-NOBMI-LABEL: bextr64_32_c3:6411; X86-NOBMI:       # %bb.0:6412; X86-NOBMI-NEXT:    pushl %esi6413; X86-NOBMI-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx6414; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %eax6415; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %esi6416; X86-NOBMI-NEXT:    movl %esi, %edx6417; X86-NOBMI-NEXT:    shrl %cl, %edx6418; X86-NOBMI-NEXT:    shrdl %cl, %esi, %eax6419; X86-NOBMI-NEXT:    testb $32, %cl6420; X86-NOBMI-NEXT:    jne .LBB50_26421; X86-NOBMI-NEXT:  # %bb.1:6422; X86-NOBMI-NEXT:    movl %eax, %edx6423; X86-NOBMI-NEXT:  .LBB50_2:6424; X86-NOBMI-NEXT:    movb $64, %cl6425; X86-NOBMI-NEXT:    subb {{[0-9]+}}(%esp), %cl6426; X86-NOBMI-NEXT:    xorl %eax, %eax6427; X86-NOBMI-NEXT:    movl $-1, %esi6428; X86-NOBMI-NEXT:    shrdl %cl, %eax, %esi6429; X86-NOBMI-NEXT:    testb $32, %cl6430; X86-NOBMI-NEXT:    jne .LBB50_46431; X86-NOBMI-NEXT:  # %bb.3:6432; X86-NOBMI-NEXT:    movl %esi, %eax6433; X86-NOBMI-NEXT:  .LBB50_4:6434; X86-NOBMI-NEXT:    andl %edx, %eax6435; X86-NOBMI-NEXT:    popl %esi6436; X86-NOBMI-NEXT:    retl6437;6438; X86-BMI1-LABEL: bextr64_32_c3:6439; X86-BMI1:       # %bb.0:6440; X86-BMI1-NEXT:    pushl %esi6441; X86-BMI1-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx6442; X86-BMI1-NEXT:    movl {{[0-9]+}}(%esp), %eax6443; X86-BMI1-NEXT:    movl {{[0-9]+}}(%esp), %esi6444; X86-BMI1-NEXT:    movl %esi, %edx6445; X86-BMI1-NEXT:    shrl %cl, %edx6446; X86-BMI1-NEXT:    shrdl %cl, %esi, %eax6447; X86-BMI1-NEXT:    testb $32, %cl6448; X86-BMI1-NEXT:    jne .LBB50_26449; X86-BMI1-NEXT:  # %bb.1:6450; X86-BMI1-NEXT:    movl %eax, %edx6451; X86-BMI1-NEXT:  .LBB50_2:6452; X86-BMI1-NEXT:    movb $64, %cl6453; X86-BMI1-NEXT:    subb {{[0-9]+}}(%esp), %cl6454; X86-BMI1-NEXT:    xorl %eax, %eax6455; X86-BMI1-NEXT:    movl $-1, %esi6456; X86-BMI1-NEXT:    shrdl %cl, %eax, %esi6457; X86-BMI1-NEXT:    testb $32, %cl6458; X86-BMI1-NEXT:    jne .LBB50_46459; X86-BMI1-NEXT:  # %bb.3:6460; X86-BMI1-NEXT:    movl %esi, %eax6461; X86-BMI1-NEXT:  .LBB50_4:6462; X86-BMI1-NEXT:    andl %edx, %eax6463; X86-BMI1-NEXT:    popl %esi6464; X86-BMI1-NEXT:    retl6465;6466; X86-BMI2-LABEL: bextr64_32_c3:6467; X86-BMI2:       # %bb.0:6468; X86-BMI2-NEXT:    pushl %esi6469; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx6470; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %edx6471; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %eax6472; X86-BMI2-NEXT:    shrdl %cl, %eax, %edx6473; X86-BMI2-NEXT:    testb $32, %cl6474; X86-BMI2-NEXT:    je .LBB50_26475; X86-BMI2-NEXT:  # %bb.1:6476; X86-BMI2-NEXT:    shrxl %ecx, %eax, %edx6477; X86-BMI2-NEXT:  .LBB50_2:6478; X86-BMI2-NEXT:    movb $64, %cl6479; X86-BMI2-NEXT:    subb {{[0-9]+}}(%esp), %cl6480; X86-BMI2-NEXT:    xorl %eax, %eax6481; X86-BMI2-NEXT:    movl $-1, %esi6482; X86-BMI2-NEXT:    shrdl %cl, %eax, %esi6483; X86-BMI2-NEXT:    testb $32, %cl6484; X86-BMI2-NEXT:    jne .LBB50_46485; X86-BMI2-NEXT:  # %bb.3:6486; X86-BMI2-NEXT:    movl %esi, %eax6487; X86-BMI2-NEXT:  .LBB50_4:6488; X86-BMI2-NEXT:    andl %edx, %eax6489; X86-BMI2-NEXT:    popl %esi6490; X86-BMI2-NEXT:    retl6491;6492; X64-NOBMI-LABEL: bextr64_32_c3:6493; X64-NOBMI:       # %bb.0:6494; X64-NOBMI-NEXT:    movq %rsi, %rcx6495; X64-NOBMI-NEXT:    # kill: def $cl killed $cl killed $rcx6496; X64-NOBMI-NEXT:    shrq %cl, %rdi6497; X64-NOBMI-NEXT:    negb %dl6498; X64-NOBMI-NEXT:    movl $4294967295, %eax # imm = 0xFFFFFFFF6499; X64-NOBMI-NEXT:    movl %edx, %ecx6500; X64-NOBMI-NEXT:    shrq %cl, %rax6501; X64-NOBMI-NEXT:    andl %edi, %eax6502; X64-NOBMI-NEXT:    # kill: def $eax killed $eax killed $rax6503; X64-NOBMI-NEXT:    retq6504;6505; X64-BMI1-LABEL: bextr64_32_c3:6506; X64-BMI1:       # %bb.0:6507; X64-BMI1-NEXT:    movq %rsi, %rcx6508; X64-BMI1-NEXT:    # kill: def $cl killed $cl killed $rcx6509; X64-BMI1-NEXT:    shrq %cl, %rdi6510; X64-BMI1-NEXT:    negb %dl6511; X64-BMI1-NEXT:    movl $4294967295, %eax # imm = 0xFFFFFFFF6512; X64-BMI1-NEXT:    movl %edx, %ecx6513; X64-BMI1-NEXT:    shrq %cl, %rax6514; X64-BMI1-NEXT:    andl %edi, %eax6515; X64-BMI1-NEXT:    # kill: def $eax killed $eax killed $rax6516; X64-BMI1-NEXT:    retq6517;6518; X64-BMI2-LABEL: bextr64_32_c3:6519; X64-BMI2:       # %bb.0:6520; X64-BMI2-NEXT:    shrxq %rsi, %rdi, %rcx6521; X64-BMI2-NEXT:    negb %dl6522; X64-BMI2-NEXT:    movl $4294967295, %eax # imm = 0xFFFFFFFF6523; X64-BMI2-NEXT:    shrxq %rdx, %rax, %rax6524; X64-BMI2-NEXT:    andl %ecx, %eax6525; X64-BMI2-NEXT:    # kill: def $eax killed $eax killed $rax6526; X64-BMI2-NEXT:    retq6527  %shifted = lshr i64 %val, %numskipbits6528  %numhighbits = sub i64 64, %numlowbits6529  %mask = lshr i64 4294967295, %numhighbits6530  %masked = and i64 %mask, %shifted6531  %truncmasked = trunc i64 %masked to i326532  ret i32 %truncmasked6533}6534 6535; ---------------------------------------------------------------------------- ;6536; Pattern d. 32-bit.6537; ---------------------------------------------------------------------------- ;6538 6539define i32 @bextr32_d0(i32 %val, i32 %numskipbits, i32 %numlowbits) nounwind {6540; X86-NOBMI-LABEL: bextr32_d0:6541; X86-NOBMI:       # %bb.0:6542; X86-NOBMI-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx6543; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %eax6544; X86-NOBMI-NEXT:    shrl %cl, %eax6545; X86-NOBMI-NEXT:    xorl %ecx, %ecx6546; X86-NOBMI-NEXT:    subb {{[0-9]+}}(%esp), %cl6547; X86-NOBMI-NEXT:    shll %cl, %eax6548; X86-NOBMI-NEXT:    # kill: def $cl killed $cl killed $ecx6549; X86-NOBMI-NEXT:    shrl %cl, %eax6550; X86-NOBMI-NEXT:    retl6551;6552; X86-BMI1-LABEL: bextr32_d0:6553; X86-BMI1:       # %bb.0:6554; X86-BMI1-NEXT:    movzbl {{[0-9]+}}(%esp), %eax6555; X86-BMI1-NEXT:    shll $8, %eax6556; X86-BMI1-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx6557; X86-BMI1-NEXT:    orl %eax, %ecx6558; X86-BMI1-NEXT:    bextrl %ecx, {{[0-9]+}}(%esp), %eax6559; X86-BMI1-NEXT:    retl6560;6561; X86-BMI2-LABEL: bextr32_d0:6562; X86-BMI2:       # %bb.0:6563; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %eax6564; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx6565; X86-BMI2-NEXT:    shrxl %ecx, {{[0-9]+}}(%esp), %ecx6566; X86-BMI2-NEXT:    bzhil %eax, %ecx, %eax6567; X86-BMI2-NEXT:    retl6568;6569; X64-NOBMI-LABEL: bextr32_d0:6570; X64-NOBMI:       # %bb.0:6571; X64-NOBMI-NEXT:    movl %esi, %ecx6572; X64-NOBMI-NEXT:    movl %edi, %eax6573; X64-NOBMI-NEXT:    # kill: def $cl killed $cl killed $ecx6574; X64-NOBMI-NEXT:    shrl %cl, %eax6575; X64-NOBMI-NEXT:    negb %dl6576; X64-NOBMI-NEXT:    movl %edx, %ecx6577; X64-NOBMI-NEXT:    shll %cl, %eax6578; X64-NOBMI-NEXT:    shrl %cl, %eax6579; X64-NOBMI-NEXT:    retq6580;6581; X64-BMI1-LABEL: bextr32_d0:6582; X64-BMI1:       # %bb.0:6583; X64-BMI1-NEXT:    shll $8, %edx6584; X64-BMI1-NEXT:    movzbl %sil, %eax6585; X64-BMI1-NEXT:    orl %edx, %eax6586; X64-BMI1-NEXT:    bextrl %eax, %edi, %eax6587; X64-BMI1-NEXT:    retq6588;6589; X64-BMI2-LABEL: bextr32_d0:6590; X64-BMI2:       # %bb.0:6591; X64-BMI2-NEXT:    shrxl %esi, %edi, %eax6592; X64-BMI2-NEXT:    bzhil %edx, %eax, %eax6593; X64-BMI2-NEXT:    retq6594  %shifted = lshr i32 %val, %numskipbits6595  %numhighbits = sub i32 32, %numlowbits6596  %highbitscleared = shl i32 %shifted, %numhighbits6597  %masked = lshr i32 %highbitscleared, %numhighbits6598  ret i32 %masked6599}6600 6601define i32 @bextr32_d1_indexzext(i32 %val, i8 %numskipbits, i8 %numlowbits) nounwind {6602; X86-NOBMI-LABEL: bextr32_d1_indexzext:6603; X86-NOBMI:       # %bb.0:6604; X86-NOBMI-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx6605; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %eax6606; X86-NOBMI-NEXT:    shrl %cl, %eax6607; X86-NOBMI-NEXT:    xorl %ecx, %ecx6608; X86-NOBMI-NEXT:    subb {{[0-9]+}}(%esp), %cl6609; X86-NOBMI-NEXT:    shll %cl, %eax6610; X86-NOBMI-NEXT:    # kill: def $cl killed $cl killed $ecx6611; X86-NOBMI-NEXT:    shrl %cl, %eax6612; X86-NOBMI-NEXT:    retl6613;6614; X86-BMI1-LABEL: bextr32_d1_indexzext:6615; X86-BMI1:       # %bb.0:6616; X86-BMI1-NEXT:    movzbl {{[0-9]+}}(%esp), %eax6617; X86-BMI1-NEXT:    shll $8, %eax6618; X86-BMI1-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx6619; X86-BMI1-NEXT:    orl %eax, %ecx6620; X86-BMI1-NEXT:    bextrl %ecx, {{[0-9]+}}(%esp), %eax6621; X86-BMI1-NEXT:    retl6622;6623; X86-BMI2-LABEL: bextr32_d1_indexzext:6624; X86-BMI2:       # %bb.0:6625; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %eax6626; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx6627; X86-BMI2-NEXT:    shrxl %ecx, {{[0-9]+}}(%esp), %ecx6628; X86-BMI2-NEXT:    bzhil %eax, %ecx, %eax6629; X86-BMI2-NEXT:    retl6630;6631; X64-NOBMI-LABEL: bextr32_d1_indexzext:6632; X64-NOBMI:       # %bb.0:6633; X64-NOBMI-NEXT:    movl %esi, %ecx6634; X64-NOBMI-NEXT:    movl %edi, %eax6635; X64-NOBMI-NEXT:    # kill: def $cl killed $cl killed $ecx6636; X64-NOBMI-NEXT:    shrl %cl, %eax6637; X64-NOBMI-NEXT:    negb %dl6638; X64-NOBMI-NEXT:    movl %edx, %ecx6639; X64-NOBMI-NEXT:    shll %cl, %eax6640; X64-NOBMI-NEXT:    shrl %cl, %eax6641; X64-NOBMI-NEXT:    retq6642;6643; X64-BMI1-LABEL: bextr32_d1_indexzext:6644; X64-BMI1:       # %bb.0:6645; X64-BMI1-NEXT:    shll $8, %edx6646; X64-BMI1-NEXT:    movzbl %sil, %eax6647; X64-BMI1-NEXT:    orl %edx, %eax6648; X64-BMI1-NEXT:    bextrl %eax, %edi, %eax6649; X64-BMI1-NEXT:    retq6650;6651; X64-BMI2-LABEL: bextr32_d1_indexzext:6652; X64-BMI2:       # %bb.0:6653; X64-BMI2-NEXT:    shrxl %esi, %edi, %eax6654; X64-BMI2-NEXT:    bzhil %edx, %eax, %eax6655; X64-BMI2-NEXT:    retq6656  %skip = zext i8 %numskipbits to i326657  %shifted = lshr i32 %val, %skip6658  %numhighbits = sub i8 32, %numlowbits6659  %sh_prom = zext i8 %numhighbits to i326660  %highbitscleared = shl i32 %shifted, %sh_prom6661  %masked = lshr i32 %highbitscleared, %sh_prom6662  ret i32 %masked6663}6664 6665define i32 @bextr32_d2_load(ptr %w, i32 %numskipbits, i32 %numlowbits) nounwind {6666; X86-NOBMI-LABEL: bextr32_d2_load:6667; X86-NOBMI:       # %bb.0:6668; X86-NOBMI-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx6669; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %eax6670; X86-NOBMI-NEXT:    movl (%eax), %eax6671; X86-NOBMI-NEXT:    shrl %cl, %eax6672; X86-NOBMI-NEXT:    xorl %ecx, %ecx6673; X86-NOBMI-NEXT:    subb {{[0-9]+}}(%esp), %cl6674; X86-NOBMI-NEXT:    shll %cl, %eax6675; X86-NOBMI-NEXT:    # kill: def $cl killed $cl killed $ecx6676; X86-NOBMI-NEXT:    shrl %cl, %eax6677; X86-NOBMI-NEXT:    retl6678;6679; X86-BMI1-LABEL: bextr32_d2_load:6680; X86-BMI1:       # %bb.0:6681; X86-BMI1-NEXT:    movl {{[0-9]+}}(%esp), %eax6682; X86-BMI1-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx6683; X86-BMI1-NEXT:    shll $8, %ecx6684; X86-BMI1-NEXT:    movzbl {{[0-9]+}}(%esp), %edx6685; X86-BMI1-NEXT:    orl %ecx, %edx6686; X86-BMI1-NEXT:    bextrl %edx, (%eax), %eax6687; X86-BMI1-NEXT:    retl6688;6689; X86-BMI2-LABEL: bextr32_d2_load:6690; X86-BMI2:       # %bb.0:6691; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %eax6692; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %ecx6693; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %edx6694; X86-BMI2-NEXT:    shrxl %edx, (%ecx), %ecx6695; X86-BMI2-NEXT:    bzhil %eax, %ecx, %eax6696; X86-BMI2-NEXT:    retl6697;6698; X64-NOBMI-LABEL: bextr32_d2_load:6699; X64-NOBMI:       # %bb.0:6700; X64-NOBMI-NEXT:    movl %esi, %ecx6701; X64-NOBMI-NEXT:    movl (%rdi), %eax6702; X64-NOBMI-NEXT:    # kill: def $cl killed $cl killed $ecx6703; X64-NOBMI-NEXT:    shrl %cl, %eax6704; X64-NOBMI-NEXT:    negb %dl6705; X64-NOBMI-NEXT:    movl %edx, %ecx6706; X64-NOBMI-NEXT:    shll %cl, %eax6707; X64-NOBMI-NEXT:    shrl %cl, %eax6708; X64-NOBMI-NEXT:    retq6709;6710; X64-BMI1-LABEL: bextr32_d2_load:6711; X64-BMI1:       # %bb.0:6712; X64-BMI1-NEXT:    shll $8, %edx6713; X64-BMI1-NEXT:    movzbl %sil, %eax6714; X64-BMI1-NEXT:    orl %edx, %eax6715; X64-BMI1-NEXT:    bextrl %eax, (%rdi), %eax6716; X64-BMI1-NEXT:    retq6717;6718; X64-BMI2-LABEL: bextr32_d2_load:6719; X64-BMI2:       # %bb.0:6720; X64-BMI2-NEXT:    shrxl %esi, (%rdi), %eax6721; X64-BMI2-NEXT:    bzhil %edx, %eax, %eax6722; X64-BMI2-NEXT:    retq6723  %val = load i32, ptr %w6724  %shifted = lshr i32 %val, %numskipbits6725  %numhighbits = sub i32 32, %numlowbits6726  %highbitscleared = shl i32 %shifted, %numhighbits6727  %masked = lshr i32 %highbitscleared, %numhighbits6728  ret i32 %masked6729}6730 6731define i32 @bextr32_d3_load_indexzext(ptr %w, i8 %numskipbits, i8 %numlowbits) nounwind {6732; X86-NOBMI-LABEL: bextr32_d3_load_indexzext:6733; X86-NOBMI:       # %bb.0:6734; X86-NOBMI-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx6735; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %eax6736; X86-NOBMI-NEXT:    movl (%eax), %eax6737; X86-NOBMI-NEXT:    shrl %cl, %eax6738; X86-NOBMI-NEXT:    xorl %ecx, %ecx6739; X86-NOBMI-NEXT:    subb {{[0-9]+}}(%esp), %cl6740; X86-NOBMI-NEXT:    shll %cl, %eax6741; X86-NOBMI-NEXT:    # kill: def $cl killed $cl killed $ecx6742; X86-NOBMI-NEXT:    shrl %cl, %eax6743; X86-NOBMI-NEXT:    retl6744;6745; X86-BMI1-LABEL: bextr32_d3_load_indexzext:6746; X86-BMI1:       # %bb.0:6747; X86-BMI1-NEXT:    movl {{[0-9]+}}(%esp), %eax6748; X86-BMI1-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx6749; X86-BMI1-NEXT:    shll $8, %ecx6750; X86-BMI1-NEXT:    movzbl {{[0-9]+}}(%esp), %edx6751; X86-BMI1-NEXT:    orl %ecx, %edx6752; X86-BMI1-NEXT:    bextrl %edx, (%eax), %eax6753; X86-BMI1-NEXT:    retl6754;6755; X86-BMI2-LABEL: bextr32_d3_load_indexzext:6756; X86-BMI2:       # %bb.0:6757; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %eax6758; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %ecx6759; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %edx6760; X86-BMI2-NEXT:    shrxl %edx, (%ecx), %ecx6761; X86-BMI2-NEXT:    bzhil %eax, %ecx, %eax6762; X86-BMI2-NEXT:    retl6763;6764; X64-NOBMI-LABEL: bextr32_d3_load_indexzext:6765; X64-NOBMI:       # %bb.0:6766; X64-NOBMI-NEXT:    movl %esi, %ecx6767; X64-NOBMI-NEXT:    movl (%rdi), %eax6768; X64-NOBMI-NEXT:    # kill: def $cl killed $cl killed $ecx6769; X64-NOBMI-NEXT:    shrl %cl, %eax6770; X64-NOBMI-NEXT:    negb %dl6771; X64-NOBMI-NEXT:    movl %edx, %ecx6772; X64-NOBMI-NEXT:    shll %cl, %eax6773; X64-NOBMI-NEXT:    shrl %cl, %eax6774; X64-NOBMI-NEXT:    retq6775;6776; X64-BMI1-LABEL: bextr32_d3_load_indexzext:6777; X64-BMI1:       # %bb.0:6778; X64-BMI1-NEXT:    shll $8, %edx6779; X64-BMI1-NEXT:    movzbl %sil, %eax6780; X64-BMI1-NEXT:    orl %edx, %eax6781; X64-BMI1-NEXT:    bextrl %eax, (%rdi), %eax6782; X64-BMI1-NEXT:    retq6783;6784; X64-BMI2-LABEL: bextr32_d3_load_indexzext:6785; X64-BMI2:       # %bb.0:6786; X64-BMI2-NEXT:    shrxl %esi, (%rdi), %eax6787; X64-BMI2-NEXT:    bzhil %edx, %eax, %eax6788; X64-BMI2-NEXT:    retq6789  %val = load i32, ptr %w6790  %skip = zext i8 %numskipbits to i326791  %shifted = lshr i32 %val, %skip6792  %numhighbits = sub i8 32, %numlowbits6793  %sh_prom = zext i8 %numhighbits to i326794  %highbitscleared = shl i32 %shifted, %sh_prom6795  %masked = lshr i32 %highbitscleared, %sh_prom6796  ret i32 %masked6797}6798 6799define i32 @bextr32_d5_skipextrauses(i32 %val, i32 %numskipbits, i32 %numlowbits) nounwind {6800; X86-NOBMI-LABEL: bextr32_d5_skipextrauses:6801; X86-NOBMI:       # %bb.0:6802; X86-NOBMI-NEXT:    pushl %esi6803; X86-NOBMI-NEXT:    subl $8, %esp6804; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %esi6805; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %eax6806; X86-NOBMI-NEXT:    movl %eax, %ecx6807; X86-NOBMI-NEXT:    shrl %cl, %esi6808; X86-NOBMI-NEXT:    xorl %ecx, %ecx6809; X86-NOBMI-NEXT:    subb {{[0-9]+}}(%esp), %cl6810; X86-NOBMI-NEXT:    shll %cl, %esi6811; X86-NOBMI-NEXT:    # kill: def $cl killed $cl killed $ecx6812; X86-NOBMI-NEXT:    shrl %cl, %esi6813; X86-NOBMI-NEXT:    movl %eax, (%esp)6814; X86-NOBMI-NEXT:    calll use32@PLT6815; X86-NOBMI-NEXT:    movl %esi, %eax6816; X86-NOBMI-NEXT:    addl $8, %esp6817; X86-NOBMI-NEXT:    popl %esi6818; X86-NOBMI-NEXT:    retl6819;6820; X86-BMI1-LABEL: bextr32_d5_skipextrauses:6821; X86-BMI1:       # %bb.0:6822; X86-BMI1-NEXT:    pushl %esi6823; X86-BMI1-NEXT:    subl $8, %esp6824; X86-BMI1-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx6825; X86-BMI1-NEXT:    movl {{[0-9]+}}(%esp), %eax6826; X86-BMI1-NEXT:    shll $8, %ecx6827; X86-BMI1-NEXT:    movzbl %al, %edx6828; X86-BMI1-NEXT:    orl %ecx, %edx6829; X86-BMI1-NEXT:    bextrl %edx, {{[0-9]+}}(%esp), %esi6830; X86-BMI1-NEXT:    movl %eax, (%esp)6831; X86-BMI1-NEXT:    calll use32@PLT6832; X86-BMI1-NEXT:    movl %esi, %eax6833; X86-BMI1-NEXT:    addl $8, %esp6834; X86-BMI1-NEXT:    popl %esi6835; X86-BMI1-NEXT:    retl6836;6837; X86-BMI2-LABEL: bextr32_d5_skipextrauses:6838; X86-BMI2:       # %bb.0:6839; X86-BMI2-NEXT:    pushl %esi6840; X86-BMI2-NEXT:    subl $8, %esp6841; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %eax6842; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %ecx6843; X86-BMI2-NEXT:    shrxl %ecx, {{[0-9]+}}(%esp), %edx6844; X86-BMI2-NEXT:    bzhil %eax, %edx, %esi6845; X86-BMI2-NEXT:    movl %ecx, (%esp)6846; X86-BMI2-NEXT:    calll use32@PLT6847; X86-BMI2-NEXT:    movl %esi, %eax6848; X86-BMI2-NEXT:    addl $8, %esp6849; X86-BMI2-NEXT:    popl %esi6850; X86-BMI2-NEXT:    retl6851;6852; X64-NOBMI-LABEL: bextr32_d5_skipextrauses:6853; X64-NOBMI:       # %bb.0:6854; X64-NOBMI-NEXT:    pushq %rbx6855; X64-NOBMI-NEXT:    movl %edi, %ebx6856; X64-NOBMI-NEXT:    movl %esi, %ecx6857; X64-NOBMI-NEXT:    shrl %cl, %ebx6858; X64-NOBMI-NEXT:    negb %dl6859; X64-NOBMI-NEXT:    movl %edx, %ecx6860; X64-NOBMI-NEXT:    shll %cl, %ebx6861; X64-NOBMI-NEXT:    shrl %cl, %ebx6862; X64-NOBMI-NEXT:    movl %esi, %edi6863; X64-NOBMI-NEXT:    callq use32@PLT6864; X64-NOBMI-NEXT:    movl %ebx, %eax6865; X64-NOBMI-NEXT:    popq %rbx6866; X64-NOBMI-NEXT:    retq6867;6868; X64-BMI1-LABEL: bextr32_d5_skipextrauses:6869; X64-BMI1:       # %bb.0:6870; X64-BMI1-NEXT:    pushq %rbx6871; X64-BMI1-NEXT:    shll $8, %edx6872; X64-BMI1-NEXT:    movzbl %sil, %eax6873; X64-BMI1-NEXT:    orl %edx, %eax6874; X64-BMI1-NEXT:    bextrl %eax, %edi, %ebx6875; X64-BMI1-NEXT:    movl %esi, %edi6876; X64-BMI1-NEXT:    callq use32@PLT6877; X64-BMI1-NEXT:    movl %ebx, %eax6878; X64-BMI1-NEXT:    popq %rbx6879; X64-BMI1-NEXT:    retq6880;6881; X64-BMI2-LABEL: bextr32_d5_skipextrauses:6882; X64-BMI2:       # %bb.0:6883; X64-BMI2-NEXT:    pushq %rbx6884; X64-BMI2-NEXT:    shrxl %esi, %edi, %eax6885; X64-BMI2-NEXT:    bzhil %edx, %eax, %ebx6886; X64-BMI2-NEXT:    movl %esi, %edi6887; X64-BMI2-NEXT:    callq use32@PLT6888; X64-BMI2-NEXT:    movl %ebx, %eax6889; X64-BMI2-NEXT:    popq %rbx6890; X64-BMI2-NEXT:    retq6891  %shifted = lshr i32 %val, %numskipbits6892  %numhighbits = sub i32 32, %numlowbits6893  %highbitscleared = shl i32 %shifted, %numhighbits6894  %masked = lshr i32 %highbitscleared, %numhighbits6895  call void @use32(i32 %numskipbits)6896  ret i32 %masked6897}6898 6899; 64-bit.6900 6901define i64 @bextr64_d0(i64 %val, i64 %numskipbits, i64 %numlowbits) nounwind {6902; X86-NOBMI-LABEL: bextr64_d0:6903; X86-NOBMI:       # %bb.0:6904; X86-NOBMI-NEXT:    pushl %ebx6905; X86-NOBMI-NEXT:    pushl %edi6906; X86-NOBMI-NEXT:    pushl %esi6907; X86-NOBMI-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx6908; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %edi6909; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %edx6910; X86-NOBMI-NEXT:    movl %edx, %eax6911; X86-NOBMI-NEXT:    shrl %cl, %eax6912; X86-NOBMI-NEXT:    shrdl %cl, %edx, %edi6913; X86-NOBMI-NEXT:    xorl %esi, %esi6914; X86-NOBMI-NEXT:    testb $32, %cl6915; X86-NOBMI-NEXT:    je .LBB56_26916; X86-NOBMI-NEXT:  # %bb.1:6917; X86-NOBMI-NEXT:    movl %eax, %edi6918; X86-NOBMI-NEXT:    xorl %eax, %eax6919; X86-NOBMI-NEXT:  .LBB56_2:6920; X86-NOBMI-NEXT:    movb $64, %cl6921; X86-NOBMI-NEXT:    subb {{[0-9]+}}(%esp), %cl6922; X86-NOBMI-NEXT:    shldl %cl, %edi, %eax6923; X86-NOBMI-NEXT:    shll %cl, %edi6924; X86-NOBMI-NEXT:    testb $32, %cl6925; X86-NOBMI-NEXT:    movl %edi, %ebx6926; X86-NOBMI-NEXT:    jne .LBB56_46927; X86-NOBMI-NEXT:  # %bb.3:6928; X86-NOBMI-NEXT:    movl %eax, %ebx6929; X86-NOBMI-NEXT:  .LBB56_4:6930; X86-NOBMI-NEXT:    movl %ebx, %eax6931; X86-NOBMI-NEXT:    shrl %cl, %eax6932; X86-NOBMI-NEXT:    testb $32, %cl6933; X86-NOBMI-NEXT:    movl $0, %edx6934; X86-NOBMI-NEXT:    jne .LBB56_66935; X86-NOBMI-NEXT:  # %bb.5:6936; X86-NOBMI-NEXT:    movl %edi, %esi6937; X86-NOBMI-NEXT:    movl %eax, %edx6938; X86-NOBMI-NEXT:  .LBB56_6:6939; X86-NOBMI-NEXT:    shrdl %cl, %ebx, %esi6940; X86-NOBMI-NEXT:    testb $32, %cl6941; X86-NOBMI-NEXT:    jne .LBB56_86942; X86-NOBMI-NEXT:  # %bb.7:6943; X86-NOBMI-NEXT:    movl %esi, %eax6944; X86-NOBMI-NEXT:  .LBB56_8:6945; X86-NOBMI-NEXT:    popl %esi6946; X86-NOBMI-NEXT:    popl %edi6947; X86-NOBMI-NEXT:    popl %ebx6948; X86-NOBMI-NEXT:    retl6949;6950; X86-BMI1-LABEL: bextr64_d0:6951; X86-BMI1:       # %bb.0:6952; X86-BMI1-NEXT:    pushl %ebx6953; X86-BMI1-NEXT:    pushl %edi6954; X86-BMI1-NEXT:    pushl %esi6955; X86-BMI1-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx6956; X86-BMI1-NEXT:    movl {{[0-9]+}}(%esp), %edi6957; X86-BMI1-NEXT:    movl {{[0-9]+}}(%esp), %edx6958; X86-BMI1-NEXT:    movl %edx, %eax6959; X86-BMI1-NEXT:    shrl %cl, %eax6960; X86-BMI1-NEXT:    shrdl %cl, %edx, %edi6961; X86-BMI1-NEXT:    xorl %esi, %esi6962; X86-BMI1-NEXT:    testb $32, %cl6963; X86-BMI1-NEXT:    je .LBB56_26964; X86-BMI1-NEXT:  # %bb.1:6965; X86-BMI1-NEXT:    movl %eax, %edi6966; X86-BMI1-NEXT:    xorl %eax, %eax6967; X86-BMI1-NEXT:  .LBB56_2:6968; X86-BMI1-NEXT:    movb $64, %cl6969; X86-BMI1-NEXT:    subb {{[0-9]+}}(%esp), %cl6970; X86-BMI1-NEXT:    shldl %cl, %edi, %eax6971; X86-BMI1-NEXT:    shll %cl, %edi6972; X86-BMI1-NEXT:    testb $32, %cl6973; X86-BMI1-NEXT:    movl %edi, %ebx6974; X86-BMI1-NEXT:    jne .LBB56_46975; X86-BMI1-NEXT:  # %bb.3:6976; X86-BMI1-NEXT:    movl %eax, %ebx6977; X86-BMI1-NEXT:  .LBB56_4:6978; X86-BMI1-NEXT:    movl %ebx, %eax6979; X86-BMI1-NEXT:    shrl %cl, %eax6980; X86-BMI1-NEXT:    testb $32, %cl6981; X86-BMI1-NEXT:    movl $0, %edx6982; X86-BMI1-NEXT:    jne .LBB56_66983; X86-BMI1-NEXT:  # %bb.5:6984; X86-BMI1-NEXT:    movl %edi, %esi6985; X86-BMI1-NEXT:    movl %eax, %edx6986; X86-BMI1-NEXT:  .LBB56_6:6987; X86-BMI1-NEXT:    shrdl %cl, %ebx, %esi6988; X86-BMI1-NEXT:    testb $32, %cl6989; X86-BMI1-NEXT:    jne .LBB56_86990; X86-BMI1-NEXT:  # %bb.7:6991; X86-BMI1-NEXT:    movl %esi, %eax6992; X86-BMI1-NEXT:  .LBB56_8:6993; X86-BMI1-NEXT:    popl %esi6994; X86-BMI1-NEXT:    popl %edi6995; X86-BMI1-NEXT:    popl %ebx6996; X86-BMI1-NEXT:    retl6997;6998; X86-BMI2-LABEL: bextr64_d0:6999; X86-BMI2:       # %bb.0:7000; X86-BMI2-NEXT:    pushl %edi7001; X86-BMI2-NEXT:    pushl %esi7002; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx7003; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %eax7004; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %edx7005; X86-BMI2-NEXT:    shrdl %cl, %edx, %eax7006; X86-BMI2-NEXT:    shrxl %ecx, %edx, %esi7007; X86-BMI2-NEXT:    xorl %edx, %edx7008; X86-BMI2-NEXT:    testb $32, %cl7009; X86-BMI2-NEXT:    je .LBB56_27010; X86-BMI2-NEXT:  # %bb.1:7011; X86-BMI2-NEXT:    movl %esi, %eax7012; X86-BMI2-NEXT:    xorl %esi, %esi7013; X86-BMI2-NEXT:  .LBB56_2:7014; X86-BMI2-NEXT:    movb $64, %cl7015; X86-BMI2-NEXT:    subb {{[0-9]+}}(%esp), %cl7016; X86-BMI2-NEXT:    shldl %cl, %eax, %esi7017; X86-BMI2-NEXT:    shlxl %ecx, %eax, %edi7018; X86-BMI2-NEXT:    testb $32, %cl7019; X86-BMI2-NEXT:    je .LBB56_47020; X86-BMI2-NEXT:  # %bb.3:7021; X86-BMI2-NEXT:    movl %edi, %esi7022; X86-BMI2-NEXT:    movl $0, %edi7023; X86-BMI2-NEXT:  .LBB56_4:7024; X86-BMI2-NEXT:    shrxl %ecx, %esi, %eax7025; X86-BMI2-NEXT:    jne .LBB56_67026; X86-BMI2-NEXT:  # %bb.5:7027; X86-BMI2-NEXT:    movl %eax, %edx7028; X86-BMI2-NEXT:  .LBB56_6:7029; X86-BMI2-NEXT:    shrdl %cl, %esi, %edi7030; X86-BMI2-NEXT:    testb $32, %cl7031; X86-BMI2-NEXT:    jne .LBB56_87032; X86-BMI2-NEXT:  # %bb.7:7033; X86-BMI2-NEXT:    movl %edi, %eax7034; X86-BMI2-NEXT:  .LBB56_8:7035; X86-BMI2-NEXT:    popl %esi7036; X86-BMI2-NEXT:    popl %edi7037; X86-BMI2-NEXT:    retl7038;7039; X64-NOBMI-LABEL: bextr64_d0:7040; X64-NOBMI:       # %bb.0:7041; X64-NOBMI-NEXT:    movq %rsi, %rcx7042; X64-NOBMI-NEXT:    movq %rdi, %rax7043; X64-NOBMI-NEXT:    # kill: def $cl killed $cl killed $rcx7044; X64-NOBMI-NEXT:    shrq %cl, %rax7045; X64-NOBMI-NEXT:    negb %dl7046; X64-NOBMI-NEXT:    movl %edx, %ecx7047; X64-NOBMI-NEXT:    shlq %cl, %rax7048; X64-NOBMI-NEXT:    shrq %cl, %rax7049; X64-NOBMI-NEXT:    retq7050;7051; X64-BMI1-LABEL: bextr64_d0:7052; X64-BMI1:       # %bb.0:7053; X64-BMI1-NEXT:    shll $8, %edx7054; X64-BMI1-NEXT:    movzbl %sil, %eax7055; X64-BMI1-NEXT:    orl %edx, %eax7056; X64-BMI1-NEXT:    bextrq %rax, %rdi, %rax7057; X64-BMI1-NEXT:    retq7058;7059; X64-BMI2-LABEL: bextr64_d0:7060; X64-BMI2:       # %bb.0:7061; X64-BMI2-NEXT:    shrxq %rsi, %rdi, %rax7062; X64-BMI2-NEXT:    bzhiq %rdx, %rax, %rax7063; X64-BMI2-NEXT:    retq7064  %shifted = lshr i64 %val, %numskipbits7065  %numhighbits = sub i64 64, %numlowbits7066  %highbitscleared = shl i64 %shifted, %numhighbits7067  %masked = lshr i64 %highbitscleared, %numhighbits7068  ret i64 %masked7069}7070 7071define i64 @bextr64_d1_indexzext(i64 %val, i8 %numskipbits, i8 %numlowbits) nounwind {7072; X86-NOBMI-LABEL: bextr64_d1_indexzext:7073; X86-NOBMI:       # %bb.0:7074; X86-NOBMI-NEXT:    pushl %ebx7075; X86-NOBMI-NEXT:    pushl %edi7076; X86-NOBMI-NEXT:    pushl %esi7077; X86-NOBMI-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx7078; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %edi7079; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %edx7080; X86-NOBMI-NEXT:    movl %edx, %eax7081; X86-NOBMI-NEXT:    shrl %cl, %eax7082; X86-NOBMI-NEXT:    shrdl %cl, %edx, %edi7083; X86-NOBMI-NEXT:    xorl %esi, %esi7084; X86-NOBMI-NEXT:    testb $32, %cl7085; X86-NOBMI-NEXT:    je .LBB57_27086; X86-NOBMI-NEXT:  # %bb.1:7087; X86-NOBMI-NEXT:    movl %eax, %edi7088; X86-NOBMI-NEXT:    xorl %eax, %eax7089; X86-NOBMI-NEXT:  .LBB57_2:7090; X86-NOBMI-NEXT:    movb $64, %cl7091; X86-NOBMI-NEXT:    subb {{[0-9]+}}(%esp), %cl7092; X86-NOBMI-NEXT:    shldl %cl, %edi, %eax7093; X86-NOBMI-NEXT:    shll %cl, %edi7094; X86-NOBMI-NEXT:    testb $32, %cl7095; X86-NOBMI-NEXT:    movl %edi, %ebx7096; X86-NOBMI-NEXT:    jne .LBB57_47097; X86-NOBMI-NEXT:  # %bb.3:7098; X86-NOBMI-NEXT:    movl %eax, %ebx7099; X86-NOBMI-NEXT:  .LBB57_4:7100; X86-NOBMI-NEXT:    movl %ebx, %eax7101; X86-NOBMI-NEXT:    shrl %cl, %eax7102; X86-NOBMI-NEXT:    testb $32, %cl7103; X86-NOBMI-NEXT:    movl $0, %edx7104; X86-NOBMI-NEXT:    jne .LBB57_67105; X86-NOBMI-NEXT:  # %bb.5:7106; X86-NOBMI-NEXT:    movl %edi, %esi7107; X86-NOBMI-NEXT:    movl %eax, %edx7108; X86-NOBMI-NEXT:  .LBB57_6:7109; X86-NOBMI-NEXT:    shrdl %cl, %ebx, %esi7110; X86-NOBMI-NEXT:    testb $32, %cl7111; X86-NOBMI-NEXT:    jne .LBB57_87112; X86-NOBMI-NEXT:  # %bb.7:7113; X86-NOBMI-NEXT:    movl %esi, %eax7114; X86-NOBMI-NEXT:  .LBB57_8:7115; X86-NOBMI-NEXT:    popl %esi7116; X86-NOBMI-NEXT:    popl %edi7117; X86-NOBMI-NEXT:    popl %ebx7118; X86-NOBMI-NEXT:    retl7119;7120; X86-BMI1-LABEL: bextr64_d1_indexzext:7121; X86-BMI1:       # %bb.0:7122; X86-BMI1-NEXT:    pushl %ebx7123; X86-BMI1-NEXT:    pushl %edi7124; X86-BMI1-NEXT:    pushl %esi7125; X86-BMI1-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx7126; X86-BMI1-NEXT:    movl {{[0-9]+}}(%esp), %edi7127; X86-BMI1-NEXT:    movl {{[0-9]+}}(%esp), %edx7128; X86-BMI1-NEXT:    movl %edx, %eax7129; X86-BMI1-NEXT:    shrl %cl, %eax7130; X86-BMI1-NEXT:    shrdl %cl, %edx, %edi7131; X86-BMI1-NEXT:    xorl %esi, %esi7132; X86-BMI1-NEXT:    testb $32, %cl7133; X86-BMI1-NEXT:    je .LBB57_27134; X86-BMI1-NEXT:  # %bb.1:7135; X86-BMI1-NEXT:    movl %eax, %edi7136; X86-BMI1-NEXT:    xorl %eax, %eax7137; X86-BMI1-NEXT:  .LBB57_2:7138; X86-BMI1-NEXT:    movb $64, %cl7139; X86-BMI1-NEXT:    subb {{[0-9]+}}(%esp), %cl7140; X86-BMI1-NEXT:    shldl %cl, %edi, %eax7141; X86-BMI1-NEXT:    shll %cl, %edi7142; X86-BMI1-NEXT:    testb $32, %cl7143; X86-BMI1-NEXT:    movl %edi, %ebx7144; X86-BMI1-NEXT:    jne .LBB57_47145; X86-BMI1-NEXT:  # %bb.3:7146; X86-BMI1-NEXT:    movl %eax, %ebx7147; X86-BMI1-NEXT:  .LBB57_4:7148; X86-BMI1-NEXT:    movl %ebx, %eax7149; X86-BMI1-NEXT:    shrl %cl, %eax7150; X86-BMI1-NEXT:    testb $32, %cl7151; X86-BMI1-NEXT:    movl $0, %edx7152; X86-BMI1-NEXT:    jne .LBB57_67153; X86-BMI1-NEXT:  # %bb.5:7154; X86-BMI1-NEXT:    movl %edi, %esi7155; X86-BMI1-NEXT:    movl %eax, %edx7156; X86-BMI1-NEXT:  .LBB57_6:7157; X86-BMI1-NEXT:    shrdl %cl, %ebx, %esi7158; X86-BMI1-NEXT:    testb $32, %cl7159; X86-BMI1-NEXT:    jne .LBB57_87160; X86-BMI1-NEXT:  # %bb.7:7161; X86-BMI1-NEXT:    movl %esi, %eax7162; X86-BMI1-NEXT:  .LBB57_8:7163; X86-BMI1-NEXT:    popl %esi7164; X86-BMI1-NEXT:    popl %edi7165; X86-BMI1-NEXT:    popl %ebx7166; X86-BMI1-NEXT:    retl7167;7168; X86-BMI2-LABEL: bextr64_d1_indexzext:7169; X86-BMI2:       # %bb.0:7170; X86-BMI2-NEXT:    pushl %edi7171; X86-BMI2-NEXT:    pushl %esi7172; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx7173; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %eax7174; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %edx7175; X86-BMI2-NEXT:    shrdl %cl, %edx, %eax7176; X86-BMI2-NEXT:    shrxl %ecx, %edx, %esi7177; X86-BMI2-NEXT:    xorl %edx, %edx7178; X86-BMI2-NEXT:    testb $32, %cl7179; X86-BMI2-NEXT:    je .LBB57_27180; X86-BMI2-NEXT:  # %bb.1:7181; X86-BMI2-NEXT:    movl %esi, %eax7182; X86-BMI2-NEXT:    xorl %esi, %esi7183; X86-BMI2-NEXT:  .LBB57_2:7184; X86-BMI2-NEXT:    movb $64, %cl7185; X86-BMI2-NEXT:    subb {{[0-9]+}}(%esp), %cl7186; X86-BMI2-NEXT:    shldl %cl, %eax, %esi7187; X86-BMI2-NEXT:    shlxl %ecx, %eax, %edi7188; X86-BMI2-NEXT:    testb $32, %cl7189; X86-BMI2-NEXT:    je .LBB57_47190; X86-BMI2-NEXT:  # %bb.3:7191; X86-BMI2-NEXT:    movl %edi, %esi7192; X86-BMI2-NEXT:    movl $0, %edi7193; X86-BMI2-NEXT:  .LBB57_4:7194; X86-BMI2-NEXT:    shrxl %ecx, %esi, %eax7195; X86-BMI2-NEXT:    jne .LBB57_67196; X86-BMI2-NEXT:  # %bb.5:7197; X86-BMI2-NEXT:    movl %eax, %edx7198; X86-BMI2-NEXT:  .LBB57_6:7199; X86-BMI2-NEXT:    shrdl %cl, %esi, %edi7200; X86-BMI2-NEXT:    testb $32, %cl7201; X86-BMI2-NEXT:    jne .LBB57_87202; X86-BMI2-NEXT:  # %bb.7:7203; X86-BMI2-NEXT:    movl %edi, %eax7204; X86-BMI2-NEXT:  .LBB57_8:7205; X86-BMI2-NEXT:    popl %esi7206; X86-BMI2-NEXT:    popl %edi7207; X86-BMI2-NEXT:    retl7208;7209; X64-NOBMI-LABEL: bextr64_d1_indexzext:7210; X64-NOBMI:       # %bb.0:7211; X64-NOBMI-NEXT:    movl %esi, %ecx7212; X64-NOBMI-NEXT:    movq %rdi, %rax7213; X64-NOBMI-NEXT:    # kill: def $cl killed $cl killed $ecx7214; X64-NOBMI-NEXT:    shrq %cl, %rax7215; X64-NOBMI-NEXT:    negb %dl7216; X64-NOBMI-NEXT:    movl %edx, %ecx7217; X64-NOBMI-NEXT:    shlq %cl, %rax7218; X64-NOBMI-NEXT:    shrq %cl, %rax7219; X64-NOBMI-NEXT:    retq7220;7221; X64-BMI1-LABEL: bextr64_d1_indexzext:7222; X64-BMI1:       # %bb.0:7223; X64-BMI1-NEXT:    shll $8, %edx7224; X64-BMI1-NEXT:    movzbl %sil, %eax7225; X64-BMI1-NEXT:    orl %edx, %eax7226; X64-BMI1-NEXT:    bextrq %rax, %rdi, %rax7227; X64-BMI1-NEXT:    retq7228;7229; X64-BMI2-LABEL: bextr64_d1_indexzext:7230; X64-BMI2:       # %bb.0:7231; X64-BMI2-NEXT:    # kill: def $edx killed $edx def $rdx7232; X64-BMI2-NEXT:    # kill: def $esi killed $esi def $rsi7233; X64-BMI2-NEXT:    shrxq %rsi, %rdi, %rax7234; X64-BMI2-NEXT:    bzhiq %rdx, %rax, %rax7235; X64-BMI2-NEXT:    retq7236  %skip = zext i8 %numskipbits to i647237  %shifted = lshr i64 %val, %skip7238  %numhighbits = sub i8 64, %numlowbits7239  %sh_prom = zext i8 %numhighbits to i647240  %highbitscleared = shl i64 %shifted, %sh_prom7241  %masked = lshr i64 %highbitscleared, %sh_prom7242  ret i64 %masked7243}7244 7245define i64 @bextr64_d2_load(ptr %w, i64 %numskipbits, i64 %numlowbits) nounwind {7246; X86-NOBMI-LABEL: bextr64_d2_load:7247; X86-NOBMI:       # %bb.0:7248; X86-NOBMI-NEXT:    pushl %ebx7249; X86-NOBMI-NEXT:    pushl %edi7250; X86-NOBMI-NEXT:    pushl %esi7251; X86-NOBMI-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx7252; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %eax7253; X86-NOBMI-NEXT:    movl (%eax), %edi7254; X86-NOBMI-NEXT:    movl 4(%eax), %edx7255; X86-NOBMI-NEXT:    movl %edx, %eax7256; X86-NOBMI-NEXT:    shrl %cl, %eax7257; X86-NOBMI-NEXT:    shrdl %cl, %edx, %edi7258; X86-NOBMI-NEXT:    xorl %esi, %esi7259; X86-NOBMI-NEXT:    testb $32, %cl7260; X86-NOBMI-NEXT:    je .LBB58_27261; X86-NOBMI-NEXT:  # %bb.1:7262; X86-NOBMI-NEXT:    movl %eax, %edi7263; X86-NOBMI-NEXT:    xorl %eax, %eax7264; X86-NOBMI-NEXT:  .LBB58_2:7265; X86-NOBMI-NEXT:    movb $64, %cl7266; X86-NOBMI-NEXT:    subb {{[0-9]+}}(%esp), %cl7267; X86-NOBMI-NEXT:    shldl %cl, %edi, %eax7268; X86-NOBMI-NEXT:    shll %cl, %edi7269; X86-NOBMI-NEXT:    testb $32, %cl7270; X86-NOBMI-NEXT:    movl %edi, %ebx7271; X86-NOBMI-NEXT:    jne .LBB58_47272; X86-NOBMI-NEXT:  # %bb.3:7273; X86-NOBMI-NEXT:    movl %eax, %ebx7274; X86-NOBMI-NEXT:  .LBB58_4:7275; X86-NOBMI-NEXT:    movl %ebx, %eax7276; X86-NOBMI-NEXT:    shrl %cl, %eax7277; X86-NOBMI-NEXT:    testb $32, %cl7278; X86-NOBMI-NEXT:    movl $0, %edx7279; X86-NOBMI-NEXT:    jne .LBB58_67280; X86-NOBMI-NEXT:  # %bb.5:7281; X86-NOBMI-NEXT:    movl %edi, %esi7282; X86-NOBMI-NEXT:    movl %eax, %edx7283; X86-NOBMI-NEXT:  .LBB58_6:7284; X86-NOBMI-NEXT:    shrdl %cl, %ebx, %esi7285; X86-NOBMI-NEXT:    testb $32, %cl7286; X86-NOBMI-NEXT:    jne .LBB58_87287; X86-NOBMI-NEXT:  # %bb.7:7288; X86-NOBMI-NEXT:    movl %esi, %eax7289; X86-NOBMI-NEXT:  .LBB58_8:7290; X86-NOBMI-NEXT:    popl %esi7291; X86-NOBMI-NEXT:    popl %edi7292; X86-NOBMI-NEXT:    popl %ebx7293; X86-NOBMI-NEXT:    retl7294;7295; X86-BMI1-LABEL: bextr64_d2_load:7296; X86-BMI1:       # %bb.0:7297; X86-BMI1-NEXT:    pushl %ebx7298; X86-BMI1-NEXT:    pushl %edi7299; X86-BMI1-NEXT:    pushl %esi7300; X86-BMI1-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx7301; X86-BMI1-NEXT:    movl {{[0-9]+}}(%esp), %eax7302; X86-BMI1-NEXT:    movl (%eax), %edi7303; X86-BMI1-NEXT:    movl 4(%eax), %edx7304; X86-BMI1-NEXT:    movl %edx, %eax7305; X86-BMI1-NEXT:    shrl %cl, %eax7306; X86-BMI1-NEXT:    shrdl %cl, %edx, %edi7307; X86-BMI1-NEXT:    xorl %esi, %esi7308; X86-BMI1-NEXT:    testb $32, %cl7309; X86-BMI1-NEXT:    je .LBB58_27310; X86-BMI1-NEXT:  # %bb.1:7311; X86-BMI1-NEXT:    movl %eax, %edi7312; X86-BMI1-NEXT:    xorl %eax, %eax7313; X86-BMI1-NEXT:  .LBB58_2:7314; X86-BMI1-NEXT:    movb $64, %cl7315; X86-BMI1-NEXT:    subb {{[0-9]+}}(%esp), %cl7316; X86-BMI1-NEXT:    shldl %cl, %edi, %eax7317; X86-BMI1-NEXT:    shll %cl, %edi7318; X86-BMI1-NEXT:    testb $32, %cl7319; X86-BMI1-NEXT:    movl %edi, %ebx7320; X86-BMI1-NEXT:    jne .LBB58_47321; X86-BMI1-NEXT:  # %bb.3:7322; X86-BMI1-NEXT:    movl %eax, %ebx7323; X86-BMI1-NEXT:  .LBB58_4:7324; X86-BMI1-NEXT:    movl %ebx, %eax7325; X86-BMI1-NEXT:    shrl %cl, %eax7326; X86-BMI1-NEXT:    testb $32, %cl7327; X86-BMI1-NEXT:    movl $0, %edx7328; X86-BMI1-NEXT:    jne .LBB58_67329; X86-BMI1-NEXT:  # %bb.5:7330; X86-BMI1-NEXT:    movl %edi, %esi7331; X86-BMI1-NEXT:    movl %eax, %edx7332; X86-BMI1-NEXT:  .LBB58_6:7333; X86-BMI1-NEXT:    shrdl %cl, %ebx, %esi7334; X86-BMI1-NEXT:    testb $32, %cl7335; X86-BMI1-NEXT:    jne .LBB58_87336; X86-BMI1-NEXT:  # %bb.7:7337; X86-BMI1-NEXT:    movl %esi, %eax7338; X86-BMI1-NEXT:  .LBB58_8:7339; X86-BMI1-NEXT:    popl %esi7340; X86-BMI1-NEXT:    popl %edi7341; X86-BMI1-NEXT:    popl %ebx7342; X86-BMI1-NEXT:    retl7343;7344; X86-BMI2-LABEL: bextr64_d2_load:7345; X86-BMI2:       # %bb.0:7346; X86-BMI2-NEXT:    pushl %edi7347; X86-BMI2-NEXT:    pushl %esi7348; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx7349; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %edx7350; X86-BMI2-NEXT:    movl (%edx), %eax7351; X86-BMI2-NEXT:    movl 4(%edx), %edx7352; X86-BMI2-NEXT:    shrxl %ecx, %edx, %esi7353; X86-BMI2-NEXT:    shrdl %cl, %edx, %eax7354; X86-BMI2-NEXT:    xorl %edx, %edx7355; X86-BMI2-NEXT:    testb $32, %cl7356; X86-BMI2-NEXT:    je .LBB58_27357; X86-BMI2-NEXT:  # %bb.1:7358; X86-BMI2-NEXT:    movl %esi, %eax7359; X86-BMI2-NEXT:    xorl %esi, %esi7360; X86-BMI2-NEXT:  .LBB58_2:7361; X86-BMI2-NEXT:    movb $64, %cl7362; X86-BMI2-NEXT:    subb {{[0-9]+}}(%esp), %cl7363; X86-BMI2-NEXT:    shldl %cl, %eax, %esi7364; X86-BMI2-NEXT:    shlxl %ecx, %eax, %edi7365; X86-BMI2-NEXT:    testb $32, %cl7366; X86-BMI2-NEXT:    je .LBB58_47367; X86-BMI2-NEXT:  # %bb.3:7368; X86-BMI2-NEXT:    movl %edi, %esi7369; X86-BMI2-NEXT:    movl $0, %edi7370; X86-BMI2-NEXT:  .LBB58_4:7371; X86-BMI2-NEXT:    shrxl %ecx, %esi, %eax7372; X86-BMI2-NEXT:    jne .LBB58_67373; X86-BMI2-NEXT:  # %bb.5:7374; X86-BMI2-NEXT:    movl %eax, %edx7375; X86-BMI2-NEXT:  .LBB58_6:7376; X86-BMI2-NEXT:    shrdl %cl, %esi, %edi7377; X86-BMI2-NEXT:    testb $32, %cl7378; X86-BMI2-NEXT:    jne .LBB58_87379; X86-BMI2-NEXT:  # %bb.7:7380; X86-BMI2-NEXT:    movl %edi, %eax7381; X86-BMI2-NEXT:  .LBB58_8:7382; X86-BMI2-NEXT:    popl %esi7383; X86-BMI2-NEXT:    popl %edi7384; X86-BMI2-NEXT:    retl7385;7386; X64-NOBMI-LABEL: bextr64_d2_load:7387; X64-NOBMI:       # %bb.0:7388; X64-NOBMI-NEXT:    movq %rsi, %rcx7389; X64-NOBMI-NEXT:    movq (%rdi), %rax7390; X64-NOBMI-NEXT:    # kill: def $cl killed $cl killed $rcx7391; X64-NOBMI-NEXT:    shrq %cl, %rax7392; X64-NOBMI-NEXT:    negb %dl7393; X64-NOBMI-NEXT:    movl %edx, %ecx7394; X64-NOBMI-NEXT:    shlq %cl, %rax7395; X64-NOBMI-NEXT:    shrq %cl, %rax7396; X64-NOBMI-NEXT:    retq7397;7398; X64-BMI1-LABEL: bextr64_d2_load:7399; X64-BMI1:       # %bb.0:7400; X64-BMI1-NEXT:    shll $8, %edx7401; X64-BMI1-NEXT:    movzbl %sil, %eax7402; X64-BMI1-NEXT:    orl %edx, %eax7403; X64-BMI1-NEXT:    bextrq %rax, (%rdi), %rax7404; X64-BMI1-NEXT:    retq7405;7406; X64-BMI2-LABEL: bextr64_d2_load:7407; X64-BMI2:       # %bb.0:7408; X64-BMI2-NEXT:    shrxq %rsi, (%rdi), %rax7409; X64-BMI2-NEXT:    bzhiq %rdx, %rax, %rax7410; X64-BMI2-NEXT:    retq7411  %val = load i64, ptr %w7412  %shifted = lshr i64 %val, %numskipbits7413  %numhighbits = sub i64 64, %numlowbits7414  %highbitscleared = shl i64 %shifted, %numhighbits7415  %masked = lshr i64 %highbitscleared, %numhighbits7416  ret i64 %masked7417}7418 7419define i64 @bextr64_d3_load_indexzext(ptr %w, i8 %numskipbits, i8 %numlowbits) nounwind {7420; X86-NOBMI-LABEL: bextr64_d3_load_indexzext:7421; X86-NOBMI:       # %bb.0:7422; X86-NOBMI-NEXT:    pushl %ebx7423; X86-NOBMI-NEXT:    pushl %edi7424; X86-NOBMI-NEXT:    pushl %esi7425; X86-NOBMI-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx7426; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %eax7427; X86-NOBMI-NEXT:    movl (%eax), %edi7428; X86-NOBMI-NEXT:    movl 4(%eax), %edx7429; X86-NOBMI-NEXT:    movl %edx, %eax7430; X86-NOBMI-NEXT:    shrl %cl, %eax7431; X86-NOBMI-NEXT:    shrdl %cl, %edx, %edi7432; X86-NOBMI-NEXT:    xorl %esi, %esi7433; X86-NOBMI-NEXT:    testb $32, %cl7434; X86-NOBMI-NEXT:    je .LBB59_27435; X86-NOBMI-NEXT:  # %bb.1:7436; X86-NOBMI-NEXT:    movl %eax, %edi7437; X86-NOBMI-NEXT:    xorl %eax, %eax7438; X86-NOBMI-NEXT:  .LBB59_2:7439; X86-NOBMI-NEXT:    movb $64, %cl7440; X86-NOBMI-NEXT:    subb {{[0-9]+}}(%esp), %cl7441; X86-NOBMI-NEXT:    shldl %cl, %edi, %eax7442; X86-NOBMI-NEXT:    shll %cl, %edi7443; X86-NOBMI-NEXT:    testb $32, %cl7444; X86-NOBMI-NEXT:    movl %edi, %ebx7445; X86-NOBMI-NEXT:    jne .LBB59_47446; X86-NOBMI-NEXT:  # %bb.3:7447; X86-NOBMI-NEXT:    movl %eax, %ebx7448; X86-NOBMI-NEXT:  .LBB59_4:7449; X86-NOBMI-NEXT:    movl %ebx, %eax7450; X86-NOBMI-NEXT:    shrl %cl, %eax7451; X86-NOBMI-NEXT:    testb $32, %cl7452; X86-NOBMI-NEXT:    movl $0, %edx7453; X86-NOBMI-NEXT:    jne .LBB59_67454; X86-NOBMI-NEXT:  # %bb.5:7455; X86-NOBMI-NEXT:    movl %edi, %esi7456; X86-NOBMI-NEXT:    movl %eax, %edx7457; X86-NOBMI-NEXT:  .LBB59_6:7458; X86-NOBMI-NEXT:    shrdl %cl, %ebx, %esi7459; X86-NOBMI-NEXT:    testb $32, %cl7460; X86-NOBMI-NEXT:    jne .LBB59_87461; X86-NOBMI-NEXT:  # %bb.7:7462; X86-NOBMI-NEXT:    movl %esi, %eax7463; X86-NOBMI-NEXT:  .LBB59_8:7464; X86-NOBMI-NEXT:    popl %esi7465; X86-NOBMI-NEXT:    popl %edi7466; X86-NOBMI-NEXT:    popl %ebx7467; X86-NOBMI-NEXT:    retl7468;7469; X86-BMI1-LABEL: bextr64_d3_load_indexzext:7470; X86-BMI1:       # %bb.0:7471; X86-BMI1-NEXT:    pushl %ebx7472; X86-BMI1-NEXT:    pushl %edi7473; X86-BMI1-NEXT:    pushl %esi7474; X86-BMI1-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx7475; X86-BMI1-NEXT:    movl {{[0-9]+}}(%esp), %eax7476; X86-BMI1-NEXT:    movl (%eax), %edi7477; X86-BMI1-NEXT:    movl 4(%eax), %edx7478; X86-BMI1-NEXT:    movl %edx, %eax7479; X86-BMI1-NEXT:    shrl %cl, %eax7480; X86-BMI1-NEXT:    shrdl %cl, %edx, %edi7481; X86-BMI1-NEXT:    xorl %esi, %esi7482; X86-BMI1-NEXT:    testb $32, %cl7483; X86-BMI1-NEXT:    je .LBB59_27484; X86-BMI1-NEXT:  # %bb.1:7485; X86-BMI1-NEXT:    movl %eax, %edi7486; X86-BMI1-NEXT:    xorl %eax, %eax7487; X86-BMI1-NEXT:  .LBB59_2:7488; X86-BMI1-NEXT:    movb $64, %cl7489; X86-BMI1-NEXT:    subb {{[0-9]+}}(%esp), %cl7490; X86-BMI1-NEXT:    shldl %cl, %edi, %eax7491; X86-BMI1-NEXT:    shll %cl, %edi7492; X86-BMI1-NEXT:    testb $32, %cl7493; X86-BMI1-NEXT:    movl %edi, %ebx7494; X86-BMI1-NEXT:    jne .LBB59_47495; X86-BMI1-NEXT:  # %bb.3:7496; X86-BMI1-NEXT:    movl %eax, %ebx7497; X86-BMI1-NEXT:  .LBB59_4:7498; X86-BMI1-NEXT:    movl %ebx, %eax7499; X86-BMI1-NEXT:    shrl %cl, %eax7500; X86-BMI1-NEXT:    testb $32, %cl7501; X86-BMI1-NEXT:    movl $0, %edx7502; X86-BMI1-NEXT:    jne .LBB59_67503; X86-BMI1-NEXT:  # %bb.5:7504; X86-BMI1-NEXT:    movl %edi, %esi7505; X86-BMI1-NEXT:    movl %eax, %edx7506; X86-BMI1-NEXT:  .LBB59_6:7507; X86-BMI1-NEXT:    shrdl %cl, %ebx, %esi7508; X86-BMI1-NEXT:    testb $32, %cl7509; X86-BMI1-NEXT:    jne .LBB59_87510; X86-BMI1-NEXT:  # %bb.7:7511; X86-BMI1-NEXT:    movl %esi, %eax7512; X86-BMI1-NEXT:  .LBB59_8:7513; X86-BMI1-NEXT:    popl %esi7514; X86-BMI1-NEXT:    popl %edi7515; X86-BMI1-NEXT:    popl %ebx7516; X86-BMI1-NEXT:    retl7517;7518; X86-BMI2-LABEL: bextr64_d3_load_indexzext:7519; X86-BMI2:       # %bb.0:7520; X86-BMI2-NEXT:    pushl %edi7521; X86-BMI2-NEXT:    pushl %esi7522; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx7523; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %edx7524; X86-BMI2-NEXT:    movl (%edx), %eax7525; X86-BMI2-NEXT:    movl 4(%edx), %edx7526; X86-BMI2-NEXT:    shrxl %ecx, %edx, %esi7527; X86-BMI2-NEXT:    shrdl %cl, %edx, %eax7528; X86-BMI2-NEXT:    xorl %edx, %edx7529; X86-BMI2-NEXT:    testb $32, %cl7530; X86-BMI2-NEXT:    je .LBB59_27531; X86-BMI2-NEXT:  # %bb.1:7532; X86-BMI2-NEXT:    movl %esi, %eax7533; X86-BMI2-NEXT:    xorl %esi, %esi7534; X86-BMI2-NEXT:  .LBB59_2:7535; X86-BMI2-NEXT:    movb $64, %cl7536; X86-BMI2-NEXT:    subb {{[0-9]+}}(%esp), %cl7537; X86-BMI2-NEXT:    shldl %cl, %eax, %esi7538; X86-BMI2-NEXT:    shlxl %ecx, %eax, %edi7539; X86-BMI2-NEXT:    testb $32, %cl7540; X86-BMI2-NEXT:    je .LBB59_47541; X86-BMI2-NEXT:  # %bb.3:7542; X86-BMI2-NEXT:    movl %edi, %esi7543; X86-BMI2-NEXT:    movl $0, %edi7544; X86-BMI2-NEXT:  .LBB59_4:7545; X86-BMI2-NEXT:    shrxl %ecx, %esi, %eax7546; X86-BMI2-NEXT:    jne .LBB59_67547; X86-BMI2-NEXT:  # %bb.5:7548; X86-BMI2-NEXT:    movl %eax, %edx7549; X86-BMI2-NEXT:  .LBB59_6:7550; X86-BMI2-NEXT:    shrdl %cl, %esi, %edi7551; X86-BMI2-NEXT:    testb $32, %cl7552; X86-BMI2-NEXT:    jne .LBB59_87553; X86-BMI2-NEXT:  # %bb.7:7554; X86-BMI2-NEXT:    movl %edi, %eax7555; X86-BMI2-NEXT:  .LBB59_8:7556; X86-BMI2-NEXT:    popl %esi7557; X86-BMI2-NEXT:    popl %edi7558; X86-BMI2-NEXT:    retl7559;7560; X64-NOBMI-LABEL: bextr64_d3_load_indexzext:7561; X64-NOBMI:       # %bb.0:7562; X64-NOBMI-NEXT:    movl %esi, %ecx7563; X64-NOBMI-NEXT:    movq (%rdi), %rax7564; X64-NOBMI-NEXT:    # kill: def $cl killed $cl killed $ecx7565; X64-NOBMI-NEXT:    shrq %cl, %rax7566; X64-NOBMI-NEXT:    negb %dl7567; X64-NOBMI-NEXT:    movl %edx, %ecx7568; X64-NOBMI-NEXT:    shlq %cl, %rax7569; X64-NOBMI-NEXT:    shrq %cl, %rax7570; X64-NOBMI-NEXT:    retq7571;7572; X64-BMI1-LABEL: bextr64_d3_load_indexzext:7573; X64-BMI1:       # %bb.0:7574; X64-BMI1-NEXT:    shll $8, %edx7575; X64-BMI1-NEXT:    movzbl %sil, %eax7576; X64-BMI1-NEXT:    orl %edx, %eax7577; X64-BMI1-NEXT:    bextrq %rax, (%rdi), %rax7578; X64-BMI1-NEXT:    retq7579;7580; X64-BMI2-LABEL: bextr64_d3_load_indexzext:7581; X64-BMI2:       # %bb.0:7582; X64-BMI2-NEXT:    # kill: def $edx killed $edx def $rdx7583; X64-BMI2-NEXT:    # kill: def $esi killed $esi def $rsi7584; X64-BMI2-NEXT:    shrxq %rsi, (%rdi), %rax7585; X64-BMI2-NEXT:    bzhiq %rdx, %rax, %rax7586; X64-BMI2-NEXT:    retq7587  %val = load i64, ptr %w7588  %skip = zext i8 %numskipbits to i647589  %shifted = lshr i64 %val, %skip7590  %numhighbits = sub i8 64, %numlowbits7591  %sh_prom = zext i8 %numhighbits to i647592  %highbitscleared = shl i64 %shifted, %sh_prom7593  %masked = lshr i64 %highbitscleared, %sh_prom7594  ret i64 %masked7595}7596 7597define i64 @bextr64_d5_skipextrauses(i64 %val, i64 %numskipbits, i64 %numlowbits) nounwind {7598; X86-NOBMI-LABEL: bextr64_d5_skipextrauses:7599; X86-NOBMI:       # %bb.0:7600; X86-NOBMI-NEXT:    pushl %ebp7601; X86-NOBMI-NEXT:    pushl %ebx7602; X86-NOBMI-NEXT:    pushl %edi7603; X86-NOBMI-NEXT:    pushl %esi7604; X86-NOBMI-NEXT:    subl $12, %esp7605; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %ebx7606; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %edx7607; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %eax7608; X86-NOBMI-NEXT:    movl %edx, %esi7609; X86-NOBMI-NEXT:    movl %eax, %ecx7610; X86-NOBMI-NEXT:    shrl %cl, %esi7611; X86-NOBMI-NEXT:    shrdl %cl, %edx, %ebx7612; X86-NOBMI-NEXT:    xorl %edx, %edx7613; X86-NOBMI-NEXT:    testb $32, %al7614; X86-NOBMI-NEXT:    je .LBB60_27615; X86-NOBMI-NEXT:  # %bb.1:7616; X86-NOBMI-NEXT:    movl %esi, %ebx7617; X86-NOBMI-NEXT:    xorl %esi, %esi7618; X86-NOBMI-NEXT:  .LBB60_2:7619; X86-NOBMI-NEXT:    movb $64, %cl7620; X86-NOBMI-NEXT:    subb {{[0-9]+}}(%esp), %cl7621; X86-NOBMI-NEXT:    shldl %cl, %ebx, %esi7622; X86-NOBMI-NEXT:    shll %cl, %ebx7623; X86-NOBMI-NEXT:    testb $32, %cl7624; X86-NOBMI-NEXT:    movl %ebx, %ebp7625; X86-NOBMI-NEXT:    jne .LBB60_47626; X86-NOBMI-NEXT:  # %bb.3:7627; X86-NOBMI-NEXT:    movl %esi, %ebp7628; X86-NOBMI-NEXT:  .LBB60_4:7629; X86-NOBMI-NEXT:    movl %ebp, %esi7630; X86-NOBMI-NEXT:    shrl %cl, %esi7631; X86-NOBMI-NEXT:    testb $32, %cl7632; X86-NOBMI-NEXT:    movl $0, %edi7633; X86-NOBMI-NEXT:    jne .LBB60_67634; X86-NOBMI-NEXT:  # %bb.5:7635; X86-NOBMI-NEXT:    movl %ebx, %edx7636; X86-NOBMI-NEXT:    movl %esi, %edi7637; X86-NOBMI-NEXT:  .LBB60_6:7638; X86-NOBMI-NEXT:    shrdl %cl, %ebp, %edx7639; X86-NOBMI-NEXT:    testb $32, %cl7640; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %ecx7641; X86-NOBMI-NEXT:    jne .LBB60_87642; X86-NOBMI-NEXT:  # %bb.7:7643; X86-NOBMI-NEXT:    movl %edx, %esi7644; X86-NOBMI-NEXT:  .LBB60_8:7645; X86-NOBMI-NEXT:    subl $8, %esp7646; X86-NOBMI-NEXT:    pushl %ecx7647; X86-NOBMI-NEXT:    pushl %eax7648; X86-NOBMI-NEXT:    calll use64@PLT7649; X86-NOBMI-NEXT:    addl $16, %esp7650; X86-NOBMI-NEXT:    movl %esi, %eax7651; X86-NOBMI-NEXT:    movl %edi, %edx7652; X86-NOBMI-NEXT:    addl $12, %esp7653; X86-NOBMI-NEXT:    popl %esi7654; X86-NOBMI-NEXT:    popl %edi7655; X86-NOBMI-NEXT:    popl %ebx7656; X86-NOBMI-NEXT:    popl %ebp7657; X86-NOBMI-NEXT:    retl7658;7659; X86-BMI1-LABEL: bextr64_d5_skipextrauses:7660; X86-BMI1:       # %bb.0:7661; X86-BMI1-NEXT:    pushl %ebp7662; X86-BMI1-NEXT:    pushl %ebx7663; X86-BMI1-NEXT:    pushl %edi7664; X86-BMI1-NEXT:    pushl %esi7665; X86-BMI1-NEXT:    subl $12, %esp7666; X86-BMI1-NEXT:    movl {{[0-9]+}}(%esp), %ebx7667; X86-BMI1-NEXT:    movl {{[0-9]+}}(%esp), %edx7668; X86-BMI1-NEXT:    movl {{[0-9]+}}(%esp), %eax7669; X86-BMI1-NEXT:    movl %edx, %esi7670; X86-BMI1-NEXT:    movl %eax, %ecx7671; X86-BMI1-NEXT:    shrl %cl, %esi7672; X86-BMI1-NEXT:    shrdl %cl, %edx, %ebx7673; X86-BMI1-NEXT:    xorl %edx, %edx7674; X86-BMI1-NEXT:    testb $32, %al7675; X86-BMI1-NEXT:    je .LBB60_27676; X86-BMI1-NEXT:  # %bb.1:7677; X86-BMI1-NEXT:    movl %esi, %ebx7678; X86-BMI1-NEXT:    xorl %esi, %esi7679; X86-BMI1-NEXT:  .LBB60_2:7680; X86-BMI1-NEXT:    movb $64, %cl7681; X86-BMI1-NEXT:    subb {{[0-9]+}}(%esp), %cl7682; X86-BMI1-NEXT:    shldl %cl, %ebx, %esi7683; X86-BMI1-NEXT:    shll %cl, %ebx7684; X86-BMI1-NEXT:    testb $32, %cl7685; X86-BMI1-NEXT:    movl %ebx, %ebp7686; X86-BMI1-NEXT:    jne .LBB60_47687; X86-BMI1-NEXT:  # %bb.3:7688; X86-BMI1-NEXT:    movl %esi, %ebp7689; X86-BMI1-NEXT:  .LBB60_4:7690; X86-BMI1-NEXT:    movl %ebp, %esi7691; X86-BMI1-NEXT:    shrl %cl, %esi7692; X86-BMI1-NEXT:    testb $32, %cl7693; X86-BMI1-NEXT:    movl $0, %edi7694; X86-BMI1-NEXT:    jne .LBB60_67695; X86-BMI1-NEXT:  # %bb.5:7696; X86-BMI1-NEXT:    movl %ebx, %edx7697; X86-BMI1-NEXT:    movl %esi, %edi7698; X86-BMI1-NEXT:  .LBB60_6:7699; X86-BMI1-NEXT:    shrdl %cl, %ebp, %edx7700; X86-BMI1-NEXT:    testb $32, %cl7701; X86-BMI1-NEXT:    movl {{[0-9]+}}(%esp), %ecx7702; X86-BMI1-NEXT:    jne .LBB60_87703; X86-BMI1-NEXT:  # %bb.7:7704; X86-BMI1-NEXT:    movl %edx, %esi7705; X86-BMI1-NEXT:  .LBB60_8:7706; X86-BMI1-NEXT:    subl $8, %esp7707; X86-BMI1-NEXT:    pushl %ecx7708; X86-BMI1-NEXT:    pushl %eax7709; X86-BMI1-NEXT:    calll use64@PLT7710; X86-BMI1-NEXT:    addl $16, %esp7711; X86-BMI1-NEXT:    movl %esi, %eax7712; X86-BMI1-NEXT:    movl %edi, %edx7713; X86-BMI1-NEXT:    addl $12, %esp7714; X86-BMI1-NEXT:    popl %esi7715; X86-BMI1-NEXT:    popl %edi7716; X86-BMI1-NEXT:    popl %ebx7717; X86-BMI1-NEXT:    popl %ebp7718; X86-BMI1-NEXT:    retl7719;7720; X86-BMI2-LABEL: bextr64_d5_skipextrauses:7721; X86-BMI2:       # %bb.0:7722; X86-BMI2-NEXT:    pushl %ebx7723; X86-BMI2-NEXT:    pushl %edi7724; X86-BMI2-NEXT:    pushl %esi7725; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %edi7726; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %edx7727; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %eax7728; X86-BMI2-NEXT:    movl %eax, %ecx7729; X86-BMI2-NEXT:    shrdl %cl, %edx, %edi7730; X86-BMI2-NEXT:    shrxl %eax, %edx, %edx7731; X86-BMI2-NEXT:    xorl %esi, %esi7732; X86-BMI2-NEXT:    testb $32, %al7733; X86-BMI2-NEXT:    je .LBB60_27734; X86-BMI2-NEXT:  # %bb.1:7735; X86-BMI2-NEXT:    movl %edx, %edi7736; X86-BMI2-NEXT:    xorl %edx, %edx7737; X86-BMI2-NEXT:  .LBB60_2:7738; X86-BMI2-NEXT:    movb $64, %cl7739; X86-BMI2-NEXT:    subb {{[0-9]+}}(%esp), %cl7740; X86-BMI2-NEXT:    shldl %cl, %edi, %edx7741; X86-BMI2-NEXT:    shlxl %ecx, %edi, %ebx7742; X86-BMI2-NEXT:    testb $32, %cl7743; X86-BMI2-NEXT:    je .LBB60_47744; X86-BMI2-NEXT:  # %bb.3:7745; X86-BMI2-NEXT:    movl %ebx, %edx7746; X86-BMI2-NEXT:    movl $0, %ebx7747; X86-BMI2-NEXT:  .LBB60_4:7748; X86-BMI2-NEXT:    shrxl %ecx, %edx, %edi7749; X86-BMI2-NEXT:    jne .LBB60_67750; X86-BMI2-NEXT:  # %bb.5:7751; X86-BMI2-NEXT:    movl %edi, %esi7752; X86-BMI2-NEXT:  .LBB60_6:7753; X86-BMI2-NEXT:    shrdl %cl, %edx, %ebx7754; X86-BMI2-NEXT:    testb $32, %cl7755; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %ecx7756; X86-BMI2-NEXT:    jne .LBB60_87757; X86-BMI2-NEXT:  # %bb.7:7758; X86-BMI2-NEXT:    movl %ebx, %edi7759; X86-BMI2-NEXT:  .LBB60_8:7760; X86-BMI2-NEXT:    subl $8, %esp7761; X86-BMI2-NEXT:    pushl %ecx7762; X86-BMI2-NEXT:    pushl %eax7763; X86-BMI2-NEXT:    calll use64@PLT7764; X86-BMI2-NEXT:    addl $16, %esp7765; X86-BMI2-NEXT:    movl %edi, %eax7766; X86-BMI2-NEXT:    movl %esi, %edx7767; X86-BMI2-NEXT:    popl %esi7768; X86-BMI2-NEXT:    popl %edi7769; X86-BMI2-NEXT:    popl %ebx7770; X86-BMI2-NEXT:    retl7771;7772; X64-NOBMI-LABEL: bextr64_d5_skipextrauses:7773; X64-NOBMI:       # %bb.0:7774; X64-NOBMI-NEXT:    pushq %rbx7775; X64-NOBMI-NEXT:    movq %rdi, %rbx7776; X64-NOBMI-NEXT:    movl %esi, %ecx7777; X64-NOBMI-NEXT:    shrq %cl, %rbx7778; X64-NOBMI-NEXT:    negb %dl7779; X64-NOBMI-NEXT:    movl %edx, %ecx7780; X64-NOBMI-NEXT:    shlq %cl, %rbx7781; X64-NOBMI-NEXT:    shrq %cl, %rbx7782; X64-NOBMI-NEXT:    movq %rsi, %rdi7783; X64-NOBMI-NEXT:    callq use64@PLT7784; X64-NOBMI-NEXT:    movq %rbx, %rax7785; X64-NOBMI-NEXT:    popq %rbx7786; X64-NOBMI-NEXT:    retq7787;7788; X64-BMI1-LABEL: bextr64_d5_skipextrauses:7789; X64-BMI1:       # %bb.0:7790; X64-BMI1-NEXT:    pushq %rbx7791; X64-BMI1-NEXT:    shll $8, %edx7792; X64-BMI1-NEXT:    movzbl %sil, %eax7793; X64-BMI1-NEXT:    orl %edx, %eax7794; X64-BMI1-NEXT:    bextrq %rax, %rdi, %rbx7795; X64-BMI1-NEXT:    movq %rsi, %rdi7796; X64-BMI1-NEXT:    callq use64@PLT7797; X64-BMI1-NEXT:    movq %rbx, %rax7798; X64-BMI1-NEXT:    popq %rbx7799; X64-BMI1-NEXT:    retq7800;7801; X64-BMI2-LABEL: bextr64_d5_skipextrauses:7802; X64-BMI2:       # %bb.0:7803; X64-BMI2-NEXT:    pushq %rbx7804; X64-BMI2-NEXT:    shrxq %rsi, %rdi, %rax7805; X64-BMI2-NEXT:    bzhiq %rdx, %rax, %rbx7806; X64-BMI2-NEXT:    movq %rsi, %rdi7807; X64-BMI2-NEXT:    callq use64@PLT7808; X64-BMI2-NEXT:    movq %rbx, %rax7809; X64-BMI2-NEXT:    popq %rbx7810; X64-BMI2-NEXT:    retq7811  %shifted = lshr i64 %val, %numskipbits7812  %numhighbits = sub i64 64, %numlowbits7813  %highbitscleared = shl i64 %shifted, %numhighbits7814  %masked = lshr i64 %highbitscleared, %numhighbits7815  call void @use64(i64 %numskipbits)7816  ret i64 %masked7817}7818 7819; 64-bit, but with 32-bit output7820 7821; Everything done in 64-bit, truncation happens last.7822define i32 @bextr64_32_d0(i64 %val, i64 %numskipbits, i64 %numlowbits) nounwind {7823; X86-NOBMI-LABEL: bextr64_32_d0:7824; X86-NOBMI:       # %bb.0:7825; X86-NOBMI-NEXT:    pushl %esi7826; X86-NOBMI-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx7827; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %edx7828; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %esi7829; X86-NOBMI-NEXT:    movl %esi, %eax7830; X86-NOBMI-NEXT:    shrl %cl, %eax7831; X86-NOBMI-NEXT:    shrdl %cl, %esi, %edx7832; X86-NOBMI-NEXT:    testb $32, %cl7833; X86-NOBMI-NEXT:    je .LBB61_27834; X86-NOBMI-NEXT:  # %bb.1:7835; X86-NOBMI-NEXT:    movl %eax, %edx7836; X86-NOBMI-NEXT:    xorl %eax, %eax7837; X86-NOBMI-NEXT:  .LBB61_2:7838; X86-NOBMI-NEXT:    movb $64, %cl7839; X86-NOBMI-NEXT:    subb {{[0-9]+}}(%esp), %cl7840; X86-NOBMI-NEXT:    shldl %cl, %edx, %eax7841; X86-NOBMI-NEXT:    shll %cl, %edx7842; X86-NOBMI-NEXT:    testb $32, %cl7843; X86-NOBMI-NEXT:    je .LBB61_47844; X86-NOBMI-NEXT:  # %bb.3:7845; X86-NOBMI-NEXT:    movl %edx, %eax7846; X86-NOBMI-NEXT:    xorl %edx, %edx7847; X86-NOBMI-NEXT:  .LBB61_4:7848; X86-NOBMI-NEXT:    shrdl %cl, %eax, %edx7849; X86-NOBMI-NEXT:    shrl %cl, %eax7850; X86-NOBMI-NEXT:    testb $32, %cl7851; X86-NOBMI-NEXT:    jne .LBB61_67852; X86-NOBMI-NEXT:  # %bb.5:7853; X86-NOBMI-NEXT:    movl %edx, %eax7854; X86-NOBMI-NEXT:  .LBB61_6:7855; X86-NOBMI-NEXT:    popl %esi7856; X86-NOBMI-NEXT:    retl7857;7858; X86-BMI1-LABEL: bextr64_32_d0:7859; X86-BMI1:       # %bb.0:7860; X86-BMI1-NEXT:    pushl %esi7861; X86-BMI1-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx7862; X86-BMI1-NEXT:    movl {{[0-9]+}}(%esp), %edx7863; X86-BMI1-NEXT:    movl {{[0-9]+}}(%esp), %esi7864; X86-BMI1-NEXT:    movl %esi, %eax7865; X86-BMI1-NEXT:    shrl %cl, %eax7866; X86-BMI1-NEXT:    shrdl %cl, %esi, %edx7867; X86-BMI1-NEXT:    testb $32, %cl7868; X86-BMI1-NEXT:    je .LBB61_27869; X86-BMI1-NEXT:  # %bb.1:7870; X86-BMI1-NEXT:    movl %eax, %edx7871; X86-BMI1-NEXT:    xorl %eax, %eax7872; X86-BMI1-NEXT:  .LBB61_2:7873; X86-BMI1-NEXT:    movb $64, %cl7874; X86-BMI1-NEXT:    subb {{[0-9]+}}(%esp), %cl7875; X86-BMI1-NEXT:    shldl %cl, %edx, %eax7876; X86-BMI1-NEXT:    shll %cl, %edx7877; X86-BMI1-NEXT:    testb $32, %cl7878; X86-BMI1-NEXT:    je .LBB61_47879; X86-BMI1-NEXT:  # %bb.3:7880; X86-BMI1-NEXT:    movl %edx, %eax7881; X86-BMI1-NEXT:    xorl %edx, %edx7882; X86-BMI1-NEXT:  .LBB61_4:7883; X86-BMI1-NEXT:    shrdl %cl, %eax, %edx7884; X86-BMI1-NEXT:    shrl %cl, %eax7885; X86-BMI1-NEXT:    testb $32, %cl7886; X86-BMI1-NEXT:    jne .LBB61_67887; X86-BMI1-NEXT:  # %bb.5:7888; X86-BMI1-NEXT:    movl %edx, %eax7889; X86-BMI1-NEXT:  .LBB61_6:7890; X86-BMI1-NEXT:    popl %esi7891; X86-BMI1-NEXT:    retl7892;7893; X86-BMI2-LABEL: bextr64_32_d0:7894; X86-BMI2:       # %bb.0:7895; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx7896; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %eax7897; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %edx7898; X86-BMI2-NEXT:    shrdl %cl, %edx, %eax7899; X86-BMI2-NEXT:    shrxl %ecx, %edx, %edx7900; X86-BMI2-NEXT:    testb $32, %cl7901; X86-BMI2-NEXT:    je .LBB61_27902; X86-BMI2-NEXT:  # %bb.1:7903; X86-BMI2-NEXT:    movl %edx, %eax7904; X86-BMI2-NEXT:    xorl %edx, %edx7905; X86-BMI2-NEXT:  .LBB61_2:7906; X86-BMI2-NEXT:    movb $64, %cl7907; X86-BMI2-NEXT:    subb {{[0-9]+}}(%esp), %cl7908; X86-BMI2-NEXT:    shldl %cl, %eax, %edx7909; X86-BMI2-NEXT:    shlxl %ecx, %eax, %eax7910; X86-BMI2-NEXT:    testb $32, %cl7911; X86-BMI2-NEXT:    je .LBB61_47912; X86-BMI2-NEXT:  # %bb.3:7913; X86-BMI2-NEXT:    movl %eax, %edx7914; X86-BMI2-NEXT:    xorl %eax, %eax7915; X86-BMI2-NEXT:  .LBB61_4:7916; X86-BMI2-NEXT:    shrdl %cl, %edx, %eax7917; X86-BMI2-NEXT:    testb $32, %cl7918; X86-BMI2-NEXT:    je .LBB61_67919; X86-BMI2-NEXT:  # %bb.5:7920; X86-BMI2-NEXT:    shrxl %ecx, %edx, %eax7921; X86-BMI2-NEXT:  .LBB61_6:7922; X86-BMI2-NEXT:    retl7923;7924; X64-NOBMI-LABEL: bextr64_32_d0:7925; X64-NOBMI:       # %bb.0:7926; X64-NOBMI-NEXT:    movq %rsi, %rcx7927; X64-NOBMI-NEXT:    movq %rdi, %rax7928; X64-NOBMI-NEXT:    # kill: def $cl killed $cl killed $rcx7929; X64-NOBMI-NEXT:    shrq %cl, %rax7930; X64-NOBMI-NEXT:    negb %dl7931; X64-NOBMI-NEXT:    movl %edx, %ecx7932; X64-NOBMI-NEXT:    shlq %cl, %rax7933; X64-NOBMI-NEXT:    shrq %cl, %rax7934; X64-NOBMI-NEXT:    # kill: def $eax killed $eax killed $rax7935; X64-NOBMI-NEXT:    retq7936;7937; X64-BMI1-LABEL: bextr64_32_d0:7938; X64-BMI1:       # %bb.0:7939; X64-BMI1-NEXT:    shll $8, %edx7940; X64-BMI1-NEXT:    movzbl %sil, %eax7941; X64-BMI1-NEXT:    orl %edx, %eax7942; X64-BMI1-NEXT:    bextrq %rax, %rdi, %rax7943; X64-BMI1-NEXT:    # kill: def $eax killed $eax killed $rax7944; X64-BMI1-NEXT:    retq7945;7946; X64-BMI2-LABEL: bextr64_32_d0:7947; X64-BMI2:       # %bb.0:7948; X64-BMI2-NEXT:    shrxq %rsi, %rdi, %rax7949; X64-BMI2-NEXT:    bzhiq %rdx, %rax, %rax7950; X64-BMI2-NEXT:    # kill: def $eax killed $eax killed $rax7951; X64-BMI2-NEXT:    retq7952  %shifted = lshr i64 %val, %numskipbits7953  %numhighbits = sub i64 64, %numlowbits7954  %highbitscleared = shl i64 %shifted, %numhighbits7955  %masked = lshr i64 %highbitscleared, %numhighbits7956  %res = trunc i64 %masked to i327957  ret i32 %res7958}7959 7960; Shifting happens in 64-bit, then truncation. Masking is 32-bit.7961define i32 @bextr64_32_d1(i64 %val, i64 %numskipbits, i32 %numlowbits) nounwind {7962; X86-NOBMI-LABEL: bextr64_32_d1:7963; X86-NOBMI:       # %bb.0:7964; X86-NOBMI-NEXT:    pushl %esi7965; X86-NOBMI-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx7966; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %edx7967; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %esi7968; X86-NOBMI-NEXT:    movl %esi, %eax7969; X86-NOBMI-NEXT:    shrl %cl, %eax7970; X86-NOBMI-NEXT:    shrdl %cl, %esi, %edx7971; X86-NOBMI-NEXT:    testb $32, %cl7972; X86-NOBMI-NEXT:    jne .LBB62_27973; X86-NOBMI-NEXT:  # %bb.1:7974; X86-NOBMI-NEXT:    movl %edx, %eax7975; X86-NOBMI-NEXT:  .LBB62_2:7976; X86-NOBMI-NEXT:    xorl %ecx, %ecx7977; X86-NOBMI-NEXT:    subb {{[0-9]+}}(%esp), %cl7978; X86-NOBMI-NEXT:    shll %cl, %eax7979; X86-NOBMI-NEXT:    # kill: def $cl killed $cl killed $ecx7980; X86-NOBMI-NEXT:    shrl %cl, %eax7981; X86-NOBMI-NEXT:    popl %esi7982; X86-NOBMI-NEXT:    retl7983;7984; X86-BMI1-LABEL: bextr64_32_d1:7985; X86-BMI1:       # %bb.0:7986; X86-BMI1-NEXT:    pushl %edi7987; X86-BMI1-NEXT:    pushl %esi7988; X86-BMI1-NEXT:    movzbl {{[0-9]+}}(%esp), %eax7989; X86-BMI1-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx7990; X86-BMI1-NEXT:    movl {{[0-9]+}}(%esp), %esi7991; X86-BMI1-NEXT:    movl {{[0-9]+}}(%esp), %edi7992; X86-BMI1-NEXT:    movl %edi, %edx7993; X86-BMI1-NEXT:    shrl %cl, %edx7994; X86-BMI1-NEXT:    shrdl %cl, %edi, %esi7995; X86-BMI1-NEXT:    testb $32, %cl7996; X86-BMI1-NEXT:    jne .LBB62_27997; X86-BMI1-NEXT:  # %bb.1:7998; X86-BMI1-NEXT:    movl %esi, %edx7999; X86-BMI1-NEXT:  .LBB62_2:8000; X86-BMI1-NEXT:    shll $8, %eax8001; X86-BMI1-NEXT:    bextrl %eax, %edx, %eax8002; X86-BMI1-NEXT:    popl %esi8003; X86-BMI1-NEXT:    popl %edi8004; X86-BMI1-NEXT:    retl8005;8006; X86-BMI2-LABEL: bextr64_32_d1:8007; X86-BMI2:       # %bb.0:8008; X86-BMI2-NEXT:    pushl %esi8009; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %eax8010; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx8011; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %edx8012; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %esi8013; X86-BMI2-NEXT:    shrdl %cl, %esi, %edx8014; X86-BMI2-NEXT:    testb $32, %cl8015; X86-BMI2-NEXT:    je .LBB62_28016; X86-BMI2-NEXT:  # %bb.1:8017; X86-BMI2-NEXT:    shrxl %ecx, %esi, %edx8018; X86-BMI2-NEXT:  .LBB62_2:8019; X86-BMI2-NEXT:    bzhil %eax, %edx, %eax8020; X86-BMI2-NEXT:    popl %esi8021; X86-BMI2-NEXT:    retl8022;8023; X64-NOBMI-LABEL: bextr64_32_d1:8024; X64-NOBMI:       # %bb.0:8025; X64-NOBMI-NEXT:    movq %rsi, %rcx8026; X64-NOBMI-NEXT:    movq %rdi, %rax8027; X64-NOBMI-NEXT:    # kill: def $cl killed $cl killed $rcx8028; X64-NOBMI-NEXT:    shrq %cl, %rax8029; X64-NOBMI-NEXT:    negb %dl8030; X64-NOBMI-NEXT:    movl %edx, %ecx8031; X64-NOBMI-NEXT:    shll %cl, %eax8032; X64-NOBMI-NEXT:    shrl %cl, %eax8033; X64-NOBMI-NEXT:    # kill: def $eax killed $eax killed $rax8034; X64-NOBMI-NEXT:    retq8035;8036; X64-BMI1-LABEL: bextr64_32_d1:8037; X64-BMI1:       # %bb.0:8038; X64-BMI1-NEXT:    shll $8, %edx8039; X64-BMI1-NEXT:    movzbl %sil, %eax8040; X64-BMI1-NEXT:    orl %edx, %eax8041; X64-BMI1-NEXT:    bextrq %rax, %rdi, %rax8042; X64-BMI1-NEXT:    # kill: def $eax killed $eax killed $rax8043; X64-BMI1-NEXT:    retq8044;8045; X64-BMI2-LABEL: bextr64_32_d1:8046; X64-BMI2:       # %bb.0:8047; X64-BMI2-NEXT:    shrxq %rsi, %rdi, %rax8048; X64-BMI2-NEXT:    bzhil %edx, %eax, %eax8049; X64-BMI2-NEXT:    retq8050  %shifted = lshr i64 %val, %numskipbits8051  %truncshifted = trunc i64 %shifted to i328052  %numhighbits = sub i32 32, %numlowbits8053  %highbitscleared = shl i32 %truncshifted, %numhighbits8054  %masked = lshr i32 %highbitscleared, %numhighbits8055  ret i32 %masked8056}8057 8058; ---------------------------------------------------------------------------- ;8059; Constant8060; ---------------------------------------------------------------------------- ;8061 8062; https://bugs.llvm.org/show_bug.cgi?id=389388063define void @pr38938(ptr %a0, ptr %a1) nounwind {8064; X86-NOBMI-LABEL: pr38938:8065; X86-NOBMI:       # %bb.0:8066; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %eax8067; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %ecx8068; X86-NOBMI-NEXT:    movl (%ecx), %ecx8069; X86-NOBMI-NEXT:    shrl $19, %ecx8070; X86-NOBMI-NEXT:    andl $4092, %ecx # imm = 0xFFC8071; X86-NOBMI-NEXT:    incl (%eax,%ecx)8072; X86-NOBMI-NEXT:    retl8073;8074; X86-BMINOTBM-LABEL: pr38938:8075; X86-BMINOTBM:       # %bb.0:8076; X86-BMINOTBM-NEXT:    movl {{[0-9]+}}(%esp), %eax8077; X86-BMINOTBM-NEXT:    movl {{[0-9]+}}(%esp), %ecx8078; X86-BMINOTBM-NEXT:    movl $2581, %edx # imm = 0xA158079; X86-BMINOTBM-NEXT:    bextrl %edx, (%ecx), %ecx8080; X86-BMINOTBM-NEXT:    incl (%eax,%ecx,4)8081; X86-BMINOTBM-NEXT:    retl8082;8083; X86-BMITBM-LABEL: pr38938:8084; X86-BMITBM:       # %bb.0:8085; X86-BMITBM-NEXT:    movl {{[0-9]+}}(%esp), %eax8086; X86-BMITBM-NEXT:    movl {{[0-9]+}}(%esp), %ecx8087; X86-BMITBM-NEXT:    bextrl $2581, (%ecx), %ecx # imm = 0xA158088; X86-BMITBM-NEXT:    incl (%eax,%ecx,4)8089; X86-BMITBM-NEXT:    retl8090;8091; X64-NOBMI-LABEL: pr38938:8092; X64-NOBMI:       # %bb.0:8093; X64-NOBMI-NEXT:    movl (%rsi), %eax8094; X64-NOBMI-NEXT:    shrl $19, %eax8095; X64-NOBMI-NEXT:    andl $4092, %eax # imm = 0xFFC8096; X64-NOBMI-NEXT:    incl (%rdi,%rax)8097; X64-NOBMI-NEXT:    retq8098;8099; X64-BMINOTBM-LABEL: pr38938:8100; X64-BMINOTBM:       # %bb.0:8101; X64-BMINOTBM-NEXT:    movl $2581, %eax # imm = 0xA158102; X64-BMINOTBM-NEXT:    bextrl %eax, (%rsi), %eax8103; X64-BMINOTBM-NEXT:    incl (%rdi,%rax,4)8104; X64-BMINOTBM-NEXT:    retq8105;8106; X64-BMITBM-LABEL: pr38938:8107; X64-BMITBM:       # %bb.0:8108; X64-BMITBM-NEXT:    bextrl $2581, (%rsi), %eax # imm = 0xA158109; X64-BMITBM-NEXT:    incl (%rdi,%rax,4)8110; X64-BMITBM-NEXT:    retq8111  %tmp = load i64, ptr %a1, align 88112  %tmp1 = lshr i64 %tmp, 218113  %tmp2 = and i64 %tmp1, 10238114  %tmp3 = getelementptr inbounds i32, ptr %a0, i64 %tmp28115  %tmp4 = load i32, ptr %tmp3, align 48116  %tmp5 = add nsw i32 %tmp4, 18117  store i32 %tmp5, ptr %tmp3, align 48118  ret void8119}8120 8121; The most canonical variant8122define i32 @c0_i32(i32 %arg) nounwind {8123; X86-NOBMI-LABEL: c0_i32:8124; X86-NOBMI:       # %bb.0:8125; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %eax8126; X86-NOBMI-NEXT:    shrl $19, %eax8127; X86-NOBMI-NEXT:    andl $1023, %eax # imm = 0x3FF8128; X86-NOBMI-NEXT:    retl8129;8130; X86-BMINOTBM-LABEL: c0_i32:8131; X86-BMINOTBM:       # %bb.0:8132; X86-BMINOTBM-NEXT:    movl $2579, %eax # imm = 0xA138133; X86-BMINOTBM-NEXT:    bextrl %eax, {{[0-9]+}}(%esp), %eax8134; X86-BMINOTBM-NEXT:    retl8135;8136; X86-BMITBM-LABEL: c0_i32:8137; X86-BMITBM:       # %bb.0:8138; X86-BMITBM-NEXT:    bextrl $2579, {{[0-9]+}}(%esp), %eax # imm = 0xA138139; X86-BMITBM-NEXT:    retl8140;8141; X64-NOBMI-LABEL: c0_i32:8142; X64-NOBMI:       # %bb.0:8143; X64-NOBMI-NEXT:    movl %edi, %eax8144; X64-NOBMI-NEXT:    shrl $19, %eax8145; X64-NOBMI-NEXT:    andl $1023, %eax # imm = 0x3FF8146; X64-NOBMI-NEXT:    retq8147;8148; X64-BMINOTBM-LABEL: c0_i32:8149; X64-BMINOTBM:       # %bb.0:8150; X64-BMINOTBM-NEXT:    movl $2579, %eax # imm = 0xA138151; X64-BMINOTBM-NEXT:    bextrl %eax, %edi, %eax8152; X64-BMINOTBM-NEXT:    retq8153;8154; X64-BMITBM-LABEL: c0_i32:8155; X64-BMITBM:       # %bb.0:8156; X64-BMITBM-NEXT:    bextrl $2579, %edi, %eax # imm = 0xA138157; X64-BMITBM-NEXT:    retq8158  %tmp0 = lshr i32 %arg, 198159  %tmp1 = and i32 %tmp0, 10238160  ret i32 %tmp18161}8162 8163; Should be still fine, but the mask is shifted8164define i32 @c1_i32(i32 %arg) nounwind {8165; X86-LABEL: c1_i32:8166; X86:       # %bb.0:8167; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax8168; X86-NEXT:    shrl $19, %eax8169; X86-NEXT:    andl $4092, %eax # imm = 0xFFC8170; X86-NEXT:    retl8171;8172; X64-LABEL: c1_i32:8173; X64:       # %bb.0:8174; X64-NEXT:    movl %edi, %eax8175; X64-NEXT:    shrl $19, %eax8176; X64-NEXT:    andl $4092, %eax # imm = 0xFFC8177; X64-NEXT:    retq8178  %tmp0 = lshr i32 %arg, 198179  %tmp1 = and i32 %tmp0, 40928180  ret i32 %tmp18181}8182 8183; Should be still fine, but the result is shifted left afterwards8184define i32 @c2_i32(i32 %arg) nounwind {8185; X86-LABEL: c2_i32:8186; X86:       # %bb.0:8187; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax8188; X86-NEXT:    shrl $17, %eax8189; X86-NEXT:    andl $4092, %eax # imm = 0xFFC8190; X86-NEXT:    retl8191;8192; X64-LABEL: c2_i32:8193; X64:       # %bb.0:8194; X64-NEXT:    movl %edi, %eax8195; X64-NEXT:    shrl $17, %eax8196; X64-NEXT:    andl $4092, %eax # imm = 0xFFC8197; X64-NEXT:    retq8198  %tmp0 = lshr i32 %arg, 198199  %tmp1 = and i32 %tmp0, 10238200  %tmp2 = shl i32 %tmp1, 28201  ret i32 %tmp28202}8203 8204; The mask covers newly shifted-in bit8205define i32 @c4_i32_bad(i32 %arg) nounwind {8206; X86-LABEL: c4_i32_bad:8207; X86:       # %bb.0:8208; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax8209; X86-NEXT:    shrl $19, %eax8210; X86-NEXT:    andl $-2, %eax8211; X86-NEXT:    retl8212;8213; X64-LABEL: c4_i32_bad:8214; X64:       # %bb.0:8215; X64-NEXT:    movl %edi, %eax8216; X64-NEXT:    shrl $19, %eax8217; X64-NEXT:    andl $-2, %eax8218; X64-NEXT:    retq8219  %tmp0 = lshr i32 %arg, 198220  %tmp1 = and i32 %tmp0, 163828221  ret i32 %tmp18222}8223 8224; i648225 8226; The most canonical variant8227define i64 @c0_i64(i64 %arg) nounwind {8228; X86-NOBMI-LABEL: c0_i64:8229; X86-NOBMI:       # %bb.0:8230; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %eax8231; X86-NOBMI-NEXT:    shrl $19, %eax8232; X86-NOBMI-NEXT:    andl $1023, %eax # imm = 0x3FF8233; X86-NOBMI-NEXT:    xorl %edx, %edx8234; X86-NOBMI-NEXT:    retl8235;8236; X86-BMINOTBM-LABEL: c0_i64:8237; X86-BMINOTBM:       # %bb.0:8238; X86-BMINOTBM-NEXT:    movl $2579, %eax # imm = 0xA138239; X86-BMINOTBM-NEXT:    bextrl %eax, {{[0-9]+}}(%esp), %eax8240; X86-BMINOTBM-NEXT:    xorl %edx, %edx8241; X86-BMINOTBM-NEXT:    retl8242;8243; X86-BMITBM-LABEL: c0_i64:8244; X86-BMITBM:       # %bb.0:8245; X86-BMITBM-NEXT:    bextrl $2579, {{[0-9]+}}(%esp), %eax # imm = 0xA138246; X86-BMITBM-NEXT:    xorl %edx, %edx8247; X86-BMITBM-NEXT:    retl8248;8249; X64-NOBMI-LABEL: c0_i64:8250; X64-NOBMI:       # %bb.0:8251; X64-NOBMI-NEXT:    movq %rdi, %rax8252; X64-NOBMI-NEXT:    shrq $51, %rax8253; X64-NOBMI-NEXT:    andl $1023, %eax # imm = 0x3FF8254; X64-NOBMI-NEXT:    retq8255;8256; X64-BMINOTBM-LABEL: c0_i64:8257; X64-BMINOTBM:       # %bb.0:8258; X64-BMINOTBM-NEXT:    movl $2611, %eax # imm = 0xA338259; X64-BMINOTBM-NEXT:    bextrq %rax, %rdi, %rax8260; X64-BMINOTBM-NEXT:    retq8261;8262; X64-BMITBM-LABEL: c0_i64:8263; X64-BMITBM:       # %bb.0:8264; X64-BMITBM-NEXT:    bextrq $2611, %rdi, %rax # imm = 0xA338265; X64-BMITBM-NEXT:    retq8266  %tmp0 = lshr i64 %arg, 518267  %tmp1 = and i64 %tmp0, 10238268  ret i64 %tmp18269}8270 8271; Should be still fine, but the mask is shifted8272define i64 @c1_i64(i64 %arg) nounwind {8273; X86-LABEL: c1_i64:8274; X86:       # %bb.0:8275; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax8276; X86-NEXT:    shrl $19, %eax8277; X86-NEXT:    andl $4092, %eax # imm = 0xFFC8278; X86-NEXT:    xorl %edx, %edx8279; X86-NEXT:    retl8280;8281; X64-LABEL: c1_i64:8282; X64:       # %bb.0:8283; X64-NEXT:    movq %rdi, %rax8284; X64-NEXT:    shrq $51, %rax8285; X64-NEXT:    andl $4092, %eax # imm = 0xFFC8286; X64-NEXT:    retq8287  %tmp0 = lshr i64 %arg, 518288  %tmp1 = and i64 %tmp0, 40928289  ret i64 %tmp18290}8291 8292; Should be still fine, but the result is shifted left afterwards8293define i64 @c2_i64(i64 %arg) nounwind {8294; X86-LABEL: c2_i64:8295; X86:       # %bb.0:8296; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax8297; X86-NEXT:    shrl $17, %eax8298; X86-NEXT:    andl $4092, %eax # imm = 0xFFC8299; X86-NEXT:    xorl %edx, %edx8300; X86-NEXT:    retl8301;8302; X64-LABEL: c2_i64:8303; X64:       # %bb.0:8304; X64-NEXT:    movq %rdi, %rax8305; X64-NEXT:    shrq $49, %rax8306; X64-NEXT:    andl $4092, %eax # imm = 0xFFC8307; X64-NEXT:    retq8308  %tmp0 = lshr i64 %arg, 518309  %tmp1 = and i64 %tmp0, 10238310  %tmp2 = shl i64 %tmp1, 28311  ret i64 %tmp28312}8313 8314; The mask covers newly shifted-in bit8315define i64 @c4_i64_bad(i64 %arg) nounwind {8316; X86-LABEL: c4_i64_bad:8317; X86:       # %bb.0:8318; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax8319; X86-NEXT:    shrl $19, %eax8320; X86-NEXT:    andl $-2, %eax8321; X86-NEXT:    xorl %edx, %edx8322; X86-NEXT:    retl8323;8324; X64-LABEL: c4_i64_bad:8325; X64:       # %bb.0:8326; X64-NEXT:    movq %rdi, %rax8327; X64-NEXT:    shrq $51, %rax8328; X64-NEXT:    andl $-2, %eax8329; X64-NEXT:    retq8330  %tmp0 = lshr i64 %arg, 518331  %tmp1 = and i64 %tmp0, 163828332  ret i64 %tmp18333}8334 8335; ---------------------------------------------------------------------------- ;8336; Constant, storing the result afterwards.8337; ---------------------------------------------------------------------------- ;8338 8339; i328340 8341; The most canonical variant8342define void @c5_i32(i32 %arg, ptr %ptr) nounwind {8343; X86-NOBMI-LABEL: c5_i32:8344; X86-NOBMI:       # %bb.0:8345; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %eax8346; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %ecx8347; X86-NOBMI-NEXT:    shrl $19, %ecx8348; X86-NOBMI-NEXT:    andl $1023, %ecx # imm = 0x3FF8349; X86-NOBMI-NEXT:    movl %ecx, (%eax)8350; X86-NOBMI-NEXT:    retl8351;8352; X86-BMINOTBM-LABEL: c5_i32:8353; X86-BMINOTBM:       # %bb.0:8354; X86-BMINOTBM-NEXT:    movl {{[0-9]+}}(%esp), %eax8355; X86-BMINOTBM-NEXT:    movl $2579, %ecx # imm = 0xA138356; X86-BMINOTBM-NEXT:    bextrl %ecx, {{[0-9]+}}(%esp), %ecx8357; X86-BMINOTBM-NEXT:    movl %ecx, (%eax)8358; X86-BMINOTBM-NEXT:    retl8359;8360; X86-BMITBM-LABEL: c5_i32:8361; X86-BMITBM:       # %bb.0:8362; X86-BMITBM-NEXT:    movl {{[0-9]+}}(%esp), %eax8363; X86-BMITBM-NEXT:    bextrl $2579, {{[0-9]+}}(%esp), %ecx # imm = 0xA138364; X86-BMITBM-NEXT:    movl %ecx, (%eax)8365; X86-BMITBM-NEXT:    retl8366;8367; X64-NOBMI-LABEL: c5_i32:8368; X64-NOBMI:       # %bb.0:8369; X64-NOBMI-NEXT:    shrl $19, %edi8370; X64-NOBMI-NEXT:    andl $1023, %edi # imm = 0x3FF8371; X64-NOBMI-NEXT:    movl %edi, (%rsi)8372; X64-NOBMI-NEXT:    retq8373;8374; X64-BMINOTBM-LABEL: c5_i32:8375; X64-BMINOTBM:       # %bb.0:8376; X64-BMINOTBM-NEXT:    movl $2579, %eax # imm = 0xA138377; X64-BMINOTBM-NEXT:    bextrl %eax, %edi, %eax8378; X64-BMINOTBM-NEXT:    movl %eax, (%rsi)8379; X64-BMINOTBM-NEXT:    retq8380;8381; X64-BMITBM-LABEL: c5_i32:8382; X64-BMITBM:       # %bb.0:8383; X64-BMITBM-NEXT:    bextrl $2579, %edi, %eax # imm = 0xA138384; X64-BMITBM-NEXT:    movl %eax, (%rsi)8385; X64-BMITBM-NEXT:    retq8386  %tmp0 = lshr i32 %arg, 198387  %tmp1 = and i32 %tmp0, 10238388  store i32 %tmp1, ptr %ptr8389  ret void8390}8391 8392; Should be still fine, but the mask is shifted8393define void @c6_i32(i32 %arg, ptr %ptr) nounwind {8394; X86-NOBMI-LABEL: c6_i32:8395; X86-NOBMI:       # %bb.0:8396; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %eax8397; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %ecx8398; X86-NOBMI-NEXT:    shrl $19, %ecx8399; X86-NOBMI-NEXT:    andl $4095, %ecx # imm = 0xFFF8400; X86-NOBMI-NEXT:    movl %ecx, (%eax)8401; X86-NOBMI-NEXT:    retl8402;8403; X86-BMINOTBM-LABEL: c6_i32:8404; X86-BMINOTBM:       # %bb.0:8405; X86-BMINOTBM-NEXT:    movl {{[0-9]+}}(%esp), %eax8406; X86-BMINOTBM-NEXT:    movl $3091, %ecx # imm = 0xC138407; X86-BMINOTBM-NEXT:    bextrl %ecx, {{[0-9]+}}(%esp), %ecx8408; X86-BMINOTBM-NEXT:    movl %ecx, (%eax)8409; X86-BMINOTBM-NEXT:    retl8410;8411; X86-BMITBM-LABEL: c6_i32:8412; X86-BMITBM:       # %bb.0:8413; X86-BMITBM-NEXT:    movl {{[0-9]+}}(%esp), %eax8414; X86-BMITBM-NEXT:    bextrl $3091, {{[0-9]+}}(%esp), %ecx # imm = 0xC138415; X86-BMITBM-NEXT:    movl %ecx, (%eax)8416; X86-BMITBM-NEXT:    retl8417;8418; X64-NOBMI-LABEL: c6_i32:8419; X64-NOBMI:       # %bb.0:8420; X64-NOBMI-NEXT:    shrl $19, %edi8421; X64-NOBMI-NEXT:    andl $4095, %edi # imm = 0xFFF8422; X64-NOBMI-NEXT:    movl %edi, (%rsi)8423; X64-NOBMI-NEXT:    retq8424;8425; X64-BMINOTBM-LABEL: c6_i32:8426; X64-BMINOTBM:       # %bb.0:8427; X64-BMINOTBM-NEXT:    movl $3091, %eax # imm = 0xC138428; X64-BMINOTBM-NEXT:    bextrl %eax, %edi, %eax8429; X64-BMINOTBM-NEXT:    movl %eax, (%rsi)8430; X64-BMINOTBM-NEXT:    retq8431;8432; X64-BMITBM-LABEL: c6_i32:8433; X64-BMITBM:       # %bb.0:8434; X64-BMITBM-NEXT:    bextrl $3091, %edi, %eax # imm = 0xC138435; X64-BMITBM-NEXT:    movl %eax, (%rsi)8436; X64-BMITBM-NEXT:    retq8437  %tmp0 = lshr i32 %arg, 198438  %tmp1 = and i32 %tmp0, 40958439  store i32 %tmp1, ptr %ptr8440  ret void8441}8442 8443; Should be still fine, but the result is shifted left afterwards8444define void @c7_i32(i32 %arg, ptr %ptr) nounwind {8445; X86-LABEL: c7_i32:8446; X86:       # %bb.0:8447; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax8448; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx8449; X86-NEXT:    shrl $17, %ecx8450; X86-NEXT:    andl $4092, %ecx # imm = 0xFFC8451; X86-NEXT:    movl %ecx, (%eax)8452; X86-NEXT:    retl8453;8454; X64-LABEL: c7_i32:8455; X64:       # %bb.0:8456; X64-NEXT:    shrl $17, %edi8457; X64-NEXT:    andl $4092, %edi # imm = 0xFFC8458; X64-NEXT:    movl %edi, (%rsi)8459; X64-NEXT:    retq8460  %tmp0 = lshr i32 %arg, 198461  %tmp1 = and i32 %tmp0, 10238462  %tmp2 = shl i32 %tmp1, 28463  store i32 %tmp2, ptr %ptr8464  ret void8465}8466 8467; i648468 8469; The most canonical variant8470define void @c5_i64(i64 %arg, ptr %ptr) nounwind {8471; X86-NOBMI-LABEL: c5_i64:8472; X86-NOBMI:       # %bb.0:8473; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %eax8474; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %ecx8475; X86-NOBMI-NEXT:    shrl $19, %ecx8476; X86-NOBMI-NEXT:    andl $1023, %ecx # imm = 0x3FF8477; X86-NOBMI-NEXT:    movl %ecx, (%eax)8478; X86-NOBMI-NEXT:    movl $0, 4(%eax)8479; X86-NOBMI-NEXT:    retl8480;8481; X86-BMINOTBM-LABEL: c5_i64:8482; X86-BMINOTBM:       # %bb.0:8483; X86-BMINOTBM-NEXT:    movl {{[0-9]+}}(%esp), %eax8484; X86-BMINOTBM-NEXT:    movl $2579, %ecx # imm = 0xA138485; X86-BMINOTBM-NEXT:    bextrl %ecx, {{[0-9]+}}(%esp), %ecx8486; X86-BMINOTBM-NEXT:    movl %ecx, (%eax)8487; X86-BMINOTBM-NEXT:    movl $0, 4(%eax)8488; X86-BMINOTBM-NEXT:    retl8489;8490; X86-BMITBM-LABEL: c5_i64:8491; X86-BMITBM:       # %bb.0:8492; X86-BMITBM-NEXT:    movl {{[0-9]+}}(%esp), %eax8493; X86-BMITBM-NEXT:    bextrl $2579, {{[0-9]+}}(%esp), %ecx # imm = 0xA138494; X86-BMITBM-NEXT:    movl %ecx, (%eax)8495; X86-BMITBM-NEXT:    movl $0, 4(%eax)8496; X86-BMITBM-NEXT:    retl8497;8498; X64-NOBMI-LABEL: c5_i64:8499; X64-NOBMI:       # %bb.0:8500; X64-NOBMI-NEXT:    shrq $51, %rdi8501; X64-NOBMI-NEXT:    andl $1023, %edi # imm = 0x3FF8502; X64-NOBMI-NEXT:    movq %rdi, (%rsi)8503; X64-NOBMI-NEXT:    retq8504;8505; X64-BMINOTBM-LABEL: c5_i64:8506; X64-BMINOTBM:       # %bb.0:8507; X64-BMINOTBM-NEXT:    movl $2611, %eax # imm = 0xA338508; X64-BMINOTBM-NEXT:    bextrq %rax, %rdi, %rax8509; X64-BMINOTBM-NEXT:    movq %rax, (%rsi)8510; X64-BMINOTBM-NEXT:    retq8511;8512; X64-BMITBM-LABEL: c5_i64:8513; X64-BMITBM:       # %bb.0:8514; X64-BMITBM-NEXT:    bextrq $2611, %rdi, %rax # imm = 0xA338515; X64-BMITBM-NEXT:    movq %rax, (%rsi)8516; X64-BMITBM-NEXT:    retq8517  %tmp0 = lshr i64 %arg, 518518  %tmp1 = and i64 %tmp0, 10238519  store i64 %tmp1, ptr %ptr8520  ret void8521}8522 8523; Should be still fine, but the mask is shifted8524define void @c6_i64(i64 %arg, ptr %ptr) nounwind {8525; X86-NOBMI-LABEL: c6_i64:8526; X86-NOBMI:       # %bb.0:8527; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %eax8528; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %ecx8529; X86-NOBMI-NEXT:    shrl $19, %ecx8530; X86-NOBMI-NEXT:    andl $4095, %ecx # imm = 0xFFF8531; X86-NOBMI-NEXT:    movl %ecx, (%eax)8532; X86-NOBMI-NEXT:    movl $0, 4(%eax)8533; X86-NOBMI-NEXT:    retl8534;8535; X86-BMINOTBM-LABEL: c6_i64:8536; X86-BMINOTBM:       # %bb.0:8537; X86-BMINOTBM-NEXT:    movl {{[0-9]+}}(%esp), %eax8538; X86-BMINOTBM-NEXT:    movl $3091, %ecx # imm = 0xC138539; X86-BMINOTBM-NEXT:    bextrl %ecx, {{[0-9]+}}(%esp), %ecx8540; X86-BMINOTBM-NEXT:    movl %ecx, (%eax)8541; X86-BMINOTBM-NEXT:    movl $0, 4(%eax)8542; X86-BMINOTBM-NEXT:    retl8543;8544; X86-BMITBM-LABEL: c6_i64:8545; X86-BMITBM:       # %bb.0:8546; X86-BMITBM-NEXT:    movl {{[0-9]+}}(%esp), %eax8547; X86-BMITBM-NEXT:    bextrl $3091, {{[0-9]+}}(%esp), %ecx # imm = 0xC138548; X86-BMITBM-NEXT:    movl %ecx, (%eax)8549; X86-BMITBM-NEXT:    movl $0, 4(%eax)8550; X86-BMITBM-NEXT:    retl8551;8552; X64-NOBMI-LABEL: c6_i64:8553; X64-NOBMI:       # %bb.0:8554; X64-NOBMI-NEXT:    shrq $51, %rdi8555; X64-NOBMI-NEXT:    andl $4095, %edi # imm = 0xFFF8556; X64-NOBMI-NEXT:    movq %rdi, (%rsi)8557; X64-NOBMI-NEXT:    retq8558;8559; X64-BMINOTBM-LABEL: c6_i64:8560; X64-BMINOTBM:       # %bb.0:8561; X64-BMINOTBM-NEXT:    movl $3123, %eax # imm = 0xC338562; X64-BMINOTBM-NEXT:    bextrq %rax, %rdi, %rax8563; X64-BMINOTBM-NEXT:    movq %rax, (%rsi)8564; X64-BMINOTBM-NEXT:    retq8565;8566; X64-BMITBM-LABEL: c6_i64:8567; X64-BMITBM:       # %bb.0:8568; X64-BMITBM-NEXT:    bextrq $3123, %rdi, %rax # imm = 0xC338569; X64-BMITBM-NEXT:    movq %rax, (%rsi)8570; X64-BMITBM-NEXT:    retq8571  %tmp0 = lshr i64 %arg, 518572  %tmp1 = and i64 %tmp0, 40958573  store i64 %tmp1, ptr %ptr8574  ret void8575}8576 8577; Should be still fine, but the result is shifted left afterwards8578define void @c7_i64(i64 %arg, ptr %ptr) nounwind {8579; X86-LABEL: c7_i64:8580; X86:       # %bb.0:8581; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax8582; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx8583; X86-NEXT:    shrl $17, %ecx8584; X86-NEXT:    andl $4092, %ecx # imm = 0xFFC8585; X86-NEXT:    movl %ecx, (%eax)8586; X86-NEXT:    movl $0, 4(%eax)8587; X86-NEXT:    retl8588;8589; X64-LABEL: c7_i64:8590; X64:       # %bb.0:8591; X64-NEXT:    shrq $49, %rdi8592; X64-NEXT:    andl $4092, %edi # imm = 0xFFC8593; X64-NEXT:    movq %rdi, (%rsi)8594; X64-NEXT:    retq8595  %tmp0 = lshr i64 %arg, 518596  %tmp1 = and i64 %tmp0, 10238597  %tmp2 = shl i64 %tmp1, 28598  store i64 %tmp2, ptr %ptr8599  ret void8600}8601 8602define i64 @c8_i64(i64 %arg, ptr %ptr) nounwind {8603; X86-LABEL: c8_i64:8604; X86:       # %bb.0:8605; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx8606; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax8607; X86-NEXT:    movl (%eax), %eax8608; X86-NEXT:    shrl $19, %eax8609; X86-NEXT:    andl $4092, %eax # imm = 0xFFC8610; X86-NEXT:    addl {{[0-9]+}}(%esp), %eax8611; X86-NEXT:    adcl $0, %edx8612; X86-NEXT:    retl8613;8614; X64-NOBMI-LABEL: c8_i64:8615; X64-NOBMI:       # %bb.0:8616; X64-NOBMI-NEXT:    movl (%rsi), %eax8617; X64-NOBMI-NEXT:    shrl $19, %eax8618; X64-NOBMI-NEXT:    andl $4092, %eax # imm = 0xFFC8619; X64-NOBMI-NEXT:    addq %rdi, %rax8620; X64-NOBMI-NEXT:    retq8621;8622; X64-BMINOTBM-LABEL: c8_i64:8623; X64-BMINOTBM:       # %bb.0:8624; X64-BMINOTBM-NEXT:    movl $2581, %eax # imm = 0xA158625; X64-BMINOTBM-NEXT:    bextrl %eax, (%rsi), %eax8626; X64-BMINOTBM-NEXT:    leaq (%rdi,%rax,4), %rax8627; X64-BMINOTBM-NEXT:    retq8628;8629; X64-BMITBM-LABEL: c8_i64:8630; X64-BMITBM:       # %bb.0:8631; X64-BMITBM-NEXT:    bextrl $2581, (%rsi), %eax # imm = 0xA158632; X64-BMITBM-NEXT:    leaq (%rdi,%rax,4), %rax8633; X64-BMITBM-NEXT:    retq8634  %tmp = load i32, ptr %ptr, align 88635  %tmp1 = lshr i32 %tmp, 198636  %tmp2 = and i32 %tmp1, 40928637  %tmp3 = zext i32 %tmp2 to i648638  %tmp4 = add i64 %arg, %tmp38639  ret i64 %tmp48640}8641