4605 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefixes=SSE,SSE23; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefixes=SSE,SSE414; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefixes=AVX,AVX1OR2,AVX15; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=AVX,AVX1OR2,AVX26; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefixes=AVX,AVX512,KNL7; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512vl,+avx512dq,+avx512bw | FileCheck %s --check-prefixes=AVX,AVX512,SKX8 9define i1 @allones_v16i8_sign(<16 x i8> %arg) {10; SSE-LABEL: allones_v16i8_sign:11; SSE: # %bb.0:12; SSE-NEXT: pmovmskb %xmm0, %eax13; SSE-NEXT: cmpl $65535, %eax # imm = 0xFFFF14; SSE-NEXT: sete %al15; SSE-NEXT: retq16;17; AVX-LABEL: allones_v16i8_sign:18; AVX: # %bb.0:19; AVX-NEXT: vpmovmskb %xmm0, %eax20; AVX-NEXT: cmpl $65535, %eax # imm = 0xFFFF21; AVX-NEXT: sete %al22; AVX-NEXT: retq23 %tmp = icmp slt <16 x i8> %arg, zeroinitializer24 %tmp1 = bitcast <16 x i1> %tmp to i1625 %tmp2 = icmp eq i16 %tmp1, -126 ret i1 %tmp227}28 29define i1 @allzeros_v16i8_sign(<16 x i8> %arg) {30; SSE-LABEL: allzeros_v16i8_sign:31; SSE: # %bb.0:32; SSE-NEXT: pmovmskb %xmm0, %eax33; SSE-NEXT: testl %eax, %eax34; SSE-NEXT: sete %al35; SSE-NEXT: retq36;37; AVX-LABEL: allzeros_v16i8_sign:38; AVX: # %bb.0:39; AVX-NEXT: vpmovmskb %xmm0, %eax40; AVX-NEXT: testl %eax, %eax41; AVX-NEXT: sete %al42; AVX-NEXT: retq43 %tmp = icmp slt <16 x i8> %arg, zeroinitializer44 %tmp1 = bitcast <16 x i1> %tmp to i1645 %tmp2 = icmp eq i16 %tmp1, 046 ret i1 %tmp247}48 49define i1 @allones_v32i8_sign(<32 x i8> %arg) {50; SSE-LABEL: allones_v32i8_sign:51; SSE: # %bb.0:52; SSE-NEXT: pand %xmm1, %xmm053; SSE-NEXT: pmovmskb %xmm0, %eax54; SSE-NEXT: cmpl $65535, %eax # imm = 0xFFFF55; SSE-NEXT: sete %al56; SSE-NEXT: retq57;58; AVX1-LABEL: allones_v32i8_sign:59; AVX1: # %bb.0:60; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm161; AVX1-NEXT: vpand %xmm0, %xmm1, %xmm062; AVX1-NEXT: vpmovmskb %xmm0, %eax63; AVX1-NEXT: cmpl $65535, %eax # imm = 0xFFFF64; AVX1-NEXT: sete %al65; AVX1-NEXT: vzeroupper66; AVX1-NEXT: retq67;68; AVX2-LABEL: allones_v32i8_sign:69; AVX2: # %bb.0:70; AVX2-NEXT: vpmovmskb %ymm0, %eax71; AVX2-NEXT: cmpl $-1, %eax72; AVX2-NEXT: sete %al73; AVX2-NEXT: vzeroupper74; AVX2-NEXT: retq75;76; AVX512-LABEL: allones_v32i8_sign:77; AVX512: # %bb.0:78; AVX512-NEXT: vpmovmskb %ymm0, %eax79; AVX512-NEXT: cmpl $-1, %eax80; AVX512-NEXT: sete %al81; AVX512-NEXT: vzeroupper82; AVX512-NEXT: retq83 %tmp = icmp slt <32 x i8> %arg, zeroinitializer84 %tmp1 = bitcast <32 x i1> %tmp to i3285 %tmp2 = icmp eq i32 %tmp1, -186 ret i1 %tmp287}88 89define i1 @allzeros_v32i8_sign(<32 x i8> %arg) {90; SSE-LABEL: allzeros_v32i8_sign:91; SSE: # %bb.0:92; SSE-NEXT: por %xmm1, %xmm093; SSE-NEXT: pmovmskb %xmm0, %eax94; SSE-NEXT: testl %eax, %eax95; SSE-NEXT: sete %al96; SSE-NEXT: retq97;98; AVX1-LABEL: allzeros_v32i8_sign:99; AVX1: # %bb.0:100; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1101; AVX1-NEXT: vpor %xmm1, %xmm0, %xmm0102; AVX1-NEXT: vpmovmskb %xmm0, %eax103; AVX1-NEXT: testl %eax, %eax104; AVX1-NEXT: sete %al105; AVX1-NEXT: vzeroupper106; AVX1-NEXT: retq107;108; AVX2-LABEL: allzeros_v32i8_sign:109; AVX2: # %bb.0:110; AVX2-NEXT: vpmovmskb %ymm0, %eax111; AVX2-NEXT: testl %eax, %eax112; AVX2-NEXT: sete %al113; AVX2-NEXT: vzeroupper114; AVX2-NEXT: retq115;116; AVX512-LABEL: allzeros_v32i8_sign:117; AVX512: # %bb.0:118; AVX512-NEXT: vpmovmskb %ymm0, %eax119; AVX512-NEXT: testl %eax, %eax120; AVX512-NEXT: sete %al121; AVX512-NEXT: vzeroupper122; AVX512-NEXT: retq123 %tmp = icmp slt <32 x i8> %arg, zeroinitializer124 %tmp1 = bitcast <32 x i1> %tmp to i32125 %tmp2 = icmp eq i32 %tmp1, 0126 ret i1 %tmp2127}128 129define i1 @allones_v64i8_sign(<64 x i8> %arg) {130; SSE-LABEL: allones_v64i8_sign:131; SSE: # %bb.0:132; SSE-NEXT: pand %xmm2, %xmm0133; SSE-NEXT: pand %xmm3, %xmm1134; SSE-NEXT: pand %xmm0, %xmm1135; SSE-NEXT: pmovmskb %xmm1, %eax136; SSE-NEXT: cmpl $65535, %eax # imm = 0xFFFF137; SSE-NEXT: sete %al138; SSE-NEXT: retq139;140; AVX1-LABEL: allones_v64i8_sign:141; AVX1: # %bb.0:142; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2143; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3144; AVX1-NEXT: vpand %xmm2, %xmm3, %xmm2145; AVX1-NEXT: vpand %xmm0, %xmm1, %xmm0146; AVX1-NEXT: vpand %xmm0, %xmm2, %xmm0147; AVX1-NEXT: vpmovmskb %xmm0, %eax148; AVX1-NEXT: cmpl $65535, %eax # imm = 0xFFFF149; AVX1-NEXT: sete %al150; AVX1-NEXT: vzeroupper151; AVX1-NEXT: retq152;153; AVX2-LABEL: allones_v64i8_sign:154; AVX2: # %bb.0:155; AVX2-NEXT: vpand %ymm0, %ymm1, %ymm0156; AVX2-NEXT: vpmovmskb %ymm0, %eax157; AVX2-NEXT: cmpl $-1, %eax158; AVX2-NEXT: sete %al159; AVX2-NEXT: vzeroupper160; AVX2-NEXT: retq161;162; KNL-LABEL: allones_v64i8_sign:163; KNL: # %bb.0:164; KNL-NEXT: vextracti64x4 $1, %zmm0, %ymm1165; KNL-NEXT: vpand %ymm0, %ymm1, %ymm0166; KNL-NEXT: vpmovmskb %ymm0, %eax167; KNL-NEXT: cmpl $-1, %eax168; KNL-NEXT: sete %al169; KNL-NEXT: vzeroupper170; KNL-NEXT: retq171;172; SKX-LABEL: allones_v64i8_sign:173; SKX: # %bb.0:174; SKX-NEXT: vpmovb2m %zmm0, %k0175; SKX-NEXT: kortestq %k0, %k0176; SKX-NEXT: setb %al177; SKX-NEXT: vzeroupper178; SKX-NEXT: retq179 %tmp = icmp slt <64 x i8> %arg, zeroinitializer180 %tmp1 = bitcast <64 x i1> %tmp to i64181 %tmp2 = icmp eq i64 %tmp1, -1182 ret i1 %tmp2183}184 185define i1 @allzeros_v64i8_sign(<64 x i8> %arg) {186; SSE-LABEL: allzeros_v64i8_sign:187; SSE: # %bb.0:188; SSE-NEXT: por %xmm3, %xmm1189; SSE-NEXT: por %xmm2, %xmm0190; SSE-NEXT: por %xmm1, %xmm0191; SSE-NEXT: pmovmskb %xmm0, %eax192; SSE-NEXT: testl %eax, %eax193; SSE-NEXT: sete %al194; SSE-NEXT: retq195;196; AVX1-LABEL: allzeros_v64i8_sign:197; AVX1: # %bb.0:198; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2199; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3200; AVX1-NEXT: vpor %xmm2, %xmm3, %xmm2201; AVX1-NEXT: vpor %xmm1, %xmm0, %xmm0202; AVX1-NEXT: vpor %xmm2, %xmm0, %xmm0203; AVX1-NEXT: vpmovmskb %xmm0, %eax204; AVX1-NEXT: testl %eax, %eax205; AVX1-NEXT: sete %al206; AVX1-NEXT: vzeroupper207; AVX1-NEXT: retq208;209; AVX2-LABEL: allzeros_v64i8_sign:210; AVX2: # %bb.0:211; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0212; AVX2-NEXT: vpmovmskb %ymm0, %eax213; AVX2-NEXT: testl %eax, %eax214; AVX2-NEXT: sete %al215; AVX2-NEXT: vzeroupper216; AVX2-NEXT: retq217;218; KNL-LABEL: allzeros_v64i8_sign:219; KNL: # %bb.0:220; KNL-NEXT: vextracti64x4 $1, %zmm0, %ymm1221; KNL-NEXT: vpor %ymm1, %ymm0, %ymm0222; KNL-NEXT: vpmovmskb %ymm0, %eax223; KNL-NEXT: testl %eax, %eax224; KNL-NEXT: sete %al225; KNL-NEXT: vzeroupper226; KNL-NEXT: retq227;228; SKX-LABEL: allzeros_v64i8_sign:229; SKX: # %bb.0:230; SKX-NEXT: vpmovb2m %zmm0, %k0231; SKX-NEXT: kortestq %k0, %k0232; SKX-NEXT: sete %al233; SKX-NEXT: vzeroupper234; SKX-NEXT: retq235 %tmp = icmp slt <64 x i8> %arg, zeroinitializer236 %tmp1 = bitcast <64 x i1> %tmp to i64237 %tmp2 = icmp eq i64 %tmp1, 0238 ret i1 %tmp2239}240 241define i1 @allones_v8i16_sign(<8 x i16> %arg) {242; SSE-LABEL: allones_v8i16_sign:243; SSE: # %bb.0:244; SSE-NEXT: packsswb %xmm0, %xmm0245; SSE-NEXT: pmovmskb %xmm0, %eax246; SSE-NEXT: cmpb $-1, %al247; SSE-NEXT: sete %al248; SSE-NEXT: retq249;250; AVX1OR2-LABEL: allones_v8i16_sign:251; AVX1OR2: # %bb.0:252; AVX1OR2-NEXT: vpacksswb %xmm0, %xmm0, %xmm0253; AVX1OR2-NEXT: vpmovmskb %xmm0, %eax254; AVX1OR2-NEXT: cmpb $-1, %al255; AVX1OR2-NEXT: sete %al256; AVX1OR2-NEXT: retq257;258; KNL-LABEL: allones_v8i16_sign:259; KNL: # %bb.0:260; KNL-NEXT: vpxor %xmm1, %xmm1, %xmm1261; KNL-NEXT: vpcmpgtw %xmm0, %xmm1, %xmm0262; KNL-NEXT: vpmovsxwq %xmm0, %zmm0263; KNL-NEXT: vptestmq %zmm0, %zmm0, %k0264; KNL-NEXT: kmovw %k0, %eax265; KNL-NEXT: cmpb $-1, %al266; KNL-NEXT: sete %al267; KNL-NEXT: vzeroupper268; KNL-NEXT: retq269;270; SKX-LABEL: allones_v8i16_sign:271; SKX: # %bb.0:272; SKX-NEXT: vpmovw2m %xmm0, %k0273; SKX-NEXT: kortestb %k0, %k0274; SKX-NEXT: setb %al275; SKX-NEXT: retq276 %tmp = icmp slt <8 x i16> %arg, zeroinitializer277 %tmp1 = bitcast <8 x i1> %tmp to i8278 %tmp2 = icmp eq i8 %tmp1, -1279 ret i1 %tmp2280}281 282define i1 @allzeros_v8i16_sign(<8 x i16> %arg) {283; SSE-LABEL: allzeros_v8i16_sign:284; SSE: # %bb.0:285; SSE-NEXT: pmovmskb %xmm0, %eax286; SSE-NEXT: testl $43690, %eax # imm = 0xAAAA287; SSE-NEXT: sete %al288; SSE-NEXT: retq289;290; AVX1OR2-LABEL: allzeros_v8i16_sign:291; AVX1OR2: # %bb.0:292; AVX1OR2-NEXT: vpmovmskb %xmm0, %eax293; AVX1OR2-NEXT: testl $43690, %eax # imm = 0xAAAA294; AVX1OR2-NEXT: sete %al295; AVX1OR2-NEXT: retq296;297; KNL-LABEL: allzeros_v8i16_sign:298; KNL: # %bb.0:299; KNL-NEXT: vpxor %xmm1, %xmm1, %xmm1300; KNL-NEXT: vpcmpgtw %xmm0, %xmm1, %xmm0301; KNL-NEXT: vpmovsxwq %xmm0, %zmm0302; KNL-NEXT: vptestmd %zmm0, %zmm0, %k0303; KNL-NEXT: kortestw %k0, %k0304; KNL-NEXT: sete %al305; KNL-NEXT: vzeroupper306; KNL-NEXT: retq307;308; SKX-LABEL: allzeros_v8i16_sign:309; SKX: # %bb.0:310; SKX-NEXT: vpmovw2m %xmm0, %k0311; SKX-NEXT: kortestb %k0, %k0312; SKX-NEXT: sete %al313; SKX-NEXT: retq314 %tmp = icmp slt <8 x i16> %arg, zeroinitializer315 %tmp1 = bitcast <8 x i1> %tmp to i8316 %tmp2 = icmp eq i8 %tmp1, 0317 ret i1 %tmp2318}319 320define i1 @allones_v16i16_sign(<16 x i16> %arg) {321; SSE-LABEL: allones_v16i16_sign:322; SSE: # %bb.0:323; SSE-NEXT: packsswb %xmm1, %xmm0324; SSE-NEXT: pmovmskb %xmm0, %eax325; SSE-NEXT: cmpl $65535, %eax # imm = 0xFFFF326; SSE-NEXT: sete %al327; SSE-NEXT: retq328;329; AVX1-LABEL: allones_v16i16_sign:330; AVX1: # %bb.0:331; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1332; AVX1-NEXT: vpacksswb %xmm1, %xmm0, %xmm0333; AVX1-NEXT: vpmovmskb %xmm0, %eax334; AVX1-NEXT: cmpl $65535, %eax # imm = 0xFFFF335; AVX1-NEXT: sete %al336; AVX1-NEXT: vzeroupper337; AVX1-NEXT: retq338;339; AVX2-LABEL: allones_v16i16_sign:340; AVX2: # %bb.0:341; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1342; AVX2-NEXT: vpacksswb %xmm1, %xmm0, %xmm0343; AVX2-NEXT: vpmovmskb %xmm0, %eax344; AVX2-NEXT: cmpl $65535, %eax # imm = 0xFFFF345; AVX2-NEXT: sete %al346; AVX2-NEXT: vzeroupper347; AVX2-NEXT: retq348;349; KNL-LABEL: allones_v16i16_sign:350; KNL: # %bb.0:351; KNL-NEXT: vpxor %xmm1, %xmm1, %xmm1352; KNL-NEXT: vpcmpgtw %ymm0, %ymm1, %ymm0353; KNL-NEXT: vpmovsxwd %ymm0, %zmm0354; KNL-NEXT: vptestmd %zmm0, %zmm0, %k0355; KNL-NEXT: kortestw %k0, %k0356; KNL-NEXT: setb %al357; KNL-NEXT: vzeroupper358; KNL-NEXT: retq359;360; SKX-LABEL: allones_v16i16_sign:361; SKX: # %bb.0:362; SKX-NEXT: vpmovw2m %ymm0, %k0363; SKX-NEXT: kortestw %k0, %k0364; SKX-NEXT: setb %al365; SKX-NEXT: vzeroupper366; SKX-NEXT: retq367 %tmp = icmp slt <16 x i16> %arg, zeroinitializer368 %tmp1 = bitcast <16 x i1> %tmp to i16369 %tmp2 = icmp eq i16 %tmp1, -1370 ret i1 %tmp2371}372 373define i1 @allzeros_v16i16_sign(<16 x i16> %arg) {374; SSE-LABEL: allzeros_v16i16_sign:375; SSE: # %bb.0:376; SSE-NEXT: packsswb %xmm1, %xmm0377; SSE-NEXT: pmovmskb %xmm0, %eax378; SSE-NEXT: testl %eax, %eax379; SSE-NEXT: sete %al380; SSE-NEXT: retq381;382; AVX1-LABEL: allzeros_v16i16_sign:383; AVX1: # %bb.0:384; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1385; AVX1-NEXT: vpacksswb %xmm1, %xmm0, %xmm0386; AVX1-NEXT: vpmovmskb %xmm0, %eax387; AVX1-NEXT: testl %eax, %eax388; AVX1-NEXT: sete %al389; AVX1-NEXT: vzeroupper390; AVX1-NEXT: retq391;392; AVX2-LABEL: allzeros_v16i16_sign:393; AVX2: # %bb.0:394; AVX2-NEXT: vpmovmskb %ymm0, %eax395; AVX2-NEXT: testl $-1431655766, %eax # imm = 0xAAAAAAAA396; AVX2-NEXT: sete %al397; AVX2-NEXT: vzeroupper398; AVX2-NEXT: retq399;400; KNL-LABEL: allzeros_v16i16_sign:401; KNL: # %bb.0:402; KNL-NEXT: vpxor %xmm1, %xmm1, %xmm1403; KNL-NEXT: vpcmpgtw %ymm0, %ymm1, %ymm0404; KNL-NEXT: vpmovsxwd %ymm0, %zmm0405; KNL-NEXT: vptestmd %zmm0, %zmm0, %k0406; KNL-NEXT: kortestw %k0, %k0407; KNL-NEXT: sete %al408; KNL-NEXT: vzeroupper409; KNL-NEXT: retq410;411; SKX-LABEL: allzeros_v16i16_sign:412; SKX: # %bb.0:413; SKX-NEXT: vpmovw2m %ymm0, %k0414; SKX-NEXT: kortestw %k0, %k0415; SKX-NEXT: sete %al416; SKX-NEXT: vzeroupper417; SKX-NEXT: retq418 %tmp = icmp slt <16 x i16> %arg, zeroinitializer419 %tmp1 = bitcast <16 x i1> %tmp to i16420 %tmp2 = icmp eq i16 %tmp1, 0421 ret i1 %tmp2422}423 424define i1 @allones_v32i16_sign(<32 x i16> %arg) {425; SSE-LABEL: allones_v32i16_sign:426; SSE: # %bb.0:427; SSE-NEXT: packsswb %xmm1, %xmm0428; SSE-NEXT: packsswb %xmm3, %xmm2429; SSE-NEXT: pand %xmm0, %xmm2430; SSE-NEXT: pmovmskb %xmm2, %eax431; SSE-NEXT: cmpl $65535, %eax # imm = 0xFFFF432; SSE-NEXT: sete %al433; SSE-NEXT: retq434;435; AVX1-LABEL: allones_v32i16_sign:436; AVX1: # %bb.0:437; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2438; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3439; AVX1-NEXT: vpand %xmm2, %xmm3, %xmm2440; AVX1-NEXT: vpand %xmm0, %xmm1, %xmm0441; AVX1-NEXT: vpacksswb %xmm2, %xmm0, %xmm0442; AVX1-NEXT: vpmovmskb %xmm0, %eax443; AVX1-NEXT: cmpl $65535, %eax # imm = 0xFFFF444; AVX1-NEXT: sete %al445; AVX1-NEXT: vzeroupper446; AVX1-NEXT: retq447;448; AVX2-LABEL: allones_v32i16_sign:449; AVX2: # %bb.0:450; AVX2-NEXT: vpacksswb %ymm1, %ymm0, %ymm0451; AVX2-NEXT: vpmovmskb %ymm0, %eax452; AVX2-NEXT: cmpl $-1, %eax453; AVX2-NEXT: sete %al454; AVX2-NEXT: vzeroupper455; AVX2-NEXT: retq456;457; KNL-LABEL: allones_v32i16_sign:458; KNL: # %bb.0:459; KNL-NEXT: vpxor %xmm1, %xmm1, %xmm1460; KNL-NEXT: vpcmpgtw %ymm0, %ymm1, %ymm2461; KNL-NEXT: vpmovsxwd %ymm2, %zmm2462; KNL-NEXT: vptestmd %zmm2, %zmm2, %k0463; KNL-NEXT: kmovw %k0, %eax464; KNL-NEXT: vextracti64x4 $1, %zmm0, %ymm0465; KNL-NEXT: vpcmpgtw %ymm0, %ymm1, %ymm0466; KNL-NEXT: vpmovsxwd %ymm0, %zmm0467; KNL-NEXT: vptestmd %zmm0, %zmm0, %k0468; KNL-NEXT: kmovw %k0, %ecx469; KNL-NEXT: andl %eax, %ecx470; KNL-NEXT: cmpl $65535, %ecx # imm = 0xFFFF471; KNL-NEXT: sete %al472; KNL-NEXT: vzeroupper473; KNL-NEXT: retq474;475; SKX-LABEL: allones_v32i16_sign:476; SKX: # %bb.0:477; SKX-NEXT: vpmovw2m %zmm0, %k0478; SKX-NEXT: kortestd %k0, %k0479; SKX-NEXT: setb %al480; SKX-NEXT: vzeroupper481; SKX-NEXT: retq482 %tmp = icmp slt <32 x i16> %arg, zeroinitializer483 %tmp1 = bitcast <32 x i1> %tmp to i32484 %tmp2 = icmp eq i32 %tmp1, -1485 ret i1 %tmp2486}487 488define i1 @allzeros_v32i16_sign(<32 x i16> %arg) {489; SSE-LABEL: allzeros_v32i16_sign:490; SSE: # %bb.0:491; SSE-NEXT: packsswb %xmm3, %xmm2492; SSE-NEXT: packsswb %xmm1, %xmm0493; SSE-NEXT: por %xmm2, %xmm0494; SSE-NEXT: pmovmskb %xmm0, %eax495; SSE-NEXT: testl %eax, %eax496; SSE-NEXT: sete %al497; SSE-NEXT: retq498;499; AVX1-LABEL: allzeros_v32i16_sign:500; AVX1: # %bb.0:501; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2502; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3503; AVX1-NEXT: vpor %xmm2, %xmm3, %xmm2504; AVX1-NEXT: vpor %xmm1, %xmm0, %xmm0505; AVX1-NEXT: vpacksswb %xmm2, %xmm0, %xmm0506; AVX1-NEXT: vpmovmskb %xmm0, %eax507; AVX1-NEXT: testl %eax, %eax508; AVX1-NEXT: sete %al509; AVX1-NEXT: vzeroupper510; AVX1-NEXT: retq511;512; AVX2-LABEL: allzeros_v32i16_sign:513; AVX2: # %bb.0:514; AVX2-NEXT: vpacksswb %ymm1, %ymm0, %ymm0515; AVX2-NEXT: vpmovmskb %ymm0, %eax516; AVX2-NEXT: testl %eax, %eax517; AVX2-NEXT: sete %al518; AVX2-NEXT: vzeroupper519; AVX2-NEXT: retq520;521; KNL-LABEL: allzeros_v32i16_sign:522; KNL: # %bb.0:523; KNL-NEXT: vextracti64x4 $1, %zmm0, %ymm1524; KNL-NEXT: vpxor %xmm2, %xmm2, %xmm2525; KNL-NEXT: vpcmpgtw %ymm1, %ymm2, %ymm1526; KNL-NEXT: vpcmpgtw %ymm0, %ymm2, %ymm0527; KNL-NEXT: vpor %ymm1, %ymm0, %ymm0528; KNL-NEXT: vpmovsxwd %ymm0, %zmm0529; KNL-NEXT: vptestmd %zmm0, %zmm0, %k0530; KNL-NEXT: kortestw %k0, %k0531; KNL-NEXT: sete %al532; KNL-NEXT: vzeroupper533; KNL-NEXT: retq534;535; SKX-LABEL: allzeros_v32i16_sign:536; SKX: # %bb.0:537; SKX-NEXT: vpmovw2m %zmm0, %k0538; SKX-NEXT: kortestd %k0, %k0539; SKX-NEXT: sete %al540; SKX-NEXT: vzeroupper541; SKX-NEXT: retq542 %tmp = icmp slt <32 x i16> %arg, zeroinitializer543 %tmp1 = bitcast <32 x i1> %tmp to i32544 %tmp2 = icmp eq i32 %tmp1, 0545 ret i1 %tmp2546}547 548define i1 @allones_v4i32_sign(<4 x i32> %arg) {549; SSE-LABEL: allones_v4i32_sign:550; SSE: # %bb.0:551; SSE-NEXT: movmskps %xmm0, %eax552; SSE-NEXT: cmpl $15, %eax553; SSE-NEXT: sete %al554; SSE-NEXT: retq555;556; AVX-LABEL: allones_v4i32_sign:557; AVX: # %bb.0:558; AVX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1559; AVX-NEXT: vtestps %xmm1, %xmm0560; AVX-NEXT: setb %al561; AVX-NEXT: retq562 %tmp = icmp slt <4 x i32> %arg, zeroinitializer563 %tmp1 = bitcast <4 x i1> %tmp to i4564 %tmp2 = icmp eq i4 %tmp1, -1565 ret i1 %tmp2566}567 568define i1 @allzeros_v4i32_sign(<4 x i32> %arg) {569; SSE-LABEL: allzeros_v4i32_sign:570; SSE: # %bb.0:571; SSE-NEXT: movmskps %xmm0, %eax572; SSE-NEXT: testl %eax, %eax573; SSE-NEXT: sete %al574; SSE-NEXT: retq575;576; AVX-LABEL: allzeros_v4i32_sign:577; AVX: # %bb.0:578; AVX-NEXT: vtestps %xmm0, %xmm0579; AVX-NEXT: sete %al580; AVX-NEXT: retq581 %tmp = icmp slt <4 x i32> %arg, zeroinitializer582 %tmp1 = bitcast <4 x i1> %tmp to i4583 %tmp2 = icmp eq i4 %tmp1, 0584 ret i1 %tmp2585}586 587define i1 @allones_v8i32_sign(<8 x i32> %arg) {588; SSE-LABEL: allones_v8i32_sign:589; SSE: # %bb.0:590; SSE-NEXT: packssdw %xmm1, %xmm0591; SSE-NEXT: packsswb %xmm0, %xmm0592; SSE-NEXT: pmovmskb %xmm0, %eax593; SSE-NEXT: cmpb $-1, %al594; SSE-NEXT: sete %al595; SSE-NEXT: retq596;597; AVX1-LABEL: allones_v8i32_sign:598; AVX1: # %bb.0:599; AVX1-NEXT: vxorps %xmm1, %xmm1, %xmm1600; AVX1-NEXT: vcmptrueps %ymm1, %ymm1, %ymm1601; AVX1-NEXT: vtestps %ymm1, %ymm0602; AVX1-NEXT: setb %al603; AVX1-NEXT: vzeroupper604; AVX1-NEXT: retq605;606; AVX2-LABEL: allones_v8i32_sign:607; AVX2: # %bb.0:608; AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1609; AVX2-NEXT: vtestps %ymm1, %ymm0610; AVX2-NEXT: setb %al611; AVX2-NEXT: vzeroupper612; AVX2-NEXT: retq613;614; AVX512-LABEL: allones_v8i32_sign:615; AVX512: # %bb.0:616; AVX512-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1617; AVX512-NEXT: vtestps %ymm1, %ymm0618; AVX512-NEXT: setb %al619; AVX512-NEXT: vzeroupper620; AVX512-NEXT: retq621 %tmp = icmp slt <8 x i32> %arg, zeroinitializer622 %tmp1 = bitcast <8 x i1> %tmp to i8623 %tmp2 = icmp eq i8 %tmp1, -1624 ret i1 %tmp2625}626 627define i1 @allzeros_v8i32_sign(<8 x i32> %arg) {628; SSE-LABEL: allzeros_v8i32_sign:629; SSE: # %bb.0:630; SSE-NEXT: packssdw %xmm1, %xmm0631; SSE-NEXT: pmovmskb %xmm0, %eax632; SSE-NEXT: testl $43690, %eax # imm = 0xAAAA633; SSE-NEXT: sete %al634; SSE-NEXT: retq635;636; AVX-LABEL: allzeros_v8i32_sign:637; AVX: # %bb.0:638; AVX-NEXT: vtestps %ymm0, %ymm0639; AVX-NEXT: sete %al640; AVX-NEXT: vzeroupper641; AVX-NEXT: retq642 %tmp = icmp slt <8 x i32> %arg, zeroinitializer643 %tmp1 = bitcast <8 x i1> %tmp to i8644 %tmp2 = icmp eq i8 %tmp1, 0645 ret i1 %tmp2646}647 648define i1 @allones_v16i32_sign(<16 x i32> %arg) {649; SSE-LABEL: allones_v16i32_sign:650; SSE: # %bb.0:651; SSE-NEXT: packssdw %xmm3, %xmm2652; SSE-NEXT: packssdw %xmm1, %xmm0653; SSE-NEXT: packsswb %xmm2, %xmm0654; SSE-NEXT: pmovmskb %xmm0, %eax655; SSE-NEXT: cmpl $65535, %eax # imm = 0xFFFF656; SSE-NEXT: sete %al657; SSE-NEXT: retq658;659; AVX1-LABEL: allones_v16i32_sign:660; AVX1: # %bb.0:661; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2662; AVX1-NEXT: vpackssdw %xmm2, %xmm1, %xmm1663; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2664; AVX1-NEXT: vpackssdw %xmm2, %xmm0, %xmm0665; AVX1-NEXT: vpacksswb %xmm1, %xmm0, %xmm0666; AVX1-NEXT: vpmovmskb %xmm0, %eax667; AVX1-NEXT: cmpl $65535, %eax # imm = 0xFFFF668; AVX1-NEXT: sete %al669; AVX1-NEXT: vzeroupper670; AVX1-NEXT: retq671;672; AVX2-LABEL: allones_v16i32_sign:673; AVX2: # %bb.0:674; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2675; AVX2-NEXT: vpcmpgtd %ymm1, %ymm2, %ymm1676; AVX2-NEXT: vpcmpgtd %ymm0, %ymm2, %ymm0677; AVX2-NEXT: vpackssdw %ymm1, %ymm0, %ymm0678; AVX2-NEXT: vpmovmskb %ymm0, %eax679; AVX2-NEXT: cmpl $-1, %eax680; AVX2-NEXT: sete %al681; AVX2-NEXT: vzeroupper682; AVX2-NEXT: retq683;684; KNL-LABEL: allones_v16i32_sign:685; KNL: # %bb.0:686; KNL-NEXT: vpxor %xmm1, %xmm1, %xmm1687; KNL-NEXT: vpcmpgtd %zmm0, %zmm1, %k0688; KNL-NEXT: kortestw %k0, %k0689; KNL-NEXT: setb %al690; KNL-NEXT: vzeroupper691; KNL-NEXT: retq692;693; SKX-LABEL: allones_v16i32_sign:694; SKX: # %bb.0:695; SKX-NEXT: vpmovd2m %zmm0, %k0696; SKX-NEXT: kortestw %k0, %k0697; SKX-NEXT: setb %al698; SKX-NEXT: vzeroupper699; SKX-NEXT: retq700 %tmp = icmp slt <16 x i32> %arg, zeroinitializer701 %tmp1 = bitcast <16 x i1> %tmp to i16702 %tmp2 = icmp eq i16 %tmp1, -1703 ret i1 %tmp2704}705 706define i1 @allzeros_v16i32_sign(<16 x i32> %arg) {707; SSE-LABEL: allzeros_v16i32_sign:708; SSE: # %bb.0:709; SSE-NEXT: packssdw %xmm3, %xmm2710; SSE-NEXT: packssdw %xmm1, %xmm0711; SSE-NEXT: packsswb %xmm2, %xmm0712; SSE-NEXT: pmovmskb %xmm0, %eax713; SSE-NEXT: testl %eax, %eax714; SSE-NEXT: sete %al715; SSE-NEXT: retq716;717; AVX1-LABEL: allzeros_v16i32_sign:718; AVX1: # %bb.0:719; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2720; AVX1-NEXT: vpackssdw %xmm2, %xmm1, %xmm1721; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2722; AVX1-NEXT: vpackssdw %xmm2, %xmm0, %xmm0723; AVX1-NEXT: vpacksswb %xmm1, %xmm0, %xmm0724; AVX1-NEXT: vpmovmskb %xmm0, %eax725; AVX1-NEXT: testl %eax, %eax726; AVX1-NEXT: sete %al727; AVX1-NEXT: vzeroupper728; AVX1-NEXT: retq729;730; AVX2-LABEL: allzeros_v16i32_sign:731; AVX2: # %bb.0:732; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2733; AVX2-NEXT: vpcmpgtd %ymm1, %ymm2, %ymm1734; AVX2-NEXT: vpcmpgtd %ymm0, %ymm2, %ymm0735; AVX2-NEXT: vpackssdw %ymm1, %ymm0, %ymm0736; AVX2-NEXT: vpmovmskb %ymm0, %eax737; AVX2-NEXT: testl %eax, %eax738; AVX2-NEXT: sete %al739; AVX2-NEXT: vzeroupper740; AVX2-NEXT: retq741;742; KNL-LABEL: allzeros_v16i32_sign:743; KNL: # %bb.0:744; KNL-NEXT: vpxor %xmm1, %xmm1, %xmm1745; KNL-NEXT: vpcmpgtd %zmm0, %zmm1, %k0746; KNL-NEXT: kortestw %k0, %k0747; KNL-NEXT: sete %al748; KNL-NEXT: vzeroupper749; KNL-NEXT: retq750;751; SKX-LABEL: allzeros_v16i32_sign:752; SKX: # %bb.0:753; SKX-NEXT: vpmovd2m %zmm0, %k0754; SKX-NEXT: kortestw %k0, %k0755; SKX-NEXT: sete %al756; SKX-NEXT: vzeroupper757; SKX-NEXT: retq758 %tmp = icmp slt <16 x i32> %arg, zeroinitializer759 %tmp1 = bitcast <16 x i1> %tmp to i16760 %tmp2 = icmp eq i16 %tmp1, 0761 ret i1 %tmp2762}763 764define i1 @allones_v4i64_sign(<4 x i64> %arg) {765; SSE-LABEL: allones_v4i64_sign:766; SSE: # %bb.0:767; SSE-NEXT: shufps {{.*#+}} xmm0 = xmm0[1,3],xmm1[1,3]768; SSE-NEXT: movmskps %xmm0, %eax769; SSE-NEXT: cmpl $15, %eax770; SSE-NEXT: sete %al771; SSE-NEXT: retq772;773; AVX1-LABEL: allones_v4i64_sign:774; AVX1: # %bb.0:775; AVX1-NEXT: vxorps %xmm1, %xmm1, %xmm1776; AVX1-NEXT: vcmptrueps %ymm1, %ymm1, %ymm1777; AVX1-NEXT: vtestpd %ymm1, %ymm0778; AVX1-NEXT: setb %al779; AVX1-NEXT: vzeroupper780; AVX1-NEXT: retq781;782; AVX2-LABEL: allones_v4i64_sign:783; AVX2: # %bb.0:784; AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1785; AVX2-NEXT: vtestpd %ymm1, %ymm0786; AVX2-NEXT: setb %al787; AVX2-NEXT: vzeroupper788; AVX2-NEXT: retq789;790; AVX512-LABEL: allones_v4i64_sign:791; AVX512: # %bb.0:792; AVX512-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1793; AVX512-NEXT: vtestpd %ymm1, %ymm0794; AVX512-NEXT: setb %al795; AVX512-NEXT: vzeroupper796; AVX512-NEXT: retq797 %tmp = icmp slt <4 x i64> %arg, zeroinitializer798 %tmp1 = bitcast <4 x i1> %tmp to i4799 %tmp2 = icmp eq i4 %tmp1, -1800 ret i1 %tmp2801}802 803define i1 @allzeros_v4i64_sign(<4 x i64> %arg) {804; SSE-LABEL: allzeros_v4i64_sign:805; SSE: # %bb.0:806; SSE-NEXT: shufps {{.*#+}} xmm0 = xmm0[1,3],xmm1[1,3]807; SSE-NEXT: movmskps %xmm0, %eax808; SSE-NEXT: testl %eax, %eax809; SSE-NEXT: sete %al810; SSE-NEXT: retq811;812; AVX-LABEL: allzeros_v4i64_sign:813; AVX: # %bb.0:814; AVX-NEXT: vtestpd %ymm0, %ymm0815; AVX-NEXT: sete %al816; AVX-NEXT: vzeroupper817; AVX-NEXT: retq818 %tmp = icmp slt <4 x i64> %arg, zeroinitializer819 %tmp1 = bitcast <4 x i1> %tmp to i4820 %tmp2 = icmp eq i4 %tmp1, 0821 ret i1 %tmp2822}823 824define i1 @allones_v8i64_sign(<8 x i64> %arg) {825; SSE-LABEL: allones_v8i64_sign:826; SSE: # %bb.0:827; SSE-NEXT: packssdw %xmm3, %xmm2828; SSE-NEXT: packssdw %xmm1, %xmm0829; SSE-NEXT: packssdw %xmm2, %xmm0830; SSE-NEXT: packsswb %xmm0, %xmm0831; SSE-NEXT: pmovmskb %xmm0, %eax832; SSE-NEXT: cmpb $-1, %al833; SSE-NEXT: sete %al834; SSE-NEXT: retq835;836; AVX1-LABEL: allones_v8i64_sign:837; AVX1: # %bb.0:838; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2839; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3840; AVX1-NEXT: vpand %xmm2, %xmm3, %xmm2841; AVX1-NEXT: vpand %xmm1, %xmm0, %xmm0842; AVX1-NEXT: vpackssdw %xmm2, %xmm0, %xmm0843; AVX1-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1844; AVX1-NEXT: vtestps %xmm1, %xmm0845; AVX1-NEXT: setb %al846; AVX1-NEXT: vzeroupper847; AVX1-NEXT: retq848;849; AVX2-LABEL: allones_v8i64_sign:850; AVX2: # %bb.0:851; AVX2-NEXT: vpackssdw %ymm1, %ymm0, %ymm0852; AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1853; AVX2-NEXT: vtestps %ymm1, %ymm0854; AVX2-NEXT: setb %al855; AVX2-NEXT: vzeroupper856; AVX2-NEXT: retq857;858; KNL-LABEL: allones_v8i64_sign:859; KNL: # %bb.0:860; KNL-NEXT: vpxor %xmm1, %xmm1, %xmm1861; KNL-NEXT: vpcmpgtq %zmm0, %zmm1, %k0862; KNL-NEXT: kmovw %k0, %eax863; KNL-NEXT: cmpb $-1, %al864; KNL-NEXT: sete %al865; KNL-NEXT: vzeroupper866; KNL-NEXT: retq867;868; SKX-LABEL: allones_v8i64_sign:869; SKX: # %bb.0:870; SKX-NEXT: vpmovq2m %zmm0, %k0871; SKX-NEXT: kortestb %k0, %k0872; SKX-NEXT: setb %al873; SKX-NEXT: vzeroupper874; SKX-NEXT: retq875 %tmp = icmp slt <8 x i64> %arg, zeroinitializer876 %tmp1 = bitcast <8 x i1> %tmp to i8877 %tmp2 = icmp eq i8 %tmp1, -1878 ret i1 %tmp2879}880 881define i1 @allzeros_v8i64_sign(<8 x i64> %arg) {882; SSE-LABEL: allzeros_v8i64_sign:883; SSE: # %bb.0:884; SSE-NEXT: packssdw %xmm3, %xmm2885; SSE-NEXT: packssdw %xmm1, %xmm0886; SSE-NEXT: packssdw %xmm2, %xmm0887; SSE-NEXT: pmovmskb %xmm0, %eax888; SSE-NEXT: testl $43690, %eax # imm = 0xAAAA889; SSE-NEXT: sete %al890; SSE-NEXT: retq891;892; AVX1-LABEL: allzeros_v8i64_sign:893; AVX1: # %bb.0:894; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2895; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3896; AVX1-NEXT: vpor %xmm2, %xmm3, %xmm2897; AVX1-NEXT: vpor %xmm1, %xmm0, %xmm0898; AVX1-NEXT: vpackssdw %xmm2, %xmm0, %xmm0899; AVX1-NEXT: vtestps %xmm0, %xmm0900; AVX1-NEXT: sete %al901; AVX1-NEXT: vzeroupper902; AVX1-NEXT: retq903;904; AVX2-LABEL: allzeros_v8i64_sign:905; AVX2: # %bb.0:906; AVX2-NEXT: vpackssdw %ymm1, %ymm0, %ymm0907; AVX2-NEXT: vtestps %ymm0, %ymm0908; AVX2-NEXT: sete %al909; AVX2-NEXT: vzeroupper910; AVX2-NEXT: retq911;912; KNL-LABEL: allzeros_v8i64_sign:913; KNL: # %bb.0:914; KNL-NEXT: vpxor %xmm1, %xmm1, %xmm1915; KNL-NEXT: vpcmpgtq %zmm0, %zmm1, %k0916; KNL-NEXT: kmovw %k0, %eax917; KNL-NEXT: testb %al, %al918; KNL-NEXT: sete %al919; KNL-NEXT: vzeroupper920; KNL-NEXT: retq921;922; SKX-LABEL: allzeros_v8i64_sign:923; SKX: # %bb.0:924; SKX-NEXT: vpmovq2m %zmm0, %k0925; SKX-NEXT: kortestb %k0, %k0926; SKX-NEXT: sete %al927; SKX-NEXT: vzeroupper928; SKX-NEXT: retq929 %tmp = icmp slt <8 x i64> %arg, zeroinitializer930 %tmp1 = bitcast <8 x i1> %tmp to i8931 %tmp2 = icmp eq i8 %tmp1, 0932 ret i1 %tmp2933}934 935define i1 @allones_v16i8_and1(<16 x i8> %arg) {936; SSE-LABEL: allones_v16i8_and1:937; SSE: # %bb.0:938; SSE-NEXT: psllw $7, %xmm0939; SSE-NEXT: pmovmskb %xmm0, %eax940; SSE-NEXT: cmpl $65535, %eax # imm = 0xFFFF941; SSE-NEXT: sete %al942; SSE-NEXT: retq943;944; AVX1OR2-LABEL: allones_v16i8_and1:945; AVX1OR2: # %bb.0:946; AVX1OR2-NEXT: vpsllw $7, %xmm0, %xmm0947; AVX1OR2-NEXT: vpmovmskb %xmm0, %eax948; AVX1OR2-NEXT: cmpl $65535, %eax # imm = 0xFFFF949; AVX1OR2-NEXT: sete %al950; AVX1OR2-NEXT: retq951;952; KNL-LABEL: allones_v16i8_and1:953; KNL: # %bb.0:954; KNL-NEXT: vpsllw $7, %xmm0, %xmm0955; KNL-NEXT: vpmovmskb %xmm0, %eax956; KNL-NEXT: cmpl $65535, %eax # imm = 0xFFFF957; KNL-NEXT: sete %al958; KNL-NEXT: retq959;960; SKX-LABEL: allones_v16i8_and1:961; SKX: # %bb.0:962; SKX-NEXT: vptestmb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %k0963; SKX-NEXT: kortestw %k0, %k0964; SKX-NEXT: setb %al965; SKX-NEXT: retq966 %tmp = and <16 x i8> %arg, <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>967 %tmp1 = icmp ne <16 x i8> %tmp, zeroinitializer968 %tmp2 = bitcast <16 x i1> %tmp1 to i16969 %tmp3 = icmp eq i16 %tmp2, -1970 ret i1 %tmp3971}972 973define i1 @allzeros_v16i8_not(<16 x i8> %a0) {974; SSE2-LABEL: allzeros_v16i8_not:975; SSE2: # %bb.0:976; SSE2-NEXT: pxor %xmm1, %xmm1977; SSE2-NEXT: pcmpeqb %xmm0, %xmm1978; SSE2-NEXT: pmovmskb %xmm1, %eax979; SSE2-NEXT: xorl $65535, %eax # imm = 0xFFFF980; SSE2-NEXT: setne %al981; SSE2-NEXT: retq982;983; SSE41-LABEL: allzeros_v16i8_not:984; SSE41: # %bb.0:985; SSE41-NEXT: ptest %xmm0, %xmm0986; SSE41-NEXT: setne %al987; SSE41-NEXT: retq988;989; AVX-LABEL: allzeros_v16i8_not:990; AVX: # %bb.0:991; AVX-NEXT: vptest %xmm0, %xmm0992; AVX-NEXT: setne %al993; AVX-NEXT: retq994 %1 = icmp eq <16 x i8> %a0, zeroinitializer995 %2 = bitcast <16 x i1> %1 to i16996 %3 = icmp ne i16 %2, -1997 ret i1 %3998}999 1000define i1 @allzeros_v2i64_not(<2 x i64> %a0) {1001; SSE2-LABEL: allzeros_v2i64_not:1002; SSE2: # %bb.0:1003; SSE2-NEXT: pxor %xmm1, %xmm11004; SSE2-NEXT: pcmpeqd %xmm0, %xmm11005; SSE2-NEXT: movmskps %xmm1, %eax1006; SSE2-NEXT: xorl $15, %eax1007; SSE2-NEXT: setne %al1008; SSE2-NEXT: retq1009;1010; SSE41-LABEL: allzeros_v2i64_not:1011; SSE41: # %bb.0:1012; SSE41-NEXT: ptest %xmm0, %xmm01013; SSE41-NEXT: setne %al1014; SSE41-NEXT: retq1015;1016; AVX-LABEL: allzeros_v2i64_not:1017; AVX: # %bb.0:1018; AVX-NEXT: vptest %xmm0, %xmm01019; AVX-NEXT: setne %al1020; AVX-NEXT: retq1021 %1 = icmp eq <2 x i64> %a0, zeroinitializer1022 %2 = bitcast <2 x i1> %1 to i21023 %3 = icmp ne i2 %2, -11024 ret i1 %31025}1026 1027define i1 @allzeros_v8i32_not(<8 x i32> %a0) {1028; SSE2-LABEL: allzeros_v8i32_not:1029; SSE2: # %bb.0:1030; SSE2-NEXT: por %xmm1, %xmm01031; SSE2-NEXT: pxor %xmm1, %xmm11032; SSE2-NEXT: pcmpeqd %xmm0, %xmm11033; SSE2-NEXT: movmskps %xmm1, %eax1034; SSE2-NEXT: xorl $15, %eax1035; SSE2-NEXT: setne %al1036; SSE2-NEXT: retq1037;1038; SSE41-LABEL: allzeros_v8i32_not:1039; SSE41: # %bb.0:1040; SSE41-NEXT: por %xmm1, %xmm01041; SSE41-NEXT: ptest %xmm0, %xmm01042; SSE41-NEXT: setne %al1043; SSE41-NEXT: retq1044;1045; AVX-LABEL: allzeros_v8i32_not:1046; AVX: # %bb.0:1047; AVX-NEXT: vptest %ymm0, %ymm01048; AVX-NEXT: setne %al1049; AVX-NEXT: vzeroupper1050; AVX-NEXT: retq1051 %1 = icmp eq <8 x i32> %a0, zeroinitializer1052 %2 = bitcast <8 x i1> %1 to i81053 %3 = icmp ne i8 %2, -11054 ret i1 %31055}1056 1057define i1 @allzeros_v8i64_not(<8 x i64> %a0) {1058; SSE2-LABEL: allzeros_v8i64_not:1059; SSE2: # %bb.0:1060; SSE2-NEXT: por %xmm3, %xmm11061; SSE2-NEXT: por %xmm2, %xmm01062; SSE2-NEXT: por %xmm1, %xmm01063; SSE2-NEXT: pxor %xmm1, %xmm11064; SSE2-NEXT: pcmpeqd %xmm0, %xmm11065; SSE2-NEXT: movmskps %xmm1, %eax1066; SSE2-NEXT: xorl $15, %eax1067; SSE2-NEXT: setne %al1068; SSE2-NEXT: retq1069;1070; SSE41-LABEL: allzeros_v8i64_not:1071; SSE41: # %bb.0:1072; SSE41-NEXT: por %xmm3, %xmm11073; SSE41-NEXT: por %xmm2, %xmm01074; SSE41-NEXT: por %xmm1, %xmm01075; SSE41-NEXT: ptest %xmm0, %xmm01076; SSE41-NEXT: setne %al1077; SSE41-NEXT: retq1078;1079; AVX1-LABEL: allzeros_v8i64_not:1080; AVX1: # %bb.0:1081; AVX1-NEXT: vorps %ymm1, %ymm0, %ymm01082; AVX1-NEXT: vptest %ymm0, %ymm01083; AVX1-NEXT: setne %al1084; AVX1-NEXT: vzeroupper1085; AVX1-NEXT: retq1086;1087; AVX2-LABEL: allzeros_v8i64_not:1088; AVX2: # %bb.0:1089; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm01090; AVX2-NEXT: vptest %ymm0, %ymm01091; AVX2-NEXT: setne %al1092; AVX2-NEXT: vzeroupper1093; AVX2-NEXT: retq1094;1095; AVX512-LABEL: allzeros_v8i64_not:1096; AVX512: # %bb.0:1097; AVX512-NEXT: vptestmd %zmm0, %zmm0, %k01098; AVX512-NEXT: kortestw %k0, %k01099; AVX512-NEXT: setne %al1100; AVX512-NEXT: vzeroupper1101; AVX512-NEXT: retq1102 %1 = icmp eq <8 x i64> %a0, zeroinitializer1103 %2 = bitcast <8 x i1> %1 to i81104 %3 = icmp ne i8 %2, -11105 ret i1 %31106}1107 1108define i1 @allzeros_v16i8_and1(<16 x i8> %arg) {1109; SSE2-LABEL: allzeros_v16i8_and1:1110; SSE2: # %bb.0:1111; SSE2-NEXT: psllw $7, %xmm01112; SSE2-NEXT: pmovmskb %xmm0, %eax1113; SSE2-NEXT: testl %eax, %eax1114; SSE2-NEXT: sete %al1115; SSE2-NEXT: retq1116;1117; SSE41-LABEL: allzeros_v16i8_and1:1118; SSE41: # %bb.0:1119; SSE41-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01120; SSE41-NEXT: sete %al1121; SSE41-NEXT: retq1122;1123; AVX1OR2-LABEL: allzeros_v16i8_and1:1124; AVX1OR2: # %bb.0:1125; AVX1OR2-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01126; AVX1OR2-NEXT: sete %al1127; AVX1OR2-NEXT: retq1128;1129; KNL-LABEL: allzeros_v16i8_and1:1130; KNL: # %bb.0:1131; KNL-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01132; KNL-NEXT: sete %al1133; KNL-NEXT: retq1134;1135; SKX-LABEL: allzeros_v16i8_and1:1136; SKX: # %bb.0:1137; SKX-NEXT: vpbroadcastq {{.*#+}} xmm1 = [72340172838076673,72340172838076673]1138; SKX-NEXT: vptest %xmm1, %xmm01139; SKX-NEXT: sete %al1140; SKX-NEXT: retq1141 %tmp = and <16 x i8> %arg, <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>1142 %tmp1 = icmp ne <16 x i8> %tmp, zeroinitializer1143 %tmp2 = bitcast <16 x i1> %tmp1 to i161144 %tmp3 = icmp eq i16 %tmp2, 01145 ret i1 %tmp31146}1147 1148define i1 @allones_v32i8_and1(<32 x i8> %arg) {1149; SSE-LABEL: allones_v32i8_and1:1150; SSE: # %bb.0:1151; SSE-NEXT: pand %xmm1, %xmm01152; SSE-NEXT: psllw $7, %xmm01153; SSE-NEXT: pmovmskb %xmm0, %eax1154; SSE-NEXT: cmpl $65535, %eax # imm = 0xFFFF1155; SSE-NEXT: sete %al1156; SSE-NEXT: retq1157;1158; AVX1-LABEL: allones_v32i8_and1:1159; AVX1: # %bb.0:1160; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm11161; AVX1-NEXT: vpand %xmm0, %xmm1, %xmm01162; AVX1-NEXT: vpsllw $7, %xmm0, %xmm01163; AVX1-NEXT: vpmovmskb %xmm0, %eax1164; AVX1-NEXT: cmpl $65535, %eax # imm = 0xFFFF1165; AVX1-NEXT: sete %al1166; AVX1-NEXT: vzeroupper1167; AVX1-NEXT: retq1168;1169; AVX2-LABEL: allones_v32i8_and1:1170; AVX2: # %bb.0:1171; AVX2-NEXT: vpsllw $7, %ymm0, %ymm01172; AVX2-NEXT: vpmovmskb %ymm0, %eax1173; AVX2-NEXT: cmpl $-1, %eax1174; AVX2-NEXT: sete %al1175; AVX2-NEXT: vzeroupper1176; AVX2-NEXT: retq1177;1178; KNL-LABEL: allones_v32i8_and1:1179; KNL: # %bb.0:1180; KNL-NEXT: vpsllw $7, %ymm0, %ymm01181; KNL-NEXT: vpmovmskb %ymm0, %eax1182; KNL-NEXT: cmpl $-1, %eax1183; KNL-NEXT: sete %al1184; KNL-NEXT: vzeroupper1185; KNL-NEXT: retq1186;1187; SKX-LABEL: allones_v32i8_and1:1188; SKX: # %bb.0:1189; SKX-NEXT: vptestmb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %k01190; SKX-NEXT: kortestd %k0, %k01191; SKX-NEXT: setb %al1192; SKX-NEXT: vzeroupper1193; SKX-NEXT: retq1194 %tmp = and <32 x i8> %arg, <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>1195 %tmp1 = icmp ne <32 x i8> %tmp, zeroinitializer1196 %tmp2 = bitcast <32 x i1> %tmp1 to i321197 %tmp3 = icmp eq i32 %tmp2, -11198 ret i1 %tmp31199}1200 1201define i1 @allzeros_v32i8_and1(<32 x i8> %arg) {1202; SSE2-LABEL: allzeros_v32i8_and1:1203; SSE2: # %bb.0:1204; SSE2-NEXT: por %xmm1, %xmm01205; SSE2-NEXT: psllw $7, %xmm01206; SSE2-NEXT: pmovmskb %xmm0, %eax1207; SSE2-NEXT: testl %eax, %eax1208; SSE2-NEXT: sete %al1209; SSE2-NEXT: retq1210;1211; SSE41-LABEL: allzeros_v32i8_and1:1212; SSE41: # %bb.0:1213; SSE41-NEXT: por %xmm1, %xmm01214; SSE41-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01215; SSE41-NEXT: sete %al1216; SSE41-NEXT: retq1217;1218; AVX1-LABEL: allzeros_v32i8_and1:1219; AVX1: # %bb.0:1220; AVX1-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm01221; AVX1-NEXT: sete %al1222; AVX1-NEXT: vzeroupper1223; AVX1-NEXT: retq1224;1225; AVX2-LABEL: allzeros_v32i8_and1:1226; AVX2: # %bb.0:1227; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [72340172838076673,72340172838076673,72340172838076673,72340172838076673]1228; AVX2-NEXT: vptest %ymm1, %ymm01229; AVX2-NEXT: sete %al1230; AVX2-NEXT: vzeroupper1231; AVX2-NEXT: retq1232;1233; AVX512-LABEL: allzeros_v32i8_and1:1234; AVX512: # %bb.0:1235; AVX512-NEXT: vpbroadcastq {{.*#+}} ymm1 = [72340172838076673,72340172838076673,72340172838076673,72340172838076673]1236; AVX512-NEXT: vptest %ymm1, %ymm01237; AVX512-NEXT: sete %al1238; AVX512-NEXT: vzeroupper1239; AVX512-NEXT: retq1240 %tmp = and <32 x i8> %arg, <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>1241 %tmp1 = icmp ne <32 x i8> %tmp, zeroinitializer1242 %tmp2 = bitcast <32 x i1> %tmp1 to i321243 %tmp3 = icmp eq i32 %tmp2, 01244 ret i1 %tmp31245}1246 1247define i1 @allones_v64i8_and1(<64 x i8> %arg) {1248; SSE-LABEL: allones_v64i8_and1:1249; SSE: # %bb.0:1250; SSE-NEXT: pand %xmm2, %xmm01251; SSE-NEXT: pand %xmm3, %xmm11252; SSE-NEXT: pand %xmm0, %xmm11253; SSE-NEXT: psllw $7, %xmm11254; SSE-NEXT: pmovmskb %xmm1, %eax1255; SSE-NEXT: cmpl $65535, %eax # imm = 0xFFFF1256; SSE-NEXT: sete %al1257; SSE-NEXT: retq1258;1259; AVX1-LABEL: allones_v64i8_and1:1260; AVX1: # %bb.0:1261; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm21262; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm31263; AVX1-NEXT: vpand %xmm2, %xmm3, %xmm21264; AVX1-NEXT: vpand %xmm0, %xmm1, %xmm01265; AVX1-NEXT: vpand %xmm0, %xmm2, %xmm01266; AVX1-NEXT: vpsllw $7, %xmm0, %xmm01267; AVX1-NEXT: vpmovmskb %xmm0, %eax1268; AVX1-NEXT: cmpl $65535, %eax # imm = 0xFFFF1269; AVX1-NEXT: sete %al1270; AVX1-NEXT: vzeroupper1271; AVX1-NEXT: retq1272;1273; AVX2-LABEL: allones_v64i8_and1:1274; AVX2: # %bb.0:1275; AVX2-NEXT: vpand %ymm0, %ymm1, %ymm01276; AVX2-NEXT: vpsllw $7, %ymm0, %ymm01277; AVX2-NEXT: vpmovmskb %ymm0, %eax1278; AVX2-NEXT: cmpl $-1, %eax1279; AVX2-NEXT: sete %al1280; AVX2-NEXT: vzeroupper1281; AVX2-NEXT: retq1282;1283; KNL-LABEL: allones_v64i8_and1:1284; KNL: # %bb.0:1285; KNL-NEXT: vextracti64x4 $1, %zmm0, %ymm11286; KNL-NEXT: vpand %ymm0, %ymm1, %ymm01287; KNL-NEXT: vpsllw $7, %ymm0, %ymm01288; KNL-NEXT: vpmovmskb %ymm0, %eax1289; KNL-NEXT: cmpl $-1, %eax1290; KNL-NEXT: sete %al1291; KNL-NEXT: vzeroupper1292; KNL-NEXT: retq1293;1294; SKX-LABEL: allones_v64i8_and1:1295; SKX: # %bb.0:1296; SKX-NEXT: vptestmb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %k01297; SKX-NEXT: kortestq %k0, %k01298; SKX-NEXT: setb %al1299; SKX-NEXT: vzeroupper1300; SKX-NEXT: retq1301 %tmp = and <64 x i8> %arg, <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>1302 %tmp1 = icmp ne <64 x i8> %tmp, zeroinitializer1303 %tmp2 = bitcast <64 x i1> %tmp1 to i641304 %tmp3 = icmp eq i64 %tmp2, -11305 ret i1 %tmp31306}1307 1308define i1 @allzeros_v64i8_and1(<64 x i8> %arg) {1309; SSE2-LABEL: allzeros_v64i8_and1:1310; SSE2: # %bb.0:1311; SSE2-NEXT: por %xmm3, %xmm11312; SSE2-NEXT: por %xmm2, %xmm01313; SSE2-NEXT: por %xmm1, %xmm01314; SSE2-NEXT: psllw $7, %xmm01315; SSE2-NEXT: pmovmskb %xmm0, %eax1316; SSE2-NEXT: testl %eax, %eax1317; SSE2-NEXT: sete %al1318; SSE2-NEXT: retq1319;1320; SSE41-LABEL: allzeros_v64i8_and1:1321; SSE41: # %bb.0:1322; SSE41-NEXT: por %xmm3, %xmm11323; SSE41-NEXT: por %xmm2, %xmm01324; SSE41-NEXT: por %xmm1, %xmm01325; SSE41-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01326; SSE41-NEXT: sete %al1327; SSE41-NEXT: retq1328;1329; AVX1-LABEL: allzeros_v64i8_and1:1330; AVX1: # %bb.0:1331; AVX1-NEXT: vorps %ymm1, %ymm0, %ymm01332; AVX1-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm01333; AVX1-NEXT: sete %al1334; AVX1-NEXT: vzeroupper1335; AVX1-NEXT: retq1336;1337; AVX2-LABEL: allzeros_v64i8_and1:1338; AVX2: # %bb.0:1339; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm01340; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [72340172838076673,72340172838076673,72340172838076673,72340172838076673]1341; AVX2-NEXT: vptest %ymm1, %ymm01342; AVX2-NEXT: sete %al1343; AVX2-NEXT: vzeroupper1344; AVX2-NEXT: retq1345;1346; AVX512-LABEL: allzeros_v64i8_and1:1347; AVX512: # %bb.0:1348; AVX512-NEXT: vptestmd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm0, %k01349; AVX512-NEXT: kortestw %k0, %k01350; AVX512-NEXT: sete %al1351; AVX512-NEXT: vzeroupper1352; AVX512-NEXT: retq1353 %tmp = and <64 x i8> %arg, <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>1354 %tmp1 = icmp ne <64 x i8> %tmp, zeroinitializer1355 %tmp2 = bitcast <64 x i1> %tmp1 to i641356 %tmp3 = icmp eq i64 %tmp2, 01357 ret i1 %tmp31358}1359 1360define i1 @allones_v8i16_and1(<8 x i16> %arg) {1361; SSE-LABEL: allones_v8i16_and1:1362; SSE: # %bb.0:1363; SSE-NEXT: psllw $15, %xmm01364; SSE-NEXT: packsswb %xmm0, %xmm01365; SSE-NEXT: pmovmskb %xmm0, %eax1366; SSE-NEXT: cmpb $-1, %al1367; SSE-NEXT: sete %al1368; SSE-NEXT: retq1369;1370; AVX1OR2-LABEL: allones_v8i16_and1:1371; AVX1OR2: # %bb.0:1372; AVX1OR2-NEXT: vpsllw $15, %xmm0, %xmm01373; AVX1OR2-NEXT: vpacksswb %xmm0, %xmm0, %xmm01374; AVX1OR2-NEXT: vpmovmskb %xmm0, %eax1375; AVX1OR2-NEXT: cmpb $-1, %al1376; AVX1OR2-NEXT: sete %al1377; AVX1OR2-NEXT: retq1378;1379; KNL-LABEL: allones_v8i16_and1:1380; KNL: # %bb.0:1381; KNL-NEXT: vpsllw $15, %xmm0, %xmm01382; KNL-NEXT: vpsraw $15, %xmm0, %xmm01383; KNL-NEXT: vpmovsxwq %xmm0, %zmm01384; KNL-NEXT: vptestmq %zmm0, %zmm0, %k01385; KNL-NEXT: kmovw %k0, %eax1386; KNL-NEXT: cmpb $-1, %al1387; KNL-NEXT: sete %al1388; KNL-NEXT: vzeroupper1389; KNL-NEXT: retq1390;1391; SKX-LABEL: allones_v8i16_and1:1392; SKX: # %bb.0:1393; SKX-NEXT: vptestmw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %k01394; SKX-NEXT: kortestb %k0, %k01395; SKX-NEXT: setb %al1396; SKX-NEXT: retq1397 %tmp = and <8 x i16> %arg, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>1398 %tmp1 = icmp ne <8 x i16> %tmp, zeroinitializer1399 %tmp2 = bitcast <8 x i1> %tmp1 to i81400 %tmp3 = icmp eq i8 %tmp2, -11401 ret i1 %tmp31402}1403 1404define i1 @allzeros_v8i16_and1(<8 x i16> %arg) {1405; SSE2-LABEL: allzeros_v8i16_and1:1406; SSE2: # %bb.0:1407; SSE2-NEXT: psllw $7, %xmm01408; SSE2-NEXT: pmovmskb %xmm0, %eax1409; SSE2-NEXT: testl $21845, %eax # imm = 0x55551410; SSE2-NEXT: sete %al1411; SSE2-NEXT: retq1412;1413; SSE41-LABEL: allzeros_v8i16_and1:1414; SSE41: # %bb.0:1415; SSE41-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01416; SSE41-NEXT: sete %al1417; SSE41-NEXT: retq1418;1419; AVX1OR2-LABEL: allzeros_v8i16_and1:1420; AVX1OR2: # %bb.0:1421; AVX1OR2-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01422; AVX1OR2-NEXT: sete %al1423; AVX1OR2-NEXT: retq1424;1425; KNL-LABEL: allzeros_v8i16_and1:1426; KNL: # %bb.0:1427; KNL-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01428; KNL-NEXT: sete %al1429; KNL-NEXT: retq1430;1431; SKX-LABEL: allzeros_v8i16_and1:1432; SKX: # %bb.0:1433; SKX-NEXT: vpbroadcastq {{.*#+}} xmm1 = [281479271743489,281479271743489]1434; SKX-NEXT: vptest %xmm1, %xmm01435; SKX-NEXT: sete %al1436; SKX-NEXT: retq1437 %tmp = and <8 x i16> %arg, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>1438 %tmp1 = icmp ne <8 x i16> %tmp, zeroinitializer1439 %tmp2 = bitcast <8 x i1> %tmp1 to i81440 %tmp3 = icmp eq i8 %tmp2, 01441 ret i1 %tmp31442}1443 1444define i1 @allones_v16i16_and1(<16 x i16> %arg) {1445; SSE-LABEL: allones_v16i16_and1:1446; SSE: # %bb.0:1447; SSE-NEXT: psllw $15, %xmm11448; SSE-NEXT: psllw $15, %xmm01449; SSE-NEXT: packsswb %xmm1, %xmm01450; SSE-NEXT: pmovmskb %xmm0, %eax1451; SSE-NEXT: cmpl $65535, %eax # imm = 0xFFFF1452; SSE-NEXT: sete %al1453; SSE-NEXT: retq1454;1455; AVX1-LABEL: allones_v16i16_and1:1456; AVX1: # %bb.0:1457; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm11458; AVX1-NEXT: vpsllw $15, %xmm1, %xmm11459; AVX1-NEXT: vpsllw $15, %xmm0, %xmm01460; AVX1-NEXT: vpacksswb %xmm1, %xmm0, %xmm01461; AVX1-NEXT: vpmovmskb %xmm0, %eax1462; AVX1-NEXT: cmpl $65535, %eax # imm = 0xFFFF1463; AVX1-NEXT: sete %al1464; AVX1-NEXT: vzeroupper1465; AVX1-NEXT: retq1466;1467; AVX2-LABEL: allones_v16i16_and1:1468; AVX2: # %bb.0:1469; AVX2-NEXT: vpsllw $15, %ymm0, %ymm01470; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm11471; AVX2-NEXT: vpacksswb %xmm1, %xmm0, %xmm01472; AVX2-NEXT: vpmovmskb %xmm0, %eax1473; AVX2-NEXT: cmpl $65535, %eax # imm = 0xFFFF1474; AVX2-NEXT: sete %al1475; AVX2-NEXT: vzeroupper1476; AVX2-NEXT: retq1477;1478; KNL-LABEL: allones_v16i16_and1:1479; KNL: # %bb.0:1480; KNL-NEXT: vpsllw $15, %ymm0, %ymm01481; KNL-NEXT: vpsraw $15, %ymm0, %ymm01482; KNL-NEXT: vpmovsxwd %ymm0, %zmm01483; KNL-NEXT: vptestmd %zmm0, %zmm0, %k01484; KNL-NEXT: kortestw %k0, %k01485; KNL-NEXT: setb %al1486; KNL-NEXT: vzeroupper1487; KNL-NEXT: retq1488;1489; SKX-LABEL: allones_v16i16_and1:1490; SKX: # %bb.0:1491; SKX-NEXT: vptestmw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %k01492; SKX-NEXT: kortestw %k0, %k01493; SKX-NEXT: setb %al1494; SKX-NEXT: vzeroupper1495; SKX-NEXT: retq1496 %tmp = and <16 x i16> %arg, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>1497 %tmp1 = icmp ne <16 x i16> %tmp, zeroinitializer1498 %tmp2 = bitcast <16 x i1> %tmp1 to i161499 %tmp3 = icmp eq i16 %tmp2, -11500 ret i1 %tmp31501}1502 1503define i1 @allones_v32i16_and1(<32 x i16> %arg) {1504; SSE-LABEL: allones_v32i16_and1:1505; SSE: # %bb.0:1506; SSE-NEXT: pand %xmm3, %xmm11507; SSE-NEXT: psllw $15, %xmm11508; SSE-NEXT: pand %xmm2, %xmm01509; SSE-NEXT: psllw $15, %xmm01510; SSE-NEXT: packsswb %xmm1, %xmm01511; SSE-NEXT: pmovmskb %xmm0, %eax1512; SSE-NEXT: cmpl $65535, %eax # imm = 0xFFFF1513; SSE-NEXT: sete %al1514; SSE-NEXT: retq1515;1516; AVX1-LABEL: allones_v32i16_and1:1517; AVX1: # %bb.0:1518; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm21519; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm31520; AVX1-NEXT: vpand %xmm2, %xmm3, %xmm21521; AVX1-NEXT: vpsllw $15, %xmm2, %xmm21522; AVX1-NEXT: vpand %xmm0, %xmm1, %xmm01523; AVX1-NEXT: vpsllw $15, %xmm0, %xmm01524; AVX1-NEXT: vpacksswb %xmm2, %xmm0, %xmm01525; AVX1-NEXT: vpmovmskb %xmm0, %eax1526; AVX1-NEXT: cmpl $65535, %eax # imm = 0xFFFF1527; AVX1-NEXT: sete %al1528; AVX1-NEXT: vzeroupper1529; AVX1-NEXT: retq1530;1531; AVX2-LABEL: allones_v32i16_and1:1532; AVX2: # %bb.0:1533; AVX2-NEXT: vpsllw $15, %ymm1, %ymm11534; AVX2-NEXT: vpsllw $15, %ymm0, %ymm01535; AVX2-NEXT: vpacksswb %ymm1, %ymm0, %ymm01536; AVX2-NEXT: vpmovmskb %ymm0, %eax1537; AVX2-NEXT: cmpl $-1, %eax1538; AVX2-NEXT: sete %al1539; AVX2-NEXT: vzeroupper1540; AVX2-NEXT: retq1541;1542; KNL-LABEL: allones_v32i16_and1:1543; KNL: # %bb.0:1544; KNL-NEXT: vpsllw $15, %ymm0, %ymm11545; KNL-NEXT: vpsraw $15, %ymm1, %ymm11546; KNL-NEXT: vpmovsxwd %ymm1, %zmm11547; KNL-NEXT: vptestmd %zmm1, %zmm1, %k01548; KNL-NEXT: kmovw %k0, %eax1549; KNL-NEXT: vextracti64x4 $1, %zmm0, %ymm01550; KNL-NEXT: vpsllw $15, %ymm0, %ymm01551; KNL-NEXT: vpsraw $15, %ymm0, %ymm01552; KNL-NEXT: vpmovsxwd %ymm0, %zmm01553; KNL-NEXT: vptestmd %zmm0, %zmm0, %k01554; KNL-NEXT: kmovw %k0, %ecx1555; KNL-NEXT: andl %eax, %ecx1556; KNL-NEXT: cmpl $65535, %ecx # imm = 0xFFFF1557; KNL-NEXT: sete %al1558; KNL-NEXT: vzeroupper1559; KNL-NEXT: retq1560;1561; SKX-LABEL: allones_v32i16_and1:1562; SKX: # %bb.0:1563; SKX-NEXT: vptestmw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %k01564; SKX-NEXT: kortestd %k0, %k01565; SKX-NEXT: setb %al1566; SKX-NEXT: vzeroupper1567; SKX-NEXT: retq1568 %tmp = and <32 x i16> %arg, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>1569 %tmp1 = icmp ne <32 x i16> %tmp, zeroinitializer1570 %tmp2 = bitcast <32 x i1> %tmp1 to i321571 %tmp3 = icmp eq i32 %tmp2, -11572 ret i1 %tmp31573}1574 1575define i1 @allzeros_v32i16_and1(<32 x i16> %arg) {1576; SSE2-LABEL: allzeros_v32i16_and1:1577; SSE2: # %bb.0:1578; SSE2-NEXT: por %xmm3, %xmm11579; SSE2-NEXT: por %xmm2, %xmm01580; SSE2-NEXT: por %xmm1, %xmm01581; SSE2-NEXT: psllw $7, %xmm01582; SSE2-NEXT: pmovmskb %xmm0, %eax1583; SSE2-NEXT: testl $21845, %eax # imm = 0x55551584; SSE2-NEXT: sete %al1585; SSE2-NEXT: retq1586;1587; SSE41-LABEL: allzeros_v32i16_and1:1588; SSE41: # %bb.0:1589; SSE41-NEXT: por %xmm3, %xmm11590; SSE41-NEXT: por %xmm2, %xmm01591; SSE41-NEXT: por %xmm1, %xmm01592; SSE41-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01593; SSE41-NEXT: sete %al1594; SSE41-NEXT: retq1595;1596; AVX1-LABEL: allzeros_v32i16_and1:1597; AVX1: # %bb.0:1598; AVX1-NEXT: vorps %ymm1, %ymm0, %ymm01599; AVX1-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm01600; AVX1-NEXT: sete %al1601; AVX1-NEXT: vzeroupper1602; AVX1-NEXT: retq1603;1604; AVX2-LABEL: allzeros_v32i16_and1:1605; AVX2: # %bb.0:1606; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm01607; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [281479271743489,281479271743489,281479271743489,281479271743489]1608; AVX2-NEXT: vptest %ymm1, %ymm01609; AVX2-NEXT: sete %al1610; AVX2-NEXT: vzeroupper1611; AVX2-NEXT: retq1612;1613; AVX512-LABEL: allzeros_v32i16_and1:1614; AVX512: # %bb.0:1615; AVX512-NEXT: vptestmd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm0, %k01616; AVX512-NEXT: kortestw %k0, %k01617; AVX512-NEXT: sete %al1618; AVX512-NEXT: vzeroupper1619; AVX512-NEXT: retq1620 %tmp = and <32 x i16> %arg, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>1621 %tmp1 = icmp ne <32 x i16> %tmp, zeroinitializer1622 %tmp2 = bitcast <32 x i1> %tmp1 to i321623 %tmp3 = icmp eq i32 %tmp2, 01624 ret i1 %tmp31625}1626 1627define i1 @allzeros_v16i16_and1(<16 x i16> %arg) {1628; SSE2-LABEL: allzeros_v16i16_and1:1629; SSE2: # %bb.0:1630; SSE2-NEXT: por %xmm1, %xmm01631; SSE2-NEXT: psllw $7, %xmm01632; SSE2-NEXT: pmovmskb %xmm0, %eax1633; SSE2-NEXT: testl $21845, %eax # imm = 0x55551634; SSE2-NEXT: sete %al1635; SSE2-NEXT: retq1636;1637; SSE41-LABEL: allzeros_v16i16_and1:1638; SSE41: # %bb.0:1639; SSE41-NEXT: por %xmm1, %xmm01640; SSE41-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01641; SSE41-NEXT: sete %al1642; SSE41-NEXT: retq1643;1644; AVX1-LABEL: allzeros_v16i16_and1:1645; AVX1: # %bb.0:1646; AVX1-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm01647; AVX1-NEXT: sete %al1648; AVX1-NEXT: vzeroupper1649; AVX1-NEXT: retq1650;1651; AVX2-LABEL: allzeros_v16i16_and1:1652; AVX2: # %bb.0:1653; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [281479271743489,281479271743489,281479271743489,281479271743489]1654; AVX2-NEXT: vptest %ymm1, %ymm01655; AVX2-NEXT: sete %al1656; AVX2-NEXT: vzeroupper1657; AVX2-NEXT: retq1658;1659; AVX512-LABEL: allzeros_v16i16_and1:1660; AVX512: # %bb.0:1661; AVX512-NEXT: vpbroadcastq {{.*#+}} ymm1 = [281479271743489,281479271743489,281479271743489,281479271743489]1662; AVX512-NEXT: vptest %ymm1, %ymm01663; AVX512-NEXT: sete %al1664; AVX512-NEXT: vzeroupper1665; AVX512-NEXT: retq1666 %tmp = and <16 x i16> %arg, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>1667 %tmp1 = icmp ne <16 x i16> %tmp, zeroinitializer1668 %tmp2 = bitcast <16 x i1> %tmp1 to i161669 %tmp3 = icmp eq i16 %tmp2, 01670 ret i1 %tmp31671}1672 1673define i1 @allones_v4i32_and1(<4 x i32> %arg) {1674; SSE-LABEL: allones_v4i32_and1:1675; SSE: # %bb.0:1676; SSE-NEXT: pslld $31, %xmm01677; SSE-NEXT: movmskps %xmm0, %eax1678; SSE-NEXT: cmpl $15, %eax1679; SSE-NEXT: sete %al1680; SSE-NEXT: retq1681;1682; AVX1OR2-LABEL: allones_v4i32_and1:1683; AVX1OR2: # %bb.0:1684; AVX1OR2-NEXT: vpslld $31, %xmm0, %xmm01685; AVX1OR2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm11686; AVX1OR2-NEXT: vtestps %xmm1, %xmm01687; AVX1OR2-NEXT: setb %al1688; AVX1OR2-NEXT: retq1689;1690; KNL-LABEL: allones_v4i32_and1:1691; KNL: # %bb.0:1692; KNL-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm01693; KNL-NEXT: vptestnmd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm0, %k01694; KNL-NEXT: kmovw %k0, %eax1695; KNL-NEXT: testb $15, %al1696; KNL-NEXT: sete %al1697; KNL-NEXT: vzeroupper1698; KNL-NEXT: retq1699;1700; SKX-LABEL: allones_v4i32_and1:1701; SKX: # %bb.0:1702; SKX-NEXT: vptestmd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %k01703; SKX-NEXT: kmovd %k0, %eax1704; SKX-NEXT: cmpb $15, %al1705; SKX-NEXT: sete %al1706; SKX-NEXT: retq1707 %tmp = and <4 x i32> %arg, <i32 1, i32 1, i32 1, i32 1>1708 %tmp1 = icmp ne <4 x i32> %tmp, zeroinitializer1709 %tmp2 = bitcast <4 x i1> %tmp1 to i41710 %tmp3 = icmp eq i4 %tmp2, -11711 ret i1 %tmp31712}1713 1714define i1 @allzeros_v4i32_and1(<4 x i32> %arg) {1715; SSE2-LABEL: allzeros_v4i32_and1:1716; SSE2: # %bb.0:1717; SSE2-NEXT: pslld $31, %xmm01718; SSE2-NEXT: movmskps %xmm0, %eax1719; SSE2-NEXT: testl %eax, %eax1720; SSE2-NEXT: sete %al1721; SSE2-NEXT: retq1722;1723; SSE41-LABEL: allzeros_v4i32_and1:1724; SSE41: # %bb.0:1725; SSE41-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01726; SSE41-NEXT: sete %al1727; SSE41-NEXT: retq1728;1729; AVX1OR2-LABEL: allzeros_v4i32_and1:1730; AVX1OR2: # %bb.0:1731; AVX1OR2-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01732; AVX1OR2-NEXT: sete %al1733; AVX1OR2-NEXT: retq1734;1735; KNL-LABEL: allzeros_v4i32_and1:1736; KNL: # %bb.0:1737; KNL-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01738; KNL-NEXT: sete %al1739; KNL-NEXT: retq1740;1741; SKX-LABEL: allzeros_v4i32_and1:1742; SKX: # %bb.0:1743; SKX-NEXT: vpbroadcastq {{.*#+}} xmm1 = [4294967297,4294967297]1744; SKX-NEXT: vptest %xmm1, %xmm01745; SKX-NEXT: sete %al1746; SKX-NEXT: retq1747 %tmp = and <4 x i32> %arg, <i32 1, i32 1, i32 1, i32 1>1748 %tmp1 = icmp ne <4 x i32> %tmp, zeroinitializer1749 %tmp2 = bitcast <4 x i1> %tmp1 to i41750 %tmp3 = icmp eq i4 %tmp2, 01751 ret i1 %tmp31752}1753 1754define i1 @allones_v8i32_and1(<8 x i32> %arg) {1755; SSE-LABEL: allones_v8i32_and1:1756; SSE: # %bb.0:1757; SSE-NEXT: pslld $31, %xmm11758; SSE-NEXT: pslld $31, %xmm01759; SSE-NEXT: packssdw %xmm1, %xmm01760; SSE-NEXT: packsswb %xmm0, %xmm01761; SSE-NEXT: pmovmskb %xmm0, %eax1762; SSE-NEXT: cmpb $-1, %al1763; SSE-NEXT: sete %al1764; SSE-NEXT: retq1765;1766; AVX1-LABEL: allones_v8i32_and1:1767; AVX1: # %bb.0:1768; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm11769; AVX1-NEXT: vpand %xmm1, %xmm0, %xmm01770; AVX1-NEXT: vpslld $31, %xmm0, %xmm01771; AVX1-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm11772; AVX1-NEXT: vtestps %xmm1, %xmm01773; AVX1-NEXT: setb %al1774; AVX1-NEXT: vzeroupper1775; AVX1-NEXT: retq1776;1777; AVX2-LABEL: allones_v8i32_and1:1778; AVX2: # %bb.0:1779; AVX2-NEXT: vpslld $31, %ymm0, %ymm01780; AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm11781; AVX2-NEXT: vtestps %ymm1, %ymm01782; AVX2-NEXT: setb %al1783; AVX2-NEXT: vzeroupper1784; AVX2-NEXT: retq1785;1786; KNL-LABEL: allones_v8i32_and1:1787; KNL: # %bb.0:1788; KNL-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm01789; KNL-NEXT: vptestmd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm0, %k01790; KNL-NEXT: kmovw %k0, %eax1791; KNL-NEXT: cmpb $-1, %al1792; KNL-NEXT: sete %al1793; KNL-NEXT: vzeroupper1794; KNL-NEXT: retq1795;1796; SKX-LABEL: allones_v8i32_and1:1797; SKX: # %bb.0:1798; SKX-NEXT: vptestmd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm0, %k01799; SKX-NEXT: kortestb %k0, %k01800; SKX-NEXT: setb %al1801; SKX-NEXT: vzeroupper1802; SKX-NEXT: retq1803 %tmp = and <8 x i32> %arg, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>1804 %tmp1 = icmp ne <8 x i32> %tmp, zeroinitializer1805 %tmp2 = bitcast <8 x i1> %tmp1 to i81806 %tmp3 = icmp eq i8 %tmp2, -11807 ret i1 %tmp31808}1809 1810define i1 @allzeros_v8i32_and1(<8 x i32> %arg) {1811; SSE2-LABEL: allzeros_v8i32_and1:1812; SSE2: # %bb.0:1813; SSE2-NEXT: por %xmm1, %xmm01814; SSE2-NEXT: pslld $31, %xmm01815; SSE2-NEXT: movmskps %xmm0, %eax1816; SSE2-NEXT: testl %eax, %eax1817; SSE2-NEXT: sete %al1818; SSE2-NEXT: retq1819;1820; SSE41-LABEL: allzeros_v8i32_and1:1821; SSE41: # %bb.0:1822; SSE41-NEXT: por %xmm1, %xmm01823; SSE41-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01824; SSE41-NEXT: sete %al1825; SSE41-NEXT: retq1826;1827; AVX1-LABEL: allzeros_v8i32_and1:1828; AVX1: # %bb.0:1829; AVX1-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm01830; AVX1-NEXT: sete %al1831; AVX1-NEXT: vzeroupper1832; AVX1-NEXT: retq1833;1834; AVX2-LABEL: allzeros_v8i32_and1:1835; AVX2: # %bb.0:1836; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [4294967297,4294967297,4294967297,4294967297]1837; AVX2-NEXT: vptest %ymm1, %ymm01838; AVX2-NEXT: sete %al1839; AVX2-NEXT: vzeroupper1840; AVX2-NEXT: retq1841;1842; AVX512-LABEL: allzeros_v8i32_and1:1843; AVX512: # %bb.0:1844; AVX512-NEXT: vpbroadcastq {{.*#+}} ymm1 = [4294967297,4294967297,4294967297,4294967297]1845; AVX512-NEXT: vptest %ymm1, %ymm01846; AVX512-NEXT: sete %al1847; AVX512-NEXT: vzeroupper1848; AVX512-NEXT: retq1849 %tmp = and <8 x i32> %arg, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>1850 %tmp1 = icmp ne <8 x i32> %tmp, zeroinitializer1851 %tmp2 = bitcast <8 x i1> %tmp1 to i81852 %tmp3 = icmp eq i8 %tmp2, 01853 ret i1 %tmp31854}1855 1856define i1 @allones_v16i32_and1(<16 x i32> %arg) {1857; SSE-LABEL: allones_v16i32_and1:1858; SSE: # %bb.0:1859; SSE-NEXT: pslld $31, %xmm31860; SSE-NEXT: pslld $31, %xmm21861; SSE-NEXT: packssdw %xmm3, %xmm21862; SSE-NEXT: pslld $31, %xmm11863; SSE-NEXT: pslld $31, %xmm01864; SSE-NEXT: packssdw %xmm1, %xmm01865; SSE-NEXT: packsswb %xmm2, %xmm01866; SSE-NEXT: pmovmskb %xmm0, %eax1867; SSE-NEXT: cmpl $65535, %eax # imm = 0xFFFF1868; SSE-NEXT: sete %al1869; SSE-NEXT: retq1870;1871; AVX1-LABEL: allones_v16i32_and1:1872; AVX1: # %bb.0:1873; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm21874; AVX1-NEXT: vpslld $31, %xmm2, %xmm21875; AVX1-NEXT: vpslld $31, %xmm1, %xmm11876; AVX1-NEXT: vpackssdw %xmm2, %xmm1, %xmm11877; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm21878; AVX1-NEXT: vpslld $31, %xmm2, %xmm21879; AVX1-NEXT: vpslld $31, %xmm0, %xmm01880; AVX1-NEXT: vpackssdw %xmm2, %xmm0, %xmm01881; AVX1-NEXT: vpacksswb %xmm1, %xmm0, %xmm01882; AVX1-NEXT: vpmovmskb %xmm0, %eax1883; AVX1-NEXT: cmpl $65535, %eax # imm = 0xFFFF1884; AVX1-NEXT: sete %al1885; AVX1-NEXT: vzeroupper1886; AVX1-NEXT: retq1887;1888; AVX2-LABEL: allones_v16i32_and1:1889; AVX2: # %bb.0:1890; AVX2-NEXT: vpslld $31, %ymm1, %ymm11891; AVX2-NEXT: vpsrad $31, %ymm1, %ymm11892; AVX2-NEXT: vpslld $31, %ymm0, %ymm01893; AVX2-NEXT: vpsrad $31, %ymm0, %ymm01894; AVX2-NEXT: vpackssdw %ymm1, %ymm0, %ymm01895; AVX2-NEXT: vpmovmskb %ymm0, %eax1896; AVX2-NEXT: cmpl $-1, %eax1897; AVX2-NEXT: sete %al1898; AVX2-NEXT: vzeroupper1899; AVX2-NEXT: retq1900;1901; AVX512-LABEL: allones_v16i32_and1:1902; AVX512: # %bb.0:1903; AVX512-NEXT: vptestmd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm0, %k01904; AVX512-NEXT: kortestw %k0, %k01905; AVX512-NEXT: setb %al1906; AVX512-NEXT: vzeroupper1907; AVX512-NEXT: retq1908 %tmp = and <16 x i32> %arg, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>1909 %tmp1 = icmp ne <16 x i32> %tmp, zeroinitializer1910 %tmp2 = bitcast <16 x i1> %tmp1 to i161911 %tmp3 = icmp eq i16 %tmp2, -11912 ret i1 %tmp31913}1914 1915define i1 @allzeros_v16i32_and1(<16 x i32> %arg) {1916; SSE2-LABEL: allzeros_v16i32_and1:1917; SSE2: # %bb.0:1918; SSE2-NEXT: por %xmm3, %xmm11919; SSE2-NEXT: por %xmm2, %xmm01920; SSE2-NEXT: por %xmm1, %xmm01921; SSE2-NEXT: pslld $31, %xmm01922; SSE2-NEXT: movmskps %xmm0, %eax1923; SSE2-NEXT: testl %eax, %eax1924; SSE2-NEXT: sete %al1925; SSE2-NEXT: retq1926;1927; SSE41-LABEL: allzeros_v16i32_and1:1928; SSE41: # %bb.0:1929; SSE41-NEXT: por %xmm3, %xmm11930; SSE41-NEXT: por %xmm2, %xmm01931; SSE41-NEXT: por %xmm1, %xmm01932; SSE41-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01933; SSE41-NEXT: sete %al1934; SSE41-NEXT: retq1935;1936; AVX1-LABEL: allzeros_v16i32_and1:1937; AVX1: # %bb.0:1938; AVX1-NEXT: vorps %ymm1, %ymm0, %ymm01939; AVX1-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm01940; AVX1-NEXT: sete %al1941; AVX1-NEXT: vzeroupper1942; AVX1-NEXT: retq1943;1944; AVX2-LABEL: allzeros_v16i32_and1:1945; AVX2: # %bb.0:1946; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm01947; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [4294967297,4294967297,4294967297,4294967297]1948; AVX2-NEXT: vptest %ymm1, %ymm01949; AVX2-NEXT: sete %al1950; AVX2-NEXT: vzeroupper1951; AVX2-NEXT: retq1952;1953; AVX512-LABEL: allzeros_v16i32_and1:1954; AVX512: # %bb.0:1955; AVX512-NEXT: vptestmd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm0, %k01956; AVX512-NEXT: kortestw %k0, %k01957; AVX512-NEXT: sete %al1958; AVX512-NEXT: vzeroupper1959; AVX512-NEXT: retq1960 %tmp = and <16 x i32> %arg, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>1961 %tmp1 = icmp ne <16 x i32> %tmp, zeroinitializer1962 %tmp2 = bitcast <16 x i1> %tmp1 to i161963 %tmp3 = icmp eq i16 %tmp2, 01964 ret i1 %tmp31965}1966 1967define i1 @allones_v2i64_and1(<2 x i64> %arg) {1968; SSE-LABEL: allones_v2i64_and1:1969; SSE: # %bb.0:1970; SSE-NEXT: psllq $63, %xmm01971; SSE-NEXT: movmskpd %xmm0, %eax1972; SSE-NEXT: cmpl $3, %eax1973; SSE-NEXT: sete %al1974; SSE-NEXT: retq1975;1976; AVX1OR2-LABEL: allones_v2i64_and1:1977; AVX1OR2: # %bb.0:1978; AVX1OR2-NEXT: vpsllq $63, %xmm0, %xmm01979; AVX1OR2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm11980; AVX1OR2-NEXT: vtestpd %xmm1, %xmm01981; AVX1OR2-NEXT: setb %al1982; AVX1OR2-NEXT: retq1983;1984; KNL-LABEL: allones_v2i64_and1:1985; KNL: # %bb.0:1986; KNL-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm01987; KNL-NEXT: vpmovsxbq {{.*#+}} xmm1 = [1,1]1988; KNL-NEXT: vptestnmq %zmm1, %zmm0, %k01989; KNL-NEXT: kmovw %k0, %eax1990; KNL-NEXT: testb $3, %al1991; KNL-NEXT: sete %al1992; KNL-NEXT: vzeroupper1993; KNL-NEXT: retq1994;1995; SKX-LABEL: allones_v2i64_and1:1996; SKX: # %bb.0:1997; SKX-NEXT: vptestmq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to2}, %xmm0, %k01998; SKX-NEXT: kmovd %k0, %eax1999; SKX-NEXT: cmpb $3, %al2000; SKX-NEXT: sete %al2001; SKX-NEXT: retq2002 %tmp = and <2 x i64> %arg, <i64 1, i64 1>2003 %tmp1 = icmp ne <2 x i64> %tmp, zeroinitializer2004 %tmp2 = bitcast <2 x i1> %tmp1 to i22005 %tmp3 = icmp eq i2 %tmp2, -12006 ret i1 %tmp32007}2008 2009define i1 @allzeros_v2i64_and1(<2 x i64> %arg) {2010; SSE2-LABEL: allzeros_v2i64_and1:2011; SSE2: # %bb.0:2012; SSE2-NEXT: pslld $31, %xmm02013; SSE2-NEXT: movmskps %xmm0, %eax2014; SSE2-NEXT: testb $5, %al2015; SSE2-NEXT: sete %al2016; SSE2-NEXT: retq2017;2018; SSE41-LABEL: allzeros_v2i64_and1:2019; SSE41: # %bb.0:2020; SSE41-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm02021; SSE41-NEXT: sete %al2022; SSE41-NEXT: retq2023;2024; AVX1OR2-LABEL: allzeros_v2i64_and1:2025; AVX1OR2: # %bb.0:2026; AVX1OR2-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm02027; AVX1OR2-NEXT: sete %al2028; AVX1OR2-NEXT: retq2029;2030; KNL-LABEL: allzeros_v2i64_and1:2031; KNL: # %bb.0:2032; KNL-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm02033; KNL-NEXT: sete %al2034; KNL-NEXT: retq2035;2036; SKX-LABEL: allzeros_v2i64_and1:2037; SKX: # %bb.0:2038; SKX-NEXT: vpbroadcastq {{.*#+}} xmm1 = [1,1]2039; SKX-NEXT: vptest %xmm1, %xmm02040; SKX-NEXT: sete %al2041; SKX-NEXT: retq2042 %tmp = and <2 x i64> %arg, <i64 1, i64 1>2043 %tmp1 = icmp ne <2 x i64> %tmp, zeroinitializer2044 %tmp2 = bitcast <2 x i1> %tmp1 to i22045 %tmp3 = icmp eq i2 %tmp2, 02046 ret i1 %tmp32047}2048 2049define i1 @allones_v4i64_and1(<4 x i64> %arg) {2050; SSE-LABEL: allones_v4i64_and1:2051; SSE: # %bb.0:2052; SSE-NEXT: psllq $63, %xmm12053; SSE-NEXT: psllq $63, %xmm02054; SSE-NEXT: shufps {{.*#+}} xmm0 = xmm0[1,3],xmm1[1,3]2055; SSE-NEXT: movmskps %xmm0, %eax2056; SSE-NEXT: cmpl $15, %eax2057; SSE-NEXT: sete %al2058; SSE-NEXT: retq2059;2060; AVX1-LABEL: allones_v4i64_and1:2061; AVX1: # %bb.0:2062; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm12063; AVX1-NEXT: vpand %xmm1, %xmm0, %xmm02064; AVX1-NEXT: vpsllq $63, %xmm0, %xmm02065; AVX1-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm12066; AVX1-NEXT: vtestpd %xmm1, %xmm02067; AVX1-NEXT: setb %al2068; AVX1-NEXT: vzeroupper2069; AVX1-NEXT: retq2070;2071; AVX2-LABEL: allones_v4i64_and1:2072; AVX2: # %bb.0:2073; AVX2-NEXT: vpsllq $63, %ymm0, %ymm02074; AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm12075; AVX2-NEXT: vtestpd %ymm1, %ymm02076; AVX2-NEXT: setb %al2077; AVX2-NEXT: vzeroupper2078; AVX2-NEXT: retq2079;2080; KNL-LABEL: allones_v4i64_and1:2081; KNL: # %bb.0:2082; KNL-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm02083; KNL-NEXT: vptestnmq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %zmm0, %k02084; KNL-NEXT: kmovw %k0, %eax2085; KNL-NEXT: testb $15, %al2086; KNL-NEXT: sete %al2087; KNL-NEXT: vzeroupper2088; KNL-NEXT: retq2089;2090; SKX-LABEL: allones_v4i64_and1:2091; SKX: # %bb.0:2092; SKX-NEXT: vptestmq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %ymm0, %k02093; SKX-NEXT: kmovd %k0, %eax2094; SKX-NEXT: cmpb $15, %al2095; SKX-NEXT: sete %al2096; SKX-NEXT: vzeroupper2097; SKX-NEXT: retq2098 %tmp = and <4 x i64> %arg, <i64 1, i64 1, i64 1, i64 1>2099 %tmp1 = icmp ne <4 x i64> %tmp, zeroinitializer2100 %tmp2 = bitcast <4 x i1> %tmp1 to i42101 %tmp3 = icmp eq i4 %tmp2, -12102 ret i1 %tmp32103}2104 2105define i1 @allzeros_v4i64_and1(<4 x i64> %arg) {2106; SSE2-LABEL: allzeros_v4i64_and1:2107; SSE2: # %bb.0:2108; SSE2-NEXT: por %xmm1, %xmm02109; SSE2-NEXT: pslld $31, %xmm02110; SSE2-NEXT: movmskps %xmm0, %eax2111; SSE2-NEXT: testb $5, %al2112; SSE2-NEXT: sete %al2113; SSE2-NEXT: retq2114;2115; SSE41-LABEL: allzeros_v4i64_and1:2116; SSE41: # %bb.0:2117; SSE41-NEXT: por %xmm1, %xmm02118; SSE41-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm02119; SSE41-NEXT: sete %al2120; SSE41-NEXT: retq2121;2122; AVX1-LABEL: allzeros_v4i64_and1:2123; AVX1: # %bb.0:2124; AVX1-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm02125; AVX1-NEXT: sete %al2126; AVX1-NEXT: vzeroupper2127; AVX1-NEXT: retq2128;2129; AVX2-LABEL: allzeros_v4i64_and1:2130; AVX2: # %bb.0:2131; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [1,1,1,1]2132; AVX2-NEXT: vptest %ymm1, %ymm02133; AVX2-NEXT: sete %al2134; AVX2-NEXT: vzeroupper2135; AVX2-NEXT: retq2136;2137; AVX512-LABEL: allzeros_v4i64_and1:2138; AVX512: # %bb.0:2139; AVX512-NEXT: vpbroadcastq {{.*#+}} ymm1 = [1,1,1,1]2140; AVX512-NEXT: vptest %ymm1, %ymm02141; AVX512-NEXT: sete %al2142; AVX512-NEXT: vzeroupper2143; AVX512-NEXT: retq2144 %tmp = and <4 x i64> %arg, <i64 1, i64 1, i64 1, i64 1>2145 %tmp1 = icmp ne <4 x i64> %tmp, zeroinitializer2146 %tmp2 = bitcast <4 x i1> %tmp1 to i42147 %tmp3 = icmp eq i4 %tmp2, 02148 ret i1 %tmp32149}2150 2151define i1 @allones_v8i64_and1(<8 x i64> %arg) {2152; SSE-LABEL: allones_v8i64_and1:2153; SSE: # %bb.0:2154; SSE-NEXT: psllq $63, %xmm32155; SSE-NEXT: psllq $63, %xmm22156; SSE-NEXT: packssdw %xmm3, %xmm22157; SSE-NEXT: psllq $63, %xmm12158; SSE-NEXT: psllq $63, %xmm02159; SSE-NEXT: packssdw %xmm1, %xmm02160; SSE-NEXT: packssdw %xmm2, %xmm02161; SSE-NEXT: packsswb %xmm0, %xmm02162; SSE-NEXT: pmovmskb %xmm0, %eax2163; SSE-NEXT: cmpb $-1, %al2164; SSE-NEXT: sete %al2165; SSE-NEXT: retq2166;2167; AVX1-LABEL: allones_v8i64_and1:2168; AVX1: # %bb.0:2169; AVX1-NEXT: vpsllq $63, %xmm1, %xmm22170; AVX1-NEXT: vpsllq $63, %xmm0, %xmm32171; AVX1-NEXT: vpand %xmm2, %xmm3, %xmm22172; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm12173; AVX1-NEXT: vpsllq $63, %xmm1, %xmm12174; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm02175; AVX1-NEXT: vpsllq $63, %xmm0, %xmm02176; AVX1-NEXT: vpand %xmm1, %xmm0, %xmm02177; AVX1-NEXT: vpackssdw %xmm0, %xmm2, %xmm02178; AVX1-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm12179; AVX1-NEXT: vtestps %xmm1, %xmm02180; AVX1-NEXT: setb %al2181; AVX1-NEXT: vzeroupper2182; AVX1-NEXT: retq2183;2184; AVX2-LABEL: allones_v8i64_and1:2185; AVX2: # %bb.0:2186; AVX2-NEXT: vpsllq $63, %ymm1, %ymm12187; AVX2-NEXT: vpsllq $63, %ymm0, %ymm02188; AVX2-NEXT: vpackssdw %ymm1, %ymm0, %ymm02189; AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm12190; AVX2-NEXT: vtestps %ymm1, %ymm02191; AVX2-NEXT: setb %al2192; AVX2-NEXT: vzeroupper2193; AVX2-NEXT: retq2194;2195; KNL-LABEL: allones_v8i64_and1:2196; KNL: # %bb.0:2197; KNL-NEXT: vptestmq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %zmm0, %k02198; KNL-NEXT: kmovw %k0, %eax2199; KNL-NEXT: cmpb $-1, %al2200; KNL-NEXT: sete %al2201; KNL-NEXT: vzeroupper2202; KNL-NEXT: retq2203;2204; SKX-LABEL: allones_v8i64_and1:2205; SKX: # %bb.0:2206; SKX-NEXT: vptestmq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %zmm0, %k02207; SKX-NEXT: kortestb %k0, %k02208; SKX-NEXT: setb %al2209; SKX-NEXT: vzeroupper2210; SKX-NEXT: retq2211 %tmp = and <8 x i64> %arg, <i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1>2212 %tmp1 = icmp ne <8 x i64> %tmp, zeroinitializer2213 %tmp2 = bitcast <8 x i1> %tmp1 to i82214 %tmp3 = icmp eq i8 %tmp2, -12215 ret i1 %tmp32216}2217 2218define i1 @allzeros_v8i64_and1(<8 x i64> %arg) {2219; SSE2-LABEL: allzeros_v8i64_and1:2220; SSE2: # %bb.0:2221; SSE2-NEXT: por %xmm3, %xmm12222; SSE2-NEXT: por %xmm2, %xmm02223; SSE2-NEXT: por %xmm1, %xmm02224; SSE2-NEXT: pslld $31, %xmm02225; SSE2-NEXT: movmskps %xmm0, %eax2226; SSE2-NEXT: testb $5, %al2227; SSE2-NEXT: sete %al2228; SSE2-NEXT: retq2229;2230; SSE41-LABEL: allzeros_v8i64_and1:2231; SSE41: # %bb.0:2232; SSE41-NEXT: por %xmm3, %xmm12233; SSE41-NEXT: por %xmm2, %xmm02234; SSE41-NEXT: por %xmm1, %xmm02235; SSE41-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm02236; SSE41-NEXT: sete %al2237; SSE41-NEXT: retq2238;2239; AVX1-LABEL: allzeros_v8i64_and1:2240; AVX1: # %bb.0:2241; AVX1-NEXT: vorps %ymm1, %ymm0, %ymm02242; AVX1-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm02243; AVX1-NEXT: sete %al2244; AVX1-NEXT: vzeroupper2245; AVX1-NEXT: retq2246;2247; AVX2-LABEL: allzeros_v8i64_and1:2248; AVX2: # %bb.0:2249; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm02250; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [1,1,1,1]2251; AVX2-NEXT: vptest %ymm1, %ymm02252; AVX2-NEXT: sete %al2253; AVX2-NEXT: vzeroupper2254; AVX2-NEXT: retq2255;2256; AVX512-LABEL: allzeros_v8i64_and1:2257; AVX512: # %bb.0:2258; AVX512-NEXT: vpbroadcastq {{.*#+}} zmm1 = [1,1,1,1,1,1,1,1]2259; AVX512-NEXT: vptestmd %zmm1, %zmm0, %k02260; AVX512-NEXT: kortestw %k0, %k02261; AVX512-NEXT: sete %al2262; AVX512-NEXT: vzeroupper2263; AVX512-NEXT: retq2264 %tmp = and <8 x i64> %arg, <i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1>2265 %tmp1 = icmp ne <8 x i64> %tmp, zeroinitializer2266 %tmp2 = bitcast <8 x i1> %tmp1 to i82267 %tmp3 = icmp eq i8 %tmp2, 02268 ret i1 %tmp32269}2270 2271define i1 @allones_v16i8_and4(<16 x i8> %arg) {2272; SSE-LABEL: allones_v16i8_and4:2273; SSE: # %bb.0:2274; SSE-NEXT: psllw $5, %xmm02275; SSE-NEXT: pmovmskb %xmm0, %eax2276; SSE-NEXT: cmpl $65535, %eax # imm = 0xFFFF2277; SSE-NEXT: sete %al2278; SSE-NEXT: retq2279;2280; AVX1OR2-LABEL: allones_v16i8_and4:2281; AVX1OR2: # %bb.0:2282; AVX1OR2-NEXT: vpsllw $5, %xmm0, %xmm02283; AVX1OR2-NEXT: vpmovmskb %xmm0, %eax2284; AVX1OR2-NEXT: cmpl $65535, %eax # imm = 0xFFFF2285; AVX1OR2-NEXT: sete %al2286; AVX1OR2-NEXT: retq2287;2288; KNL-LABEL: allones_v16i8_and4:2289; KNL: # %bb.0:2290; KNL-NEXT: vpsllw $5, %xmm0, %xmm02291; KNL-NEXT: vpmovmskb %xmm0, %eax2292; KNL-NEXT: cmpl $65535, %eax # imm = 0xFFFF2293; KNL-NEXT: sete %al2294; KNL-NEXT: retq2295;2296; SKX-LABEL: allones_v16i8_and4:2297; SKX: # %bb.0:2298; SKX-NEXT: vptestmb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %k02299; SKX-NEXT: kortestw %k0, %k02300; SKX-NEXT: setb %al2301; SKX-NEXT: retq2302 %tmp = and <16 x i8> %arg, <i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4>2303 %tmp1 = icmp ne <16 x i8> %tmp, zeroinitializer2304 %tmp2 = bitcast <16 x i1> %tmp1 to i162305 %tmp3 = icmp eq i16 %tmp2, -12306 ret i1 %tmp32307}2308 2309define i1 @allzeros_v16i8_and4(<16 x i8> %arg) {2310; SSE2-LABEL: allzeros_v16i8_and4:2311; SSE2: # %bb.0:2312; SSE2-NEXT: psllw $5, %xmm02313; SSE2-NEXT: pmovmskb %xmm0, %eax2314; SSE2-NEXT: testl %eax, %eax2315; SSE2-NEXT: sete %al2316; SSE2-NEXT: retq2317;2318; SSE41-LABEL: allzeros_v16i8_and4:2319; SSE41: # %bb.0:2320; SSE41-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm02321; SSE41-NEXT: sete %al2322; SSE41-NEXT: retq2323;2324; AVX1OR2-LABEL: allzeros_v16i8_and4:2325; AVX1OR2: # %bb.0:2326; AVX1OR2-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm02327; AVX1OR2-NEXT: sete %al2328; AVX1OR2-NEXT: retq2329;2330; KNL-LABEL: allzeros_v16i8_and4:2331; KNL: # %bb.0:2332; KNL-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm02333; KNL-NEXT: sete %al2334; KNL-NEXT: retq2335;2336; SKX-LABEL: allzeros_v16i8_and4:2337; SKX: # %bb.0:2338; SKX-NEXT: vpbroadcastq {{.*#+}} xmm1 = [289360691352306692,289360691352306692]2339; SKX-NEXT: vptest %xmm1, %xmm02340; SKX-NEXT: sete %al2341; SKX-NEXT: retq2342 %tmp = and <16 x i8> %arg, <i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4>2343 %tmp1 = icmp ne <16 x i8> %tmp, zeroinitializer2344 %tmp2 = bitcast <16 x i1> %tmp1 to i162345 %tmp3 = icmp eq i16 %tmp2, 02346 ret i1 %tmp32347}2348 2349define i1 @allones_v32i8_and4(<32 x i8> %arg) {2350; SSE-LABEL: allones_v32i8_and4:2351; SSE: # %bb.0:2352; SSE-NEXT: pand %xmm1, %xmm02353; SSE-NEXT: psllw $5, %xmm02354; SSE-NEXT: pmovmskb %xmm0, %eax2355; SSE-NEXT: cmpl $65535, %eax # imm = 0xFFFF2356; SSE-NEXT: sete %al2357; SSE-NEXT: retq2358;2359; AVX1-LABEL: allones_v32i8_and4:2360; AVX1: # %bb.0:2361; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm12362; AVX1-NEXT: vpand %xmm0, %xmm1, %xmm02363; AVX1-NEXT: vpsllw $5, %xmm0, %xmm02364; AVX1-NEXT: vpmovmskb %xmm0, %eax2365; AVX1-NEXT: cmpl $65535, %eax # imm = 0xFFFF2366; AVX1-NEXT: sete %al2367; AVX1-NEXT: vzeroupper2368; AVX1-NEXT: retq2369;2370; AVX2-LABEL: allones_v32i8_and4:2371; AVX2: # %bb.0:2372; AVX2-NEXT: vpsllw $5, %ymm0, %ymm02373; AVX2-NEXT: vpmovmskb %ymm0, %eax2374; AVX2-NEXT: cmpl $-1, %eax2375; AVX2-NEXT: sete %al2376; AVX2-NEXT: vzeroupper2377; AVX2-NEXT: retq2378;2379; KNL-LABEL: allones_v32i8_and4:2380; KNL: # %bb.0:2381; KNL-NEXT: vpsllw $5, %ymm0, %ymm02382; KNL-NEXT: vpmovmskb %ymm0, %eax2383; KNL-NEXT: cmpl $-1, %eax2384; KNL-NEXT: sete %al2385; KNL-NEXT: vzeroupper2386; KNL-NEXT: retq2387;2388; SKX-LABEL: allones_v32i8_and4:2389; SKX: # %bb.0:2390; SKX-NEXT: vptestmb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %k02391; SKX-NEXT: kortestd %k0, %k02392; SKX-NEXT: setb %al2393; SKX-NEXT: vzeroupper2394; SKX-NEXT: retq2395 %tmp = and <32 x i8> %arg, <i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4>2396 %tmp1 = icmp ne <32 x i8> %tmp, zeroinitializer2397 %tmp2 = bitcast <32 x i1> %tmp1 to i322398 %tmp3 = icmp eq i32 %tmp2, -12399 ret i1 %tmp32400}2401 2402define i1 @allzeros_v32i8_and4(<32 x i8> %arg) {2403; SSE2-LABEL: allzeros_v32i8_and4:2404; SSE2: # %bb.0:2405; SSE2-NEXT: por %xmm1, %xmm02406; SSE2-NEXT: psllw $5, %xmm02407; SSE2-NEXT: pmovmskb %xmm0, %eax2408; SSE2-NEXT: testl %eax, %eax2409; SSE2-NEXT: sete %al2410; SSE2-NEXT: retq2411;2412; SSE41-LABEL: allzeros_v32i8_and4:2413; SSE41: # %bb.0:2414; SSE41-NEXT: por %xmm1, %xmm02415; SSE41-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm02416; SSE41-NEXT: sete %al2417; SSE41-NEXT: retq2418;2419; AVX1-LABEL: allzeros_v32i8_and4:2420; AVX1: # %bb.0:2421; AVX1-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm02422; AVX1-NEXT: sete %al2423; AVX1-NEXT: vzeroupper2424; AVX1-NEXT: retq2425;2426; AVX2-LABEL: allzeros_v32i8_and4:2427; AVX2: # %bb.0:2428; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [289360691352306692,289360691352306692,289360691352306692,289360691352306692]2429; AVX2-NEXT: vptest %ymm1, %ymm02430; AVX2-NEXT: sete %al2431; AVX2-NEXT: vzeroupper2432; AVX2-NEXT: retq2433;2434; AVX512-LABEL: allzeros_v32i8_and4:2435; AVX512: # %bb.0:2436; AVX512-NEXT: vpbroadcastq {{.*#+}} ymm1 = [289360691352306692,289360691352306692,289360691352306692,289360691352306692]2437; AVX512-NEXT: vptest %ymm1, %ymm02438; AVX512-NEXT: sete %al2439; AVX512-NEXT: vzeroupper2440; AVX512-NEXT: retq2441 %tmp = and <32 x i8> %arg, <i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4>2442 %tmp1 = icmp ne <32 x i8> %tmp, zeroinitializer2443 %tmp2 = bitcast <32 x i1> %tmp1 to i322444 %tmp3 = icmp eq i32 %tmp2, 02445 ret i1 %tmp32446}2447 2448define i1 @allones_v64i8_and4(<64 x i8> %arg) {2449; SSE-LABEL: allones_v64i8_and4:2450; SSE: # %bb.0:2451; SSE-NEXT: pand %xmm2, %xmm02452; SSE-NEXT: pand %xmm3, %xmm12453; SSE-NEXT: pand %xmm0, %xmm12454; SSE-NEXT: psllw $5, %xmm12455; SSE-NEXT: pmovmskb %xmm1, %eax2456; SSE-NEXT: cmpl $65535, %eax # imm = 0xFFFF2457; SSE-NEXT: sete %al2458; SSE-NEXT: retq2459;2460; AVX1-LABEL: allones_v64i8_and4:2461; AVX1: # %bb.0:2462; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm22463; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm32464; AVX1-NEXT: vpand %xmm2, %xmm3, %xmm22465; AVX1-NEXT: vpand %xmm0, %xmm1, %xmm02466; AVX1-NEXT: vpand %xmm0, %xmm2, %xmm02467; AVX1-NEXT: vpsllw $5, %xmm0, %xmm02468; AVX1-NEXT: vpmovmskb %xmm0, %eax2469; AVX1-NEXT: cmpl $65535, %eax # imm = 0xFFFF2470; AVX1-NEXT: sete %al2471; AVX1-NEXT: vzeroupper2472; AVX1-NEXT: retq2473;2474; AVX2-LABEL: allones_v64i8_and4:2475; AVX2: # %bb.0:2476; AVX2-NEXT: vpand %ymm0, %ymm1, %ymm02477; AVX2-NEXT: vpsllw $5, %ymm0, %ymm02478; AVX2-NEXT: vpmovmskb %ymm0, %eax2479; AVX2-NEXT: cmpl $-1, %eax2480; AVX2-NEXT: sete %al2481; AVX2-NEXT: vzeroupper2482; AVX2-NEXT: retq2483;2484; KNL-LABEL: allones_v64i8_and4:2485; KNL: # %bb.0:2486; KNL-NEXT: vextracti64x4 $1, %zmm0, %ymm12487; KNL-NEXT: vpand %ymm0, %ymm1, %ymm02488; KNL-NEXT: vpsllw $5, %ymm0, %ymm02489; KNL-NEXT: vpmovmskb %ymm0, %eax2490; KNL-NEXT: cmpl $-1, %eax2491; KNL-NEXT: sete %al2492; KNL-NEXT: vzeroupper2493; KNL-NEXT: retq2494;2495; SKX-LABEL: allones_v64i8_and4:2496; SKX: # %bb.0:2497; SKX-NEXT: vptestmb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %k02498; SKX-NEXT: kortestq %k0, %k02499; SKX-NEXT: setb %al2500; SKX-NEXT: vzeroupper2501; SKX-NEXT: retq2502 %tmp = and <64 x i8> %arg, <i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4>2503 %tmp1 = icmp ne <64 x i8> %tmp, zeroinitializer2504 %tmp2 = bitcast <64 x i1> %tmp1 to i642505 %tmp3 = icmp eq i64 %tmp2, -12506 ret i1 %tmp32507}2508 2509define i1 @allzeros_v64i8_and4(<64 x i8> %arg) {2510; SSE2-LABEL: allzeros_v64i8_and4:2511; SSE2: # %bb.0:2512; SSE2-NEXT: por %xmm3, %xmm12513; SSE2-NEXT: por %xmm2, %xmm02514; SSE2-NEXT: por %xmm1, %xmm02515; SSE2-NEXT: psllw $5, %xmm02516; SSE2-NEXT: pmovmskb %xmm0, %eax2517; SSE2-NEXT: testl %eax, %eax2518; SSE2-NEXT: sete %al2519; SSE2-NEXT: retq2520;2521; SSE41-LABEL: allzeros_v64i8_and4:2522; SSE41: # %bb.0:2523; SSE41-NEXT: por %xmm3, %xmm12524; SSE41-NEXT: por %xmm2, %xmm02525; SSE41-NEXT: por %xmm1, %xmm02526; SSE41-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm02527; SSE41-NEXT: sete %al2528; SSE41-NEXT: retq2529;2530; AVX1-LABEL: allzeros_v64i8_and4:2531; AVX1: # %bb.0:2532; AVX1-NEXT: vorps %ymm1, %ymm0, %ymm02533; AVX1-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm02534; AVX1-NEXT: sete %al2535; AVX1-NEXT: vzeroupper2536; AVX1-NEXT: retq2537;2538; AVX2-LABEL: allzeros_v64i8_and4:2539; AVX2: # %bb.0:2540; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm02541; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [289360691352306692,289360691352306692,289360691352306692,289360691352306692]2542; AVX2-NEXT: vptest %ymm1, %ymm02543; AVX2-NEXT: sete %al2544; AVX2-NEXT: vzeroupper2545; AVX2-NEXT: retq2546;2547; AVX512-LABEL: allzeros_v64i8_and4:2548; AVX512: # %bb.0:2549; AVX512-NEXT: vptestmd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm0, %k02550; AVX512-NEXT: kortestw %k0, %k02551; AVX512-NEXT: sete %al2552; AVX512-NEXT: vzeroupper2553; AVX512-NEXT: retq2554 %tmp = and <64 x i8> %arg, <i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4>2555 %tmp1 = icmp ne <64 x i8> %tmp, zeroinitializer2556 %tmp2 = bitcast <64 x i1> %tmp1 to i642557 %tmp3 = icmp eq i64 %tmp2, 02558 ret i1 %tmp32559}2560 2561define i1 @allones_v8i16_and4(<8 x i16> %arg) {2562; SSE-LABEL: allones_v8i16_and4:2563; SSE: # %bb.0:2564; SSE-NEXT: psllw $13, %xmm02565; SSE-NEXT: packsswb %xmm0, %xmm02566; SSE-NEXT: pmovmskb %xmm0, %eax2567; SSE-NEXT: cmpb $-1, %al2568; SSE-NEXT: sete %al2569; SSE-NEXT: retq2570;2571; AVX1OR2-LABEL: allones_v8i16_and4:2572; AVX1OR2: # %bb.0:2573; AVX1OR2-NEXT: vpsllw $13, %xmm0, %xmm02574; AVX1OR2-NEXT: vpacksswb %xmm0, %xmm0, %xmm02575; AVX1OR2-NEXT: vpmovmskb %xmm0, %eax2576; AVX1OR2-NEXT: cmpb $-1, %al2577; AVX1OR2-NEXT: sete %al2578; AVX1OR2-NEXT: retq2579;2580; KNL-LABEL: allones_v8i16_and4:2581; KNL: # %bb.0:2582; KNL-NEXT: vpsllw $13, %xmm0, %xmm02583; KNL-NEXT: vpsraw $15, %xmm0, %xmm02584; KNL-NEXT: vpmovsxwq %xmm0, %zmm02585; KNL-NEXT: vptestmq %zmm0, %zmm0, %k02586; KNL-NEXT: kmovw %k0, %eax2587; KNL-NEXT: cmpb $-1, %al2588; KNL-NEXT: sete %al2589; KNL-NEXT: vzeroupper2590; KNL-NEXT: retq2591;2592; SKX-LABEL: allones_v8i16_and4:2593; SKX: # %bb.0:2594; SKX-NEXT: vptestmw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %k02595; SKX-NEXT: kortestb %k0, %k02596; SKX-NEXT: setb %al2597; SKX-NEXT: retq2598 %tmp = and <8 x i16> %arg, <i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4>2599 %tmp1 = icmp ne <8 x i16> %tmp, zeroinitializer2600 %tmp2 = bitcast <8 x i1> %tmp1 to i82601 %tmp3 = icmp eq i8 %tmp2, -12602 ret i1 %tmp32603}2604 2605define i1 @allzeros_v8i16_and4(<8 x i16> %arg) {2606; SSE2-LABEL: allzeros_v8i16_and4:2607; SSE2: # %bb.0:2608; SSE2-NEXT: psllw $5, %xmm02609; SSE2-NEXT: pmovmskb %xmm0, %eax2610; SSE2-NEXT: testl $21845, %eax # imm = 0x55552611; SSE2-NEXT: sete %al2612; SSE2-NEXT: retq2613;2614; SSE41-LABEL: allzeros_v8i16_and4:2615; SSE41: # %bb.0:2616; SSE41-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm02617; SSE41-NEXT: sete %al2618; SSE41-NEXT: retq2619;2620; AVX1OR2-LABEL: allzeros_v8i16_and4:2621; AVX1OR2: # %bb.0:2622; AVX1OR2-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm02623; AVX1OR2-NEXT: sete %al2624; AVX1OR2-NEXT: retq2625;2626; KNL-LABEL: allzeros_v8i16_and4:2627; KNL: # %bb.0:2628; KNL-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm02629; KNL-NEXT: sete %al2630; KNL-NEXT: retq2631;2632; SKX-LABEL: allzeros_v8i16_and4:2633; SKX: # %bb.0:2634; SKX-NEXT: vpbroadcastq {{.*#+}} xmm1 = [1125917086973956,1125917086973956]2635; SKX-NEXT: vptest %xmm1, %xmm02636; SKX-NEXT: sete %al2637; SKX-NEXT: retq2638 %tmp = and <8 x i16> %arg, <i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4>2639 %tmp1 = icmp ne <8 x i16> %tmp, zeroinitializer2640 %tmp2 = bitcast <8 x i1> %tmp1 to i82641 %tmp3 = icmp eq i8 %tmp2, 02642 ret i1 %tmp32643}2644 2645define i1 @allones_v16i16_and4(<16 x i16> %arg) {2646; SSE-LABEL: allones_v16i16_and4:2647; SSE: # %bb.0:2648; SSE-NEXT: psllw $13, %xmm12649; SSE-NEXT: psllw $13, %xmm02650; SSE-NEXT: packsswb %xmm1, %xmm02651; SSE-NEXT: pmovmskb %xmm0, %eax2652; SSE-NEXT: cmpl $65535, %eax # imm = 0xFFFF2653; SSE-NEXT: sete %al2654; SSE-NEXT: retq2655;2656; AVX1-LABEL: allones_v16i16_and4:2657; AVX1: # %bb.0:2658; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm12659; AVX1-NEXT: vpsllw $13, %xmm1, %xmm12660; AVX1-NEXT: vpsllw $13, %xmm0, %xmm02661; AVX1-NEXT: vpacksswb %xmm1, %xmm0, %xmm02662; AVX1-NEXT: vpmovmskb %xmm0, %eax2663; AVX1-NEXT: cmpl $65535, %eax # imm = 0xFFFF2664; AVX1-NEXT: sete %al2665; AVX1-NEXT: vzeroupper2666; AVX1-NEXT: retq2667;2668; AVX2-LABEL: allones_v16i16_and4:2669; AVX2: # %bb.0:2670; AVX2-NEXT: vpsllw $13, %ymm0, %ymm02671; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm12672; AVX2-NEXT: vpacksswb %xmm1, %xmm0, %xmm02673; AVX2-NEXT: vpmovmskb %xmm0, %eax2674; AVX2-NEXT: cmpl $65535, %eax # imm = 0xFFFF2675; AVX2-NEXT: sete %al2676; AVX2-NEXT: vzeroupper2677; AVX2-NEXT: retq2678;2679; KNL-LABEL: allones_v16i16_and4:2680; KNL: # %bb.0:2681; KNL-NEXT: vpsllw $13, %ymm0, %ymm02682; KNL-NEXT: vpsraw $15, %ymm0, %ymm02683; KNL-NEXT: vpmovsxwd %ymm0, %zmm02684; KNL-NEXT: vptestmd %zmm0, %zmm0, %k02685; KNL-NEXT: kortestw %k0, %k02686; KNL-NEXT: setb %al2687; KNL-NEXT: vzeroupper2688; KNL-NEXT: retq2689;2690; SKX-LABEL: allones_v16i16_and4:2691; SKX: # %bb.0:2692; SKX-NEXT: vptestmw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %k02693; SKX-NEXT: kortestw %k0, %k02694; SKX-NEXT: setb %al2695; SKX-NEXT: vzeroupper2696; SKX-NEXT: retq2697 %tmp = and <16 x i16> %arg, <i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4>2698 %tmp1 = icmp ne <16 x i16> %tmp, zeroinitializer2699 %tmp2 = bitcast <16 x i1> %tmp1 to i162700 %tmp3 = icmp eq i16 %tmp2, -12701 ret i1 %tmp32702}2703 2704define i1 @allones_v32i16_and4(<32 x i16> %arg) {2705; SSE-LABEL: allones_v32i16_and4:2706; SSE: # %bb.0:2707; SSE-NEXT: pand %xmm3, %xmm12708; SSE-NEXT: psllw $13, %xmm12709; SSE-NEXT: pand %xmm2, %xmm02710; SSE-NEXT: psllw $13, %xmm02711; SSE-NEXT: packsswb %xmm1, %xmm02712; SSE-NEXT: pmovmskb %xmm0, %eax2713; SSE-NEXT: cmpl $65535, %eax # imm = 0xFFFF2714; SSE-NEXT: sete %al2715; SSE-NEXT: retq2716;2717; AVX1-LABEL: allones_v32i16_and4:2718; AVX1: # %bb.0:2719; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm22720; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm32721; AVX1-NEXT: vpand %xmm2, %xmm3, %xmm22722; AVX1-NEXT: vpsllw $13, %xmm2, %xmm22723; AVX1-NEXT: vpand %xmm0, %xmm1, %xmm02724; AVX1-NEXT: vpsllw $13, %xmm0, %xmm02725; AVX1-NEXT: vpacksswb %xmm2, %xmm0, %xmm02726; AVX1-NEXT: vpmovmskb %xmm0, %eax2727; AVX1-NEXT: cmpl $65535, %eax # imm = 0xFFFF2728; AVX1-NEXT: sete %al2729; AVX1-NEXT: vzeroupper2730; AVX1-NEXT: retq2731;2732; AVX2-LABEL: allones_v32i16_and4:2733; AVX2: # %bb.0:2734; AVX2-NEXT: vpsllw $13, %ymm1, %ymm12735; AVX2-NEXT: vpsllw $13, %ymm0, %ymm02736; AVX2-NEXT: vpacksswb %ymm1, %ymm0, %ymm02737; AVX2-NEXT: vpmovmskb %ymm0, %eax2738; AVX2-NEXT: cmpl $-1, %eax2739; AVX2-NEXT: sete %al2740; AVX2-NEXT: vzeroupper2741; AVX2-NEXT: retq2742;2743; KNL-LABEL: allones_v32i16_and4:2744; KNL: # %bb.0:2745; KNL-NEXT: vpsllw $13, %ymm0, %ymm12746; KNL-NEXT: vpsraw $15, %ymm1, %ymm12747; KNL-NEXT: vpmovsxwd %ymm1, %zmm12748; KNL-NEXT: vptestmd %zmm1, %zmm1, %k02749; KNL-NEXT: kmovw %k0, %eax2750; KNL-NEXT: vextracti64x4 $1, %zmm0, %ymm02751; KNL-NEXT: vpsllw $13, %ymm0, %ymm02752; KNL-NEXT: vpsraw $15, %ymm0, %ymm02753; KNL-NEXT: vpmovsxwd %ymm0, %zmm02754; KNL-NEXT: vptestmd %zmm0, %zmm0, %k02755; KNL-NEXT: kmovw %k0, %ecx2756; KNL-NEXT: andl %eax, %ecx2757; KNL-NEXT: cmpl $65535, %ecx # imm = 0xFFFF2758; KNL-NEXT: sete %al2759; KNL-NEXT: vzeroupper2760; KNL-NEXT: retq2761;2762; SKX-LABEL: allones_v32i16_and4:2763; SKX: # %bb.0:2764; SKX-NEXT: vptestmw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %k02765; SKX-NEXT: kortestd %k0, %k02766; SKX-NEXT: setb %al2767; SKX-NEXT: vzeroupper2768; SKX-NEXT: retq2769 %tmp = and <32 x i16> %arg, <i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4>2770 %tmp1 = icmp ne <32 x i16> %tmp, zeroinitializer2771 %tmp2 = bitcast <32 x i1> %tmp1 to i322772 %tmp3 = icmp eq i32 %tmp2, -12773 ret i1 %tmp32774}2775 2776define i1 @allzeros_v32i16_and4(<32 x i16> %arg) {2777; SSE2-LABEL: allzeros_v32i16_and4:2778; SSE2: # %bb.0:2779; SSE2-NEXT: por %xmm3, %xmm12780; SSE2-NEXT: por %xmm2, %xmm02781; SSE2-NEXT: por %xmm1, %xmm02782; SSE2-NEXT: psllw $5, %xmm02783; SSE2-NEXT: pmovmskb %xmm0, %eax2784; SSE2-NEXT: testl $21845, %eax # imm = 0x55552785; SSE2-NEXT: sete %al2786; SSE2-NEXT: retq2787;2788; SSE41-LABEL: allzeros_v32i16_and4:2789; SSE41: # %bb.0:2790; SSE41-NEXT: por %xmm3, %xmm12791; SSE41-NEXT: por %xmm2, %xmm02792; SSE41-NEXT: por %xmm1, %xmm02793; SSE41-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm02794; SSE41-NEXT: sete %al2795; SSE41-NEXT: retq2796;2797; AVX1-LABEL: allzeros_v32i16_and4:2798; AVX1: # %bb.0:2799; AVX1-NEXT: vorps %ymm1, %ymm0, %ymm02800; AVX1-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm02801; AVX1-NEXT: sete %al2802; AVX1-NEXT: vzeroupper2803; AVX1-NEXT: retq2804;2805; AVX2-LABEL: allzeros_v32i16_and4:2806; AVX2: # %bb.0:2807; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm02808; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [1125917086973956,1125917086973956,1125917086973956,1125917086973956]2809; AVX2-NEXT: vptest %ymm1, %ymm02810; AVX2-NEXT: sete %al2811; AVX2-NEXT: vzeroupper2812; AVX2-NEXT: retq2813;2814; AVX512-LABEL: allzeros_v32i16_and4:2815; AVX512: # %bb.0:2816; AVX512-NEXT: vptestmd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm0, %k02817; AVX512-NEXT: kortestw %k0, %k02818; AVX512-NEXT: sete %al2819; AVX512-NEXT: vzeroupper2820; AVX512-NEXT: retq2821 %tmp = and <32 x i16> %arg, <i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4>2822 %tmp1 = icmp ne <32 x i16> %tmp, zeroinitializer2823 %tmp2 = bitcast <32 x i1> %tmp1 to i322824 %tmp3 = icmp eq i32 %tmp2, 02825 ret i1 %tmp32826}2827 2828define i1 @allzeros_v16i16_and4(<16 x i16> %arg) {2829; SSE2-LABEL: allzeros_v16i16_and4:2830; SSE2: # %bb.0:2831; SSE2-NEXT: por %xmm1, %xmm02832; SSE2-NEXT: psllw $5, %xmm02833; SSE2-NEXT: pmovmskb %xmm0, %eax2834; SSE2-NEXT: testl $21845, %eax # imm = 0x55552835; SSE2-NEXT: sete %al2836; SSE2-NEXT: retq2837;2838; SSE41-LABEL: allzeros_v16i16_and4:2839; SSE41: # %bb.0:2840; SSE41-NEXT: por %xmm1, %xmm02841; SSE41-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm02842; SSE41-NEXT: sete %al2843; SSE41-NEXT: retq2844;2845; AVX1-LABEL: allzeros_v16i16_and4:2846; AVX1: # %bb.0:2847; AVX1-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm02848; AVX1-NEXT: sete %al2849; AVX1-NEXT: vzeroupper2850; AVX1-NEXT: retq2851;2852; AVX2-LABEL: allzeros_v16i16_and4:2853; AVX2: # %bb.0:2854; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [1125917086973956,1125917086973956,1125917086973956,1125917086973956]2855; AVX2-NEXT: vptest %ymm1, %ymm02856; AVX2-NEXT: sete %al2857; AVX2-NEXT: vzeroupper2858; AVX2-NEXT: retq2859;2860; AVX512-LABEL: allzeros_v16i16_and4:2861; AVX512: # %bb.0:2862; AVX512-NEXT: vpbroadcastq {{.*#+}} ymm1 = [1125917086973956,1125917086973956,1125917086973956,1125917086973956]2863; AVX512-NEXT: vptest %ymm1, %ymm02864; AVX512-NEXT: sete %al2865; AVX512-NEXT: vzeroupper2866; AVX512-NEXT: retq2867 %tmp = and <16 x i16> %arg, <i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4>2868 %tmp1 = icmp ne <16 x i16> %tmp, zeroinitializer2869 %tmp2 = bitcast <16 x i1> %tmp1 to i162870 %tmp3 = icmp eq i16 %tmp2, 02871 ret i1 %tmp32872}2873 2874define i1 @allones_v4i32_and4(<4 x i32> %arg) {2875; SSE-LABEL: allones_v4i32_and4:2876; SSE: # %bb.0:2877; SSE-NEXT: pslld $29, %xmm02878; SSE-NEXT: movmskps %xmm0, %eax2879; SSE-NEXT: cmpl $15, %eax2880; SSE-NEXT: sete %al2881; SSE-NEXT: retq2882;2883; AVX1OR2-LABEL: allones_v4i32_and4:2884; AVX1OR2: # %bb.0:2885; AVX1OR2-NEXT: vpslld $29, %xmm0, %xmm02886; AVX1OR2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm12887; AVX1OR2-NEXT: vtestps %xmm1, %xmm02888; AVX1OR2-NEXT: setb %al2889; AVX1OR2-NEXT: retq2890;2891; KNL-LABEL: allones_v4i32_and4:2892; KNL: # %bb.0:2893; KNL-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm02894; KNL-NEXT: vptestnmd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm0, %k02895; KNL-NEXT: kmovw %k0, %eax2896; KNL-NEXT: testb $15, %al2897; KNL-NEXT: sete %al2898; KNL-NEXT: vzeroupper2899; KNL-NEXT: retq2900;2901; SKX-LABEL: allones_v4i32_and4:2902; SKX: # %bb.0:2903; SKX-NEXT: vptestmd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %k02904; SKX-NEXT: kmovd %k0, %eax2905; SKX-NEXT: cmpb $15, %al2906; SKX-NEXT: sete %al2907; SKX-NEXT: retq2908 %tmp = and <4 x i32> %arg, <i32 4, i32 4, i32 4, i32 4>2909 %tmp1 = icmp ne <4 x i32> %tmp, zeroinitializer2910 %tmp2 = bitcast <4 x i1> %tmp1 to i42911 %tmp3 = icmp eq i4 %tmp2, -12912 ret i1 %tmp32913}2914 2915define i1 @allzeros_v4i32_and4(<4 x i32> %arg) {2916; SSE2-LABEL: allzeros_v4i32_and4:2917; SSE2: # %bb.0:2918; SSE2-NEXT: pslld $29, %xmm02919; SSE2-NEXT: movmskps %xmm0, %eax2920; SSE2-NEXT: testl %eax, %eax2921; SSE2-NEXT: sete %al2922; SSE2-NEXT: retq2923;2924; SSE41-LABEL: allzeros_v4i32_and4:2925; SSE41: # %bb.0:2926; SSE41-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm02927; SSE41-NEXT: sete %al2928; SSE41-NEXT: retq2929;2930; AVX1OR2-LABEL: allzeros_v4i32_and4:2931; AVX1OR2: # %bb.0:2932; AVX1OR2-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm02933; AVX1OR2-NEXT: sete %al2934; AVX1OR2-NEXT: retq2935;2936; KNL-LABEL: allzeros_v4i32_and4:2937; KNL: # %bb.0:2938; KNL-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm02939; KNL-NEXT: sete %al2940; KNL-NEXT: retq2941;2942; SKX-LABEL: allzeros_v4i32_and4:2943; SKX: # %bb.0:2944; SKX-NEXT: vpbroadcastq {{.*#+}} xmm1 = [17179869188,17179869188]2945; SKX-NEXT: vptest %xmm1, %xmm02946; SKX-NEXT: sete %al2947; SKX-NEXT: retq2948 %tmp = and <4 x i32> %arg, <i32 4, i32 4, i32 4, i32 4>2949 %tmp1 = icmp ne <4 x i32> %tmp, zeroinitializer2950 %tmp2 = bitcast <4 x i1> %tmp1 to i42951 %tmp3 = icmp eq i4 %tmp2, 02952 ret i1 %tmp32953}2954 2955define i1 @allones_v8i32_and4(<8 x i32> %arg) {2956; SSE-LABEL: allones_v8i32_and4:2957; SSE: # %bb.0:2958; SSE-NEXT: pslld $29, %xmm12959; SSE-NEXT: pslld $29, %xmm02960; SSE-NEXT: packssdw %xmm1, %xmm02961; SSE-NEXT: packsswb %xmm0, %xmm02962; SSE-NEXT: pmovmskb %xmm0, %eax2963; SSE-NEXT: cmpb $-1, %al2964; SSE-NEXT: sete %al2965; SSE-NEXT: retq2966;2967; AVX1-LABEL: allones_v8i32_and4:2968; AVX1: # %bb.0:2969; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm12970; AVX1-NEXT: vpand %xmm1, %xmm0, %xmm02971; AVX1-NEXT: vpslld $29, %xmm0, %xmm02972; AVX1-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm12973; AVX1-NEXT: vtestps %xmm1, %xmm02974; AVX1-NEXT: setb %al2975; AVX1-NEXT: vzeroupper2976; AVX1-NEXT: retq2977;2978; AVX2-LABEL: allones_v8i32_and4:2979; AVX2: # %bb.0:2980; AVX2-NEXT: vpslld $29, %ymm0, %ymm02981; AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm12982; AVX2-NEXT: vtestps %ymm1, %ymm02983; AVX2-NEXT: setb %al2984; AVX2-NEXT: vzeroupper2985; AVX2-NEXT: retq2986;2987; KNL-LABEL: allones_v8i32_and4:2988; KNL: # %bb.0:2989; KNL-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm02990; KNL-NEXT: vptestmd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm0, %k02991; KNL-NEXT: kmovw %k0, %eax2992; KNL-NEXT: cmpb $-1, %al2993; KNL-NEXT: sete %al2994; KNL-NEXT: vzeroupper2995; KNL-NEXT: retq2996;2997; SKX-LABEL: allones_v8i32_and4:2998; SKX: # %bb.0:2999; SKX-NEXT: vptestmd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm0, %k03000; SKX-NEXT: kortestb %k0, %k03001; SKX-NEXT: setb %al3002; SKX-NEXT: vzeroupper3003; SKX-NEXT: retq3004 %tmp = and <8 x i32> %arg, <i32 4, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4>3005 %tmp1 = icmp ne <8 x i32> %tmp, zeroinitializer3006 %tmp2 = bitcast <8 x i1> %tmp1 to i83007 %tmp3 = icmp eq i8 %tmp2, -13008 ret i1 %tmp33009}3010 3011define i1 @allzeros_v8i32_and4(<8 x i32> %arg) {3012; SSE2-LABEL: allzeros_v8i32_and4:3013; SSE2: # %bb.0:3014; SSE2-NEXT: por %xmm1, %xmm03015; SSE2-NEXT: pslld $29, %xmm03016; SSE2-NEXT: movmskps %xmm0, %eax3017; SSE2-NEXT: testl %eax, %eax3018; SSE2-NEXT: sete %al3019; SSE2-NEXT: retq3020;3021; SSE41-LABEL: allzeros_v8i32_and4:3022; SSE41: # %bb.0:3023; SSE41-NEXT: por %xmm1, %xmm03024; SSE41-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm03025; SSE41-NEXT: sete %al3026; SSE41-NEXT: retq3027;3028; AVX1-LABEL: allzeros_v8i32_and4:3029; AVX1: # %bb.0:3030; AVX1-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm03031; AVX1-NEXT: sete %al3032; AVX1-NEXT: vzeroupper3033; AVX1-NEXT: retq3034;3035; AVX2-LABEL: allzeros_v8i32_and4:3036; AVX2: # %bb.0:3037; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [17179869188,17179869188,17179869188,17179869188]3038; AVX2-NEXT: vptest %ymm1, %ymm03039; AVX2-NEXT: sete %al3040; AVX2-NEXT: vzeroupper3041; AVX2-NEXT: retq3042;3043; AVX512-LABEL: allzeros_v8i32_and4:3044; AVX512: # %bb.0:3045; AVX512-NEXT: vpbroadcastq {{.*#+}} ymm1 = [17179869188,17179869188,17179869188,17179869188]3046; AVX512-NEXT: vptest %ymm1, %ymm03047; AVX512-NEXT: sete %al3048; AVX512-NEXT: vzeroupper3049; AVX512-NEXT: retq3050 %tmp = and <8 x i32> %arg, <i32 4, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4>3051 %tmp1 = icmp ne <8 x i32> %tmp, zeroinitializer3052 %tmp2 = bitcast <8 x i1> %tmp1 to i83053 %tmp3 = icmp eq i8 %tmp2, 03054 ret i1 %tmp33055}3056 3057define i1 @allones_v16i32_and4(<16 x i32> %arg) {3058; SSE-LABEL: allones_v16i32_and4:3059; SSE: # %bb.0:3060; SSE-NEXT: pslld $29, %xmm33061; SSE-NEXT: pslld $29, %xmm23062; SSE-NEXT: packssdw %xmm3, %xmm23063; SSE-NEXT: pslld $29, %xmm13064; SSE-NEXT: pslld $29, %xmm03065; SSE-NEXT: packssdw %xmm1, %xmm03066; SSE-NEXT: packsswb %xmm2, %xmm03067; SSE-NEXT: pmovmskb %xmm0, %eax3068; SSE-NEXT: cmpl $65535, %eax # imm = 0xFFFF3069; SSE-NEXT: sete %al3070; SSE-NEXT: retq3071;3072; AVX1-LABEL: allones_v16i32_and4:3073; AVX1: # %bb.0:3074; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm23075; AVX1-NEXT: vpslld $29, %xmm2, %xmm23076; AVX1-NEXT: vpslld $29, %xmm1, %xmm13077; AVX1-NEXT: vpackssdw %xmm2, %xmm1, %xmm13078; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm23079; AVX1-NEXT: vpslld $29, %xmm2, %xmm23080; AVX1-NEXT: vpslld $29, %xmm0, %xmm03081; AVX1-NEXT: vpackssdw %xmm2, %xmm0, %xmm03082; AVX1-NEXT: vpacksswb %xmm1, %xmm0, %xmm03083; AVX1-NEXT: vpmovmskb %xmm0, %eax3084; AVX1-NEXT: cmpl $65535, %eax # imm = 0xFFFF3085; AVX1-NEXT: sete %al3086; AVX1-NEXT: vzeroupper3087; AVX1-NEXT: retq3088;3089; AVX2-LABEL: allones_v16i32_and4:3090; AVX2: # %bb.0:3091; AVX2-NEXT: vpslld $29, %ymm1, %ymm13092; AVX2-NEXT: vpsrad $31, %ymm1, %ymm13093; AVX2-NEXT: vpslld $29, %ymm0, %ymm03094; AVX2-NEXT: vpsrad $31, %ymm0, %ymm03095; AVX2-NEXT: vpackssdw %ymm1, %ymm0, %ymm03096; AVX2-NEXT: vpmovmskb %ymm0, %eax3097; AVX2-NEXT: cmpl $-1, %eax3098; AVX2-NEXT: sete %al3099; AVX2-NEXT: vzeroupper3100; AVX2-NEXT: retq3101;3102; AVX512-LABEL: allones_v16i32_and4:3103; AVX512: # %bb.0:3104; AVX512-NEXT: vptestmd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm0, %k03105; AVX512-NEXT: kortestw %k0, %k03106; AVX512-NEXT: setb %al3107; AVX512-NEXT: vzeroupper3108; AVX512-NEXT: retq3109 %tmp = and <16 x i32> %arg, <i32 4, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4>3110 %tmp1 = icmp ne <16 x i32> %tmp, zeroinitializer3111 %tmp2 = bitcast <16 x i1> %tmp1 to i163112 %tmp3 = icmp eq i16 %tmp2, -13113 ret i1 %tmp33114}3115 3116define i1 @allzeros_v16i32_and4(<16 x i32> %arg) {3117; SSE2-LABEL: allzeros_v16i32_and4:3118; SSE2: # %bb.0:3119; SSE2-NEXT: por %xmm3, %xmm13120; SSE2-NEXT: por %xmm2, %xmm03121; SSE2-NEXT: por %xmm1, %xmm03122; SSE2-NEXT: pslld $29, %xmm03123; SSE2-NEXT: movmskps %xmm0, %eax3124; SSE2-NEXT: testl %eax, %eax3125; SSE2-NEXT: sete %al3126; SSE2-NEXT: retq3127;3128; SSE41-LABEL: allzeros_v16i32_and4:3129; SSE41: # %bb.0:3130; SSE41-NEXT: por %xmm3, %xmm13131; SSE41-NEXT: por %xmm2, %xmm03132; SSE41-NEXT: por %xmm1, %xmm03133; SSE41-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm03134; SSE41-NEXT: sete %al3135; SSE41-NEXT: retq3136;3137; AVX1-LABEL: allzeros_v16i32_and4:3138; AVX1: # %bb.0:3139; AVX1-NEXT: vorps %ymm1, %ymm0, %ymm03140; AVX1-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm03141; AVX1-NEXT: sete %al3142; AVX1-NEXT: vzeroupper3143; AVX1-NEXT: retq3144;3145; AVX2-LABEL: allzeros_v16i32_and4:3146; AVX2: # %bb.0:3147; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm03148; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [17179869188,17179869188,17179869188,17179869188]3149; AVX2-NEXT: vptest %ymm1, %ymm03150; AVX2-NEXT: sete %al3151; AVX2-NEXT: vzeroupper3152; AVX2-NEXT: retq3153;3154; AVX512-LABEL: allzeros_v16i32_and4:3155; AVX512: # %bb.0:3156; AVX512-NEXT: vptestmd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm0, %k03157; AVX512-NEXT: kortestw %k0, %k03158; AVX512-NEXT: sete %al3159; AVX512-NEXT: vzeroupper3160; AVX512-NEXT: retq3161 %tmp = and <16 x i32> %arg, <i32 4, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4>3162 %tmp1 = icmp ne <16 x i32> %tmp, zeroinitializer3163 %tmp2 = bitcast <16 x i1> %tmp1 to i163164 %tmp3 = icmp eq i16 %tmp2, 03165 ret i1 %tmp33166}3167 3168define i1 @allones_v2i64_and4(<2 x i64> %arg) {3169; SSE-LABEL: allones_v2i64_and4:3170; SSE: # %bb.0:3171; SSE-NEXT: psllq $61, %xmm03172; SSE-NEXT: movmskpd %xmm0, %eax3173; SSE-NEXT: cmpl $3, %eax3174; SSE-NEXT: sete %al3175; SSE-NEXT: retq3176;3177; AVX1OR2-LABEL: allones_v2i64_and4:3178; AVX1OR2: # %bb.0:3179; AVX1OR2-NEXT: vpsllq $61, %xmm0, %xmm03180; AVX1OR2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm13181; AVX1OR2-NEXT: vtestpd %xmm1, %xmm03182; AVX1OR2-NEXT: setb %al3183; AVX1OR2-NEXT: retq3184;3185; KNL-LABEL: allones_v2i64_and4:3186; KNL: # %bb.0:3187; KNL-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm03188; KNL-NEXT: vpmovsxbq {{.*#+}} xmm1 = [4,4]3189; KNL-NEXT: vptestnmq %zmm1, %zmm0, %k03190; KNL-NEXT: kmovw %k0, %eax3191; KNL-NEXT: testb $3, %al3192; KNL-NEXT: sete %al3193; KNL-NEXT: vzeroupper3194; KNL-NEXT: retq3195;3196; SKX-LABEL: allones_v2i64_and4:3197; SKX: # %bb.0:3198; SKX-NEXT: vptestmq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to2}, %xmm0, %k03199; SKX-NEXT: kmovd %k0, %eax3200; SKX-NEXT: cmpb $3, %al3201; SKX-NEXT: sete %al3202; SKX-NEXT: retq3203 %tmp = and <2 x i64> %arg, <i64 4, i64 4>3204 %tmp1 = icmp ne <2 x i64> %tmp, zeroinitializer3205 %tmp2 = bitcast <2 x i1> %tmp1 to i23206 %tmp3 = icmp eq i2 %tmp2, -13207 ret i1 %tmp33208}3209 3210define i1 @allzeros_v2i64_and4(<2 x i64> %arg) {3211; SSE2-LABEL: allzeros_v2i64_and4:3212; SSE2: # %bb.0:3213; SSE2-NEXT: pslld $29, %xmm03214; SSE2-NEXT: movmskps %xmm0, %eax3215; SSE2-NEXT: testb $5, %al3216; SSE2-NEXT: sete %al3217; SSE2-NEXT: retq3218;3219; SSE41-LABEL: allzeros_v2i64_and4:3220; SSE41: # %bb.0:3221; SSE41-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm03222; SSE41-NEXT: sete %al3223; SSE41-NEXT: retq3224;3225; AVX1OR2-LABEL: allzeros_v2i64_and4:3226; AVX1OR2: # %bb.0:3227; AVX1OR2-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm03228; AVX1OR2-NEXT: sete %al3229; AVX1OR2-NEXT: retq3230;3231; KNL-LABEL: allzeros_v2i64_and4:3232; KNL: # %bb.0:3233; KNL-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm03234; KNL-NEXT: sete %al3235; KNL-NEXT: retq3236;3237; SKX-LABEL: allzeros_v2i64_and4:3238; SKX: # %bb.0:3239; SKX-NEXT: vpbroadcastq {{.*#+}} xmm1 = [4,4]3240; SKX-NEXT: vptest %xmm1, %xmm03241; SKX-NEXT: sete %al3242; SKX-NEXT: retq3243 %tmp = and <2 x i64> %arg, <i64 4, i64 4>3244 %tmp1 = icmp ne <2 x i64> %tmp, zeroinitializer3245 %tmp2 = bitcast <2 x i1> %tmp1 to i23246 %tmp3 = icmp eq i2 %tmp2, 03247 ret i1 %tmp33248}3249 3250define i1 @allones_v4i64_and4(<4 x i64> %arg) {3251; SSE-LABEL: allones_v4i64_and4:3252; SSE: # %bb.0:3253; SSE-NEXT: psllq $61, %xmm13254; SSE-NEXT: psllq $61, %xmm03255; SSE-NEXT: shufps {{.*#+}} xmm0 = xmm0[1,3],xmm1[1,3]3256; SSE-NEXT: movmskps %xmm0, %eax3257; SSE-NEXT: cmpl $15, %eax3258; SSE-NEXT: sete %al3259; SSE-NEXT: retq3260;3261; AVX1-LABEL: allones_v4i64_and4:3262; AVX1: # %bb.0:3263; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm13264; AVX1-NEXT: vpand %xmm1, %xmm0, %xmm03265; AVX1-NEXT: vpsllq $61, %xmm0, %xmm03266; AVX1-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm13267; AVX1-NEXT: vtestpd %xmm1, %xmm03268; AVX1-NEXT: setb %al3269; AVX1-NEXT: vzeroupper3270; AVX1-NEXT: retq3271;3272; AVX2-LABEL: allones_v4i64_and4:3273; AVX2: # %bb.0:3274; AVX2-NEXT: vpsllq $61, %ymm0, %ymm03275; AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm13276; AVX2-NEXT: vtestpd %ymm1, %ymm03277; AVX2-NEXT: setb %al3278; AVX2-NEXT: vzeroupper3279; AVX2-NEXT: retq3280;3281; KNL-LABEL: allones_v4i64_and4:3282; KNL: # %bb.0:3283; KNL-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm03284; KNL-NEXT: vptestnmq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %zmm0, %k03285; KNL-NEXT: kmovw %k0, %eax3286; KNL-NEXT: testb $15, %al3287; KNL-NEXT: sete %al3288; KNL-NEXT: vzeroupper3289; KNL-NEXT: retq3290;3291; SKX-LABEL: allones_v4i64_and4:3292; SKX: # %bb.0:3293; SKX-NEXT: vptestmq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %ymm0, %k03294; SKX-NEXT: kmovd %k0, %eax3295; SKX-NEXT: cmpb $15, %al3296; SKX-NEXT: sete %al3297; SKX-NEXT: vzeroupper3298; SKX-NEXT: retq3299 %tmp = and <4 x i64> %arg, <i64 4, i64 4, i64 4, i64 4>3300 %tmp1 = icmp ne <4 x i64> %tmp, zeroinitializer3301 %tmp2 = bitcast <4 x i1> %tmp1 to i43302 %tmp3 = icmp eq i4 %tmp2, -13303 ret i1 %tmp33304}3305 3306define i1 @allzeros_v4i64_and4(<4 x i64> %arg) {3307; SSE2-LABEL: allzeros_v4i64_and4:3308; SSE2: # %bb.0:3309; SSE2-NEXT: por %xmm1, %xmm03310; SSE2-NEXT: pslld $29, %xmm03311; SSE2-NEXT: movmskps %xmm0, %eax3312; SSE2-NEXT: testb $5, %al3313; SSE2-NEXT: sete %al3314; SSE2-NEXT: retq3315;3316; SSE41-LABEL: allzeros_v4i64_and4:3317; SSE41: # %bb.0:3318; SSE41-NEXT: por %xmm1, %xmm03319; SSE41-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm03320; SSE41-NEXT: sete %al3321; SSE41-NEXT: retq3322;3323; AVX1-LABEL: allzeros_v4i64_and4:3324; AVX1: # %bb.0:3325; AVX1-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm03326; AVX1-NEXT: sete %al3327; AVX1-NEXT: vzeroupper3328; AVX1-NEXT: retq3329;3330; AVX2-LABEL: allzeros_v4i64_and4:3331; AVX2: # %bb.0:3332; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [4,4,4,4]3333; AVX2-NEXT: vptest %ymm1, %ymm03334; AVX2-NEXT: sete %al3335; AVX2-NEXT: vzeroupper3336; AVX2-NEXT: retq3337;3338; AVX512-LABEL: allzeros_v4i64_and4:3339; AVX512: # %bb.0:3340; AVX512-NEXT: vpbroadcastq {{.*#+}} ymm1 = [4,4,4,4]3341; AVX512-NEXT: vptest %ymm1, %ymm03342; AVX512-NEXT: sete %al3343; AVX512-NEXT: vzeroupper3344; AVX512-NEXT: retq3345 %tmp = and <4 x i64> %arg, <i64 4, i64 4, i64 4, i64 4>3346 %tmp1 = icmp ne <4 x i64> %tmp, zeroinitializer3347 %tmp2 = bitcast <4 x i1> %tmp1 to i43348 %tmp3 = icmp eq i4 %tmp2, 03349 ret i1 %tmp33350}3351 3352define i1 @allones_v8i64_and4(<8 x i64> %arg) {3353; SSE-LABEL: allones_v8i64_and4:3354; SSE: # %bb.0:3355; SSE-NEXT: psllq $61, %xmm33356; SSE-NEXT: psllq $61, %xmm23357; SSE-NEXT: packssdw %xmm3, %xmm23358; SSE-NEXT: psllq $61, %xmm13359; SSE-NEXT: psllq $61, %xmm03360; SSE-NEXT: packssdw %xmm1, %xmm03361; SSE-NEXT: packssdw %xmm2, %xmm03362; SSE-NEXT: packsswb %xmm0, %xmm03363; SSE-NEXT: pmovmskb %xmm0, %eax3364; SSE-NEXT: cmpb $-1, %al3365; SSE-NEXT: sete %al3366; SSE-NEXT: retq3367;3368; AVX1-LABEL: allones_v8i64_and4:3369; AVX1: # %bb.0:3370; AVX1-NEXT: vpsllq $61, %xmm1, %xmm23371; AVX1-NEXT: vpsllq $61, %xmm0, %xmm33372; AVX1-NEXT: vpand %xmm2, %xmm3, %xmm23373; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm13374; AVX1-NEXT: vpsllq $61, %xmm1, %xmm13375; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm03376; AVX1-NEXT: vpsllq $61, %xmm0, %xmm03377; AVX1-NEXT: vpand %xmm1, %xmm0, %xmm03378; AVX1-NEXT: vpackssdw %xmm0, %xmm2, %xmm03379; AVX1-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm13380; AVX1-NEXT: vtestps %xmm1, %xmm03381; AVX1-NEXT: setb %al3382; AVX1-NEXT: vzeroupper3383; AVX1-NEXT: retq3384;3385; AVX2-LABEL: allones_v8i64_and4:3386; AVX2: # %bb.0:3387; AVX2-NEXT: vpsllq $61, %ymm1, %ymm13388; AVX2-NEXT: vpsllq $61, %ymm0, %ymm03389; AVX2-NEXT: vpackssdw %ymm1, %ymm0, %ymm03390; AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm13391; AVX2-NEXT: vtestps %ymm1, %ymm03392; AVX2-NEXT: setb %al3393; AVX2-NEXT: vzeroupper3394; AVX2-NEXT: retq3395;3396; KNL-LABEL: allones_v8i64_and4:3397; KNL: # %bb.0:3398; KNL-NEXT: vptestmq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %zmm0, %k03399; KNL-NEXT: kmovw %k0, %eax3400; KNL-NEXT: cmpb $-1, %al3401; KNL-NEXT: sete %al3402; KNL-NEXT: vzeroupper3403; KNL-NEXT: retq3404;3405; SKX-LABEL: allones_v8i64_and4:3406; SKX: # %bb.0:3407; SKX-NEXT: vptestmq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %zmm0, %k03408; SKX-NEXT: kortestb %k0, %k03409; SKX-NEXT: setb %al3410; SKX-NEXT: vzeroupper3411; SKX-NEXT: retq3412 %tmp = and <8 x i64> %arg, <i64 4, i64 4, i64 4, i64 4, i64 4, i64 4, i64 4, i64 4>3413 %tmp1 = icmp ne <8 x i64> %tmp, zeroinitializer3414 %tmp2 = bitcast <8 x i1> %tmp1 to i83415 %tmp3 = icmp eq i8 %tmp2, -13416 ret i1 %tmp33417}3418 3419define i1 @allzeros_v8i64_and4(<8 x i64> %arg) {3420; SSE2-LABEL: allzeros_v8i64_and4:3421; SSE2: # %bb.0:3422; SSE2-NEXT: por %xmm3, %xmm13423; SSE2-NEXT: por %xmm2, %xmm03424; SSE2-NEXT: por %xmm1, %xmm03425; SSE2-NEXT: pslld $29, %xmm03426; SSE2-NEXT: movmskps %xmm0, %eax3427; SSE2-NEXT: testb $5, %al3428; SSE2-NEXT: sete %al3429; SSE2-NEXT: retq3430;3431; SSE41-LABEL: allzeros_v8i64_and4:3432; SSE41: # %bb.0:3433; SSE41-NEXT: por %xmm3, %xmm13434; SSE41-NEXT: por %xmm2, %xmm03435; SSE41-NEXT: por %xmm1, %xmm03436; SSE41-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm03437; SSE41-NEXT: sete %al3438; SSE41-NEXT: retq3439;3440; AVX1-LABEL: allzeros_v8i64_and4:3441; AVX1: # %bb.0:3442; AVX1-NEXT: vorps %ymm1, %ymm0, %ymm03443; AVX1-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm03444; AVX1-NEXT: sete %al3445; AVX1-NEXT: vzeroupper3446; AVX1-NEXT: retq3447;3448; AVX2-LABEL: allzeros_v8i64_and4:3449; AVX2: # %bb.0:3450; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm03451; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [4,4,4,4]3452; AVX2-NEXT: vptest %ymm1, %ymm03453; AVX2-NEXT: sete %al3454; AVX2-NEXT: vzeroupper3455; AVX2-NEXT: retq3456;3457; AVX512-LABEL: allzeros_v8i64_and4:3458; AVX512: # %bb.0:3459; AVX512-NEXT: vpbroadcastq {{.*#+}} zmm1 = [4,4,4,4,4,4,4,4]3460; AVX512-NEXT: vptestmd %zmm1, %zmm0, %k03461; AVX512-NEXT: kortestw %k0, %k03462; AVX512-NEXT: sete %al3463; AVX512-NEXT: vzeroupper3464; AVX512-NEXT: retq3465 %tmp = and <8 x i64> %arg, <i64 4, i64 4, i64 4, i64 4, i64 4, i64 4, i64 4, i64 4>3466 %tmp1 = icmp ne <8 x i64> %tmp, zeroinitializer3467 %tmp2 = bitcast <8 x i1> %tmp1 to i83468 %tmp3 = icmp eq i8 %tmp2, 03469 ret i1 %tmp33470}3471 3472; FCMP may use ISD::SETNE when nnan, don't attempt to use LowerVectorAllEqual.3473define i1 @allzeros_v8f32_nnan(<8 x float> %a0) {3474; SSE-LABEL: allzeros_v8f32_nnan:3475; SSE: # %bb.0:3476; SSE-NEXT: xorps %xmm2, %xmm23477; SSE-NEXT: cmpneqps %xmm2, %xmm13478; SSE-NEXT: cmpneqps %xmm2, %xmm03479; SSE-NEXT: packssdw %xmm1, %xmm03480; SSE-NEXT: pmovmskb %xmm0, %eax3481; SSE-NEXT: testl %eax, %eax3482; SSE-NEXT: setne %al3483; SSE-NEXT: retq3484;3485; AVX1OR2-LABEL: allzeros_v8f32_nnan:3486; AVX1OR2: # %bb.0:3487; AVX1OR2-NEXT: vxorps %xmm1, %xmm1, %xmm13488; AVX1OR2-NEXT: vcmpneqps %ymm1, %ymm0, %ymm03489; AVX1OR2-NEXT: vtestps %ymm0, %ymm03490; AVX1OR2-NEXT: setne %al3491; AVX1OR2-NEXT: vzeroupper3492; AVX1OR2-NEXT: retq3493;3494; KNL-LABEL: allzeros_v8f32_nnan:3495; KNL: # %bb.0:3496; KNL-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm03497; KNL-NEXT: vxorps %xmm1, %xmm1, %xmm13498; KNL-NEXT: vcmpneqps %zmm1, %zmm0, %k03499; KNL-NEXT: kmovw %k0, %eax3500; KNL-NEXT: testb %al, %al3501; KNL-NEXT: setne %al3502; KNL-NEXT: vzeroupper3503; KNL-NEXT: retq3504;3505; SKX-LABEL: allzeros_v8f32_nnan:3506; SKX: # %bb.0:3507; SKX-NEXT: vxorps %xmm1, %xmm1, %xmm13508; SKX-NEXT: vcmpneqps %ymm1, %ymm0, %k03509; SKX-NEXT: kortestb %k0, %k03510; SKX-NEXT: setne %al3511; SKX-NEXT: vzeroupper3512; SKX-NEXT: retq3513 %1 = fcmp nnan une <8 x float> %a0, zeroinitializer3514 %2 = bitcast <8 x i1> %1 to i83515 %3 = icmp ne i8 %2, 03516 ret i1 %33517}3518 3519; The below are IR patterns that should directly represent the behavior of a3520; MOVMSK instruction.3521 3522define i32 @movmskpd(<2 x double> %x) {3523; SSE-LABEL: movmskpd:3524; SSE: # %bb.0:3525; SSE-NEXT: movmskpd %xmm0, %eax3526; SSE-NEXT: retq3527;3528; AVX-LABEL: movmskpd:3529; AVX: # %bb.0:3530; AVX-NEXT: vmovmskpd %xmm0, %eax3531; AVX-NEXT: retq3532 %a = bitcast <2 x double> %x to <2 x i64>3533 %b = icmp slt <2 x i64> %a, zeroinitializer3534 %c = bitcast <2 x i1> %b to i23535 %d = zext i2 %c to i323536 ret i32 %d3537}3538 3539define i32 @movmskps(<4 x float> %x) {3540; SSE-LABEL: movmskps:3541; SSE: # %bb.0:3542; SSE-NEXT: movmskps %xmm0, %eax3543; SSE-NEXT: retq3544;3545; AVX-LABEL: movmskps:3546; AVX: # %bb.0:3547; AVX-NEXT: vmovmskps %xmm0, %eax3548; AVX-NEXT: retq3549 %a = bitcast <4 x float> %x to <4 x i32>3550 %b = icmp slt <4 x i32> %a, zeroinitializer3551 %c = bitcast <4 x i1> %b to i43552 %d = zext i4 %c to i323553 ret i32 %d3554}3555 3556define i32 @movmskpd256(<4 x double> %x) {3557; SSE-LABEL: movmskpd256:3558; SSE: # %bb.0:3559; SSE-NEXT: shufps {{.*#+}} xmm0 = xmm0[1,3],xmm1[1,3]3560; SSE-NEXT: movmskps %xmm0, %eax3561; SSE-NEXT: retq3562;3563; AVX-LABEL: movmskpd256:3564; AVX: # %bb.0:3565; AVX-NEXT: vmovmskpd %ymm0, %eax3566; AVX-NEXT: vzeroupper3567; AVX-NEXT: retq3568 %a = bitcast <4 x double> %x to <4 x i64>3569 %b = icmp slt <4 x i64> %a, zeroinitializer3570 %c = bitcast <4 x i1> %b to i43571 %d = zext i4 %c to i323572 ret i32 %d3573}3574 3575define i32 @movmskps256(<8 x float> %x) {3576; SSE-LABEL: movmskps256:3577; SSE: # %bb.0:3578; SSE-NEXT: packssdw %xmm1, %xmm03579; SSE-NEXT: packsswb %xmm0, %xmm03580; SSE-NEXT: pmovmskb %xmm0, %eax3581; SSE-NEXT: movzbl %al, %eax3582; SSE-NEXT: retq3583;3584; AVX-LABEL: movmskps256:3585; AVX: # %bb.0:3586; AVX-NEXT: vmovmskps %ymm0, %eax3587; AVX-NEXT: vzeroupper3588; AVX-NEXT: retq3589 %a = bitcast <8 x float> %x to <8 x i32>3590 %b = icmp slt <8 x i32> %a, zeroinitializer3591 %c = bitcast <8 x i1> %b to i83592 %d = zext i8 %c to i323593 ret i32 %d3594}3595 3596define i32 @movmskb(<16 x i8> %x) {3597; SSE-LABEL: movmskb:3598; SSE: # %bb.0:3599; SSE-NEXT: pmovmskb %xmm0, %eax3600; SSE-NEXT: retq3601;3602; AVX-LABEL: movmskb:3603; AVX: # %bb.0:3604; AVX-NEXT: vpmovmskb %xmm0, %eax3605; AVX-NEXT: retq3606 %a = icmp slt <16 x i8> %x, zeroinitializer3607 %b = bitcast <16 x i1> %a to i163608 %c = zext i16 %b to i323609 ret i32 %c3610}3611 3612define i32 @movmskb256(<32 x i8> %x) {3613; SSE-LABEL: movmskb256:3614; SSE: # %bb.0:3615; SSE-NEXT: pmovmskb %xmm0, %ecx3616; SSE-NEXT: pmovmskb %xmm1, %eax3617; SSE-NEXT: shll $16, %eax3618; SSE-NEXT: orl %ecx, %eax3619; SSE-NEXT: retq3620;3621; AVX1-LABEL: movmskb256:3622; AVX1: # %bb.0:3623; AVX1-NEXT: vpmovmskb %xmm0, %ecx3624; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm03625; AVX1-NEXT: vpmovmskb %xmm0, %eax3626; AVX1-NEXT: shll $16, %eax3627; AVX1-NEXT: orl %ecx, %eax3628; AVX1-NEXT: vzeroupper3629; AVX1-NEXT: retq3630;3631; AVX2-LABEL: movmskb256:3632; AVX2: # %bb.0:3633; AVX2-NEXT: vpmovmskb %ymm0, %eax3634; AVX2-NEXT: vzeroupper3635; AVX2-NEXT: retq3636;3637; AVX512-LABEL: movmskb256:3638; AVX512: # %bb.0:3639; AVX512-NEXT: vpmovmskb %ymm0, %eax3640; AVX512-NEXT: vzeroupper3641; AVX512-NEXT: retq3642 %a = icmp slt <32 x i8> %x, zeroinitializer3643 %b = bitcast <32 x i1> %a to i323644 ret i32 %b3645}3646 3647; Multiple extract elements from a vector compare.3648 3649define i1 @movmsk_v16i8(<16 x i8> %x, <16 x i8> %y) {3650; SSE-LABEL: movmsk_v16i8:3651; SSE: # %bb.0:3652; SSE-NEXT: pcmpeqb %xmm1, %xmm03653; SSE-NEXT: pmovmskb %xmm0, %eax3654; SSE-NEXT: movl %eax, %ecx3655; SSE-NEXT: shrl $15, %ecx3656; SSE-NEXT: movl %eax, %edx3657; SSE-NEXT: shrl $8, %edx3658; SSE-NEXT: andl $1, %edx3659; SSE-NEXT: andl $8, %eax3660; SSE-NEXT: shrl $3, %eax3661; SSE-NEXT: xorl %edx, %eax3662; SSE-NEXT: andl %ecx, %eax3663; SSE-NEXT: # kill: def $al killed $al killed $eax3664; SSE-NEXT: retq3665;3666; AVX1OR2-LABEL: movmsk_v16i8:3667; AVX1OR2: # %bb.0:3668; AVX1OR2-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm03669; AVX1OR2-NEXT: vpmovmskb %xmm0, %eax3670; AVX1OR2-NEXT: movl %eax, %ecx3671; AVX1OR2-NEXT: shrl $15, %ecx3672; AVX1OR2-NEXT: movl %eax, %edx3673; AVX1OR2-NEXT: shrl $8, %edx3674; AVX1OR2-NEXT: andl $1, %edx3675; AVX1OR2-NEXT: andl $8, %eax3676; AVX1OR2-NEXT: shrl $3, %eax3677; AVX1OR2-NEXT: xorl %edx, %eax3678; AVX1OR2-NEXT: andl %ecx, %eax3679; AVX1OR2-NEXT: # kill: def $al killed $al killed $eax3680; AVX1OR2-NEXT: retq3681;3682; KNL-LABEL: movmsk_v16i8:3683; KNL: # %bb.0:3684; KNL-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm03685; KNL-NEXT: vpextrb $15, %xmm0, %ecx3686; KNL-NEXT: vpextrb $8, %xmm0, %edx3687; KNL-NEXT: vpextrb $3, %xmm0, %eax3688; KNL-NEXT: xorl %edx, %eax3689; KNL-NEXT: andl %ecx, %eax3690; KNL-NEXT: # kill: def $al killed $al killed $eax3691; KNL-NEXT: retq3692;3693; SKX-LABEL: movmsk_v16i8:3694; SKX: # %bb.0:3695; SKX-NEXT: vpcmpeqb %xmm1, %xmm0, %k03696; SKX-NEXT: kshiftrw $15, %k0, %k13697; SKX-NEXT: kmovd %k1, %ecx3698; SKX-NEXT: kshiftrw $8, %k0, %k13699; SKX-NEXT: kmovd %k1, %edx3700; SKX-NEXT: kshiftrw $3, %k0, %k03701; SKX-NEXT: kmovd %k0, %eax3702; SKX-NEXT: xorb %dl, %al3703; SKX-NEXT: andb %cl, %al3704; SKX-NEXT: # kill: def $al killed $al killed $eax3705; SKX-NEXT: retq3706 %cmp = icmp eq <16 x i8> %x, %y3707 %e1 = extractelement <16 x i1> %cmp, i32 33708 %e2 = extractelement <16 x i1> %cmp, i32 83709 %e3 = extractelement <16 x i1> %cmp, i32 153710 %u1 = xor i1 %e1, %e23711 %u2 = and i1 %e3, %u13712 ret i1 %u23713}3714 3715define i1 @movmsk_v8i16(<8 x i16> %x, <8 x i16> %y) {3716; SSE-LABEL: movmsk_v8i16:3717; SSE: # %bb.0:3718; SSE-NEXT: pcmpgtw %xmm1, %xmm03719; SSE-NEXT: packsswb %xmm0, %xmm03720; SSE-NEXT: pmovmskb %xmm0, %eax3721; SSE-NEXT: notb %al3722; SSE-NEXT: testb $-109, %al3723; SSE-NEXT: sete %al3724; SSE-NEXT: retq3725;3726; AVX1OR2-LABEL: movmsk_v8i16:3727; AVX1OR2: # %bb.0:3728; AVX1OR2-NEXT: vpcmpgtw %xmm1, %xmm0, %xmm03729; AVX1OR2-NEXT: vpacksswb %xmm0, %xmm0, %xmm03730; AVX1OR2-NEXT: vpmovmskb %xmm0, %eax3731; AVX1OR2-NEXT: notb %al3732; AVX1OR2-NEXT: testb $-109, %al3733; AVX1OR2-NEXT: sete %al3734; AVX1OR2-NEXT: retq3735;3736; KNL-LABEL: movmsk_v8i16:3737; KNL: # %bb.0:3738; KNL-NEXT: vpcmpgtw %xmm1, %xmm0, %xmm03739; KNL-NEXT: vpmovsxwq %xmm0, %zmm03740; KNL-NEXT: vptestnmq %zmm0, %zmm0, %k03741; KNL-NEXT: kmovw %k0, %eax3742; KNL-NEXT: testb $-109, %al3743; KNL-NEXT: sete %al3744; KNL-NEXT: vzeroupper3745; KNL-NEXT: retq3746;3747; SKX-LABEL: movmsk_v8i16:3748; SKX: # %bb.0:3749; SKX-NEXT: vpcmpgtw %xmm1, %xmm0, %k03750; SKX-NEXT: knotb %k0, %k03751; SKX-NEXT: kmovd %k0, %eax3752; SKX-NEXT: testb $-109, %al3753; SKX-NEXT: sete %al3754; SKX-NEXT: retq3755 %cmp = icmp sgt <8 x i16> %x, %y3756 %e1 = extractelement <8 x i1> %cmp, i32 03757 %e2 = extractelement <8 x i1> %cmp, i32 13758 %e3 = extractelement <8 x i1> %cmp, i32 73759 %e4 = extractelement <8 x i1> %cmp, i32 43760 %u1 = and i1 %e1, %e23761 %u2 = and i1 %e3, %e43762 %u3 = and i1 %u1, %u23763 ret i1 %u33764}3765 3766; TODO: Replace shift+mask chain with AND+CMP.3767define i1 @movmsk_v4i32(<4 x i32> %x, <4 x i32> %y) {3768; SSE-LABEL: movmsk_v4i32:3769; SSE: # %bb.0:3770; SSE-NEXT: pcmpgtd %xmm0, %xmm13771; SSE-NEXT: movmskps %xmm1, %eax3772; SSE-NEXT: movl %eax, %ecx3773; SSE-NEXT: shrb $3, %cl3774; SSE-NEXT: andb $4, %al3775; SSE-NEXT: shrb $2, %al3776; SSE-NEXT: xorb %cl, %al3777; SSE-NEXT: # kill: def $al killed $al killed $eax3778; SSE-NEXT: retq3779;3780; AVX1OR2-LABEL: movmsk_v4i32:3781; AVX1OR2: # %bb.0:3782; AVX1OR2-NEXT: vpcmpgtd %xmm0, %xmm1, %xmm03783; AVX1OR2-NEXT: vmovmskps %xmm0, %eax3784; AVX1OR2-NEXT: movl %eax, %ecx3785; AVX1OR2-NEXT: shrb $3, %cl3786; AVX1OR2-NEXT: andb $4, %al3787; AVX1OR2-NEXT: shrb $2, %al3788; AVX1OR2-NEXT: xorb %cl, %al3789; AVX1OR2-NEXT: # kill: def $al killed $al killed $eax3790; AVX1OR2-NEXT: retq3791;3792; KNL-LABEL: movmsk_v4i32:3793; KNL: # %bb.0:3794; KNL-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm13795; KNL-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm03796; KNL-NEXT: vpcmpgtd %zmm0, %zmm1, %k03797; KNL-NEXT: kshiftrw $3, %k0, %k13798; KNL-NEXT: kmovw %k1, %ecx3799; KNL-NEXT: kshiftrw $2, %k0, %k03800; KNL-NEXT: kmovw %k0, %eax3801; KNL-NEXT: xorb %cl, %al3802; KNL-NEXT: # kill: def $al killed $al killed $eax3803; KNL-NEXT: vzeroupper3804; KNL-NEXT: retq3805;3806; SKX-LABEL: movmsk_v4i32:3807; SKX: # %bb.0:3808; SKX-NEXT: vpcmpgtd %xmm0, %xmm1, %k03809; SKX-NEXT: kshiftrb $3, %k0, %k13810; SKX-NEXT: kmovd %k1, %ecx3811; SKX-NEXT: kshiftrb $2, %k0, %k03812; SKX-NEXT: kmovd %k0, %eax3813; SKX-NEXT: xorb %cl, %al3814; SKX-NEXT: # kill: def $al killed $al killed $eax3815; SKX-NEXT: retq3816 %cmp = icmp slt <4 x i32> %x, %y3817 %e1 = extractelement <4 x i1> %cmp, i32 23818 %e2 = extractelement <4 x i1> %cmp, i32 33819 %u1 = xor i1 %e1, %e23820 ret i1 %u13821}3822 3823define i1 @movmsk_and_v2i64(<2 x i64> %x, <2 x i64> %y) {3824; SSE2-LABEL: movmsk_and_v2i64:3825; SSE2: # %bb.0:3826; SSE2-NEXT: pcmpeqd %xmm1, %xmm03827; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,0,3,2]3828; SSE2-NEXT: pand %xmm0, %xmm13829; SSE2-NEXT: movmskpd %xmm1, %eax3830; SSE2-NEXT: testl %eax, %eax3831; SSE2-NEXT: sete %al3832; SSE2-NEXT: retq3833;3834; SSE41-LABEL: movmsk_and_v2i64:3835; SSE41: # %bb.0:3836; SSE41-NEXT: pcmpeqq %xmm1, %xmm03837; SSE41-NEXT: movmskpd %xmm0, %eax3838; SSE41-NEXT: testl %eax, %eax3839; SSE41-NEXT: sete %al3840; SSE41-NEXT: retq3841;3842; AVX1OR2-LABEL: movmsk_and_v2i64:3843; AVX1OR2: # %bb.0:3844; AVX1OR2-NEXT: vpcmpeqq %xmm1, %xmm0, %xmm03845; AVX1OR2-NEXT: vtestpd %xmm0, %xmm03846; AVX1OR2-NEXT: sete %al3847; AVX1OR2-NEXT: retq3848;3849; KNL-LABEL: movmsk_and_v2i64:3850; KNL: # %bb.0:3851; KNL-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm13852; KNL-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm03853; KNL-NEXT: vpcmpeqq %zmm1, %zmm0, %k03854; KNL-NEXT: kmovw %k0, %eax3855; KNL-NEXT: testb $3, %al3856; KNL-NEXT: sete %al3857; KNL-NEXT: vzeroupper3858; KNL-NEXT: retq3859;3860; SKX-LABEL: movmsk_and_v2i64:3861; SKX: # %bb.0:3862; SKX-NEXT: vpcmpneqq %xmm1, %xmm0, %k03863; SKX-NEXT: kmovd %k0, %eax3864; SKX-NEXT: cmpb $3, %al3865; SKX-NEXT: sete %al3866; SKX-NEXT: retq3867 %cmp = icmp ne <2 x i64> %x, %y3868 %e1 = extractelement <2 x i1> %cmp, i32 03869 %e2 = extractelement <2 x i1> %cmp, i32 13870 %u1 = and i1 %e1, %e23871 ret i1 %u13872}3873 3874define i1 @movmsk_or_v2i64(<2 x i64> %x, <2 x i64> %y) {3875; SSE2-LABEL: movmsk_or_v2i64:3876; SSE2: # %bb.0:3877; SSE2-NEXT: pcmpeqd %xmm1, %xmm03878; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,0,3,2]3879; SSE2-NEXT: pand %xmm0, %xmm13880; SSE2-NEXT: movmskpd %xmm1, %eax3881; SSE2-NEXT: cmpl $3, %eax3882; SSE2-NEXT: setne %al3883; SSE2-NEXT: retq3884;3885; SSE41-LABEL: movmsk_or_v2i64:3886; SSE41: # %bb.0:3887; SSE41-NEXT: pxor %xmm1, %xmm03888; SSE41-NEXT: ptest %xmm0, %xmm03889; SSE41-NEXT: setne %al3890; SSE41-NEXT: retq3891;3892; AVX-LABEL: movmsk_or_v2i64:3893; AVX: # %bb.0:3894; AVX-NEXT: vpxor %xmm1, %xmm0, %xmm03895; AVX-NEXT: vptest %xmm0, %xmm03896; AVX-NEXT: setne %al3897; AVX-NEXT: retq3898 %cmp = icmp ne <2 x i64> %x, %y3899 %e1 = extractelement <2 x i1> %cmp, i32 03900 %e2 = extractelement <2 x i1> %cmp, i32 13901 %u1 = or i1 %e1, %e23902 ret i1 %u13903}3904 3905define i1 @movmsk_v4f32(<4 x float> %x, <4 x float> %y) {3906; SSE-LABEL: movmsk_v4f32:3907; SSE: # %bb.0:3908; SSE-NEXT: movaps %xmm0, %xmm23909; SSE-NEXT: cmpeqps %xmm1, %xmm23910; SSE-NEXT: cmpunordps %xmm1, %xmm03911; SSE-NEXT: orps %xmm2, %xmm03912; SSE-NEXT: movmskps %xmm0, %eax3913; SSE-NEXT: testb $14, %al3914; SSE-NEXT: setne %al3915; SSE-NEXT: retq3916;3917; AVX1OR2-LABEL: movmsk_v4f32:3918; AVX1OR2: # %bb.0:3919; AVX1OR2-NEXT: vcmpeq_uqps %xmm1, %xmm0, %xmm03920; AVX1OR2-NEXT: vmovmskps %xmm0, %eax3921; AVX1OR2-NEXT: testb $14, %al3922; AVX1OR2-NEXT: setne %al3923; AVX1OR2-NEXT: retq3924;3925; KNL-LABEL: movmsk_v4f32:3926; KNL: # %bb.0:3927; KNL-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm13928; KNL-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm03929; KNL-NEXT: vcmpeq_uqps %zmm1, %zmm0, %k03930; KNL-NEXT: kmovw %k0, %eax3931; KNL-NEXT: testb $14, %al3932; KNL-NEXT: setne %al3933; KNL-NEXT: vzeroupper3934; KNL-NEXT: retq3935;3936; SKX-LABEL: movmsk_v4f32:3937; SKX: # %bb.0:3938; SKX-NEXT: vcmpeq_uqps %xmm1, %xmm0, %k03939; SKX-NEXT: kmovd %k0, %eax3940; SKX-NEXT: testb $14, %al3941; SKX-NEXT: setne %al3942; SKX-NEXT: retq3943 %cmp = fcmp ueq <4 x float> %x, %y3944 %e1 = extractelement <4 x i1> %cmp, i32 13945 %e2 = extractelement <4 x i1> %cmp, i32 23946 %e3 = extractelement <4 x i1> %cmp, i32 33947 %u1 = or i1 %e1, %e23948 %u2 = or i1 %u1, %e33949 ret i1 %u23950}3951 3952define i1 @movmsk_and_v2f64(<2 x double> %x, <2 x double> %y) {3953; SSE-LABEL: movmsk_and_v2f64:3954; SSE: # %bb.0:3955; SSE-NEXT: cmplepd %xmm0, %xmm13956; SSE-NEXT: movmskpd %xmm1, %eax3957; SSE-NEXT: cmpl $3, %eax3958; SSE-NEXT: sete %al3959; SSE-NEXT: retq3960;3961; AVX1OR2-LABEL: movmsk_and_v2f64:3962; AVX1OR2: # %bb.0:3963; AVX1OR2-NEXT: vcmplepd %xmm0, %xmm1, %xmm03964; AVX1OR2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm13965; AVX1OR2-NEXT: vtestpd %xmm1, %xmm03966; AVX1OR2-NEXT: setb %al3967; AVX1OR2-NEXT: retq3968;3969; KNL-LABEL: movmsk_and_v2f64:3970; KNL: # %bb.0:3971; KNL-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm13972; KNL-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm03973; KNL-NEXT: vcmplepd %zmm0, %zmm1, %k03974; KNL-NEXT: knotw %k0, %k03975; KNL-NEXT: kmovw %k0, %eax3976; KNL-NEXT: testb $3, %al3977; KNL-NEXT: sete %al3978; KNL-NEXT: vzeroupper3979; KNL-NEXT: retq3980;3981; SKX-LABEL: movmsk_and_v2f64:3982; SKX: # %bb.0:3983; SKX-NEXT: vcmplepd %xmm0, %xmm1, %k03984; SKX-NEXT: kmovd %k0, %eax3985; SKX-NEXT: cmpb $3, %al3986; SKX-NEXT: sete %al3987; SKX-NEXT: retq3988 %cmp = fcmp oge <2 x double> %x, %y3989 %e1 = extractelement <2 x i1> %cmp, i32 03990 %e2 = extractelement <2 x i1> %cmp, i32 13991 %u1 = and i1 %e1, %e23992 ret i1 %u13993}3994 3995define i1 @movmsk_or_v2f64(<2 x double> %x, <2 x double> %y) {3996; SSE-LABEL: movmsk_or_v2f64:3997; SSE: # %bb.0:3998; SSE-NEXT: cmplepd %xmm0, %xmm13999; SSE-NEXT: movmskpd %xmm1, %eax4000; SSE-NEXT: testl %eax, %eax4001; SSE-NEXT: setne %al4002; SSE-NEXT: retq4003;4004; AVX1OR2-LABEL: movmsk_or_v2f64:4005; AVX1OR2: # %bb.0:4006; AVX1OR2-NEXT: vcmplepd %xmm0, %xmm1, %xmm04007; AVX1OR2-NEXT: vtestpd %xmm0, %xmm04008; AVX1OR2-NEXT: setne %al4009; AVX1OR2-NEXT: retq4010;4011; KNL-LABEL: movmsk_or_v2f64:4012; KNL: # %bb.0:4013; KNL-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm14014; KNL-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm04015; KNL-NEXT: vcmplepd %zmm0, %zmm1, %k04016; KNL-NEXT: kmovw %k0, %eax4017; KNL-NEXT: testb $3, %al4018; KNL-NEXT: setne %al4019; KNL-NEXT: vzeroupper4020; KNL-NEXT: retq4021;4022; SKX-LABEL: movmsk_or_v2f64:4023; SKX: # %bb.0:4024; SKX-NEXT: vcmplepd %xmm0, %xmm1, %k04025; SKX-NEXT: kortestb %k0, %k04026; SKX-NEXT: setne %al4027; SKX-NEXT: retq4028 %cmp = fcmp oge <2 x double> %x, %y4029 %e1 = extractelement <2 x i1> %cmp, i32 04030 %e2 = extractelement <2 x i1> %cmp, i32 14031 %u1 = or i1 %e1, %e24032 ret i1 %u14033}4034 4035; Extract elements from a non-constant index.4036 4037define i1 @movmsk_v16i8_var(<16 x i8> %x, <16 x i8> %y, i32 %z) {4038; SSE-LABEL: movmsk_v16i8_var:4039; SSE: # %bb.0:4040; SSE-NEXT: pcmpeqb %xmm1, %xmm04041; SSE-NEXT: pmovmskb %xmm0, %eax4042; SSE-NEXT: btl %edi, %eax4043; SSE-NEXT: setb %al4044; SSE-NEXT: retq4045;4046; AVX1OR2-LABEL: movmsk_v16i8_var:4047; AVX1OR2: # %bb.0:4048; AVX1OR2-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm04049; AVX1OR2-NEXT: vpmovmskb %xmm0, %eax4050; AVX1OR2-NEXT: btl %edi, %eax4051; AVX1OR2-NEXT: setb %al4052; AVX1OR2-NEXT: retq4053;4054; KNL-LABEL: movmsk_v16i8_var:4055; KNL: # %bb.0:4056; KNL-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm04057; KNL-NEXT: vpmovmskb %xmm0, %eax4058; KNL-NEXT: btl %edi, %eax4059; KNL-NEXT: setb %al4060; KNL-NEXT: retq4061;4062; SKX-LABEL: movmsk_v16i8_var:4063; SKX: # %bb.0:4064; SKX-NEXT: # kill: def $edi killed $edi def $rdi4065; SKX-NEXT: vpcmpeqb %xmm1, %xmm0, %k04066; SKX-NEXT: vpmovm2b %k0, %xmm04067; SKX-NEXT: vmovdqa %xmm0, -{{[0-9]+}}(%rsp)4068; SKX-NEXT: andl $15, %edi4069; SKX-NEXT: movzbl -24(%rsp,%rdi), %eax4070; SKX-NEXT: retq4071 %cmp = icmp eq <16 x i8> %x, %y4072 %val = extractelement <16 x i1> %cmp, i32 %z4073 ret i1 %val4074}4075 4076define i1 @movmsk_v8i16_var(<8 x i16> %x, <8 x i16> %y, i32 %z) {4077; SSE-LABEL: movmsk_v8i16_var:4078; SSE: # %bb.0:4079; SSE-NEXT: pcmpgtw %xmm1, %xmm04080; SSE-NEXT: packsswb %xmm0, %xmm04081; SSE-NEXT: pmovmskb %xmm0, %eax4082; SSE-NEXT: btl %edi, %eax4083; SSE-NEXT: setb %al4084; SSE-NEXT: retq4085;4086; AVX1OR2-LABEL: movmsk_v8i16_var:4087; AVX1OR2: # %bb.0:4088; AVX1OR2-NEXT: vpcmpgtw %xmm1, %xmm0, %xmm04089; AVX1OR2-NEXT: vpacksswb %xmm0, %xmm0, %xmm04090; AVX1OR2-NEXT: vpmovmskb %xmm0, %eax4091; AVX1OR2-NEXT: btl %edi, %eax4092; AVX1OR2-NEXT: setb %al4093; AVX1OR2-NEXT: retq4094;4095; KNL-LABEL: movmsk_v8i16_var:4096; KNL: # %bb.0:4097; KNL-NEXT: # kill: def $edi killed $edi def $rdi4098; KNL-NEXT: vpcmpgtw %xmm1, %xmm0, %xmm04099; KNL-NEXT: vpmovsxwq %xmm0, %zmm04100; KNL-NEXT: vptestmq %zmm0, %zmm0, %k14101; KNL-NEXT: vpternlogd {{.*#+}} zmm0 {%k1} {z} = -14102; KNL-NEXT: vpmovdw %zmm0, %ymm04103; KNL-NEXT: vmovdqa %xmm0, -{{[0-9]+}}(%rsp)4104; KNL-NEXT: andl $7, %edi4105; KNL-NEXT: movzbl -24(%rsp,%rdi,2), %eax4106; KNL-NEXT: vzeroupper4107; KNL-NEXT: retq4108;4109; SKX-LABEL: movmsk_v8i16_var:4110; SKX: # %bb.0:4111; SKX-NEXT: # kill: def $edi killed $edi def $rdi4112; SKX-NEXT: vpcmpgtw %xmm1, %xmm0, %k04113; SKX-NEXT: vpmovm2w %k0, %xmm04114; SKX-NEXT: vmovdqa %xmm0, -{{[0-9]+}}(%rsp)4115; SKX-NEXT: andl $7, %edi4116; SKX-NEXT: movzbl -24(%rsp,%rdi,2), %eax4117; SKX-NEXT: retq4118 %cmp = icmp sgt <8 x i16> %x, %y4119 %val = extractelement <8 x i1> %cmp, i32 %z4120 ret i1 %val4121}4122 4123define i1 @movmsk_v4i32_var(<4 x i32> %x, <4 x i32> %y, i32 %z) {4124; SSE-LABEL: movmsk_v4i32_var:4125; SSE: # %bb.0:4126; SSE-NEXT: pcmpgtd %xmm0, %xmm14127; SSE-NEXT: movmskps %xmm1, %eax4128; SSE-NEXT: btl %edi, %eax4129; SSE-NEXT: setb %al4130; SSE-NEXT: retq4131;4132; AVX1OR2-LABEL: movmsk_v4i32_var:4133; AVX1OR2: # %bb.0:4134; AVX1OR2-NEXT: vpcmpgtd %xmm0, %xmm1, %xmm04135; AVX1OR2-NEXT: vmovmskps %xmm0, %eax4136; AVX1OR2-NEXT: btl %edi, %eax4137; AVX1OR2-NEXT: setb %al4138; AVX1OR2-NEXT: retq4139;4140; KNL-LABEL: movmsk_v4i32_var:4141; KNL: # %bb.0:4142; KNL-NEXT: # kill: def $edi killed $edi def $rdi4143; KNL-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm14144; KNL-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm04145; KNL-NEXT: vpcmpgtd %zmm0, %zmm1, %k14146; KNL-NEXT: vpternlogd {{.*#+}} zmm0 {%k1} {z} = -14147; KNL-NEXT: vmovdqa %xmm0, -{{[0-9]+}}(%rsp)4148; KNL-NEXT: andl $3, %edi4149; KNL-NEXT: movzbl -24(%rsp,%rdi,4), %eax4150; KNL-NEXT: vzeroupper4151; KNL-NEXT: retq4152;4153; SKX-LABEL: movmsk_v4i32_var:4154; SKX: # %bb.0:4155; SKX-NEXT: # kill: def $edi killed $edi def $rdi4156; SKX-NEXT: vpcmpgtd %xmm0, %xmm1, %k04157; SKX-NEXT: vpmovm2d %k0, %xmm04158; SKX-NEXT: vmovdqa %xmm0, -{{[0-9]+}}(%rsp)4159; SKX-NEXT: andl $3, %edi4160; SKX-NEXT: movzbl -24(%rsp,%rdi,4), %eax4161; SKX-NEXT: retq4162 %cmp = icmp slt <4 x i32> %x, %y4163 %val = extractelement <4 x i1> %cmp, i32 %z4164 ret i1 %val4165}4166 4167define i1 @movmsk_v2i64_var(<2 x i64> %x, <2 x i64> %y, i32 %z) {4168; SSE2-LABEL: movmsk_v2i64_var:4169; SSE2: # %bb.0:4170; SSE2-NEXT: pcmpeqd %xmm1, %xmm04171; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,0,3,2]4172; SSE2-NEXT: pand %xmm0, %xmm14173; SSE2-NEXT: movmskpd %xmm1, %eax4174; SSE2-NEXT: xorl $3, %eax4175; SSE2-NEXT: btl %edi, %eax4176; SSE2-NEXT: setb %al4177; SSE2-NEXT: retq4178;4179; SSE41-LABEL: movmsk_v2i64_var:4180; SSE41: # %bb.0:4181; SSE41-NEXT: pcmpeqq %xmm1, %xmm04182; SSE41-NEXT: movmskpd %xmm0, %eax4183; SSE41-NEXT: xorl $3, %eax4184; SSE41-NEXT: btl %edi, %eax4185; SSE41-NEXT: setb %al4186; SSE41-NEXT: retq4187;4188; AVX1OR2-LABEL: movmsk_v2i64_var:4189; AVX1OR2: # %bb.0:4190; AVX1OR2-NEXT: vpcmpeqq %xmm1, %xmm0, %xmm04191; AVX1OR2-NEXT: vmovmskpd %xmm0, %eax4192; AVX1OR2-NEXT: xorl $3, %eax4193; AVX1OR2-NEXT: btl %edi, %eax4194; AVX1OR2-NEXT: setb %al4195; AVX1OR2-NEXT: retq4196;4197; KNL-LABEL: movmsk_v2i64_var:4198; KNL: # %bb.0:4199; KNL-NEXT: # kill: def $edi killed $edi def $rdi4200; KNL-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm14201; KNL-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm04202; KNL-NEXT: vpcmpneqq %zmm1, %zmm0, %k14203; KNL-NEXT: vpternlogq {{.*#+}} zmm0 {%k1} {z} = -14204; KNL-NEXT: vmovdqa %xmm0, -{{[0-9]+}}(%rsp)4205; KNL-NEXT: andl $1, %edi4206; KNL-NEXT: movzbl -24(%rsp,%rdi,8), %eax4207; KNL-NEXT: vzeroupper4208; KNL-NEXT: retq4209;4210; SKX-LABEL: movmsk_v2i64_var:4211; SKX: # %bb.0:4212; SKX-NEXT: # kill: def $edi killed $edi def $rdi4213; SKX-NEXT: vpcmpneqq %xmm1, %xmm0, %k04214; SKX-NEXT: vpmovm2q %k0, %xmm04215; SKX-NEXT: vmovdqa %xmm0, -{{[0-9]+}}(%rsp)4216; SKX-NEXT: andl $1, %edi4217; SKX-NEXT: movzbl -24(%rsp,%rdi,8), %eax4218; SKX-NEXT: retq4219 %cmp = icmp ne <2 x i64> %x, %y4220 %val = extractelement <2 x i1> %cmp, i32 %z4221 ret i1 %val4222}4223 4224define i1 @movmsk_v4f32_var(<4 x float> %x, <4 x float> %y, i32 %z) {4225; SSE-LABEL: movmsk_v4f32_var:4226; SSE: # %bb.0:4227; SSE-NEXT: movaps %xmm0, %xmm24228; SSE-NEXT: cmpeqps %xmm1, %xmm24229; SSE-NEXT: cmpunordps %xmm1, %xmm04230; SSE-NEXT: orps %xmm2, %xmm04231; SSE-NEXT: movmskps %xmm0, %eax4232; SSE-NEXT: btl %edi, %eax4233; SSE-NEXT: setb %al4234; SSE-NEXT: retq4235;4236; AVX1OR2-LABEL: movmsk_v4f32_var:4237; AVX1OR2: # %bb.0:4238; AVX1OR2-NEXT: vcmpeq_uqps %xmm1, %xmm0, %xmm04239; AVX1OR2-NEXT: vmovmskps %xmm0, %eax4240; AVX1OR2-NEXT: btl %edi, %eax4241; AVX1OR2-NEXT: setb %al4242; AVX1OR2-NEXT: retq4243;4244; KNL-LABEL: movmsk_v4f32_var:4245; KNL: # %bb.0:4246; KNL-NEXT: # kill: def $edi killed $edi def $rdi4247; KNL-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm14248; KNL-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm04249; KNL-NEXT: vcmpeq_uqps %zmm1, %zmm0, %k14250; KNL-NEXT: vpternlogd {{.*#+}} zmm0 {%k1} {z} = -14251; KNL-NEXT: vmovdqa %xmm0, -{{[0-9]+}}(%rsp)4252; KNL-NEXT: andl $3, %edi4253; KNL-NEXT: movzbl -24(%rsp,%rdi,4), %eax4254; KNL-NEXT: vzeroupper4255; KNL-NEXT: retq4256;4257; SKX-LABEL: movmsk_v4f32_var:4258; SKX: # %bb.0:4259; SKX-NEXT: # kill: def $edi killed $edi def $rdi4260; SKX-NEXT: vcmpeq_uqps %xmm1, %xmm0, %k04261; SKX-NEXT: vpmovm2d %k0, %xmm04262; SKX-NEXT: vmovdqa %xmm0, -{{[0-9]+}}(%rsp)4263; SKX-NEXT: andl $3, %edi4264; SKX-NEXT: movzbl -24(%rsp,%rdi,4), %eax4265; SKX-NEXT: retq4266 %cmp = fcmp ueq <4 x float> %x, %y4267 %val = extractelement <4 x i1> %cmp, i32 %z4268 ret i1 %val4269}4270 4271define i1 @movmsk_v2f64_var(<2 x double> %x, <2 x double> %y, i32 %z) {4272; SSE-LABEL: movmsk_v2f64_var:4273; SSE: # %bb.0:4274; SSE-NEXT: cmplepd %xmm0, %xmm14275; SSE-NEXT: movmskpd %xmm1, %eax4276; SSE-NEXT: btl %edi, %eax4277; SSE-NEXT: setb %al4278; SSE-NEXT: retq4279;4280; AVX1OR2-LABEL: movmsk_v2f64_var:4281; AVX1OR2: # %bb.0:4282; AVX1OR2-NEXT: vcmplepd %xmm0, %xmm1, %xmm04283; AVX1OR2-NEXT: vmovmskpd %xmm0, %eax4284; AVX1OR2-NEXT: btl %edi, %eax4285; AVX1OR2-NEXT: setb %al4286; AVX1OR2-NEXT: retq4287;4288; KNL-LABEL: movmsk_v2f64_var:4289; KNL: # %bb.0:4290; KNL-NEXT: # kill: def $edi killed $edi def $rdi4291; KNL-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm14292; KNL-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm04293; KNL-NEXT: vcmplepd %zmm0, %zmm1, %k14294; KNL-NEXT: vpternlogq {{.*#+}} zmm0 {%k1} {z} = -14295; KNL-NEXT: vmovdqa %xmm0, -{{[0-9]+}}(%rsp)4296; KNL-NEXT: andl $1, %edi4297; KNL-NEXT: movzbl -24(%rsp,%rdi,8), %eax4298; KNL-NEXT: vzeroupper4299; KNL-NEXT: retq4300;4301; SKX-LABEL: movmsk_v2f64_var:4302; SKX: # %bb.0:4303; SKX-NEXT: # kill: def $edi killed $edi def $rdi4304; SKX-NEXT: vcmplepd %xmm0, %xmm1, %k04305; SKX-NEXT: vpmovm2q %k0, %xmm04306; SKX-NEXT: vmovdqa %xmm0, -{{[0-9]+}}(%rsp)4307; SKX-NEXT: andl $1, %edi4308; SKX-NEXT: movzbl -24(%rsp,%rdi,8), %eax4309; SKX-NEXT: retq4310 %cmp = fcmp oge <2 x double> %x, %y4311 %val = extractelement <2 x i1> %cmp, i32 %z4312 ret i1 %val4313}4314 4315; TODO: We expect similar result as for PR39665_c_ray_opt,4316; but this is not the case in practice.4317define i32 @PR39665_c_ray(<2 x double> %x, <2 x double> %y) {4318; SSE-LABEL: PR39665_c_ray:4319; SSE: # %bb.0:4320; SSE-NEXT: cmpltpd %xmm0, %xmm14321; SSE-NEXT: movmskpd %xmm1, %ecx4322; SSE-NEXT: testb $2, %cl4323; SSE-NEXT: movl $42, %eax4324; SSE-NEXT: movl $99, %edx4325; SSE-NEXT: cmovel %edx, %eax4326; SSE-NEXT: testb $1, %cl4327; SSE-NEXT: cmovel %edx, %eax4328; SSE-NEXT: retq4329;4330; AVX1OR2-LABEL: PR39665_c_ray:4331; AVX1OR2: # %bb.0:4332; AVX1OR2-NEXT: vcmpltpd %xmm0, %xmm1, %xmm04333; AVX1OR2-NEXT: vmovmskpd %xmm0, %ecx4334; AVX1OR2-NEXT: testb $2, %cl4335; AVX1OR2-NEXT: movl $42, %eax4336; AVX1OR2-NEXT: movl $99, %edx4337; AVX1OR2-NEXT: cmovel %edx, %eax4338; AVX1OR2-NEXT: testb $1, %cl4339; AVX1OR2-NEXT: cmovel %edx, %eax4340; AVX1OR2-NEXT: retq4341;4342; KNL-LABEL: PR39665_c_ray:4343; KNL: # %bb.0:4344; KNL-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm14345; KNL-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm04346; KNL-NEXT: vcmpltpd %zmm0, %zmm1, %k04347; KNL-NEXT: kmovw %k0, %ecx4348; KNL-NEXT: testb $2, %cl4349; KNL-NEXT: movl $42, %eax4350; KNL-NEXT: movl $99, %edx4351; KNL-NEXT: cmovel %edx, %eax4352; KNL-NEXT: testb $1, %cl4353; KNL-NEXT: cmovel %edx, %eax4354; KNL-NEXT: vzeroupper4355; KNL-NEXT: retq4356;4357; SKX-LABEL: PR39665_c_ray:4358; SKX: # %bb.0:4359; SKX-NEXT: vcmpltpd %xmm0, %xmm1, %k04360; SKX-NEXT: kmovd %k0, %ecx4361; SKX-NEXT: testb $2, %cl4362; SKX-NEXT: movl $42, %eax4363; SKX-NEXT: movl $99, %edx4364; SKX-NEXT: cmovel %edx, %eax4365; SKX-NEXT: testb $1, %cl4366; SKX-NEXT: cmovel %edx, %eax4367; SKX-NEXT: retq4368 %cmp = fcmp ogt <2 x double> %x, %y4369 %e1 = extractelement <2 x i1> %cmp, i32 04370 %e2 = extractelement <2 x i1> %cmp, i32 14371 %u = and i1 %e1, %e24372 %r = select i1 %u, i32 42, i32 994373 ret i32 %r4374}4375 4376define i32 @PR39665_c_ray_opt(<2 x double> %x, <2 x double> %y) {4377; SSE-LABEL: PR39665_c_ray_opt:4378; SSE: # %bb.0:4379; SSE-NEXT: cmpltpd %xmm0, %xmm14380; SSE-NEXT: movmskpd %xmm1, %eax4381; SSE-NEXT: cmpl $3, %eax4382; SSE-NEXT: movl $42, %ecx4383; SSE-NEXT: movl $99, %eax4384; SSE-NEXT: cmovel %ecx, %eax4385; SSE-NEXT: retq4386;4387; AVX1OR2-LABEL: PR39665_c_ray_opt:4388; AVX1OR2: # %bb.0:4389; AVX1OR2-NEXT: vcmpltpd %xmm0, %xmm1, %xmm04390; AVX1OR2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm14391; AVX1OR2-NEXT: vtestpd %xmm1, %xmm04392; AVX1OR2-NEXT: movl $42, %ecx4393; AVX1OR2-NEXT: movl $99, %eax4394; AVX1OR2-NEXT: cmovbl %ecx, %eax4395; AVX1OR2-NEXT: retq4396;4397; KNL-LABEL: PR39665_c_ray_opt:4398; KNL: # %bb.0:4399; KNL-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm14400; KNL-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm04401; KNL-NEXT: vcmpltpd %zmm0, %zmm1, %k04402; KNL-NEXT: knotw %k0, %k04403; KNL-NEXT: kmovw %k0, %eax4404; KNL-NEXT: testb $3, %al4405; KNL-NEXT: movl $42, %ecx4406; KNL-NEXT: movl $99, %eax4407; KNL-NEXT: cmovel %ecx, %eax4408; KNL-NEXT: vzeroupper4409; KNL-NEXT: retq4410;4411; SKX-LABEL: PR39665_c_ray_opt:4412; SKX: # %bb.0:4413; SKX-NEXT: vcmpltpd %xmm0, %xmm1, %k04414; SKX-NEXT: kmovd %k0, %eax4415; SKX-NEXT: cmpb $3, %al4416; SKX-NEXT: movl $42, %ecx4417; SKX-NEXT: movl $99, %eax4418; SKX-NEXT: cmovel %ecx, %eax4419; SKX-NEXT: retq4420 %cmp = fcmp ogt <2 x double> %x, %y4421 %shift = shufflevector <2 x i1> %cmp, <2 x i1> poison, <2 x i32> <i32 1, i32 undef>4422 %1 = and <2 x i1> %cmp, %shift4423 %u = extractelement <2 x i1> %1, i64 04424 %r = select i1 %u, i32 42, i32 994425 ret i32 %r4426}4427 4428define i32 @PR39665_c_ray_select(<2 x double> %x, <2 x double> %y) {4429; SSE-LABEL: PR39665_c_ray_select:4430; SSE: # %bb.0:4431; SSE-NEXT: cmpltpd %xmm0, %xmm14432; SSE-NEXT: movmskpd %xmm1, %eax4433; SSE-NEXT: cmpl $3, %eax4434; SSE-NEXT: movl $42, %ecx4435; SSE-NEXT: movl $99, %eax4436; SSE-NEXT: cmovel %ecx, %eax4437; SSE-NEXT: retq4438;4439; AVX1OR2-LABEL: PR39665_c_ray_select:4440; AVX1OR2: # %bb.0:4441; AVX1OR2-NEXT: vcmpltpd %xmm0, %xmm1, %xmm04442; AVX1OR2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm14443; AVX1OR2-NEXT: vtestpd %xmm1, %xmm04444; AVX1OR2-NEXT: movl $42, %ecx4445; AVX1OR2-NEXT: movl $99, %eax4446; AVX1OR2-NEXT: cmovbl %ecx, %eax4447; AVX1OR2-NEXT: retq4448;4449; KNL-LABEL: PR39665_c_ray_select:4450; KNL: # %bb.0:4451; KNL-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm14452; KNL-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm04453; KNL-NEXT: vcmpltpd %zmm0, %zmm1, %k04454; KNL-NEXT: knotw %k0, %k04455; KNL-NEXT: kmovw %k0, %eax4456; KNL-NEXT: testb $3, %al4457; KNL-NEXT: movl $42, %ecx4458; KNL-NEXT: movl $99, %eax4459; KNL-NEXT: cmovel %ecx, %eax4460; KNL-NEXT: vzeroupper4461; KNL-NEXT: retq4462;4463; SKX-LABEL: PR39665_c_ray_select:4464; SKX: # %bb.0:4465; SKX-NEXT: vcmpltpd %xmm0, %xmm1, %k04466; SKX-NEXT: knotw %k0, %k04467; SKX-NEXT: kmovd %k0, %eax4468; SKX-NEXT: testb $3, %al4469; SKX-NEXT: movl $42, %ecx4470; SKX-NEXT: movl $99, %eax4471; SKX-NEXT: cmovel %ecx, %eax4472; SKX-NEXT: retq4473 %cmp = fcmp fast ogt <2 x double> %x, %y4474 %b0 = extractelement <2 x i1> %cmp, i64 04475 %b1 = extractelement <2 x i1> %cmp, i64 14476 %b = select i1 %b0, i1 %b1, i1 false4477 %r = select i1 %b, i32 42, i32 994478 ret i32 %r4479}4480 4481define i32 @pr67287(<2 x i64> %broadcast.splatinsert25) {4482; SSE2-LABEL: pr67287:4483; SSE2: # %bb.0: # %entry4484; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm04485; SSE2-NEXT: pxor %xmm1, %xmm14486; SSE2-NEXT: pcmpeqd %xmm0, %xmm14487; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,0,3,2]4488; SSE2-NEXT: movmskpd %xmm0, %eax4489; SSE2-NEXT: testl %eax, %eax4490; SSE2-NEXT: setne %al4491; SSE2-NEXT: movd %xmm1, %ecx4492; SSE2-NEXT: orb %al, %cl4493; SSE2-NEXT: testb $1, %cl4494; SSE2-NEXT: je .LBB98_24495; SSE2-NEXT: # %bb.1:4496; SSE2-NEXT: movw $0, 04497; SSE2-NEXT: .LBB98_2: # %middle.block4498; SSE2-NEXT: xorl %eax, %eax4499; SSE2-NEXT: retq4500;4501; SSE41-LABEL: pr67287:4502; SSE41: # %bb.0: # %entry4503; SSE41-NEXT: pxor %xmm1, %xmm14504; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5],xmm1[6,7]4505; SSE41-NEXT: pcmpeqq %xmm1, %xmm04506; SSE41-NEXT: movmskpd %xmm0, %eax4507; SSE41-NEXT: testl %eax, %eax4508; SSE41-NEXT: setne %al4509; SSE41-NEXT: movd %xmm0, %ecx4510; SSE41-NEXT: orb %al, %cl4511; SSE41-NEXT: testb $1, %cl4512; SSE41-NEXT: je .LBB98_24513; SSE41-NEXT: # %bb.1:4514; SSE41-NEXT: movw $0, 04515; SSE41-NEXT: .LBB98_2: # %middle.block4516; SSE41-NEXT: xorl %eax, %eax4517; SSE41-NEXT: retq4518;4519; AVX1-LABEL: pr67287:4520; AVX1: # %bb.0: # %entry4521; AVX1-NEXT: vpxor %xmm1, %xmm1, %xmm14522; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5],xmm1[6,7]4523; AVX1-NEXT: vpcmpeqq %xmm1, %xmm0, %xmm04524; AVX1-NEXT: vtestpd %xmm0, %xmm04525; AVX1-NEXT: setne %al4526; AVX1-NEXT: vmovd %xmm0, %ecx4527; AVX1-NEXT: orb %al, %cl4528; AVX1-NEXT: testb $1, %cl4529; AVX1-NEXT: je .LBB98_24530; AVX1-NEXT: # %bb.1:4531; AVX1-NEXT: movw $0, 04532; AVX1-NEXT: .LBB98_2: # %middle.block4533; AVX1-NEXT: xorl %eax, %eax4534; AVX1-NEXT: retq4535;4536; AVX2-LABEL: pr67287:4537; AVX2: # %bb.0: # %entry4538; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm14539; AVX2-NEXT: vpblendd {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2],xmm1[3]4540; AVX2-NEXT: vpcmpeqq %xmm1, %xmm0, %xmm04541; AVX2-NEXT: vtestpd %xmm0, %xmm04542; AVX2-NEXT: setne %al4543; AVX2-NEXT: vmovd %xmm0, %ecx4544; AVX2-NEXT: orb %al, %cl4545; AVX2-NEXT: testb $1, %cl4546; AVX2-NEXT: je .LBB98_24547; AVX2-NEXT: # %bb.1:4548; AVX2-NEXT: movw $0, 04549; AVX2-NEXT: .LBB98_2: # %middle.block4550; AVX2-NEXT: xorl %eax, %eax4551; AVX2-NEXT: retq4552;4553; KNL-LABEL: pr67287:4554; KNL: # %bb.0: # %entry4555; KNL-NEXT: vpxor %xmm1, %xmm1, %xmm14556; KNL-NEXT: vpblendd {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2],xmm1[3]4557; KNL-NEXT: vptestnmq %zmm0, %zmm0, %k04558; KNL-NEXT: kmovw %k0, %eax4559; KNL-NEXT: kmovw %k0, %ecx4560; KNL-NEXT: testb $3, %cl4561; KNL-NEXT: setne %cl4562; KNL-NEXT: orb %cl, %al4563; KNL-NEXT: testb $1, %al4564; KNL-NEXT: je .LBB98_24565; KNL-NEXT: # %bb.1:4566; KNL-NEXT: movw $0, 04567; KNL-NEXT: .LBB98_2: # %middle.block4568; KNL-NEXT: xorl %eax, %eax4569; KNL-NEXT: vzeroupper4570; KNL-NEXT: retq4571;4572; SKX-LABEL: pr67287:4573; SKX: # %bb.0: # %entry4574; SKX-NEXT: vpxor %xmm1, %xmm1, %xmm14575; SKX-NEXT: vpblendd {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2],xmm1[3]4576; SKX-NEXT: vptestnmq %xmm0, %xmm0, %k04577; SKX-NEXT: kortestb %k0, %k04578; SKX-NEXT: setne %al4579; SKX-NEXT: kmovd %k0, %ecx4580; SKX-NEXT: orb %al, %cl4581; SKX-NEXT: testb $1, %cl4582; SKX-NEXT: je .LBB98_24583; SKX-NEXT: # %bb.1:4584; SKX-NEXT: movw $0, 04585; SKX-NEXT: .LBB98_2: # %middle.block4586; SKX-NEXT: xorl %eax, %eax4587; SKX-NEXT: retq4588entry:4589 %0 = and <2 x i64> %broadcast.splatinsert25, <i64 4294967295, i64 4294967295>4590 %1 = icmp eq <2 x i64> %0, zeroinitializer4591 %shift = shufflevector <2 x i1> %1, <2 x i1> zeroinitializer, <2 x i32> <i32 1, i32 poison>4592 %2 = or <2 x i1> %1, %shift4593 %3 = extractelement <2 x i1> %2, i64 04594 %4 = extractelement <2 x i1> %1, i64 04595 %5 = or i1 %3, %44596 br i1 %5, label %6, label %middle.block4597 45986: ; preds = %entry4599 store i16 0, ptr null, align 24600 br label %middle.block4601 4602middle.block: ; preds = %6, %entry4603 ret i32 04604}4605