brintos

brintos / llvm-project-archived public Read only

0
0
Text · 31.3 KiB · 9121cf2 Raw
885 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=i686-unknown-linux-gnu -mattr=+sse,sse2                  < %s | FileCheck %s --check-prefixes=CHECK,SSE2,X86,X86-SSE2,X86-BMI13; RUN: llc -mtriple=i686-unknown-linux-gnu -mattr=+sse,sse2,+bmi             < %s | FileCheck %s --check-prefixes=CHECK,SSE2,X86,X86-SSE2,X86-BMI14; RUN: llc -mtriple=i686-unknown-linux-gnu -mattr=+sse,sse2,+bmi,+bmi2       < %s | FileCheck %s --check-prefixes=CHECK,SSE2,X86,X86-SSE2,X86-BMI25; RUN: llc -mtriple=i686-unknown-linux-gnu -mattr=+sse,sse2,+bmi,+bmi2,+avx2 < %s | FileCheck %s --check-prefixes=CHECK,AVX2,X86,X86-BMI26; RUN: llc -mtriple=x86_64-unknown-linux-gnu -mattr=+sse,sse2                  < %s | FileCheck %s --check-prefixes=CHECK,SSE2,X64,X64-SSE2,X64-BMI17; RUN: llc -mtriple=x86_64-unknown-linux-gnu -mattr=+sse,sse2,+bmi             < %s | FileCheck %s --check-prefixes=CHECK,SSE2,X64,X64-SSE2,X64-BMI18; RUN: llc -mtriple=x86_64-unknown-linux-gnu -mattr=+sse,sse2,+bmi,+bmi2       < %s | FileCheck %s --check-prefixes=CHECK,SSE2,X64,X64-SSE2,X64-BMI29; RUN: llc -mtriple=x86_64-unknown-linux-gnu -mattr=+sse,sse2,+bmi,+bmi2,+avx2 < %s | FileCheck %s --check-prefixes=CHECK,AVX2,X64,X64-BMI210 11; We are looking for the following pattern here:12;   (X & (C l>> Y)) ==/!= 013; It may be optimal to hoist the constant:14;   ((X << Y) & C) ==/!= 015 16;------------------------------------------------------------------------------;17; A few scalar test18;------------------------------------------------------------------------------;19 20; i8 scalar21 22define i1 @scalar_i8_signbit_eq(i8 %x, i8 %y) nounwind {23; X86-LABEL: scalar_i8_signbit_eq:24; X86:       # %bb.0:25; X86-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx26; X86-NEXT:    movzbl {{[0-9]+}}(%esp), %eax27; X86-NEXT:    shlb %cl, %al28; X86-NEXT:    testb $-128, %al29; X86-NEXT:    sete %al30; X86-NEXT:    retl31;32; X64-LABEL: scalar_i8_signbit_eq:33; X64:       # %bb.0:34; X64-NEXT:    movl %esi, %ecx35; X64-NEXT:    # kill: def $cl killed $cl killed $ecx36; X64-NEXT:    shlb %cl, %dil37; X64-NEXT:    testb $-128, %dil38; X64-NEXT:    sete %al39; X64-NEXT:    retq40  %t0 = lshr i8 128, %y41  %t1 = and i8 %t0, %x42  %res = icmp eq i8 %t1, 043  ret i1 %res44}45 46define i1 @scalar_i8_lowestbit_eq(i8 %x, i8 %y) nounwind {47; X86-LABEL: scalar_i8_lowestbit_eq:48; X86:       # %bb.0:49; X86-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx50; X86-NEXT:    movzbl {{[0-9]+}}(%esp), %eax51; X86-NEXT:    shlb %cl, %al52; X86-NEXT:    testb $1, %al53; X86-NEXT:    sete %al54; X86-NEXT:    retl55;56; X64-LABEL: scalar_i8_lowestbit_eq:57; X64:       # %bb.0:58; X64-NEXT:    movl %esi, %ecx59; X64-NEXT:    # kill: def $cl killed $cl killed $ecx60; X64-NEXT:    shlb %cl, %dil61; X64-NEXT:    testb $1, %dil62; X64-NEXT:    sete %al63; X64-NEXT:    retq64  %t0 = lshr i8 1, %y65  %t1 = and i8 %t0, %x66  %res = icmp eq i8 %t1, 067  ret i1 %res68}69 70define i1 @scalar_i8_bitsinmiddle_eq(i8 %x, i8 %y) nounwind {71; X86-LABEL: scalar_i8_bitsinmiddle_eq:72; X86:       # %bb.0:73; X86-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx74; X86-NEXT:    movzbl {{[0-9]+}}(%esp), %eax75; X86-NEXT:    shlb %cl, %al76; X86-NEXT:    testb $24, %al77; X86-NEXT:    sete %al78; X86-NEXT:    retl79;80; X64-LABEL: scalar_i8_bitsinmiddle_eq:81; X64:       # %bb.0:82; X64-NEXT:    movl %esi, %ecx83; X64-NEXT:    # kill: def $cl killed $cl killed $ecx84; X64-NEXT:    shlb %cl, %dil85; X64-NEXT:    testb $24, %dil86; X64-NEXT:    sete %al87; X64-NEXT:    retq88  %t0 = lshr i8 24, %y89  %t1 = and i8 %t0, %x90  %res = icmp eq i8 %t1, 091  ret i1 %res92}93 94; i16 scalar95 96define i1 @scalar_i16_signbit_eq(i16 %x, i16 %y) nounwind {97; X86-BMI1-LABEL: scalar_i16_signbit_eq:98; X86-BMI1:       # %bb.0:99; X86-BMI1-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx100; X86-BMI1-NEXT:    movl {{[0-9]+}}(%esp), %eax101; X86-BMI1-NEXT:    shll %cl, %eax102; X86-BMI1-NEXT:    testl $32768, %eax # imm = 0x8000103; X86-BMI1-NEXT:    sete %al104; X86-BMI1-NEXT:    retl105;106; X86-BMI2-LABEL: scalar_i16_signbit_eq:107; X86-BMI2:       # %bb.0:108; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %eax109; X86-BMI2-NEXT:    shlxl %eax, {{[0-9]+}}(%esp), %eax110; X86-BMI2-NEXT:    testl $32768, %eax # imm = 0x8000111; X86-BMI2-NEXT:    sete %al112; X86-BMI2-NEXT:    retl113;114; X64-BMI1-LABEL: scalar_i16_signbit_eq:115; X64-BMI1:       # %bb.0:116; X64-BMI1-NEXT:    movl %esi, %ecx117; X64-BMI1-NEXT:    # kill: def $cl killed $cl killed $ecx118; X64-BMI1-NEXT:    shll %cl, %edi119; X64-BMI1-NEXT:    testl $32768, %edi # imm = 0x8000120; X64-BMI1-NEXT:    sete %al121; X64-BMI1-NEXT:    retq122;123; X64-BMI2-LABEL: scalar_i16_signbit_eq:124; X64-BMI2:       # %bb.0:125; X64-BMI2-NEXT:    shlxl %esi, %edi, %eax126; X64-BMI2-NEXT:    testl $32768, %eax # imm = 0x8000127; X64-BMI2-NEXT:    sete %al128; X64-BMI2-NEXT:    retq129  %t0 = lshr i16 32768, %y130  %t1 = and i16 %t0, %x131  %res = icmp eq i16 %t1, 0132  ret i1 %res133}134 135define i1 @scalar_i16_lowestbit_eq(i16 %x, i16 %y) nounwind {136; X86-BMI1-LABEL: scalar_i16_lowestbit_eq:137; X86-BMI1:       # %bb.0:138; X86-BMI1-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx139; X86-BMI1-NEXT:    movl {{[0-9]+}}(%esp), %eax140; X86-BMI1-NEXT:    shll %cl, %eax141; X86-BMI1-NEXT:    testb $1, %al142; X86-BMI1-NEXT:    sete %al143; X86-BMI1-NEXT:    retl144;145; X86-BMI2-LABEL: scalar_i16_lowestbit_eq:146; X86-BMI2:       # %bb.0:147; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %eax148; X86-BMI2-NEXT:    shlxl %eax, {{[0-9]+}}(%esp), %eax149; X86-BMI2-NEXT:    testb $1, %al150; X86-BMI2-NEXT:    sete %al151; X86-BMI2-NEXT:    retl152;153; X64-BMI1-LABEL: scalar_i16_lowestbit_eq:154; X64-BMI1:       # %bb.0:155; X64-BMI1-NEXT:    movl %esi, %ecx156; X64-BMI1-NEXT:    # kill: def $cl killed $cl killed $ecx157; X64-BMI1-NEXT:    shll %cl, %edi158; X64-BMI1-NEXT:    testb $1, %dil159; X64-BMI1-NEXT:    sete %al160; X64-BMI1-NEXT:    retq161;162; X64-BMI2-LABEL: scalar_i16_lowestbit_eq:163; X64-BMI2:       # %bb.0:164; X64-BMI2-NEXT:    shlxl %esi, %edi, %eax165; X64-BMI2-NEXT:    testb $1, %al166; X64-BMI2-NEXT:    sete %al167; X64-BMI2-NEXT:    retq168  %t0 = lshr i16 1, %y169  %t1 = and i16 %t0, %x170  %res = icmp eq i16 %t1, 0171  ret i1 %res172}173 174define i1 @scalar_i16_bitsinmiddle_eq(i16 %x, i16 %y) nounwind {175; X86-BMI1-LABEL: scalar_i16_bitsinmiddle_eq:176; X86-BMI1:       # %bb.0:177; X86-BMI1-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx178; X86-BMI1-NEXT:    movl {{[0-9]+}}(%esp), %eax179; X86-BMI1-NEXT:    shll %cl, %eax180; X86-BMI1-NEXT:    testl $4080, %eax # imm = 0xFF0181; X86-BMI1-NEXT:    sete %al182; X86-BMI1-NEXT:    retl183;184; X86-BMI2-LABEL: scalar_i16_bitsinmiddle_eq:185; X86-BMI2:       # %bb.0:186; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %eax187; X86-BMI2-NEXT:    shlxl %eax, {{[0-9]+}}(%esp), %eax188; X86-BMI2-NEXT:    testl $4080, %eax # imm = 0xFF0189; X86-BMI2-NEXT:    sete %al190; X86-BMI2-NEXT:    retl191;192; X64-BMI1-LABEL: scalar_i16_bitsinmiddle_eq:193; X64-BMI1:       # %bb.0:194; X64-BMI1-NEXT:    movl %esi, %ecx195; X64-BMI1-NEXT:    # kill: def $cl killed $cl killed $ecx196; X64-BMI1-NEXT:    shll %cl, %edi197; X64-BMI1-NEXT:    testl $4080, %edi # imm = 0xFF0198; X64-BMI1-NEXT:    sete %al199; X64-BMI1-NEXT:    retq200;201; X64-BMI2-LABEL: scalar_i16_bitsinmiddle_eq:202; X64-BMI2:       # %bb.0:203; X64-BMI2-NEXT:    shlxl %esi, %edi, %eax204; X64-BMI2-NEXT:    testl $4080, %eax # imm = 0xFF0205; X64-BMI2-NEXT:    sete %al206; X64-BMI2-NEXT:    retq207  %t0 = lshr i16 4080, %y208  %t1 = and i16 %t0, %x209  %res = icmp eq i16 %t1, 0210  ret i1 %res211}212 213; i32 scalar214 215define i1 @scalar_i32_signbit_eq(i32 %x, i32 %y) nounwind {216; X86-BMI1-LABEL: scalar_i32_signbit_eq:217; X86-BMI1:       # %bb.0:218; X86-BMI1-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx219; X86-BMI1-NEXT:    movl {{[0-9]+}}(%esp), %eax220; X86-BMI1-NEXT:    shll %cl, %eax221; X86-BMI1-NEXT:    testl $-2147483648, %eax # imm = 0x80000000222; X86-BMI1-NEXT:    sete %al223; X86-BMI1-NEXT:    retl224;225; X86-BMI2-LABEL: scalar_i32_signbit_eq:226; X86-BMI2:       # %bb.0:227; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %eax228; X86-BMI2-NEXT:    shlxl %eax, {{[0-9]+}}(%esp), %eax229; X86-BMI2-NEXT:    testl $-2147483648, %eax # imm = 0x80000000230; X86-BMI2-NEXT:    sete %al231; X86-BMI2-NEXT:    retl232;233; X64-BMI1-LABEL: scalar_i32_signbit_eq:234; X64-BMI1:       # %bb.0:235; X64-BMI1-NEXT:    movl %esi, %ecx236; X64-BMI1-NEXT:    # kill: def $cl killed $cl killed $ecx237; X64-BMI1-NEXT:    shll %cl, %edi238; X64-BMI1-NEXT:    testl $-2147483648, %edi # imm = 0x80000000239; X64-BMI1-NEXT:    sete %al240; X64-BMI1-NEXT:    retq241;242; X64-BMI2-LABEL: scalar_i32_signbit_eq:243; X64-BMI2:       # %bb.0:244; X64-BMI2-NEXT:    shlxl %esi, %edi, %eax245; X64-BMI2-NEXT:    testl $-2147483648, %eax # imm = 0x80000000246; X64-BMI2-NEXT:    sete %al247; X64-BMI2-NEXT:    retq248  %t0 = lshr i32 2147483648, %y249  %t1 = and i32 %t0, %x250  %res = icmp eq i32 %t1, 0251  ret i1 %res252}253 254define i1 @scalar_i32_lowestbit_eq(i32 %x, i32 %y) nounwind {255; X86-BMI1-LABEL: scalar_i32_lowestbit_eq:256; X86-BMI1:       # %bb.0:257; X86-BMI1-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx258; X86-BMI1-NEXT:    movl {{[0-9]+}}(%esp), %eax259; X86-BMI1-NEXT:    shll %cl, %eax260; X86-BMI1-NEXT:    testb $1, %al261; X86-BMI1-NEXT:    sete %al262; X86-BMI1-NEXT:    retl263;264; X86-BMI2-LABEL: scalar_i32_lowestbit_eq:265; X86-BMI2:       # %bb.0:266; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %eax267; X86-BMI2-NEXT:    shlxl %eax, {{[0-9]+}}(%esp), %eax268; X86-BMI2-NEXT:    testb $1, %al269; X86-BMI2-NEXT:    sete %al270; X86-BMI2-NEXT:    retl271;272; X64-BMI1-LABEL: scalar_i32_lowestbit_eq:273; X64-BMI1:       # %bb.0:274; X64-BMI1-NEXT:    movl %esi, %ecx275; X64-BMI1-NEXT:    # kill: def $cl killed $cl killed $ecx276; X64-BMI1-NEXT:    shll %cl, %edi277; X64-BMI1-NEXT:    testb $1, %dil278; X64-BMI1-NEXT:    sete %al279; X64-BMI1-NEXT:    retq280;281; X64-BMI2-LABEL: scalar_i32_lowestbit_eq:282; X64-BMI2:       # %bb.0:283; X64-BMI2-NEXT:    shlxl %esi, %edi, %eax284; X64-BMI2-NEXT:    testb $1, %al285; X64-BMI2-NEXT:    sete %al286; X64-BMI2-NEXT:    retq287  %t0 = lshr i32 1, %y288  %t1 = and i32 %t0, %x289  %res = icmp eq i32 %t1, 0290  ret i1 %res291}292 293define i1 @scalar_i32_bitsinmiddle_eq(i32 %x, i32 %y) nounwind {294; X86-BMI1-LABEL: scalar_i32_bitsinmiddle_eq:295; X86-BMI1:       # %bb.0:296; X86-BMI1-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx297; X86-BMI1-NEXT:    movl {{[0-9]+}}(%esp), %eax298; X86-BMI1-NEXT:    shll %cl, %eax299; X86-BMI1-NEXT:    testl $16776960, %eax # imm = 0xFFFF00300; X86-BMI1-NEXT:    sete %al301; X86-BMI1-NEXT:    retl302;303; X86-BMI2-LABEL: scalar_i32_bitsinmiddle_eq:304; X86-BMI2:       # %bb.0:305; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %eax306; X86-BMI2-NEXT:    shlxl %eax, {{[0-9]+}}(%esp), %eax307; X86-BMI2-NEXT:    testl $16776960, %eax # imm = 0xFFFF00308; X86-BMI2-NEXT:    sete %al309; X86-BMI2-NEXT:    retl310;311; X64-BMI1-LABEL: scalar_i32_bitsinmiddle_eq:312; X64-BMI1:       # %bb.0:313; X64-BMI1-NEXT:    movl %esi, %ecx314; X64-BMI1-NEXT:    # kill: def $cl killed $cl killed $ecx315; X64-BMI1-NEXT:    shll %cl, %edi316; X64-BMI1-NEXT:    testl $16776960, %edi # imm = 0xFFFF00317; X64-BMI1-NEXT:    sete %al318; X64-BMI1-NEXT:    retq319;320; X64-BMI2-LABEL: scalar_i32_bitsinmiddle_eq:321; X64-BMI2:       # %bb.0:322; X64-BMI2-NEXT:    shlxl %esi, %edi, %eax323; X64-BMI2-NEXT:    testl $16776960, %eax # imm = 0xFFFF00324; X64-BMI2-NEXT:    sete %al325; X64-BMI2-NEXT:    retq326  %t0 = lshr i32 16776960, %y327  %t1 = and i32 %t0, %x328  %res = icmp eq i32 %t1, 0329  ret i1 %res330}331 332; i64 scalar333 334define i1 @scalar_i64_signbit_eq(i64 %x, i64 %y) nounwind {335; X86-BMI1-LABEL: scalar_i64_signbit_eq:336; X86-BMI1:       # %bb.0:337; X86-BMI1-NEXT:    pushl %esi338; X86-BMI1-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx339; X86-BMI1-NEXT:    movl {{[0-9]+}}(%esp), %eax340; X86-BMI1-NEXT:    movl {{[0-9]+}}(%esp), %edx341; X86-BMI1-NEXT:    movl %eax, %esi342; X86-BMI1-NEXT:    shll %cl, %esi343; X86-BMI1-NEXT:    shldl %cl, %eax, %edx344; X86-BMI1-NEXT:    testb $32, %cl345; X86-BMI1-NEXT:    cmovnel %esi, %edx346; X86-BMI1-NEXT:    testl $-2147483648, %edx # imm = 0x80000000347; X86-BMI1-NEXT:    sete %al348; X86-BMI1-NEXT:    popl %esi349; X86-BMI1-NEXT:    retl350;351; X86-BMI2-LABEL: scalar_i64_signbit_eq:352; X86-BMI2:       # %bb.0:353; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx354; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %eax355; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %edx356; X86-BMI2-NEXT:    shldl %cl, %eax, %edx357; X86-BMI2-NEXT:    shlxl %ecx, %eax, %eax358; X86-BMI2-NEXT:    testb $32, %cl359; X86-BMI2-NEXT:    cmovel %edx, %eax360; X86-BMI2-NEXT:    testl $-2147483648, %eax # imm = 0x80000000361; X86-BMI2-NEXT:    sete %al362; X86-BMI2-NEXT:    retl363;364; X64-BMI1-LABEL: scalar_i64_signbit_eq:365; X64-BMI1:       # %bb.0:366; X64-BMI1-NEXT:    movq %rsi, %rcx367; X64-BMI1-NEXT:    # kill: def $cl killed $cl killed $rcx368; X64-BMI1-NEXT:    shlq %cl, %rdi369; X64-BMI1-NEXT:    shrq $63, %rdi370; X64-BMI1-NEXT:    sete %al371; X64-BMI1-NEXT:    retq372;373; X64-BMI2-LABEL: scalar_i64_signbit_eq:374; X64-BMI2:       # %bb.0:375; X64-BMI2-NEXT:    shlxq %rsi, %rdi, %rax376; X64-BMI2-NEXT:    shrq $63, %rax377; X64-BMI2-NEXT:    sete %al378; X64-BMI2-NEXT:    retq379  %t0 = lshr i64 9223372036854775808, %y380  %t1 = and i64 %t0, %x381  %res = icmp eq i64 %t1, 0382  ret i1 %res383}384 385define i1 @scalar_i64_lowestbit_eq(i64 %x, i64 %y) nounwind {386; X86-BMI1-LABEL: scalar_i64_lowestbit_eq:387; X86-BMI1:       # %bb.0:388; X86-BMI1-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx389; X86-BMI1-NEXT:    movl {{[0-9]+}}(%esp), %eax390; X86-BMI1-NEXT:    shll %cl, %eax391; X86-BMI1-NEXT:    xorl %edx, %edx392; X86-BMI1-NEXT:    testb $32, %cl393; X86-BMI1-NEXT:    cmovel %eax, %edx394; X86-BMI1-NEXT:    testb $1, %dl395; X86-BMI1-NEXT:    sete %al396; X86-BMI1-NEXT:    retl397;398; X86-BMI2-LABEL: scalar_i64_lowestbit_eq:399; X86-BMI2:       # %bb.0:400; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %eax401; X86-BMI2-NEXT:    shlxl %eax, {{[0-9]+}}(%esp), %ecx402; X86-BMI2-NEXT:    xorl %edx, %edx403; X86-BMI2-NEXT:    testb $32, %al404; X86-BMI2-NEXT:    cmovel %ecx, %edx405; X86-BMI2-NEXT:    testb $1, %dl406; X86-BMI2-NEXT:    sete %al407; X86-BMI2-NEXT:    retl408;409; X64-BMI1-LABEL: scalar_i64_lowestbit_eq:410; X64-BMI1:       # %bb.0:411; X64-BMI1-NEXT:    movq %rsi, %rcx412; X64-BMI1-NEXT:    # kill: def $cl killed $cl killed $rcx413; X64-BMI1-NEXT:    shlq %cl, %rdi414; X64-BMI1-NEXT:    testb $1, %dil415; X64-BMI1-NEXT:    sete %al416; X64-BMI1-NEXT:    retq417;418; X64-BMI2-LABEL: scalar_i64_lowestbit_eq:419; X64-BMI2:       # %bb.0:420; X64-BMI2-NEXT:    shlxq %rsi, %rdi, %rax421; X64-BMI2-NEXT:    testb $1, %al422; X64-BMI2-NEXT:    sete %al423; X64-BMI2-NEXT:    retq424  %t0 = lshr i64 1, %y425  %t1 = and i64 %t0, %x426  %res = icmp eq i64 %t1, 0427  ret i1 %res428}429 430define i1 @scalar_i64_bitsinmiddle_eq(i64 %x, i64 %y) nounwind {431; X86-BMI1-LABEL: scalar_i64_bitsinmiddle_eq:432; X86-BMI1:       # %bb.0:433; X86-BMI1-NEXT:    pushl %esi434; X86-BMI1-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx435; X86-BMI1-NEXT:    movl {{[0-9]+}}(%esp), %eax436; X86-BMI1-NEXT:    movl {{[0-9]+}}(%esp), %edx437; X86-BMI1-NEXT:    movl %eax, %esi438; X86-BMI1-NEXT:    shll %cl, %esi439; X86-BMI1-NEXT:    shldl %cl, %eax, %edx440; X86-BMI1-NEXT:    xorl %eax, %eax441; X86-BMI1-NEXT:    testb $32, %cl442; X86-BMI1-NEXT:    cmovnel %esi, %edx443; X86-BMI1-NEXT:    movzwl %dx, %ecx444; X86-BMI1-NEXT:    cmovel %esi, %eax445; X86-BMI1-NEXT:    andl $-65536, %eax # imm = 0xFFFF0000446; X86-BMI1-NEXT:    orl %ecx, %eax447; X86-BMI1-NEXT:    sete %al448; X86-BMI1-NEXT:    popl %esi449; X86-BMI1-NEXT:    retl450;451; X86-BMI2-LABEL: scalar_i64_bitsinmiddle_eq:452; X86-BMI2:       # %bb.0:453; X86-BMI2-NEXT:    pushl %esi454; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx455; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %eax456; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %edx457; X86-BMI2-NEXT:    shldl %cl, %eax, %edx458; X86-BMI2-NEXT:    shlxl %ecx, %eax, %eax459; X86-BMI2-NEXT:    xorl %esi, %esi460; X86-BMI2-NEXT:    testb $32, %cl461; X86-BMI2-NEXT:    cmovnel %eax, %edx462; X86-BMI2-NEXT:    movzwl %dx, %ecx463; X86-BMI2-NEXT:    cmovel %eax, %esi464; X86-BMI2-NEXT:    andl $-65536, %esi # imm = 0xFFFF0000465; X86-BMI2-NEXT:    orl %ecx, %esi466; X86-BMI2-NEXT:    sete %al467; X86-BMI2-NEXT:    popl %esi468; X86-BMI2-NEXT:    retl469;470; X64-BMI1-LABEL: scalar_i64_bitsinmiddle_eq:471; X64-BMI1:       # %bb.0:472; X64-BMI1-NEXT:    movq %rsi, %rcx473; X64-BMI1-NEXT:    # kill: def $cl killed $cl killed $rcx474; X64-BMI1-NEXT:    shlq %cl, %rdi475; X64-BMI1-NEXT:    shrq $16, %rdi476; X64-BMI1-NEXT:    testl %edi, %edi477; X64-BMI1-NEXT:    sete %al478; X64-BMI1-NEXT:    retq479;480; X64-BMI2-LABEL: scalar_i64_bitsinmiddle_eq:481; X64-BMI2:       # %bb.0:482; X64-BMI2-NEXT:    shlxq %rsi, %rdi, %rax483; X64-BMI2-NEXT:    shrq $16, %rax484; X64-BMI2-NEXT:    testl %eax, %eax485; X64-BMI2-NEXT:    sete %al486; X64-BMI2-NEXT:    retq487  %t0 = lshr i64 281474976645120, %y488  %t1 = and i64 %t0, %x489  %res = icmp eq i64 %t1, 0490  ret i1 %res491}492 493;------------------------------------------------------------------------------;494; A few trivial vector tests495;------------------------------------------------------------------------------;496 497define <4 x i1> @vec_4xi32_splat_eq(<4 x i32> %x, <4 x i32> %y) nounwind {498; X86-SSE2-LABEL: vec_4xi32_splat_eq:499; X86-SSE2:       # %bb.0:500; X86-SSE2-NEXT:    pxor %xmm2, %xmm2501; X86-SSE2-NEXT:    pslld $23, %xmm1502; X86-SSE2-NEXT:    paddd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1503; X86-SSE2-NEXT:    cvttps2dq %xmm1, %xmm1504; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]505; X86-SSE2-NEXT:    pmuludq %xmm1, %xmm0506; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]507; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]508; X86-SSE2-NEXT:    pmuludq %xmm3, %xmm1509; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]510; X86-SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]511; X86-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0512; X86-SSE2-NEXT:    pcmpeqd %xmm2, %xmm0513; X86-SSE2-NEXT:    retl514;515; AVX2-LABEL: vec_4xi32_splat_eq:516; AVX2:       # %bb.0:517; AVX2-NEXT:    vpbroadcastd {{.*#+}} xmm2 = [1,1,1,1]518; AVX2-NEXT:    vpxor %xmm3, %xmm3, %xmm3519; AVX2-NEXT:    vpsllvd %xmm1, %xmm0, %xmm0520; AVX2-NEXT:    vpand %xmm2, %xmm0, %xmm0521; AVX2-NEXT:    vpcmpeqd %xmm3, %xmm0, %xmm0522; AVX2-NEXT:    ret{{[l|q]}}523;524; X64-SSE2-LABEL: vec_4xi32_splat_eq:525; X64-SSE2:       # %bb.0:526; X64-SSE2-NEXT:    pxor %xmm2, %xmm2527; X64-SSE2-NEXT:    pslld $23, %xmm1528; X64-SSE2-NEXT:    paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1529; X64-SSE2-NEXT:    cvttps2dq %xmm1, %xmm1530; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]531; X64-SSE2-NEXT:    pmuludq %xmm1, %xmm0532; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]533; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]534; X64-SSE2-NEXT:    pmuludq %xmm3, %xmm1535; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]536; X64-SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]537; X64-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0538; X64-SSE2-NEXT:    pcmpeqd %xmm2, %xmm0539; X64-SSE2-NEXT:    retq540  %t0 = lshr <4 x i32> <i32 1, i32 1, i32 1, i32 1>, %y541  %t1 = and <4 x i32> %t0, %x542  %res = icmp eq <4 x i32> %t1, <i32 0, i32 0, i32 0, i32 0>543  ret <4 x i1> %res544}545 546define <4 x i1> @vec_4xi32_nonsplat_eq(<4 x i32> %x, <4 x i32> %y) nounwind {547; SSE2-LABEL: vec_4xi32_nonsplat_eq:548; SSE2:       # %bb.0:549; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[2,3,2,3]550; SSE2-NEXT:    pshuflw {{.*#+}} xmm3 = xmm2[2,3,3,3,4,5,6,7]551; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [0,1,16776960,2147483648]552; SSE2-NEXT:    movdqa %xmm4, %xmm5553; SSE2-NEXT:    psrld %xmm3, %xmm5554; SSE2-NEXT:    pshuflw {{.*#+}} xmm2 = xmm2[0,1,1,1,4,5,6,7]555; SSE2-NEXT:    movdqa %xmm4, %xmm3556; SSE2-NEXT:    psrld %xmm2, %xmm3557; SSE2-NEXT:    punpckhqdq {{.*#+}} xmm3 = xmm3[1],xmm5[1]558; SSE2-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[2,3,3,3,4,5,6,7]559; SSE2-NEXT:    psrld %xmm1, %xmm4560; SSE2-NEXT:    pslldq {{.*#+}} xmm4 = zero,zero,zero,zero,zero,zero,zero,zero,xmm4[0,1,2,3,4,5,6,7]561; SSE2-NEXT:    shufps {{.*#+}} xmm4 = xmm4[0,3],xmm3[0,3]562; SSE2-NEXT:    andps %xmm4, %xmm0563; SSE2-NEXT:    pxor %xmm1, %xmm1564; SSE2-NEXT:    pcmpeqd %xmm1, %xmm0565; SSE2-NEXT:    ret{{[l|q]}}566;567; AVX2-LABEL: vec_4xi32_nonsplat_eq:568; AVX2:       # %bb.0:569; AVX2-NEXT:    vmovdqa {{.*#+}} xmm2 = [0,1,16776960,2147483648]570; AVX2-NEXT:    vpsrlvd %xmm1, %xmm2, %xmm1571; AVX2-NEXT:    vpand %xmm0, %xmm1, %xmm0572; AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm1573; AVX2-NEXT:    vpcmpeqd %xmm1, %xmm0, %xmm0574; AVX2-NEXT:    ret{{[l|q]}}575  %t0 = lshr <4 x i32> <i32 0, i32 1, i32 16776960, i32 2147483648>, %y576  %t1 = and <4 x i32> %t0, %x577  %res = icmp eq <4 x i32> %t1, <i32 0, i32 0, i32 0, i32 0>578  ret <4 x i1> %res579}580 581define <4 x i1> @vec_4xi32_nonsplat_undef0_eq(<4 x i32> %x, <4 x i32> %y) nounwind {582; X86-SSE2-LABEL: vec_4xi32_nonsplat_undef0_eq:583; X86-SSE2:       # %bb.0:584; X86-SSE2-NEXT:    pxor %xmm2, %xmm2585; X86-SSE2-NEXT:    pslld $23, %xmm1586; X86-SSE2-NEXT:    paddd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1587; X86-SSE2-NEXT:    cvttps2dq %xmm1, %xmm1588; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]589; X86-SSE2-NEXT:    pmuludq %xmm1, %xmm0590; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]591; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]592; X86-SSE2-NEXT:    pmuludq %xmm3, %xmm1593; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]594; X86-SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]595; X86-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0596; X86-SSE2-NEXT:    pcmpeqd %xmm2, %xmm0597; X86-SSE2-NEXT:    retl598;599; AVX2-LABEL: vec_4xi32_nonsplat_undef0_eq:600; AVX2:       # %bb.0:601; AVX2-NEXT:    vpbroadcastd {{.*#+}} xmm2 = [1,1,1,1]602; AVX2-NEXT:    vpxor %xmm3, %xmm3, %xmm3603; AVX2-NEXT:    vpsllvd %xmm1, %xmm0, %xmm0604; AVX2-NEXT:    vpand %xmm2, %xmm0, %xmm0605; AVX2-NEXT:    vpcmpeqd %xmm3, %xmm0, %xmm0606; AVX2-NEXT:    ret{{[l|q]}}607;608; X64-SSE2-LABEL: vec_4xi32_nonsplat_undef0_eq:609; X64-SSE2:       # %bb.0:610; X64-SSE2-NEXT:    pxor %xmm2, %xmm2611; X64-SSE2-NEXT:    pslld $23, %xmm1612; X64-SSE2-NEXT:    paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1613; X64-SSE2-NEXT:    cvttps2dq %xmm1, %xmm1614; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]615; X64-SSE2-NEXT:    pmuludq %xmm1, %xmm0616; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]617; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]618; X64-SSE2-NEXT:    pmuludq %xmm3, %xmm1619; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]620; X64-SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]621; X64-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0622; X64-SSE2-NEXT:    pcmpeqd %xmm2, %xmm0623; X64-SSE2-NEXT:    retq624  %t0 = lshr <4 x i32> <i32 1, i32 1, i32 undef, i32 1>, %y625  %t1 = and <4 x i32> %t0, %x626  %res = icmp eq <4 x i32> %t1, <i32 0, i32 0, i32 0, i32 0>627  ret <4 x i1> %res628}629define <4 x i1> @vec_4xi32_nonsplat_undef1_eq(<4 x i32> %x, <4 x i32> %y) nounwind {630; X86-SSE2-LABEL: vec_4xi32_nonsplat_undef1_eq:631; X86-SSE2:       # %bb.0:632; X86-SSE2-NEXT:    pshuflw {{.*#+}} xmm3 = xmm1[2,3,3,3,4,5,6,7]633; X86-SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [1,1,1,1]634; X86-SSE2-NEXT:    movdqa %xmm2, %xmm4635; X86-SSE2-NEXT:    psrld %xmm3, %xmm4636; X86-SSE2-NEXT:    pshuflw {{.*#+}} xmm3 = xmm1[0,1,1,1,4,5,6,7]637; X86-SSE2-NEXT:    movdqa %xmm2, %xmm5638; X86-SSE2-NEXT:    psrld %xmm3, %xmm5639; X86-SSE2-NEXT:    punpcklqdq {{.*#+}} xmm5 = xmm5[0],xmm4[0]640; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]641; X86-SSE2-NEXT:    pshuflw {{.*#+}} xmm3 = xmm1[2,3,3,3,4,5,6,7]642; X86-SSE2-NEXT:    movdqa %xmm2, %xmm4643; X86-SSE2-NEXT:    psrld %xmm3, %xmm4644; X86-SSE2-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[0,1,1,1,4,5,6,7]645; X86-SSE2-NEXT:    psrld %xmm1, %xmm2646; X86-SSE2-NEXT:    punpckhqdq {{.*#+}} xmm2 = xmm2[1],xmm4[1]647; X86-SSE2-NEXT:    shufps {{.*#+}} xmm5 = xmm5[0,3],xmm2[0,3]648; X86-SSE2-NEXT:    andps %xmm5, %xmm0649; X86-SSE2-NEXT:    pxor %xmm1, %xmm1650; X86-SSE2-NEXT:    pcmpeqd %xmm1, %xmm0651; X86-SSE2-NEXT:    retl652;653; AVX2-LABEL: vec_4xi32_nonsplat_undef1_eq:654; AVX2:       # %bb.0:655; AVX2-NEXT:    vpbroadcastd {{.*#+}} xmm2 = [1,1,1,1]656; AVX2-NEXT:    vpsrlvd %xmm1, %xmm2, %xmm1657; AVX2-NEXT:    vpand %xmm0, %xmm1, %xmm0658; AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm1659; AVX2-NEXT:    vpcmpeqd %xmm1, %xmm0, %xmm0660; AVX2-NEXT:    ret{{[l|q]}}661;662; X64-SSE2-LABEL: vec_4xi32_nonsplat_undef1_eq:663; X64-SSE2:       # %bb.0:664; X64-SSE2-NEXT:    pshuflw {{.*#+}} xmm2 = xmm1[2,3,3,3,4,5,6,7]665; X64-SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [1,1,1,1]666; X64-SSE2-NEXT:    movdqa %xmm3, %xmm4667; X64-SSE2-NEXT:    psrld %xmm2, %xmm4668; X64-SSE2-NEXT:    pshuflw {{.*#+}} xmm2 = xmm1[0,1,1,1,4,5,6,7]669; X64-SSE2-NEXT:    movdqa %xmm3, %xmm5670; X64-SSE2-NEXT:    psrld %xmm2, %xmm5671; X64-SSE2-NEXT:    punpcklqdq {{.*#+}} xmm5 = xmm5[0],xmm4[0]672; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]673; X64-SSE2-NEXT:    pshuflw {{.*#+}} xmm2 = xmm1[2,3,3,3,4,5,6,7]674; X64-SSE2-NEXT:    movdqa %xmm3, %xmm4675; X64-SSE2-NEXT:    psrld %xmm2, %xmm4676; X64-SSE2-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[0,1,1,1,4,5,6,7]677; X64-SSE2-NEXT:    psrld %xmm1, %xmm3678; X64-SSE2-NEXT:    punpckhqdq {{.*#+}} xmm3 = xmm3[1],xmm4[1]679; X64-SSE2-NEXT:    shufps {{.*#+}} xmm5 = xmm5[0,3],xmm3[0,3]680; X64-SSE2-NEXT:    andps %xmm5, %xmm0681; X64-SSE2-NEXT:    pxor %xmm1, %xmm1682; X64-SSE2-NEXT:    pcmpeqd %xmm1, %xmm0683; X64-SSE2-NEXT:    retq684  %t0 = lshr <4 x i32> <i32 1, i32 1, i32 1, i32 1>, %y685  %t1 = and <4 x i32> %t0, %x686  %res = icmp eq <4 x i32> %t1, <i32 0, i32 0, i32 undef, i32 0>687  ret <4 x i1> %res688}689define <4 x i1> @vec_4xi32_nonsplat_undef2_eq(<4 x i32> %x, <4 x i32> %y) nounwind {690; X86-SSE2-LABEL: vec_4xi32_nonsplat_undef2_eq:691; X86-SSE2:       # %bb.0:692; X86-SSE2-NEXT:    pshuflw {{.*#+}} xmm3 = xmm1[2,3,3,3,4,5,6,7]693; X86-SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [1,1,u,1]694; X86-SSE2-NEXT:    movdqa %xmm2, %xmm4695; X86-SSE2-NEXT:    psrld %xmm3, %xmm4696; X86-SSE2-NEXT:    pshuflw {{.*#+}} xmm3 = xmm1[0,1,1,1,4,5,6,7]697; X86-SSE2-NEXT:    movdqa %xmm2, %xmm5698; X86-SSE2-NEXT:    psrld %xmm3, %xmm5699; X86-SSE2-NEXT:    punpcklqdq {{.*#+}} xmm5 = xmm5[0],xmm4[0]700; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]701; X86-SSE2-NEXT:    pshuflw {{.*#+}} xmm3 = xmm1[2,3,3,3,4,5,6,7]702; X86-SSE2-NEXT:    movdqa %xmm2, %xmm4703; X86-SSE2-NEXT:    psrld %xmm3, %xmm4704; X86-SSE2-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[0,1,1,1,4,5,6,7]705; X86-SSE2-NEXT:    psrld %xmm1, %xmm2706; X86-SSE2-NEXT:    punpckhqdq {{.*#+}} xmm2 = xmm2[1],xmm4[1]707; X86-SSE2-NEXT:    shufps {{.*#+}} xmm5 = xmm5[0,3],xmm2[0,3]708; X86-SSE2-NEXT:    andps %xmm5, %xmm0709; X86-SSE2-NEXT:    pxor %xmm1, %xmm1710; X86-SSE2-NEXT:    pcmpeqd %xmm1, %xmm0711; X86-SSE2-NEXT:    retl712;713; AVX2-LABEL: vec_4xi32_nonsplat_undef2_eq:714; AVX2:       # %bb.0:715; AVX2-NEXT:    vpbroadcastd {{.*#+}} xmm2 = [1,1,1,1]716; AVX2-NEXT:    vpsrlvd %xmm1, %xmm2, %xmm1717; AVX2-NEXT:    vpand %xmm0, %xmm1, %xmm0718; AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm1719; AVX2-NEXT:    vpcmpeqd %xmm1, %xmm0, %xmm0720; AVX2-NEXT:    ret{{[l|q]}}721;722; X64-SSE2-LABEL: vec_4xi32_nonsplat_undef2_eq:723; X64-SSE2:       # %bb.0:724; X64-SSE2-NEXT:    pshuflw {{.*#+}} xmm2 = xmm1[2,3,3,3,4,5,6,7]725; X64-SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [1,1,u,1]726; X64-SSE2-NEXT:    movdqa %xmm3, %xmm4727; X64-SSE2-NEXT:    psrld %xmm2, %xmm4728; X64-SSE2-NEXT:    pshuflw {{.*#+}} xmm2 = xmm1[0,1,1,1,4,5,6,7]729; X64-SSE2-NEXT:    movdqa %xmm3, %xmm5730; X64-SSE2-NEXT:    psrld %xmm2, %xmm5731; X64-SSE2-NEXT:    punpcklqdq {{.*#+}} xmm5 = xmm5[0],xmm4[0]732; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]733; X64-SSE2-NEXT:    pshuflw {{.*#+}} xmm2 = xmm1[2,3,3,3,4,5,6,7]734; X64-SSE2-NEXT:    movdqa %xmm3, %xmm4735; X64-SSE2-NEXT:    psrld %xmm2, %xmm4736; X64-SSE2-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[0,1,1,1,4,5,6,7]737; X64-SSE2-NEXT:    psrld %xmm1, %xmm3738; X64-SSE2-NEXT:    punpckhqdq {{.*#+}} xmm3 = xmm3[1],xmm4[1]739; X64-SSE2-NEXT:    shufps {{.*#+}} xmm5 = xmm5[0,3],xmm3[0,3]740; X64-SSE2-NEXT:    andps %xmm5, %xmm0741; X64-SSE2-NEXT:    pxor %xmm1, %xmm1742; X64-SSE2-NEXT:    pcmpeqd %xmm1, %xmm0743; X64-SSE2-NEXT:    retq744  %t0 = lshr <4 x i32> <i32 1, i32 1, i32 undef, i32 1>, %y745  %t1 = and <4 x i32> %t0, %x746  %res = icmp eq <4 x i32> %t1, <i32 0, i32 0, i32 undef, i32 0>747  ret <4 x i1> %res748}749 750;------------------------------------------------------------------------------;751; A special tests752;------------------------------------------------------------------------------;753 754define i1 @scalar_i8_signbit_ne(i8 %x, i8 %y) nounwind {755; X86-LABEL: scalar_i8_signbit_ne:756; X86:       # %bb.0:757; X86-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx758; X86-NEXT:    movzbl {{[0-9]+}}(%esp), %eax759; X86-NEXT:    shlb %cl, %al760; X86-NEXT:    shrb $7, %al761; X86-NEXT:    retl762;763; X64-LABEL: scalar_i8_signbit_ne:764; X64:       # %bb.0:765; X64-NEXT:    movl %esi, %ecx766; X64-NEXT:    movl %edi, %eax767; X64-NEXT:    # kill: def $cl killed $cl killed $ecx768; X64-NEXT:    shlb %cl, %al769; X64-NEXT:    shrb $7, %al770; X64-NEXT:    # kill: def $al killed $al killed $eax771; X64-NEXT:    retq772  %t0 = lshr i8 128, %y773  %t1 = and i8 %t0, %x774  %res = icmp ne i8 %t1, 0 ;  we are perfectly happy with 'ne' predicate775  ret i1 %res776}777 778;------------------------------------------------------------------------------;779; What if X is a constant too?780;------------------------------------------------------------------------------;781 782define i1 @scalar_i32_x_is_const_eq(i32 %y) nounwind {783; X86-LABEL: scalar_i32_x_is_const_eq:784; X86:       # %bb.0:785; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax786; X86-NEXT:    movl $-1437226411, %ecx # imm = 0xAA55AA55787; X86-NEXT:    btl %eax, %ecx788; X86-NEXT:    setae %al789; X86-NEXT:    retl790;791; X64-LABEL: scalar_i32_x_is_const_eq:792; X64:       # %bb.0:793; X64-NEXT:    movl $-1437226411, %eax # imm = 0xAA55AA55794; X64-NEXT:    btl %edi, %eax795; X64-NEXT:    setae %al796; X64-NEXT:    retq797  %t0 = lshr i32 2857740885, %y798  %t1 = and i32 %t0, 1799  %res = icmp eq i32 %t1, 0800  ret i1 %res801}802define i1 @scalar_i32_x_is_const2_eq(i32 %y) nounwind {803; X86-BMI1-LABEL: scalar_i32_x_is_const2_eq:804; X86-BMI1:       # %bb.0:805; X86-BMI1-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx806; X86-BMI1-NEXT:    movl $1, %eax807; X86-BMI1-NEXT:    shrl %cl, %eax808; X86-BMI1-NEXT:    testl %eax, %eax809; X86-BMI1-NEXT:    sete %al810; X86-BMI1-NEXT:    retl811;812; X86-BMI2-LABEL: scalar_i32_x_is_const2_eq:813; X86-BMI2:       # %bb.0:814; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %eax815; X86-BMI2-NEXT:    movl $1, %ecx816; X86-BMI2-NEXT:    shrxl %eax, %ecx, %eax817; X86-BMI2-NEXT:    testl %eax, %eax818; X86-BMI2-NEXT:    sete %al819; X86-BMI2-NEXT:    retl820;821; X64-BMI1-LABEL: scalar_i32_x_is_const2_eq:822; X64-BMI1:       # %bb.0:823; X64-BMI1-NEXT:    movl %edi, %ecx824; X64-BMI1-NEXT:    movl $1, %eax825; X64-BMI1-NEXT:    # kill: def $cl killed $cl killed $ecx826; X64-BMI1-NEXT:    shrl %cl, %eax827; X64-BMI1-NEXT:    testl %eax, %eax828; X64-BMI1-NEXT:    sete %al829; X64-BMI1-NEXT:    retq830;831; X64-BMI2-LABEL: scalar_i32_x_is_const2_eq:832; X64-BMI2:       # %bb.0:833; X64-BMI2-NEXT:    movl $1, %eax834; X64-BMI2-NEXT:    shrxl %edi, %eax, %eax835; X64-BMI2-NEXT:    testl %eax, %eax836; X64-BMI2-NEXT:    sete %al837; X64-BMI2-NEXT:    retq838  %t0 = lshr i32 1, %y839  %t1 = and i32 %t0, 2857740885840  %res = icmp eq i32 %t1, 0841  ret i1 %res842}843 844;------------------------------------------------------------------------------;845; A few negative tests846;------------------------------------------------------------------------------;847 848define i1 @negative_scalar_i8_bitsinmiddle_slt(i8 %x, i8 %y) nounwind {849; CHECK-LABEL: negative_scalar_i8_bitsinmiddle_slt:850; CHECK:       # %bb.0:851; CHECK-NEXT:    xorl %eax, %eax852; CHECK-NEXT:    ret{{[l|q]}}853  %t0 = lshr i8 24, %y854  %t1 = and i8 %t0, %x855  %res = icmp slt i8 %t1, 0856  ret i1 %res857}858 859define i1 @scalar_i8_signbit_eq_with_nonzero(i8 %x, i8 %y) nounwind {860; X86-LABEL: scalar_i8_signbit_eq_with_nonzero:861; X86:       # %bb.0:862; X86-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx863; X86-NEXT:    movb $-128, %al864; X86-NEXT:    shrb %cl, %al865; X86-NEXT:    andb {{[0-9]+}}(%esp), %al866; X86-NEXT:    cmpb $1, %al867; X86-NEXT:    sete %al868; X86-NEXT:    retl869;870; X64-LABEL: scalar_i8_signbit_eq_with_nonzero:871; X64:       # %bb.0:872; X64-NEXT:    movl %esi, %ecx873; X64-NEXT:    movb $-128, %al874; X64-NEXT:    # kill: def $cl killed $cl killed $ecx875; X64-NEXT:    shrb %cl, %al876; X64-NEXT:    andb %dil, %al877; X64-NEXT:    cmpb $1, %al878; X64-NEXT:    sete %al879; X64-NEXT:    retq880  %t0 = lshr i8 128, %y881  %t1 = and i8 %t0, %x882  %res = icmp eq i8 %t1, 1 ; should be comparing with 0883  ret i1 %res884}885