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