brintos

brintos / llvm-project-archived public Read only

0
0
Text · 59.0 KiB · 49ea2d0 Raw
1730 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 < %s | FileCheck %s --check-prefixes=X86,X86-NOBMI23; RUN: llc -mtriple=i686-unknown-linux-gnu -mattr=+bmi,-tbm,-bmi2 < %s | FileCheck %s --check-prefixes=X86,X86-NOBMI24; RUN: llc -mtriple=i686-unknown-linux-gnu -mattr=+bmi,+tbm,-bmi2 < %s | FileCheck %s --check-prefixes=X86,X86-NOBMI25; RUN: llc -mtriple=i686-unknown-linux-gnu -mattr=+bmi,+tbm,+bmi2 < %s | FileCheck %s --check-prefixes=X86,X86-BMI26; RUN: llc -mtriple=i686-unknown-linux-gnu -mattr=+bmi,-tbm,+bmi2 < %s | FileCheck %s --check-prefixes=X86,X86-BMI27; RUN: llc -mtriple=x86_64-unknown-linux-gnu -mattr=-bmi,-tbm,-bmi2 < %s | FileCheck %s --check-prefixes=X64,X64-NOBMI28; RUN: llc -mtriple=x86_64-unknown-linux-gnu -mattr=+bmi,-tbm,-bmi2 < %s | FileCheck %s --check-prefixes=X64,X64-NOBMI29; RUN: llc -mtriple=x86_64-unknown-linux-gnu -mattr=+bmi,+tbm,-bmi2 < %s | FileCheck %s --check-prefixes=X64,X64-NOBMI210; RUN: llc -mtriple=x86_64-unknown-linux-gnu -mattr=+bmi,+tbm,+bmi2 < %s | FileCheck %s --check-prefixes=X64,X64-BMI211; RUN: llc -mtriple=x86_64-unknown-linux-gnu -mattr=+bmi,-tbm,+bmi2 < %s | FileCheck %s --check-prefixes=X64,X64-BMI212 13; Patterns:14;    c) x &  (-1 << y)15;   ic) x &  (-1 << (32 - y))16;    d) x >> y << y17;   id) x >> (32 - y) << (32 - y)18; are equivalent, but we prefer the second variant if we have BMI2.19 20; ---------------------------------------------------------------------------- ;21; Pattern c.22; ---------------------------------------------------------------------------- ;23 24; 8-bit25 26define i8 @clear_lowbits8_c0(i8 %val, i8 %numlowbits) nounwind {27; X86-LABEL: clear_lowbits8_c0:28; X86:       # %bb.0:29; X86-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx30; X86-NEXT:    movzbl {{[0-9]+}}(%esp), %eax31; X86-NEXT:    shrb %cl, %al32; X86-NEXT:    shlb %cl, %al33; X86-NEXT:    retl34;35; X64-LABEL: clear_lowbits8_c0:36; X64:       # %bb.0:37; X64-NEXT:    movl %esi, %ecx38; X64-NEXT:    movl %edi, %eax39; X64-NEXT:    shrb %cl, %al40; X64-NEXT:    # kill: def $cl killed $cl killed $ecx41; X64-NEXT:    shlb %cl, %al42; X64-NEXT:    # kill: def $al killed $al killed $eax43; X64-NEXT:    retq44  %mask = shl i8 -1, %numlowbits45  %masked = and i8 %mask, %val46  ret i8 %masked47}48 49define i8 @clear_lowbits8_c2_load(ptr %w, i8 %numlowbits) nounwind {50; X86-LABEL: clear_lowbits8_c2_load:51; X86:       # %bb.0:52; X86-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx53; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax54; X86-NEXT:    movzbl (%eax), %eax55; X86-NEXT:    shrb %cl, %al56; X86-NEXT:    shlb %cl, %al57; X86-NEXT:    retl58;59; X64-LABEL: clear_lowbits8_c2_load:60; X64:       # %bb.0:61; X64-NEXT:    movl %esi, %ecx62; X64-NEXT:    movzbl (%rdi), %eax63; X64-NEXT:    shrb %cl, %al64; X64-NEXT:    # kill: def $cl killed $cl killed $ecx65; X64-NEXT:    shlb %cl, %al66; X64-NEXT:    retq67  %val = load i8, ptr %w68  %mask = shl i8 -1, %numlowbits69  %masked = and i8 %mask, %val70  ret i8 %masked71}72 73define i8 @clear_lowbits8_c4_commutative(i8 %val, i8 %numlowbits) nounwind {74; X86-LABEL: clear_lowbits8_c4_commutative:75; X86:       # %bb.0:76; X86-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx77; X86-NEXT:    movzbl {{[0-9]+}}(%esp), %eax78; X86-NEXT:    shrb %cl, %al79; X86-NEXT:    shlb %cl, %al80; X86-NEXT:    retl81;82; X64-LABEL: clear_lowbits8_c4_commutative:83; X64:       # %bb.0:84; X64-NEXT:    movl %esi, %ecx85; X64-NEXT:    movl %edi, %eax86; X64-NEXT:    shrb %cl, %al87; X64-NEXT:    # kill: def $cl killed $cl killed $ecx88; X64-NEXT:    shlb %cl, %al89; X64-NEXT:    # kill: def $al killed $al killed $eax90; X64-NEXT:    retq91  %mask = shl i8 -1, %numlowbits92  %masked = and i8 %val, %mask ; swapped order93  ret i8 %masked94}95 96; 16-bit97 98define i16 @clear_lowbits16_c0(i16 %val, i16 %numlowbits) nounwind {99; X86-NOBMI2-LABEL: clear_lowbits16_c0:100; X86-NOBMI2:       # %bb.0:101; X86-NOBMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx102; X86-NOBMI2-NEXT:    movzwl {{[0-9]+}}(%esp), %eax103; X86-NOBMI2-NEXT:    shrl %cl, %eax104; X86-NOBMI2-NEXT:    shll %cl, %eax105; X86-NOBMI2-NEXT:    # kill: def $ax killed $ax killed $eax106; X86-NOBMI2-NEXT:    retl107;108; X86-BMI2-LABEL: clear_lowbits16_c0:109; X86-BMI2:       # %bb.0:110; X86-BMI2-NEXT:    movzwl {{[0-9]+}}(%esp), %eax111; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx112; X86-BMI2-NEXT:    shrxl %ecx, %eax, %eax113; X86-BMI2-NEXT:    shlxl %ecx, %eax, %eax114; X86-BMI2-NEXT:    # kill: def $ax killed $ax killed $eax115; X86-BMI2-NEXT:    retl116;117; X64-NOBMI2-LABEL: clear_lowbits16_c0:118; X64-NOBMI2:       # %bb.0:119; X64-NOBMI2-NEXT:    movl %esi, %ecx120; X64-NOBMI2-NEXT:    movzwl %di, %eax121; X64-NOBMI2-NEXT:    shrl %cl, %eax122; X64-NOBMI2-NEXT:    # kill: def $cl killed $cl killed $ecx123; X64-NOBMI2-NEXT:    shll %cl, %eax124; X64-NOBMI2-NEXT:    # kill: def $ax killed $ax killed $eax125; X64-NOBMI2-NEXT:    retq126;127; X64-BMI2-LABEL: clear_lowbits16_c0:128; X64-BMI2:       # %bb.0:129; X64-BMI2-NEXT:    movzwl %di, %eax130; X64-BMI2-NEXT:    shrxl %esi, %eax, %eax131; X64-BMI2-NEXT:    shlxl %esi, %eax, %eax132; X64-BMI2-NEXT:    # kill: def $ax killed $ax killed $eax133; X64-BMI2-NEXT:    retq134  %mask = shl i16 -1, %numlowbits135  %masked = and i16 %mask, %val136  ret i16 %masked137}138 139define i16 @clear_lowbits16_c1_indexzext(i16 %val, i8 %numlowbits) nounwind {140; X86-NOBMI2-LABEL: clear_lowbits16_c1_indexzext:141; X86-NOBMI2:       # %bb.0:142; X86-NOBMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx143; X86-NOBMI2-NEXT:    movzwl {{[0-9]+}}(%esp), %eax144; X86-NOBMI2-NEXT:    shrl %cl, %eax145; X86-NOBMI2-NEXT:    shll %cl, %eax146; X86-NOBMI2-NEXT:    # kill: def $ax killed $ax killed $eax147; X86-NOBMI2-NEXT:    retl148;149; X86-BMI2-LABEL: clear_lowbits16_c1_indexzext:150; X86-BMI2:       # %bb.0:151; X86-BMI2-NEXT:    movzwl {{[0-9]+}}(%esp), %eax152; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx153; X86-BMI2-NEXT:    shrxl %ecx, %eax, %eax154; X86-BMI2-NEXT:    shlxl %ecx, %eax, %eax155; X86-BMI2-NEXT:    # kill: def $ax killed $ax killed $eax156; X86-BMI2-NEXT:    retl157;158; X64-NOBMI2-LABEL: clear_lowbits16_c1_indexzext:159; X64-NOBMI2:       # %bb.0:160; X64-NOBMI2-NEXT:    movl %esi, %ecx161; X64-NOBMI2-NEXT:    movzwl %di, %eax162; X64-NOBMI2-NEXT:    shrl %cl, %eax163; X64-NOBMI2-NEXT:    # kill: def $cl killed $cl killed $ecx164; X64-NOBMI2-NEXT:    shll %cl, %eax165; X64-NOBMI2-NEXT:    # kill: def $ax killed $ax killed $eax166; X64-NOBMI2-NEXT:    retq167;168; X64-BMI2-LABEL: clear_lowbits16_c1_indexzext:169; X64-BMI2:       # %bb.0:170; X64-BMI2-NEXT:    movzwl %di, %eax171; X64-BMI2-NEXT:    shrxl %esi, %eax, %eax172; X64-BMI2-NEXT:    shlxl %esi, %eax, %eax173; X64-BMI2-NEXT:    # kill: def $ax killed $ax killed $eax174; X64-BMI2-NEXT:    retq175  %sh_prom = zext i8 %numlowbits to i16176  %mask = shl i16 -1, %sh_prom177  %masked = and i16 %mask, %val178  ret i16 %masked179}180 181define i16 @clear_lowbits16_c2_load(ptr %w, i16 %numlowbits) nounwind {182; X86-NOBMI2-LABEL: clear_lowbits16_c2_load:183; X86-NOBMI2:       # %bb.0:184; X86-NOBMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx185; X86-NOBMI2-NEXT:    movl {{[0-9]+}}(%esp), %eax186; X86-NOBMI2-NEXT:    movzwl (%eax), %eax187; X86-NOBMI2-NEXT:    shrl %cl, %eax188; X86-NOBMI2-NEXT:    shll %cl, %eax189; X86-NOBMI2-NEXT:    # kill: def $ax killed $ax killed $eax190; X86-NOBMI2-NEXT:    retl191;192; X86-BMI2-LABEL: clear_lowbits16_c2_load:193; X86-BMI2:       # %bb.0:194; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %eax195; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %ecx196; X86-BMI2-NEXT:    movzwl (%ecx), %ecx197; X86-BMI2-NEXT:    shrxl %eax, %ecx, %ecx198; X86-BMI2-NEXT:    shlxl %eax, %ecx, %eax199; X86-BMI2-NEXT:    # kill: def $ax killed $ax killed $eax200; X86-BMI2-NEXT:    retl201;202; X64-NOBMI2-LABEL: clear_lowbits16_c2_load:203; X64-NOBMI2:       # %bb.0:204; X64-NOBMI2-NEXT:    movl %esi, %ecx205; X64-NOBMI2-NEXT:    movzwl (%rdi), %eax206; X64-NOBMI2-NEXT:    shrl %cl, %eax207; X64-NOBMI2-NEXT:    # kill: def $cl killed $cl killed $ecx208; X64-NOBMI2-NEXT:    shll %cl, %eax209; X64-NOBMI2-NEXT:    # kill: def $ax killed $ax killed $eax210; X64-NOBMI2-NEXT:    retq211;212; X64-BMI2-LABEL: clear_lowbits16_c2_load:213; X64-BMI2:       # %bb.0:214; X64-BMI2-NEXT:    movzwl (%rdi), %eax215; X64-BMI2-NEXT:    shrxl %esi, %eax, %eax216; X64-BMI2-NEXT:    shlxl %esi, %eax, %eax217; X64-BMI2-NEXT:    # kill: def $ax killed $ax killed $eax218; X64-BMI2-NEXT:    retq219  %val = load i16, ptr %w220  %mask = shl i16 -1, %numlowbits221  %masked = and i16 %mask, %val222  ret i16 %masked223}224 225define i16 @clear_lowbits16_c3_load_indexzext(ptr %w, i8 %numlowbits) nounwind {226; X86-NOBMI2-LABEL: clear_lowbits16_c3_load_indexzext:227; X86-NOBMI2:       # %bb.0:228; X86-NOBMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx229; X86-NOBMI2-NEXT:    movl {{[0-9]+}}(%esp), %eax230; X86-NOBMI2-NEXT:    movzwl (%eax), %eax231; X86-NOBMI2-NEXT:    shrl %cl, %eax232; X86-NOBMI2-NEXT:    shll %cl, %eax233; X86-NOBMI2-NEXT:    # kill: def $ax killed $ax killed $eax234; X86-NOBMI2-NEXT:    retl235;236; X86-BMI2-LABEL: clear_lowbits16_c3_load_indexzext:237; X86-BMI2:       # %bb.0:238; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %eax239; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %ecx240; X86-BMI2-NEXT:    movzwl (%ecx), %ecx241; X86-BMI2-NEXT:    shrxl %eax, %ecx, %ecx242; X86-BMI2-NEXT:    shlxl %eax, %ecx, %eax243; X86-BMI2-NEXT:    # kill: def $ax killed $ax killed $eax244; X86-BMI2-NEXT:    retl245;246; X64-NOBMI2-LABEL: clear_lowbits16_c3_load_indexzext:247; X64-NOBMI2:       # %bb.0:248; X64-NOBMI2-NEXT:    movl %esi, %ecx249; X64-NOBMI2-NEXT:    movzwl (%rdi), %eax250; X64-NOBMI2-NEXT:    shrl %cl, %eax251; X64-NOBMI2-NEXT:    # kill: def $cl killed $cl killed $ecx252; X64-NOBMI2-NEXT:    shll %cl, %eax253; X64-NOBMI2-NEXT:    # kill: def $ax killed $ax killed $eax254; X64-NOBMI2-NEXT:    retq255;256; X64-BMI2-LABEL: clear_lowbits16_c3_load_indexzext:257; X64-BMI2:       # %bb.0:258; X64-BMI2-NEXT:    movzwl (%rdi), %eax259; X64-BMI2-NEXT:    shrxl %esi, %eax, %eax260; X64-BMI2-NEXT:    shlxl %esi, %eax, %eax261; X64-BMI2-NEXT:    # kill: def $ax killed $ax killed $eax262; X64-BMI2-NEXT:    retq263  %val = load i16, ptr %w264  %sh_prom = zext i8 %numlowbits to i16265  %mask = shl i16 -1, %sh_prom266  %masked = and i16 %mask, %val267  ret i16 %masked268}269 270define i16 @clear_lowbits16_c4_commutative(i16 %val, i16 %numlowbits) nounwind {271; X86-NOBMI2-LABEL: clear_lowbits16_c4_commutative:272; X86-NOBMI2:       # %bb.0:273; X86-NOBMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx274; X86-NOBMI2-NEXT:    movzwl {{[0-9]+}}(%esp), %eax275; X86-NOBMI2-NEXT:    shrl %cl, %eax276; X86-NOBMI2-NEXT:    shll %cl, %eax277; X86-NOBMI2-NEXT:    # kill: def $ax killed $ax killed $eax278; X86-NOBMI2-NEXT:    retl279;280; X86-BMI2-LABEL: clear_lowbits16_c4_commutative:281; X86-BMI2:       # %bb.0:282; X86-BMI2-NEXT:    movzwl {{[0-9]+}}(%esp), %eax283; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx284; X86-BMI2-NEXT:    shrxl %ecx, %eax, %eax285; X86-BMI2-NEXT:    shlxl %ecx, %eax, %eax286; X86-BMI2-NEXT:    # kill: def $ax killed $ax killed $eax287; X86-BMI2-NEXT:    retl288;289; X64-NOBMI2-LABEL: clear_lowbits16_c4_commutative:290; X64-NOBMI2:       # %bb.0:291; X64-NOBMI2-NEXT:    movl %esi, %ecx292; X64-NOBMI2-NEXT:    movzwl %di, %eax293; X64-NOBMI2-NEXT:    shrl %cl, %eax294; X64-NOBMI2-NEXT:    # kill: def $cl killed $cl killed $ecx295; X64-NOBMI2-NEXT:    shll %cl, %eax296; X64-NOBMI2-NEXT:    # kill: def $ax killed $ax killed $eax297; X64-NOBMI2-NEXT:    retq298;299; X64-BMI2-LABEL: clear_lowbits16_c4_commutative:300; X64-BMI2:       # %bb.0:301; X64-BMI2-NEXT:    movzwl %di, %eax302; X64-BMI2-NEXT:    shrxl %esi, %eax, %eax303; X64-BMI2-NEXT:    shlxl %esi, %eax, %eax304; X64-BMI2-NEXT:    # kill: def $ax killed $ax killed $eax305; X64-BMI2-NEXT:    retq306  %mask = shl i16 -1, %numlowbits307  %masked = and i16 %val, %mask ; swapped order308  ret i16 %masked309}310 311; 32-bit312 313define i32 @clear_lowbits32_c0(i32 %val, i32 %numlowbits) nounwind {314; X86-NOBMI2-LABEL: clear_lowbits32_c0:315; X86-NOBMI2:       # %bb.0:316; X86-NOBMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx317; X86-NOBMI2-NEXT:    movl {{[0-9]+}}(%esp), %eax318; X86-NOBMI2-NEXT:    shrl %cl, %eax319; X86-NOBMI2-NEXT:    shll %cl, %eax320; X86-NOBMI2-NEXT:    retl321;322; X86-BMI2-LABEL: clear_lowbits32_c0:323; X86-BMI2:       # %bb.0:324; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %eax325; X86-BMI2-NEXT:    shrxl %eax, {{[0-9]+}}(%esp), %ecx326; X86-BMI2-NEXT:    shlxl %eax, %ecx, %eax327; X86-BMI2-NEXT:    retl328;329; X64-NOBMI2-LABEL: clear_lowbits32_c0:330; X64-NOBMI2:       # %bb.0:331; X64-NOBMI2-NEXT:    movl %esi, %ecx332; X64-NOBMI2-NEXT:    movl %edi, %eax333; X64-NOBMI2-NEXT:    shrl %cl, %eax334; X64-NOBMI2-NEXT:    # kill: def $cl killed $cl killed $ecx335; X64-NOBMI2-NEXT:    shll %cl, %eax336; X64-NOBMI2-NEXT:    retq337;338; X64-BMI2-LABEL: clear_lowbits32_c0:339; X64-BMI2:       # %bb.0:340; X64-BMI2-NEXT:    shrxl %esi, %edi, %eax341; X64-BMI2-NEXT:    shlxl %esi, %eax, %eax342; X64-BMI2-NEXT:    retq343  %mask = shl i32 -1, %numlowbits344  %masked = and i32 %mask, %val345  ret i32 %masked346}347 348define i32 @clear_lowbits32_c1_indexzext(i32 %val, i8 %numlowbits) nounwind {349; X86-NOBMI2-LABEL: clear_lowbits32_c1_indexzext:350; X86-NOBMI2:       # %bb.0:351; X86-NOBMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx352; X86-NOBMI2-NEXT:    movl {{[0-9]+}}(%esp), %eax353; X86-NOBMI2-NEXT:    shrl %cl, %eax354; X86-NOBMI2-NEXT:    shll %cl, %eax355; X86-NOBMI2-NEXT:    retl356;357; X86-BMI2-LABEL: clear_lowbits32_c1_indexzext:358; X86-BMI2:       # %bb.0:359; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %eax360; X86-BMI2-NEXT:    shrxl %eax, {{[0-9]+}}(%esp), %ecx361; X86-BMI2-NEXT:    shlxl %eax, %ecx, %eax362; X86-BMI2-NEXT:    retl363;364; X64-NOBMI2-LABEL: clear_lowbits32_c1_indexzext:365; X64-NOBMI2:       # %bb.0:366; X64-NOBMI2-NEXT:    movl %esi, %ecx367; X64-NOBMI2-NEXT:    movl %edi, %eax368; X64-NOBMI2-NEXT:    shrl %cl, %eax369; X64-NOBMI2-NEXT:    # kill: def $cl killed $cl killed $ecx370; X64-NOBMI2-NEXT:    shll %cl, %eax371; X64-NOBMI2-NEXT:    retq372;373; X64-BMI2-LABEL: clear_lowbits32_c1_indexzext:374; X64-BMI2:       # %bb.0:375; X64-BMI2-NEXT:    shrxl %esi, %edi, %eax376; X64-BMI2-NEXT:    shlxl %esi, %eax, %eax377; X64-BMI2-NEXT:    retq378  %sh_prom = zext i8 %numlowbits to i32379  %mask = shl i32 -1, %sh_prom380  %masked = and i32 %mask, %val381  ret i32 %masked382}383 384define i32 @clear_lowbits32_c2_load(ptr %w, i32 %numlowbits) nounwind {385; X86-NOBMI2-LABEL: clear_lowbits32_c2_load:386; X86-NOBMI2:       # %bb.0:387; X86-NOBMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx388; X86-NOBMI2-NEXT:    movl {{[0-9]+}}(%esp), %eax389; X86-NOBMI2-NEXT:    movl (%eax), %eax390; X86-NOBMI2-NEXT:    shrl %cl, %eax391; X86-NOBMI2-NEXT:    shll %cl, %eax392; X86-NOBMI2-NEXT:    retl393;394; X86-BMI2-LABEL: clear_lowbits32_c2_load:395; X86-BMI2:       # %bb.0:396; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %eax397; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx398; X86-BMI2-NEXT:    shrxl %ecx, (%eax), %eax399; X86-BMI2-NEXT:    shlxl %ecx, %eax, %eax400; X86-BMI2-NEXT:    retl401;402; X64-NOBMI2-LABEL: clear_lowbits32_c2_load:403; X64-NOBMI2:       # %bb.0:404; X64-NOBMI2-NEXT:    movl %esi, %ecx405; X64-NOBMI2-NEXT:    movl (%rdi), %eax406; X64-NOBMI2-NEXT:    shrl %cl, %eax407; X64-NOBMI2-NEXT:    # kill: def $cl killed $cl killed $ecx408; X64-NOBMI2-NEXT:    shll %cl, %eax409; X64-NOBMI2-NEXT:    retq410;411; X64-BMI2-LABEL: clear_lowbits32_c2_load:412; X64-BMI2:       # %bb.0:413; X64-BMI2-NEXT:    shrxl %esi, (%rdi), %eax414; X64-BMI2-NEXT:    shlxl %esi, %eax, %eax415; X64-BMI2-NEXT:    retq416  %val = load i32, ptr %w417  %mask = shl i32 -1, %numlowbits418  %masked = and i32 %mask, %val419  ret i32 %masked420}421 422define i32 @clear_lowbits32_c3_load_indexzext(ptr %w, i8 %numlowbits) nounwind {423; X86-NOBMI2-LABEL: clear_lowbits32_c3_load_indexzext:424; X86-NOBMI2:       # %bb.0:425; X86-NOBMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx426; X86-NOBMI2-NEXT:    movl {{[0-9]+}}(%esp), %eax427; X86-NOBMI2-NEXT:    movl (%eax), %eax428; X86-NOBMI2-NEXT:    shrl %cl, %eax429; X86-NOBMI2-NEXT:    shll %cl, %eax430; X86-NOBMI2-NEXT:    retl431;432; X86-BMI2-LABEL: clear_lowbits32_c3_load_indexzext:433; X86-BMI2:       # %bb.0:434; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %eax435; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx436; X86-BMI2-NEXT:    shrxl %ecx, (%eax), %eax437; X86-BMI2-NEXT:    shlxl %ecx, %eax, %eax438; X86-BMI2-NEXT:    retl439;440; X64-NOBMI2-LABEL: clear_lowbits32_c3_load_indexzext:441; X64-NOBMI2:       # %bb.0:442; X64-NOBMI2-NEXT:    movl %esi, %ecx443; X64-NOBMI2-NEXT:    movl (%rdi), %eax444; X64-NOBMI2-NEXT:    shrl %cl, %eax445; X64-NOBMI2-NEXT:    # kill: def $cl killed $cl killed $ecx446; X64-NOBMI2-NEXT:    shll %cl, %eax447; X64-NOBMI2-NEXT:    retq448;449; X64-BMI2-LABEL: clear_lowbits32_c3_load_indexzext:450; X64-BMI2:       # %bb.0:451; X64-BMI2-NEXT:    shrxl %esi, (%rdi), %eax452; X64-BMI2-NEXT:    shlxl %esi, %eax, %eax453; X64-BMI2-NEXT:    retq454  %val = load i32, ptr %w455  %sh_prom = zext i8 %numlowbits to i32456  %mask = shl i32 -1, %sh_prom457  %masked = and i32 %mask, %val458  ret i32 %masked459}460 461define i32 @clear_lowbits32_c4_commutative(i32 %val, i32 %numlowbits) nounwind {462; X86-NOBMI2-LABEL: clear_lowbits32_c4_commutative:463; X86-NOBMI2:       # %bb.0:464; X86-NOBMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx465; X86-NOBMI2-NEXT:    movl {{[0-9]+}}(%esp), %eax466; X86-NOBMI2-NEXT:    shrl %cl, %eax467; X86-NOBMI2-NEXT:    shll %cl, %eax468; X86-NOBMI2-NEXT:    retl469;470; X86-BMI2-LABEL: clear_lowbits32_c4_commutative:471; X86-BMI2:       # %bb.0:472; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %eax473; X86-BMI2-NEXT:    shrxl %eax, {{[0-9]+}}(%esp), %ecx474; X86-BMI2-NEXT:    shlxl %eax, %ecx, %eax475; X86-BMI2-NEXT:    retl476;477; X64-NOBMI2-LABEL: clear_lowbits32_c4_commutative:478; X64-NOBMI2:       # %bb.0:479; X64-NOBMI2-NEXT:    movl %esi, %ecx480; X64-NOBMI2-NEXT:    movl %edi, %eax481; X64-NOBMI2-NEXT:    shrl %cl, %eax482; X64-NOBMI2-NEXT:    # kill: def $cl killed $cl killed $ecx483; X64-NOBMI2-NEXT:    shll %cl, %eax484; X64-NOBMI2-NEXT:    retq485;486; X64-BMI2-LABEL: clear_lowbits32_c4_commutative:487; X64-BMI2:       # %bb.0:488; X64-BMI2-NEXT:    shrxl %esi, %edi, %eax489; X64-BMI2-NEXT:    shlxl %esi, %eax, %eax490; X64-BMI2-NEXT:    retq491  %mask = shl i32 -1, %numlowbits492  %masked = and i32 %val, %mask ; swapped order493  ret i32 %masked494}495 496; 64-bit497 498define i64 @clear_lowbits64_c0(i64 %val, i64 %numlowbits) nounwind {499; X86-NOBMI2-LABEL: clear_lowbits64_c0:500; X86-NOBMI2:       # %bb.0:501; X86-NOBMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx502; X86-NOBMI2-NEXT:    movl $-1, %edx503; X86-NOBMI2-NEXT:    movl $-1, %eax504; X86-NOBMI2-NEXT:    shll %cl, %eax505; X86-NOBMI2-NEXT:    testb $32, %cl506; X86-NOBMI2-NEXT:    je .LBB13_2507; X86-NOBMI2-NEXT:  # %bb.1:508; X86-NOBMI2-NEXT:    movl %eax, %edx509; X86-NOBMI2-NEXT:    xorl %eax, %eax510; X86-NOBMI2-NEXT:  .LBB13_2:511; X86-NOBMI2-NEXT:    andl {{[0-9]+}}(%esp), %eax512; X86-NOBMI2-NEXT:    andl {{[0-9]+}}(%esp), %edx513; X86-NOBMI2-NEXT:    retl514;515; X86-BMI2-LABEL: clear_lowbits64_c0:516; X86-BMI2:       # %bb.0:517; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx518; X86-BMI2-NEXT:    movl $-1, %edx519; X86-BMI2-NEXT:    shlxl %ecx, %edx, %eax520; X86-BMI2-NEXT:    testb $32, %cl521; X86-BMI2-NEXT:    je .LBB13_2522; X86-BMI2-NEXT:  # %bb.1:523; X86-BMI2-NEXT:    movl %eax, %edx524; X86-BMI2-NEXT:    xorl %eax, %eax525; X86-BMI2-NEXT:  .LBB13_2:526; X86-BMI2-NEXT:    andl {{[0-9]+}}(%esp), %eax527; X86-BMI2-NEXT:    andl {{[0-9]+}}(%esp), %edx528; X86-BMI2-NEXT:    retl529;530; X64-NOBMI2-LABEL: clear_lowbits64_c0:531; X64-NOBMI2:       # %bb.0:532; X64-NOBMI2-NEXT:    movq %rsi, %rcx533; X64-NOBMI2-NEXT:    movq %rdi, %rax534; X64-NOBMI2-NEXT:    shrq %cl, %rax535; X64-NOBMI2-NEXT:    # kill: def $cl killed $cl killed $rcx536; X64-NOBMI2-NEXT:    shlq %cl, %rax537; X64-NOBMI2-NEXT:    retq538;539; X64-BMI2-LABEL: clear_lowbits64_c0:540; X64-BMI2:       # %bb.0:541; X64-BMI2-NEXT:    shrxq %rsi, %rdi, %rax542; X64-BMI2-NEXT:    shlxq %rsi, %rax, %rax543; X64-BMI2-NEXT:    retq544  %mask = shl i64 -1, %numlowbits545  %masked = and i64 %mask, %val546  ret i64 %masked547}548 549define i64 @clear_lowbits64_c1_indexzext(i64 %val, i8 %numlowbits) nounwind {550; X86-NOBMI2-LABEL: clear_lowbits64_c1_indexzext:551; X86-NOBMI2:       # %bb.0:552; X86-NOBMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx553; X86-NOBMI2-NEXT:    movl $-1, %edx554; X86-NOBMI2-NEXT:    movl $-1, %eax555; X86-NOBMI2-NEXT:    shll %cl, %eax556; X86-NOBMI2-NEXT:    testb $32, %cl557; X86-NOBMI2-NEXT:    je .LBB14_2558; X86-NOBMI2-NEXT:  # %bb.1:559; X86-NOBMI2-NEXT:    movl %eax, %edx560; X86-NOBMI2-NEXT:    xorl %eax, %eax561; X86-NOBMI2-NEXT:  .LBB14_2:562; X86-NOBMI2-NEXT:    andl {{[0-9]+}}(%esp), %eax563; X86-NOBMI2-NEXT:    andl {{[0-9]+}}(%esp), %edx564; X86-NOBMI2-NEXT:    retl565;566; X86-BMI2-LABEL: clear_lowbits64_c1_indexzext:567; X86-BMI2:       # %bb.0:568; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx569; X86-BMI2-NEXT:    movl $-1, %edx570; X86-BMI2-NEXT:    shlxl %ecx, %edx, %eax571; X86-BMI2-NEXT:    testb $32, %cl572; X86-BMI2-NEXT:    je .LBB14_2573; X86-BMI2-NEXT:  # %bb.1:574; X86-BMI2-NEXT:    movl %eax, %edx575; X86-BMI2-NEXT:    xorl %eax, %eax576; X86-BMI2-NEXT:  .LBB14_2:577; X86-BMI2-NEXT:    andl {{[0-9]+}}(%esp), %eax578; X86-BMI2-NEXT:    andl {{[0-9]+}}(%esp), %edx579; X86-BMI2-NEXT:    retl580;581; X64-NOBMI2-LABEL: clear_lowbits64_c1_indexzext:582; X64-NOBMI2:       # %bb.0:583; X64-NOBMI2-NEXT:    movl %esi, %ecx584; X64-NOBMI2-NEXT:    movq %rdi, %rax585; X64-NOBMI2-NEXT:    shrq %cl, %rax586; X64-NOBMI2-NEXT:    # kill: def $cl killed $cl killed $ecx587; X64-NOBMI2-NEXT:    shlq %cl, %rax588; X64-NOBMI2-NEXT:    retq589;590; X64-BMI2-LABEL: clear_lowbits64_c1_indexzext:591; X64-BMI2:       # %bb.0:592; X64-BMI2-NEXT:    # kill: def $esi killed $esi def $rsi593; X64-BMI2-NEXT:    shrxq %rsi, %rdi, %rax594; X64-BMI2-NEXT:    shlxq %rsi, %rax, %rax595; X64-BMI2-NEXT:    retq596  %sh_prom = zext i8 %numlowbits to i64597  %mask = shl i64 -1, %sh_prom598  %masked = and i64 %mask, %val599  ret i64 %masked600}601 602define i64 @clear_lowbits64_c2_load(ptr %w, i64 %numlowbits) nounwind {603; X86-NOBMI2-LABEL: clear_lowbits64_c2_load:604; X86-NOBMI2:       # %bb.0:605; X86-NOBMI2-NEXT:    pushl %esi606; X86-NOBMI2-NEXT:    movl {{[0-9]+}}(%esp), %esi607; X86-NOBMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx608; X86-NOBMI2-NEXT:    movl $-1, %edx609; X86-NOBMI2-NEXT:    movl $-1, %eax610; X86-NOBMI2-NEXT:    shll %cl, %eax611; X86-NOBMI2-NEXT:    testb $32, %cl612; X86-NOBMI2-NEXT:    je .LBB15_2613; X86-NOBMI2-NEXT:  # %bb.1:614; X86-NOBMI2-NEXT:    movl %eax, %edx615; X86-NOBMI2-NEXT:    xorl %eax, %eax616; X86-NOBMI2-NEXT:  .LBB15_2:617; X86-NOBMI2-NEXT:    andl (%esi), %eax618; X86-NOBMI2-NEXT:    andl 4(%esi), %edx619; X86-NOBMI2-NEXT:    popl %esi620; X86-NOBMI2-NEXT:    retl621;622; X86-BMI2-LABEL: clear_lowbits64_c2_load:623; X86-BMI2:       # %bb.0:624; X86-BMI2-NEXT:    pushl %ebx625; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %ecx626; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %ebx627; X86-BMI2-NEXT:    movl $-1, %edx628; X86-BMI2-NEXT:    shlxl %ebx, %edx, %eax629; X86-BMI2-NEXT:    testb $32, %bl630; X86-BMI2-NEXT:    je .LBB15_2631; X86-BMI2-NEXT:  # %bb.1:632; X86-BMI2-NEXT:    movl %eax, %edx633; X86-BMI2-NEXT:    xorl %eax, %eax634; X86-BMI2-NEXT:  .LBB15_2:635; X86-BMI2-NEXT:    andl (%ecx), %eax636; X86-BMI2-NEXT:    andl 4(%ecx), %edx637; X86-BMI2-NEXT:    popl %ebx638; X86-BMI2-NEXT:    retl639;640; X64-NOBMI2-LABEL: clear_lowbits64_c2_load:641; X64-NOBMI2:       # %bb.0:642; X64-NOBMI2-NEXT:    movq %rsi, %rcx643; X64-NOBMI2-NEXT:    movq (%rdi), %rax644; X64-NOBMI2-NEXT:    shrq %cl, %rax645; X64-NOBMI2-NEXT:    # kill: def $cl killed $cl killed $rcx646; X64-NOBMI2-NEXT:    shlq %cl, %rax647; X64-NOBMI2-NEXT:    retq648;649; X64-BMI2-LABEL: clear_lowbits64_c2_load:650; X64-BMI2:       # %bb.0:651; X64-BMI2-NEXT:    shrxq %rsi, (%rdi), %rax652; X64-BMI2-NEXT:    shlxq %rsi, %rax, %rax653; X64-BMI2-NEXT:    retq654  %val = load i64, ptr %w655  %mask = shl i64 -1, %numlowbits656  %masked = and i64 %mask, %val657  ret i64 %masked658}659 660define i64 @clear_lowbits64_c3_load_indexzext(ptr %w, i8 %numlowbits) nounwind {661; X86-NOBMI2-LABEL: clear_lowbits64_c3_load_indexzext:662; X86-NOBMI2:       # %bb.0:663; X86-NOBMI2-NEXT:    pushl %esi664; X86-NOBMI2-NEXT:    movl {{[0-9]+}}(%esp), %esi665; X86-NOBMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx666; X86-NOBMI2-NEXT:    movl $-1, %edx667; X86-NOBMI2-NEXT:    movl $-1, %eax668; X86-NOBMI2-NEXT:    shll %cl, %eax669; X86-NOBMI2-NEXT:    testb $32, %cl670; X86-NOBMI2-NEXT:    je .LBB16_2671; X86-NOBMI2-NEXT:  # %bb.1:672; X86-NOBMI2-NEXT:    movl %eax, %edx673; X86-NOBMI2-NEXT:    xorl %eax, %eax674; X86-NOBMI2-NEXT:  .LBB16_2:675; X86-NOBMI2-NEXT:    andl (%esi), %eax676; X86-NOBMI2-NEXT:    andl 4(%esi), %edx677; X86-NOBMI2-NEXT:    popl %esi678; X86-NOBMI2-NEXT:    retl679;680; X86-BMI2-LABEL: clear_lowbits64_c3_load_indexzext:681; X86-BMI2:       # %bb.0:682; X86-BMI2-NEXT:    pushl %ebx683; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %ecx684; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %ebx685; X86-BMI2-NEXT:    movl $-1, %edx686; X86-BMI2-NEXT:    shlxl %ebx, %edx, %eax687; X86-BMI2-NEXT:    testb $32, %bl688; X86-BMI2-NEXT:    je .LBB16_2689; X86-BMI2-NEXT:  # %bb.1:690; X86-BMI2-NEXT:    movl %eax, %edx691; X86-BMI2-NEXT:    xorl %eax, %eax692; X86-BMI2-NEXT:  .LBB16_2:693; X86-BMI2-NEXT:    andl (%ecx), %eax694; X86-BMI2-NEXT:    andl 4(%ecx), %edx695; X86-BMI2-NEXT:    popl %ebx696; X86-BMI2-NEXT:    retl697;698; X64-NOBMI2-LABEL: clear_lowbits64_c3_load_indexzext:699; X64-NOBMI2:       # %bb.0:700; X64-NOBMI2-NEXT:    movl %esi, %ecx701; X64-NOBMI2-NEXT:    movq (%rdi), %rax702; X64-NOBMI2-NEXT:    shrq %cl, %rax703; X64-NOBMI2-NEXT:    # kill: def $cl killed $cl killed $ecx704; X64-NOBMI2-NEXT:    shlq %cl, %rax705; X64-NOBMI2-NEXT:    retq706;707; X64-BMI2-LABEL: clear_lowbits64_c3_load_indexzext:708; X64-BMI2:       # %bb.0:709; X64-BMI2-NEXT:    # kill: def $esi killed $esi def $rsi710; X64-BMI2-NEXT:    shrxq %rsi, (%rdi), %rax711; X64-BMI2-NEXT:    shlxq %rsi, %rax, %rax712; X64-BMI2-NEXT:    retq713  %val = load i64, ptr %w714  %sh_prom = zext i8 %numlowbits to i64715  %mask = shl i64 -1, %sh_prom716  %masked = and i64 %mask, %val717  ret i64 %masked718}719 720define i64 @clear_lowbits64_c4_commutative(i64 %val, i64 %numlowbits) nounwind {721; X86-NOBMI2-LABEL: clear_lowbits64_c4_commutative:722; X86-NOBMI2:       # %bb.0:723; X86-NOBMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx724; X86-NOBMI2-NEXT:    movl $-1, %edx725; X86-NOBMI2-NEXT:    movl $-1, %eax726; X86-NOBMI2-NEXT:    shll %cl, %eax727; X86-NOBMI2-NEXT:    testb $32, %cl728; X86-NOBMI2-NEXT:    je .LBB17_2729; X86-NOBMI2-NEXT:  # %bb.1:730; X86-NOBMI2-NEXT:    movl %eax, %edx731; X86-NOBMI2-NEXT:    xorl %eax, %eax732; X86-NOBMI2-NEXT:  .LBB17_2:733; X86-NOBMI2-NEXT:    andl {{[0-9]+}}(%esp), %eax734; X86-NOBMI2-NEXT:    andl {{[0-9]+}}(%esp), %edx735; X86-NOBMI2-NEXT:    retl736;737; X86-BMI2-LABEL: clear_lowbits64_c4_commutative:738; X86-BMI2:       # %bb.0:739; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx740; X86-BMI2-NEXT:    movl $-1, %edx741; X86-BMI2-NEXT:    shlxl %ecx, %edx, %eax742; X86-BMI2-NEXT:    testb $32, %cl743; X86-BMI2-NEXT:    je .LBB17_2744; X86-BMI2-NEXT:  # %bb.1:745; X86-BMI2-NEXT:    movl %eax, %edx746; X86-BMI2-NEXT:    xorl %eax, %eax747; X86-BMI2-NEXT:  .LBB17_2:748; X86-BMI2-NEXT:    andl {{[0-9]+}}(%esp), %eax749; X86-BMI2-NEXT:    andl {{[0-9]+}}(%esp), %edx750; X86-BMI2-NEXT:    retl751;752; X64-NOBMI2-LABEL: clear_lowbits64_c4_commutative:753; X64-NOBMI2:       # %bb.0:754; X64-NOBMI2-NEXT:    movq %rsi, %rcx755; X64-NOBMI2-NEXT:    movq %rdi, %rax756; X64-NOBMI2-NEXT:    shrq %cl, %rax757; X64-NOBMI2-NEXT:    # kill: def $cl killed $cl killed $rcx758; X64-NOBMI2-NEXT:    shlq %cl, %rax759; X64-NOBMI2-NEXT:    retq760;761; X64-BMI2-LABEL: clear_lowbits64_c4_commutative:762; X64-BMI2:       # %bb.0:763; X64-BMI2-NEXT:    shrxq %rsi, %rdi, %rax764; X64-BMI2-NEXT:    shlxq %rsi, %rax, %rax765; X64-BMI2-NEXT:    retq766  %mask = shl i64 -1, %numlowbits767  %masked = and i64 %val, %mask ; swapped order768  ret i64 %masked769}770 771; ---------------------------------------------------------------------------- ;772; Pattern ic.773; ---------------------------------------------------------------------------- ;774 775; 8-bit776 777define i8 @clear_lowbits8_ic0(i8 %val, i8 %numlowbits) nounwind {778; X86-LABEL: clear_lowbits8_ic0:779; X86:       # %bb.0:780; X86-NEXT:    movzbl {{[0-9]+}}(%esp), %eax781; X86-NEXT:    movb $8, %cl782; X86-NEXT:    subb {{[0-9]+}}(%esp), %cl783; X86-NEXT:    shrb %cl, %al784; X86-NEXT:    shlb %cl, %al785; X86-NEXT:    retl786;787; X64-LABEL: clear_lowbits8_ic0:788; X64:       # %bb.0:789; X64-NEXT:    movl %edi, %eax790; X64-NEXT:    movb $8, %cl791; X64-NEXT:    subb %sil, %cl792; X64-NEXT:    shrb %cl, %al793; X64-NEXT:    shlb %cl, %al794; X64-NEXT:    # kill: def $al killed $al killed $eax795; X64-NEXT:    retq796  %numhighbits = sub i8 8, %numlowbits797  %mask = shl i8 -1, %numhighbits798  %masked = and i8 %mask, %val799  ret i8 %masked800}801 802define i8 @clear_lowbits8_ic2_load(ptr %w, i8 %numlowbits) nounwind {803; X86-LABEL: clear_lowbits8_ic2_load:804; X86:       # %bb.0:805; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax806; X86-NEXT:    movzbl (%eax), %eax807; X86-NEXT:    movb $8, %cl808; X86-NEXT:    subb {{[0-9]+}}(%esp), %cl809; X86-NEXT:    shrb %cl, %al810; X86-NEXT:    shlb %cl, %al811; X86-NEXT:    retl812;813; X64-LABEL: clear_lowbits8_ic2_load:814; X64:       # %bb.0:815; X64-NEXT:    movzbl (%rdi), %eax816; X64-NEXT:    movb $8, %cl817; X64-NEXT:    subb %sil, %cl818; X64-NEXT:    shrb %cl, %al819; X64-NEXT:    shlb %cl, %al820; X64-NEXT:    retq821  %val = load i8, ptr %w822  %numhighbits = sub i8 8, %numlowbits823  %mask = shl i8 -1, %numhighbits824  %masked = and i8 %mask, %val825  ret i8 %masked826}827 828define i8 @clear_lowbits8_ic4_commutative(i8 %val, i8 %numlowbits) nounwind {829; X86-LABEL: clear_lowbits8_ic4_commutative:830; X86:       # %bb.0:831; X86-NEXT:    movzbl {{[0-9]+}}(%esp), %eax832; X86-NEXT:    movb $8, %cl833; X86-NEXT:    subb {{[0-9]+}}(%esp), %cl834; X86-NEXT:    shrb %cl, %al835; X86-NEXT:    shlb %cl, %al836; X86-NEXT:    retl837;838; X64-LABEL: clear_lowbits8_ic4_commutative:839; X64:       # %bb.0:840; X64-NEXT:    movl %edi, %eax841; X64-NEXT:    movb $8, %cl842; X64-NEXT:    subb %sil, %cl843; X64-NEXT:    shrb %cl, %al844; X64-NEXT:    shlb %cl, %al845; X64-NEXT:    # kill: def $al killed $al killed $eax846; X64-NEXT:    retq847  %numhighbits = sub i8 8, %numlowbits848  %mask = shl i8 -1, %numhighbits849  %masked = and i8 %val, %mask ; swapped order850  ret i8 %masked851}852 853; 16-bit854 855define i16 @clear_lowbits16_ic0(i16 %val, i16 %numlowbits) nounwind {856; X86-NOBMI2-LABEL: clear_lowbits16_ic0:857; X86-NOBMI2:       # %bb.0:858; X86-NOBMI2-NEXT:    movzwl {{[0-9]+}}(%esp), %eax859; X86-NOBMI2-NEXT:    movb $16, %cl860; X86-NOBMI2-NEXT:    subb {{[0-9]+}}(%esp), %cl861; X86-NOBMI2-NEXT:    shrl %cl, %eax862; X86-NOBMI2-NEXT:    shll %cl, %eax863; X86-NOBMI2-NEXT:    # kill: def $ax killed $ax killed $eax864; X86-NOBMI2-NEXT:    retl865;866; X86-BMI2-LABEL: clear_lowbits16_ic0:867; X86-BMI2:       # %bb.0:868; X86-BMI2-NEXT:    movzwl {{[0-9]+}}(%esp), %eax869; X86-BMI2-NEXT:    movb $16, %cl870; X86-BMI2-NEXT:    subb {{[0-9]+}}(%esp), %cl871; X86-BMI2-NEXT:    shrxl %ecx, %eax, %eax872; X86-BMI2-NEXT:    shlxl %ecx, %eax, %eax873; X86-BMI2-NEXT:    # kill: def $ax killed $ax killed $eax874; X86-BMI2-NEXT:    retl875;876; X64-NOBMI2-LABEL: clear_lowbits16_ic0:877; X64-NOBMI2:       # %bb.0:878; X64-NOBMI2-NEXT:    movzwl %di, %eax879; X64-NOBMI2-NEXT:    movb $16, %cl880; X64-NOBMI2-NEXT:    subb %sil, %cl881; X64-NOBMI2-NEXT:    shrl %cl, %eax882; X64-NOBMI2-NEXT:    shll %cl, %eax883; X64-NOBMI2-NEXT:    # kill: def $ax killed $ax killed $eax884; X64-NOBMI2-NEXT:    retq885;886; X64-BMI2-LABEL: clear_lowbits16_ic0:887; X64-BMI2:       # %bb.0:888; X64-BMI2-NEXT:    movzwl %di, %eax889; X64-BMI2-NEXT:    movb $16, %cl890; X64-BMI2-NEXT:    subb %sil, %cl891; X64-BMI2-NEXT:    shrxl %ecx, %eax, %eax892; X64-BMI2-NEXT:    shlxl %ecx, %eax, %eax893; X64-BMI2-NEXT:    # kill: def $ax killed $ax killed $eax894; X64-BMI2-NEXT:    retq895  %numhighbits = sub i16 16, %numlowbits896  %mask = shl i16 -1, %numhighbits897  %masked = and i16 %mask, %val898  ret i16 %masked899}900 901define i16 @clear_lowbits16_ic1_indexzext(i16 %val, i8 %numlowbits) nounwind {902; X86-NOBMI2-LABEL: clear_lowbits16_ic1_indexzext:903; X86-NOBMI2:       # %bb.0:904; X86-NOBMI2-NEXT:    movzwl {{[0-9]+}}(%esp), %eax905; X86-NOBMI2-NEXT:    movb $16, %cl906; X86-NOBMI2-NEXT:    subb {{[0-9]+}}(%esp), %cl907; X86-NOBMI2-NEXT:    shrl %cl, %eax908; X86-NOBMI2-NEXT:    shll %cl, %eax909; X86-NOBMI2-NEXT:    # kill: def $ax killed $ax killed $eax910; X86-NOBMI2-NEXT:    retl911;912; X86-BMI2-LABEL: clear_lowbits16_ic1_indexzext:913; X86-BMI2:       # %bb.0:914; X86-BMI2-NEXT:    movzwl {{[0-9]+}}(%esp), %eax915; X86-BMI2-NEXT:    movb $16, %cl916; X86-BMI2-NEXT:    subb {{[0-9]+}}(%esp), %cl917; X86-BMI2-NEXT:    shrxl %ecx, %eax, %eax918; X86-BMI2-NEXT:    shlxl %ecx, %eax, %eax919; X86-BMI2-NEXT:    # kill: def $ax killed $ax killed $eax920; X86-BMI2-NEXT:    retl921;922; X64-NOBMI2-LABEL: clear_lowbits16_ic1_indexzext:923; X64-NOBMI2:       # %bb.0:924; X64-NOBMI2-NEXT:    movzwl %di, %eax925; X64-NOBMI2-NEXT:    movb $16, %cl926; X64-NOBMI2-NEXT:    subb %sil, %cl927; X64-NOBMI2-NEXT:    shrl %cl, %eax928; X64-NOBMI2-NEXT:    shll %cl, %eax929; X64-NOBMI2-NEXT:    # kill: def $ax killed $ax killed $eax930; X64-NOBMI2-NEXT:    retq931;932; X64-BMI2-LABEL: clear_lowbits16_ic1_indexzext:933; X64-BMI2:       # %bb.0:934; X64-BMI2-NEXT:    movzwl %di, %eax935; X64-BMI2-NEXT:    movb $16, %cl936; X64-BMI2-NEXT:    subb %sil, %cl937; X64-BMI2-NEXT:    shrxl %ecx, %eax, %eax938; X64-BMI2-NEXT:    shlxl %ecx, %eax, %eax939; X64-BMI2-NEXT:    # kill: def $ax killed $ax killed $eax940; X64-BMI2-NEXT:    retq941  %numhighbits = sub i8 16, %numlowbits942  %sh_prom = zext i8 %numhighbits to i16943  %mask = shl i16 -1, %sh_prom944  %masked = and i16 %mask, %val945  ret i16 %masked946}947 948define i16 @clear_lowbits16_ic2_load(ptr %w, i16 %numlowbits) nounwind {949; X86-NOBMI2-LABEL: clear_lowbits16_ic2_load:950; X86-NOBMI2:       # %bb.0:951; X86-NOBMI2-NEXT:    movl {{[0-9]+}}(%esp), %eax952; X86-NOBMI2-NEXT:    movzwl (%eax), %eax953; X86-NOBMI2-NEXT:    movb $16, %cl954; X86-NOBMI2-NEXT:    subb {{[0-9]+}}(%esp), %cl955; X86-NOBMI2-NEXT:    shrl %cl, %eax956; X86-NOBMI2-NEXT:    shll %cl, %eax957; X86-NOBMI2-NEXT:    # kill: def $ax killed $ax killed $eax958; X86-NOBMI2-NEXT:    retl959;960; X86-BMI2-LABEL: clear_lowbits16_ic2_load:961; X86-BMI2:       # %bb.0:962; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %eax963; X86-BMI2-NEXT:    movzwl (%eax), %eax964; X86-BMI2-NEXT:    movb $16, %cl965; X86-BMI2-NEXT:    subb {{[0-9]+}}(%esp), %cl966; X86-BMI2-NEXT:    shrxl %ecx, %eax, %eax967; X86-BMI2-NEXT:    shlxl %ecx, %eax, %eax968; X86-BMI2-NEXT:    # kill: def $ax killed $ax killed $eax969; X86-BMI2-NEXT:    retl970;971; X64-NOBMI2-LABEL: clear_lowbits16_ic2_load:972; X64-NOBMI2:       # %bb.0:973; X64-NOBMI2-NEXT:    movzwl (%rdi), %eax974; X64-NOBMI2-NEXT:    movb $16, %cl975; X64-NOBMI2-NEXT:    subb %sil, %cl976; X64-NOBMI2-NEXT:    shrl %cl, %eax977; X64-NOBMI2-NEXT:    shll %cl, %eax978; X64-NOBMI2-NEXT:    # kill: def $ax killed $ax killed $eax979; X64-NOBMI2-NEXT:    retq980;981; X64-BMI2-LABEL: clear_lowbits16_ic2_load:982; X64-BMI2:       # %bb.0:983; X64-BMI2-NEXT:    movzwl (%rdi), %eax984; X64-BMI2-NEXT:    movb $16, %cl985; X64-BMI2-NEXT:    subb %sil, %cl986; X64-BMI2-NEXT:    shrxl %ecx, %eax, %eax987; X64-BMI2-NEXT:    shlxl %ecx, %eax, %eax988; X64-BMI2-NEXT:    # kill: def $ax killed $ax killed $eax989; X64-BMI2-NEXT:    retq990  %val = load i16, ptr %w991  %numhighbits = sub i16 16, %numlowbits992  %mask = shl i16 -1, %numhighbits993  %masked = and i16 %mask, %val994  ret i16 %masked995}996 997define i16 @clear_lowbits16_ic3_load_indexzext(ptr %w, i8 %numlowbits) nounwind {998; X86-NOBMI2-LABEL: clear_lowbits16_ic3_load_indexzext:999; X86-NOBMI2:       # %bb.0:1000; X86-NOBMI2-NEXT:    movl {{[0-9]+}}(%esp), %eax1001; X86-NOBMI2-NEXT:    movzwl (%eax), %eax1002; X86-NOBMI2-NEXT:    movb $16, %cl1003; X86-NOBMI2-NEXT:    subb {{[0-9]+}}(%esp), %cl1004; X86-NOBMI2-NEXT:    shrl %cl, %eax1005; X86-NOBMI2-NEXT:    shll %cl, %eax1006; X86-NOBMI2-NEXT:    # kill: def $ax killed $ax killed $eax1007; X86-NOBMI2-NEXT:    retl1008;1009; X86-BMI2-LABEL: clear_lowbits16_ic3_load_indexzext:1010; X86-BMI2:       # %bb.0:1011; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %eax1012; X86-BMI2-NEXT:    movzwl (%eax), %eax1013; X86-BMI2-NEXT:    movb $16, %cl1014; X86-BMI2-NEXT:    subb {{[0-9]+}}(%esp), %cl1015; X86-BMI2-NEXT:    shrxl %ecx, %eax, %eax1016; X86-BMI2-NEXT:    shlxl %ecx, %eax, %eax1017; X86-BMI2-NEXT:    # kill: def $ax killed $ax killed $eax1018; X86-BMI2-NEXT:    retl1019;1020; X64-NOBMI2-LABEL: clear_lowbits16_ic3_load_indexzext:1021; X64-NOBMI2:       # %bb.0:1022; X64-NOBMI2-NEXT:    movzwl (%rdi), %eax1023; X64-NOBMI2-NEXT:    movb $16, %cl1024; X64-NOBMI2-NEXT:    subb %sil, %cl1025; X64-NOBMI2-NEXT:    shrl %cl, %eax1026; X64-NOBMI2-NEXT:    shll %cl, %eax1027; X64-NOBMI2-NEXT:    # kill: def $ax killed $ax killed $eax1028; X64-NOBMI2-NEXT:    retq1029;1030; X64-BMI2-LABEL: clear_lowbits16_ic3_load_indexzext:1031; X64-BMI2:       # %bb.0:1032; X64-BMI2-NEXT:    movzwl (%rdi), %eax1033; X64-BMI2-NEXT:    movb $16, %cl1034; X64-BMI2-NEXT:    subb %sil, %cl1035; X64-BMI2-NEXT:    shrxl %ecx, %eax, %eax1036; X64-BMI2-NEXT:    shlxl %ecx, %eax, %eax1037; X64-BMI2-NEXT:    # kill: def $ax killed $ax killed $eax1038; X64-BMI2-NEXT:    retq1039  %val = load i16, ptr %w1040  %numhighbits = sub i8 16, %numlowbits1041  %sh_prom = zext i8 %numhighbits to i161042  %mask = shl i16 -1, %sh_prom1043  %masked = and i16 %mask, %val1044  ret i16 %masked1045}1046 1047define i16 @clear_lowbits16_ic4_commutative(i16 %val, i16 %numlowbits) nounwind {1048; X86-NOBMI2-LABEL: clear_lowbits16_ic4_commutative:1049; X86-NOBMI2:       # %bb.0:1050; X86-NOBMI2-NEXT:    movzwl {{[0-9]+}}(%esp), %eax1051; X86-NOBMI2-NEXT:    movb $16, %cl1052; X86-NOBMI2-NEXT:    subb {{[0-9]+}}(%esp), %cl1053; X86-NOBMI2-NEXT:    shrl %cl, %eax1054; X86-NOBMI2-NEXT:    shll %cl, %eax1055; X86-NOBMI2-NEXT:    # kill: def $ax killed $ax killed $eax1056; X86-NOBMI2-NEXT:    retl1057;1058; X86-BMI2-LABEL: clear_lowbits16_ic4_commutative:1059; X86-BMI2:       # %bb.0:1060; X86-BMI2-NEXT:    movzwl {{[0-9]+}}(%esp), %eax1061; X86-BMI2-NEXT:    movb $16, %cl1062; X86-BMI2-NEXT:    subb {{[0-9]+}}(%esp), %cl1063; X86-BMI2-NEXT:    shrxl %ecx, %eax, %eax1064; X86-BMI2-NEXT:    shlxl %ecx, %eax, %eax1065; X86-BMI2-NEXT:    # kill: def $ax killed $ax killed $eax1066; X86-BMI2-NEXT:    retl1067;1068; X64-NOBMI2-LABEL: clear_lowbits16_ic4_commutative:1069; X64-NOBMI2:       # %bb.0:1070; X64-NOBMI2-NEXT:    movzwl %di, %eax1071; X64-NOBMI2-NEXT:    movb $16, %cl1072; X64-NOBMI2-NEXT:    subb %sil, %cl1073; X64-NOBMI2-NEXT:    shrl %cl, %eax1074; X64-NOBMI2-NEXT:    shll %cl, %eax1075; X64-NOBMI2-NEXT:    # kill: def $ax killed $ax killed $eax1076; X64-NOBMI2-NEXT:    retq1077;1078; X64-BMI2-LABEL: clear_lowbits16_ic4_commutative:1079; X64-BMI2:       # %bb.0:1080; X64-BMI2-NEXT:    movzwl %di, %eax1081; X64-BMI2-NEXT:    movb $16, %cl1082; X64-BMI2-NEXT:    subb %sil, %cl1083; X64-BMI2-NEXT:    shrxl %ecx, %eax, %eax1084; X64-BMI2-NEXT:    shlxl %ecx, %eax, %eax1085; X64-BMI2-NEXT:    # kill: def $ax killed $ax killed $eax1086; X64-BMI2-NEXT:    retq1087  %numhighbits = sub i16 16, %numlowbits1088  %mask = shl i16 -1, %numhighbits1089  %masked = and i16 %val, %mask ; swapped order1090  ret i16 %masked1091}1092 1093; 32-bit1094 1095define i32 @clear_lowbits32_ic0(i32 %val, i32 %numlowbits) nounwind {1096; X86-NOBMI2-LABEL: clear_lowbits32_ic0:1097; X86-NOBMI2:       # %bb.0:1098; X86-NOBMI2-NEXT:    movl {{[0-9]+}}(%esp), %eax1099; X86-NOBMI2-NEXT:    xorl %ecx, %ecx1100; X86-NOBMI2-NEXT:    subb {{[0-9]+}}(%esp), %cl1101; X86-NOBMI2-NEXT:    shrl %cl, %eax1102; X86-NOBMI2-NEXT:    # kill: def $cl killed $cl killed $ecx1103; X86-NOBMI2-NEXT:    shll %cl, %eax1104; X86-NOBMI2-NEXT:    retl1105;1106; X86-BMI2-LABEL: clear_lowbits32_ic0:1107; X86-BMI2:       # %bb.0:1108; X86-BMI2-NEXT:    xorl %eax, %eax1109; X86-BMI2-NEXT:    subb {{[0-9]+}}(%esp), %al1110; X86-BMI2-NEXT:    shrxl %eax, {{[0-9]+}}(%esp), %ecx1111; X86-BMI2-NEXT:    shlxl %eax, %ecx, %eax1112; X86-BMI2-NEXT:    retl1113;1114; X64-NOBMI2-LABEL: clear_lowbits32_ic0:1115; X64-NOBMI2:       # %bb.0:1116; X64-NOBMI2-NEXT:    movl %esi, %ecx1117; X64-NOBMI2-NEXT:    movl %edi, %eax1118; X64-NOBMI2-NEXT:    negb %cl1119; X64-NOBMI2-NEXT:    shrl %cl, %eax1120; X64-NOBMI2-NEXT:    # kill: def $cl killed $cl killed $ecx1121; X64-NOBMI2-NEXT:    shll %cl, %eax1122; X64-NOBMI2-NEXT:    retq1123;1124; X64-BMI2-LABEL: clear_lowbits32_ic0:1125; X64-BMI2:       # %bb.0:1126; X64-BMI2-NEXT:    negb %sil1127; X64-BMI2-NEXT:    shrxl %esi, %edi, %eax1128; X64-BMI2-NEXT:    shlxl %esi, %eax, %eax1129; X64-BMI2-NEXT:    retq1130  %numhighbits = sub i32 32, %numlowbits1131  %mask = shl i32 -1, %numhighbits1132  %masked = and i32 %mask, %val1133  ret i32 %masked1134}1135 1136define i32 @clear_lowbits32_ic1_indexzext(i32 %val, i8 %numlowbits) nounwind {1137; X86-NOBMI2-LABEL: clear_lowbits32_ic1_indexzext:1138; X86-NOBMI2:       # %bb.0:1139; X86-NOBMI2-NEXT:    movl {{[0-9]+}}(%esp), %eax1140; X86-NOBMI2-NEXT:    xorl %ecx, %ecx1141; X86-NOBMI2-NEXT:    subb {{[0-9]+}}(%esp), %cl1142; X86-NOBMI2-NEXT:    shrl %cl, %eax1143; X86-NOBMI2-NEXT:    # kill: def $cl killed $cl killed $ecx1144; X86-NOBMI2-NEXT:    shll %cl, %eax1145; X86-NOBMI2-NEXT:    retl1146;1147; X86-BMI2-LABEL: clear_lowbits32_ic1_indexzext:1148; X86-BMI2:       # %bb.0:1149; X86-BMI2-NEXT:    xorl %eax, %eax1150; X86-BMI2-NEXT:    subb {{[0-9]+}}(%esp), %al1151; X86-BMI2-NEXT:    shrxl %eax, {{[0-9]+}}(%esp), %ecx1152; X86-BMI2-NEXT:    shlxl %eax, %ecx, %eax1153; X86-BMI2-NEXT:    retl1154;1155; X64-NOBMI2-LABEL: clear_lowbits32_ic1_indexzext:1156; X64-NOBMI2:       # %bb.0:1157; X64-NOBMI2-NEXT:    movl %esi, %ecx1158; X64-NOBMI2-NEXT:    movl %edi, %eax1159; X64-NOBMI2-NEXT:    negb %cl1160; X64-NOBMI2-NEXT:    shrl %cl, %eax1161; X64-NOBMI2-NEXT:    # kill: def $cl killed $cl killed $ecx1162; X64-NOBMI2-NEXT:    shll %cl, %eax1163; X64-NOBMI2-NEXT:    retq1164;1165; X64-BMI2-LABEL: clear_lowbits32_ic1_indexzext:1166; X64-BMI2:       # %bb.0:1167; X64-BMI2-NEXT:    negb %sil1168; X64-BMI2-NEXT:    shrxl %esi, %edi, %eax1169; X64-BMI2-NEXT:    shlxl %esi, %eax, %eax1170; X64-BMI2-NEXT:    retq1171  %numhighbits = sub i8 32, %numlowbits1172  %sh_prom = zext i8 %numhighbits to i321173  %mask = shl i32 -1, %sh_prom1174  %masked = and i32 %mask, %val1175  ret i32 %masked1176}1177 1178define i32 @clear_lowbits32_ic2_load(ptr %w, i32 %numlowbits) nounwind {1179; X86-NOBMI2-LABEL: clear_lowbits32_ic2_load:1180; X86-NOBMI2:       # %bb.0:1181; X86-NOBMI2-NEXT:    movl {{[0-9]+}}(%esp), %eax1182; X86-NOBMI2-NEXT:    movl (%eax), %eax1183; X86-NOBMI2-NEXT:    xorl %ecx, %ecx1184; X86-NOBMI2-NEXT:    subb {{[0-9]+}}(%esp), %cl1185; X86-NOBMI2-NEXT:    shrl %cl, %eax1186; X86-NOBMI2-NEXT:    # kill: def $cl killed $cl killed $ecx1187; X86-NOBMI2-NEXT:    shll %cl, %eax1188; X86-NOBMI2-NEXT:    retl1189;1190; X86-BMI2-LABEL: clear_lowbits32_ic2_load:1191; X86-BMI2:       # %bb.0:1192; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %eax1193; X86-BMI2-NEXT:    xorl %ecx, %ecx1194; X86-BMI2-NEXT:    subb {{[0-9]+}}(%esp), %cl1195; X86-BMI2-NEXT:    shrxl %ecx, (%eax), %eax1196; X86-BMI2-NEXT:    shlxl %ecx, %eax, %eax1197; X86-BMI2-NEXT:    retl1198;1199; X64-NOBMI2-LABEL: clear_lowbits32_ic2_load:1200; X64-NOBMI2:       # %bb.0:1201; X64-NOBMI2-NEXT:    movl %esi, %ecx1202; X64-NOBMI2-NEXT:    movl (%rdi), %eax1203; X64-NOBMI2-NEXT:    negb %cl1204; X64-NOBMI2-NEXT:    shrl %cl, %eax1205; X64-NOBMI2-NEXT:    # kill: def $cl killed $cl killed $ecx1206; X64-NOBMI2-NEXT:    shll %cl, %eax1207; X64-NOBMI2-NEXT:    retq1208;1209; X64-BMI2-LABEL: clear_lowbits32_ic2_load:1210; X64-BMI2:       # %bb.0:1211; X64-BMI2-NEXT:    negb %sil1212; X64-BMI2-NEXT:    shrxl %esi, (%rdi), %eax1213; X64-BMI2-NEXT:    shlxl %esi, %eax, %eax1214; X64-BMI2-NEXT:    retq1215  %val = load i32, ptr %w1216  %numhighbits = sub i32 32, %numlowbits1217  %mask = shl i32 -1, %numhighbits1218  %masked = and i32 %mask, %val1219  ret i32 %masked1220}1221 1222define i32 @clear_lowbits32_ic3_load_indexzext(ptr %w, i8 %numlowbits) nounwind {1223; X86-NOBMI2-LABEL: clear_lowbits32_ic3_load_indexzext:1224; X86-NOBMI2:       # %bb.0:1225; X86-NOBMI2-NEXT:    movl {{[0-9]+}}(%esp), %eax1226; X86-NOBMI2-NEXT:    movl (%eax), %eax1227; X86-NOBMI2-NEXT:    xorl %ecx, %ecx1228; X86-NOBMI2-NEXT:    subb {{[0-9]+}}(%esp), %cl1229; X86-NOBMI2-NEXT:    shrl %cl, %eax1230; X86-NOBMI2-NEXT:    # kill: def $cl killed $cl killed $ecx1231; X86-NOBMI2-NEXT:    shll %cl, %eax1232; X86-NOBMI2-NEXT:    retl1233;1234; X86-BMI2-LABEL: clear_lowbits32_ic3_load_indexzext:1235; X86-BMI2:       # %bb.0:1236; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %eax1237; X86-BMI2-NEXT:    xorl %ecx, %ecx1238; X86-BMI2-NEXT:    subb {{[0-9]+}}(%esp), %cl1239; X86-BMI2-NEXT:    shrxl %ecx, (%eax), %eax1240; X86-BMI2-NEXT:    shlxl %ecx, %eax, %eax1241; X86-BMI2-NEXT:    retl1242;1243; X64-NOBMI2-LABEL: clear_lowbits32_ic3_load_indexzext:1244; X64-NOBMI2:       # %bb.0:1245; X64-NOBMI2-NEXT:    movl %esi, %ecx1246; X64-NOBMI2-NEXT:    movl (%rdi), %eax1247; X64-NOBMI2-NEXT:    negb %cl1248; X64-NOBMI2-NEXT:    shrl %cl, %eax1249; X64-NOBMI2-NEXT:    # kill: def $cl killed $cl killed $ecx1250; X64-NOBMI2-NEXT:    shll %cl, %eax1251; X64-NOBMI2-NEXT:    retq1252;1253; X64-BMI2-LABEL: clear_lowbits32_ic3_load_indexzext:1254; X64-BMI2:       # %bb.0:1255; X64-BMI2-NEXT:    negb %sil1256; X64-BMI2-NEXT:    shrxl %esi, (%rdi), %eax1257; X64-BMI2-NEXT:    shlxl %esi, %eax, %eax1258; X64-BMI2-NEXT:    retq1259  %val = load i32, ptr %w1260  %numhighbits = sub i8 32, %numlowbits1261  %sh_prom = zext i8 %numhighbits to i321262  %mask = shl i32 -1, %sh_prom1263  %masked = and i32 %mask, %val1264  ret i32 %masked1265}1266 1267define i32 @clear_lowbits32_ic4_commutative(i32 %val, i32 %numlowbits) nounwind {1268; X86-NOBMI2-LABEL: clear_lowbits32_ic4_commutative:1269; X86-NOBMI2:       # %bb.0:1270; X86-NOBMI2-NEXT:    movl {{[0-9]+}}(%esp), %eax1271; X86-NOBMI2-NEXT:    xorl %ecx, %ecx1272; X86-NOBMI2-NEXT:    subb {{[0-9]+}}(%esp), %cl1273; X86-NOBMI2-NEXT:    shrl %cl, %eax1274; X86-NOBMI2-NEXT:    # kill: def $cl killed $cl killed $ecx1275; X86-NOBMI2-NEXT:    shll %cl, %eax1276; X86-NOBMI2-NEXT:    retl1277;1278; X86-BMI2-LABEL: clear_lowbits32_ic4_commutative:1279; X86-BMI2:       # %bb.0:1280; X86-BMI2-NEXT:    xorl %eax, %eax1281; X86-BMI2-NEXT:    subb {{[0-9]+}}(%esp), %al1282; X86-BMI2-NEXT:    shrxl %eax, {{[0-9]+}}(%esp), %ecx1283; X86-BMI2-NEXT:    shlxl %eax, %ecx, %eax1284; X86-BMI2-NEXT:    retl1285;1286; X64-NOBMI2-LABEL: clear_lowbits32_ic4_commutative:1287; X64-NOBMI2:       # %bb.0:1288; X64-NOBMI2-NEXT:    movl %esi, %ecx1289; X64-NOBMI2-NEXT:    movl %edi, %eax1290; X64-NOBMI2-NEXT:    negb %cl1291; X64-NOBMI2-NEXT:    shrl %cl, %eax1292; X64-NOBMI2-NEXT:    # kill: def $cl killed $cl killed $ecx1293; X64-NOBMI2-NEXT:    shll %cl, %eax1294; X64-NOBMI2-NEXT:    retq1295;1296; X64-BMI2-LABEL: clear_lowbits32_ic4_commutative:1297; X64-BMI2:       # %bb.0:1298; X64-BMI2-NEXT:    negb %sil1299; X64-BMI2-NEXT:    shrxl %esi, %edi, %eax1300; X64-BMI2-NEXT:    shlxl %esi, %eax, %eax1301; X64-BMI2-NEXT:    retq1302  %numhighbits = sub i32 32, %numlowbits1303  %mask = shl i32 -1, %numhighbits1304  %masked = and i32 %val, %mask ; swapped order1305  ret i32 %masked1306}1307 1308; 64-bit1309 1310define i64 @clear_lowbits64_ic0(i64 %val, i64 %numlowbits) nounwind {1311; X86-NOBMI2-LABEL: clear_lowbits64_ic0:1312; X86-NOBMI2:       # %bb.0:1313; X86-NOBMI2-NEXT:    movb $64, %cl1314; X86-NOBMI2-NEXT:    subb {{[0-9]+}}(%esp), %cl1315; X86-NOBMI2-NEXT:    movl $-1, %edx1316; X86-NOBMI2-NEXT:    movl $-1, %eax1317; X86-NOBMI2-NEXT:    shll %cl, %eax1318; X86-NOBMI2-NEXT:    testb $32, %cl1319; X86-NOBMI2-NEXT:    je .LBB31_21320; X86-NOBMI2-NEXT:  # %bb.1:1321; X86-NOBMI2-NEXT:    movl %eax, %edx1322; X86-NOBMI2-NEXT:    xorl %eax, %eax1323; X86-NOBMI2-NEXT:  .LBB31_2:1324; X86-NOBMI2-NEXT:    andl {{[0-9]+}}(%esp), %eax1325; X86-NOBMI2-NEXT:    andl {{[0-9]+}}(%esp), %edx1326; X86-NOBMI2-NEXT:    retl1327;1328; X86-BMI2-LABEL: clear_lowbits64_ic0:1329; X86-BMI2:       # %bb.0:1330; X86-BMI2-NEXT:    movb $64, %cl1331; X86-BMI2-NEXT:    subb {{[0-9]+}}(%esp), %cl1332; X86-BMI2-NEXT:    movl $-1, %edx1333; X86-BMI2-NEXT:    shlxl %ecx, %edx, %eax1334; X86-BMI2-NEXT:    testb $32, %cl1335; X86-BMI2-NEXT:    je .LBB31_21336; X86-BMI2-NEXT:  # %bb.1:1337; X86-BMI2-NEXT:    movl %eax, %edx1338; X86-BMI2-NEXT:    xorl %eax, %eax1339; X86-BMI2-NEXT:  .LBB31_2:1340; X86-BMI2-NEXT:    andl {{[0-9]+}}(%esp), %eax1341; X86-BMI2-NEXT:    andl {{[0-9]+}}(%esp), %edx1342; X86-BMI2-NEXT:    retl1343;1344; X64-NOBMI2-LABEL: clear_lowbits64_ic0:1345; X64-NOBMI2:       # %bb.0:1346; X64-NOBMI2-NEXT:    movq %rsi, %rcx1347; X64-NOBMI2-NEXT:    movq %rdi, %rax1348; X64-NOBMI2-NEXT:    negb %cl1349; X64-NOBMI2-NEXT:    shrq %cl, %rax1350; X64-NOBMI2-NEXT:    # kill: def $cl killed $cl killed $rcx1351; X64-NOBMI2-NEXT:    shlq %cl, %rax1352; X64-NOBMI2-NEXT:    retq1353;1354; X64-BMI2-LABEL: clear_lowbits64_ic0:1355; X64-BMI2:       # %bb.0:1356; X64-BMI2-NEXT:    negb %sil1357; X64-BMI2-NEXT:    shrxq %rsi, %rdi, %rax1358; X64-BMI2-NEXT:    shlxq %rsi, %rax, %rax1359; X64-BMI2-NEXT:    retq1360  %numhighbits = sub i64 64, %numlowbits1361  %mask = shl i64 -1, %numhighbits1362  %masked = and i64 %mask, %val1363  ret i64 %masked1364}1365 1366define i64 @clear_lowbits64_ic1_indexzext(i64 %val, i8 %numlowbits) nounwind {1367; X86-NOBMI2-LABEL: clear_lowbits64_ic1_indexzext:1368; X86-NOBMI2:       # %bb.0:1369; X86-NOBMI2-NEXT:    movb $64, %cl1370; X86-NOBMI2-NEXT:    subb {{[0-9]+}}(%esp), %cl1371; X86-NOBMI2-NEXT:    movl $-1, %edx1372; X86-NOBMI2-NEXT:    movl $-1, %eax1373; X86-NOBMI2-NEXT:    shll %cl, %eax1374; X86-NOBMI2-NEXT:    testb $32, %cl1375; X86-NOBMI2-NEXT:    je .LBB32_21376; X86-NOBMI2-NEXT:  # %bb.1:1377; X86-NOBMI2-NEXT:    movl %eax, %edx1378; X86-NOBMI2-NEXT:    xorl %eax, %eax1379; X86-NOBMI2-NEXT:  .LBB32_2:1380; X86-NOBMI2-NEXT:    andl {{[0-9]+}}(%esp), %eax1381; X86-NOBMI2-NEXT:    andl {{[0-9]+}}(%esp), %edx1382; X86-NOBMI2-NEXT:    retl1383;1384; X86-BMI2-LABEL: clear_lowbits64_ic1_indexzext:1385; X86-BMI2:       # %bb.0:1386; X86-BMI2-NEXT:    movb $64, %cl1387; X86-BMI2-NEXT:    subb {{[0-9]+}}(%esp), %cl1388; X86-BMI2-NEXT:    movl $-1, %edx1389; X86-BMI2-NEXT:    shlxl %ecx, %edx, %eax1390; X86-BMI2-NEXT:    testb $32, %cl1391; X86-BMI2-NEXT:    je .LBB32_21392; X86-BMI2-NEXT:  # %bb.1:1393; X86-BMI2-NEXT:    movl %eax, %edx1394; X86-BMI2-NEXT:    xorl %eax, %eax1395; X86-BMI2-NEXT:  .LBB32_2:1396; X86-BMI2-NEXT:    andl {{[0-9]+}}(%esp), %eax1397; X86-BMI2-NEXT:    andl {{[0-9]+}}(%esp), %edx1398; X86-BMI2-NEXT:    retl1399;1400; X64-NOBMI2-LABEL: clear_lowbits64_ic1_indexzext:1401; X64-NOBMI2:       # %bb.0:1402; X64-NOBMI2-NEXT:    movl %esi, %ecx1403; X64-NOBMI2-NEXT:    movq %rdi, %rax1404; X64-NOBMI2-NEXT:    negb %cl1405; X64-NOBMI2-NEXT:    shrq %cl, %rax1406; X64-NOBMI2-NEXT:    # kill: def $cl killed $cl killed $ecx1407; X64-NOBMI2-NEXT:    shlq %cl, %rax1408; X64-NOBMI2-NEXT:    retq1409;1410; X64-BMI2-LABEL: clear_lowbits64_ic1_indexzext:1411; X64-BMI2:       # %bb.0:1412; X64-BMI2-NEXT:    # kill: def $esi killed $esi def $rsi1413; X64-BMI2-NEXT:    negb %sil1414; X64-BMI2-NEXT:    shrxq %rsi, %rdi, %rax1415; X64-BMI2-NEXT:    shlxq %rsi, %rax, %rax1416; X64-BMI2-NEXT:    retq1417  %numhighbits = sub i8 64, %numlowbits1418  %sh_prom = zext i8 %numhighbits to i641419  %mask = shl i64 -1, %sh_prom1420  %masked = and i64 %mask, %val1421  ret i64 %masked1422}1423 1424define i64 @clear_lowbits64_ic2_load(ptr %w, i64 %numlowbits) nounwind {1425; X86-NOBMI2-LABEL: clear_lowbits64_ic2_load:1426; X86-NOBMI2:       # %bb.0:1427; X86-NOBMI2-NEXT:    pushl %esi1428; X86-NOBMI2-NEXT:    movl {{[0-9]+}}(%esp), %esi1429; X86-NOBMI2-NEXT:    movb $64, %cl1430; X86-NOBMI2-NEXT:    subb {{[0-9]+}}(%esp), %cl1431; X86-NOBMI2-NEXT:    movl $-1, %edx1432; X86-NOBMI2-NEXT:    movl $-1, %eax1433; X86-NOBMI2-NEXT:    shll %cl, %eax1434; X86-NOBMI2-NEXT:    testb $32, %cl1435; X86-NOBMI2-NEXT:    je .LBB33_21436; X86-NOBMI2-NEXT:  # %bb.1:1437; X86-NOBMI2-NEXT:    movl %eax, %edx1438; X86-NOBMI2-NEXT:    xorl %eax, %eax1439; X86-NOBMI2-NEXT:  .LBB33_2:1440; X86-NOBMI2-NEXT:    andl (%esi), %eax1441; X86-NOBMI2-NEXT:    andl 4(%esi), %edx1442; X86-NOBMI2-NEXT:    popl %esi1443; X86-NOBMI2-NEXT:    retl1444;1445; X86-BMI2-LABEL: clear_lowbits64_ic2_load:1446; X86-BMI2:       # %bb.0:1447; X86-BMI2-NEXT:    pushl %ebx1448; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %ecx1449; X86-BMI2-NEXT:    movb $64, %bl1450; X86-BMI2-NEXT:    subb {{[0-9]+}}(%esp), %bl1451; X86-BMI2-NEXT:    movl $-1, %edx1452; X86-BMI2-NEXT:    shlxl %ebx, %edx, %eax1453; X86-BMI2-NEXT:    testb $32, %bl1454; X86-BMI2-NEXT:    je .LBB33_21455; X86-BMI2-NEXT:  # %bb.1:1456; X86-BMI2-NEXT:    movl %eax, %edx1457; X86-BMI2-NEXT:    xorl %eax, %eax1458; X86-BMI2-NEXT:  .LBB33_2:1459; X86-BMI2-NEXT:    andl (%ecx), %eax1460; X86-BMI2-NEXT:    andl 4(%ecx), %edx1461; X86-BMI2-NEXT:    popl %ebx1462; X86-BMI2-NEXT:    retl1463;1464; X64-NOBMI2-LABEL: clear_lowbits64_ic2_load:1465; X64-NOBMI2:       # %bb.0:1466; X64-NOBMI2-NEXT:    movq %rsi, %rcx1467; X64-NOBMI2-NEXT:    movq (%rdi), %rax1468; X64-NOBMI2-NEXT:    negb %cl1469; X64-NOBMI2-NEXT:    shrq %cl, %rax1470; X64-NOBMI2-NEXT:    # kill: def $cl killed $cl killed $rcx1471; X64-NOBMI2-NEXT:    shlq %cl, %rax1472; X64-NOBMI2-NEXT:    retq1473;1474; X64-BMI2-LABEL: clear_lowbits64_ic2_load:1475; X64-BMI2:       # %bb.0:1476; X64-BMI2-NEXT:    negb %sil1477; X64-BMI2-NEXT:    shrxq %rsi, (%rdi), %rax1478; X64-BMI2-NEXT:    shlxq %rsi, %rax, %rax1479; X64-BMI2-NEXT:    retq1480  %val = load i64, ptr %w1481  %numhighbits = sub i64 64, %numlowbits1482  %mask = shl i64 -1, %numhighbits1483  %masked = and i64 %mask, %val1484  ret i64 %masked1485}1486 1487define i64 @clear_lowbits64_ic3_load_indexzext(ptr %w, i8 %numlowbits) nounwind {1488; X86-NOBMI2-LABEL: clear_lowbits64_ic3_load_indexzext:1489; X86-NOBMI2:       # %bb.0:1490; X86-NOBMI2-NEXT:    pushl %esi1491; X86-NOBMI2-NEXT:    movl {{[0-9]+}}(%esp), %esi1492; X86-NOBMI2-NEXT:    movb $64, %cl1493; X86-NOBMI2-NEXT:    subb {{[0-9]+}}(%esp), %cl1494; X86-NOBMI2-NEXT:    movl $-1, %edx1495; X86-NOBMI2-NEXT:    movl $-1, %eax1496; X86-NOBMI2-NEXT:    shll %cl, %eax1497; X86-NOBMI2-NEXT:    testb $32, %cl1498; X86-NOBMI2-NEXT:    je .LBB34_21499; X86-NOBMI2-NEXT:  # %bb.1:1500; X86-NOBMI2-NEXT:    movl %eax, %edx1501; X86-NOBMI2-NEXT:    xorl %eax, %eax1502; X86-NOBMI2-NEXT:  .LBB34_2:1503; X86-NOBMI2-NEXT:    andl (%esi), %eax1504; X86-NOBMI2-NEXT:    andl 4(%esi), %edx1505; X86-NOBMI2-NEXT:    popl %esi1506; X86-NOBMI2-NEXT:    retl1507;1508; X86-BMI2-LABEL: clear_lowbits64_ic3_load_indexzext:1509; X86-BMI2:       # %bb.0:1510; X86-BMI2-NEXT:    pushl %ebx1511; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %ecx1512; X86-BMI2-NEXT:    movb $64, %bl1513; X86-BMI2-NEXT:    subb {{[0-9]+}}(%esp), %bl1514; X86-BMI2-NEXT:    movl $-1, %edx1515; X86-BMI2-NEXT:    shlxl %ebx, %edx, %eax1516; X86-BMI2-NEXT:    testb $32, %bl1517; X86-BMI2-NEXT:    je .LBB34_21518; X86-BMI2-NEXT:  # %bb.1:1519; X86-BMI2-NEXT:    movl %eax, %edx1520; X86-BMI2-NEXT:    xorl %eax, %eax1521; X86-BMI2-NEXT:  .LBB34_2:1522; X86-BMI2-NEXT:    andl (%ecx), %eax1523; X86-BMI2-NEXT:    andl 4(%ecx), %edx1524; X86-BMI2-NEXT:    popl %ebx1525; X86-BMI2-NEXT:    retl1526;1527; X64-NOBMI2-LABEL: clear_lowbits64_ic3_load_indexzext:1528; X64-NOBMI2:       # %bb.0:1529; X64-NOBMI2-NEXT:    movl %esi, %ecx1530; X64-NOBMI2-NEXT:    movq (%rdi), %rax1531; X64-NOBMI2-NEXT:    negb %cl1532; X64-NOBMI2-NEXT:    shrq %cl, %rax1533; X64-NOBMI2-NEXT:    # kill: def $cl killed $cl killed $ecx1534; X64-NOBMI2-NEXT:    shlq %cl, %rax1535; X64-NOBMI2-NEXT:    retq1536;1537; X64-BMI2-LABEL: clear_lowbits64_ic3_load_indexzext:1538; X64-BMI2:       # %bb.0:1539; X64-BMI2-NEXT:    # kill: def $esi killed $esi def $rsi1540; X64-BMI2-NEXT:    negb %sil1541; X64-BMI2-NEXT:    shrxq %rsi, (%rdi), %rax1542; X64-BMI2-NEXT:    shlxq %rsi, %rax, %rax1543; X64-BMI2-NEXT:    retq1544  %val = load i64, ptr %w1545  %numhighbits = sub i8 64, %numlowbits1546  %sh_prom = zext i8 %numhighbits to i641547  %mask = shl i64 -1, %sh_prom1548  %masked = and i64 %mask, %val1549  ret i64 %masked1550}1551 1552define i64 @clear_lowbits64_ic4_commutative(i64 %val, i64 %numlowbits) nounwind {1553; X86-NOBMI2-LABEL: clear_lowbits64_ic4_commutative:1554; X86-NOBMI2:       # %bb.0:1555; X86-NOBMI2-NEXT:    movb $64, %cl1556; X86-NOBMI2-NEXT:    subb {{[0-9]+}}(%esp), %cl1557; X86-NOBMI2-NEXT:    movl $-1, %edx1558; X86-NOBMI2-NEXT:    movl $-1, %eax1559; X86-NOBMI2-NEXT:    shll %cl, %eax1560; X86-NOBMI2-NEXT:    testb $32, %cl1561; X86-NOBMI2-NEXT:    je .LBB35_21562; X86-NOBMI2-NEXT:  # %bb.1:1563; X86-NOBMI2-NEXT:    movl %eax, %edx1564; X86-NOBMI2-NEXT:    xorl %eax, %eax1565; X86-NOBMI2-NEXT:  .LBB35_2:1566; X86-NOBMI2-NEXT:    andl {{[0-9]+}}(%esp), %eax1567; X86-NOBMI2-NEXT:    andl {{[0-9]+}}(%esp), %edx1568; X86-NOBMI2-NEXT:    retl1569;1570; X86-BMI2-LABEL: clear_lowbits64_ic4_commutative:1571; X86-BMI2:       # %bb.0:1572; X86-BMI2-NEXT:    movb $64, %cl1573; X86-BMI2-NEXT:    subb {{[0-9]+}}(%esp), %cl1574; X86-BMI2-NEXT:    movl $-1, %edx1575; X86-BMI2-NEXT:    shlxl %ecx, %edx, %eax1576; X86-BMI2-NEXT:    testb $32, %cl1577; X86-BMI2-NEXT:    je .LBB35_21578; X86-BMI2-NEXT:  # %bb.1:1579; X86-BMI2-NEXT:    movl %eax, %edx1580; X86-BMI2-NEXT:    xorl %eax, %eax1581; X86-BMI2-NEXT:  .LBB35_2:1582; X86-BMI2-NEXT:    andl {{[0-9]+}}(%esp), %eax1583; X86-BMI2-NEXT:    andl {{[0-9]+}}(%esp), %edx1584; X86-BMI2-NEXT:    retl1585;1586; X64-NOBMI2-LABEL: clear_lowbits64_ic4_commutative:1587; X64-NOBMI2:       # %bb.0:1588; X64-NOBMI2-NEXT:    movq %rsi, %rcx1589; X64-NOBMI2-NEXT:    movq %rdi, %rax1590; X64-NOBMI2-NEXT:    negb %cl1591; X64-NOBMI2-NEXT:    shrq %cl, %rax1592; X64-NOBMI2-NEXT:    # kill: def $cl killed $cl killed $rcx1593; X64-NOBMI2-NEXT:    shlq %cl, %rax1594; X64-NOBMI2-NEXT:    retq1595;1596; X64-BMI2-LABEL: clear_lowbits64_ic4_commutative:1597; X64-BMI2:       # %bb.0:1598; X64-BMI2-NEXT:    negb %sil1599; X64-BMI2-NEXT:    shrxq %rsi, %rdi, %rax1600; X64-BMI2-NEXT:    shlxq %rsi, %rax, %rax1601; X64-BMI2-NEXT:    retq1602  %numhighbits = sub i64 64, %numlowbits1603  %mask = shl i64 -1, %numhighbits1604  %masked = and i64 %val, %mask ; swapped order1605  ret i64 %masked1606}1607 1608; ---------------------------------------------------------------------------- ;1609; Multi-use tests1610; ---------------------------------------------------------------------------- ;1611 1612define i32 @oneuse32_c(i32 %val, i32 %numlowbits, ptr %escape) nounwind {1613; X86-NOBMI2-LABEL: oneuse32_c:1614; X86-NOBMI2:       # %bb.0:1615; X86-NOBMI2-NEXT:    movl {{[0-9]+}}(%esp), %edx1616; X86-NOBMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx1617; X86-NOBMI2-NEXT:    movl $-1, %eax1618; X86-NOBMI2-NEXT:    shll %cl, %eax1619; X86-NOBMI2-NEXT:    movl %eax, (%edx)1620; X86-NOBMI2-NEXT:    andl {{[0-9]+}}(%esp), %eax1621; X86-NOBMI2-NEXT:    retl1622;1623; X86-BMI2-LABEL: oneuse32_c:1624; X86-BMI2:       # %bb.0:1625; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %ecx1626; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %eax1627; X86-BMI2-NEXT:    movl $-1, %edx1628; X86-BMI2-NEXT:    shlxl %eax, %edx, %eax1629; X86-BMI2-NEXT:    movl %eax, (%ecx)1630; X86-BMI2-NEXT:    andl {{[0-9]+}}(%esp), %eax1631; X86-BMI2-NEXT:    retl1632;1633; X64-NOBMI2-LABEL: oneuse32_c:1634; X64-NOBMI2:       # %bb.0:1635; X64-NOBMI2-NEXT:    movl %esi, %ecx1636; X64-NOBMI2-NEXT:    movl $-1, %eax1637; X64-NOBMI2-NEXT:    # kill: def $cl killed $cl killed $ecx1638; X64-NOBMI2-NEXT:    shll %cl, %eax1639; X64-NOBMI2-NEXT:    movl %eax, (%rdx)1640; X64-NOBMI2-NEXT:    andl %edi, %eax1641; X64-NOBMI2-NEXT:    retq1642;1643; X64-BMI2-LABEL: oneuse32_c:1644; X64-BMI2:       # %bb.0:1645; X64-BMI2-NEXT:    movl $-1, %eax1646; X64-BMI2-NEXT:    shlxl %esi, %eax, %eax1647; X64-BMI2-NEXT:    movl %eax, (%rdx)1648; X64-BMI2-NEXT:    andl %edi, %eax1649; X64-BMI2-NEXT:    retq1650  %mask = shl i32 -1, %numlowbits1651  store i32 %mask, ptr %escape1652  %masked = and i32 %mask, %val1653  ret i32 %masked1654}1655 1656define i64 @oneuse64(i64 %val, i64 %numlowbits, ptr %escape) nounwind {1657; X86-NOBMI2-LABEL: oneuse64:1658; X86-NOBMI2:       # %bb.0:1659; X86-NOBMI2-NEXT:    pushl %edi1660; X86-NOBMI2-NEXT:    pushl %esi1661; X86-NOBMI2-NEXT:    movl {{[0-9]+}}(%esp), %esi1662; X86-NOBMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx1663; X86-NOBMI2-NEXT:    movl $-1, %edx1664; X86-NOBMI2-NEXT:    movl $-1, %edi1665; X86-NOBMI2-NEXT:    shll %cl, %edi1666; X86-NOBMI2-NEXT:    xorl %eax, %eax1667; X86-NOBMI2-NEXT:    testb $32, %cl1668; X86-NOBMI2-NEXT:    jne .LBB37_11669; X86-NOBMI2-NEXT:  # %bb.2:1670; X86-NOBMI2-NEXT:    movl %edi, %eax1671; X86-NOBMI2-NEXT:    jmp .LBB37_31672; X86-NOBMI2-NEXT:  .LBB37_1:1673; X86-NOBMI2-NEXT:    movl %edi, %edx1674; X86-NOBMI2-NEXT:  .LBB37_3:1675; X86-NOBMI2-NEXT:    movl %edx, 4(%esi)1676; X86-NOBMI2-NEXT:    movl %eax, (%esi)1677; X86-NOBMI2-NEXT:    andl {{[0-9]+}}(%esp), %eax1678; X86-NOBMI2-NEXT:    andl {{[0-9]+}}(%esp), %edx1679; X86-NOBMI2-NEXT:    popl %esi1680; X86-NOBMI2-NEXT:    popl %edi1681; X86-NOBMI2-NEXT:    retl1682;1683; X86-BMI2-LABEL: oneuse64:1684; X86-BMI2:       # %bb.0:1685; X86-BMI2-NEXT:    pushl %ebx1686; X86-BMI2-NEXT:    pushl %esi1687; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %ecx1688; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %ebx1689; X86-BMI2-NEXT:    movl $-1, %edx1690; X86-BMI2-NEXT:    shlxl %ebx, %edx, %esi1691; X86-BMI2-NEXT:    xorl %eax, %eax1692; X86-BMI2-NEXT:    testb $32, %bl1693; X86-BMI2-NEXT:    jne .LBB37_11694; X86-BMI2-NEXT:  # %bb.2:1695; X86-BMI2-NEXT:    movl %esi, %eax1696; X86-BMI2-NEXT:    jmp .LBB37_31697; X86-BMI2-NEXT:  .LBB37_1:1698; X86-BMI2-NEXT:    movl %esi, %edx1699; X86-BMI2-NEXT:  .LBB37_3:1700; X86-BMI2-NEXT:    movl %edx, 4(%ecx)1701; X86-BMI2-NEXT:    movl %eax, (%ecx)1702; X86-BMI2-NEXT:    andl {{[0-9]+}}(%esp), %eax1703; X86-BMI2-NEXT:    andl {{[0-9]+}}(%esp), %edx1704; X86-BMI2-NEXT:    popl %esi1705; X86-BMI2-NEXT:    popl %ebx1706; X86-BMI2-NEXT:    retl1707;1708; X64-NOBMI2-LABEL: oneuse64:1709; X64-NOBMI2:       # %bb.0:1710; X64-NOBMI2-NEXT:    movq %rsi, %rcx1711; X64-NOBMI2-NEXT:    movq $-1, %rax1712; X64-NOBMI2-NEXT:    # kill: def $cl killed $cl killed $rcx1713; X64-NOBMI2-NEXT:    shlq %cl, %rax1714; X64-NOBMI2-NEXT:    movq %rax, (%rdx)1715; X64-NOBMI2-NEXT:    andq %rdi, %rax1716; X64-NOBMI2-NEXT:    retq1717;1718; X64-BMI2-LABEL: oneuse64:1719; X64-BMI2:       # %bb.0:1720; X64-BMI2-NEXT:    movq $-1, %rax1721; X64-BMI2-NEXT:    shlxq %rsi, %rax, %rax1722; X64-BMI2-NEXT:    movq %rax, (%rdx)1723; X64-BMI2-NEXT:    andq %rdi, %rax1724; X64-BMI2-NEXT:    retq1725  %mask = shl i64 -1, %numlowbits1726  store i64 %mask, ptr %escape1727  %masked = and i64 %mask, %val1728  ret i64 %masked1729}1730