brintos

brintos / llvm-project-archived public Read only

0
0
Text · 65.2 KiB · 023fb50 Raw
2030 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=i686--                   | FileCheck %s --check-prefixes=X863; RUN: llc < %s -mtriple=x86_64-- -mcpu=x86-64    | FileCheck %s --check-prefixes=X64,SSE,SSE24; RUN: llc < %s -mtriple=x86_64-- -mcpu=x86-64-v2 | FileCheck %s --check-prefixes=X64,SSE,SSE45; RUN: llc < %s -mtriple=x86_64-- -mcpu=x86-64-v3 | FileCheck %s --check-prefixes=X64,AVX,AVX26; RUN: llc < %s -mtriple=x86_64-- -mcpu=x86-64-v4 | FileCheck %s --check-prefixes=X64,AVX,AVX5127 8; bt/btc/btr/bts patterns + 'init' to set single bit value in large integers9 10;11; i32 bt/btc/btr/bts + init (reference)12;13 14define i1 @test_eq_i32(ptr %word, i32 %position) nounwind {15; X86-LABEL: test_eq_i32:16; X86:       # %bb.0:17; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax18; X86-NEXT:    movl (%eax), %eax19; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx20; X86-NEXT:    btl %ecx, %eax21; X86-NEXT:    setae %al22; X86-NEXT:    retl23;24; X64-LABEL: test_eq_i32:25; X64:       # %bb.0:26; X64-NEXT:    movl (%rdi), %eax27; X64-NEXT:    btl %esi, %eax28; X64-NEXT:    setae %al29; X64-NEXT:    retq30  %rem = and i32 %position, 3131  %bit = shl nuw i32 1, %rem32  %ld = load i32, ptr %word33  %test = and i32 %ld, %bit34  %cmp = icmp eq i32 %test, 035  ret i1 %cmp36}37 38define i1 @complement_ne_i32(ptr %word, i32 %position) nounwind {39; X86-LABEL: complement_ne_i32:40; X86:       # %bb.0:41; X86-NEXT:    pushl %esi42; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax43; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx44; X86-NEXT:    movl (%ecx), %edx45; X86-NEXT:    movl %edx, %esi46; X86-NEXT:    btcl %eax, %esi47; X86-NEXT:    btl %eax, %edx48; X86-NEXT:    setb %al49; X86-NEXT:    movl %esi, (%ecx)50; X86-NEXT:    popl %esi51; X86-NEXT:    retl52;53; X64-LABEL: complement_ne_i32:54; X64:       # %bb.0:55; X64-NEXT:    movl (%rdi), %eax56; X64-NEXT:    movl %eax, %ecx57; X64-NEXT:    btcl %esi, %ecx58; X64-NEXT:    btl %esi, %eax59; X64-NEXT:    setb %al60; X64-NEXT:    movl %ecx, (%rdi)61; X64-NEXT:    retq62  %ofs = and i32 %position, 3163  %bit = shl nuw i32 1, %ofs64  %ld = load i32, ptr %word65  %test = and i32 %ld, %bit66  %res = xor i32 %ld, %bit67  %cmp = icmp ne i32 %test, 068  store i32 %res, ptr %word69  ret i1 %cmp70}71 72define i1 @reset_eq_i32(ptr %word, i32 %position) nounwind {73; X86-LABEL: reset_eq_i32:74; X86:       # %bb.0:75; X86-NEXT:    pushl %esi76; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax77; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx78; X86-NEXT:    movl (%ecx), %edx79; X86-NEXT:    movl %edx, %esi80; X86-NEXT:    btrl %eax, %esi81; X86-NEXT:    btl %eax, %edx82; X86-NEXT:    setae %al83; X86-NEXT:    movl %esi, (%ecx)84; X86-NEXT:    popl %esi85; X86-NEXT:    retl86;87; X64-LABEL: reset_eq_i32:88; X64:       # %bb.0:89; X64-NEXT:    movl (%rdi), %eax90; X64-NEXT:    movl %eax, %ecx91; X64-NEXT:    btrl %esi, %ecx92; X64-NEXT:    btl %esi, %eax93; X64-NEXT:    setae %al94; X64-NEXT:    movl %ecx, (%rdi)95; X64-NEXT:    retq96  %ofs = and i32 %position, 3197  %bit = shl nuw i32 1, %ofs98  %mask = xor i32 %bit, -199  %ld = load i32, ptr %word100  %test = and i32 %ld, %bit101  %res = and i32 %ld, %mask102  %cmp = icmp eq i32 %test, 0103  store i32 %res, ptr %word104  ret i1 %cmp105}106 107define i1 @set_ne_i32(ptr %word, i32 %position) nounwind {108; X86-LABEL: set_ne_i32:109; X86:       # %bb.0:110; X86-NEXT:    pushl %esi111; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax112; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx113; X86-NEXT:    movl (%ecx), %edx114; X86-NEXT:    movl %edx, %esi115; X86-NEXT:    btsl %eax, %esi116; X86-NEXT:    btl %eax, %edx117; X86-NEXT:    setb %al118; X86-NEXT:    movl %esi, (%ecx)119; X86-NEXT:    popl %esi120; X86-NEXT:    retl121;122; X64-LABEL: set_ne_i32:123; X64:       # %bb.0:124; X64-NEXT:    movl (%rdi), %eax125; X64-NEXT:    movl %eax, %ecx126; X64-NEXT:    btsl %esi, %ecx127; X64-NEXT:    btl %esi, %eax128; X64-NEXT:    setb %al129; X64-NEXT:    movl %ecx, (%rdi)130; X64-NEXT:    retq131  %ofs = and i32 %position, 31132  %bit = shl nuw i32 1, %ofs133  %ld = load i32, ptr %word134  %test = and i32 %ld, %bit135  %res = or i32 %ld, %bit136  %cmp = icmp ne i32 %test, 0137  store i32 %res, ptr %word138  ret i1 %cmp139}140 141define i1 @init_eq_i32(ptr %word, i32 %position, i1 zeroext %value) nounwind {142; X86-LABEL: init_eq_i32:143; X86:       # %bb.0:144; X86-NEXT:    pushl %edi145; X86-NEXT:    pushl %esi146; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx147; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx148; X86-NEXT:    movzbl {{[0-9]+}}(%esp), %eax149; X86-NEXT:    shll %cl, %eax150; X86-NEXT:    movl (%edx), %esi151; X86-NEXT:    movl %esi, %edi152; X86-NEXT:    btrl %ecx, %edi153; X86-NEXT:    orl %eax, %edi154; X86-NEXT:    btl %ecx, %esi155; X86-NEXT:    setae %al156; X86-NEXT:    movl %edi, (%edx)157; X86-NEXT:    popl %esi158; X86-NEXT:    popl %edi159; X86-NEXT:    retl160;161; SSE-LABEL: init_eq_i32:162; SSE:       # %bb.0:163; SSE-NEXT:    movl %esi, %ecx164; SSE-NEXT:    shll %cl, %edx165; SSE-NEXT:    movl (%rdi), %eax166; SSE-NEXT:    movl %eax, %esi167; SSE-NEXT:    btrl %ecx, %esi168; SSE-NEXT:    orl %edx, %esi169; SSE-NEXT:    btl %ecx, %eax170; SSE-NEXT:    setae %al171; SSE-NEXT:    movl %esi, (%rdi)172; SSE-NEXT:    retq173;174; AVX-LABEL: init_eq_i32:175; AVX:       # %bb.0:176; AVX-NEXT:    shlxl %esi, %edx, %eax177; AVX-NEXT:    movl (%rdi), %ecx178; AVX-NEXT:    movl %ecx, %edx179; AVX-NEXT:    btrl %esi, %edx180; AVX-NEXT:    orl %eax, %edx181; AVX-NEXT:    btl %esi, %ecx182; AVX-NEXT:    setae %al183; AVX-NEXT:    movl %edx, (%rdi)184; AVX-NEXT:    retq185  %ofs = and i32 %position, 31186  %bit = shl nuw i32 1, %ofs187  %mask = xor i32 %bit, -1188  %val0 = zext i1 %value to i32189  %val = shl nuw i32 %val0, %ofs190  %ld = load i32, ptr %word191  %test = and i32 %ld, %bit192  %res0 = and i32 %ld, %mask193  %res = or i32 %res0, %val194  %cmp = icmp eq i32 %test, 0195  store i32 %res, ptr %word196  ret i1 %cmp197}198 199;200; i64 bt/btc/btr/bts + init201;202 203define i1 @test_ne_i64(ptr %word, i32 %position) nounwind {204; X86-LABEL: test_ne_i64:205; X86:       # %bb.0:206; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax207; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx208; X86-NEXT:    movl %ecx, %edx209; X86-NEXT:    andl $32, %edx210; X86-NEXT:    shrl $3, %edx211; X86-NEXT:    movl (%eax,%edx), %eax212; X86-NEXT:    btl %ecx, %eax213; X86-NEXT:    setb %al214; X86-NEXT:    retl215;216; X64-LABEL: test_ne_i64:217; X64:       # %bb.0:218; X64-NEXT:    # kill: def $esi killed $esi def $rsi219; X64-NEXT:    movq (%rdi), %rax220; X64-NEXT:    btq %rsi, %rax221; X64-NEXT:    setb %al222; X64-NEXT:    retq223  %rem = and i32 %position, 63224  %ofs = zext nneg i32 %rem to i64225  %bit = shl nuw i64 1, %ofs226  %ld = load i64, ptr %word227  %test = and i64 %ld, %bit228  %cmp = icmp ne i64 %test, 0229  ret i1 %cmp230}231 232define i1 @complement_ne_i64(ptr %word, i32 %position) nounwind {233; X86-LABEL: complement_ne_i64:234; X86:       # %bb.0:235; X86-NEXT:    pushl %edi236; X86-NEXT:    pushl %esi237; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx238; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx239; X86-NEXT:    movl %edx, %esi240; X86-NEXT:    andl $32, %esi241; X86-NEXT:    shrl $3, %esi242; X86-NEXT:    movl (%ecx,%esi), %edi243; X86-NEXT:    btl %edx, %edi244; X86-NEXT:    setb %al245; X86-NEXT:    btcl %edx, %edi246; X86-NEXT:    movl %edi, (%ecx,%esi)247; X86-NEXT:    popl %esi248; X86-NEXT:    popl %edi249; X86-NEXT:    retl250;251; X64-LABEL: complement_ne_i64:252; X64:       # %bb.0:253; X64-NEXT:    # kill: def $esi killed $esi def $rsi254; X64-NEXT:    movq (%rdi), %rax255; X64-NEXT:    movq %rax, %rcx256; X64-NEXT:    btcq %rsi, %rcx257; X64-NEXT:    btq %rsi, %rax258; X64-NEXT:    setb %al259; X64-NEXT:    movq %rcx, (%rdi)260; X64-NEXT:    retq261  %rem = and i32 %position, 63262  %ofs = zext nneg i32 %rem to i64263  %bit = shl nuw i64 1, %ofs264  %ld = load i64, ptr %word265  %test = and i64 %ld, %bit266  %res = xor i64 %ld, %bit267  %cmp = icmp ne i64 %test, 0268  store i64 %res, ptr %word269  ret i1 %cmp270}271 272define i1 @reset_eq_i64(ptr %word, i32 %position) nounwind {273; X86-LABEL: reset_eq_i64:274; X86:       # %bb.0:275; X86-NEXT:    pushl %edi276; X86-NEXT:    pushl %esi277; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx278; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx279; X86-NEXT:    movl %edx, %esi280; X86-NEXT:    andl $32, %esi281; X86-NEXT:    shrl $3, %esi282; X86-NEXT:    movl (%ecx,%esi), %edi283; X86-NEXT:    btl %edx, %edi284; X86-NEXT:    setae %al285; X86-NEXT:    btrl %edx, %edi286; X86-NEXT:    movl %edi, (%ecx,%esi)287; X86-NEXT:    popl %esi288; X86-NEXT:    popl %edi289; X86-NEXT:    retl290;291; X64-LABEL: reset_eq_i64:292; X64:       # %bb.0:293; X64-NEXT:    # kill: def $esi killed $esi def $rsi294; X64-NEXT:    movq (%rdi), %rax295; X64-NEXT:    movq %rax, %rcx296; X64-NEXT:    btrq %rsi, %rcx297; X64-NEXT:    btq %rsi, %rax298; X64-NEXT:    setae %al299; X64-NEXT:    movq %rcx, (%rdi)300; X64-NEXT:    retq301  %rem = and i32 %position, 63302  %ofs = zext nneg i32 %rem to i64303  %bit = shl nuw i64 1, %ofs304  %mask = xor i64 %bit, -1305  %ld = load i64, ptr %word306  %test = and i64 %ld, %bit307  %res = and i64 %ld, %mask308  %cmp = icmp eq i64 %test, 0309  store i64 %res, ptr %word310  ret i1 %cmp311}312 313define i1 @set_ne_i64(ptr %word, i32 %position) nounwind {314; X86-LABEL: set_ne_i64:315; X86:       # %bb.0:316; X86-NEXT:    pushl %edi317; X86-NEXT:    pushl %esi318; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx319; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx320; X86-NEXT:    movl %edx, %esi321; X86-NEXT:    andl $32, %esi322; X86-NEXT:    shrl $3, %esi323; X86-NEXT:    movl (%ecx,%esi), %edi324; X86-NEXT:    btl %edx, %edi325; X86-NEXT:    setb %al326; X86-NEXT:    btsl %edx, %edi327; X86-NEXT:    movl %edi, (%ecx,%esi)328; X86-NEXT:    popl %esi329; X86-NEXT:    popl %edi330; X86-NEXT:    retl331;332; X64-LABEL: set_ne_i64:333; X64:       # %bb.0:334; X64-NEXT:    # kill: def $esi killed $esi def $rsi335; X64-NEXT:    movq (%rdi), %rax336; X64-NEXT:    movq %rax, %rcx337; X64-NEXT:    btsq %rsi, %rcx338; X64-NEXT:    btq %rsi, %rax339; X64-NEXT:    setb %al340; X64-NEXT:    movq %rcx, (%rdi)341; X64-NEXT:    retq342  %rem = and i32 %position, 63343  %ofs = zext nneg i32 %rem to i64344  %bit = shl nuw i64 1, %ofs345  %ld = load i64, ptr %word346  %test = and i64 %ld, %bit347  %res = or i64 %ld, %bit348  %cmp = icmp ne i64 %test, 0349  store i64 %res, ptr %word350  ret i1 %cmp351}352 353define i1 @init_eq_i64(ptr %word, i32 %position, i1 zeroext %value) nounwind {354; X86-LABEL: init_eq_i64:355; X86:       # %bb.0:356; X86-NEXT:    pushl %ebx357; X86-NEXT:    pushl %edi358; X86-NEXT:    pushl %esi359; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx360; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx361; X86-NEXT:    movl %ecx, %esi362; X86-NEXT:    andl $32, %esi363; X86-NEXT:    shrl $3, %esi364; X86-NEXT:    movl (%edx,%esi), %edi365; X86-NEXT:    btl %ecx, %edi366; X86-NEXT:    setae %al367; X86-NEXT:    btrl %ecx, %edi368; X86-NEXT:    movzbl {{[0-9]+}}(%esp), %ebx369; X86-NEXT:    # kill: def $cl killed $cl killed $ecx370; X86-NEXT:    shll %cl, %ebx371; X86-NEXT:    orl %edi, %ebx372; X86-NEXT:    movl %ebx, (%edx,%esi)373; X86-NEXT:    popl %esi374; X86-NEXT:    popl %edi375; X86-NEXT:    popl %ebx376; X86-NEXT:    retl377;378; SSE-LABEL: init_eq_i64:379; SSE:       # %bb.0:380; SSE-NEXT:    movl %esi, %ecx381; SSE-NEXT:    movl %edx, %eax382; SSE-NEXT:    shlq %cl, %rax383; SSE-NEXT:    movq (%rdi), %rdx384; SSE-NEXT:    movq %rdx, %rsi385; SSE-NEXT:    btrq %rcx, %rsi386; SSE-NEXT:    orq %rax, %rsi387; SSE-NEXT:    btq %rcx, %rdx388; SSE-NEXT:    setae %al389; SSE-NEXT:    movq %rsi, (%rdi)390; SSE-NEXT:    retq391;392; AVX-LABEL: init_eq_i64:393; AVX:       # %bb.0:394; AVX-NEXT:    # kill: def $esi killed $esi def $rsi395; AVX-NEXT:    movl %edx, %eax396; AVX-NEXT:    shlxq %rsi, %rax, %rax397; AVX-NEXT:    movq (%rdi), %rcx398; AVX-NEXT:    movq %rcx, %rdx399; AVX-NEXT:    btrq %rsi, %rdx400; AVX-NEXT:    orq %rax, %rdx401; AVX-NEXT:    btq %rsi, %rcx402; AVX-NEXT:    setae %al403; AVX-NEXT:    movq %rdx, (%rdi)404; AVX-NEXT:    retq405  %rem = and i32 %position, 63406  %ofs = zext nneg i32 %rem to i64407  %bit = shl nuw i64 1, %ofs408  %mask = xor i64 %bit, -1409  %val0 = zext i1 %value to i64410  %val = shl nuw i64 %val0, %ofs411  %ld = load i64, ptr %word412  %test = and i64 %ld, %bit413  %res0 = and i64 %ld, %mask414  %res = or i64 %res0, %val415  %cmp = icmp eq i64 %test, 0416  store i64 %res, ptr %word417  ret i1 %cmp418}419 420;421; i128422;423 424define i1 @test_ne_i128(ptr %word, i32 %position) nounwind {425; X86-LABEL: test_ne_i128:426; X86:       # %bb.0:427; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax428; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx429; X86-NEXT:    movl %ecx, %edx430; X86-NEXT:    andl $96, %edx431; X86-NEXT:    shrl $3, %edx432; X86-NEXT:    movl (%eax,%edx), %eax433; X86-NEXT:    btl %ecx, %eax434; X86-NEXT:    setb %al435; X86-NEXT:    retl436;437; X64-LABEL: test_ne_i128:438; X64:       # %bb.0:439; X64-NEXT:    movl %esi, %eax440; X64-NEXT:    andl $96, %eax441; X64-NEXT:    shrl $3, %eax442; X64-NEXT:    movl (%rdi,%rax), %eax443; X64-NEXT:    btl %esi, %eax444; X64-NEXT:    setb %al445; X64-NEXT:    retq446  %rem = and i32 %position, 127447  %ofs = zext nneg i32 %rem to i128448  %bit = shl nuw i128 1, %ofs449  %ld = load i128, ptr %word450  %test = and i128 %ld, %bit451  %cmp = icmp ne i128 %test, 0452  ret i1 %cmp453}454 455define i1 @complement_ne_i128(ptr %word, i32 %position) nounwind {456; X86-LABEL: complement_ne_i128:457; X86:       # %bb.0:458; X86-NEXT:    pushl %edi459; X86-NEXT:    pushl %esi460; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx461; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx462; X86-NEXT:    movl %edx, %esi463; X86-NEXT:    andl $96, %esi464; X86-NEXT:    shrl $3, %esi465; X86-NEXT:    movl (%ecx,%esi), %edi466; X86-NEXT:    btl %edx, %edi467; X86-NEXT:    setb %al468; X86-NEXT:    btcl %edx, %edi469; X86-NEXT:    movl %edi, (%ecx,%esi)470; X86-NEXT:    popl %esi471; X86-NEXT:    popl %edi472; X86-NEXT:    retl473;474; X64-LABEL: complement_ne_i128:475; X64:       # %bb.0:476; X64-NEXT:    movl %esi, %ecx477; X64-NEXT:    andl $96, %ecx478; X64-NEXT:    shrl $3, %ecx479; X64-NEXT:    movl (%rdi,%rcx), %edx480; X64-NEXT:    btl %esi, %edx481; X64-NEXT:    setb %al482; X64-NEXT:    btcl %esi, %edx483; X64-NEXT:    movl %edx, (%rdi,%rcx)484; X64-NEXT:    retq485  %rem = and i32 %position, 127486  %ofs = zext nneg i32 %rem to i128487  %bit = shl nuw i128 1, %ofs488  %ld = load i128, ptr %word489  %test = and i128 %ld, %bit490  %res = xor i128 %ld, %bit491  %cmp = icmp ne i128 %test, 0492  store i128 %res, ptr %word493  ret i1 %cmp494}495 496define i1 @reset_eq_i128(ptr %word, i32 %position) nounwind {497; X86-LABEL: reset_eq_i128:498; X86:       # %bb.0:499; X86-NEXT:    pushl %edi500; X86-NEXT:    pushl %esi501; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx502; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx503; X86-NEXT:    movl %edx, %esi504; X86-NEXT:    andl $96, %esi505; X86-NEXT:    shrl $3, %esi506; X86-NEXT:    movl (%ecx,%esi), %edi507; X86-NEXT:    btl %edx, %edi508; X86-NEXT:    setae %al509; X86-NEXT:    btrl %edx, %edi510; X86-NEXT:    movl %edi, (%ecx,%esi)511; X86-NEXT:    popl %esi512; X86-NEXT:    popl %edi513; X86-NEXT:    retl514;515; X64-LABEL: reset_eq_i128:516; X64:       # %bb.0:517; X64-NEXT:    movl %esi, %ecx518; X64-NEXT:    andl $96, %ecx519; X64-NEXT:    shrl $3, %ecx520; X64-NEXT:    movl (%rdi,%rcx), %edx521; X64-NEXT:    btl %esi, %edx522; X64-NEXT:    setae %al523; X64-NEXT:    btrl %esi, %edx524; X64-NEXT:    movl %edx, (%rdi,%rcx)525; X64-NEXT:    retq526  %rem = and i32 %position, 127527  %ofs = zext nneg i32 %rem to i128528  %bit = shl nuw i128 1, %ofs529  %mask = xor i128 %bit, -1530  %ld = load i128, ptr %word531  %test = and i128 %ld, %bit532  %res = and i128 %ld, %mask533  %cmp = icmp eq i128 %test, 0534  store i128 %res, ptr %word535  ret i1 %cmp536}537 538define i1 @set_ne_i128(ptr %word, i32 %position) nounwind {539; X86-LABEL: set_ne_i128:540; X86:       # %bb.0:541; X86-NEXT:    pushl %edi542; X86-NEXT:    pushl %esi543; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx544; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx545; X86-NEXT:    movl %edx, %esi546; X86-NEXT:    andl $96, %esi547; X86-NEXT:    shrl $3, %esi548; X86-NEXT:    movl (%ecx,%esi), %edi549; X86-NEXT:    btl %edx, %edi550; X86-NEXT:    setb %al551; X86-NEXT:    btsl %edx, %edi552; X86-NEXT:    movl %edi, (%ecx,%esi)553; X86-NEXT:    popl %esi554; X86-NEXT:    popl %edi555; X86-NEXT:    retl556;557; X64-LABEL: set_ne_i128:558; X64:       # %bb.0:559; X64-NEXT:    movl %esi, %ecx560; X64-NEXT:    andl $96, %ecx561; X64-NEXT:    shrl $3, %ecx562; X64-NEXT:    movl (%rdi,%rcx), %edx563; X64-NEXT:    btl %esi, %edx564; X64-NEXT:    setb %al565; X64-NEXT:    btsl %esi, %edx566; X64-NEXT:    movl %edx, (%rdi,%rcx)567; X64-NEXT:    retq568  %rem = and i32 %position, 127569  %ofs = zext nneg i32 %rem to i128570  %bit = shl nuw i128 1, %ofs571  %ld = load i128, ptr %word572  %test = and i128 %ld, %bit573  %res = or i128 %ld, %bit574  %cmp = icmp ne i128 %test, 0575  store i128 %res, ptr %word576  ret i1 %cmp577}578 579define i1 @init_eq_i128(ptr %word, i32 %position, i1 zeroext %value) nounwind {580; X86-LABEL: init_eq_i128:581; X86:       # %bb.0:582; X86-NEXT:    pushl %ebx583; X86-NEXT:    pushl %edi584; X86-NEXT:    pushl %esi585; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx586; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx587; X86-NEXT:    movl %ecx, %esi588; X86-NEXT:    andl $96, %esi589; X86-NEXT:    shrl $3, %esi590; X86-NEXT:    movl (%edx,%esi), %edi591; X86-NEXT:    btl %ecx, %edi592; X86-NEXT:    setae %al593; X86-NEXT:    btrl %ecx, %edi594; X86-NEXT:    movzbl {{[0-9]+}}(%esp), %ebx595; X86-NEXT:    # kill: def $cl killed $cl killed $ecx596; X86-NEXT:    shll %cl, %ebx597; X86-NEXT:    orl %edi, %ebx598; X86-NEXT:    movl %ebx, (%edx,%esi)599; X86-NEXT:    popl %esi600; X86-NEXT:    popl %edi601; X86-NEXT:    popl %ebx602; X86-NEXT:    retl603;604; SSE-LABEL: init_eq_i128:605; SSE:       # %bb.0:606; SSE-NEXT:    movl %esi, %ecx607; SSE-NEXT:    andl $96, %esi608; SSE-NEXT:    shrl $3, %esi609; SSE-NEXT:    movl (%rdi,%rsi), %r8d610; SSE-NEXT:    btl %ecx, %r8d611; SSE-NEXT:    setae %al612; SSE-NEXT:    shll %cl, %edx613; SSE-NEXT:    btrl %ecx, %r8d614; SSE-NEXT:    orl %r8d, %edx615; SSE-NEXT:    movl %edx, (%rdi,%rsi)616; SSE-NEXT:    retq617;618; AVX-LABEL: init_eq_i128:619; AVX:       # %bb.0:620; AVX-NEXT:    movl %esi, %ecx621; AVX-NEXT:    andl $96, %ecx622; AVX-NEXT:    shrl $3, %ecx623; AVX-NEXT:    movl (%rdi,%rcx), %r8d624; AVX-NEXT:    btl %esi, %r8d625; AVX-NEXT:    setae %al626; AVX-NEXT:    btrl %esi, %r8d627; AVX-NEXT:    shlxl %esi, %edx, %edx628; AVX-NEXT:    orl %r8d, %edx629; AVX-NEXT:    movl %edx, (%rdi,%rcx)630; AVX-NEXT:    retq631  %rem = and i32 %position, 127632  %ofs = zext nneg i32 %rem to i128633  %bit = shl nuw i128 1, %ofs634  %mask = xor i128 %bit, -1635  %val0 = zext i1 %value to i128636  %val = shl nuw i128 %val0, %ofs637  %ld = load i128, ptr %word638  %test = and i128 %ld, %bit639  %res0 = and i128 %ld, %mask640  %res = or i128 %res0, %val641  %cmp = icmp eq i128 %test, 0642  store i128 %res, ptr %word643  ret i1 %cmp644}645 646; i512647 648define i1 @test_ne_i512(ptr %word, i32 %position) nounwind {649; X86-LABEL: test_ne_i512:650; X86:       # %bb.0:651; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax652; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx653; X86-NEXT:    movl %ecx, %edx654; X86-NEXT:    shrl $3, %edx655; X86-NEXT:    andl $60, %edx656; X86-NEXT:    movl (%eax,%edx), %eax657; X86-NEXT:    btl %ecx, %eax658; X86-NEXT:    setb %al659; X86-NEXT:    retl660;661; X64-LABEL: test_ne_i512:662; X64:       # %bb.0:663; X64-NEXT:    movl %esi, %eax664; X64-NEXT:    shrl $3, %eax665; X64-NEXT:    andl $60, %eax666; X64-NEXT:    movl (%rdi,%rax), %eax667; X64-NEXT:    btl %esi, %eax668; X64-NEXT:    setb %al669; X64-NEXT:    retq670  %rem = and i32 %position, 511671  %ofs = zext nneg i32 %rem to i512672  %bit = shl nuw i512 1, %ofs673  %ld = load i512, ptr %word674  %test = and i512 %ld, %bit675  %cmp = icmp ne i512 %test, 0676  ret i1 %cmp677}678 679define i1 @complement_ne_i512(ptr %word, i32 %position) nounwind {680; X86-LABEL: complement_ne_i512:681; X86:       # %bb.0:682; X86-NEXT:    pushl %edi683; X86-NEXT:    pushl %esi684; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx685; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx686; X86-NEXT:    movl %edx, %esi687; X86-NEXT:    shrl $3, %esi688; X86-NEXT:    andl $60, %esi689; X86-NEXT:    movl (%ecx,%esi), %edi690; X86-NEXT:    btl %edx, %edi691; X86-NEXT:    setb %al692; X86-NEXT:    btcl %edx, %edi693; X86-NEXT:    movl %edi, (%ecx,%esi)694; X86-NEXT:    popl %esi695; X86-NEXT:    popl %edi696; X86-NEXT:    retl697;698; X64-LABEL: complement_ne_i512:699; X64:       # %bb.0:700; X64-NEXT:    movl %esi, %ecx701; X64-NEXT:    shrl $3, %ecx702; X64-NEXT:    andl $60, %ecx703; X64-NEXT:    movl (%rdi,%rcx), %edx704; X64-NEXT:    btl %esi, %edx705; X64-NEXT:    setb %al706; X64-NEXT:    btcl %esi, %edx707; X64-NEXT:    movl %edx, (%rdi,%rcx)708; X64-NEXT:    retq709  %rem = and i32 %position, 511710  %ofs = zext nneg i32 %rem to i512711  %bit = shl nuw i512 1, %ofs712  %ld = load i512, ptr %word713  %test = and i512 %ld, %bit714  %res = xor i512 %ld, %bit715  %cmp = icmp ne i512 %test, 0716  store i512 %res, ptr %word717  ret i1 %cmp718}719 720define i1 @reset_eq_i512(ptr %word, i32 %position) nounwind {721; X86-LABEL: reset_eq_i512:722; X86:       # %bb.0:723; X86-NEXT:    pushl %edi724; X86-NEXT:    pushl %esi725; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx726; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx727; X86-NEXT:    movl %edx, %esi728; X86-NEXT:    shrl $3, %esi729; X86-NEXT:    andl $60, %esi730; X86-NEXT:    movl (%ecx,%esi), %edi731; X86-NEXT:    btl %edx, %edi732; X86-NEXT:    setae %al733; X86-NEXT:    btrl %edx, %edi734; X86-NEXT:    movl %edi, (%ecx,%esi)735; X86-NEXT:    popl %esi736; X86-NEXT:    popl %edi737; X86-NEXT:    retl738;739; X64-LABEL: reset_eq_i512:740; X64:       # %bb.0:741; X64-NEXT:    movl %esi, %ecx742; X64-NEXT:    shrl $3, %ecx743; X64-NEXT:    andl $60, %ecx744; X64-NEXT:    movl (%rdi,%rcx), %edx745; X64-NEXT:    btl %esi, %edx746; X64-NEXT:    setae %al747; X64-NEXT:    btrl %esi, %edx748; X64-NEXT:    movl %edx, (%rdi,%rcx)749; X64-NEXT:    retq750  %rem = and i32 %position, 511751  %ofs = zext nneg i32 %rem to i512752  %bit = shl nuw i512 1, %ofs753  %mask = xor i512 %bit, -1754  %ld = load i512, ptr %word755  %test = and i512 %ld, %bit756  %res = and i512 %ld, %mask757  %cmp = icmp eq i512 %test, 0758  store i512 %res, ptr %word759  ret i1 %cmp760}761 762define i1 @set_ne_i512(ptr %word, i32 %position) nounwind {763; X86-LABEL: set_ne_i512:764; X86:       # %bb.0:765; X86-NEXT:    pushl %edi766; X86-NEXT:    pushl %esi767; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx768; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx769; X86-NEXT:    movl %edx, %esi770; X86-NEXT:    shrl $3, %esi771; X86-NEXT:    andl $60, %esi772; X86-NEXT:    movl (%ecx,%esi), %edi773; X86-NEXT:    btl %edx, %edi774; X86-NEXT:    setb %al775; X86-NEXT:    btsl %edx, %edi776; X86-NEXT:    movl %edi, (%ecx,%esi)777; X86-NEXT:    popl %esi778; X86-NEXT:    popl %edi779; X86-NEXT:    retl780;781; X64-LABEL: set_ne_i512:782; X64:       # %bb.0:783; X64-NEXT:    movl %esi, %ecx784; X64-NEXT:    shrl $3, %ecx785; X64-NEXT:    andl $60, %ecx786; X64-NEXT:    movl (%rdi,%rcx), %edx787; X64-NEXT:    btl %esi, %edx788; X64-NEXT:    setb %al789; X64-NEXT:    btsl %esi, %edx790; X64-NEXT:    movl %edx, (%rdi,%rcx)791; X64-NEXT:    retq792  %rem = and i32 %position, 511793  %ofs = zext nneg i32 %rem to i512794  %bit = shl nuw i512 1, %ofs795  %ld = load i512, ptr %word796  %test = and i512 %ld, %bit797  %res = or i512 %ld, %bit798  %cmp = icmp ne i512 %test, 0799  store i512 %res, ptr %word800  ret i1 %cmp801}802 803define i1 @init_eq_i512(ptr %word, i32 %position, i1 zeroext %value) nounwind {804; X86-LABEL: init_eq_i512:805; X86:       # %bb.0:806; X86-NEXT:    pushl %ebx807; X86-NEXT:    pushl %edi808; X86-NEXT:    pushl %esi809; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx810; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx811; X86-NEXT:    movl %ecx, %esi812; X86-NEXT:    shrl $3, %esi813; X86-NEXT:    andl $60, %esi814; X86-NEXT:    movl (%edx,%esi), %edi815; X86-NEXT:    btl %ecx, %edi816; X86-NEXT:    setae %al817; X86-NEXT:    btrl %ecx, %edi818; X86-NEXT:    movzbl {{[0-9]+}}(%esp), %ebx819; X86-NEXT:    # kill: def $cl killed $cl killed $ecx820; X86-NEXT:    shll %cl, %ebx821; X86-NEXT:    orl %edi, %ebx822; X86-NEXT:    movl %ebx, (%edx,%esi)823; X86-NEXT:    popl %esi824; X86-NEXT:    popl %edi825; X86-NEXT:    popl %ebx826; X86-NEXT:    retl827;828; SSE-LABEL: init_eq_i512:829; SSE:       # %bb.0:830; SSE-NEXT:    movl %esi, %ecx831; SSE-NEXT:    shrl $3, %esi832; SSE-NEXT:    andl $60, %esi833; SSE-NEXT:    movl (%rdi,%rsi), %r8d834; SSE-NEXT:    btl %ecx, %r8d835; SSE-NEXT:    setae %al836; SSE-NEXT:    shll %cl, %edx837; SSE-NEXT:    btrl %ecx, %r8d838; SSE-NEXT:    orl %r8d, %edx839; SSE-NEXT:    movl %edx, (%rdi,%rsi)840; SSE-NEXT:    retq841;842; AVX-LABEL: init_eq_i512:843; AVX:       # %bb.0:844; AVX-NEXT:    movl %esi, %ecx845; AVX-NEXT:    shrl $3, %ecx846; AVX-NEXT:    andl $60, %ecx847; AVX-NEXT:    movl (%rdi,%rcx), %r8d848; AVX-NEXT:    btl %esi, %r8d849; AVX-NEXT:    setae %al850; AVX-NEXT:    btrl %esi, %r8d851; AVX-NEXT:    shlxl %esi, %edx, %edx852; AVX-NEXT:    orl %r8d, %edx853; AVX-NEXT:    movl %edx, (%rdi,%rcx)854; AVX-NEXT:    retq855  %rem = and i32 %position, 511856  %ofs = zext nneg i32 %rem to i512857  %bit = shl nuw i512 1, %ofs858  %mask = xor i512 %bit, -1859  %val0 = zext i1 %value to i512860  %val = shl nuw i512 %val0, %ofs861  %ld = load i512, ptr %word862  %test = and i512 %ld, %bit863  %res0 = and i512 %ld, %mask864  %res = or i512 %res0, %val865  %cmp = icmp eq i512 %test, 0866  store i512 %res, ptr %word867  ret i1 %cmp868}869 870; i4096871 872define i1 @test_ne_i4096(ptr %word, i32 %position) nounwind {873; X86-LABEL: test_ne_i4096:874; X86:       # %bb.0:875; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax876; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx877; X86-NEXT:    movl %ecx, %edx878; X86-NEXT:    andl $4064, %edx # imm = 0xFE0879; X86-NEXT:    shrl $3, %edx880; X86-NEXT:    movl (%eax,%edx), %eax881; X86-NEXT:    btl %ecx, %eax882; X86-NEXT:    setb %al883; X86-NEXT:    retl884;885; X64-LABEL: test_ne_i4096:886; X64:       # %bb.0:887; X64-NEXT:    movl %esi, %eax888; X64-NEXT:    andl $4064, %eax # imm = 0xFE0889; X64-NEXT:    shrl $3, %eax890; X64-NEXT:    movl (%rdi,%rax), %eax891; X64-NEXT:    btl %esi, %eax892; X64-NEXT:    setb %al893; X64-NEXT:    retq894  %rem = and i32 %position, 4095895  %ofs = zext nneg i32 %rem to i4096896  %bit = shl nuw i4096 1, %ofs897  %ld = load i4096, ptr %word898  %test = and i4096 %ld, %bit899  %cmp = icmp ne i4096 %test, 0900  ret i1 %cmp901}902 903; Special Cases904 905; Multiple uses of the stored value906define i1 @complement_cmpz_i128(ptr %word, i32 %position) nounwind {907; X86-LABEL: complement_cmpz_i128:908; X86:       # %bb.0:909; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax910; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx911; X86-NEXT:    movl $1, %edx912; X86-NEXT:    shll %cl, %edx913; X86-NEXT:    andl $96, %ecx914; X86-NEXT:    shrl $3, %ecx915; X86-NEXT:    xorl %edx, (%eax,%ecx)916; X86-NEXT:    movl (%eax), %ecx917; X86-NEXT:    movl 4(%eax), %edx918; X86-NEXT:    orl 12(%eax), %edx919; X86-NEXT:    orl 8(%eax), %ecx920; X86-NEXT:    orl %edx, %ecx921; X86-NEXT:    setne %al922; X86-NEXT:    retl923;924; SSE-LABEL: complement_cmpz_i128:925; SSE:       # %bb.0:926; SSE-NEXT:    movl %esi, %ecx927; SSE-NEXT:    movl $1, %eax928; SSE-NEXT:    shll %cl, %eax929; SSE-NEXT:    andl $96, %ecx930; SSE-NEXT:    shrl $3, %ecx931; SSE-NEXT:    xorl %eax, (%rdi,%rcx)932; SSE-NEXT:    movq (%rdi), %rax933; SSE-NEXT:    orq 8(%rdi), %rax934; SSE-NEXT:    setne %al935; SSE-NEXT:    retq936;937; AVX-LABEL: complement_cmpz_i128:938; AVX:       # %bb.0:939; AVX-NEXT:    # kill: def $esi killed $esi def $rsi940; AVX-NEXT:    movl $1, %eax941; AVX-NEXT:    shlxl %esi, %eax, %eax942; AVX-NEXT:    andl $96, %esi943; AVX-NEXT:    shrl $3, %esi944; AVX-NEXT:    xorl %eax, (%rdi,%rsi)945; AVX-NEXT:    movq (%rdi), %rax946; AVX-NEXT:    orq 8(%rdi), %rax947; AVX-NEXT:    setne %al948; AVX-NEXT:    retq949  %rem = and i32 %position, 127950  %ofs = zext nneg i32 %rem to i128951  %bit = shl nuw i128 1, %ofs952  %ld = load i128, ptr %word953  %res = xor i128 %ld, %bit954  store i128 %res, ptr %word955  %cmp = icmp ne i128 %res, 0956  ret i1 %cmp957}958 959; Load hidden behind bitcast960define <8 x i16> @complement_ne_i128_bitcast(ptr %word, i32 %position) nounwind {961; X86-LABEL: complement_ne_i128_bitcast:962; X86:       # %bb.0:963; X86-NEXT:    pushl %ebp964; X86-NEXT:    movl %esp, %ebp965; X86-NEXT:    pushl %ebx966; X86-NEXT:    pushl %edi967; X86-NEXT:    pushl %esi968; X86-NEXT:    andl $-16, %esp969; X86-NEXT:    subl $80, %esp970; X86-NEXT:    movl 12(%ebp), %eax971; X86-NEXT:    movzwl (%eax), %ecx972; X86-NEXT:    movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill973; X86-NEXT:    movzwl 12(%eax), %ecx974; X86-NEXT:    movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill975; X86-NEXT:    movzwl 14(%eax), %edi976; X86-NEXT:    movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill977; X86-NEXT:    shll $16, %edi978; X86-NEXT:    orl %ecx, %edi979; X86-NEXT:    movzwl 2(%eax), %ecx980; X86-NEXT:    movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill981; X86-NEXT:    movzwl 4(%eax), %edx982; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill983; X86-NEXT:    movzwl 6(%eax), %esi984; X86-NEXT:    movzwl 8(%eax), %ecx985; X86-NEXT:    movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill986; X86-NEXT:    movzwl 10(%eax), %eax987; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill988; X86-NEXT:    movl %edi, {{[0-9]+}}(%esp)989; X86-NEXT:    shll $16, %eax990; X86-NEXT:    orl %ecx, %eax991; X86-NEXT:    movl %eax, {{[0-9]+}}(%esp)992; X86-NEXT:    movl %esi, %eax993; X86-NEXT:    shll $16, %eax994; X86-NEXT:    orl %edx, %eax995; X86-NEXT:    movl %eax, {{[0-9]+}}(%esp)996; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload997; X86-NEXT:    shll $16, %eax998; X86-NEXT:    addl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload999; X86-NEXT:    movl %eax, {{[0-9]+}}(%esp)1000; X86-NEXT:    movl $0, {{[0-9]+}}(%esp)1001; X86-NEXT:    movl $0, {{[0-9]+}}(%esp)1002; X86-NEXT:    movl $0, {{[0-9]+}}(%esp)1003; X86-NEXT:    movl $0, {{[0-9]+}}(%esp)1004; X86-NEXT:    movl 16(%ebp), %eax1005; X86-NEXT:    movl %eax, %ebx1006; X86-NEXT:    andb $96, %bl1007; X86-NEXT:    shrb $3, %bl1008; X86-NEXT:    movzbl %bl, %edi1009; X86-NEXT:    movl 32(%esp,%edi), %edi1010; X86-NEXT:    btcl %eax, %edi1011; X86-NEXT:    andl $96, %eax1012; X86-NEXT:    shrl $3, %eax1013; X86-NEXT:    movl 12(%ebp), %ecx1014; X86-NEXT:    movl %edi, (%ecx,%eax)1015; X86-NEXT:    movl 8(%ebp), %eax1016; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload1017; X86-NEXT:    movw %dx, 14(%eax)1018; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload1019; X86-NEXT:    movw %dx, 12(%eax)1020; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload1021; X86-NEXT:    movw %cx, 10(%eax)1022; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload1023; X86-NEXT:    movw %cx, 8(%eax)1024; X86-NEXT:    movw %si, 6(%eax)1025; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload1026; X86-NEXT:    movw %cx, 4(%eax)1027; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload1028; X86-NEXT:    movw %cx, 2(%eax)1029; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload1030; X86-NEXT:    movw %cx, (%eax)1031; X86-NEXT:    leal -12(%ebp), %esp1032; X86-NEXT:    popl %esi1033; X86-NEXT:    popl %edi1034; X86-NEXT:    popl %ebx1035; X86-NEXT:    popl %ebp1036; X86-NEXT:    retl $41037;1038; SSE2-LABEL: complement_ne_i128_bitcast:1039; SSE2:       # %bb.0:1040; SSE2-NEXT:    # kill: def $esi killed $esi def $rsi1041; SSE2-NEXT:    movdqa (%rdi), %xmm01042; SSE2-NEXT:    movq 8(%rdi), %rax1043; SSE2-NEXT:    movq %xmm0, %rdx1044; SSE2-NEXT:    movl %esi, %ecx1045; SSE2-NEXT:    andb $32, %cl1046; SSE2-NEXT:    shrdq %cl, %rax, %rdx1047; SSE2-NEXT:    shrq %cl, %rax1048; SSE2-NEXT:    testb $64, %sil1049; SSE2-NEXT:    cmoveq %rdx, %rax1050; SSE2-NEXT:    btcl %esi, %eax1051; SSE2-NEXT:    andl $96, %esi1052; SSE2-NEXT:    shrl $3, %esi1053; SSE2-NEXT:    movl %eax, (%rdi,%rsi)1054; SSE2-NEXT:    retq1055;1056; SSE4-LABEL: complement_ne_i128_bitcast:1057; SSE4:       # %bb.0:1058; SSE4-NEXT:    # kill: def $esi killed $esi def $rsi1059; SSE4-NEXT:    movdqa (%rdi), %xmm01060; SSE4-NEXT:    pextrq $1, %xmm0, %rax1061; SSE4-NEXT:    movq %xmm0, %rdx1062; SSE4-NEXT:    movl %esi, %ecx1063; SSE4-NEXT:    andb $32, %cl1064; SSE4-NEXT:    shrdq %cl, %rax, %rdx1065; SSE4-NEXT:    shrq %cl, %rax1066; SSE4-NEXT:    testb $64, %sil1067; SSE4-NEXT:    cmoveq %rdx, %rax1068; SSE4-NEXT:    btcl %esi, %eax1069; SSE4-NEXT:    andl $96, %esi1070; SSE4-NEXT:    shrl $3, %esi1071; SSE4-NEXT:    movl %eax, (%rdi,%rsi)1072; SSE4-NEXT:    retq1073;1074; AVX-LABEL: complement_ne_i128_bitcast:1075; AVX:       # %bb.0:1076; AVX-NEXT:    # kill: def $esi killed $esi def $rsi1077; AVX-NEXT:    vmovdqa (%rdi), %xmm01078; AVX-NEXT:    vpextrq $1, %xmm0, %rax1079; AVX-NEXT:    vmovq %xmm0, %rdx1080; AVX-NEXT:    movl %esi, %ecx1081; AVX-NEXT:    andb $32, %cl1082; AVX-NEXT:    shrdq %cl, %rax, %rdx1083; AVX-NEXT:    shrxq %rcx, %rax, %rax1084; AVX-NEXT:    testb $64, %sil1085; AVX-NEXT:    cmoveq %rdx, %rax1086; AVX-NEXT:    btcl %esi, %eax1087; AVX-NEXT:    andl $96, %esi1088; AVX-NEXT:    shrl $3, %esi1089; AVX-NEXT:    movl %eax, (%rdi,%rsi)1090; AVX-NEXT:    retq1091  %rem = and i32 %position, 1271092  %ofs = zext nneg i32 %rem to i1281093  %bit = shl nuw i128 1, %ofs1094  %ldv = load <8 x i16>, ptr %word1095  %ld = bitcast <8 x i16> %ldv to i1281096  %test = and i128 %ld, %bit1097  %res = xor i128 %ld, %bit1098  store i128 %res, ptr %word1099  ret <8 x i16> %ldv1100}1101 1102; Multiple loads in store chain1103define i32 @reset_multiload_i128(ptr %word, i32 %position, ptr %p) nounwind {1104; X86-LABEL: reset_multiload_i128:1105; X86:       # %bb.0:1106; X86-NEXT:    pushl %ebx1107; X86-NEXT:    pushl %edi1108; X86-NEXT:    pushl %esi1109; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx1110; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax1111; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx1112; X86-NEXT:    movl (%eax), %eax1113; X86-NEXT:    movl %edx, %esi1114; X86-NEXT:    andl $96, %esi1115; X86-NEXT:    shrl $3, %esi1116; X86-NEXT:    movl (%ecx,%esi), %edi1117; X86-NEXT:    movl %edi, %ebx1118; X86-NEXT:    btrl %edx, %ebx1119; X86-NEXT:    btl %edx, %edi1120; X86-NEXT:    movl %ebx, (%ecx,%esi)1121; X86-NEXT:    jae .LBB23_21122; X86-NEXT:  # %bb.1:1123; X86-NEXT:    xorl %eax, %eax1124; X86-NEXT:  .LBB23_2:1125; X86-NEXT:    popl %esi1126; X86-NEXT:    popl %edi1127; X86-NEXT:    popl %ebx1128; X86-NEXT:    retl1129;1130; X64-LABEL: reset_multiload_i128:1131; X64:       # %bb.0:1132; X64-NEXT:    movl %esi, %ecx1133; X64-NEXT:    andl $96, %ecx1134; X64-NEXT:    shrl $3, %ecx1135; X64-NEXT:    movl (%rdi,%rcx), %r9d1136; X64-NEXT:    movl %r9d, %r8d1137; X64-NEXT:    btrl %esi, %r8d1138; X64-NEXT:    xorl %eax, %eax1139; X64-NEXT:    btl %esi, %r9d1140; X64-NEXT:    jb .LBB23_21141; X64-NEXT:  # %bb.1:1142; X64-NEXT:    movl (%rdx), %eax1143; X64-NEXT:  .LBB23_2:1144; X64-NEXT:    movl %r8d, (%rdi,%rcx)1145; X64-NEXT:    retq1146  %rem = and i32 %position, 1271147  %ofs = zext nneg i32 %rem to i1281148  %bit = shl nuw i128 1, %ofs1149  %mask = xor i128 %bit, -11150  %ld = load i128, ptr %word1151  %sel = load i32, ptr %p1152  %test = and i128 %ld, %bit1153  %res = and i128 %ld, %mask1154  %cmp = icmp eq i128 %test, 01155  store i128 %res, ptr %word1156  %ret = select i1 %cmp, i32 %sel, i32 01157  ret i32 %ret1158}1159 1160; Multiple uses of the store chain AND stored value1161define i32 @chain_reset_i256(ptr %p0, ptr %p1, ptr %p2, i32 %position) nounwind {1162; X86-LABEL: chain_reset_i256:1163; X86:       # %bb.0:1164; X86-NEXT:    pushl %ebp1165; X86-NEXT:    pushl %ebx1166; X86-NEXT:    pushl %edi1167; X86-NEXT:    pushl %esi1168; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax1169; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx1170; X86-NEXT:    movl {{[0-9]+}}(%esp), %esi1171; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx1172; X86-NEXT:    movl $-2, %edi1173; X86-NEXT:    roll %cl, %edi1174; X86-NEXT:    shrl $3, %ecx1175; X86-NEXT:    andl $28, %ecx1176; X86-NEXT:    andl %edi, (%esi,%ecx)1177; X86-NEXT:    movl 8(%esi), %ebx1178; X86-NEXT:    movl (%esi), %edi1179; X86-NEXT:    movl 4(%esi), %ecx1180; X86-NEXT:    movl 12(%esi), %ebp1181; X86-NEXT:    orl 28(%esi), %ebp1182; X86-NEXT:    orl 20(%esi), %ecx1183; X86-NEXT:    orl %ebp, %ecx1184; X86-NEXT:    orl 24(%esi), %ebx1185; X86-NEXT:    movl 16(%esi), %ebp1186; X86-NEXT:    orl %edi, %ebp1187; X86-NEXT:    orl %ebx, %ebp1188; X86-NEXT:    movl (%edx), %esi1189; X86-NEXT:    movl %edi, (%edx)1190; X86-NEXT:    movl (%eax), %eax1191; X86-NEXT:    orl %ecx, %ebp1192; X86-NEXT:    jne .LBB24_21193; X86-NEXT:  # %bb.1:1194; X86-NEXT:    addl %esi, %eax1195; X86-NEXT:  .LBB24_2:1196; X86-NEXT:    popl %esi1197; X86-NEXT:    popl %edi1198; X86-NEXT:    popl %ebx1199; X86-NEXT:    popl %ebp1200; X86-NEXT:    retl1201;1202; SSE-LABEL: chain_reset_i256:1203; SSE:       # %bb.0:1204; SSE-NEXT:    # kill: def $ecx killed $ecx def $rcx1205; SSE-NEXT:    movl $-2, %eax1206; SSE-NEXT:    roll %cl, %eax1207; SSE-NEXT:    shrl $3, %ecx1208; SSE-NEXT:    andl $28, %ecx1209; SSE-NEXT:    andl %eax, (%rdi,%rcx)1210; SSE-NEXT:    movq (%rdi), %rcx1211; SSE-NEXT:    movq 8(%rdi), %r81212; SSE-NEXT:    orq 24(%rdi), %r81213; SSE-NEXT:    movq 16(%rdi), %rdi1214; SSE-NEXT:    orq %rcx, %rdi1215; SSE-NEXT:    movl (%rsi), %eax1216; SSE-NEXT:    movl %ecx, (%rsi)1217; SSE-NEXT:    movl (%rdx), %ecx1218; SSE-NEXT:    addl %ecx, %eax1219; SSE-NEXT:    orq %r8, %rdi1220; SSE-NEXT:    cmovnel %ecx, %eax1221; SSE-NEXT:    retq1222;1223; AVX-LABEL: chain_reset_i256:1224; AVX:       # %bb.0:1225; AVX-NEXT:    # kill: def $ecx killed $ecx def $rcx1226; AVX-NEXT:    movl $-2, %eax1227; AVX-NEXT:    roll %cl, %eax1228; AVX-NEXT:    shrl $3, %ecx1229; AVX-NEXT:    andl $28, %ecx1230; AVX-NEXT:    andl %eax, (%rdi,%rcx)1231; AVX-NEXT:    vmovdqu (%rdi), %ymm01232; AVX-NEXT:    movl (%rdi), %ecx1233; AVX-NEXT:    movl (%rsi), %eax1234; AVX-NEXT:    movl %ecx, (%rsi)1235; AVX-NEXT:    movl (%rdx), %ecx1236; AVX-NEXT:    addl %ecx, %eax1237; AVX-NEXT:    vptest %ymm0, %ymm01238; AVX-NEXT:    cmovnel %ecx, %eax1239; AVX-NEXT:    vzeroupper1240; AVX-NEXT:    retq1241  %rem = and i32 %position, 2551242  %ofs = zext nneg i32 %rem to i2561243  %bit = shl nuw i256 1, %ofs1244  %ld0 = load i256, ptr %p01245  %msk = xor i256 %bit, -11246  %res = and i256 %ld0, %msk1247  store i256 %res, ptr %p01248  %cmp = icmp ne i256 %res, 01249  %ld1 = load i32, ptr %p11250  %trunc = trunc i256 %res to i321251  store i32 %trunc, ptr %p11252  %ld2 = load i32, ptr %p21253  %add = add i32 %ld1, %ld21254  %sel = select i1 %cmp, i32 %ld2, i32 %add1255  ret i32 %sel1256}1257 1258; BTC/BT/BTS sequence on same i1281259define i1 @sequence_i128(ptr %word, i32 %pos0, i32 %pos1, i32 %pos2) nounwind {1260; X86-LABEL: sequence_i128:1261; X86:       # %bb.0:1262; X86-NEXT:    pushl %ebp1263; X86-NEXT:    movl %esp, %ebp1264; X86-NEXT:    pushl %ebx1265; X86-NEXT:    pushl %edi1266; X86-NEXT:    pushl %esi1267; X86-NEXT:    andl $-16, %esp1268; X86-NEXT:    subl $144, %esp1269; X86-NEXT:    movb 20(%ebp), %ch1270; X86-NEXT:    movb 12(%ebp), %cl1271; X86-NEXT:    movl $0, {{[0-9]+}}(%esp)1272; X86-NEXT:    movl $0, {{[0-9]+}}(%esp)1273; X86-NEXT:    movl $0, {{[0-9]+}}(%esp)1274; X86-NEXT:    movl $1, {{[0-9]+}}(%esp)1275; X86-NEXT:    movl $0, {{[0-9]+}}(%esp)1276; X86-NEXT:    movl $0, {{[0-9]+}}(%esp)1277; X86-NEXT:    movl $0, {{[0-9]+}}(%esp)1278; X86-NEXT:    movl $0, {{[0-9]+}}(%esp)1279; X86-NEXT:    movl %ecx, %eax1280; X86-NEXT:    shrb $3, %al1281; X86-NEXT:    andb $12, %al1282; X86-NEXT:    negb %al1283; X86-NEXT:    movsbl %al, %eax1284; X86-NEXT:    movl 56(%esp,%eax), %edx1285; X86-NEXT:    movl 60(%esp,%eax), %esi1286; X86-NEXT:    shldl %cl, %edx, %esi1287; X86-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill1288; X86-NEXT:    movl 48(%esp,%eax), %edi1289; X86-NEXT:    movl 52(%esp,%eax), %ebx1290; X86-NEXT:    shldl %cl, %ebx, %edx1291; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill1292; X86-NEXT:    shldl %cl, %edi, %ebx1293; X86-NEXT:    shll %cl, %edi1294; X86-NEXT:    movl $0, {{[0-9]+}}(%esp)1295; X86-NEXT:    movl $0, {{[0-9]+}}(%esp)1296; X86-NEXT:    movl $0, {{[0-9]+}}(%esp)1297; X86-NEXT:    movl $1, {{[0-9]+}}(%esp)1298; X86-NEXT:    movl $0, {{[0-9]+}}(%esp)1299; X86-NEXT:    movl $0, {{[0-9]+}}(%esp)1300; X86-NEXT:    movl $0, {{[0-9]+}}(%esp)1301; X86-NEXT:    movl $0, {{[0-9]+}}(%esp)1302; X86-NEXT:    movb %ch, %al1303; X86-NEXT:    shrb $3, %al1304; X86-NEXT:    andb $12, %al1305; X86-NEXT:    negb %al1306; X86-NEXT:    movsbl %al, %eax1307; X86-NEXT:    movl 84(%esp,%eax), %edx1308; X86-NEXT:    movl 88(%esp,%eax), %esi1309; X86-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill1310; X86-NEXT:    movzbl 20(%ebp), %ecx1311; X86-NEXT:    shldl %cl, %edx, %esi1312; X86-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill1313; X86-NEXT:    movl 80(%esp,%eax), %esi1314; X86-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill1315; X86-NEXT:    movl 92(%esp,%eax), %eax1316; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload1317; X86-NEXT:    shldl %cl, %esi, %eax1318; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill1319; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload1320; X86-NEXT:    movl %esi, %eax1321; X86-NEXT:    shll %cl, %eax1322; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill1323; X86-NEXT:    shldl %cl, %esi, %edx1324; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill1325; X86-NEXT:    movl 8(%ebp), %eax1326; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload1327; X86-NEXT:    xorl 8(%eax), %edx1328; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload1329; X86-NEXT:    xorl 12(%eax), %esi1330; X86-NEXT:    xorl (%eax), %edi1331; X86-NEXT:    xorl 4(%eax), %ebx1332; X86-NEXT:    movl %esi, {{[0-9]+}}(%esp)1333; X86-NEXT:    movl %edx, {{[0-9]+}}(%esp)1334; X86-NEXT:    movl %ebx, {{[0-9]+}}(%esp)1335; X86-NEXT:    movl %edi, {{[0-9]+}}(%esp)1336; X86-NEXT:    movl $0, {{[0-9]+}}(%esp)1337; X86-NEXT:    movl $0, {{[0-9]+}}(%esp)1338; X86-NEXT:    movl $0, {{[0-9]+}}(%esp)1339; X86-NEXT:    movl $0, {{[0-9]+}}(%esp)1340; X86-NEXT:    movl 16(%ebp), %eax1341; X86-NEXT:    # kill: def $al killed $al killed $eax1342; X86-NEXT:    andb $96, %al1343; X86-NEXT:    shrb $3, %al1344; X86-NEXT:    movzbl %al, %eax1345; X86-NEXT:    movl 96(%esp,%eax), %eax1346; X86-NEXT:    movl 16(%ebp), %ecx1347; X86-NEXT:    btl %ecx, %eax1348; X86-NEXT:    setae %al1349; X86-NEXT:    orl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Folded Reload1350; X86-NEXT:    orl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload1351; X86-NEXT:    orl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Folded Reload1352; X86-NEXT:    orl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Folded Reload1353; X86-NEXT:    movl 8(%ebp), %ecx1354; X86-NEXT:    movl %edx, 8(%ecx)1355; X86-NEXT:    movl %esi, 12(%ecx)1356; X86-NEXT:    movl %edi, (%ecx)1357; X86-NEXT:    movl %ebx, 4(%ecx)1358; X86-NEXT:    leal -12(%ebp), %esp1359; X86-NEXT:    popl %esi1360; X86-NEXT:    popl %edi1361; X86-NEXT:    popl %ebx1362; X86-NEXT:    popl %ebp1363; X86-NEXT:    retl1364;1365; SSE-LABEL: sequence_i128:1366; SSE:       # %bb.0:1367; SSE-NEXT:    movl %ecx, %eax1368; SSE-NEXT:    movl %esi, %ecx1369; SSE-NEXT:    movl $1, %r8d1370; SSE-NEXT:    xorl %esi, %esi1371; SSE-NEXT:    shldq %cl, %r8, %rsi1372; SSE-NEXT:    movl $1, %r9d1373; SSE-NEXT:    shlq %cl, %r91374; SSE-NEXT:    xorl %r11d, %r11d1375; SSE-NEXT:    testb $64, %cl1376; SSE-NEXT:    cmovneq %r9, %rsi1377; SSE-NEXT:    cmovneq %r11, %r91378; SSE-NEXT:    xorl %r10d, %r10d1379; SSE-NEXT:    movl %eax, %ecx1380; SSE-NEXT:    shldq %cl, %r8, %r101381; SSE-NEXT:    shlq %cl, %r81382; SSE-NEXT:    testb $64, %al1383; SSE-NEXT:    cmovneq %r8, %r101384; SSE-NEXT:    cmovneq %r11, %r81385; SSE-NEXT:    xorq 8(%rdi), %rsi1386; SSE-NEXT:    xorq (%rdi), %r91387; SSE-NEXT:    movl %edx, %ecx1388; SSE-NEXT:    andb $32, %cl1389; SSE-NEXT:    movq %r9, %rax1390; SSE-NEXT:    shrdq %cl, %rsi, %rax1391; SSE-NEXT:    movq %rsi, %r111392; SSE-NEXT:    shrq %cl, %r111393; SSE-NEXT:    testb $64, %dl1394; SSE-NEXT:    cmoveq %rax, %r111395; SSE-NEXT:    btl %edx, %r11d1396; SSE-NEXT:    setae %al1397; SSE-NEXT:    orq %r10, %rsi1398; SSE-NEXT:    orq %r8, %r91399; SSE-NEXT:    movq %r9, (%rdi)1400; SSE-NEXT:    movq %rsi, 8(%rdi)1401; SSE-NEXT:    retq1402;1403; AVX2-LABEL: sequence_i128:1404; AVX2:       # %bb.0:1405; AVX2-NEXT:    movl %ecx, %eax1406; AVX2-NEXT:    movl %esi, %ecx1407; AVX2-NEXT:    xorl %r9d, %r9d1408; AVX2-NEXT:    movl $1, %r10d1409; AVX2-NEXT:    xorl %esi, %esi1410; AVX2-NEXT:    shldq %cl, %r10, %rsi1411; AVX2-NEXT:    shlxq %rcx, %r10, %r81412; AVX2-NEXT:    testb $64, %cl1413; AVX2-NEXT:    cmovneq %r8, %rsi1414; AVX2-NEXT:    cmovneq %r9, %r81415; AVX2-NEXT:    xorl %r11d, %r11d1416; AVX2-NEXT:    movl %eax, %ecx1417; AVX2-NEXT:    shldq %cl, %r10, %r111418; AVX2-NEXT:    shlxq %rax, %r10, %r101419; AVX2-NEXT:    testb $64, %al1420; AVX2-NEXT:    cmovneq %r10, %r111421; AVX2-NEXT:    cmovneq %r9, %r101422; AVX2-NEXT:    xorq 8(%rdi), %rsi1423; AVX2-NEXT:    xorq (%rdi), %r81424; AVX2-NEXT:    movl %edx, %ecx1425; AVX2-NEXT:    andb $32, %cl1426; AVX2-NEXT:    movq %r8, %rax1427; AVX2-NEXT:    shrdq %cl, %rsi, %rax1428; AVX2-NEXT:    shrxq %rcx, %rsi, %rcx1429; AVX2-NEXT:    testb $64, %dl1430; AVX2-NEXT:    cmoveq %rax, %rcx1431; AVX2-NEXT:    btl %edx, %ecx1432; AVX2-NEXT:    setae %al1433; AVX2-NEXT:    orq %r11, %rsi1434; AVX2-NEXT:    orq %r10, %r81435; AVX2-NEXT:    movq %r8, (%rdi)1436; AVX2-NEXT:    movq %rsi, 8(%rdi)1437; AVX2-NEXT:    retq1438;1439; AVX512-LABEL: sequence_i128:1440; AVX512:       # %bb.0:1441; AVX512-NEXT:    movl %ecx, %eax1442; AVX512-NEXT:    movl %esi, %ecx1443; AVX512-NEXT:    movl $1, %r9d1444; AVX512-NEXT:    xorl %esi, %esi1445; AVX512-NEXT:    shldq %cl, %r9, %rsi1446; AVX512-NEXT:    xorl %r10d, %r10d1447; AVX512-NEXT:    shlxq %rcx, %r9, %r81448; AVX512-NEXT:    testb $64, %cl1449; AVX512-NEXT:    cmovneq %r8, %rsi1450; AVX512-NEXT:    cmovneq %r10, %r81451; AVX512-NEXT:    xorl %r11d, %r11d1452; AVX512-NEXT:    movl %eax, %ecx1453; AVX512-NEXT:    shldq %cl, %r9, %r111454; AVX512-NEXT:    shlxq %rax, %r9, %r91455; AVX512-NEXT:    testb $64, %al1456; AVX512-NEXT:    cmovneq %r9, %r111457; AVX512-NEXT:    cmovneq %r10, %r91458; AVX512-NEXT:    xorq 8(%rdi), %rsi1459; AVX512-NEXT:    xorq (%rdi), %r81460; AVX512-NEXT:    movl %edx, %ecx1461; AVX512-NEXT:    andb $32, %cl1462; AVX512-NEXT:    movq %r8, %rax1463; AVX512-NEXT:    shrdq %cl, %rsi, %rax1464; AVX512-NEXT:    shrxq %rcx, %rsi, %rcx1465; AVX512-NEXT:    testb $64, %dl1466; AVX512-NEXT:    cmoveq %rax, %rcx1467; AVX512-NEXT:    btl %edx, %ecx1468; AVX512-NEXT:    setae %al1469; AVX512-NEXT:    orq %r11, %rsi1470; AVX512-NEXT:    orq %r9, %r81471; AVX512-NEXT:    movq %r8, (%rdi)1472; AVX512-NEXT:    movq %rsi, 8(%rdi)1473; AVX512-NEXT:    retq1474  %rem0 = and i32 %pos0, 1271475  %rem1 = and i32 %pos1, 1271476  %rem2 = and i32 %pos2, 1271477  %ofs0 = zext nneg i32 %rem0 to i1281478  %ofs1 = zext nneg i32 %rem1 to i1281479  %ofs2 = zext nneg i32 %rem2 to i1281480  %bit0 = shl nuw i128 1, %ofs01481  %bit1 = shl nuw i128 1, %ofs11482  %bit2 = shl nuw i128 1, %ofs21483  %ld = load i128, ptr %word1484  %res0 = xor i128 %ld, %bit01485  %test1 = and i128 %res0, %bit11486  %cmp1 = icmp eq i128 %test1, 01487  %res2 = or i128 %res0, %bit21488  store i128 %res2, ptr %word1489  ret i1 %cmp11490}1491 1492define i32 @blsr_u512(ptr %word) nounwind {1493; X86-LABEL: blsr_u512:1494; X86:       # %bb.0:1495; X86-NEXT:    pushl %ebp1496; X86-NEXT:    movl %esp, %ebp1497; X86-NEXT:    pushl %ebx1498; X86-NEXT:    pushl %edi1499; X86-NEXT:    pushl %esi1500; X86-NEXT:    andl $-16, %esp1501; X86-NEXT:    subl $240, %esp1502; X86-NEXT:    movl 8(%ebp), %ebx1503; X86-NEXT:    movl 12(%ebx), %esi1504; X86-NEXT:    movl 28(%ebx), %eax1505; X86-NEXT:    movl 60(%ebx), %ecx1506; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill1507; X86-NEXT:    movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill1508; X86-NEXT:    orl %ecx, %eax1509; X86-NEXT:    movl 44(%ebx), %edx1510; X86-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill1511; X86-NEXT:    movl %esi, %ecx1512; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill1513; X86-NEXT:    orl %edx, %ecx1514; X86-NEXT:    orl %eax, %ecx1515; X86-NEXT:    movl 20(%ebx), %edx1516; X86-NEXT:    movl 52(%ebx), %eax1517; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill1518; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill1519; X86-NEXT:    orl %eax, %edx1520; X86-NEXT:    movl 4(%ebx), %edi1521; X86-NEXT:    movl 36(%ebx), %esi1522; X86-NEXT:    movl %edi, %eax1523; X86-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill1524; X86-NEXT:    orl %esi, %eax1525; X86-NEXT:    orl %edx, %eax1526; X86-NEXT:    orl %ecx, %eax1527; X86-NEXT:    movl 24(%ebx), %edx1528; X86-NEXT:    movl 56(%ebx), %ecx1529; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill1530; X86-NEXT:    movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill1531; X86-NEXT:    orl %ecx, %edx1532; X86-NEXT:    movl 8(%ebx), %ecx1533; X86-NEXT:    movl 40(%ebx), %esi1534; X86-NEXT:    movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill1535; X86-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill1536; X86-NEXT:    orl %esi, %ecx1537; X86-NEXT:    orl %edx, %ecx1538; X86-NEXT:    movl 16(%ebx), %edx1539; X86-NEXT:    movl 48(%ebx), %esi1540; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill1541; X86-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill1542; X86-NEXT:    orl %esi, %edx1543; X86-NEXT:    movl (%ebx), %esi1544; X86-NEXT:    movl 32(%ebx), %ebx1545; X86-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill1546; X86-NEXT:    orl %ebx, %esi1547; X86-NEXT:    orl %edx, %esi1548; X86-NEXT:    orl %ecx, %esi1549; X86-NEXT:    orl %eax, %esi1550; X86-NEXT:    movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill1551; X86-NEXT:    je .LBB26_11552; X86-NEXT:  # %bb.2: # %cond.false1553; X86-NEXT:    testl %ebx, %ebx1554; X86-NEXT:    movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill1555; X86-NEXT:    jne .LBB26_31556; X86-NEXT:  # %bb.4: # %cond.false1557; X86-NEXT:    rep bsfl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload1558; X86-NEXT:    addl $32, %eax1559; X86-NEXT:    jmp .LBB26_51560; X86-NEXT:  .LBB26_1:1561; X86-NEXT:    movl $512, %ecx # imm = 0x2001562; X86-NEXT:    jmp .LBB26_411563; X86-NEXT:  .LBB26_3:1564; X86-NEXT:    rep bsfl %ebx, %eax1565; X86-NEXT:  .LBB26_5: # %cond.false1566; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload1567; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload1568; X86-NEXT:    testl %ecx, %ecx1569; X86-NEXT:    jne .LBB26_61570; X86-NEXT:  # %bb.7: # %cond.false1571; X86-NEXT:    rep bsfl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Folded Reload1572; X86-NEXT:    addl $32, %ecx1573; X86-NEXT:    jmp .LBB26_81574; X86-NEXT:  .LBB26_6:1575; X86-NEXT:    rep bsfl %ecx, %ecx1576; X86-NEXT:  .LBB26_8: # %cond.false1577; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload1578; X86-NEXT:    orl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload1579; X86-NEXT:    jne .LBB26_101580; X86-NEXT:  # %bb.9: # %cond.false1581; X86-NEXT:    addl $64, %ecx1582; X86-NEXT:    movl %ecx, %eax1583; X86-NEXT:  .LBB26_10: # %cond.false1584; X86-NEXT:    testl %esi, %esi1585; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload1586; X86-NEXT:    jne .LBB26_111587; X86-NEXT:  # %bb.12: # %cond.false1588; X86-NEXT:    rep bsfl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Folded Reload1589; X86-NEXT:    addl $32, %ecx1590; X86-NEXT:    testl %edx, %edx1591; X86-NEXT:    je .LBB26_151592; X86-NEXT:  .LBB26_14:1593; X86-NEXT:    rep bsfl %edx, %edx1594; X86-NEXT:    orl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Folded Reload1595; X86-NEXT:    je .LBB26_171596; X86-NEXT:    jmp .LBB26_181597; X86-NEXT:  .LBB26_11:1598; X86-NEXT:    rep bsfl %esi, %ecx1599; X86-NEXT:    testl %edx, %edx1600; X86-NEXT:    jne .LBB26_141601; X86-NEXT:  .LBB26_15: # %cond.false1602; X86-NEXT:    rep bsfl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload1603; X86-NEXT:    addl $32, %edx1604; X86-NEXT:    orl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Folded Reload1605; X86-NEXT:    jne .LBB26_181606; X86-NEXT:  .LBB26_17: # %cond.false1607; X86-NEXT:    addl $64, %edx1608; X86-NEXT:    movl %edx, %ecx1609; X86-NEXT:  .LBB26_18: # %cond.false1610; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload1611; X86-NEXT:    orl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload1612; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload1613; X86-NEXT:    orl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Folded Reload1614; X86-NEXT:    orl %edx, %esi1615; X86-NEXT:    jne .LBB26_201616; X86-NEXT:  # %bb.19: # %cond.false1617; X86-NEXT:    subl $-128, %ecx1618; X86-NEXT:    movl %ecx, %eax1619; X86-NEXT:  .LBB26_20: # %cond.false1620; X86-NEXT:    addl $256, %eax # imm = 0x1001621; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload1622; X86-NEXT:    testl %edx, %edx1623; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload1624; X86-NEXT:    jne .LBB26_211625; X86-NEXT:  # %bb.22: # %cond.false1626; X86-NEXT:    rep bsfl %edi, %ebx1627; X86-NEXT:    addl $32, %ebx1628; X86-NEXT:    jmp .LBB26_231629; X86-NEXT:  .LBB26_21:1630; X86-NEXT:    rep bsfl %edx, %ebx1631; X86-NEXT:  .LBB26_23: # %cond.false1632; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload1633; X86-NEXT:    testl %ecx, %ecx1634; X86-NEXT:    jne .LBB26_241635; X86-NEXT:  # %bb.25: # %cond.false1636; X86-NEXT:    rep bsfl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Folded Reload1637; X86-NEXT:    addl $32, %ecx1638; X86-NEXT:    orl %edi, %edx1639; X86-NEXT:    je .LBB26_271640; X86-NEXT:    jmp .LBB26_281641; X86-NEXT:  .LBB26_24:1642; X86-NEXT:    rep bsfl %ecx, %ecx1643; X86-NEXT:    orl %edi, %edx1644; X86-NEXT:    jne .LBB26_281645; X86-NEXT:  .LBB26_27: # %cond.false1646; X86-NEXT:    addl $64, %ecx1647; X86-NEXT:    movl %ecx, %ebx1648; X86-NEXT:  .LBB26_28: # %cond.false1649; X86-NEXT:    testl %esi, %esi1650; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload1651; X86-NEXT:    jne .LBB26_291652; X86-NEXT:  # %bb.30: # %cond.false1653; X86-NEXT:    rep bsfl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Folded Reload1654; X86-NEXT:    addl $32, %ecx1655; X86-NEXT:    testl %edx, %edx1656; X86-NEXT:    je .LBB26_331657; X86-NEXT:  .LBB26_32:1658; X86-NEXT:    rep bsfl %edx, %edx1659; X86-NEXT:    orl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Folded Reload1660; X86-NEXT:    je .LBB26_351661; X86-NEXT:    jmp .LBB26_361662; X86-NEXT:  .LBB26_29:1663; X86-NEXT:    rep bsfl %esi, %ecx1664; X86-NEXT:    testl %edx, %edx1665; X86-NEXT:    jne .LBB26_321666; X86-NEXT:  .LBB26_33: # %cond.false1667; X86-NEXT:    rep bsfl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload1668; X86-NEXT:    addl $32, %edx1669; X86-NEXT:    orl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Folded Reload1670; X86-NEXT:    jne .LBB26_361671; X86-NEXT:  .LBB26_35: # %cond.false1672; X86-NEXT:    addl $64, %edx1673; X86-NEXT:    movl %edx, %ecx1674; X86-NEXT:  .LBB26_36: # %cond.false1675; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload1676; X86-NEXT:    orl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload1677; X86-NEXT:    movl %edi, %esi1678; X86-NEXT:    orl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Folded Reload1679; X86-NEXT:    orl %edx, %esi1680; X86-NEXT:    jne .LBB26_381681; X86-NEXT:  # %bb.37: # %cond.false1682; X86-NEXT:    subl $-128, %ecx1683; X86-NEXT:    movl %ecx, %ebx1684; X86-NEXT:  .LBB26_38: # %cond.false1685; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload1686; X86-NEXT:    orl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Folded Reload1687; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload1688; X86-NEXT:    orl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload1689; X86-NEXT:    orl %ecx, %edx1690; X86-NEXT:    movl %edi, %ecx1691; X86-NEXT:    orl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Folded Reload1692; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload1693; X86-NEXT:    orl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Folded Reload1694; X86-NEXT:    orl %ecx, %esi1695; X86-NEXT:    orl %edx, %esi1696; X86-NEXT:    movl %ebx, %ecx1697; X86-NEXT:    jne .LBB26_401698; X86-NEXT:  # %bb.39: # %cond.false1699; X86-NEXT:    movl %eax, %ecx1700; X86-NEXT:  .LBB26_40: # %cond.false1701; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload1702; X86-NEXT:  .LBB26_41: # %cond.end1703; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload1704; X86-NEXT:    movl %ecx, %esi1705; X86-NEXT:    shrl $3, %esi1706; X86-NEXT:    andl $60, %esi1707; X86-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill1708; X86-NEXT:    leal {{[0-9]+}}(%esp), %edx1709; X86-NEXT:    subl %esi, %edx1710; X86-NEXT:    movl $0, {{[0-9]+}}(%esp)1711; X86-NEXT:    movl $0, {{[0-9]+}}(%esp)1712; X86-NEXT:    movl $0, {{[0-9]+}}(%esp)1713; X86-NEXT:    movl $0, {{[0-9]+}}(%esp)1714; X86-NEXT:    movl $0, {{[0-9]+}}(%esp)1715; X86-NEXT:    movl $0, {{[0-9]+}}(%esp)1716; X86-NEXT:    movl $0, {{[0-9]+}}(%esp)1717; X86-NEXT:    movl $0, {{[0-9]+}}(%esp)1718; X86-NEXT:    movl $0, {{[0-9]+}}(%esp)1719; X86-NEXT:    movl $0, {{[0-9]+}}(%esp)1720; X86-NEXT:    movl $0, {{[0-9]+}}(%esp)1721; X86-NEXT:    movl $0, {{[0-9]+}}(%esp)1722; X86-NEXT:    movl $0, {{[0-9]+}}(%esp)1723; X86-NEXT:    movl $0, {{[0-9]+}}(%esp)1724; X86-NEXT:    movl $0, {{[0-9]+}}(%esp)1725; X86-NEXT:    movl $1, {{[0-9]+}}(%esp)1726; X86-NEXT:    movl $0, {{[0-9]+}}(%esp)1727; X86-NEXT:    movl $0, {{[0-9]+}}(%esp)1728; X86-NEXT:    movl $0, {{[0-9]+}}(%esp)1729; X86-NEXT:    movl $0, {{[0-9]+}}(%esp)1730; X86-NEXT:    movl $0, {{[0-9]+}}(%esp)1731; X86-NEXT:    movl $0, {{[0-9]+}}(%esp)1732; X86-NEXT:    movl $0, {{[0-9]+}}(%esp)1733; X86-NEXT:    movl $0, {{[0-9]+}}(%esp)1734; X86-NEXT:    movl $0, {{[0-9]+}}(%esp)1735; X86-NEXT:    movl $0, {{[0-9]+}}(%esp)1736; X86-NEXT:    movl $0, {{[0-9]+}}(%esp)1737; X86-NEXT:    movl $0, {{[0-9]+}}(%esp)1738; X86-NEXT:    movl $0, {{[0-9]+}}(%esp)1739; X86-NEXT:    movl $0, {{[0-9]+}}(%esp)1740; X86-NEXT:    movl $0, {{[0-9]+}}(%esp)1741; X86-NEXT:    movl $0, {{[0-9]+}}(%esp)1742; X86-NEXT:    movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill1743; X86-NEXT:    andl $31, %ecx1744; X86-NEXT:    movl 56(%edx), %edi1745; X86-NEXT:    movl 60(%edx), %esi1746; X86-NEXT:    shldl %cl, %edi, %esi1747; X86-NEXT:    notl %esi1748; X86-NEXT:    andl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Folded Reload1749; X86-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill1750; X86-NEXT:    movl 52(%edx), %esi1751; X86-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill1752; X86-NEXT:    shldl %cl, %esi, %edi1753; X86-NEXT:    notl %edi1754; X86-NEXT:    andl %eax, %edi1755; X86-NEXT:    movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill1756; X86-NEXT:    movl 40(%edx), %eax1757; X86-NEXT:    movl 44(%edx), %esi1758; X86-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill1759; X86-NEXT:    shldl %cl, %eax, %esi1760; X86-NEXT:    notl %esi1761; X86-NEXT:    andl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Folded Reload1762; X86-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill1763; X86-NEXT:    movl 36(%edx), %esi1764; X86-NEXT:    shldl %cl, %esi, %eax1765; X86-NEXT:    notl %eax1766; X86-NEXT:    andl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload1767; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill1768; X86-NEXT:    movl 32(%edx), %eax1769; X86-NEXT:    shldl %cl, %eax, %esi1770; X86-NEXT:    notl %esi1771; X86-NEXT:    andl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Folded Reload1772; X86-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill1773; X86-NEXT:    movl 28(%edx), %esi1774; X86-NEXT:    shldl %cl, %esi, %eax1775; X86-NEXT:    notl %eax1776; X86-NEXT:    andl %ebx, %eax1777; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill1778; X86-NEXT:    movl 24(%edx), %eax1779; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill1780; X86-NEXT:    shldl %cl, %eax, %esi1781; X86-NEXT:    notl %esi1782; X86-NEXT:    andl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Folded Reload1783; X86-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill1784; X86-NEXT:    movl 4(%edx), %esi1785; X86-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill1786; X86-NEXT:    movl 8(%edx), %eax1787; X86-NEXT:    movl %edx, %ebx1788; X86-NEXT:    movl %eax, %edx1789; X86-NEXT:    shldl %cl, %esi, %edx1790; X86-NEXT:    notl %edx1791; X86-NEXT:    andl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload1792; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill1793; X86-NEXT:    movl 12(%ebx), %edx1794; X86-NEXT:    movl %edx, %esi1795; X86-NEXT:    shldl %cl, %eax, %esi1796; X86-NEXT:    notl %esi1797; X86-NEXT:    andl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Folded Reload1798; X86-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill1799; X86-NEXT:    movl 16(%ebx), %eax1800; X86-NEXT:    movl %eax, %esi1801; X86-NEXT:    shldl %cl, %edx, %esi1802; X86-NEXT:    notl %esi1803; X86-NEXT:    andl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Folded Reload1804; X86-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill1805; X86-NEXT:    movl 20(%ebx), %edx1806; X86-NEXT:    movl %edx, %esi1807; X86-NEXT:    shldl %cl, %eax, %esi1808; X86-NEXT:    notl %esi1809; X86-NEXT:    andl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Folded Reload1810; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload1811; X86-NEXT:    shldl %cl, %edx, %eax1812; X86-NEXT:    notl %eax1813; X86-NEXT:    andl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload1814; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill1815; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload1816; X86-NEXT:    negl %eax1817; X86-NEXT:    movl 208(%esp,%eax), %edx1818; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload1819; X86-NEXT:    shldl %cl, %edx, %eax1820; X86-NEXT:    notl %eax1821; X86-NEXT:    andl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload1822; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill1823; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload1824; X86-NEXT:    shldl %cl, %eax, %edx1825; X86-NEXT:    notl %edx1826; X86-NEXT:    andl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload1827; X86-NEXT:    movl (%ebx), %eax1828; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill1829; X86-NEXT:    shll %cl, %eax1830; X86-NEXT:    notl %eax1831; X86-NEXT:    andl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload1832; X86-NEXT:    # kill: def $cl killed $cl killed $ecx1833; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload1834; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload1835; X86-NEXT:    shldl %cl, %edi, %ebx1836; X86-NEXT:    notl %ebx1837; X86-NEXT:    andl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Folded Reload1838; X86-NEXT:    movl %ebx, %edi1839; X86-NEXT:    movl 8(%ebp), %ecx1840; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload1841; X86-NEXT:    movl %ebx, 24(%ecx)1842; X86-NEXT:    movl %esi, 20(%ecx)1843; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload1844; X86-NEXT:    movl %esi, 16(%ecx)1845; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload1846; X86-NEXT:    movl %esi, 12(%ecx)1847; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload1848; X86-NEXT:    movl %esi, 8(%ecx)1849; X86-NEXT:    movl %edi, 4(%ecx)1850; X86-NEXT:    movl %eax, (%ecx)1851; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload1852; X86-NEXT:    movl %eax, 28(%ecx)1853; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload1854; X86-NEXT:    movl %eax, 32(%ecx)1855; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload1856; X86-NEXT:    movl %eax, 36(%ecx)1857; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload1858; X86-NEXT:    movl %eax, 40(%ecx)1859; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload1860; X86-NEXT:    movl %eax, 44(%ecx)1861; X86-NEXT:    movl %edx, 48(%ecx)1862; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload1863; X86-NEXT:    movl %eax, 52(%ecx)1864; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload1865; X86-NEXT:    movl %eax, 56(%ecx)1866; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload1867; X86-NEXT:    movl %eax, 60(%ecx)1868; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload1869; X86-NEXT:    leal -12(%ebp), %esp1870; X86-NEXT:    popl %esi1871; X86-NEXT:    popl %edi1872; X86-NEXT:    popl %ebx1873; X86-NEXT:    popl %ebp1874; X86-NEXT:    retl1875;1876; SSE-LABEL: blsr_u512:1877; SSE:       # %bb.0:1878; SSE-NEXT:    pushq %r151879; SSE-NEXT:    pushq %r141880; SSE-NEXT:    pushq %rbx1881; SSE-NEXT:    movq 48(%rdi), %r111882; SSE-NEXT:    movq 40(%rdi), %r91883; SSE-NEXT:    movq 24(%rdi), %r81884; SSE-NEXT:    movq 16(%rdi), %rdx1885; SSE-NEXT:    movq (%rdi), %rcx1886; SSE-NEXT:    movq 8(%rdi), %rsi1887; SSE-NEXT:    rep bsfq %rcx, %rax1888; SSE-NEXT:    rep bsfq %rsi, %rbx1889; SSE-NEXT:    addq $64, %rbx1890; SSE-NEXT:    testq %rcx, %rcx1891; SSE-NEXT:    cmovneq %rax, %rbx1892; SSE-NEXT:    rep bsfq %rdx, %rax1893; SSE-NEXT:    rep bsfq %r8, %r101894; SSE-NEXT:    addq $64, %r101895; SSE-NEXT:    testq %rdx, %rdx1896; SSE-NEXT:    cmovneq %rax, %r101897; SSE-NEXT:    movq 32(%rdi), %r141898; SSE-NEXT:    subq $-128, %r101899; SSE-NEXT:    movq %rcx, %rax1900; SSE-NEXT:    orq %rsi, %rax1901; SSE-NEXT:    cmovneq %rbx, %r101902; SSE-NEXT:    rep bsfq %r14, %rax1903; SSE-NEXT:    rep bsfq %r9, %rbx1904; SSE-NEXT:    addq $64, %rbx1905; SSE-NEXT:    testq %r14, %r141906; SSE-NEXT:    cmovneq %rax, %rbx1907; SSE-NEXT:    rep bsfq %r11, %r151908; SSE-NEXT:    movl $64, %eax1909; SSE-NEXT:    rep bsfq 56(%rdi), %rax1910; SSE-NEXT:    addq $64, %rax1911; SSE-NEXT:    testq %r11, %r111912; SSE-NEXT:    cmovneq %r15, %rax1913; SSE-NEXT:    subq $-128, %rax1914; SSE-NEXT:    orq %r9, %r141915; SSE-NEXT:    cmovneq %rbx, %rax1916; SSE-NEXT:    addq $256, %rax # imm = 0x1001917; SSE-NEXT:    orq %r8, %rsi1918; SSE-NEXT:    orq %rdx, %rcx1919; SSE-NEXT:    orq %rsi, %rcx1920; SSE-NEXT:    cmovneq %r10, %rax1921; SSE-NEXT:    movl $-2, %edx1922; SSE-NEXT:    movl %eax, %ecx1923; SSE-NEXT:    roll %cl, %edx1924; SSE-NEXT:    movl %eax, %ecx1925; SSE-NEXT:    shrl $3, %ecx1926; SSE-NEXT:    andl $60, %ecx1927; SSE-NEXT:    andl %edx, (%rdi,%rcx)1928; SSE-NEXT:    # kill: def $eax killed $eax killed $rax1929; SSE-NEXT:    popq %rbx1930; SSE-NEXT:    popq %r141931; SSE-NEXT:    popq %r151932; SSE-NEXT:    retq1933;1934; AVX2-LABEL: blsr_u512:1935; AVX2:       # %bb.0:1936; AVX2-NEXT:    pushq %r151937; AVX2-NEXT:    pushq %r141938; AVX2-NEXT:    pushq %rbx1939; AVX2-NEXT:    movq 40(%rdi), %r91940; AVX2-NEXT:    movq 32(%rdi), %r101941; AVX2-NEXT:    movq 24(%rdi), %r81942; AVX2-NEXT:    movq 16(%rdi), %rdx1943; AVX2-NEXT:    movq (%rdi), %rcx1944; AVX2-NEXT:    movq 8(%rdi), %rsi1945; AVX2-NEXT:    tzcntq %rcx, %rax1946; AVX2-NEXT:    xorl %ebx, %ebx1947; AVX2-NEXT:    tzcntq %rsi, %rbx1948; AVX2-NEXT:    addq $64, %rbx1949; AVX2-NEXT:    testq %rcx, %rcx1950; AVX2-NEXT:    cmovneq %rax, %rbx1951; AVX2-NEXT:    xorl %eax, %eax1952; AVX2-NEXT:    tzcntq %rdx, %rax1953; AVX2-NEXT:    tzcntq %r8, %r111954; AVX2-NEXT:    addq $64, %r111955; AVX2-NEXT:    testq %rdx, %rdx1956; AVX2-NEXT:    cmovneq %rax, %r111957; AVX2-NEXT:    subq $-128, %r111958; AVX2-NEXT:    movq %rcx, %rax1959; AVX2-NEXT:    orq %rsi, %rax1960; AVX2-NEXT:    cmovneq %rbx, %r111961; AVX2-NEXT:    xorl %eax, %eax1962; AVX2-NEXT:    tzcntq %r10, %rax1963; AVX2-NEXT:    xorl %ebx, %ebx1964; AVX2-NEXT:    tzcntq %r9, %rbx1965; AVX2-NEXT:    addq $64, %rbx1966; AVX2-NEXT:    testq %r10, %r101967; AVX2-NEXT:    cmovneq %rax, %rbx1968; AVX2-NEXT:    movq 48(%rdi), %r141969; AVX2-NEXT:    xorl %r15d, %r15d1970; AVX2-NEXT:    tzcntq %r14, %r151971; AVX2-NEXT:    xorl %eax, %eax1972; AVX2-NEXT:    tzcntq 56(%rdi), %rax1973; AVX2-NEXT:    addq $64, %rax1974; AVX2-NEXT:    testq %r14, %r141975; AVX2-NEXT:    cmovneq %r15, %rax1976; AVX2-NEXT:    subq $-128, %rax1977; AVX2-NEXT:    orq %r9, %r101978; AVX2-NEXT:    cmovneq %rbx, %rax1979; AVX2-NEXT:    addq $256, %rax # imm = 0x1001980; AVX2-NEXT:    orq %r8, %rsi1981; AVX2-NEXT:    orq %rdx, %rcx1982; AVX2-NEXT:    orq %rsi, %rcx1983; AVX2-NEXT:    cmovneq %r11, %rax1984; AVX2-NEXT:    movl $-2, %edx1985; AVX2-NEXT:    movl %eax, %ecx1986; AVX2-NEXT:    roll %cl, %edx1987; AVX2-NEXT:    movl %eax, %ecx1988; AVX2-NEXT:    shrl $3, %ecx1989; AVX2-NEXT:    andl $60, %ecx1990; AVX2-NEXT:    andl %edx, (%rdi,%rcx)1991; AVX2-NEXT:    # kill: def $eax killed $eax killed $rax1992; AVX2-NEXT:    popq %rbx1993; AVX2-NEXT:    popq %r141994; AVX2-NEXT:    popq %r151995; AVX2-NEXT:    retq1996;1997; AVX512-LABEL: blsr_u512:1998; AVX512:       # %bb.0:1999; AVX512-NEXT:    vmovdqu64 (%rdi), %zmm02000; AVX512-NEXT:    vpternlogd {{.*#+}} zmm1 = -12001; AVX512-NEXT:    vpaddq %zmm1, %zmm0, %zmm12002; AVX512-NEXT:    vpandnq %zmm1, %zmm0, %zmm12003; AVX512-NEXT:    vplzcntq %zmm1, %zmm12004; AVX512-NEXT:    vmovdqa64 {{.*#+}} zmm2 = [64,128,192,256,320,384,448,512]2005; AVX512-NEXT:    vpsubq %zmm1, %zmm2, %zmm12006; AVX512-NEXT:    vptestmq %zmm0, %zmm0, %k12007; AVX512-NEXT:    vpbroadcastq {{.*#+}} zmm0 = [512,512,512,512,512,512,512,512]2008; AVX512-NEXT:    vpcompressq %zmm1, %zmm0 {%k1}2009; AVX512-NEXT:    vmovq %xmm0, %rax2010; AVX512-NEXT:    movl $-2, %edx2011; AVX512-NEXT:    movl %eax, %ecx2012; AVX512-NEXT:    roll %cl, %edx2013; AVX512-NEXT:    movl %eax, %ecx2014; AVX512-NEXT:    shrl $3, %ecx2015; AVX512-NEXT:    andl $60, %ecx2016; AVX512-NEXT:    andl %edx, (%rdi,%rcx)2017; AVX512-NEXT:    # kill: def $eax killed $eax killed $rax2018; AVX512-NEXT:    vzeroupper2019; AVX512-NEXT:    retq2020  %ld = load i512, ptr %word2021  %tz = tail call range(i512 0, 513) i512 @llvm.cttz.i512(i512 %ld, i1 false)2022  %tz.cast = trunc nuw nsw i512 %tz to i322023  %tz.mask = and i512 %tz, 5112024  %mask = shl nuw i512 1, %tz.mask2025  %mask.not = xor i512 %mask, -12026  %blsr = and i512 %ld, %mask.not2027  store i512 %blsr, ptr %word2028  ret i32 %tz.cast2029}2030