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