1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+cmov,+bmi | FileCheck %s --check-prefix=X86 3; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+cmov,+bmi | FileCheck %s --check-prefix=X64 4 5define i32 @blsmsk_used2(i32 %a) nounwind { 6; X86-LABEL: blsmsk_used2: 7; X86: # %bb.0: # %entry 8; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 9; X86-NEXT: leal -1(%eax), %ecx 10; X86-NEXT: xorl %ecx, %eax 11; X86-NEXT: imull %ecx, %eax 12; X86-NEXT: retl 13; 14; X64-LABEL: blsmsk_used2: 15; X64: # %bb.0: # %entry 16; X64-NEXT: # kill: def $edi killed $edi def $rdi 17; X64-NEXT: leal -1(%rdi), %eax 18; X64-NEXT: xorl %eax, %edi 19; X64-NEXT: imull %edi, %eax 20; X64-NEXT: retq 21entry: 22 %sub = add i32 %a, -1 23 %xor = xor i32 %sub, %a 24 %mul = mul i32 %xor, %sub 25 ret i32 %mul 26} 27 28define i64 @blsmask_through1(i64 %a, i64 %b) nounwind { 29; X86-LABEL: blsmask_through1: 30; X86: # %bb.0: # %entry 31; X86-NEXT: pushl %esi 32; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 33; X86-NEXT: movl {{[0-9]+}}(%esp), %esi 34; X86-NEXT: movl %ecx, %eax 35; X86-NEXT: addl $-1, %eax 36; X86-NEXT: movl %esi, %edx 37; X86-NEXT: adcl $-1, %edx 38; X86-NEXT: xorl {{[0-9]+}}(%esp), %edx 39; X86-NEXT: xorl {{[0-9]+}}(%esp), %eax 40; X86-NEXT: xorl %ecx, %eax 41; X86-NEXT: xorl %esi, %edx 42; X86-NEXT: popl %esi 43; X86-NEXT: retl 44; 45; X64-LABEL: blsmask_through1: 46; X64: # %bb.0: # %entry 47; X64-NEXT: blsmskq %rsi, %rax 48; X64-NEXT: xorq %rdi, %rax 49; X64-NEXT: retq 50entry: 51 %sub = add i64 %b, -1 52 %0 = xor i64 %sub, %a 53 %xor1 = xor i64 %0, %b 54 ret i64 %xor1 55} 56 57define i32 @blsmask_through2(i32 %a, i32 %b, i32 %c) nounwind { 58; X86-LABEL: blsmask_through2: 59; X86: # %bb.0: # %entry 60; X86-NEXT: blsmskl {{[0-9]+}}(%esp), %eax 61; X86-NEXT: xorl {{[0-9]+}}(%esp), %eax 62; X86-NEXT: xorl {{[0-9]+}}(%esp), %eax 63; X86-NEXT: retl 64; 65; X64-LABEL: blsmask_through2: 66; X64: # %bb.0: # %entry 67; X64-NEXT: blsmskl %esi, %eax 68; X64-NEXT: xorl %edx, %edi 69; X64-NEXT: xorl %edi, %eax 70; X64-NEXT: retq 71entry: 72 %sub = add nsw i32 %b, -1 73 %0 = xor i32 %sub, %a 74 %1 = xor i32 %0, %c 75 %xor2 = xor i32 %1, %b 76 ret i32 %xor2 77} 78 79define i64 @blsmask_through3(i64 %a, i64 %b, i64 %c, i64 %d) nounwind { 80; X86-LABEL: blsmask_through3: 81; X86: # %bb.0: # %entry 82; X86-NEXT: pushl %esi 83; X86-NEXT: movl {{[0-9]+}}(%esp), %esi 84; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 85; X86-NEXT: movl %esi, %eax 86; X86-NEXT: addl $-1, %eax 87; X86-NEXT: movl %ecx, %edx 88; X86-NEXT: adcl $-1, %edx 89; X86-NEXT: xorl {{[0-9]+}}(%esp), %edx 90; X86-NEXT: xorl {{[0-9]+}}(%esp), %eax 91; X86-NEXT: xorl {{[0-9]+}}(%esp), %edx 92; X86-NEXT: xorl {{[0-9]+}}(%esp), %eax 93; X86-NEXT: xorl {{[0-9]+}}(%esp), %edx 94; X86-NEXT: xorl {{[0-9]+}}(%esp), %eax 95; X86-NEXT: xorl %esi, %eax 96; X86-NEXT: xorl %ecx, %edx 97; X86-NEXT: popl %esi 98; X86-NEXT: retl 99; 100; X64-LABEL: blsmask_through3: 101; X64: # %bb.0: # %entry 102; X64-NEXT: leaq -1(%rsi), %rax 103; X64-NEXT: xorq %rdx, %rdi 104; X64-NEXT: xorq %rdi, %rax 105; X64-NEXT: xorq %rsi, %rcx 106; X64-NEXT: xorq %rcx, %rax 107; X64-NEXT: retq 108entry: 109 %sub = add nsw i64 %b, -1 110 %0 = xor i64 %sub, %a 111 %1 = xor i64 %0, %c 112 %2 = xor i64 %1, %d 113 %xor3 = xor i64 %2, %b 114 ret i64 %xor3 115} 116 117define i32 @blsmask_through1_used1(i32 %a, i32 %b) nounwind { 118; X86-LABEL: blsmask_through1_used1: 119; X86: # %bb.0: # %entry 120; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 121; X86-NEXT: leal -1(%ecx), %eax 122; X86-NEXT: xorl {{[0-9]+}}(%esp), %eax 123; X86-NEXT: xorl %eax, %ecx 124; X86-NEXT: incl %eax 125; X86-NEXT: orl %ecx, %eax 126; X86-NEXT: retl 127; 128; X64-LABEL: blsmask_through1_used1: 129; X64: # %bb.0: # %entry 130; X64-NEXT: # kill: def $esi killed $esi def $rsi 131; X64-NEXT: leal -1(%rsi), %eax 132; X64-NEXT: xorl %edi, %eax 133; X64-NEXT: xorl %eax, %esi 134; X64-NEXT: incl %eax 135; X64-NEXT: orl %esi, %eax 136; X64-NEXT: retq 137entry: 138 %sub = add i32 %b, -1 139 %xor = xor i32 %sub, %a 140 %xor1 = xor i32 %xor, %b 141 %add = add i32 %xor, 1 142 %or = or i32 %add, %xor1 143 ret i32 %or 144} 145 146define i64 @blsmask_through1_used2(i64 %a, i64 %b) nounwind { 147; X86-LABEL: blsmask_through1_used2: 148; X86: # %bb.0: # %entry 149; X86-NEXT: pushl %ebp 150; X86-NEXT: pushl %ebx 151; X86-NEXT: pushl %edi 152; X86-NEXT: pushl %esi 153; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 154; X86-NEXT: movl {{[0-9]+}}(%esp), %esi 155; X86-NEXT: movl %ecx, %edi 156; X86-NEXT: addl $-1, %edi 157; X86-NEXT: movl %esi, %ebp 158; X86-NEXT: adcl $-1, %ebp 159; X86-NEXT: movl {{[0-9]+}}(%esp), %ebx 160; X86-NEXT: xorl %ebp, %ebx 161; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 162; X86-NEXT: xorl %edi, %eax 163; X86-NEXT: xorl %ebx, %esi 164; X86-NEXT: xorl %eax, %ecx 165; X86-NEXT: imull %eax, %ebp 166; X86-NEXT: mull %edi 167; X86-NEXT: addl %ebp, %edx 168; X86-NEXT: imull %edi, %ebx 169; X86-NEXT: addl %ebx, %edx 170; X86-NEXT: orl %esi, %edx 171; X86-NEXT: orl %ecx, %eax 172; X86-NEXT: popl %esi 173; X86-NEXT: popl %edi 174; X86-NEXT: popl %ebx 175; X86-NEXT: popl %ebp 176; X86-NEXT: retl 177; 178; X64-LABEL: blsmask_through1_used2: 179; X64: # %bb.0: # %entry 180; X64-NEXT: leaq -1(%rsi), %rax 181; X64-NEXT: xorq %rax, %rdi 182; X64-NEXT: xorq %rdi, %rsi 183; X64-NEXT: imulq %rdi, %rax 184; X64-NEXT: orq %rsi, %rax 185; X64-NEXT: retq 186entry: 187 %sub = add i64 %b, -1 188 %xor = xor i64 %sub, %a 189 %xor1 = xor i64 %xor, %b 190 %mul = mul i64 %xor, %sub 191 %or = or i64 %mul, %xor1 192 ret i64 %or 193} 194 195define i32 @blsi_used2(i32 %a) nounwind { 196; X86-LABEL: blsi_used2: 197; X86: # %bb.0: # %entry 198; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 199; X86-NEXT: movl %eax, %ecx 200; X86-NEXT: negl %ecx 201; X86-NEXT: andl %ecx, %eax 202; X86-NEXT: imull %ecx, %eax 203; X86-NEXT: retl 204; 205; X64-LABEL: blsi_used2: 206; X64: # %bb.0: # %entry 207; X64-NEXT: movl %edi, %eax 208; X64-NEXT: negl %eax 209; X64-NEXT: andl %eax, %edi 210; X64-NEXT: imull %edi, %eax 211; X64-NEXT: retq 212entry: 213 %sub = sub nsw i32 0, %a 214 %and = and i32 %sub, %a 215 %mul = mul nsw i32 %and, %sub 216 ret i32 %mul 217} 218 219define i64 @blsi_through1(i64 %a, i64 %b) nounwind { 220; X86-LABEL: blsi_through1: 221; X86: # %bb.0: # %entry 222; X86-NEXT: pushl %esi 223; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 224; X86-NEXT: movl {{[0-9]+}}(%esp), %esi 225; X86-NEXT: xorl %edx, %edx 226; X86-NEXT: movl %ecx, %eax 227; X86-NEXT: negl %eax 228; X86-NEXT: sbbl %esi, %edx 229; X86-NEXT: andl {{[0-9]+}}(%esp), %edx 230; X86-NEXT: andl {{[0-9]+}}(%esp), %eax 231; X86-NEXT: andl %esi, %edx 232; X86-NEXT: andl %ecx, %eax 233; X86-NEXT: popl %esi 234; X86-NEXT: retl 235; 236; X64-LABEL: blsi_through1: 237; X64: # %bb.0: # %entry 238; X64-NEXT: blsiq %rsi, %rax 239; X64-NEXT: andq %rdi, %rax 240; X64-NEXT: retq 241entry: 242 %sub = sub nsw i64 0, %b 243 %and = and i64 %sub, %a 244 %and1 = and i64 %and, %b 245 ret i64 %and1 246} 247 248define i32 @blsi_through2(i32 %a, i32 %b, i32 %c) nounwind { 249; X86-LABEL: blsi_through2: 250; X86: # %bb.0: # %entry 251; X86-NEXT: blsil {{[0-9]+}}(%esp), %eax 252; X86-NEXT: andl {{[0-9]+}}(%esp), %eax 253; X86-NEXT: andl {{[0-9]+}}(%esp), %eax 254; X86-NEXT: retl 255; 256; X64-LABEL: blsi_through2: 257; X64: # %bb.0: # %entry 258; X64-NEXT: blsil %esi, %eax 259; X64-NEXT: andl %edx, %edi 260; X64-NEXT: andl %edi, %eax 261; X64-NEXT: retq 262entry: 263 %sub = sub i32 0, %b 264 %and = and i32 %sub, %a 265 %0 = and i32 %and, %c 266 %and2 = and i32 %0, %b 267 ret i32 %and2 268} 269 270define i64 @blsi_through3(i64 %a, i64 %b, i64 %c) nounwind { 271; X86-LABEL: blsi_through3: 272; X86: # %bb.0: # %entry 273; X86-NEXT: pushl %esi 274; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 275; X86-NEXT: movl {{[0-9]+}}(%esp), %esi 276; X86-NEXT: xorl %edx, %edx 277; X86-NEXT: movl %ecx, %eax 278; X86-NEXT: negl %eax 279; X86-NEXT: sbbl %esi, %edx 280; X86-NEXT: andl {{[0-9]+}}(%esp), %edx 281; X86-NEXT: andl {{[0-9]+}}(%esp), %eax 282; X86-NEXT: andl {{[0-9]+}}(%esp), %edx 283; X86-NEXT: andl {{[0-9]+}}(%esp), %eax 284; X86-NEXT: andl %esi, %edx 285; X86-NEXT: andl %ecx, %eax 286; X86-NEXT: popl %esi 287; X86-NEXT: retl 288; 289; X64-LABEL: blsi_through3: 290; X64: # %bb.0: # %entry 291; X64-NEXT: blsiq %rsi, %rax 292; X64-NEXT: andq %rdx, %rdi 293; X64-NEXT: andq %rdi, %rax 294; X64-NEXT: retq 295entry: 296 %sub = sub i64 0, %b 297 %and = and i64 %sub, %a 298 %0 = and i64 %and, %c 299 %and3 = and i64 %0, %b 300 ret i64 %and3 301} 302 303define i32 @blsi_through1_used1(i32 %a, i32 %b) nounwind { 304; X86-LABEL: blsi_through1_used1: 305; X86: # %bb.0: # %entry 306; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 307; X86-NEXT: movl %ecx, %eax 308; X86-NEXT: negl %eax 309; X86-NEXT: andl {{[0-9]+}}(%esp), %eax 310; X86-NEXT: andl %eax, %ecx 311; X86-NEXT: incl %eax 312; X86-NEXT: orl %ecx, %eax 313; X86-NEXT: retl 314; 315; X64-LABEL: blsi_through1_used1: 316; X64: # %bb.0: # %entry 317; X64-NEXT: movl %esi, %eax 318; X64-NEXT: negl %eax 319; X64-NEXT: andl %edi, %eax 320; X64-NEXT: andl %eax, %esi 321; X64-NEXT: incl %eax 322; X64-NEXT: orl %esi, %eax 323; X64-NEXT: retq 324entry: 325 %sub = sub nsw i32 0, %b 326 %and = and i32 %sub, %a 327 %and1 = and i32 %and, %b 328 %add = add nsw i32 %and, 1 329 %or = or i32 %add, %and1 330 ret i32 %or 331} 332 333define i64 @blsi_through1_used2(i64 %a, i64 %b) nounwind { 334; X86-LABEL: blsi_through1_used2: 335; X86: # %bb.0: # %entry 336; X86-NEXT: pushl %ebx 337; X86-NEXT: pushl %edi 338; X86-NEXT: pushl %esi 339; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 340; X86-NEXT: movl {{[0-9]+}}(%esp), %esi 341; X86-NEXT: xorl %edi, %edi 342; X86-NEXT: movl %ecx, %edx 343; X86-NEXT: negl %edx 344; X86-NEXT: sbbl %esi, %edi 345; X86-NEXT: movl {{[0-9]+}}(%esp), %ebx 346; X86-NEXT: andl %edi, %ebx 347; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 348; X86-NEXT: andl %edx, %eax 349; X86-NEXT: andl %ebx, %esi 350; X86-NEXT: andl %eax, %ecx 351; X86-NEXT: imull %edx, %ebx 352; X86-NEXT: imull %eax, %edi 353; X86-NEXT: mull %edx 354; X86-NEXT: addl %edi, %edx 355; X86-NEXT: addl %ebx, %edx 356; X86-NEXT: orl %esi, %edx 357; X86-NEXT: orl %ecx, %eax 358; X86-NEXT: popl %esi 359; X86-NEXT: popl %edi 360; X86-NEXT: popl %ebx 361; X86-NEXT: retl 362; 363; X64-LABEL: blsi_through1_used2: 364; X64: # %bb.0: # %entry 365; X64-NEXT: movq %rsi, %rax 366; X64-NEXT: negq %rax 367; X64-NEXT: andq %rax, %rdi 368; X64-NEXT: andq %rdi, %rsi 369; X64-NEXT: imulq %rdi, %rax 370; X64-NEXT: orq %rsi, %rax 371; X64-NEXT: retq 372entry: 373 %sub = sub nsw i64 0, %b 374 %and = and i64 %sub, %a 375 %and1 = and i64 %and, %b 376 %mul = mul nsw i64 %and, %sub 377 %or = or i64 %mul, %and1 378 ret i64 %or 379} 380 381define i32 @blsr_used2(i32 %a) nounwind { 382; X86-LABEL: blsr_used2: 383; X86: # %bb.0: # %entry 384; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 385; X86-NEXT: leal -1(%eax), %ecx 386; X86-NEXT: andl %ecx, %eax 387; X86-NEXT: imull %ecx, %eax 388; X86-NEXT: retl 389; 390; X64-LABEL: blsr_used2: 391; X64: # %bb.0: # %entry 392; X64-NEXT: # kill: def $edi killed $edi def $rdi 393; X64-NEXT: leal -1(%rdi), %eax 394; X64-NEXT: andl %eax, %edi 395; X64-NEXT: imull %edi, %eax 396; X64-NEXT: retq 397entry: 398 %sub = add i32 %a, -1 399 %and = and i32 %sub, %a 400 %mul = mul i32 %and, %sub 401 ret i32 %mul 402} 403 404define i64 @blsr_through1(i64 %a, i64 %b) nounwind { 405; X86-LABEL: blsr_through1: 406; X86: # %bb.0: # %entry 407; X86-NEXT: pushl %esi 408; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 409; X86-NEXT: movl {{[0-9]+}}(%esp), %esi 410; X86-NEXT: movl %ecx, %eax 411; X86-NEXT: addl $-1, %eax 412; X86-NEXT: movl %esi, %edx 413; X86-NEXT: adcl $-1, %edx 414; X86-NEXT: andl {{[0-9]+}}(%esp), %edx 415; X86-NEXT: andl {{[0-9]+}}(%esp), %eax 416; X86-NEXT: andl %ecx, %eax 417; X86-NEXT: andl %esi, %edx 418; X86-NEXT: popl %esi 419; X86-NEXT: retl 420; 421; X64-LABEL: blsr_through1: 422; X64: # %bb.0: # %entry 423; X64-NEXT: blsrq %rsi, %rax 424; X64-NEXT: andq %rdi, %rax 425; X64-NEXT: retq 426entry: 427 %sub = add i64 %b, -1 428 %0 = and i64 %sub, %a 429 %and1 = and i64 %0, %b 430 ret i64 %and1 431} 432 433define i32 @blsr_through2(i32 %a, i32 %b, i32 %c) nounwind { 434; X86-LABEL: blsr_through2: 435; X86: # %bb.0: # %entry 436; X86-NEXT: blsrl {{[0-9]+}}(%esp), %eax 437; X86-NEXT: andl {{[0-9]+}}(%esp), %eax 438; X86-NEXT: andl {{[0-9]+}}(%esp), %eax 439; X86-NEXT: retl 440; 441; X64-LABEL: blsr_through2: 442; X64: # %bb.0: # %entry 443; X64-NEXT: blsrl %esi, %eax 444; X64-NEXT: andl %edx, %edi 445; X64-NEXT: andl %edi, %eax 446; X64-NEXT: retq 447entry: 448 %sub = add nsw i32 %b, -1 449 %0 = and i32 %sub, %a 450 %1 = and i32 %0, %c 451 %and2 = and i32 %1, %b 452 ret i32 %and2 453} 454 455define i64 @blsr_through3(i64 %a, i64 %b, i64 %c, i64 %d) nounwind { 456; X86-LABEL: blsr_through3: 457; X86: # %bb.0: # %entry 458; X86-NEXT: pushl %esi 459; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 460; X86-NEXT: movl {{[0-9]+}}(%esp), %esi 461; X86-NEXT: xorl %edx, %edx 462; X86-NEXT: movl %ecx, %eax 463; X86-NEXT: negl %eax 464; X86-NEXT: sbbl %esi, %edx 465; X86-NEXT: andl {{[0-9]+}}(%esp), %edx 466; X86-NEXT: andl {{[0-9]+}}(%esp), %eax 467; X86-NEXT: andl {{[0-9]+}}(%esp), %edx 468; X86-NEXT: andl {{[0-9]+}}(%esp), %eax 469; X86-NEXT: andl {{[0-9]+}}(%esp), %edx 470; X86-NEXT: andl {{[0-9]+}}(%esp), %eax 471; X86-NEXT: andl %esi, %edx 472; X86-NEXT: andl %ecx, %eax 473; X86-NEXT: popl %esi 474; X86-NEXT: retl 475; 476; X64-LABEL: blsr_through3: 477; X64: # %bb.0: # %entry 478; X64-NEXT: movq %rdi, %rax 479; X64-NEXT: andq %rsi, %rcx 480; X64-NEXT: negq %rsi 481; X64-NEXT: andq %rdx, %rax 482; X64-NEXT: andq %rsi, %rax 483; X64-NEXT: andq %rcx, %rax 484; X64-NEXT: retq 485entry: 486 %sub = sub nsw i64 0, %b 487 %and = and i64 %sub, %a 488 %0 = and i64 %and, %c 489 %1 = and i64 %0, %d 490 %and4 = and i64 %1, %b 491 ret i64 %and4 492} 493 494define i32 @blsr_through1_used1(i32 %a, i32 %b) nounwind { 495; X86-LABEL: blsr_through1_used1: 496; X86: # %bb.0: # %entry 497; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 498; X86-NEXT: leal -1(%ecx), %eax 499; X86-NEXT: andl {{[0-9]+}}(%esp), %eax 500; X86-NEXT: andl %eax, %ecx 501; X86-NEXT: incl %eax 502; X86-NEXT: orl %ecx, %eax 503; X86-NEXT: retl 504; 505; X64-LABEL: blsr_through1_used1: 506; X64: # %bb.0: # %entry 507; X64-NEXT: # kill: def $esi killed $esi def $rsi 508; X64-NEXT: leal -1(%rsi), %eax 509; X64-NEXT: andl %edi, %eax 510; X64-NEXT: andl %eax, %esi 511; X64-NEXT: incl %eax 512; X64-NEXT: orl %esi, %eax 513; X64-NEXT: retq 514entry: 515 %sub = add i32 %b, -1 516 %and = and i32 %sub, %a 517 %and1 = and i32 %and, %b 518 %add = add i32 %and, 1 519 %or = or i32 %add, %and1 520 ret i32 %or 521} 522 523define i64 @blsr_through1_used2(i64 %a, i64 %b) nounwind { 524; X86-LABEL: blsr_through1_used2: 525; X86: # %bb.0: # %entry 526; X86-NEXT: pushl %ebp 527; X86-NEXT: pushl %ebx 528; X86-NEXT: pushl %edi 529; X86-NEXT: pushl %esi 530; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 531; X86-NEXT: movl {{[0-9]+}}(%esp), %esi 532; X86-NEXT: movl %ecx, %edi 533; X86-NEXT: addl $-1, %edi 534; X86-NEXT: movl %esi, %ebp 535; X86-NEXT: adcl $-1, %ebp 536; X86-NEXT: movl {{[0-9]+}}(%esp), %ebx 537; X86-NEXT: andl %ebp, %ebx 538; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 539; X86-NEXT: andl %edi, %eax 540; X86-NEXT: andl %ebx, %esi 541; X86-NEXT: andl %eax, %ecx 542; X86-NEXT: imull %eax, %ebp 543; X86-NEXT: mull %edi 544; X86-NEXT: addl %ebp, %edx 545; X86-NEXT: imull %edi, %ebx 546; X86-NEXT: addl %ebx, %edx 547; X86-NEXT: orl %esi, %edx 548; X86-NEXT: orl %ecx, %eax 549; X86-NEXT: popl %esi 550; X86-NEXT: popl %edi 551; X86-NEXT: popl %ebx 552; X86-NEXT: popl %ebp 553; X86-NEXT: retl 554; 555; X64-LABEL: blsr_through1_used2: 556; X64: # %bb.0: # %entry 557; X64-NEXT: leaq -1(%rsi), %rax 558; X64-NEXT: andq %rax, %rdi 559; X64-NEXT: andq %rdi, %rsi 560; X64-NEXT: imulq %rdi, %rax 561; X64-NEXT: orq %rsi, %rax 562; X64-NEXT: retq 563entry: 564 %sub = add i64 %b, -1 565 %and = and i64 %sub, %a 566 %and1 = and i64 %and, %b 567 %mul = mul i64 %and, %sub 568 %or = or i64 %mul, %and1 569 ret i64 %or 570} 571