1828 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=avx | FileCheck %s --check-prefixes=CHECK,AVX,AVX12,AVX13; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=avx2 | FileCheck %s --check-prefixes=CHECK,AVX,AVX12,AVX24; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=avx512f | FileCheck %s --check-prefixes=CHECK,AVX,AVX512,AVX512F5; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=avx512vl | FileCheck %s --check-prefixes=CHECK,AVX,AVX512,AVX512VL6; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=xop | FileCheck %s --check-prefixes=CHECK,XOP7 8; The condition vector for BLENDV* only cares about the sign bit of each element.9; So in these tests, if we generate BLENDV*, we should be able to remove the redundant cmp op.10 11; Test 128-bit vectors for all legal element types.12 13define <16 x i8> @signbit_sel_v16i8(<16 x i8> %x, <16 x i8> %y, <16 x i8> %mask) {14; CHECK-LABEL: signbit_sel_v16i8:15; CHECK: # %bb.0:16; CHECK-NEXT: vpblendvb %xmm2, %xmm0, %xmm1, %xmm017; CHECK-NEXT: retq18 %tr = icmp slt <16 x i8> %mask, zeroinitializer19 %z = select <16 x i1> %tr, <16 x i8> %x, <16 x i8> %y20 ret <16 x i8> %z21}22 23; Sorry 16-bit, you're not important enough to support?24 25define <8 x i16> @signbit_sel_v8i16(<8 x i16> %x, <8 x i16> %y, <8 x i16> %mask) {26; AVX12-LABEL: signbit_sel_v8i16:27; AVX12: # %bb.0:28; AVX12-NEXT: vpxor %xmm3, %xmm3, %xmm329; AVX12-NEXT: vpcmpgtw %xmm2, %xmm3, %xmm230; AVX12-NEXT: vpblendvb %xmm2, %xmm0, %xmm1, %xmm031; AVX12-NEXT: retq32;33; AVX512F-LABEL: signbit_sel_v8i16:34; AVX512F: # %bb.0:35; AVX512F-NEXT: vpxor %xmm3, %xmm3, %xmm336; AVX512F-NEXT: vpcmpgtw %xmm2, %xmm3, %xmm237; AVX512F-NEXT: vpblendvb %xmm2, %xmm0, %xmm1, %xmm038; AVX512F-NEXT: retq39;40; AVX512VL-LABEL: signbit_sel_v8i16:41; AVX512VL: # %bb.0:42; AVX512VL-NEXT: vpxor %xmm3, %xmm3, %xmm343; AVX512VL-NEXT: vpcmpgtw %xmm2, %xmm3, %xmm244; AVX512VL-NEXT: vpternlogq {{.*#+}} xmm0 = xmm1 ^ (xmm2 & (xmm0 ^ xmm1))45; AVX512VL-NEXT: retq46;47; XOP-LABEL: signbit_sel_v8i16:48; XOP: # %bb.0:49; XOP-NEXT: vpxor %xmm3, %xmm3, %xmm350; XOP-NEXT: vpcomltw %xmm3, %xmm2, %xmm251; XOP-NEXT: vpblendvb %xmm2, %xmm0, %xmm1, %xmm052; XOP-NEXT: retq53 %tr = icmp slt <8 x i16> %mask, zeroinitializer54 %z = select <8 x i1> %tr, <8 x i16> %x, <8 x i16> %y55 ret <8 x i16> %z56}57 58define <4 x i32> @signbit_sel_v4i32(<4 x i32> %x, <4 x i32> %y, <4 x i32> %mask) {59; AVX12-LABEL: signbit_sel_v4i32:60; AVX12: # %bb.0:61; AVX12-NEXT: vblendvps %xmm2, %xmm0, %xmm1, %xmm062; AVX12-NEXT: retq63;64; AVX512F-LABEL: signbit_sel_v4i32:65; AVX512F: # %bb.0:66; AVX512F-NEXT: # kill: def $xmm2 killed $xmm2 def $zmm267; AVX512F-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm168; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm069; AVX512F-NEXT: vpxor %xmm3, %xmm3, %xmm370; AVX512F-NEXT: vpcmpgtd %zmm2, %zmm3, %k171; AVX512F-NEXT: vpblendmd %zmm0, %zmm1, %zmm0 {%k1}72; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm073; AVX512F-NEXT: vzeroupper74; AVX512F-NEXT: retq75;76; AVX512VL-LABEL: signbit_sel_v4i32:77; AVX512VL: # %bb.0:78; AVX512VL-NEXT: vpxor %xmm3, %xmm3, %xmm379; AVX512VL-NEXT: vpcmpgtd %xmm2, %xmm3, %k180; AVX512VL-NEXT: vpblendmd %xmm0, %xmm1, %xmm0 {%k1}81; AVX512VL-NEXT: retq82;83; XOP-LABEL: signbit_sel_v4i32:84; XOP: # %bb.0:85; XOP-NEXT: vblendvps %xmm2, %xmm0, %xmm1, %xmm086; XOP-NEXT: retq87 %tr = icmp slt <4 x i32> %mask, zeroinitializer88 %z = select <4 x i1> %tr, <4 x i32> %x, <4 x i32> %y89 ret <4 x i32> %z90}91 92define <2 x i64> @signbit_sel_v2i64(<2 x i64> %x, <2 x i64> %y, <2 x i64> %mask) {93; AVX12-LABEL: signbit_sel_v2i64:94; AVX12: # %bb.0:95; AVX12-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm096; AVX12-NEXT: retq97;98; AVX512F-LABEL: signbit_sel_v2i64:99; AVX512F: # %bb.0:100; AVX512F-NEXT: # kill: def $xmm2 killed $xmm2 def $zmm2101; AVX512F-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1102; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0103; AVX512F-NEXT: vpxor %xmm3, %xmm3, %xmm3104; AVX512F-NEXT: vpcmpgtq %zmm2, %zmm3, %k1105; AVX512F-NEXT: vpblendmq %zmm0, %zmm1, %zmm0 {%k1}106; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm0107; AVX512F-NEXT: vzeroupper108; AVX512F-NEXT: retq109;110; AVX512VL-LABEL: signbit_sel_v2i64:111; AVX512VL: # %bb.0:112; AVX512VL-NEXT: vpxor %xmm3, %xmm3, %xmm3113; AVX512VL-NEXT: vpcmpgtq %xmm2, %xmm3, %k1114; AVX512VL-NEXT: vpblendmq %xmm0, %xmm1, %xmm0 {%k1}115; AVX512VL-NEXT: retq116;117; XOP-LABEL: signbit_sel_v2i64:118; XOP: # %bb.0:119; XOP-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0120; XOP-NEXT: retq121 %tr = icmp slt <2 x i64> %mask, zeroinitializer122 %z = select <2 x i1> %tr, <2 x i64> %x, <2 x i64> %y123 ret <2 x i64> %z124}125 126define <4 x float> @signbit_sel_v4f32(<4 x float> %x, <4 x float> %y, <4 x i32> %mask) {127; AVX12-LABEL: signbit_sel_v4f32:128; AVX12: # %bb.0:129; AVX12-NEXT: vblendvps %xmm2, %xmm0, %xmm1, %xmm0130; AVX12-NEXT: retq131;132; AVX512F-LABEL: signbit_sel_v4f32:133; AVX512F: # %bb.0:134; AVX512F-NEXT: # kill: def $xmm2 killed $xmm2 def $zmm2135; AVX512F-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1136; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0137; AVX512F-NEXT: vpxor %xmm3, %xmm3, %xmm3138; AVX512F-NEXT: vpcmpgtd %zmm2, %zmm3, %k1139; AVX512F-NEXT: vblendmps %zmm0, %zmm1, %zmm0 {%k1}140; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm0141; AVX512F-NEXT: vzeroupper142; AVX512F-NEXT: retq143;144; AVX512VL-LABEL: signbit_sel_v4f32:145; AVX512VL: # %bb.0:146; AVX512VL-NEXT: vpxor %xmm3, %xmm3, %xmm3147; AVX512VL-NEXT: vpcmpgtd %xmm2, %xmm3, %k1148; AVX512VL-NEXT: vblendmps %xmm0, %xmm1, %xmm0 {%k1}149; AVX512VL-NEXT: retq150;151; XOP-LABEL: signbit_sel_v4f32:152; XOP: # %bb.0:153; XOP-NEXT: vblendvps %xmm2, %xmm0, %xmm1, %xmm0154; XOP-NEXT: retq155 %tr = icmp slt <4 x i32> %mask, zeroinitializer156 %z = select <4 x i1> %tr, <4 x float> %x, <4 x float> %y157 ret <4 x float> %z158}159 160define <2 x double> @signbit_sel_v2f64(<2 x double> %x, <2 x double> %y, <2 x i64> %mask) {161; AVX12-LABEL: signbit_sel_v2f64:162; AVX12: # %bb.0:163; AVX12-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0164; AVX12-NEXT: retq165;166; AVX512F-LABEL: signbit_sel_v2f64:167; AVX512F: # %bb.0:168; AVX512F-NEXT: # kill: def $xmm2 killed $xmm2 def $zmm2169; AVX512F-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1170; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0171; AVX512F-NEXT: vpxor %xmm3, %xmm3, %xmm3172; AVX512F-NEXT: vpcmpgtq %zmm2, %zmm3, %k1173; AVX512F-NEXT: vblendmpd %zmm0, %zmm1, %zmm0 {%k1}174; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm0175; AVX512F-NEXT: vzeroupper176; AVX512F-NEXT: retq177;178; AVX512VL-LABEL: signbit_sel_v2f64:179; AVX512VL: # %bb.0:180; AVX512VL-NEXT: vpxor %xmm3, %xmm3, %xmm3181; AVX512VL-NEXT: vpcmpgtq %xmm2, %xmm3, %k1182; AVX512VL-NEXT: vblendmpd %xmm0, %xmm1, %xmm0 {%k1}183; AVX512VL-NEXT: retq184;185; XOP-LABEL: signbit_sel_v2f64:186; XOP: # %bb.0:187; XOP-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0188; XOP-NEXT: retq189 %tr = icmp slt <2 x i64> %mask, zeroinitializer190 %z = select <2 x i1> %tr, <2 x double> %x, <2 x double> %y191 ret <2 x double> %z192}193 194; Test 256-bit vectors to see differences between AVX1 and AVX2.195 196define <32 x i8> @signbit_sel_v32i8(<32 x i8> %x, <32 x i8> %y, <32 x i8> %mask) {197; AVX1-LABEL: signbit_sel_v32i8:198; AVX1: # %bb.0:199; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm3200; AVX1-NEXT: vpxor %xmm4, %xmm4, %xmm4201; AVX1-NEXT: vpcmpgtb %xmm3, %xmm4, %xmm3202; AVX1-NEXT: vpcmpgtb %xmm2, %xmm4, %xmm2203; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm2, %ymm2204; AVX1-NEXT: vandnps %ymm1, %ymm2, %ymm1205; AVX1-NEXT: vandps %ymm2, %ymm0, %ymm0206; AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0207; AVX1-NEXT: retq208;209; AVX2-LABEL: signbit_sel_v32i8:210; AVX2: # %bb.0:211; AVX2-NEXT: vpblendvb %ymm2, %ymm0, %ymm1, %ymm0212; AVX2-NEXT: retq213;214; AVX512-LABEL: signbit_sel_v32i8:215; AVX512: # %bb.0:216; AVX512-NEXT: vpblendvb %ymm2, %ymm0, %ymm1, %ymm0217; AVX512-NEXT: retq218;219; XOP-LABEL: signbit_sel_v32i8:220; XOP: # %bb.0:221; XOP-NEXT: vextractf128 $1, %ymm2, %xmm3222; XOP-NEXT: vpxor %xmm4, %xmm4, %xmm4223; XOP-NEXT: vpcomltb %xmm4, %xmm3, %xmm3224; XOP-NEXT: vpcomltb %xmm4, %xmm2, %xmm2225; XOP-NEXT: vinsertf128 $1, %xmm3, %ymm2, %ymm2226; XOP-NEXT: vpcmov %ymm2, %ymm1, %ymm0, %ymm0227; XOP-NEXT: retq228 %tr = icmp slt <32 x i8> %mask, zeroinitializer229 %z = select <32 x i1> %tr, <32 x i8> %x, <32 x i8> %y230 ret <32 x i8> %z231}232 233; Sorry 16-bit, you'll never be important enough to support?234 235define <16 x i16> @signbit_sel_v16i16(<16 x i16> %x, <16 x i16> %y, <16 x i16> %mask) {236; AVX1-LABEL: signbit_sel_v16i16:237; AVX1: # %bb.0:238; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm3239; AVX1-NEXT: vpxor %xmm4, %xmm4, %xmm4240; AVX1-NEXT: vpcmpgtw %xmm3, %xmm4, %xmm3241; AVX1-NEXT: vpcmpgtw %xmm2, %xmm4, %xmm2242; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm2, %ymm2243; AVX1-NEXT: vandnps %ymm1, %ymm2, %ymm1244; AVX1-NEXT: vandps %ymm2, %ymm0, %ymm0245; AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0246; AVX1-NEXT: retq247;248; AVX2-LABEL: signbit_sel_v16i16:249; AVX2: # %bb.0:250; AVX2-NEXT: vpxor %xmm3, %xmm3, %xmm3251; AVX2-NEXT: vpcmpgtw %ymm2, %ymm3, %ymm2252; AVX2-NEXT: vpblendvb %ymm2, %ymm0, %ymm1, %ymm0253; AVX2-NEXT: retq254;255; AVX512F-LABEL: signbit_sel_v16i16:256; AVX512F: # %bb.0:257; AVX512F-NEXT: vpxor %xmm3, %xmm3, %xmm3258; AVX512F-NEXT: vpcmpgtw %ymm2, %ymm3, %ymm2259; AVX512F-NEXT: vpblendvb %ymm2, %ymm0, %ymm1, %ymm0260; AVX512F-NEXT: retq261;262; AVX512VL-LABEL: signbit_sel_v16i16:263; AVX512VL: # %bb.0:264; AVX512VL-NEXT: vpxor %xmm3, %xmm3, %xmm3265; AVX512VL-NEXT: vpcmpgtw %ymm2, %ymm3, %ymm2266; AVX512VL-NEXT: vpternlogq {{.*#+}} ymm0 = ymm1 ^ (ymm2 & (ymm0 ^ ymm1))267; AVX512VL-NEXT: retq268;269; XOP-LABEL: signbit_sel_v16i16:270; XOP: # %bb.0:271; XOP-NEXT: vextractf128 $1, %ymm2, %xmm3272; XOP-NEXT: vpxor %xmm4, %xmm4, %xmm4273; XOP-NEXT: vpcomltw %xmm4, %xmm3, %xmm3274; XOP-NEXT: vpcomltw %xmm4, %xmm2, %xmm2275; XOP-NEXT: vinsertf128 $1, %xmm3, %ymm2, %ymm2276; XOP-NEXT: vpcmov %ymm2, %ymm1, %ymm0, %ymm0277; XOP-NEXT: retq278 %tr = icmp slt <16 x i16> %mask, zeroinitializer279 %z = select <16 x i1> %tr, <16 x i16> %x, <16 x i16> %y280 ret <16 x i16> %z281}282 283define <8 x i32> @signbit_sel_v8i32(<8 x i32> %x, <8 x i32> %y, <8 x i32> %mask) {284; AVX12-LABEL: signbit_sel_v8i32:285; AVX12: # %bb.0:286; AVX12-NEXT: vblendvps %ymm2, %ymm0, %ymm1, %ymm0287; AVX12-NEXT: retq288;289; AVX512F-LABEL: signbit_sel_v8i32:290; AVX512F: # %bb.0:291; AVX512F-NEXT: # kill: def $ymm2 killed $ymm2 def $zmm2292; AVX512F-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1293; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0294; AVX512F-NEXT: vpxor %xmm3, %xmm3, %xmm3295; AVX512F-NEXT: vpcmpgtd %zmm2, %zmm3, %k1296; AVX512F-NEXT: vpblendmd %zmm0, %zmm1, %zmm0 {%k1}297; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm0298; AVX512F-NEXT: retq299;300; AVX512VL-LABEL: signbit_sel_v8i32:301; AVX512VL: # %bb.0:302; AVX512VL-NEXT: vpxor %xmm3, %xmm3, %xmm3303; AVX512VL-NEXT: vpcmpgtd %ymm2, %ymm3, %k1304; AVX512VL-NEXT: vpblendmd %ymm0, %ymm1, %ymm0 {%k1}305; AVX512VL-NEXT: retq306;307; XOP-LABEL: signbit_sel_v8i32:308; XOP: # %bb.0:309; XOP-NEXT: vblendvps %ymm2, %ymm0, %ymm1, %ymm0310; XOP-NEXT: retq311 %tr = icmp slt <8 x i32> %mask, zeroinitializer312 %z = select <8 x i1> %tr, <8 x i32> %x, <8 x i32> %y313 ret <8 x i32> %z314}315 316define <4 x i64> @signbit_sel_v4i64(<4 x i64> %x, <4 x i64> %y, <4 x i64> %mask) {317; AVX12-LABEL: signbit_sel_v4i64:318; AVX12: # %bb.0:319; AVX12-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm0320; AVX12-NEXT: retq321;322; AVX512F-LABEL: signbit_sel_v4i64:323; AVX512F: # %bb.0:324; AVX512F-NEXT: # kill: def $ymm2 killed $ymm2 def $zmm2325; AVX512F-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1326; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0327; AVX512F-NEXT: vpxor %xmm3, %xmm3, %xmm3328; AVX512F-NEXT: vpcmpgtq %zmm2, %zmm3, %k1329; AVX512F-NEXT: vpblendmq %zmm0, %zmm1, %zmm0 {%k1}330; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm0331; AVX512F-NEXT: retq332;333; AVX512VL-LABEL: signbit_sel_v4i64:334; AVX512VL: # %bb.0:335; AVX512VL-NEXT: vpxor %xmm3, %xmm3, %xmm3336; AVX512VL-NEXT: vpcmpgtq %ymm2, %ymm3, %k1337; AVX512VL-NEXT: vpblendmq %ymm0, %ymm1, %ymm0 {%k1}338; AVX512VL-NEXT: retq339;340; XOP-LABEL: signbit_sel_v4i64:341; XOP: # %bb.0:342; XOP-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm0343; XOP-NEXT: retq344 %tr = icmp slt <4 x i64> %mask, zeroinitializer345 %z = select <4 x i1> %tr, <4 x i64> %x, <4 x i64> %y346 ret <4 x i64> %z347}348 349define <4 x double> @signbit_sel_v4f64(<4 x double> %x, <4 x double> %y, <4 x i64> %mask) {350; AVX12-LABEL: signbit_sel_v4f64:351; AVX12: # %bb.0:352; AVX12-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm0353; AVX12-NEXT: retq354;355; AVX512F-LABEL: signbit_sel_v4f64:356; AVX512F: # %bb.0:357; AVX512F-NEXT: # kill: def $ymm2 killed $ymm2 def $zmm2358; AVX512F-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1359; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0360; AVX512F-NEXT: vpxor %xmm3, %xmm3, %xmm3361; AVX512F-NEXT: vpcmpgtq %zmm2, %zmm3, %k1362; AVX512F-NEXT: vblendmpd %zmm0, %zmm1, %zmm0 {%k1}363; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm0364; AVX512F-NEXT: retq365;366; AVX512VL-LABEL: signbit_sel_v4f64:367; AVX512VL: # %bb.0:368; AVX512VL-NEXT: vpxor %xmm3, %xmm3, %xmm3369; AVX512VL-NEXT: vpcmpgtq %ymm2, %ymm3, %k1370; AVX512VL-NEXT: vblendmpd %ymm0, %ymm1, %ymm0 {%k1}371; AVX512VL-NEXT: retq372;373; XOP-LABEL: signbit_sel_v4f64:374; XOP: # %bb.0:375; XOP-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm0376; XOP-NEXT: retq377 %tr = icmp slt <4 x i64> %mask, zeroinitializer378 %z = select <4 x i1> %tr, <4 x double> %x, <4 x double> %y379 ret <4 x double> %z380}381 382; Try a condition with a different type than the select operands.383 384define <4 x double> @signbit_sel_v4f64_small_mask(<4 x double> %x, <4 x double> %y, <4 x i32> %mask) {385; AVX1-LABEL: signbit_sel_v4f64_small_mask:386; AVX1: # %bb.0:387; AVX1-NEXT: vpmovsxdq %xmm2, %xmm3388; AVX1-NEXT: vpshufd {{.*#+}} xmm2 = xmm2[2,3,2,3]389; AVX1-NEXT: vpmovsxdq %xmm2, %xmm2390; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm3, %ymm2391; AVX1-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm0392; AVX1-NEXT: retq393;394; AVX2-LABEL: signbit_sel_v4f64_small_mask:395; AVX2: # %bb.0:396; AVX2-NEXT: vpmovsxdq %xmm2, %ymm2397; AVX2-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm0398; AVX2-NEXT: retq399;400; AVX512F-LABEL: signbit_sel_v4f64_small_mask:401; AVX512F: # %bb.0:402; AVX512F-NEXT: # kill: def $xmm2 killed $xmm2 def $zmm2403; AVX512F-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1404; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0405; AVX512F-NEXT: vpxor %xmm3, %xmm3, %xmm3406; AVX512F-NEXT: vpcmpgtd %zmm2, %zmm3, %k1407; AVX512F-NEXT: vblendmpd %zmm0, %zmm1, %zmm0 {%k1}408; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm0409; AVX512F-NEXT: retq410;411; AVX512VL-LABEL: signbit_sel_v4f64_small_mask:412; AVX512VL: # %bb.0:413; AVX512VL-NEXT: vpxor %xmm3, %xmm3, %xmm3414; AVX512VL-NEXT: vpcmpgtd %xmm2, %xmm3, %k1415; AVX512VL-NEXT: vblendmpd %ymm0, %ymm1, %ymm0 {%k1}416; AVX512VL-NEXT: retq417;418; XOP-LABEL: signbit_sel_v4f64_small_mask:419; XOP: # %bb.0:420; XOP-NEXT: vpmovsxdq %xmm2, %xmm3421; XOP-NEXT: vpshufd {{.*#+}} xmm2 = xmm2[2,3,2,3]422; XOP-NEXT: vpmovsxdq %xmm2, %xmm2423; XOP-NEXT: vinsertf128 $1, %xmm2, %ymm3, %ymm2424; XOP-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm0425; XOP-NEXT: retq426 %tr = icmp slt <4 x i32> %mask, zeroinitializer427 %z = select <4 x i1> %tr, <4 x double> %x, <4 x double> %y428 ret <4 x double> %z429}430 431; Try a 512-bit vector to make sure AVX-512 is handled as expected.432 433define <8 x double> @signbit_sel_v8f64(<8 x double> %x, <8 x double> %y, <8 x i64> %mask) {434; AVX12-LABEL: signbit_sel_v8f64:435; AVX12: # %bb.0:436; AVX12-NEXT: vblendvpd %ymm4, %ymm0, %ymm2, %ymm0437; AVX12-NEXT: vblendvpd %ymm5, %ymm1, %ymm3, %ymm1438; AVX12-NEXT: retq439;440; AVX512-LABEL: signbit_sel_v8f64:441; AVX512: # %bb.0:442; AVX512-NEXT: vpxor %xmm3, %xmm3, %xmm3443; AVX512-NEXT: vpcmpgtq %zmm2, %zmm3, %k1444; AVX512-NEXT: vblendmpd %zmm0, %zmm1, %zmm0 {%k1}445; AVX512-NEXT: retq446;447; XOP-LABEL: signbit_sel_v8f64:448; XOP: # %bb.0:449; XOP-NEXT: vblendvpd %ymm4, %ymm0, %ymm2, %ymm0450; XOP-NEXT: vblendvpd %ymm5, %ymm1, %ymm3, %ymm1451; XOP-NEXT: retq452 %tr = icmp slt <8 x i64> %mask, zeroinitializer453 %z = select <8 x i1> %tr, <8 x double> %x, <8 x double> %y454 ret <8 x double> %z455}456 457; If we have a floating-point compare:458; (1) Don't die.459; (2) FIXME: If we don't care about signed-zero (and NaN?), the compare should still get folded.460 461define <4 x float> @signbit_sel_v4f32_fcmp(<4 x float> %x, <4 x float> %y, <4 x float> %mask) #0 {462; AVX12-LABEL: signbit_sel_v4f32_fcmp:463; AVX12: # %bb.0:464; AVX12-NEXT: vxorps %xmm2, %xmm2, %xmm2465; AVX12-NEXT: vcmpltps %xmm2, %xmm0, %xmm2466; AVX12-NEXT: vblendvps %xmm2, %xmm0, %xmm1, %xmm0467; AVX12-NEXT: retq468;469; AVX512F-LABEL: signbit_sel_v4f32_fcmp:470; AVX512F: # %bb.0:471; AVX512F-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1472; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0473; AVX512F-NEXT: vxorps %xmm2, %xmm2, %xmm2474; AVX512F-NEXT: vcmpltps %zmm2, %zmm0, %k1475; AVX512F-NEXT: vblendmps %zmm0, %zmm1, %zmm0 {%k1}476; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm0477; AVX512F-NEXT: vzeroupper478; AVX512F-NEXT: retq479;480; AVX512VL-LABEL: signbit_sel_v4f32_fcmp:481; AVX512VL: # %bb.0:482; AVX512VL-NEXT: vxorps %xmm2, %xmm2, %xmm2483; AVX512VL-NEXT: vcmpltps %xmm2, %xmm0, %k1484; AVX512VL-NEXT: vblendmps %xmm0, %xmm1, %xmm0 {%k1}485; AVX512VL-NEXT: retq486;487; XOP-LABEL: signbit_sel_v4f32_fcmp:488; XOP: # %bb.0:489; XOP-NEXT: vxorps %xmm2, %xmm2, %xmm2490; XOP-NEXT: vcmpltps %xmm2, %xmm0, %xmm2491; XOP-NEXT: vblendvps %xmm2, %xmm0, %xmm1, %xmm0492; XOP-NEXT: retq493 %cmp = fcmp olt <4 x float> %x, zeroinitializer494 %sel = select <4 x i1> %cmp, <4 x float> %x, <4 x float> %y495 ret <4 x float> %sel496}497 498define <4 x i64> @blend_splat1_mask_cond_v4i64(<4 x i64> %x, <4 x i64> %y, <4 x i64> %z) {499; AVX1-LABEL: blend_splat1_mask_cond_v4i64:500; AVX1: # %bb.0:501; AVX1-NEXT: vpsllq $63, %xmm0, %xmm3502; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0503; AVX1-NEXT: vpsllq $63, %xmm0, %xmm0504; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm3, %ymm0505; AVX1-NEXT: vblendvpd %ymm0, %ymm2, %ymm1, %ymm0506; AVX1-NEXT: retq507;508; AVX2-LABEL: blend_splat1_mask_cond_v4i64:509; AVX2: # %bb.0:510; AVX2-NEXT: vpsllq $63, %ymm0, %ymm0511; AVX2-NEXT: vblendvpd %ymm0, %ymm2, %ymm1, %ymm0512; AVX2-NEXT: retq513;514; AVX512F-LABEL: blend_splat1_mask_cond_v4i64:515; AVX512F: # %bb.0:516; AVX512F-NEXT: # kill: def $ymm2 killed $ymm2 def $zmm2517; AVX512F-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1518; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0519; AVX512F-NEXT: vptestnmq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %zmm0, %k1520; AVX512F-NEXT: vpblendmq %zmm1, %zmm2, %zmm0 {%k1}521; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm0522; AVX512F-NEXT: retq523;524; AVX512VL-LABEL: blend_splat1_mask_cond_v4i64:525; AVX512VL: # %bb.0:526; AVX512VL-NEXT: vptestnmq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %ymm0, %k1527; AVX512VL-NEXT: vpblendmq %ymm1, %ymm2, %ymm0 {%k1}528; AVX512VL-NEXT: retq529;530; XOP-LABEL: blend_splat1_mask_cond_v4i64:531; XOP: # %bb.0:532; XOP-NEXT: vextractf128 $1, %ymm0, %xmm3533; XOP-NEXT: vpsllq $63, %xmm3, %xmm3534; XOP-NEXT: vpmovsxbq {{.*#+}} xmm4 = [18446744073709551553,18446744073709551553]535; XOP-NEXT: vpshaq %xmm4, %xmm3, %xmm3536; XOP-NEXT: vpsllq $63, %xmm0, %xmm0537; XOP-NEXT: vpshaq %xmm4, %xmm0, %xmm0538; XOP-NEXT: vinsertf128 $1, %xmm3, %ymm0, %ymm0539; XOP-NEXT: vblendvpd %ymm0, %ymm2, %ymm1, %ymm0540; XOP-NEXT: retq541 %a = and <4 x i64> %x, <i64 1, i64 1, i64 1, i64 1>542 %c = icmp eq <4 x i64> %a, zeroinitializer543 %r = select <4 x i1> %c, <4 x i64> %y, <4 x i64> %z544 ret <4 x i64> %r545}546 547define <4 x i32> @blend_splat1_mask_cond_v4i32(<4 x i32> %x, <4 x i32> %y, <4 x i32> %z) {548; AVX12-LABEL: blend_splat1_mask_cond_v4i32:549; AVX12: # %bb.0:550; AVX12-NEXT: vpslld $31, %xmm0, %xmm0551; AVX12-NEXT: vblendvps %xmm0, %xmm2, %xmm1, %xmm0552; AVX12-NEXT: retq553;554; AVX512F-LABEL: blend_splat1_mask_cond_v4i32:555; AVX512F: # %bb.0:556; AVX512F-NEXT: # kill: def $xmm2 killed $xmm2 def $zmm2557; AVX512F-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1558; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0559; AVX512F-NEXT: vptestnmd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm0, %k1560; AVX512F-NEXT: vpblendmd %zmm1, %zmm2, %zmm0 {%k1}561; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm0562; AVX512F-NEXT: vzeroupper563; AVX512F-NEXT: retq564;565; AVX512VL-LABEL: blend_splat1_mask_cond_v4i32:566; AVX512VL: # %bb.0:567; AVX512VL-NEXT: vptestnmd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %k1568; AVX512VL-NEXT: vpblendmd %xmm1, %xmm2, %xmm0 {%k1}569; AVX512VL-NEXT: retq570;571; XOP-LABEL: blend_splat1_mask_cond_v4i32:572; XOP: # %bb.0:573; XOP-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0574; XOP-NEXT: vpxor %xmm3, %xmm3, %xmm3575; XOP-NEXT: vpcomneqd %xmm3, %xmm0, %xmm0576; XOP-NEXT: vblendvps %xmm0, %xmm2, %xmm1, %xmm0577; XOP-NEXT: retq578 %a = and <4 x i32> %x, <i32 1, i32 1, i32 1, i32 1>579 %c = icmp eq <4 x i32> %a, zeroinitializer580 %r = select <4 x i1> %c, <4 x i32> %y, <4 x i32> %z581 ret <4 x i32> %r582}583 584define <16 x i16> @blend_splat1_mask_cond_v16i16(<16 x i16> %x, <16 x i16> %y, <16 x i16> %z) {585; AVX1-LABEL: blend_splat1_mask_cond_v16i16:586; AVX1: # %bb.0:587; AVX1-NEXT: vpsllw $15, %xmm0, %xmm3588; AVX1-NEXT: vpsraw $15, %xmm3, %xmm3589; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0590; AVX1-NEXT: vpsllw $15, %xmm0, %xmm0591; AVX1-NEXT: vpsraw $15, %xmm0, %xmm0592; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm3, %ymm0593; AVX1-NEXT: vandnps %ymm1, %ymm0, %ymm1594; AVX1-NEXT: vandps %ymm0, %ymm2, %ymm0595; AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0596; AVX1-NEXT: retq597;598; AVX2-LABEL: blend_splat1_mask_cond_v16i16:599; AVX2: # %bb.0:600; AVX2-NEXT: vpsllw $15, %ymm0, %ymm0601; AVX2-NEXT: vpsraw $15, %ymm0, %ymm0602; AVX2-NEXT: vpblendvb %ymm0, %ymm2, %ymm1, %ymm0603; AVX2-NEXT: retq604;605; AVX512F-LABEL: blend_splat1_mask_cond_v16i16:606; AVX512F: # %bb.0:607; AVX512F-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0608; AVX512F-NEXT: vpxor %xmm3, %xmm3, %xmm3609; AVX512F-NEXT: vpcmpeqw %ymm3, %ymm0, %ymm0610; AVX512F-NEXT: vpblendvb %ymm0, %ymm1, %ymm2, %ymm0611; AVX512F-NEXT: retq612;613; AVX512VL-LABEL: blend_splat1_mask_cond_v16i16:614; AVX512VL: # %bb.0:615; AVX512VL-NEXT: vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm0, %ymm0616; AVX512VL-NEXT: vpxor %xmm3, %xmm3, %xmm3617; AVX512VL-NEXT: vpcmpeqw %ymm3, %ymm0, %ymm0618; AVX512VL-NEXT: vpternlogq {{.*#+}} ymm0 = ymm2 ^ (ymm0 & (ymm1 ^ ymm2))619; AVX512VL-NEXT: retq620;621; XOP-LABEL: blend_splat1_mask_cond_v16i16:622; XOP: # %bb.0:623; XOP-NEXT: vpsllw $15, %xmm0, %xmm3624; XOP-NEXT: vpsraw $15, %xmm3, %xmm3625; XOP-NEXT: vextractf128 $1, %ymm0, %xmm0626; XOP-NEXT: vpsllw $15, %xmm0, %xmm0627; XOP-NEXT: vpsraw $15, %xmm0, %xmm0628; XOP-NEXT: vinsertf128 $1, %xmm0, %ymm3, %ymm0629; XOP-NEXT: vpcmov %ymm0, %ymm1, %ymm2, %ymm0630; XOP-NEXT: retq631 %a = and <16 x i16> %x, <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>632 %c = icmp eq <16 x i16> %a, zeroinitializer633 %r = select <16 x i1> %c, <16 x i16> %y, <16 x i16> %z634 ret <16 x i16> %r635}636 637define <16 x i8> @blend_splat1_mask_cond_v16i8(<16 x i8> %x, <16 x i8> %y, <16 x i8> %z) {638; AVX12-LABEL: blend_splat1_mask_cond_v16i8:639; AVX12: # %bb.0:640; AVX12-NEXT: vpsllw $7, %xmm0, %xmm0641; AVX12-NEXT: vpblendvb %xmm0, %xmm2, %xmm1, %xmm0642; AVX12-NEXT: retq643;644; AVX512F-LABEL: blend_splat1_mask_cond_v16i8:645; AVX512F: # %bb.0:646; AVX512F-NEXT: vpbroadcastb {{.*#+}} xmm3 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]647; AVX512F-NEXT: vpand %xmm3, %xmm0, %xmm0648; AVX512F-NEXT: vpcmpeqb %xmm3, %xmm0, %xmm0649; AVX512F-NEXT: vpblendvb %xmm0, %xmm2, %xmm1, %xmm0650; AVX512F-NEXT: retq651;652; AVX512VL-LABEL: blend_splat1_mask_cond_v16i8:653; AVX512VL: # %bb.0:654; AVX512VL-NEXT: vpbroadcastd {{.*#+}} xmm3 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]655; AVX512VL-NEXT: vpand %xmm3, %xmm0, %xmm0656; AVX512VL-NEXT: vpcmpeqb %xmm3, %xmm0, %xmm0657; AVX512VL-NEXT: vpternlogq {{.*#+}} xmm0 = xmm1 ^ (xmm0 & (xmm2 ^ xmm1))658; AVX512VL-NEXT: retq659;660; XOP-LABEL: blend_splat1_mask_cond_v16i8:661; XOP: # %bb.0:662; XOP-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0663; XOP-NEXT: vpxor %xmm3, %xmm3, %xmm3664; XOP-NEXT: vpcomneqb %xmm3, %xmm0, %xmm0665; XOP-NEXT: vpblendvb %xmm0, %xmm2, %xmm1, %xmm0666; XOP-NEXT: retq667 %a = and <16 x i8> %x, <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>668 %c = icmp eq <16 x i8> %a, zeroinitializer669 %r = select <16 x i1> %c, <16 x i8> %y, <16 x i8> %z670 ret <16 x i8> %r671}672 673define <2 x i64> @blend_splatmax_mask_cond_v2i64(<2 x i64> %x, <2 x i64> %y, <2 x i64> %z) {674; AVX12-LABEL: blend_splatmax_mask_cond_v2i64:675; AVX12: # %bb.0:676; AVX12-NEXT: vblendvpd %xmm0, %xmm2, %xmm1, %xmm0677; AVX12-NEXT: retq678;679; AVX512F-LABEL: blend_splatmax_mask_cond_v2i64:680; AVX512F: # %bb.0:681; AVX512F-NEXT: # kill: def $xmm2 killed $xmm2 def $zmm2682; AVX512F-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1683; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0684; AVX512F-NEXT: vpbroadcastq {{.*#+}} xmm3 = [9223372036854775808,9223372036854775808]685; AVX512F-NEXT: vptestnmq %zmm3, %zmm0, %k1686; AVX512F-NEXT: vpblendmq %zmm1, %zmm2, %zmm0 {%k1}687; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm0688; AVX512F-NEXT: vzeroupper689; AVX512F-NEXT: retq690;691; AVX512VL-LABEL: blend_splatmax_mask_cond_v2i64:692; AVX512VL: # %bb.0:693; AVX512VL-NEXT: vptestnmq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to2}, %xmm0, %k1694; AVX512VL-NEXT: vpblendmq %xmm1, %xmm2, %xmm0 {%k1}695; AVX512VL-NEXT: retq696;697; XOP-LABEL: blend_splatmax_mask_cond_v2i64:698; XOP: # %bb.0:699; XOP-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0700; XOP-NEXT: vpxor %xmm3, %xmm3, %xmm3701; XOP-NEXT: vpcomneqq %xmm3, %xmm0, %xmm0702; XOP-NEXT: vblendvpd %xmm0, %xmm2, %xmm1, %xmm0703; XOP-NEXT: retq704 %a = and <2 x i64> %x, <i64 9223372036854775808, i64 9223372036854775808>705 %c = icmp eq <2 x i64> %a, zeroinitializer706 %r = select <2 x i1> %c, <2 x i64> %y, <2 x i64> %z707 ret <2 x i64> %r708}709 710define <8 x i32> @blend_splatmax_mask_cond_v8i32(<8 x i32> %x, <8 x i32> %y, <8 x i32> %z) {711; AVX12-LABEL: blend_splatmax_mask_cond_v8i32:712; AVX12: # %bb.0:713; AVX12-NEXT: vblendvps %ymm0, %ymm2, %ymm1, %ymm0714; AVX12-NEXT: retq715;716; AVX512F-LABEL: blend_splatmax_mask_cond_v8i32:717; AVX512F: # %bb.0:718; AVX512F-NEXT: # kill: def $ymm2 killed $ymm2 def $zmm2719; AVX512F-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1720; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0721; AVX512F-NEXT: vptestnmd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm0, %k1722; AVX512F-NEXT: vpblendmd %zmm1, %zmm2, %zmm0 {%k1}723; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm0724; AVX512F-NEXT: retq725;726; AVX512VL-LABEL: blend_splatmax_mask_cond_v8i32:727; AVX512VL: # %bb.0:728; AVX512VL-NEXT: vptestnmd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm0, %k1729; AVX512VL-NEXT: vpblendmd %ymm1, %ymm2, %ymm0 {%k1}730; AVX512VL-NEXT: retq731;732; XOP-LABEL: blend_splatmax_mask_cond_v8i32:733; XOP: # %bb.0:734; XOP-NEXT: vblendvps %ymm0, %ymm2, %ymm1, %ymm0735; XOP-NEXT: retq736 %a = and <8 x i32> %x, <i32 2147483648, i32 2147483648, i32 2147483648, i32 2147483648, i32 2147483648, i32 2147483648, i32 2147483648, i32 2147483648>737 %c = icmp eq <8 x i32> %a, zeroinitializer738 %r = select <8 x i1> %c, <8 x i32> %y, <8 x i32> %z739 ret <8 x i32> %r740}741 742define <8 x i16> @blend_splatmax_mask_cond_v8i16(<8 x i16> %x, <8 x i16> %y, <8 x i16> %z) {743; AVX12-LABEL: blend_splatmax_mask_cond_v8i16:744; AVX12: # %bb.0:745; AVX12-NEXT: vpsraw $15, %xmm0, %xmm0746; AVX12-NEXT: vpblendvb %xmm0, %xmm2, %xmm1, %xmm0747; AVX12-NEXT: retq748;749; AVX512F-LABEL: blend_splatmax_mask_cond_v8i16:750; AVX512F: # %bb.0:751; AVX512F-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0752; AVX512F-NEXT: vpxor %xmm3, %xmm3, %xmm3753; AVX512F-NEXT: vpcmpeqw %xmm3, %xmm0, %xmm0754; AVX512F-NEXT: vpblendvb %xmm0, %xmm1, %xmm2, %xmm0755; AVX512F-NEXT: retq756;757; AVX512VL-LABEL: blend_splatmax_mask_cond_v8i16:758; AVX512VL: # %bb.0:759; AVX512VL-NEXT: vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm0760; AVX512VL-NEXT: vpxor %xmm3, %xmm3, %xmm3761; AVX512VL-NEXT: vpcmpeqw %xmm3, %xmm0, %xmm0762; AVX512VL-NEXT: vpternlogq {{.*#+}} xmm0 = xmm2 ^ (xmm0 & (xmm1 ^ xmm2))763; AVX512VL-NEXT: retq764;765; XOP-LABEL: blend_splatmax_mask_cond_v8i16:766; XOP: # %bb.0:767; XOP-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0768; XOP-NEXT: vpxor %xmm3, %xmm3, %xmm3769; XOP-NEXT: vpcomneqw %xmm3, %xmm0, %xmm0770; XOP-NEXT: vpblendvb %xmm0, %xmm2, %xmm1, %xmm0771; XOP-NEXT: retq772 %a = and <8 x i16> %x, <i16 32768, i16 32768, i16 32768, i16 32768, i16 32768, i16 32768, i16 32768, i16 32768>773 %c = icmp eq <8 x i16> %a, zeroinitializer774 %r = select <8 x i1> %c, <8 x i16> %y, <8 x i16> %z775 ret <8 x i16> %r776}777 778define <32 x i8> @blend_splatmax_mask_cond_v32i8(<32 x i8> %x, <32 x i8> %y, <32 x i8> %z) {779; AVX1-LABEL: blend_splatmax_mask_cond_v32i8:780; AVX1: # %bb.0:781; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3782; AVX1-NEXT: vpxor %xmm4, %xmm4, %xmm4783; AVX1-NEXT: vpcmpgtb %xmm3, %xmm4, %xmm3784; AVX1-NEXT: vpcmpgtb %xmm0, %xmm4, %xmm0785; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm0, %ymm0786; AVX1-NEXT: vandnps %ymm1, %ymm0, %ymm1787; AVX1-NEXT: vandps %ymm0, %ymm2, %ymm0788; AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0789; AVX1-NEXT: retq790;791; AVX2-LABEL: blend_splatmax_mask_cond_v32i8:792; AVX2: # %bb.0:793; AVX2-NEXT: vpblendvb %ymm0, %ymm2, %ymm1, %ymm0794; AVX2-NEXT: retq795;796; AVX512F-LABEL: blend_splatmax_mask_cond_v32i8:797; AVX512F: # %bb.0:798; AVX512F-NEXT: vpbroadcastb {{.*#+}} ymm3 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128]799; AVX512F-NEXT: vpand %ymm3, %ymm0, %ymm0800; AVX512F-NEXT: vpcmpeqb %ymm3, %ymm0, %ymm0801; AVX512F-NEXT: vpblendvb %ymm0, %ymm2, %ymm1, %ymm0802; AVX512F-NEXT: retq803;804; AVX512VL-LABEL: blend_splatmax_mask_cond_v32i8:805; AVX512VL: # %bb.0:806; AVX512VL-NEXT: vpbroadcastd {{.*#+}} ymm3 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128]807; AVX512VL-NEXT: vpand %ymm3, %ymm0, %ymm0808; AVX512VL-NEXT: vpcmpeqb %ymm3, %ymm0, %ymm0809; AVX512VL-NEXT: vpternlogq {{.*#+}} ymm0 = ymm1 ^ (ymm0 & (ymm2 ^ ymm1))810; AVX512VL-NEXT: retq811;812; XOP-LABEL: blend_splatmax_mask_cond_v32i8:813; XOP: # %bb.0:814; XOP-NEXT: vextractf128 $1, %ymm0, %xmm3815; XOP-NEXT: vpxor %xmm4, %xmm4, %xmm4816; XOP-NEXT: vpcmpgtb %xmm3, %xmm4, %xmm3817; XOP-NEXT: vpcmpgtb %xmm0, %xmm4, %xmm0818; XOP-NEXT: vinsertf128 $1, %xmm3, %ymm0, %ymm0819; XOP-NEXT: vpcmov %ymm0, %ymm1, %ymm2, %ymm0820; XOP-NEXT: retq821 %a = and <32 x i8> %x, <i8 128, i8 128, i8 128, i8 128, i8 128, i8 128, i8 128, i8 128, i8 128, i8 128, i8 128, i8 128, i8 128, i8 128, i8 128, i8 128, i8 128, i8 128, i8 128, i8 128, i8 128, i8 128, i8 128, i8 128, i8 128, i8 128, i8 128, i8 128, i8 128, i8 128, i8 128, i8 128>822 %c = icmp eq <32 x i8> %a, zeroinitializer823 %r = select <32 x i1> %c, <32 x i8> %y, <32 x i8> %z824 ret <32 x i8> %r825}826 827define <4 x i64> @blend_splat_mask_cond_v4i64(<4 x i64> %x, <4 x i64> %y, <4 x i64> %z) {828; AVX1-LABEL: blend_splat_mask_cond_v4i64:829; AVX1: # %bb.0:830; AVX1-NEXT: vpsllq $62, %xmm0, %xmm3831; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0832; AVX1-NEXT: vpsllq $62, %xmm0, %xmm0833; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm3, %ymm0834; AVX1-NEXT: vblendvpd %ymm0, %ymm2, %ymm1, %ymm0835; AVX1-NEXT: retq836;837; AVX2-LABEL: blend_splat_mask_cond_v4i64:838; AVX2: # %bb.0:839; AVX2-NEXT: vpsllq $62, %ymm0, %ymm0840; AVX2-NEXT: vblendvpd %ymm0, %ymm2, %ymm1, %ymm0841; AVX2-NEXT: retq842;843; AVX512F-LABEL: blend_splat_mask_cond_v4i64:844; AVX512F: # %bb.0:845; AVX512F-NEXT: # kill: def $ymm2 killed $ymm2 def $zmm2846; AVX512F-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1847; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0848; AVX512F-NEXT: vptestnmq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %zmm0, %k1849; AVX512F-NEXT: vpblendmq %zmm1, %zmm2, %zmm0 {%k1}850; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm0851; AVX512F-NEXT: retq852;853; AVX512VL-LABEL: blend_splat_mask_cond_v4i64:854; AVX512VL: # %bb.0:855; AVX512VL-NEXT: vptestnmq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %ymm0, %k1856; AVX512VL-NEXT: vpblendmq %ymm1, %ymm2, %ymm0 {%k1}857; AVX512VL-NEXT: retq858;859; XOP-LABEL: blend_splat_mask_cond_v4i64:860; XOP: # %bb.0:861; XOP-NEXT: vextractf128 $1, %ymm0, %xmm3862; XOP-NEXT: vpsllq $62, %xmm3, %xmm3863; XOP-NEXT: vpmovsxbq {{.*#+}} xmm4 = [18446744073709551553,18446744073709551553]864; XOP-NEXT: vpshaq %xmm4, %xmm3, %xmm3865; XOP-NEXT: vpsllq $62, %xmm0, %xmm0866; XOP-NEXT: vpshaq %xmm4, %xmm0, %xmm0867; XOP-NEXT: vinsertf128 $1, %xmm3, %ymm0, %ymm0868; XOP-NEXT: vblendvpd %ymm0, %ymm2, %ymm1, %ymm0869; XOP-NEXT: retq870 %a = and <4 x i64> %x, <i64 2, i64 2, i64 2, i64 2>871 %c = icmp eq <4 x i64> %a, zeroinitializer872 %r = select <4 x i1> %c, <4 x i64> %y, <4 x i64> %z873 ret <4 x i64> %r874}875 876define <4 x i32> @blend_splat_mask_cond_v4i32(<4 x i32> %x, <4 x i32> %y, <4 x i32> %z) {877; AVX12-LABEL: blend_splat_mask_cond_v4i32:878; AVX12: # %bb.0:879; AVX12-NEXT: vpslld $15, %xmm0, %xmm0880; AVX12-NEXT: vblendvps %xmm0, %xmm2, %xmm1, %xmm0881; AVX12-NEXT: retq882;883; AVX512F-LABEL: blend_splat_mask_cond_v4i32:884; AVX512F: # %bb.0:885; AVX512F-NEXT: # kill: def $xmm2 killed $xmm2 def $zmm2886; AVX512F-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1887; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0888; AVX512F-NEXT: vptestnmd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm0, %k1889; AVX512F-NEXT: vpblendmd %zmm1, %zmm2, %zmm0 {%k1}890; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm0891; AVX512F-NEXT: vzeroupper892; AVX512F-NEXT: retq893;894; AVX512VL-LABEL: blend_splat_mask_cond_v4i32:895; AVX512VL: # %bb.0:896; AVX512VL-NEXT: vptestnmd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %k1897; AVX512VL-NEXT: vpblendmd %xmm1, %xmm2, %xmm0 {%k1}898; AVX512VL-NEXT: retq899;900; XOP-LABEL: blend_splat_mask_cond_v4i32:901; XOP: # %bb.0:902; XOP-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0903; XOP-NEXT: vpxor %xmm3, %xmm3, %xmm3904; XOP-NEXT: vpcomneqd %xmm3, %xmm0, %xmm0905; XOP-NEXT: vblendvps %xmm0, %xmm2, %xmm1, %xmm0906; XOP-NEXT: retq907 %a = and <4 x i32> %x, <i32 65536, i32 65536, i32 65536, i32 65536>908 %c = icmp eq <4 x i32> %a, zeroinitializer909 %r = select <4 x i1> %c, <4 x i32> %y, <4 x i32> %z910 ret <4 x i32> %r911}912 913define <16 x i16> @blend_splat_mask_cond_v16i16(<16 x i16> %x, <16 x i16> %y, <16 x i16> %z) {914; AVX1-LABEL: blend_splat_mask_cond_v16i16:915; AVX1: # %bb.0:916; AVX1-NEXT: vpsllw $5, %xmm0, %xmm3917; AVX1-NEXT: vpsraw $15, %xmm3, %xmm3918; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0919; AVX1-NEXT: vpsllw $5, %xmm0, %xmm0920; AVX1-NEXT: vpsraw $15, %xmm0, %xmm0921; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm3, %ymm0922; AVX1-NEXT: vandnps %ymm1, %ymm0, %ymm1923; AVX1-NEXT: vandps %ymm0, %ymm2, %ymm0924; AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0925; AVX1-NEXT: retq926;927; AVX2-LABEL: blend_splat_mask_cond_v16i16:928; AVX2: # %bb.0:929; AVX2-NEXT: vpsllw $5, %ymm0, %ymm0930; AVX2-NEXT: vpsraw $15, %ymm0, %ymm0931; AVX2-NEXT: vpblendvb %ymm0, %ymm2, %ymm1, %ymm0932; AVX2-NEXT: retq933;934; AVX512F-LABEL: blend_splat_mask_cond_v16i16:935; AVX512F: # %bb.0:936; AVX512F-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0937; AVX512F-NEXT: vpxor %xmm3, %xmm3, %xmm3938; AVX512F-NEXT: vpcmpeqw %ymm3, %ymm0, %ymm0939; AVX512F-NEXT: vpblendvb %ymm0, %ymm1, %ymm2, %ymm0940; AVX512F-NEXT: retq941;942; AVX512VL-LABEL: blend_splat_mask_cond_v16i16:943; AVX512VL: # %bb.0:944; AVX512VL-NEXT: vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm0, %ymm0945; AVX512VL-NEXT: vpxor %xmm3, %xmm3, %xmm3946; AVX512VL-NEXT: vpcmpeqw %ymm3, %ymm0, %ymm0947; AVX512VL-NEXT: vpternlogq {{.*#+}} ymm0 = ymm2 ^ (ymm0 & (ymm1 ^ ymm2))948; AVX512VL-NEXT: retq949;950; XOP-LABEL: blend_splat_mask_cond_v16i16:951; XOP: # %bb.0:952; XOP-NEXT: vpsllw $5, %xmm0, %xmm3953; XOP-NEXT: vpsraw $15, %xmm3, %xmm3954; XOP-NEXT: vextractf128 $1, %ymm0, %xmm0955; XOP-NEXT: vpsllw $5, %xmm0, %xmm0956; XOP-NEXT: vpsraw $15, %xmm0, %xmm0957; XOP-NEXT: vinsertf128 $1, %xmm0, %ymm3, %ymm0958; XOP-NEXT: vpcmov %ymm0, %ymm1, %ymm2, %ymm0959; XOP-NEXT: retq960 %a = and <16 x i16> %x, <i16 1024, i16 1024, i16 1024, i16 1024, i16 1024, i16 1024, i16 1024, i16 1024, i16 1024, i16 1024, i16 1024, i16 1024, i16 1024, i16 1024, i16 1024, i16 1024>961 %c = icmp eq <16 x i16> %a, zeroinitializer962 %r = select <16 x i1> %c, <16 x i16> %y, <16 x i16> %z963 ret <16 x i16> %r964}965 966define <16 x i8> @blend_splat_mask_cond_v16i8(<16 x i8> %x, <16 x i8> %y, <16 x i8> %z) {967; AVX12-LABEL: blend_splat_mask_cond_v16i8:968; AVX12: # %bb.0:969; AVX12-NEXT: vpsllw $5, %xmm0, %xmm0970; AVX12-NEXT: vpblendvb %xmm0, %xmm2, %xmm1, %xmm0971; AVX12-NEXT: retq972;973; AVX512F-LABEL: blend_splat_mask_cond_v16i8:974; AVX512F: # %bb.0:975; AVX512F-NEXT: vpbroadcastb {{.*#+}} xmm3 = [4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4]976; AVX512F-NEXT: vpand %xmm3, %xmm0, %xmm0977; AVX512F-NEXT: vpcmpeqb %xmm3, %xmm0, %xmm0978; AVX512F-NEXT: vpblendvb %xmm0, %xmm2, %xmm1, %xmm0979; AVX512F-NEXT: retq980;981; AVX512VL-LABEL: blend_splat_mask_cond_v16i8:982; AVX512VL: # %bb.0:983; AVX512VL-NEXT: vpbroadcastd {{.*#+}} xmm3 = [4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4]984; AVX512VL-NEXT: vpand %xmm3, %xmm0, %xmm0985; AVX512VL-NEXT: vpcmpeqb %xmm3, %xmm0, %xmm0986; AVX512VL-NEXT: vpternlogq {{.*#+}} xmm0 = xmm1 ^ (xmm0 & (xmm2 ^ xmm1))987; AVX512VL-NEXT: retq988;989; XOP-LABEL: blend_splat_mask_cond_v16i8:990; XOP: # %bb.0:991; XOP-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0992; XOP-NEXT: vpxor %xmm3, %xmm3, %xmm3993; XOP-NEXT: vpcomneqb %xmm3, %xmm0, %xmm0994; XOP-NEXT: vpblendvb %xmm0, %xmm2, %xmm1, %xmm0995; XOP-NEXT: retq996 %a = and <16 x i8> %x, <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>997 %c = icmp eq <16 x i8> %a, zeroinitializer998 %r = select <16 x i1> %c, <16 x i8> %y, <16 x i8> %z999 ret <16 x i8> %r1000}1001 1002define <2 x i64> @blend_mask_cond_v2i64(<2 x i64> %x, <2 x i64> %y, <2 x i64> %z) {1003; AVX1-LABEL: blend_mask_cond_v2i64:1004; AVX1: # %bb.0:1005; AVX1-NEXT: vpmovsxbq {{.*#+}} xmm3 = [1,4]1006; AVX1-NEXT: vpand %xmm3, %xmm0, %xmm01007; AVX1-NEXT: vpcmpeqq %xmm3, %xmm0, %xmm01008; AVX1-NEXT: vblendvpd %xmm0, %xmm2, %xmm1, %xmm01009; AVX1-NEXT: retq1010;1011; AVX2-LABEL: blend_mask_cond_v2i64:1012; AVX2: # %bb.0:1013; AVX2-NEXT: vpsllvq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01014; AVX2-NEXT: vblendvpd %xmm0, %xmm2, %xmm1, %xmm01015; AVX2-NEXT: retq1016;1017; AVX512F-LABEL: blend_mask_cond_v2i64:1018; AVX512F: # %bb.0:1019; AVX512F-NEXT: # kill: def $xmm2 killed $xmm2 def $zmm21020; AVX512F-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm11021; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm01022; AVX512F-NEXT: vpmovsxbq {{.*#+}} xmm3 = [1,4]1023; AVX512F-NEXT: vptestnmq %zmm3, %zmm0, %k11024; AVX512F-NEXT: vpblendmq %zmm1, %zmm2, %zmm0 {%k1}1025; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm01026; AVX512F-NEXT: vzeroupper1027; AVX512F-NEXT: retq1028;1029; AVX512VL-LABEL: blend_mask_cond_v2i64:1030; AVX512VL: # %bb.0:1031; AVX512VL-NEXT: vptestnmq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %k11032; AVX512VL-NEXT: vpblendmq %xmm1, %xmm2, %xmm0 {%k1}1033; AVX512VL-NEXT: retq1034;1035; XOP-LABEL: blend_mask_cond_v2i64:1036; XOP: # %bb.0:1037; XOP-NEXT: vpshlq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01038; XOP-NEXT: vblendvpd %xmm0, %xmm2, %xmm1, %xmm01039; XOP-NEXT: retq1040 %a = and <2 x i64> %x, <i64 1, i64 4>1041 %c = icmp eq <2 x i64> %a, zeroinitializer1042 %r = select <2 x i1> %c, <2 x i64> %y, <2 x i64> %z1043 ret <2 x i64> %r1044}1045 1046define <4 x i32> @blend_mask_cond_v4i32(<4 x i32> %x, <4 x i32> %y, <4 x i32> %z) {1047; AVX1-LABEL: blend_mask_cond_v4i32:1048; AVX1: # %bb.0:1049; AVX1-NEXT: vpmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [32768,4194304,1073741824,2147483648]1050; AVX1-NEXT: vblendvps %xmm0, %xmm2, %xmm1, %xmm01051; AVX1-NEXT: retq1052;1053; AVX2-LABEL: blend_mask_cond_v4i32:1054; AVX2: # %bb.0:1055; AVX2-NEXT: vpsllvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01056; AVX2-NEXT: vblendvps %xmm0, %xmm2, %xmm1, %xmm01057; AVX2-NEXT: retq1058;1059; AVX512F-LABEL: blend_mask_cond_v4i32:1060; AVX512F: # %bb.0:1061; AVX512F-NEXT: # kill: def $xmm2 killed $xmm2 def $zmm21062; AVX512F-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm11063; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm01064; AVX512F-NEXT: vmovdqa {{.*#+}} xmm3 = [65536,512,2,1]1065; AVX512F-NEXT: vptestnmd %zmm3, %zmm0, %k11066; AVX512F-NEXT: vpblendmd %zmm1, %zmm2, %zmm0 {%k1}1067; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm01068; AVX512F-NEXT: vzeroupper1069; AVX512F-NEXT: retq1070;1071; AVX512VL-LABEL: blend_mask_cond_v4i32:1072; AVX512VL: # %bb.0:1073; AVX512VL-NEXT: vptestnmd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %k11074; AVX512VL-NEXT: vpblendmd %xmm1, %xmm2, %xmm0 {%k1}1075; AVX512VL-NEXT: retq1076;1077; XOP-LABEL: blend_mask_cond_v4i32:1078; XOP: # %bb.0:1079; XOP-NEXT: vpshld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01080; XOP-NEXT: vblendvps %xmm0, %xmm2, %xmm1, %xmm01081; XOP-NEXT: retq1082 %a = and <4 x i32> %x, <i32 65536, i32 512, i32 2, i32 1>1083 %c = icmp eq <4 x i32> %a, zeroinitializer1084 %r = select <4 x i1> %c, <4 x i32> %y, <4 x i32> %z1085 ret <4 x i32> %r1086}1087 1088define <8 x i16> @blend_mask_cond_v8i16(<8 x i16> %x, <8 x i16> %y, <8 x i16> %z) {1089; AVX12-LABEL: blend_mask_cond_v8i16:1090; AVX12: # %bb.0:1091; AVX12-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01092; AVX12-NEXT: vpxor %xmm3, %xmm3, %xmm31093; AVX12-NEXT: vpcmpeqw %xmm3, %xmm0, %xmm01094; AVX12-NEXT: vpblendvb %xmm0, %xmm1, %xmm2, %xmm01095; AVX12-NEXT: retq1096;1097; AVX512F-LABEL: blend_mask_cond_v8i16:1098; AVX512F: # %bb.0:1099; AVX512F-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01100; AVX512F-NEXT: vpxor %xmm3, %xmm3, %xmm31101; AVX512F-NEXT: vpcmpeqw %xmm3, %xmm0, %xmm01102; AVX512F-NEXT: vpblendvb %xmm0, %xmm1, %xmm2, %xmm01103; AVX512F-NEXT: retq1104;1105; AVX512VL-LABEL: blend_mask_cond_v8i16:1106; AVX512VL: # %bb.0:1107; AVX512VL-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01108; AVX512VL-NEXT: vpxor %xmm3, %xmm3, %xmm31109; AVX512VL-NEXT: vpcmpeqw %xmm3, %xmm0, %xmm01110; AVX512VL-NEXT: vpternlogq {{.*#+}} xmm0 = xmm2 ^ (xmm0 & (xmm1 ^ xmm2))1111; AVX512VL-NEXT: retq1112;1113; XOP-LABEL: blend_mask_cond_v8i16:1114; XOP: # %bb.0:1115; XOP-NEXT: vpxor %xmm3, %xmm3, %xmm31116; XOP-NEXT: vpshlw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01117; XOP-NEXT: vpcomltw %xmm3, %xmm0, %xmm01118; XOP-NEXT: vpblendvb %xmm0, %xmm2, %xmm1, %xmm01119; XOP-NEXT: retq1120 %a = and <8 x i16> %x, <i16 1, i16 2, i16 8, i16 4, i16 8, i16 1024, i16 2, i16 4096>1121 %c = icmp eq <8 x i16> %a, zeroinitializer1122 %r = select <8 x i1> %c, <8 x i16> %y, <8 x i16> %z1123 ret <8 x i16> %r1124}1125 1126define <16 x i8> @blend_mask_cond_v16i8(<16 x i8> %x, <16 x i8> %y, <16 x i8> %z) {1127; AVX12-LABEL: blend_mask_cond_v16i8:1128; AVX12: # %bb.0:1129; AVX12-NEXT: vmovdqa {{.*#+}} xmm3 = [1,2,4,8,16,32,64,128,4,4,4,4,2,2,2,2]1130; AVX12-NEXT: vpand %xmm3, %xmm0, %xmm01131; AVX12-NEXT: vpcmpeqb %xmm3, %xmm0, %xmm01132; AVX12-NEXT: vpblendvb %xmm0, %xmm2, %xmm1, %xmm01133; AVX12-NEXT: retq1134;1135; AVX512F-LABEL: blend_mask_cond_v16i8:1136; AVX512F: # %bb.0:1137; AVX512F-NEXT: vmovdqa {{.*#+}} xmm3 = [1,2,4,8,16,32,64,128,4,4,4,4,2,2,2,2]1138; AVX512F-NEXT: vpand %xmm3, %xmm0, %xmm01139; AVX512F-NEXT: vpcmpeqb %xmm3, %xmm0, %xmm01140; AVX512F-NEXT: vpblendvb %xmm0, %xmm2, %xmm1, %xmm01141; AVX512F-NEXT: retq1142;1143; AVX512VL-LABEL: blend_mask_cond_v16i8:1144; AVX512VL: # %bb.0:1145; AVX512VL-NEXT: vmovdqa {{.*#+}} xmm3 = [1,2,4,8,16,32,64,128,4,4,4,4,2,2,2,2]1146; AVX512VL-NEXT: vpand %xmm3, %xmm0, %xmm01147; AVX512VL-NEXT: vpcmpeqb %xmm3, %xmm0, %xmm01148; AVX512VL-NEXT: vpternlogq {{.*#+}} xmm0 = xmm1 ^ (xmm0 & (xmm2 ^ xmm1))1149; AVX512VL-NEXT: retq1150;1151; XOP-LABEL: blend_mask_cond_v16i8:1152; XOP: # %bb.0:1153; XOP-NEXT: vpshlb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01154; XOP-NEXT: vpblendvb %xmm0, %xmm2, %xmm1, %xmm01155; XOP-NEXT: retq1156 %a = and <16 x i8> %x, <i8 1, i8 2, i8 4, i8 8, i8 16, i8 32, i8 64, i8 128, i8 4, i8 4, i8 4, i8 4, i8 2, i8 2, i8 2, i8 2>1157 %c = icmp eq <16 x i8> %a, zeroinitializer1158 %r = select <16 x i1> %c, <16 x i8> %y, <16 x i8> %z1159 ret <16 x i8> %r1160}1161 1162define <4 x i64> @blend_mask_cond_v4i64(<4 x i64> %x, <4 x i64> %y, <4 x i64> %z) {1163; AVX1-LABEL: blend_mask_cond_v4i64:1164; AVX1: # %bb.0:1165; AVX1-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01166; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm31167; AVX1-NEXT: vpxor %xmm4, %xmm4, %xmm41168; AVX1-NEXT: vpcmpeqq %xmm4, %xmm3, %xmm31169; AVX1-NEXT: vpcmpeqq %xmm4, %xmm0, %xmm01170; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm0, %ymm01171; AVX1-NEXT: vblendvpd %ymm0, %ymm1, %ymm2, %ymm01172; AVX1-NEXT: retq1173;1174; AVX2-LABEL: blend_mask_cond_v4i64:1175; AVX2: # %bb.0:1176; AVX2-NEXT: vpsllvq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01177; AVX2-NEXT: vblendvpd %ymm0, %ymm2, %ymm1, %ymm01178; AVX2-NEXT: retq1179;1180; AVX512F-LABEL: blend_mask_cond_v4i64:1181; AVX512F: # %bb.0:1182; AVX512F-NEXT: # kill: def $ymm2 killed $ymm2 def $zmm21183; AVX512F-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm11184; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm01185; AVX512F-NEXT: vpmovzxwq {{.*#+}} ymm3 = [2,4,32768,1]1186; AVX512F-NEXT: vptestnmq %zmm3, %zmm0, %k11187; AVX512F-NEXT: vpblendmq %zmm1, %zmm2, %zmm0 {%k1}1188; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm01189; AVX512F-NEXT: retq1190;1191; AVX512VL-LABEL: blend_mask_cond_v4i64:1192; AVX512VL: # %bb.0:1193; AVX512VL-NEXT: vptestnmq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %k11194; AVX512VL-NEXT: vpblendmq %ymm1, %ymm2, %ymm0 {%k1}1195; AVX512VL-NEXT: retq1196;1197; XOP-LABEL: blend_mask_cond_v4i64:1198; XOP: # %bb.0:1199; XOP-NEXT: vpshlq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm31200; XOP-NEXT: vextractf128 $1, %ymm0, %xmm01201; XOP-NEXT: vpshlq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01202; XOP-NEXT: vinsertf128 $1, %xmm0, %ymm3, %ymm01203; XOP-NEXT: vblendvpd %ymm0, %ymm2, %ymm1, %ymm01204; XOP-NEXT: retq1205 %a = and <4 x i64> %x, <i64 2, i64 4, i64 32768, i64 1>1206 %c = icmp eq <4 x i64> %a, zeroinitializer1207 %r = select <4 x i1> %c, <4 x i64> %y, <4 x i64> %z1208 ret <4 x i64> %r1209}1210 1211define <8 x i32> @blend_mask_cond_v8i32(<8 x i32> %x, <8 x i32> %y, <8 x i32> %z) {1212; AVX1-LABEL: blend_mask_cond_v8i32:1213; AVX1: # %bb.0:1214; AVX1-NEXT: vpmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm3 # [2147483648,1073741824,268435456,536870912]1215; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm01216; AVX1-NEXT: vpmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [268435456,2097152,1073741824,524288]1217; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm3, %ymm01218; AVX1-NEXT: vblendvps %ymm0, %ymm2, %ymm1, %ymm01219; AVX1-NEXT: retq1220;1221; AVX2-LABEL: blend_mask_cond_v8i32:1222; AVX2: # %bb.0:1223; AVX2-NEXT: vpsllvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01224; AVX2-NEXT: vblendvps %ymm0, %ymm2, %ymm1, %ymm01225; AVX2-NEXT: retq1226;1227; AVX512F-LABEL: blend_mask_cond_v8i32:1228; AVX512F: # %bb.0:1229; AVX512F-NEXT: # kill: def $ymm2 killed $ymm2 def $zmm21230; AVX512F-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm11231; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm01232; AVX512F-NEXT: vpmovsxwd {{.*#+}} ymm3 = [1,2,8,4,8,1024,2,4096]1233; AVX512F-NEXT: vptestnmd %zmm3, %zmm0, %k11234; AVX512F-NEXT: vpblendmd %zmm1, %zmm2, %zmm0 {%k1}1235; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm01236; AVX512F-NEXT: retq1237;1238; AVX512VL-LABEL: blend_mask_cond_v8i32:1239; AVX512VL: # %bb.0:1240; AVX512VL-NEXT: vptestnmd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %k11241; AVX512VL-NEXT: vpblendmd %ymm1, %ymm2, %ymm0 {%k1}1242; AVX512VL-NEXT: retq1243;1244; XOP-LABEL: blend_mask_cond_v8i32:1245; XOP: # %bb.0:1246; XOP-NEXT: vpshld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm31247; XOP-NEXT: vextractf128 $1, %ymm0, %xmm01248; XOP-NEXT: vpshld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01249; XOP-NEXT: vinsertf128 $1, %xmm0, %ymm3, %ymm01250; XOP-NEXT: vblendvps %ymm0, %ymm2, %ymm1, %ymm01251; XOP-NEXT: retq1252 %a = and <8 x i32> %x, <i32 1, i32 2, i32 8, i32 4, i32 8, i32 1024, i32 2, i32 4096>1253 %c = icmp eq <8 x i32> %a, zeroinitializer1254 %r = select <8 x i1> %c, <8 x i32> %y, <8 x i32> %z1255 ret <8 x i32> %r1256}1257 1258define <16 x i16> @blend_mask_cond_v16i16(<16 x i16> %x, <16 x i16> %y, <16 x i16> %z) {1259; AVX1-LABEL: blend_mask_cond_v16i16:1260; AVX1: # %bb.0:1261; AVX1-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01262; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm31263; AVX1-NEXT: vpxor %xmm4, %xmm4, %xmm41264; AVX1-NEXT: vpcmpeqw %xmm4, %xmm3, %xmm31265; AVX1-NEXT: vpcmpeqw %xmm4, %xmm0, %xmm01266; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm0, %ymm01267; AVX1-NEXT: vandnps %ymm2, %ymm0, %ymm21268; AVX1-NEXT: vandps %ymm0, %ymm1, %ymm01269; AVX1-NEXT: vorps %ymm2, %ymm0, %ymm01270; AVX1-NEXT: retq1271;1272; AVX2-LABEL: blend_mask_cond_v16i16:1273; AVX2: # %bb.0:1274; AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01275; AVX2-NEXT: vpxor %xmm3, %xmm3, %xmm31276; AVX2-NEXT: vpcmpeqw %ymm3, %ymm0, %ymm01277; AVX2-NEXT: vpblendvb %ymm0, %ymm1, %ymm2, %ymm01278; AVX2-NEXT: retq1279;1280; AVX512F-LABEL: blend_mask_cond_v16i16:1281; AVX512F: # %bb.0:1282; AVX512F-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01283; AVX512F-NEXT: vpxor %xmm3, %xmm3, %xmm31284; AVX512F-NEXT: vpcmpeqw %ymm3, %ymm0, %ymm01285; AVX512F-NEXT: vpblendvb %ymm0, %ymm1, %ymm2, %ymm01286; AVX512F-NEXT: retq1287;1288; AVX512VL-LABEL: blend_mask_cond_v16i16:1289; AVX512VL: # %bb.0:1290; AVX512VL-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01291; AVX512VL-NEXT: vpxor %xmm3, %xmm3, %xmm31292; AVX512VL-NEXT: vpcmpeqw %ymm3, %ymm0, %ymm01293; AVX512VL-NEXT: vpternlogq {{.*#+}} ymm0 = ymm2 ^ (ymm0 & (ymm1 ^ ymm2))1294; AVX512VL-NEXT: retq1295;1296; XOP-LABEL: blend_mask_cond_v16i16:1297; XOP: # %bb.0:1298; XOP-NEXT: vextractf128 $1, %ymm0, %xmm31299; XOP-NEXT: vpshlw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3, %xmm31300; XOP-NEXT: vpxor %xmm4, %xmm4, %xmm41301; XOP-NEXT: vpcomltw %xmm4, %xmm3, %xmm31302; XOP-NEXT: vpshlw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01303; XOP-NEXT: vpcomltw %xmm4, %xmm0, %xmm01304; XOP-NEXT: vinsertf128 $1, %xmm3, %ymm0, %ymm01305; XOP-NEXT: vpcmov %ymm0, %ymm1, %ymm2, %ymm01306; XOP-NEXT: retq1307 %a = and <16 x i16> %x, <i16 1, i16 2, i16 8, i16 4, i16 8, i16 2, i16 2, i16 2, i16 2, i16 8, i16 8, i16 64, i16 64, i16 1024, i16 4096, i16 1024>1308 %c = icmp eq <16 x i16> %a, zeroinitializer1309 %r = select <16 x i1> %c, <16 x i16> %y, <16 x i16> %z1310 ret <16 x i16> %r1311}1312 1313define <32 x i8> @blend_mask_cond_v32i8(<32 x i8> %x, <32 x i8> %y, <32 x i8> %z) {1314; AVX1-LABEL: blend_mask_cond_v32i8:1315; AVX1: # %bb.0:1316; AVX1-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01317; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm31318; AVX1-NEXT: vpxor %xmm4, %xmm4, %xmm41319; AVX1-NEXT: vpcmpeqb %xmm4, %xmm3, %xmm31320; AVX1-NEXT: vpcmpeqb %xmm4, %xmm0, %xmm01321; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm0, %ymm01322; AVX1-NEXT: vandnps %ymm2, %ymm0, %ymm21323; AVX1-NEXT: vandps %ymm0, %ymm1, %ymm01324; AVX1-NEXT: vorps %ymm2, %ymm0, %ymm01325; AVX1-NEXT: retq1326;1327; AVX2-LABEL: blend_mask_cond_v32i8:1328; AVX2: # %bb.0:1329; AVX2-NEXT: vmovdqa {{.*#+}} ymm3 = [1,2,4,8,16,32,64,128,4,4,4,4,2,2,2,2,1,2,4,8,16,32,64,128,4,4,4,4,128,4,2,16]1330; AVX2-NEXT: vpand %ymm3, %ymm0, %ymm01331; AVX2-NEXT: vpcmpeqb %ymm3, %ymm0, %ymm01332; AVX2-NEXT: vpblendvb %ymm0, %ymm2, %ymm1, %ymm01333; AVX2-NEXT: retq1334;1335; AVX512F-LABEL: blend_mask_cond_v32i8:1336; AVX512F: # %bb.0:1337; AVX512F-NEXT: vmovdqa {{.*#+}} ymm3 = [1,2,4,8,16,32,64,128,4,4,4,4,2,2,2,2,1,2,4,8,16,32,64,128,4,4,4,4,128,4,2,16]1338; AVX512F-NEXT: vpand %ymm3, %ymm0, %ymm01339; AVX512F-NEXT: vpcmpeqb %ymm3, %ymm0, %ymm01340; AVX512F-NEXT: vpblendvb %ymm0, %ymm2, %ymm1, %ymm01341; AVX512F-NEXT: retq1342;1343; AVX512VL-LABEL: blend_mask_cond_v32i8:1344; AVX512VL: # %bb.0:1345; AVX512VL-NEXT: vmovdqa {{.*#+}} ymm3 = [1,2,4,8,16,32,64,128,4,4,4,4,2,2,2,2,1,2,4,8,16,32,64,128,4,4,4,4,128,4,2,16]1346; AVX512VL-NEXT: vpand %ymm3, %ymm0, %ymm01347; AVX512VL-NEXT: vpcmpeqb %ymm3, %ymm0, %ymm01348; AVX512VL-NEXT: vpternlogq {{.*#+}} ymm0 = ymm1 ^ (ymm0 & (ymm2 ^ ymm1))1349; AVX512VL-NEXT: retq1350;1351; XOP-LABEL: blend_mask_cond_v32i8:1352; XOP: # %bb.0:1353; XOP-NEXT: vextractf128 $1, %ymm0, %xmm31354; XOP-NEXT: vpshlb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3, %xmm31355; XOP-NEXT: vpxor %xmm4, %xmm4, %xmm41356; XOP-NEXT: vpcomltb %xmm4, %xmm3, %xmm31357; XOP-NEXT: vpshlb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01358; XOP-NEXT: vpcomltb %xmm4, %xmm0, %xmm01359; XOP-NEXT: vinsertf128 $1, %xmm3, %ymm0, %ymm01360; XOP-NEXT: vpcmov %ymm0, %ymm1, %ymm2, %ymm01361; XOP-NEXT: retq1362 %a = and <32 x i8> %x, <i8 1, i8 2, i8 4, i8 8, i8 16, i8 32, i8 64, i8 128, i8 4, i8 4, i8 4, i8 4, i8 2, i8 2, i8 2, i8 2, i8 1, i8 2, i8 4, i8 8, i8 16, i8 32, i8 64, i8 128, i8 4, i8 4, i8 4, i8 4, i8 128, i8 4, i8 2, i8 16>1363 %c = icmp eq <32 x i8> %a, zeroinitializer1364 %r = select <32 x i1> %c, <32 x i8> %y, <32 x i8> %z1365 ret <32 x i8> %r1366}1367 1368define void @store_blend_load_v4i64(ptr %a0, ptr %a1, ptr %a2) {1369; AVX1-LABEL: store_blend_load_v4i64:1370; AVX1: # %bb.0:1371; AVX1-NEXT: vmovapd (%rsi), %ymm01372; AVX1-NEXT: vmovddup {{.*#+}} xmm1 = [9223372036854775808,9223372036854775808]1373; AVX1-NEXT: # xmm1 = mem[0,0]1374; AVX1-NEXT: vpxor 16(%rdi), %xmm1, %xmm21375; AVX1-NEXT: vmovddup {{.*#+}} xmm3 = [9223372036854775815,9223372036854775815]1376; AVX1-NEXT: # xmm3 = mem[0,0]1377; AVX1-NEXT: vpcmpgtq %xmm3, %xmm2, %xmm21378; AVX1-NEXT: vpxor (%rdi), %xmm1, %xmm11379; AVX1-NEXT: vpcmpgtq %xmm3, %xmm1, %xmm11380; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm11381; AVX1-NEXT: vblendvpd %ymm1, (%rdi), %ymm0, %ymm01382; AVX1-NEXT: vmovapd %ymm0, (%rdx)1383; AVX1-NEXT: vzeroupper1384; AVX1-NEXT: retq1385;1386; AVX2-LABEL: store_blend_load_v4i64:1387; AVX2: # %bb.0:1388; AVX2-NEXT: vmovdqa (%rdi), %ymm01389; AVX2-NEXT: vmovapd (%rsi), %ymm11390; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm2 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]1391; AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm21392; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm3 = [9223372036854775815,9223372036854775815,9223372036854775815,9223372036854775815]1393; AVX2-NEXT: vpcmpgtq %ymm3, %ymm2, %ymm21394; AVX2-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm01395; AVX2-NEXT: vmovapd %ymm0, (%rdx)1396; AVX2-NEXT: vzeroupper1397; AVX2-NEXT: retq1398;1399; AVX512F-LABEL: store_blend_load_v4i64:1400; AVX512F: # %bb.0:1401; AVX512F-NEXT: vmovdqa (%rdi), %ymm01402; AVX512F-NEXT: vmovdqa (%rsi), %ymm11403; AVX512F-NEXT: vpcmpnleuq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %zmm0, %k11404; AVX512F-NEXT: vmovdqa64 %zmm0, %zmm1 {%k1}1405; AVX512F-NEXT: vmovdqa %ymm1, (%rdx)1406; AVX512F-NEXT: vzeroupper1407; AVX512F-NEXT: retq1408;1409; AVX512VL-LABEL: store_blend_load_v4i64:1410; AVX512VL: # %bb.0:1411; AVX512VL-NEXT: vmovdqa (%rdi), %ymm01412; AVX512VL-NEXT: vmovdqa (%rsi), %ymm11413; AVX512VL-NEXT: vpcmpnleuq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %ymm0, %k11414; AVX512VL-NEXT: vmovdqa64 %ymm0, %ymm1 {%k1}1415; AVX512VL-NEXT: vmovdqa %ymm1, (%rdx)1416; AVX512VL-NEXT: vzeroupper1417; AVX512VL-NEXT: retq1418;1419; XOP-LABEL: store_blend_load_v4i64:1420; XOP: # %bb.0:1421; XOP-NEXT: vmovapd (%rsi), %ymm01422; XOP-NEXT: vpmovsxbq {{.*#+}} xmm1 = [7,7]1423; XOP-NEXT: vpcomltuq 16(%rdi), %xmm1, %xmm21424; XOP-NEXT: vpcomltuq (%rdi), %xmm1, %xmm11425; XOP-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm11426; XOP-NEXT: vblendvpd %ymm1, (%rdi), %ymm0, %ymm01427; XOP-NEXT: vmovapd %ymm0, (%rdx)1428; XOP-NEXT: vzeroupper1429; XOP-NEXT: retq1430 %v0 = load <4 x i64>, ptr %a01431 %v1 = load <4 x i64>, ptr %a11432 %cmp = icmp ugt <4 x i64> %v0, <i64 7, i64 7, i64 7, i64 7>1433 %res = select <4 x i1> %cmp, <4 x i64> %v0, <4 x i64> %v11434 store <4 x i64> %res, ptr %a21435 ret void1436}1437 1438define void @store_blend_load_v8i32(ptr %a0, ptr %a1, ptr %a2) {1439; AVX1-LABEL: store_blend_load_v8i32:1440; AVX1: # %bb.0:1441; AVX1-NEXT: vmovaps (%rsi), %ymm01442; AVX1-NEXT: vmovdqa (%rdi), %xmm11443; AVX1-NEXT: vmovdqa 16(%rdi), %xmm21444; AVX1-NEXT: vbroadcastss {{.*#+}} xmm3 = [8,8,8,8]1445; AVX1-NEXT: vpmaxud %xmm3, %xmm2, %xmm41446; AVX1-NEXT: vpcmpeqd %xmm4, %xmm2, %xmm21447; AVX1-NEXT: vpmaxud %xmm3, %xmm1, %xmm31448; AVX1-NEXT: vpcmpeqd %xmm3, %xmm1, %xmm11449; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm11450; AVX1-NEXT: vblendvps %ymm1, (%rdi), %ymm0, %ymm01451; AVX1-NEXT: vmovaps %ymm0, (%rdx)1452; AVX1-NEXT: vzeroupper1453; AVX1-NEXT: retq1454;1455; AVX2-LABEL: store_blend_load_v8i32:1456; AVX2: # %bb.0:1457; AVX2-NEXT: vmovdqa (%rdi), %ymm01458; AVX2-NEXT: vmovaps (%rsi), %ymm11459; AVX2-NEXT: vpbroadcastd {{.*#+}} ymm2 = [8,8,8,8,8,8,8,8]1460; AVX2-NEXT: vpmaxud %ymm2, %ymm0, %ymm21461; AVX2-NEXT: vpcmpeqd %ymm2, %ymm0, %ymm21462; AVX2-NEXT: vblendvps %ymm2, %ymm0, %ymm1, %ymm01463; AVX2-NEXT: vmovaps %ymm0, (%rdx)1464; AVX2-NEXT: vzeroupper1465; AVX2-NEXT: retq1466;1467; AVX512F-LABEL: store_blend_load_v8i32:1468; AVX512F: # %bb.0:1469; AVX512F-NEXT: vmovdqa (%rdi), %ymm01470; AVX512F-NEXT: vmovdqa (%rsi), %ymm11471; AVX512F-NEXT: vpcmpnleud {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm0, %k11472; AVX512F-NEXT: vmovdqa32 %zmm0, %zmm1 {%k1}1473; AVX512F-NEXT: vmovdqa %ymm1, (%rdx)1474; AVX512F-NEXT: vzeroupper1475; AVX512F-NEXT: retq1476;1477; AVX512VL-LABEL: store_blend_load_v8i32:1478; AVX512VL: # %bb.0:1479; AVX512VL-NEXT: vmovdqa (%rdi), %ymm01480; AVX512VL-NEXT: vmovdqa (%rsi), %ymm11481; AVX512VL-NEXT: vpcmpnleud {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm0, %k11482; AVX512VL-NEXT: vmovdqa32 %ymm0, %ymm1 {%k1}1483; AVX512VL-NEXT: vmovdqa %ymm1, (%rdx)1484; AVX512VL-NEXT: vzeroupper1485; AVX512VL-NEXT: retq1486;1487; XOP-LABEL: store_blend_load_v8i32:1488; XOP: # %bb.0:1489; XOP-NEXT: vmovaps (%rsi), %ymm01490; XOP-NEXT: vbroadcastss {{.*#+}} xmm1 = [7,7,7,7]1491; XOP-NEXT: vpcomltud 16(%rdi), %xmm1, %xmm21492; XOP-NEXT: vpcomltud (%rdi), %xmm1, %xmm11493; XOP-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm11494; XOP-NEXT: vblendvps %ymm1, (%rdi), %ymm0, %ymm01495; XOP-NEXT: vmovaps %ymm0, (%rdx)1496; XOP-NEXT: vzeroupper1497; XOP-NEXT: retq1498 %v0 = load <8 x i32>, ptr %a01499 %v1 = load <8 x i32>, ptr %a11500 %cmp = icmp ugt <8 x i32> %v0, <i32 7, i32 7, i32 7, i32 7, i32 7, i32 7, i32 7, i32 7>1501 %res = select <8 x i1> %cmp, <8 x i32> %v0, <8 x i32> %v11502 store <8 x i32> %res, ptr %a21503 ret void1504}1505 1506define void @store_blend_load_v16i16(ptr %a0, ptr %a1, ptr %a2) {1507; AVX1-LABEL: store_blend_load_v16i16:1508; AVX1: # %bb.0:1509; AVX1-NEXT: vmovdqa (%rdi), %xmm01510; AVX1-NEXT: vmovdqa 16(%rdi), %xmm11511; AVX1-NEXT: vbroadcastss {{.*#+}} xmm2 = [8,8,8,8,8,8,8,8]1512; AVX1-NEXT: vpmaxuw %xmm2, %xmm0, %xmm31513; AVX1-NEXT: vpcmpeqw %xmm3, %xmm0, %xmm31514; AVX1-NEXT: vpmaxuw %xmm2, %xmm1, %xmm21515; AVX1-NEXT: vpcmpeqw %xmm2, %xmm1, %xmm21516; AVX1-NEXT: vmovdqa (%rsi), %xmm41517; AVX1-NEXT: vmovdqa 16(%rsi), %xmm51518; AVX1-NEXT: vpblendvb %xmm2, %xmm1, %xmm5, %xmm11519; AVX1-NEXT: vpblendvb %xmm3, %xmm0, %xmm4, %xmm01520; AVX1-NEXT: vmovdqa %xmm0, (%rdx)1521; AVX1-NEXT: vmovdqa %xmm1, 16(%rdx)1522; AVX1-NEXT: retq1523;1524; AVX2-LABEL: store_blend_load_v16i16:1525; AVX2: # %bb.0:1526; AVX2-NEXT: vmovdqa (%rdi), %ymm01527; AVX2-NEXT: vmovdqa (%rsi), %ymm11528; AVX2-NEXT: vpmaxuw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm21529; AVX2-NEXT: vpcmpeqw %ymm2, %ymm0, %ymm21530; AVX2-NEXT: vpblendvb %ymm2, %ymm0, %ymm1, %ymm01531; AVX2-NEXT: vmovdqa %ymm0, (%rdx)1532; AVX2-NEXT: vzeroupper1533; AVX2-NEXT: retq1534;1535; AVX512F-LABEL: store_blend_load_v16i16:1536; AVX512F: # %bb.0:1537; AVX512F-NEXT: vmovdqa (%rdi), %ymm01538; AVX512F-NEXT: vmovdqa (%rsi), %ymm11539; AVX512F-NEXT: vpmaxuw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm21540; AVX512F-NEXT: vpcmpeqw %ymm2, %ymm0, %ymm21541; AVX512F-NEXT: vpblendvb %ymm2, %ymm0, %ymm1, %ymm01542; AVX512F-NEXT: vmovdqa %ymm0, (%rdx)1543; AVX512F-NEXT: vzeroupper1544; AVX512F-NEXT: retq1545;1546; AVX512VL-LABEL: store_blend_load_v16i16:1547; AVX512VL: # %bb.0:1548; AVX512VL-NEXT: vmovdqa (%rdi), %ymm01549; AVX512VL-NEXT: vpmaxuw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm11550; AVX512VL-NEXT: vpcmpeqw %ymm1, %ymm0, %ymm11551; AVX512VL-NEXT: vpternlogq {{.*#+}} ymm1 = mem ^ (ymm1 & (ymm0 ^ mem))1552; AVX512VL-NEXT: vmovdqa %ymm1, (%rdx)1553; AVX512VL-NEXT: vzeroupper1554; AVX512VL-NEXT: retq1555;1556; XOP-LABEL: store_blend_load_v16i16:1557; XOP: # %bb.0:1558; XOP-NEXT: vmovdqa (%rdi), %ymm01559; XOP-NEXT: vbroadcastss {{.*#+}} xmm1 = [7,7,7,7,7,7,7,7]1560; XOP-NEXT: vpcomltuw 16(%rdi), %xmm1, %xmm21561; XOP-NEXT: vpcomgtuw %xmm1, %xmm0, %xmm11562; XOP-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm11563; XOP-NEXT: vpcmov %ymm1, (%rsi), %ymm0, %ymm01564; XOP-NEXT: vmovdqa %ymm0, (%rdx)1565; XOP-NEXT: vzeroupper1566; XOP-NEXT: retq1567 %v0 = load <16 x i16>, ptr %a01568 %v1 = load <16 x i16>, ptr %a11569 %cmp = icmp ugt <16 x i16> %v0, <i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7>1570 %res = select <16 x i1> %cmp, <16 x i16> %v0, <16 x i16> %v11571 store <16 x i16> %res, ptr %a21572 ret void1573}1574 1575define void @store_blend_load_v32i8(ptr %a0, ptr %a1, ptr %a2) {1576; AVX1-LABEL: store_blend_load_v32i8:1577; AVX1: # %bb.0:1578; AVX1-NEXT: vmovdqa (%rdi), %xmm01579; AVX1-NEXT: vmovdqa 16(%rdi), %xmm11580; AVX1-NEXT: vbroadcastss {{.*#+}} xmm2 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8]1581; AVX1-NEXT: vpmaxub %xmm2, %xmm0, %xmm31582; AVX1-NEXT: vpcmpeqb %xmm3, %xmm0, %xmm31583; AVX1-NEXT: vpmaxub %xmm2, %xmm1, %xmm21584; AVX1-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm21585; AVX1-NEXT: vmovdqa (%rsi), %xmm41586; AVX1-NEXT: vmovdqa 16(%rsi), %xmm51587; AVX1-NEXT: vpblendvb %xmm2, %xmm1, %xmm5, %xmm11588; AVX1-NEXT: vpblendvb %xmm3, %xmm0, %xmm4, %xmm01589; AVX1-NEXT: vmovdqa %xmm0, (%rdx)1590; AVX1-NEXT: vmovdqa %xmm1, 16(%rdx)1591; AVX1-NEXT: retq1592;1593; AVX2-LABEL: store_blend_load_v32i8:1594; AVX2: # %bb.0:1595; AVX2-NEXT: vmovdqa (%rdi), %ymm01596; AVX2-NEXT: vmovdqa (%rsi), %ymm11597; AVX2-NEXT: vpmaxub {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm21598; AVX2-NEXT: vpcmpeqb %ymm2, %ymm0, %ymm21599; AVX2-NEXT: vpblendvb %ymm2, %ymm0, %ymm1, %ymm01600; AVX2-NEXT: vmovdqa %ymm0, (%rdx)1601; AVX2-NEXT: vzeroupper1602; AVX2-NEXT: retq1603;1604; AVX512F-LABEL: store_blend_load_v32i8:1605; AVX512F: # %bb.0:1606; AVX512F-NEXT: vmovdqa (%rdi), %ymm01607; AVX512F-NEXT: vmovdqa (%rsi), %ymm11608; AVX512F-NEXT: vpmaxub {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm21609; AVX512F-NEXT: vpcmpeqb %ymm2, %ymm0, %ymm21610; AVX512F-NEXT: vpblendvb %ymm2, %ymm0, %ymm1, %ymm01611; AVX512F-NEXT: vmovdqa %ymm0, (%rdx)1612; AVX512F-NEXT: vzeroupper1613; AVX512F-NEXT: retq1614;1615; AVX512VL-LABEL: store_blend_load_v32i8:1616; AVX512VL: # %bb.0:1617; AVX512VL-NEXT: vmovdqa (%rdi), %ymm01618; AVX512VL-NEXT: vpmaxub {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm11619; AVX512VL-NEXT: vpcmpeqb %ymm1, %ymm0, %ymm11620; AVX512VL-NEXT: vpternlogq {{.*#+}} ymm1 = mem ^ (ymm1 & (ymm0 ^ mem))1621; AVX512VL-NEXT: vmovdqa %ymm1, (%rdx)1622; AVX512VL-NEXT: vzeroupper1623; AVX512VL-NEXT: retq1624;1625; XOP-LABEL: store_blend_load_v32i8:1626; XOP: # %bb.0:1627; XOP-NEXT: vmovdqa (%rdi), %ymm01628; XOP-NEXT: vbroadcastss {{.*#+}} xmm1 = [7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7]1629; XOP-NEXT: vpcomltub 16(%rdi), %xmm1, %xmm21630; XOP-NEXT: vpcomgtub %xmm1, %xmm0, %xmm11631; XOP-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm11632; XOP-NEXT: vpcmov %ymm1, (%rsi), %ymm0, %ymm01633; XOP-NEXT: vmovdqa %ymm0, (%rdx)1634; XOP-NEXT: vzeroupper1635; XOP-NEXT: retq1636 %v0 = load <32 x i8>, ptr %a01637 %v1 = load <32 x i8>, ptr %a11638 %cmp = icmp ugt <32 x i8> %v0, <i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7>1639 %res = select <32 x i1> %cmp, <32 x i8> %v0, <32 x i8> %v11640 store <32 x i8> %res, ptr %a21641 ret void1642}1643 1644define void @PR46531(ptr %x, ptr %y, ptr %z) {1645; AVX12-LABEL: PR46531:1646; AVX12: # %bb.0:1647; AVX12-NEXT: vmovdqu (%rsi), %xmm01648; AVX12-NEXT: vmovdqu (%rdx), %xmm11649; AVX12-NEXT: vpor %xmm0, %xmm1, %xmm21650; AVX12-NEXT: vpxor %xmm0, %xmm1, %xmm01651; AVX12-NEXT: vpslld $31, %xmm1, %xmm11652; AVX12-NEXT: vblendvps %xmm1, %xmm0, %xmm2, %xmm01653; AVX12-NEXT: vmovups %xmm0, (%rdi)1654; AVX12-NEXT: retq1655;1656; AVX512F-LABEL: PR46531:1657; AVX512F: # %bb.0:1658; AVX512F-NEXT: vmovdqu (%rsi), %xmm01659; AVX512F-NEXT: vmovdqu (%rdx), %xmm11660; AVX512F-NEXT: vpor %xmm0, %xmm1, %xmm21661; AVX512F-NEXT: vptestnmd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm1, %k11662; AVX512F-NEXT: vpxor %xmm0, %xmm1, %xmm01663; AVX512F-NEXT: vmovdqa32 %zmm2, %zmm0 {%k1}1664; AVX512F-NEXT: vmovdqu %xmm0, (%rdi)1665; AVX512F-NEXT: vzeroupper1666; AVX512F-NEXT: retq1667;1668; AVX512VL-LABEL: PR46531:1669; AVX512VL: # %bb.0:1670; AVX512VL-NEXT: vmovdqu (%rsi), %xmm01671; AVX512VL-NEXT: vmovdqu (%rdx), %xmm11672; AVX512VL-NEXT: vptestnmd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm1, %k11673; AVX512VL-NEXT: vpxor %xmm0, %xmm1, %xmm21674; AVX512VL-NEXT: vpord %xmm0, %xmm1, %xmm2 {%k1}1675; AVX512VL-NEXT: vmovdqu %xmm2, (%rdi)1676; AVX512VL-NEXT: retq1677;1678; XOP-LABEL: PR46531:1679; XOP: # %bb.0:1680; XOP-NEXT: vmovdqu (%rsi), %xmm01681; XOP-NEXT: vmovdqu (%rdx), %xmm11682; XOP-NEXT: vpor %xmm0, %xmm1, %xmm21683; XOP-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm31684; XOP-NEXT: vpxor %xmm4, %xmm4, %xmm41685; XOP-NEXT: vpcomneqd %xmm4, %xmm3, %xmm31686; XOP-NEXT: vpxor %xmm0, %xmm1, %xmm01687; XOP-NEXT: vblendvps %xmm3, %xmm0, %xmm2, %xmm01688; XOP-NEXT: vmovups %xmm0, (%rdi)1689; XOP-NEXT: retq1690 %a = load <4 x i32>, ptr %y, align 41691 %b = load <4 x i32>, ptr %z, align 41692 %or = or <4 x i32> %b, %a1693 %and = and <4 x i32> %b, <i32 1, i32 1, i32 1, i32 1>1694 %cmp = icmp eq <4 x i32> %and, zeroinitializer1695 %xor = xor <4 x i32> %b, %a1696 %sel = select <4 x i1> %cmp, <4 x i32> %or, <4 x i32> %xor1697 store <4 x i32> %sel, ptr %x, align 41698 ret void1699}1700 1701define <64 x i8> @PR110875(<32 x i8> %a0, <32 x i8> %a1, i64 %a2) {1702; AVX1-LABEL: PR110875:1703; AVX1: # %bb.0:1704; AVX1-NEXT: vmovq %rdi, %xmm21705; AVX1-NEXT: vpunpcklbw {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]1706; AVX1-NEXT: vpshufhw {{.*#+}} xmm3 = xmm2[0,1,2,3,4,4,5,5]1707; AVX1-NEXT: vpshufhw {{.*#+}} xmm4 = xmm2[0,1,2,3,6,6,7,7]1708; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm3, %ymm31709; AVX1-NEXT: vshufps {{.*#+}} ymm3 = ymm3[2,2,3,3,6,6,7,7]1710; AVX1-NEXT: vpshuflw {{.*#+}} xmm4 = xmm2[0,0,1,1,4,5,6,7]1711; AVX1-NEXT: vpshuflw {{.*#+}} xmm2 = xmm2[2,2,3,3,4,5,6,7]1712; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm4, %ymm21713; AVX1-NEXT: vshufps {{.*#+}} ymm2 = ymm2[0,0,1,1,4,4,5,5]1714; AVX1-NEXT: vbroadcastsd {{.*#+}} ymm4 = [1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128]1715; AVX1-NEXT: vandps %ymm4, %ymm2, %ymm21716; AVX1-NEXT: vandps %ymm4, %ymm3, %ymm31717; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm41718; AVX1-NEXT: vpxor %xmm5, %xmm5, %xmm51719; AVX1-NEXT: vpcmpeqb %xmm5, %xmm4, %xmm41720; AVX1-NEXT: vpcmpeqb %xmm5, %xmm3, %xmm31721; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm3, %ymm31722; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm41723; AVX1-NEXT: vpcmpeqb %xmm5, %xmm4, %xmm41724; AVX1-NEXT: vpcmpeqb %xmm5, %xmm2, %xmm21725; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm2, %ymm21726; AVX1-NEXT: vbroadcastss {{.*#+}} ymm4 = [20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20]1727; AVX1-NEXT: vandnps %ymm4, %ymm2, %ymm51728; AVX1-NEXT: vandps %ymm2, %ymm0, %ymm01729; AVX1-NEXT: vorps %ymm5, %ymm0, %ymm01730; AVX1-NEXT: vandnps %ymm4, %ymm3, %ymm21731; AVX1-NEXT: vandps %ymm3, %ymm1, %ymm11732; AVX1-NEXT: vorps %ymm2, %ymm1, %ymm11733; AVX1-NEXT: retq1734;1735; AVX2-LABEL: PR110875:1736; AVX2: # %bb.0:1737; AVX2-NEXT: vmovq %rdi, %xmm21738; AVX2-NEXT: vpbroadcastq %xmm2, %ymm21739; AVX2-NEXT: vpshufb {{.*#+}} ymm3 = ymm2[0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,18,18,18,18,18,18,18,18,19,19,19,19,19,19,19,19]1740; AVX2-NEXT: vpshufb {{.*#+}} ymm2 = ymm2[4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,22,22,22,22,22,22,22,22,23,23,23,23,23,23,23,23]1741; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm4 = [1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128]1742; AVX2-NEXT: vpand %ymm4, %ymm2, %ymm21743; AVX2-NEXT: vpand %ymm4, %ymm3, %ymm31744; AVX2-NEXT: vpcmpeqb %ymm4, %ymm3, %ymm31745; AVX2-NEXT: vpbroadcastb {{.*#+}} ymm5 = [20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20]1746; AVX2-NEXT: vpblendvb %ymm3, %ymm5, %ymm0, %ymm01747; AVX2-NEXT: vpcmpeqb %ymm4, %ymm2, %ymm21748; AVX2-NEXT: vpblendvb %ymm2, %ymm5, %ymm1, %ymm11749; AVX2-NEXT: retq1750;1751; AVX512F-LABEL: PR110875:1752; AVX512F: # %bb.0:1753; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm01754; AVX512F-NEXT: vinserti64x4 $1, %ymm1, %zmm0, %zmm11755; AVX512F-NEXT: vmovq %rdi, %xmm01756; AVX512F-NEXT: vpbroadcastq %xmm0, %ymm01757; AVX512F-NEXT: vpshufb {{.*#+}} ymm2 = ymm0[0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,18,18,18,18,18,18,18,18,19,19,19,19,19,19,19,19]1758; AVX512F-NEXT: vpshufb {{.*#+}} ymm0 = ymm0[4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,22,22,22,22,22,22,22,22,23,23,23,23,23,23,23,23]1759; AVX512F-NEXT: vinserti64x4 $1, %ymm0, %zmm2, %zmm01760; AVX512F-NEXT: vpandq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %zmm0, %zmm01761; AVX512F-NEXT: vextracti64x4 $1, %zmm0, %ymm21762; AVX512F-NEXT: vpxor %xmm3, %xmm3, %xmm31763; AVX512F-NEXT: vpcmpeqb %ymm3, %ymm2, %ymm21764; AVX512F-NEXT: vpcmpeqb %ymm3, %ymm0, %ymm01765; AVX512F-NEXT: vinserti64x4 $1, %ymm2, %zmm0, %zmm01766; AVX512F-NEXT: vpternlogd {{.*#+}} zmm0 = m32bcst ^ (zmm0 & (zmm1 ^ m32bcst))1767; AVX512F-NEXT: retq1768;1769; AVX512VL-LABEL: PR110875:1770; AVX512VL: # %bb.0:1771; AVX512VL-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm01772; AVX512VL-NEXT: vinserti64x4 $1, %ymm1, %zmm0, %zmm11773; AVX512VL-NEXT: vpbroadcastq %rdi, %ymm01774; AVX512VL-NEXT: vpshufb {{.*#+}} ymm2 = ymm0[0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,18,18,18,18,18,18,18,18,19,19,19,19,19,19,19,19]1775; AVX512VL-NEXT: vpshufb {{.*#+}} ymm0 = ymm0[4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,22,22,22,22,22,22,22,22,23,23,23,23,23,23,23,23]1776; AVX512VL-NEXT: vinserti64x4 $1, %ymm0, %zmm2, %zmm01777; AVX512VL-NEXT: vpandq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %zmm0, %zmm01778; AVX512VL-NEXT: vextracti64x4 $1, %zmm0, %ymm21779; AVX512VL-NEXT: vpxor %xmm3, %xmm3, %xmm31780; AVX512VL-NEXT: vpcmpeqb %ymm3, %ymm2, %ymm21781; AVX512VL-NEXT: vpcmpeqb %ymm3, %ymm0, %ymm01782; AVX512VL-NEXT: vinserti64x4 $1, %ymm2, %zmm0, %zmm01783; AVX512VL-NEXT: vpternlogd {{.*#+}} zmm0 = m32bcst ^ (zmm0 & (zmm1 ^ m32bcst))1784; AVX512VL-NEXT: retq1785;1786; XOP-LABEL: PR110875:1787; XOP: # %bb.0:1788; XOP-NEXT: vmovq %rdi, %xmm21789; XOP-NEXT: vpunpcklbw {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]1790; XOP-NEXT: vpshufhw {{.*#+}} xmm3 = xmm2[0,1,2,3,4,4,5,5]1791; XOP-NEXT: vpshufhw {{.*#+}} xmm4 = xmm2[0,1,2,3,6,6,7,7]1792; XOP-NEXT: vinsertf128 $1, %xmm4, %ymm3, %ymm31793; XOP-NEXT: vshufps {{.*#+}} ymm3 = ymm3[2,2,3,3,6,6,7,7]1794; XOP-NEXT: vpshuflw {{.*#+}} xmm4 = xmm2[0,0,1,1,4,5,6,7]1795; XOP-NEXT: vpshuflw {{.*#+}} xmm2 = xmm2[2,2,3,3,4,5,6,7]1796; XOP-NEXT: vinsertf128 $1, %xmm2, %ymm4, %ymm21797; XOP-NEXT: vshufps {{.*#+}} ymm2 = ymm2[0,0,1,1,4,4,5,5]1798; XOP-NEXT: vbroadcastsd {{.*#+}} ymm4 = [1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128]1799; XOP-NEXT: vandps %ymm4, %ymm2, %ymm21800; XOP-NEXT: vandps %ymm4, %ymm3, %ymm31801; XOP-NEXT: vextractf128 $1, %ymm3, %xmm41802; XOP-NEXT: vpxor %xmm5, %xmm5, %xmm51803; XOP-NEXT: vpcomeqb %xmm5, %xmm4, %xmm41804; XOP-NEXT: vpcomeqb %xmm5, %xmm3, %xmm31805; XOP-NEXT: vinsertf128 $1, %xmm4, %ymm3, %ymm31806; XOP-NEXT: vextractf128 $1, %ymm2, %xmm41807; XOP-NEXT: vpcomeqb %xmm5, %xmm4, %xmm41808; XOP-NEXT: vpcomeqb %xmm5, %xmm2, %xmm21809; XOP-NEXT: vinsertf128 $1, %xmm4, %ymm2, %ymm21810; XOP-NEXT: vbroadcastss {{.*#+}} ymm4 = [20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20]1811; XOP-NEXT: vpcmov %ymm2, %ymm4, %ymm0, %ymm01812; XOP-NEXT: vpcmov %ymm3, %ymm4, %ymm1, %ymm11813; XOP-NEXT: retq1814 %concat = shufflevector <32 x i8> %a0, <32 x i8> %a1, <64 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31, i32 32, i32 33, i32 34, i32 35, i32 36, i32 37, i32 38, i32 39, i32 40, i32 41, i32 42, i32 43, i32 44, i32 45, i32 46, i32 47, i32 48, i32 49, i32 50, i32 51, i32 52, i32 53, i32 54, i32 55, i32 56, i32 57, i32 58, i32 59, i32 60, i32 61, i32 62, i32 63>1815 %scl = insertelement <1 x i64> poison, i64 %a2, i64 01816 %splat = shufflevector <1 x i64> %scl, <1 x i64> poison, <8 x i32> <i32 0, i32 poison, i32 0, i32 poison, i32 0, i32 poison, i32 0, i32 poison>1817 %ref = bitcast <8 x i64> %splat to <64 x i8>1818 %shuf = shufflevector <64 x i8> %ref, <64 x i8> poison, <64 x i32> <i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 18, i32 18, i32 18, i32 18, i32 18, i32 18, i32 18, i32 18, i32 19, i32 19, i32 19, i32 19, i32 19, i32 19, i32 19, i32 19, i32 36, i32 36, i32 36, i32 36, i32 36, i32 36, i32 36, i32 36, i32 37, i32 37, i32 37, i32 37, i32 37, i32 37, i32 37, i32 37, i32 54, i32 54, i32 54, i32 54, i32 54, i32 54, i32 54, i32 54, i32 55, i32 55, i32 55, i32 55, i32 55, i32 55, i32 55, i32 55>1819 %mask = and <64 x i8> %shuf, <i8 1, i8 2, i8 4, i8 8, i8 16, i8 32, i8 64, i8 -128, i8 1, i8 2, i8 4, i8 8, i8 16, i8 32, i8 64, i8 -128, i8 1, i8 2, i8 4, i8 8, i8 16, i8 32, i8 64, i8 -128, i8 1, i8 2, i8 4, i8 8, i8 16, i8 32, i8 64, i8 -128, i8 1, i8 2, i8 4, i8 8, i8 16, i8 32, i8 64, i8 -128, i8 1, i8 2, i8 4, i8 8, i8 16, i8 32, i8 64, i8 -128, i8 1, i8 2, i8 4, i8 8, i8 16, i8 32, i8 64, i8 -128, i8 1, i8 2, i8 4, i8 8, i8 16, i8 32, i8 64, i8 -128>1820 %cmp = icmp eq <64 x i8> %mask, zeroinitializer1821 %res = select <64 x i1> %cmp, <64 x i8> %concat, <64 x i8> <i8 20, i8 20, i8 20, i8 20, i8 20, i8 20, i8 20, i8 20, i8 20, i8 20, i8 20, i8 20, i8 20, i8 20, i8 20, i8 20, i8 20, i8 20, i8 20, i8 20, i8 20, i8 20, i8 20, i8 20, i8 20, i8 20, i8 20, i8 20, i8 20, i8 20, i8 20, i8 20, i8 20, i8 20, i8 20, i8 20, i8 20, i8 20, i8 20, i8 20, i8 20, i8 20, i8 20, i8 20, i8 20, i8 20, i8 20, i8 20, i8 20, i8 20, i8 20, i8 20, i8 20, i8 20, i8 20, i8 20, i8 20, i8 20, i8 20, i8 20, i8 20, i8 20, i8 20, i8 20>1822 ret <64 x i8> %res1823}1824 1825attributes #0 = { "no-nans-fp-math"="true" }1826;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:1827; AVX: {{.*}}1828