1537 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=x86_64-unknown-linux-gnu -mattr=+avx512f,+avx512vl %s -o - | FileCheck %s3 4define <2 x double> @test_2xdouble_dup_low(<2 x double> %vec) {5; CHECK-LABEL: test_2xdouble_dup_low:6; CHECK: # %bb.0:7; CHECK-NEXT: vmovddup {{.*#+}} xmm0 = xmm0[0,0]8; CHECK-NEXT: retq9 %res = shufflevector <2 x double> %vec, <2 x double> undef, <2 x i32> <i32 0, i32 0>10 ret <2 x double> %res11}12define <2 x double> @test_masked_2xdouble_dup_low_mask0(<2 x double> %vec, <2 x double> %vec2, <2 x double> %mask) {13; CHECK-LABEL: test_masked_2xdouble_dup_low_mask0:14; CHECK: # %bb.0:15; CHECK-NEXT: vxorpd %xmm3, %xmm3, %xmm316; CHECK-NEXT: vcmpeqpd %xmm3, %xmm2, %k117; CHECK-NEXT: vmovddup {{.*#+}} xmm1 {%k1} = xmm0[0,0]18; CHECK-NEXT: vmovapd %xmm1, %xmm019; CHECK-NEXT: retq20 %shuf = shufflevector <2 x double> %vec, <2 x double> undef, <2 x i32> <i32 0, i32 0>21 %cmp = fcmp oeq <2 x double> %mask, zeroinitializer22 %res = select <2 x i1> %cmp, <2 x double> %shuf, <2 x double> %vec223 ret <2 x double> %res24}25 26define <2 x double> @test_masked_z_2xdouble_dup_low_mask0(<2 x double> %vec, <2 x double> %mask) {27; CHECK-LABEL: test_masked_z_2xdouble_dup_low_mask0:28; CHECK: # %bb.0:29; CHECK-NEXT: vxorpd %xmm2, %xmm2, %xmm230; CHECK-NEXT: vcmpeqpd %xmm2, %xmm1, %k131; CHECK-NEXT: vmovddup {{.*#+}} xmm0 {%k1} {z} = xmm0[0,0]32; CHECK-NEXT: retq33 %shuf = shufflevector <2 x double> %vec, <2 x double> undef, <2 x i32> <i32 0, i32 0>34 %cmp = fcmp oeq <2 x double> %mask, zeroinitializer35 %res = select <2 x i1> %cmp, <2 x double> %shuf, <2 x double> zeroinitializer36 ret <2 x double> %res37}38define <2 x double> @test_masked_2xdouble_dup_low_mask1(<2 x double> %vec, <2 x double> %vec2, <2 x double> %mask) {39; CHECK-LABEL: test_masked_2xdouble_dup_low_mask1:40; CHECK: # %bb.0:41; CHECK-NEXT: vxorpd %xmm3, %xmm3, %xmm342; CHECK-NEXT: vcmpeqpd %xmm3, %xmm2, %k143; CHECK-NEXT: vmovddup {{.*#+}} xmm1 {%k1} = xmm0[0,0]44; CHECK-NEXT: vmovapd %xmm1, %xmm045; CHECK-NEXT: retq46 %shuf = shufflevector <2 x double> %vec, <2 x double> undef, <2 x i32> <i32 0, i32 0>47 %cmp = fcmp oeq <2 x double> %mask, zeroinitializer48 %res = select <2 x i1> %cmp, <2 x double> %shuf, <2 x double> %vec249 ret <2 x double> %res50}51 52define <2 x double> @test_masked_z_2xdouble_dup_low_mask1(<2 x double> %vec, <2 x double> %mask) {53; CHECK-LABEL: test_masked_z_2xdouble_dup_low_mask1:54; CHECK: # %bb.0:55; CHECK-NEXT: vxorpd %xmm2, %xmm2, %xmm256; CHECK-NEXT: vcmpeqpd %xmm2, %xmm1, %k157; CHECK-NEXT: vmovddup {{.*#+}} xmm0 {%k1} {z} = xmm0[0,0]58; CHECK-NEXT: retq59 %shuf = shufflevector <2 x double> %vec, <2 x double> undef, <2 x i32> <i32 0, i32 0>60 %cmp = fcmp oeq <2 x double> %mask, zeroinitializer61 %res = select <2 x i1> %cmp, <2 x double> %shuf, <2 x double> zeroinitializer62 ret <2 x double> %res63}64define <2 x double> @test_2xdouble_dup_low_mem(ptr %vp) {65; CHECK-LABEL: test_2xdouble_dup_low_mem:66; CHECK: # %bb.0:67; CHECK-NEXT: vmovddup {{.*#+}} xmm0 = mem[0,0]68; CHECK-NEXT: retq69 %vec = load <2 x double>, ptr %vp70 %res = shufflevector <2 x double> %vec, <2 x double> undef, <2 x i32> <i32 0, i32 0>71 ret <2 x double> %res72}73define <2 x double> @test_masked_2xdouble_dup_low_mem_mask0(ptr %vp, <2 x double> %vec2, <2 x double> %mask) {74; CHECK-LABEL: test_masked_2xdouble_dup_low_mem_mask0:75; CHECK: # %bb.0:76; CHECK-NEXT: vxorpd %xmm2, %xmm2, %xmm277; CHECK-NEXT: vcmpeqpd %xmm2, %xmm1, %k178; CHECK-NEXT: vmovddup {{.*#+}} xmm0 {%k1} = mem[0,0]79; CHECK-NEXT: retq80 %vec = load <2 x double>, ptr %vp81 %shuf = shufflevector <2 x double> %vec, <2 x double> undef, <2 x i32> <i32 0, i32 0>82 %cmp = fcmp oeq <2 x double> %mask, zeroinitializer83 %res = select <2 x i1> %cmp, <2 x double> %shuf, <2 x double> %vec284 ret <2 x double> %res85}86 87define <2 x double> @test_masked_z_2xdouble_dup_low_mem_mask0(ptr %vp, <2 x double> %mask) {88; CHECK-LABEL: test_masked_z_2xdouble_dup_low_mem_mask0:89; CHECK: # %bb.0:90; CHECK-NEXT: vxorpd %xmm1, %xmm1, %xmm191; CHECK-NEXT: vcmpeqpd %xmm1, %xmm0, %k192; CHECK-NEXT: vmovddup {{.*#+}} xmm0 {%k1} {z} = mem[0,0]93; CHECK-NEXT: retq94 %vec = load <2 x double>, ptr %vp95 %shuf = shufflevector <2 x double> %vec, <2 x double> undef, <2 x i32> <i32 0, i32 0>96 %cmp = fcmp oeq <2 x double> %mask, zeroinitializer97 %res = select <2 x i1> %cmp, <2 x double> %shuf, <2 x double> zeroinitializer98 ret <2 x double> %res99}100define <2 x double> @test_masked_2xdouble_dup_low_mem_mask1(ptr %vp, <2 x double> %vec2, <2 x double> %mask) {101; CHECK-LABEL: test_masked_2xdouble_dup_low_mem_mask1:102; CHECK: # %bb.0:103; CHECK-NEXT: vxorpd %xmm2, %xmm2, %xmm2104; CHECK-NEXT: vcmpeqpd %xmm2, %xmm1, %k1105; CHECK-NEXT: vmovddup {{.*#+}} xmm0 {%k1} = mem[0,0]106; CHECK-NEXT: retq107 %vec = load <2 x double>, ptr %vp108 %shuf = shufflevector <2 x double> %vec, <2 x double> undef, <2 x i32> <i32 0, i32 0>109 %cmp = fcmp oeq <2 x double> %mask, zeroinitializer110 %res = select <2 x i1> %cmp, <2 x double> %shuf, <2 x double> %vec2111 ret <2 x double> %res112}113 114define <2 x double> @test_masked_z_2xdouble_dup_low_mem_mask1(ptr %vp, <2 x double> %mask) {115; CHECK-LABEL: test_masked_z_2xdouble_dup_low_mem_mask1:116; CHECK: # %bb.0:117; CHECK-NEXT: vxorpd %xmm1, %xmm1, %xmm1118; CHECK-NEXT: vcmpeqpd %xmm1, %xmm0, %k1119; CHECK-NEXT: vmovddup {{.*#+}} xmm0 {%k1} {z} = mem[0,0]120; CHECK-NEXT: retq121 %vec = load <2 x double>, ptr %vp122 %shuf = shufflevector <2 x double> %vec, <2 x double> undef, <2 x i32> <i32 0, i32 0>123 %cmp = fcmp oeq <2 x double> %mask, zeroinitializer124 %res = select <2 x i1> %cmp, <2 x double> %shuf, <2 x double> zeroinitializer125 ret <2 x double> %res126}127define <4 x double> @test_4xdouble_dup_low(<4 x double> %vec) {128; CHECK-LABEL: test_4xdouble_dup_low:129; CHECK: # %bb.0:130; CHECK-NEXT: vmovddup {{.*#+}} ymm0 = ymm0[0,0,2,2]131; CHECK-NEXT: retq132 %res = shufflevector <4 x double> %vec, <4 x double> undef, <4 x i32> <i32 0, i32 0, i32 2, i32 2>133 ret <4 x double> %res134}135define <4 x double> @test_masked_4xdouble_dup_low_mask0(<4 x double> %vec, <4 x double> %vec2, <4 x double> %mask) {136; CHECK-LABEL: test_masked_4xdouble_dup_low_mask0:137; CHECK: # %bb.0:138; CHECK-NEXT: vxorpd %xmm3, %xmm3, %xmm3139; CHECK-NEXT: vcmpeqpd %ymm3, %ymm2, %k1140; CHECK-NEXT: vmovddup {{.*#+}} ymm1 {%k1} = ymm0[0,0,2,2]141; CHECK-NEXT: vmovapd %ymm1, %ymm0142; CHECK-NEXT: retq143 %shuf = shufflevector <4 x double> %vec, <4 x double> undef, <4 x i32> <i32 0, i32 0, i32 2, i32 2>144 %cmp = fcmp oeq <4 x double> %mask, zeroinitializer145 %res = select <4 x i1> %cmp, <4 x double> %shuf, <4 x double> %vec2146 ret <4 x double> %res147}148 149define <4 x double> @test_masked_z_4xdouble_dup_low_mask0(<4 x double> %vec, <4 x double> %mask) {150; CHECK-LABEL: test_masked_z_4xdouble_dup_low_mask0:151; CHECK: # %bb.0:152; CHECK-NEXT: vxorpd %xmm2, %xmm2, %xmm2153; CHECK-NEXT: vcmpeqpd %ymm2, %ymm1, %k1154; CHECK-NEXT: vmovddup {{.*#+}} ymm0 {%k1} {z} = ymm0[0,0,2,2]155; CHECK-NEXT: retq156 %shuf = shufflevector <4 x double> %vec, <4 x double> undef, <4 x i32> <i32 0, i32 0, i32 2, i32 2>157 %cmp = fcmp oeq <4 x double> %mask, zeroinitializer158 %res = select <4 x i1> %cmp, <4 x double> %shuf, <4 x double> zeroinitializer159 ret <4 x double> %res160}161define <4 x double> @test_masked_4xdouble_dup_low_mask1(<4 x double> %vec, <4 x double> %vec2, <4 x double> %mask) {162; CHECK-LABEL: test_masked_4xdouble_dup_low_mask1:163; CHECK: # %bb.0:164; CHECK-NEXT: vxorpd %xmm3, %xmm3, %xmm3165; CHECK-NEXT: vcmpeqpd %ymm3, %ymm2, %k1166; CHECK-NEXT: vmovddup {{.*#+}} ymm1 {%k1} = ymm0[0,0,2,2]167; CHECK-NEXT: vmovapd %ymm1, %ymm0168; CHECK-NEXT: retq169 %shuf = shufflevector <4 x double> %vec, <4 x double> undef, <4 x i32> <i32 0, i32 0, i32 2, i32 2>170 %cmp = fcmp oeq <4 x double> %mask, zeroinitializer171 %res = select <4 x i1> %cmp, <4 x double> %shuf, <4 x double> %vec2172 ret <4 x double> %res173}174 175define <4 x double> @test_masked_z_4xdouble_dup_low_mask1(<4 x double> %vec, <4 x double> %mask) {176; CHECK-LABEL: test_masked_z_4xdouble_dup_low_mask1:177; CHECK: # %bb.0:178; CHECK-NEXT: vxorpd %xmm2, %xmm2, %xmm2179; CHECK-NEXT: vcmpeqpd %ymm2, %ymm1, %k1180; CHECK-NEXT: vmovddup {{.*#+}} ymm0 {%k1} {z} = ymm0[0,0,2,2]181; CHECK-NEXT: retq182 %shuf = shufflevector <4 x double> %vec, <4 x double> undef, <4 x i32> <i32 0, i32 0, i32 2, i32 2>183 %cmp = fcmp oeq <4 x double> %mask, zeroinitializer184 %res = select <4 x i1> %cmp, <4 x double> %shuf, <4 x double> zeroinitializer185 ret <4 x double> %res186}187define <4 x double> @test_masked_4xdouble_dup_low_mask2(<4 x double> %vec, <4 x double> %vec2, <4 x double> %mask) {188; CHECK-LABEL: test_masked_4xdouble_dup_low_mask2:189; CHECK: # %bb.0:190; CHECK-NEXT: vxorpd %xmm3, %xmm3, %xmm3191; CHECK-NEXT: vcmpeqpd %ymm3, %ymm2, %k1192; CHECK-NEXT: vmovddup {{.*#+}} ymm1 {%k1} = ymm0[0,0,2,2]193; CHECK-NEXT: vmovapd %ymm1, %ymm0194; CHECK-NEXT: retq195 %shuf = shufflevector <4 x double> %vec, <4 x double> undef, <4 x i32> <i32 0, i32 0, i32 2, i32 2>196 %cmp = fcmp oeq <4 x double> %mask, zeroinitializer197 %res = select <4 x i1> %cmp, <4 x double> %shuf, <4 x double> %vec2198 ret <4 x double> %res199}200 201define <4 x double> @test_masked_z_4xdouble_dup_low_mask2(<4 x double> %vec, <4 x double> %mask) {202; CHECK-LABEL: test_masked_z_4xdouble_dup_low_mask2:203; CHECK: # %bb.0:204; CHECK-NEXT: vxorpd %xmm2, %xmm2, %xmm2205; CHECK-NEXT: vcmpeqpd %ymm2, %ymm1, %k1206; CHECK-NEXT: vmovddup {{.*#+}} ymm0 {%k1} {z} = ymm0[0,0,2,2]207; CHECK-NEXT: retq208 %shuf = shufflevector <4 x double> %vec, <4 x double> undef, <4 x i32> <i32 0, i32 0, i32 2, i32 2>209 %cmp = fcmp oeq <4 x double> %mask, zeroinitializer210 %res = select <4 x i1> %cmp, <4 x double> %shuf, <4 x double> zeroinitializer211 ret <4 x double> %res212}213define <4 x double> @test_masked_4xdouble_dup_low_mask3(<4 x double> %vec, <4 x double> %vec2, <4 x double> %mask) {214; CHECK-LABEL: test_masked_4xdouble_dup_low_mask3:215; CHECK: # %bb.0:216; CHECK-NEXT: vxorpd %xmm3, %xmm3, %xmm3217; CHECK-NEXT: vcmpeqpd %ymm3, %ymm2, %k1218; CHECK-NEXT: vmovddup {{.*#+}} ymm1 {%k1} = ymm0[0,0,2,2]219; CHECK-NEXT: vmovapd %ymm1, %ymm0220; CHECK-NEXT: retq221 %shuf = shufflevector <4 x double> %vec, <4 x double> undef, <4 x i32> <i32 0, i32 0, i32 2, i32 2>222 %cmp = fcmp oeq <4 x double> %mask, zeroinitializer223 %res = select <4 x i1> %cmp, <4 x double> %shuf, <4 x double> %vec2224 ret <4 x double> %res225}226 227define <4 x double> @test_masked_z_4xdouble_dup_low_mask3(<4 x double> %vec, <4 x double> %mask) {228; CHECK-LABEL: test_masked_z_4xdouble_dup_low_mask3:229; CHECK: # %bb.0:230; CHECK-NEXT: vxorpd %xmm2, %xmm2, %xmm2231; CHECK-NEXT: vcmpeqpd %ymm2, %ymm1, %k1232; CHECK-NEXT: vmovddup {{.*#+}} ymm0 {%k1} {z} = ymm0[0,0,2,2]233; CHECK-NEXT: retq234 %shuf = shufflevector <4 x double> %vec, <4 x double> undef, <4 x i32> <i32 0, i32 0, i32 2, i32 2>235 %cmp = fcmp oeq <4 x double> %mask, zeroinitializer236 %res = select <4 x i1> %cmp, <4 x double> %shuf, <4 x double> zeroinitializer237 ret <4 x double> %res238}239define <4 x double> @test_masked_4xdouble_dup_low_mask4(<4 x double> %vec, <4 x double> %vec2, <4 x double> %mask) {240; CHECK-LABEL: test_masked_4xdouble_dup_low_mask4:241; CHECK: # %bb.0:242; CHECK-NEXT: vxorpd %xmm3, %xmm3, %xmm3243; CHECK-NEXT: vcmpeqpd %ymm3, %ymm2, %k1244; CHECK-NEXT: vmovddup {{.*#+}} ymm1 {%k1} = ymm0[0,0,2,2]245; CHECK-NEXT: vmovapd %ymm1, %ymm0246; CHECK-NEXT: retq247 %shuf = shufflevector <4 x double> %vec, <4 x double> undef, <4 x i32> <i32 0, i32 0, i32 2, i32 2>248 %cmp = fcmp oeq <4 x double> %mask, zeroinitializer249 %res = select <4 x i1> %cmp, <4 x double> %shuf, <4 x double> %vec2250 ret <4 x double> %res251}252 253define <4 x double> @test_masked_z_4xdouble_dup_low_mask4(<4 x double> %vec, <4 x double> %mask) {254; CHECK-LABEL: test_masked_z_4xdouble_dup_low_mask4:255; CHECK: # %bb.0:256; CHECK-NEXT: vxorpd %xmm2, %xmm2, %xmm2257; CHECK-NEXT: vcmpeqpd %ymm2, %ymm1, %k1258; CHECK-NEXT: vmovddup {{.*#+}} ymm0 {%k1} {z} = ymm0[0,0,2,2]259; CHECK-NEXT: retq260 %shuf = shufflevector <4 x double> %vec, <4 x double> undef, <4 x i32> <i32 0, i32 0, i32 2, i32 2>261 %cmp = fcmp oeq <4 x double> %mask, zeroinitializer262 %res = select <4 x i1> %cmp, <4 x double> %shuf, <4 x double> zeroinitializer263 ret <4 x double> %res264}265define <4 x double> @test_4xdouble_dup_low_mem(ptr %vp) {266; CHECK-LABEL: test_4xdouble_dup_low_mem:267; CHECK: # %bb.0:268; CHECK-NEXT: vmovddup {{.*#+}} ymm0 = mem[0,0,2,2]269; CHECK-NEXT: retq270 %vec = load <4 x double>, ptr %vp271 %res = shufflevector <4 x double> %vec, <4 x double> undef, <4 x i32> <i32 0, i32 0, i32 2, i32 2>272 ret <4 x double> %res273}274define <4 x double> @test_masked_4xdouble_dup_low_mem_mask0(ptr %vp, <4 x double> %vec2, <4 x double> %mask) {275; CHECK-LABEL: test_masked_4xdouble_dup_low_mem_mask0:276; CHECK: # %bb.0:277; CHECK-NEXT: vxorpd %xmm2, %xmm2, %xmm2278; CHECK-NEXT: vcmpeqpd %ymm2, %ymm1, %k1279; CHECK-NEXT: vmovddup {{.*#+}} ymm0 {%k1} = mem[0,0,2,2]280; CHECK-NEXT: retq281 %vec = load <4 x double>, ptr %vp282 %shuf = shufflevector <4 x double> %vec, <4 x double> undef, <4 x i32> <i32 0, i32 0, i32 2, i32 2>283 %cmp = fcmp oeq <4 x double> %mask, zeroinitializer284 %res = select <4 x i1> %cmp, <4 x double> %shuf, <4 x double> %vec2285 ret <4 x double> %res286}287 288define <4 x double> @test_masked_z_4xdouble_dup_low_mem_mask0(ptr %vp, <4 x double> %mask) {289; CHECK-LABEL: test_masked_z_4xdouble_dup_low_mem_mask0:290; CHECK: # %bb.0:291; CHECK-NEXT: vxorpd %xmm1, %xmm1, %xmm1292; CHECK-NEXT: vcmpeqpd %ymm1, %ymm0, %k1293; CHECK-NEXT: vmovddup {{.*#+}} ymm0 {%k1} {z} = mem[0,0,2,2]294; CHECK-NEXT: retq295 %vec = load <4 x double>, ptr %vp296 %shuf = shufflevector <4 x double> %vec, <4 x double> undef, <4 x i32> <i32 0, i32 0, i32 2, i32 2>297 %cmp = fcmp oeq <4 x double> %mask, zeroinitializer298 %res = select <4 x i1> %cmp, <4 x double> %shuf, <4 x double> zeroinitializer299 ret <4 x double> %res300}301define <4 x double> @test_masked_4xdouble_dup_low_mem_mask1(ptr %vp, <4 x double> %vec2, <4 x double> %mask) {302; CHECK-LABEL: test_masked_4xdouble_dup_low_mem_mask1:303; CHECK: # %bb.0:304; CHECK-NEXT: vxorpd %xmm2, %xmm2, %xmm2305; CHECK-NEXT: vcmpeqpd %ymm2, %ymm1, %k1306; CHECK-NEXT: vmovddup {{.*#+}} ymm0 {%k1} = mem[0,0,2,2]307; CHECK-NEXT: retq308 %vec = load <4 x double>, ptr %vp309 %shuf = shufflevector <4 x double> %vec, <4 x double> undef, <4 x i32> <i32 0, i32 0, i32 2, i32 2>310 %cmp = fcmp oeq <4 x double> %mask, zeroinitializer311 %res = select <4 x i1> %cmp, <4 x double> %shuf, <4 x double> %vec2312 ret <4 x double> %res313}314 315define <4 x double> @test_masked_z_4xdouble_dup_low_mem_mask1(ptr %vp, <4 x double> %mask) {316; CHECK-LABEL: test_masked_z_4xdouble_dup_low_mem_mask1:317; CHECK: # %bb.0:318; CHECK-NEXT: vxorpd %xmm1, %xmm1, %xmm1319; CHECK-NEXT: vcmpeqpd %ymm1, %ymm0, %k1320; CHECK-NEXT: vmovddup {{.*#+}} ymm0 {%k1} {z} = mem[0,0,2,2]321; CHECK-NEXT: retq322 %vec = load <4 x double>, ptr %vp323 %shuf = shufflevector <4 x double> %vec, <4 x double> undef, <4 x i32> <i32 0, i32 0, i32 2, i32 2>324 %cmp = fcmp oeq <4 x double> %mask, zeroinitializer325 %res = select <4 x i1> %cmp, <4 x double> %shuf, <4 x double> zeroinitializer326 ret <4 x double> %res327}328define <4 x double> @test_masked_4xdouble_dup_low_mem_mask2(ptr %vp, <4 x double> %vec2, <4 x double> %mask) {329; CHECK-LABEL: test_masked_4xdouble_dup_low_mem_mask2:330; CHECK: # %bb.0:331; CHECK-NEXT: vxorpd %xmm2, %xmm2, %xmm2332; CHECK-NEXT: vcmpeqpd %ymm2, %ymm1, %k1333; CHECK-NEXT: vmovddup {{.*#+}} ymm0 {%k1} = mem[0,0,2,2]334; CHECK-NEXT: retq335 %vec = load <4 x double>, ptr %vp336 %shuf = shufflevector <4 x double> %vec, <4 x double> undef, <4 x i32> <i32 0, i32 0, i32 2, i32 2>337 %cmp = fcmp oeq <4 x double> %mask, zeroinitializer338 %res = select <4 x i1> %cmp, <4 x double> %shuf, <4 x double> %vec2339 ret <4 x double> %res340}341 342define <4 x double> @test_masked_z_4xdouble_dup_low_mem_mask2(ptr %vp, <4 x double> %mask) {343; CHECK-LABEL: test_masked_z_4xdouble_dup_low_mem_mask2:344; CHECK: # %bb.0:345; CHECK-NEXT: vxorpd %xmm1, %xmm1, %xmm1346; CHECK-NEXT: vcmpeqpd %ymm1, %ymm0, %k1347; CHECK-NEXT: vmovddup {{.*#+}} ymm0 {%k1} {z} = mem[0,0,2,2]348; CHECK-NEXT: retq349 %vec = load <4 x double>, ptr %vp350 %shuf = shufflevector <4 x double> %vec, <4 x double> undef, <4 x i32> <i32 0, i32 0, i32 2, i32 2>351 %cmp = fcmp oeq <4 x double> %mask, zeroinitializer352 %res = select <4 x i1> %cmp, <4 x double> %shuf, <4 x double> zeroinitializer353 ret <4 x double> %res354}355define <4 x double> @test_masked_4xdouble_dup_low_mem_mask3(ptr %vp, <4 x double> %vec2, <4 x double> %mask) {356; CHECK-LABEL: test_masked_4xdouble_dup_low_mem_mask3:357; CHECK: # %bb.0:358; CHECK-NEXT: vxorpd %xmm2, %xmm2, %xmm2359; CHECK-NEXT: vcmpeqpd %ymm2, %ymm1, %k1360; CHECK-NEXT: vmovddup {{.*#+}} ymm0 {%k1} = mem[0,0,2,2]361; CHECK-NEXT: retq362 %vec = load <4 x double>, ptr %vp363 %shuf = shufflevector <4 x double> %vec, <4 x double> undef, <4 x i32> <i32 0, i32 0, i32 2, i32 2>364 %cmp = fcmp oeq <4 x double> %mask, zeroinitializer365 %res = select <4 x i1> %cmp, <4 x double> %shuf, <4 x double> %vec2366 ret <4 x double> %res367}368 369define <4 x double> @test_masked_z_4xdouble_dup_low_mem_mask3(ptr %vp, <4 x double> %mask) {370; CHECK-LABEL: test_masked_z_4xdouble_dup_low_mem_mask3:371; CHECK: # %bb.0:372; CHECK-NEXT: vxorpd %xmm1, %xmm1, %xmm1373; CHECK-NEXT: vcmpeqpd %ymm1, %ymm0, %k1374; CHECK-NEXT: vmovddup {{.*#+}} ymm0 {%k1} {z} = mem[0,0,2,2]375; CHECK-NEXT: retq376 %vec = load <4 x double>, ptr %vp377 %shuf = shufflevector <4 x double> %vec, <4 x double> undef, <4 x i32> <i32 0, i32 0, i32 2, i32 2>378 %cmp = fcmp oeq <4 x double> %mask, zeroinitializer379 %res = select <4 x i1> %cmp, <4 x double> %shuf, <4 x double> zeroinitializer380 ret <4 x double> %res381}382define <4 x double> @test_masked_4xdouble_dup_low_mem_mask4(ptr %vp, <4 x double> %vec2, <4 x double> %mask) {383; CHECK-LABEL: test_masked_4xdouble_dup_low_mem_mask4:384; CHECK: # %bb.0:385; CHECK-NEXT: vxorpd %xmm2, %xmm2, %xmm2386; CHECK-NEXT: vcmpeqpd %ymm2, %ymm1, %k1387; CHECK-NEXT: vmovddup {{.*#+}} ymm0 {%k1} = mem[0,0,2,2]388; CHECK-NEXT: retq389 %vec = load <4 x double>, ptr %vp390 %shuf = shufflevector <4 x double> %vec, <4 x double> undef, <4 x i32> <i32 0, i32 0, i32 2, i32 2>391 %cmp = fcmp oeq <4 x double> %mask, zeroinitializer392 %res = select <4 x i1> %cmp, <4 x double> %shuf, <4 x double> %vec2393 ret <4 x double> %res394}395 396define <4 x double> @test_masked_z_4xdouble_dup_low_mem_mask4(ptr %vp, <4 x double> %mask) {397; CHECK-LABEL: test_masked_z_4xdouble_dup_low_mem_mask4:398; CHECK: # %bb.0:399; CHECK-NEXT: vxorpd %xmm1, %xmm1, %xmm1400; CHECK-NEXT: vcmpeqpd %ymm1, %ymm0, %k1401; CHECK-NEXT: vmovddup {{.*#+}} ymm0 {%k1} {z} = mem[0,0,2,2]402; CHECK-NEXT: retq403 %vec = load <4 x double>, ptr %vp404 %shuf = shufflevector <4 x double> %vec, <4 x double> undef, <4 x i32> <i32 0, i32 0, i32 2, i32 2>405 %cmp = fcmp oeq <4 x double> %mask, zeroinitializer406 %res = select <4 x i1> %cmp, <4 x double> %shuf, <4 x double> zeroinitializer407 ret <4 x double> %res408}409define <8 x double> @test_8xdouble_dup_low(<8 x double> %vec) {410; CHECK-LABEL: test_8xdouble_dup_low:411; CHECK: # %bb.0:412; CHECK-NEXT: vmovddup {{.*#+}} zmm0 = zmm0[0,0,2,2,4,4,6,6]413; CHECK-NEXT: retq414 %res = shufflevector <8 x double> %vec, <8 x double> undef, <8 x i32> <i32 0, i32 0, i32 2, i32 2, i32 4, i32 4, i32 6, i32 6>415 ret <8 x double> %res416}417define <8 x double> @test_masked_8xdouble_dup_low_mask0(<8 x double> %vec, <8 x double> %vec2, <8 x double> %mask) {418; CHECK-LABEL: test_masked_8xdouble_dup_low_mask0:419; CHECK: # %bb.0:420; CHECK-NEXT: vxorpd %xmm3, %xmm3, %xmm3421; CHECK-NEXT: vcmpeqpd %zmm3, %zmm2, %k1422; CHECK-NEXT: vmovddup {{.*#+}} zmm1 {%k1} = zmm0[0,0,2,2,4,4,6,6]423; CHECK-NEXT: vmovapd %zmm1, %zmm0424; CHECK-NEXT: retq425 %shuf = shufflevector <8 x double> %vec, <8 x double> undef, <8 x i32> <i32 0, i32 0, i32 2, i32 2, i32 4, i32 4, i32 6, i32 6>426 %cmp = fcmp oeq <8 x double> %mask, zeroinitializer427 %res = select <8 x i1> %cmp, <8 x double> %shuf, <8 x double> %vec2428 ret <8 x double> %res429}430 431define <8 x double> @test_masked_z_8xdouble_dup_low_mask0(<8 x double> %vec, <8 x double> %mask) {432; CHECK-LABEL: test_masked_z_8xdouble_dup_low_mask0:433; CHECK: # %bb.0:434; CHECK-NEXT: vxorpd %xmm2, %xmm2, %xmm2435; CHECK-NEXT: vcmpeqpd %zmm2, %zmm1, %k1436; CHECK-NEXT: vmovddup {{.*#+}} zmm0 {%k1} {z} = zmm0[0,0,2,2,4,4,6,6]437; CHECK-NEXT: retq438 %shuf = shufflevector <8 x double> %vec, <8 x double> undef, <8 x i32> <i32 0, i32 0, i32 2, i32 2, i32 4, i32 4, i32 6, i32 6>439 %cmp = fcmp oeq <8 x double> %mask, zeroinitializer440 %res = select <8 x i1> %cmp, <8 x double> %shuf, <8 x double> zeroinitializer441 ret <8 x double> %res442}443define <8 x double> @test_masked_8xdouble_dup_low_mask1(<8 x double> %vec, <8 x double> %vec2, <8 x double> %mask) {444; CHECK-LABEL: test_masked_8xdouble_dup_low_mask1:445; CHECK: # %bb.0:446; CHECK-NEXT: vxorpd %xmm3, %xmm3, %xmm3447; CHECK-NEXT: vcmpeqpd %zmm3, %zmm2, %k1448; CHECK-NEXT: vmovddup {{.*#+}} zmm1 {%k1} = zmm0[0,0,2,2,4,4,6,6]449; CHECK-NEXT: vmovapd %zmm1, %zmm0450; CHECK-NEXT: retq451 %shuf = shufflevector <8 x double> %vec, <8 x double> undef, <8 x i32> <i32 0, i32 0, i32 2, i32 2, i32 4, i32 4, i32 6, i32 6>452 %cmp = fcmp oeq <8 x double> %mask, zeroinitializer453 %res = select <8 x i1> %cmp, <8 x double> %shuf, <8 x double> %vec2454 ret <8 x double> %res455}456 457define <8 x double> @test_masked_z_8xdouble_dup_low_mask1(<8 x double> %vec, <8 x double> %mask) {458; CHECK-LABEL: test_masked_z_8xdouble_dup_low_mask1:459; CHECK: # %bb.0:460; CHECK-NEXT: vxorpd %xmm2, %xmm2, %xmm2461; CHECK-NEXT: vcmpeqpd %zmm2, %zmm1, %k1462; CHECK-NEXT: vmovddup {{.*#+}} zmm0 {%k1} {z} = zmm0[0,0,2,2,4,4,6,6]463; CHECK-NEXT: retq464 %shuf = shufflevector <8 x double> %vec, <8 x double> undef, <8 x i32> <i32 0, i32 0, i32 2, i32 2, i32 4, i32 4, i32 6, i32 6>465 %cmp = fcmp oeq <8 x double> %mask, zeroinitializer466 %res = select <8 x i1> %cmp, <8 x double> %shuf, <8 x double> zeroinitializer467 ret <8 x double> %res468}469define <8 x double> @test_masked_8xdouble_dup_low_mask2(<8 x double> %vec, <8 x double> %vec2, <8 x double> %mask) {470; CHECK-LABEL: test_masked_8xdouble_dup_low_mask2:471; CHECK: # %bb.0:472; CHECK-NEXT: vxorpd %xmm3, %xmm3, %xmm3473; CHECK-NEXT: vcmpeqpd %zmm3, %zmm2, %k1474; CHECK-NEXT: vmovddup {{.*#+}} zmm1 {%k1} = zmm0[0,0,2,2,4,4,6,6]475; CHECK-NEXT: vmovapd %zmm1, %zmm0476; CHECK-NEXT: retq477 %shuf = shufflevector <8 x double> %vec, <8 x double> undef, <8 x i32> <i32 0, i32 0, i32 2, i32 2, i32 4, i32 4, i32 6, i32 6>478 %cmp = fcmp oeq <8 x double> %mask, zeroinitializer479 %res = select <8 x i1> %cmp, <8 x double> %shuf, <8 x double> %vec2480 ret <8 x double> %res481}482 483define <8 x double> @test_masked_z_8xdouble_dup_low_mask2(<8 x double> %vec, <8 x double> %mask) {484; CHECK-LABEL: test_masked_z_8xdouble_dup_low_mask2:485; CHECK: # %bb.0:486; CHECK-NEXT: vxorpd %xmm2, %xmm2, %xmm2487; CHECK-NEXT: vcmpeqpd %zmm2, %zmm1, %k1488; CHECK-NEXT: vmovddup {{.*#+}} zmm0 {%k1} {z} = zmm0[0,0,2,2,4,4,6,6]489; CHECK-NEXT: retq490 %shuf = shufflevector <8 x double> %vec, <8 x double> undef, <8 x i32> <i32 0, i32 0, i32 2, i32 2, i32 4, i32 4, i32 6, i32 6>491 %cmp = fcmp oeq <8 x double> %mask, zeroinitializer492 %res = select <8 x i1> %cmp, <8 x double> %shuf, <8 x double> zeroinitializer493 ret <8 x double> %res494}495define <8 x double> @test_masked_8xdouble_dup_low_mask3(<8 x double> %vec, <8 x double> %vec2, <8 x double> %mask) {496; CHECK-LABEL: test_masked_8xdouble_dup_low_mask3:497; CHECK: # %bb.0:498; CHECK-NEXT: vxorpd %xmm3, %xmm3, %xmm3499; CHECK-NEXT: vcmpeqpd %zmm3, %zmm2, %k1500; CHECK-NEXT: vmovddup {{.*#+}} zmm1 {%k1} = zmm0[0,0,2,2,4,4,6,6]501; CHECK-NEXT: vmovapd %zmm1, %zmm0502; CHECK-NEXT: retq503 %shuf = shufflevector <8 x double> %vec, <8 x double> undef, <8 x i32> <i32 0, i32 0, i32 2, i32 2, i32 4, i32 4, i32 6, i32 6>504 %cmp = fcmp oeq <8 x double> %mask, zeroinitializer505 %res = select <8 x i1> %cmp, <8 x double> %shuf, <8 x double> %vec2506 ret <8 x double> %res507}508 509define <8 x double> @test_masked_z_8xdouble_dup_low_mask3(<8 x double> %vec, <8 x double> %mask) {510; CHECK-LABEL: test_masked_z_8xdouble_dup_low_mask3:511; CHECK: # %bb.0:512; CHECK-NEXT: vxorpd %xmm2, %xmm2, %xmm2513; CHECK-NEXT: vcmpeqpd %zmm2, %zmm1, %k1514; CHECK-NEXT: vmovddup {{.*#+}} zmm0 {%k1} {z} = zmm0[0,0,2,2,4,4,6,6]515; CHECK-NEXT: retq516 %shuf = shufflevector <8 x double> %vec, <8 x double> undef, <8 x i32> <i32 0, i32 0, i32 2, i32 2, i32 4, i32 4, i32 6, i32 6>517 %cmp = fcmp oeq <8 x double> %mask, zeroinitializer518 %res = select <8 x i1> %cmp, <8 x double> %shuf, <8 x double> zeroinitializer519 ret <8 x double> %res520}521define <8 x double> @test_masked_8xdouble_dup_low_mask4(<8 x double> %vec, <8 x double> %vec2, <8 x double> %mask) {522; CHECK-LABEL: test_masked_8xdouble_dup_low_mask4:523; CHECK: # %bb.0:524; CHECK-NEXT: vxorpd %xmm3, %xmm3, %xmm3525; CHECK-NEXT: vcmpeqpd %zmm3, %zmm2, %k1526; CHECK-NEXT: vmovddup {{.*#+}} zmm1 {%k1} = zmm0[0,0,2,2,4,4,6,6]527; CHECK-NEXT: vmovapd %zmm1, %zmm0528; CHECK-NEXT: retq529 %shuf = shufflevector <8 x double> %vec, <8 x double> undef, <8 x i32> <i32 0, i32 0, i32 2, i32 2, i32 4, i32 4, i32 6, i32 6>530 %cmp = fcmp oeq <8 x double> %mask, zeroinitializer531 %res = select <8 x i1> %cmp, <8 x double> %shuf, <8 x double> %vec2532 ret <8 x double> %res533}534 535define <8 x double> @test_masked_z_8xdouble_dup_low_mask4(<8 x double> %vec, <8 x double> %mask) {536; CHECK-LABEL: test_masked_z_8xdouble_dup_low_mask4:537; CHECK: # %bb.0:538; CHECK-NEXT: vxorpd %xmm2, %xmm2, %xmm2539; CHECK-NEXT: vcmpeqpd %zmm2, %zmm1, %k1540; CHECK-NEXT: vmovddup {{.*#+}} zmm0 {%k1} {z} = zmm0[0,0,2,2,4,4,6,6]541; CHECK-NEXT: retq542 %shuf = shufflevector <8 x double> %vec, <8 x double> undef, <8 x i32> <i32 0, i32 0, i32 2, i32 2, i32 4, i32 4, i32 6, i32 6>543 %cmp = fcmp oeq <8 x double> %mask, zeroinitializer544 %res = select <8 x i1> %cmp, <8 x double> %shuf, <8 x double> zeroinitializer545 ret <8 x double> %res546}547define <8 x double> @test_8xdouble_dup_low_mem(ptr %vp) {548; CHECK-LABEL: test_8xdouble_dup_low_mem:549; CHECK: # %bb.0:550; CHECK-NEXT: vmovddup {{.*#+}} zmm0 = mem[0,0,2,2,4,4,6,6]551; CHECK-NEXT: retq552 %vec = load <8 x double>, ptr %vp553 %res = shufflevector <8 x double> %vec, <8 x double> undef, <8 x i32> <i32 0, i32 0, i32 2, i32 2, i32 4, i32 4, i32 6, i32 6>554 ret <8 x double> %res555}556define <8 x double> @test_masked_8xdouble_dup_low_mem_mask0(ptr %vp, <8 x double> %vec2, <8 x double> %mask) {557; CHECK-LABEL: test_masked_8xdouble_dup_low_mem_mask0:558; CHECK: # %bb.0:559; CHECK-NEXT: vxorpd %xmm2, %xmm2, %xmm2560; CHECK-NEXT: vcmpeqpd %zmm2, %zmm1, %k1561; CHECK-NEXT: vmovddup {{.*#+}} zmm0 {%k1} = mem[0,0,2,2,4,4,6,6]562; CHECK-NEXT: retq563 %vec = load <8 x double>, ptr %vp564 %shuf = shufflevector <8 x double> %vec, <8 x double> undef, <8 x i32> <i32 0, i32 0, i32 2, i32 2, i32 4, i32 4, i32 6, i32 6>565 %cmp = fcmp oeq <8 x double> %mask, zeroinitializer566 %res = select <8 x i1> %cmp, <8 x double> %shuf, <8 x double> %vec2567 ret <8 x double> %res568}569 570define <8 x double> @test_masked_z_8xdouble_dup_low_mem_mask0(ptr %vp, <8 x double> %mask) {571; CHECK-LABEL: test_masked_z_8xdouble_dup_low_mem_mask0:572; CHECK: # %bb.0:573; CHECK-NEXT: vxorpd %xmm1, %xmm1, %xmm1574; CHECK-NEXT: vcmpeqpd %zmm1, %zmm0, %k1575; CHECK-NEXT: vmovddup {{.*#+}} zmm0 {%k1} {z} = mem[0,0,2,2,4,4,6,6]576; CHECK-NEXT: retq577 %vec = load <8 x double>, ptr %vp578 %shuf = shufflevector <8 x double> %vec, <8 x double> undef, <8 x i32> <i32 0, i32 0, i32 2, i32 2, i32 4, i32 4, i32 6, i32 6>579 %cmp = fcmp oeq <8 x double> %mask, zeroinitializer580 %res = select <8 x i1> %cmp, <8 x double> %shuf, <8 x double> zeroinitializer581 ret <8 x double> %res582}583define <8 x double> @test_masked_8xdouble_dup_low_mem_mask1(ptr %vp, <8 x double> %vec2, <8 x double> %mask) {584; CHECK-LABEL: test_masked_8xdouble_dup_low_mem_mask1:585; CHECK: # %bb.0:586; CHECK-NEXT: vxorpd %xmm2, %xmm2, %xmm2587; CHECK-NEXT: vcmpeqpd %zmm2, %zmm1, %k1588; CHECK-NEXT: vmovddup {{.*#+}} zmm0 {%k1} = mem[0,0,2,2,4,4,6,6]589; CHECK-NEXT: retq590 %vec = load <8 x double>, ptr %vp591 %shuf = shufflevector <8 x double> %vec, <8 x double> undef, <8 x i32> <i32 0, i32 0, i32 2, i32 2, i32 4, i32 4, i32 6, i32 6>592 %cmp = fcmp oeq <8 x double> %mask, zeroinitializer593 %res = select <8 x i1> %cmp, <8 x double> %shuf, <8 x double> %vec2594 ret <8 x double> %res595}596 597define <8 x double> @test_masked_z_8xdouble_dup_low_mem_mask1(ptr %vp, <8 x double> %mask) {598; CHECK-LABEL: test_masked_z_8xdouble_dup_low_mem_mask1:599; CHECK: # %bb.0:600; CHECK-NEXT: vxorpd %xmm1, %xmm1, %xmm1601; CHECK-NEXT: vcmpeqpd %zmm1, %zmm0, %k1602; CHECK-NEXT: vmovddup {{.*#+}} zmm0 {%k1} {z} = mem[0,0,2,2,4,4,6,6]603; CHECK-NEXT: retq604 %vec = load <8 x double>, ptr %vp605 %shuf = shufflevector <8 x double> %vec, <8 x double> undef, <8 x i32> <i32 0, i32 0, i32 2, i32 2, i32 4, i32 4, i32 6, i32 6>606 %cmp = fcmp oeq <8 x double> %mask, zeroinitializer607 %res = select <8 x i1> %cmp, <8 x double> %shuf, <8 x double> zeroinitializer608 ret <8 x double> %res609}610define <8 x double> @test_masked_8xdouble_dup_low_mem_mask2(ptr %vp, <8 x double> %vec2, <8 x double> %mask) {611; CHECK-LABEL: test_masked_8xdouble_dup_low_mem_mask2:612; CHECK: # %bb.0:613; CHECK-NEXT: vxorpd %xmm2, %xmm2, %xmm2614; CHECK-NEXT: vcmpeqpd %zmm2, %zmm1, %k1615; CHECK-NEXT: vmovddup {{.*#+}} zmm0 {%k1} = mem[0,0,2,2,4,4,6,6]616; CHECK-NEXT: retq617 %vec = load <8 x double>, ptr %vp618 %shuf = shufflevector <8 x double> %vec, <8 x double> undef, <8 x i32> <i32 0, i32 0, i32 2, i32 2, i32 4, i32 4, i32 6, i32 6>619 %cmp = fcmp oeq <8 x double> %mask, zeroinitializer620 %res = select <8 x i1> %cmp, <8 x double> %shuf, <8 x double> %vec2621 ret <8 x double> %res622}623 624define <8 x double> @test_masked_z_8xdouble_dup_low_mem_mask2(ptr %vp, <8 x double> %mask) {625; CHECK-LABEL: test_masked_z_8xdouble_dup_low_mem_mask2:626; CHECK: # %bb.0:627; CHECK-NEXT: vxorpd %xmm1, %xmm1, %xmm1628; CHECK-NEXT: vcmpeqpd %zmm1, %zmm0, %k1629; CHECK-NEXT: vmovddup {{.*#+}} zmm0 {%k1} {z} = mem[0,0,2,2,4,4,6,6]630; CHECK-NEXT: retq631 %vec = load <8 x double>, ptr %vp632 %shuf = shufflevector <8 x double> %vec, <8 x double> undef, <8 x i32> <i32 0, i32 0, i32 2, i32 2, i32 4, i32 4, i32 6, i32 6>633 %cmp = fcmp oeq <8 x double> %mask, zeroinitializer634 %res = select <8 x i1> %cmp, <8 x double> %shuf, <8 x double> zeroinitializer635 ret <8 x double> %res636}637define <8 x double> @test_masked_8xdouble_dup_low_mem_mask3(ptr %vp, <8 x double> %vec2, <8 x double> %mask) {638; CHECK-LABEL: test_masked_8xdouble_dup_low_mem_mask3:639; CHECK: # %bb.0:640; CHECK-NEXT: vxorpd %xmm2, %xmm2, %xmm2641; CHECK-NEXT: vcmpeqpd %zmm2, %zmm1, %k1642; CHECK-NEXT: vmovddup {{.*#+}} zmm0 {%k1} = mem[0,0,2,2,4,4,6,6]643; CHECK-NEXT: retq644 %vec = load <8 x double>, ptr %vp645 %shuf = shufflevector <8 x double> %vec, <8 x double> undef, <8 x i32> <i32 0, i32 0, i32 2, i32 2, i32 4, i32 4, i32 6, i32 6>646 %cmp = fcmp oeq <8 x double> %mask, zeroinitializer647 %res = select <8 x i1> %cmp, <8 x double> %shuf, <8 x double> %vec2648 ret <8 x double> %res649}650 651define <8 x double> @test_masked_z_8xdouble_dup_low_mem_mask3(ptr %vp, <8 x double> %mask) {652; CHECK-LABEL: test_masked_z_8xdouble_dup_low_mem_mask3:653; CHECK: # %bb.0:654; CHECK-NEXT: vxorpd %xmm1, %xmm1, %xmm1655; CHECK-NEXT: vcmpeqpd %zmm1, %zmm0, %k1656; CHECK-NEXT: vmovddup {{.*#+}} zmm0 {%k1} {z} = mem[0,0,2,2,4,4,6,6]657; CHECK-NEXT: retq658 %vec = load <8 x double>, ptr %vp659 %shuf = shufflevector <8 x double> %vec, <8 x double> undef, <8 x i32> <i32 0, i32 0, i32 2, i32 2, i32 4, i32 4, i32 6, i32 6>660 %cmp = fcmp oeq <8 x double> %mask, zeroinitializer661 %res = select <8 x i1> %cmp, <8 x double> %shuf, <8 x double> zeroinitializer662 ret <8 x double> %res663}664define <8 x double> @test_masked_8xdouble_dup_low_mem_mask4(ptr %vp, <8 x double> %vec2, <8 x double> %mask) {665; CHECK-LABEL: test_masked_8xdouble_dup_low_mem_mask4:666; CHECK: # %bb.0:667; CHECK-NEXT: vxorpd %xmm2, %xmm2, %xmm2668; CHECK-NEXT: vcmpeqpd %zmm2, %zmm1, %k1669; CHECK-NEXT: vmovddup {{.*#+}} zmm0 {%k1} = mem[0,0,2,2,4,4,6,6]670; CHECK-NEXT: retq671 %vec = load <8 x double>, ptr %vp672 %shuf = shufflevector <8 x double> %vec, <8 x double> undef, <8 x i32> <i32 0, i32 0, i32 2, i32 2, i32 4, i32 4, i32 6, i32 6>673 %cmp = fcmp oeq <8 x double> %mask, zeroinitializer674 %res = select <8 x i1> %cmp, <8 x double> %shuf, <8 x double> %vec2675 ret <8 x double> %res676}677 678define <8 x double> @test_masked_z_8xdouble_dup_low_mem_mask4(ptr %vp, <8 x double> %mask) {679; CHECK-LABEL: test_masked_z_8xdouble_dup_low_mem_mask4:680; CHECK: # %bb.0:681; CHECK-NEXT: vxorpd %xmm1, %xmm1, %xmm1682; CHECK-NEXT: vcmpeqpd %zmm1, %zmm0, %k1683; CHECK-NEXT: vmovddup {{.*#+}} zmm0 {%k1} {z} = mem[0,0,2,2,4,4,6,6]684; CHECK-NEXT: retq685 %vec = load <8 x double>, ptr %vp686 %shuf = shufflevector <8 x double> %vec, <8 x double> undef, <8 x i32> <i32 0, i32 0, i32 2, i32 2, i32 4, i32 4, i32 6, i32 6>687 %cmp = fcmp oeq <8 x double> %mask, zeroinitializer688 %res = select <8 x i1> %cmp, <8 x double> %shuf, <8 x double> zeroinitializer689 ret <8 x double> %res690}691define <4 x float> @test_4xfloat_dup_low(<4 x float> %vec) {692; CHECK-LABEL: test_4xfloat_dup_low:693; CHECK: # %bb.0:694; CHECK-NEXT: vmovsldup {{.*#+}} xmm0 = xmm0[0,0,2,2]695; CHECK-NEXT: retq696 %res = shufflevector <4 x float> %vec, <4 x float> undef, <4 x i32> <i32 0, i32 0, i32 2, i32 2>697 ret <4 x float> %res698}699define <4 x float> @test_masked_4xfloat_dup_low_mask0(<4 x float> %vec, <4 x float> %vec2, <4 x float> %mask) {700; CHECK-LABEL: test_masked_4xfloat_dup_low_mask0:701; CHECK: # %bb.0:702; CHECK-NEXT: vxorps %xmm3, %xmm3, %xmm3703; CHECK-NEXT: vcmpeqps %xmm3, %xmm2, %k1704; CHECK-NEXT: vmovsldup {{.*#+}} xmm1 {%k1} = xmm0[0,0,2,2]705; CHECK-NEXT: vmovaps %xmm1, %xmm0706; CHECK-NEXT: retq707 %shuf = shufflevector <4 x float> %vec, <4 x float> undef, <4 x i32> <i32 0, i32 0, i32 2, i32 2>708 %cmp = fcmp oeq <4 x float> %mask, zeroinitializer709 %res = select <4 x i1> %cmp, <4 x float> %shuf, <4 x float> %vec2710 ret <4 x float> %res711}712 713define <4 x float> @test_masked_z_4xfloat_dup_low_mask0(<4 x float> %vec, <4 x float> %mask) {714; CHECK-LABEL: test_masked_z_4xfloat_dup_low_mask0:715; CHECK: # %bb.0:716; CHECK-NEXT: vxorps %xmm2, %xmm2, %xmm2717; CHECK-NEXT: vcmpeqps %xmm2, %xmm1, %k1718; CHECK-NEXT: vmovsldup {{.*#+}} xmm0 {%k1} {z} = xmm0[0,0,2,2]719; CHECK-NEXT: retq720 %shuf = shufflevector <4 x float> %vec, <4 x float> undef, <4 x i32> <i32 0, i32 0, i32 2, i32 2>721 %cmp = fcmp oeq <4 x float> %mask, zeroinitializer722 %res = select <4 x i1> %cmp, <4 x float> %shuf, <4 x float> zeroinitializer723 ret <4 x float> %res724}725define <4 x float> @test_masked_4xfloat_dup_low_mask1(<4 x float> %vec, <4 x float> %vec2, <4 x float> %mask) {726; CHECK-LABEL: test_masked_4xfloat_dup_low_mask1:727; CHECK: # %bb.0:728; CHECK-NEXT: vxorps %xmm3, %xmm3, %xmm3729; CHECK-NEXT: vcmpeqps %xmm3, %xmm2, %k1730; CHECK-NEXT: vmovsldup {{.*#+}} xmm1 {%k1} = xmm0[0,0,2,2]731; CHECK-NEXT: vmovaps %xmm1, %xmm0732; CHECK-NEXT: retq733 %shuf = shufflevector <4 x float> %vec, <4 x float> undef, <4 x i32> <i32 0, i32 0, i32 2, i32 2>734 %cmp = fcmp oeq <4 x float> %mask, zeroinitializer735 %res = select <4 x i1> %cmp, <4 x float> %shuf, <4 x float> %vec2736 ret <4 x float> %res737}738 739define <4 x float> @test_masked_z_4xfloat_dup_low_mask1(<4 x float> %vec, <4 x float> %mask) {740; CHECK-LABEL: test_masked_z_4xfloat_dup_low_mask1:741; CHECK: # %bb.0:742; CHECK-NEXT: vxorps %xmm2, %xmm2, %xmm2743; CHECK-NEXT: vcmpeqps %xmm2, %xmm1, %k1744; CHECK-NEXT: vmovsldup {{.*#+}} xmm0 {%k1} {z} = xmm0[0,0,2,2]745; CHECK-NEXT: retq746 %shuf = shufflevector <4 x float> %vec, <4 x float> undef, <4 x i32> <i32 0, i32 0, i32 2, i32 2>747 %cmp = fcmp oeq <4 x float> %mask, zeroinitializer748 %res = select <4 x i1> %cmp, <4 x float> %shuf, <4 x float> zeroinitializer749 ret <4 x float> %res750}751define <4 x float> @test_masked_4xfloat_dup_low_mask2(<4 x float> %vec, <4 x float> %vec2, <4 x float> %mask) {752; CHECK-LABEL: test_masked_4xfloat_dup_low_mask2:753; CHECK: # %bb.0:754; CHECK-NEXT: vxorps %xmm3, %xmm3, %xmm3755; CHECK-NEXT: vcmpeqps %xmm3, %xmm2, %k1756; CHECK-NEXT: vmovsldup {{.*#+}} xmm1 {%k1} = xmm0[0,0,2,2]757; CHECK-NEXT: vmovaps %xmm1, %xmm0758; CHECK-NEXT: retq759 %shuf = shufflevector <4 x float> %vec, <4 x float> undef, <4 x i32> <i32 0, i32 0, i32 2, i32 2>760 %cmp = fcmp oeq <4 x float> %mask, zeroinitializer761 %res = select <4 x i1> %cmp, <4 x float> %shuf, <4 x float> %vec2762 ret <4 x float> %res763}764 765define <4 x float> @test_masked_z_4xfloat_dup_low_mask2(<4 x float> %vec, <4 x float> %mask) {766; CHECK-LABEL: test_masked_z_4xfloat_dup_low_mask2:767; CHECK: # %bb.0:768; CHECK-NEXT: vxorps %xmm2, %xmm2, %xmm2769; CHECK-NEXT: vcmpeqps %xmm2, %xmm1, %k1770; CHECK-NEXT: vmovsldup {{.*#+}} xmm0 {%k1} {z} = xmm0[0,0,2,2]771; CHECK-NEXT: retq772 %shuf = shufflevector <4 x float> %vec, <4 x float> undef, <4 x i32> <i32 0, i32 0, i32 2, i32 2>773 %cmp = fcmp oeq <4 x float> %mask, zeroinitializer774 %res = select <4 x i1> %cmp, <4 x float> %shuf, <4 x float> zeroinitializer775 ret <4 x float> %res776}777define <4 x float> @test_masked_4xfloat_dup_low_mask3(<4 x float> %vec, <4 x float> %vec2, <4 x float> %mask) {778; CHECK-LABEL: test_masked_4xfloat_dup_low_mask3:779; CHECK: # %bb.0:780; CHECK-NEXT: vxorps %xmm3, %xmm3, %xmm3781; CHECK-NEXT: vcmpeqps %xmm3, %xmm2, %k1782; CHECK-NEXT: vmovsldup {{.*#+}} xmm1 {%k1} = xmm0[0,0,2,2]783; CHECK-NEXT: vmovaps %xmm1, %xmm0784; CHECK-NEXT: retq785 %shuf = shufflevector <4 x float> %vec, <4 x float> undef, <4 x i32> <i32 0, i32 0, i32 2, i32 2>786 %cmp = fcmp oeq <4 x float> %mask, zeroinitializer787 %res = select <4 x i1> %cmp, <4 x float> %shuf, <4 x float> %vec2788 ret <4 x float> %res789}790 791define <4 x float> @test_masked_z_4xfloat_dup_low_mask3(<4 x float> %vec, <4 x float> %mask) {792; CHECK-LABEL: test_masked_z_4xfloat_dup_low_mask3:793; CHECK: # %bb.0:794; CHECK-NEXT: vxorps %xmm2, %xmm2, %xmm2795; CHECK-NEXT: vcmpeqps %xmm2, %xmm1, %k1796; CHECK-NEXT: vmovsldup {{.*#+}} xmm0 {%k1} {z} = xmm0[0,0,2,2]797; CHECK-NEXT: retq798 %shuf = shufflevector <4 x float> %vec, <4 x float> undef, <4 x i32> <i32 0, i32 0, i32 2, i32 2>799 %cmp = fcmp oeq <4 x float> %mask, zeroinitializer800 %res = select <4 x i1> %cmp, <4 x float> %shuf, <4 x float> zeroinitializer801 ret <4 x float> %res802}803define <4 x float> @test_masked_4xfloat_dup_low_mask4(<4 x float> %vec, <4 x float> %vec2, <4 x float> %mask) {804; CHECK-LABEL: test_masked_4xfloat_dup_low_mask4:805; CHECK: # %bb.0:806; CHECK-NEXT: vxorps %xmm3, %xmm3, %xmm3807; CHECK-NEXT: vcmpeqps %xmm3, %xmm2, %k1808; CHECK-NEXT: vmovsldup {{.*#+}} xmm1 {%k1} = xmm0[0,0,2,2]809; CHECK-NEXT: vmovaps %xmm1, %xmm0810; CHECK-NEXT: retq811 %shuf = shufflevector <4 x float> %vec, <4 x float> undef, <4 x i32> <i32 0, i32 0, i32 2, i32 2>812 %cmp = fcmp oeq <4 x float> %mask, zeroinitializer813 %res = select <4 x i1> %cmp, <4 x float> %shuf, <4 x float> %vec2814 ret <4 x float> %res815}816 817define <4 x float> @test_masked_z_4xfloat_dup_low_mask4(<4 x float> %vec, <4 x float> %mask) {818; CHECK-LABEL: test_masked_z_4xfloat_dup_low_mask4:819; CHECK: # %bb.0:820; CHECK-NEXT: vxorps %xmm2, %xmm2, %xmm2821; CHECK-NEXT: vcmpeqps %xmm2, %xmm1, %k1822; CHECK-NEXT: vmovsldup {{.*#+}} xmm0 {%k1} {z} = xmm0[0,0,2,2]823; CHECK-NEXT: retq824 %shuf = shufflevector <4 x float> %vec, <4 x float> undef, <4 x i32> <i32 0, i32 0, i32 2, i32 2>825 %cmp = fcmp oeq <4 x float> %mask, zeroinitializer826 %res = select <4 x i1> %cmp, <4 x float> %shuf, <4 x float> zeroinitializer827 ret <4 x float> %res828}829define <4 x float> @test_4xfloat_dup_low_mem(ptr %vp) {830; CHECK-LABEL: test_4xfloat_dup_low_mem:831; CHECK: # %bb.0:832; CHECK-NEXT: vmovsldup {{.*#+}} xmm0 = mem[0,0,2,2]833; CHECK-NEXT: retq834 %vec = load <4 x float>, ptr %vp835 %res = shufflevector <4 x float> %vec, <4 x float> undef, <4 x i32> <i32 0, i32 0, i32 2, i32 2>836 ret <4 x float> %res837}838define <4 x float> @test_masked_4xfloat_dup_low_mem_mask0(ptr %vp, <4 x float> %vec2, <4 x float> %mask) {839; CHECK-LABEL: test_masked_4xfloat_dup_low_mem_mask0:840; CHECK: # %bb.0:841; CHECK-NEXT: vxorps %xmm2, %xmm2, %xmm2842; CHECK-NEXT: vcmpeqps %xmm2, %xmm1, %k1843; CHECK-NEXT: vmovsldup {{.*#+}} xmm0 {%k1} = mem[0,0,2,2]844; CHECK-NEXT: retq845 %vec = load <4 x float>, ptr %vp846 %shuf = shufflevector <4 x float> %vec, <4 x float> undef, <4 x i32> <i32 0, i32 0, i32 2, i32 2>847 %cmp = fcmp oeq <4 x float> %mask, zeroinitializer848 %res = select <4 x i1> %cmp, <4 x float> %shuf, <4 x float> %vec2849 ret <4 x float> %res850}851 852define <4 x float> @test_masked_z_4xfloat_dup_low_mem_mask0(ptr %vp, <4 x float> %mask) {853; CHECK-LABEL: test_masked_z_4xfloat_dup_low_mem_mask0:854; CHECK: # %bb.0:855; CHECK-NEXT: vxorps %xmm1, %xmm1, %xmm1856; CHECK-NEXT: vcmpeqps %xmm1, %xmm0, %k1857; CHECK-NEXT: vmovsldup {{.*#+}} xmm0 {%k1} {z} = mem[0,0,2,2]858; CHECK-NEXT: retq859 %vec = load <4 x float>, ptr %vp860 %shuf = shufflevector <4 x float> %vec, <4 x float> undef, <4 x i32> <i32 0, i32 0, i32 2, i32 2>861 %cmp = fcmp oeq <4 x float> %mask, zeroinitializer862 %res = select <4 x i1> %cmp, <4 x float> %shuf, <4 x float> zeroinitializer863 ret <4 x float> %res864}865define <4 x float> @test_masked_4xfloat_dup_low_mem_mask1(ptr %vp, <4 x float> %vec2, <4 x float> %mask) {866; CHECK-LABEL: test_masked_4xfloat_dup_low_mem_mask1:867; CHECK: # %bb.0:868; CHECK-NEXT: vxorps %xmm2, %xmm2, %xmm2869; CHECK-NEXT: vcmpeqps %xmm2, %xmm1, %k1870; CHECK-NEXT: vmovsldup {{.*#+}} xmm0 {%k1} = mem[0,0,2,2]871; CHECK-NEXT: retq872 %vec = load <4 x float>, ptr %vp873 %shuf = shufflevector <4 x float> %vec, <4 x float> undef, <4 x i32> <i32 0, i32 0, i32 2, i32 2>874 %cmp = fcmp oeq <4 x float> %mask, zeroinitializer875 %res = select <4 x i1> %cmp, <4 x float> %shuf, <4 x float> %vec2876 ret <4 x float> %res877}878 879define <4 x float> @test_masked_z_4xfloat_dup_low_mem_mask1(ptr %vp, <4 x float> %mask) {880; CHECK-LABEL: test_masked_z_4xfloat_dup_low_mem_mask1:881; CHECK: # %bb.0:882; CHECK-NEXT: vxorps %xmm1, %xmm1, %xmm1883; CHECK-NEXT: vcmpeqps %xmm1, %xmm0, %k1884; CHECK-NEXT: vmovsldup {{.*#+}} xmm0 {%k1} {z} = mem[0,0,2,2]885; CHECK-NEXT: retq886 %vec = load <4 x float>, ptr %vp887 %shuf = shufflevector <4 x float> %vec, <4 x float> undef, <4 x i32> <i32 0, i32 0, i32 2, i32 2>888 %cmp = fcmp oeq <4 x float> %mask, zeroinitializer889 %res = select <4 x i1> %cmp, <4 x float> %shuf, <4 x float> zeroinitializer890 ret <4 x float> %res891}892define <4 x float> @test_masked_4xfloat_dup_low_mem_mask2(ptr %vp, <4 x float> %vec2, <4 x float> %mask) {893; CHECK-LABEL: test_masked_4xfloat_dup_low_mem_mask2:894; CHECK: # %bb.0:895; CHECK-NEXT: vxorps %xmm2, %xmm2, %xmm2896; CHECK-NEXT: vcmpeqps %xmm2, %xmm1, %k1897; CHECK-NEXT: vmovsldup {{.*#+}} xmm0 {%k1} = mem[0,0,2,2]898; CHECK-NEXT: retq899 %vec = load <4 x float>, ptr %vp900 %shuf = shufflevector <4 x float> %vec, <4 x float> undef, <4 x i32> <i32 0, i32 0, i32 2, i32 2>901 %cmp = fcmp oeq <4 x float> %mask, zeroinitializer902 %res = select <4 x i1> %cmp, <4 x float> %shuf, <4 x float> %vec2903 ret <4 x float> %res904}905 906define <4 x float> @test_masked_z_4xfloat_dup_low_mem_mask2(ptr %vp, <4 x float> %mask) {907; CHECK-LABEL: test_masked_z_4xfloat_dup_low_mem_mask2:908; CHECK: # %bb.0:909; CHECK-NEXT: vxorps %xmm1, %xmm1, %xmm1910; CHECK-NEXT: vcmpeqps %xmm1, %xmm0, %k1911; CHECK-NEXT: vmovsldup {{.*#+}} xmm0 {%k1} {z} = mem[0,0,2,2]912; CHECK-NEXT: retq913 %vec = load <4 x float>, ptr %vp914 %shuf = shufflevector <4 x float> %vec, <4 x float> undef, <4 x i32> <i32 0, i32 0, i32 2, i32 2>915 %cmp = fcmp oeq <4 x float> %mask, zeroinitializer916 %res = select <4 x i1> %cmp, <4 x float> %shuf, <4 x float> zeroinitializer917 ret <4 x float> %res918}919define <4 x float> @test_masked_4xfloat_dup_low_mem_mask3(ptr %vp, <4 x float> %vec2, <4 x float> %mask) {920; CHECK-LABEL: test_masked_4xfloat_dup_low_mem_mask3:921; CHECK: # %bb.0:922; CHECK-NEXT: vxorps %xmm2, %xmm2, %xmm2923; CHECK-NEXT: vcmpeqps %xmm2, %xmm1, %k1924; CHECK-NEXT: vmovsldup {{.*#+}} xmm0 {%k1} = mem[0,0,2,2]925; CHECK-NEXT: retq926 %vec = load <4 x float>, ptr %vp927 %shuf = shufflevector <4 x float> %vec, <4 x float> undef, <4 x i32> <i32 0, i32 0, i32 2, i32 2>928 %cmp = fcmp oeq <4 x float> %mask, zeroinitializer929 %res = select <4 x i1> %cmp, <4 x float> %shuf, <4 x float> %vec2930 ret <4 x float> %res931}932 933define <4 x float> @test_masked_z_4xfloat_dup_low_mem_mask3(ptr %vp, <4 x float> %mask) {934; CHECK-LABEL: test_masked_z_4xfloat_dup_low_mem_mask3:935; CHECK: # %bb.0:936; CHECK-NEXT: vxorps %xmm1, %xmm1, %xmm1937; CHECK-NEXT: vcmpeqps %xmm1, %xmm0, %k1938; CHECK-NEXT: vmovsldup {{.*#+}} xmm0 {%k1} {z} = mem[0,0,2,2]939; CHECK-NEXT: retq940 %vec = load <4 x float>, ptr %vp941 %shuf = shufflevector <4 x float> %vec, <4 x float> undef, <4 x i32> <i32 0, i32 0, i32 2, i32 2>942 %cmp = fcmp oeq <4 x float> %mask, zeroinitializer943 %res = select <4 x i1> %cmp, <4 x float> %shuf, <4 x float> zeroinitializer944 ret <4 x float> %res945}946define <4 x float> @test_masked_4xfloat_dup_low_mem_mask4(ptr %vp, <4 x float> %vec2, <4 x float> %mask) {947; CHECK-LABEL: test_masked_4xfloat_dup_low_mem_mask4:948; CHECK: # %bb.0:949; CHECK-NEXT: vxorps %xmm2, %xmm2, %xmm2950; CHECK-NEXT: vcmpeqps %xmm2, %xmm1, %k1951; CHECK-NEXT: vmovsldup {{.*#+}} xmm0 {%k1} = mem[0,0,2,2]952; CHECK-NEXT: retq953 %vec = load <4 x float>, ptr %vp954 %shuf = shufflevector <4 x float> %vec, <4 x float> undef, <4 x i32> <i32 0, i32 0, i32 2, i32 2>955 %cmp = fcmp oeq <4 x float> %mask, zeroinitializer956 %res = select <4 x i1> %cmp, <4 x float> %shuf, <4 x float> %vec2957 ret <4 x float> %res958}959 960define <4 x float> @test_masked_z_4xfloat_dup_low_mem_mask4(ptr %vp, <4 x float> %mask) {961; CHECK-LABEL: test_masked_z_4xfloat_dup_low_mem_mask4:962; CHECK: # %bb.0:963; CHECK-NEXT: vxorps %xmm1, %xmm1, %xmm1964; CHECK-NEXT: vcmpeqps %xmm1, %xmm0, %k1965; CHECK-NEXT: vmovsldup {{.*#+}} xmm0 {%k1} {z} = mem[0,0,2,2]966; CHECK-NEXT: retq967 %vec = load <4 x float>, ptr %vp968 %shuf = shufflevector <4 x float> %vec, <4 x float> undef, <4 x i32> <i32 0, i32 0, i32 2, i32 2>969 %cmp = fcmp oeq <4 x float> %mask, zeroinitializer970 %res = select <4 x i1> %cmp, <4 x float> %shuf, <4 x float> zeroinitializer971 ret <4 x float> %res972}973define <8 x float> @test_8xfloat_dup_low(<8 x float> %vec) {974; CHECK-LABEL: test_8xfloat_dup_low:975; CHECK: # %bb.0:976; CHECK-NEXT: vmovsldup {{.*#+}} ymm0 = ymm0[0,0,2,2,4,4,6,6]977; CHECK-NEXT: retq978 %res = shufflevector <8 x float> %vec, <8 x float> undef, <8 x i32> <i32 0, i32 0, i32 2, i32 2, i32 4, i32 4, i32 6, i32 6>979 ret <8 x float> %res980}981define <8 x float> @test_masked_8xfloat_dup_low_mask0(<8 x float> %vec, <8 x float> %vec2, <8 x float> %mask) {982; CHECK-LABEL: test_masked_8xfloat_dup_low_mask0:983; CHECK: # %bb.0:984; CHECK-NEXT: vxorps %xmm3, %xmm3, %xmm3985; CHECK-NEXT: vcmpeqps %ymm3, %ymm2, %k1986; CHECK-NEXT: vmovsldup {{.*#+}} ymm1 {%k1} = ymm0[0,0,2,2,4,4,6,6]987; CHECK-NEXT: vmovaps %ymm1, %ymm0988; CHECK-NEXT: retq989 %shuf = shufflevector <8 x float> %vec, <8 x float> undef, <8 x i32> <i32 0, i32 0, i32 2, i32 2, i32 4, i32 4, i32 6, i32 6>990 %cmp = fcmp oeq <8 x float> %mask, zeroinitializer991 %res = select <8 x i1> %cmp, <8 x float> %shuf, <8 x float> %vec2992 ret <8 x float> %res993}994 995define <8 x float> @test_masked_z_8xfloat_dup_low_mask0(<8 x float> %vec, <8 x float> %mask) {996; CHECK-LABEL: test_masked_z_8xfloat_dup_low_mask0:997; CHECK: # %bb.0:998; CHECK-NEXT: vxorps %xmm2, %xmm2, %xmm2999; CHECK-NEXT: vcmpeqps %ymm2, %ymm1, %k11000; CHECK-NEXT: vmovsldup {{.*#+}} ymm0 {%k1} {z} = ymm0[0,0,2,2,4,4,6,6]1001; CHECK-NEXT: retq1002 %shuf = shufflevector <8 x float> %vec, <8 x float> undef, <8 x i32> <i32 0, i32 0, i32 2, i32 2, i32 4, i32 4, i32 6, i32 6>1003 %cmp = fcmp oeq <8 x float> %mask, zeroinitializer1004 %res = select <8 x i1> %cmp, <8 x float> %shuf, <8 x float> zeroinitializer1005 ret <8 x float> %res1006}1007define <8 x float> @test_masked_8xfloat_dup_low_mask1(<8 x float> %vec, <8 x float> %vec2, <8 x float> %mask) {1008; CHECK-LABEL: test_masked_8xfloat_dup_low_mask1:1009; CHECK: # %bb.0:1010; CHECK-NEXT: vxorps %xmm3, %xmm3, %xmm31011; CHECK-NEXT: vcmpeqps %ymm3, %ymm2, %k11012; CHECK-NEXT: vmovsldup {{.*#+}} ymm1 {%k1} = ymm0[0,0,2,2,4,4,6,6]1013; CHECK-NEXT: vmovaps %ymm1, %ymm01014; CHECK-NEXT: retq1015 %shuf = shufflevector <8 x float> %vec, <8 x float> undef, <8 x i32> <i32 0, i32 0, i32 2, i32 2, i32 4, i32 4, i32 6, i32 6>1016 %cmp = fcmp oeq <8 x float> %mask, zeroinitializer1017 %res = select <8 x i1> %cmp, <8 x float> %shuf, <8 x float> %vec21018 ret <8 x float> %res1019}1020 1021define <8 x float> @test_masked_z_8xfloat_dup_low_mask1(<8 x float> %vec, <8 x float> %mask) {1022; CHECK-LABEL: test_masked_z_8xfloat_dup_low_mask1:1023; CHECK: # %bb.0:1024; CHECK-NEXT: vxorps %xmm2, %xmm2, %xmm21025; CHECK-NEXT: vcmpeqps %ymm2, %ymm1, %k11026; CHECK-NEXT: vmovsldup {{.*#+}} ymm0 {%k1} {z} = ymm0[0,0,2,2,4,4,6,6]1027; CHECK-NEXT: retq1028 %shuf = shufflevector <8 x float> %vec, <8 x float> undef, <8 x i32> <i32 0, i32 0, i32 2, i32 2, i32 4, i32 4, i32 6, i32 6>1029 %cmp = fcmp oeq <8 x float> %mask, zeroinitializer1030 %res = select <8 x i1> %cmp, <8 x float> %shuf, <8 x float> zeroinitializer1031 ret <8 x float> %res1032}1033define <8 x float> @test_masked_8xfloat_dup_low_mask2(<8 x float> %vec, <8 x float> %vec2, <8 x float> %mask) {1034; CHECK-LABEL: test_masked_8xfloat_dup_low_mask2:1035; CHECK: # %bb.0:1036; CHECK-NEXT: vxorps %xmm3, %xmm3, %xmm31037; CHECK-NEXT: vcmpeqps %ymm3, %ymm2, %k11038; CHECK-NEXT: vmovsldup {{.*#+}} ymm1 {%k1} = ymm0[0,0,2,2,4,4,6,6]1039; CHECK-NEXT: vmovaps %ymm1, %ymm01040; CHECK-NEXT: retq1041 %shuf = shufflevector <8 x float> %vec, <8 x float> undef, <8 x i32> <i32 0, i32 0, i32 2, i32 2, i32 4, i32 4, i32 6, i32 6>1042 %cmp = fcmp oeq <8 x float> %mask, zeroinitializer1043 %res = select <8 x i1> %cmp, <8 x float> %shuf, <8 x float> %vec21044 ret <8 x float> %res1045}1046 1047define <8 x float> @test_masked_z_8xfloat_dup_low_mask2(<8 x float> %vec, <8 x float> %mask) {1048; CHECK-LABEL: test_masked_z_8xfloat_dup_low_mask2:1049; CHECK: # %bb.0:1050; CHECK-NEXT: vxorps %xmm2, %xmm2, %xmm21051; CHECK-NEXT: vcmpeqps %ymm2, %ymm1, %k11052; CHECK-NEXT: vmovsldup {{.*#+}} ymm0 {%k1} {z} = ymm0[0,0,2,2,4,4,6,6]1053; CHECK-NEXT: retq1054 %shuf = shufflevector <8 x float> %vec, <8 x float> undef, <8 x i32> <i32 0, i32 0, i32 2, i32 2, i32 4, i32 4, i32 6, i32 6>1055 %cmp = fcmp oeq <8 x float> %mask, zeroinitializer1056 %res = select <8 x i1> %cmp, <8 x float> %shuf, <8 x float> zeroinitializer1057 ret <8 x float> %res1058}1059define <8 x float> @test_masked_8xfloat_dup_low_mask3(<8 x float> %vec, <8 x float> %vec2, <8 x float> %mask) {1060; CHECK-LABEL: test_masked_8xfloat_dup_low_mask3:1061; CHECK: # %bb.0:1062; CHECK-NEXT: vxorps %xmm3, %xmm3, %xmm31063; CHECK-NEXT: vcmpeqps %ymm3, %ymm2, %k11064; CHECK-NEXT: vmovsldup {{.*#+}} ymm1 {%k1} = ymm0[0,0,2,2,4,4,6,6]1065; CHECK-NEXT: vmovaps %ymm1, %ymm01066; CHECK-NEXT: retq1067 %shuf = shufflevector <8 x float> %vec, <8 x float> undef, <8 x i32> <i32 0, i32 0, i32 2, i32 2, i32 4, i32 4, i32 6, i32 6>1068 %cmp = fcmp oeq <8 x float> %mask, zeroinitializer1069 %res = select <8 x i1> %cmp, <8 x float> %shuf, <8 x float> %vec21070 ret <8 x float> %res1071}1072 1073define <8 x float> @test_masked_z_8xfloat_dup_low_mask3(<8 x float> %vec, <8 x float> %mask) {1074; CHECK-LABEL: test_masked_z_8xfloat_dup_low_mask3:1075; CHECK: # %bb.0:1076; CHECK-NEXT: vxorps %xmm2, %xmm2, %xmm21077; CHECK-NEXT: vcmpeqps %ymm2, %ymm1, %k11078; CHECK-NEXT: vmovsldup {{.*#+}} ymm0 {%k1} {z} = ymm0[0,0,2,2,4,4,6,6]1079; CHECK-NEXT: retq1080 %shuf = shufflevector <8 x float> %vec, <8 x float> undef, <8 x i32> <i32 0, i32 0, i32 2, i32 2, i32 4, i32 4, i32 6, i32 6>1081 %cmp = fcmp oeq <8 x float> %mask, zeroinitializer1082 %res = select <8 x i1> %cmp, <8 x float> %shuf, <8 x float> zeroinitializer1083 ret <8 x float> %res1084}1085define <8 x float> @test_masked_8xfloat_dup_low_mask4(<8 x float> %vec, <8 x float> %vec2, <8 x float> %mask) {1086; CHECK-LABEL: test_masked_8xfloat_dup_low_mask4:1087; CHECK: # %bb.0:1088; CHECK-NEXT: vxorps %xmm3, %xmm3, %xmm31089; CHECK-NEXT: vcmpeqps %ymm3, %ymm2, %k11090; CHECK-NEXT: vmovsldup {{.*#+}} ymm1 {%k1} = ymm0[0,0,2,2,4,4,6,6]1091; CHECK-NEXT: vmovaps %ymm1, %ymm01092; CHECK-NEXT: retq1093 %shuf = shufflevector <8 x float> %vec, <8 x float> undef, <8 x i32> <i32 0, i32 0, i32 2, i32 2, i32 4, i32 4, i32 6, i32 6>1094 %cmp = fcmp oeq <8 x float> %mask, zeroinitializer1095 %res = select <8 x i1> %cmp, <8 x float> %shuf, <8 x float> %vec21096 ret <8 x float> %res1097}1098 1099define <8 x float> @test_masked_z_8xfloat_dup_low_mask4(<8 x float> %vec, <8 x float> %mask) {1100; CHECK-LABEL: test_masked_z_8xfloat_dup_low_mask4:1101; CHECK: # %bb.0:1102; CHECK-NEXT: vxorps %xmm2, %xmm2, %xmm21103; CHECK-NEXT: vcmpeqps %ymm2, %ymm1, %k11104; CHECK-NEXT: vmovsldup {{.*#+}} ymm0 {%k1} {z} = ymm0[0,0,2,2,4,4,6,6]1105; CHECK-NEXT: retq1106 %shuf = shufflevector <8 x float> %vec, <8 x float> undef, <8 x i32> <i32 0, i32 0, i32 2, i32 2, i32 4, i32 4, i32 6, i32 6>1107 %cmp = fcmp oeq <8 x float> %mask, zeroinitializer1108 %res = select <8 x i1> %cmp, <8 x float> %shuf, <8 x float> zeroinitializer1109 ret <8 x float> %res1110}1111define <8 x float> @test_8xfloat_dup_low_mem(ptr %vp) {1112; CHECK-LABEL: test_8xfloat_dup_low_mem:1113; CHECK: # %bb.0:1114; CHECK-NEXT: vmovsldup {{.*#+}} ymm0 = mem[0,0,2,2,4,4,6,6]1115; CHECK-NEXT: retq1116 %vec = load <8 x float>, ptr %vp1117 %res = shufflevector <8 x float> %vec, <8 x float> undef, <8 x i32> <i32 0, i32 0, i32 2, i32 2, i32 4, i32 4, i32 6, i32 6>1118 ret <8 x float> %res1119}1120define <8 x float> @test_masked_8xfloat_dup_low_mem_mask0(ptr %vp, <8 x float> %vec2, <8 x float> %mask) {1121; CHECK-LABEL: test_masked_8xfloat_dup_low_mem_mask0:1122; CHECK: # %bb.0:1123; CHECK-NEXT: vxorps %xmm2, %xmm2, %xmm21124; CHECK-NEXT: vcmpeqps %ymm2, %ymm1, %k11125; CHECK-NEXT: vmovsldup {{.*#+}} ymm0 {%k1} = mem[0,0,2,2,4,4,6,6]1126; CHECK-NEXT: retq1127 %vec = load <8 x float>, ptr %vp1128 %shuf = shufflevector <8 x float> %vec, <8 x float> undef, <8 x i32> <i32 0, i32 0, i32 2, i32 2, i32 4, i32 4, i32 6, i32 6>1129 %cmp = fcmp oeq <8 x float> %mask, zeroinitializer1130 %res = select <8 x i1> %cmp, <8 x float> %shuf, <8 x float> %vec21131 ret <8 x float> %res1132}1133 1134define <8 x float> @test_masked_z_8xfloat_dup_low_mem_mask0(ptr %vp, <8 x float> %mask) {1135; CHECK-LABEL: test_masked_z_8xfloat_dup_low_mem_mask0:1136; CHECK: # %bb.0:1137; CHECK-NEXT: vxorps %xmm1, %xmm1, %xmm11138; CHECK-NEXT: vcmpeqps %ymm1, %ymm0, %k11139; CHECK-NEXT: vmovsldup {{.*#+}} ymm0 {%k1} {z} = mem[0,0,2,2,4,4,6,6]1140; CHECK-NEXT: retq1141 %vec = load <8 x float>, ptr %vp1142 %shuf = shufflevector <8 x float> %vec, <8 x float> undef, <8 x i32> <i32 0, i32 0, i32 2, i32 2, i32 4, i32 4, i32 6, i32 6>1143 %cmp = fcmp oeq <8 x float> %mask, zeroinitializer1144 %res = select <8 x i1> %cmp, <8 x float> %shuf, <8 x float> zeroinitializer1145 ret <8 x float> %res1146}1147define <8 x float> @test_masked_8xfloat_dup_low_mem_mask1(ptr %vp, <8 x float> %vec2, <8 x float> %mask) {1148; CHECK-LABEL: test_masked_8xfloat_dup_low_mem_mask1:1149; CHECK: # %bb.0:1150; CHECK-NEXT: vxorps %xmm2, %xmm2, %xmm21151; CHECK-NEXT: vcmpeqps %ymm2, %ymm1, %k11152; CHECK-NEXT: vmovsldup {{.*#+}} ymm0 {%k1} = mem[0,0,2,2,4,4,6,6]1153; CHECK-NEXT: retq1154 %vec = load <8 x float>, ptr %vp1155 %shuf = shufflevector <8 x float> %vec, <8 x float> undef, <8 x i32> <i32 0, i32 0, i32 2, i32 2, i32 4, i32 4, i32 6, i32 6>1156 %cmp = fcmp oeq <8 x float> %mask, zeroinitializer1157 %res = select <8 x i1> %cmp, <8 x float> %shuf, <8 x float> %vec21158 ret <8 x float> %res1159}1160 1161define <8 x float> @test_masked_z_8xfloat_dup_low_mem_mask1(ptr %vp, <8 x float> %mask) {1162; CHECK-LABEL: test_masked_z_8xfloat_dup_low_mem_mask1:1163; CHECK: # %bb.0:1164; CHECK-NEXT: vxorps %xmm1, %xmm1, %xmm11165; CHECK-NEXT: vcmpeqps %ymm1, %ymm0, %k11166; CHECK-NEXT: vmovsldup {{.*#+}} ymm0 {%k1} {z} = mem[0,0,2,2,4,4,6,6]1167; CHECK-NEXT: retq1168 %vec = load <8 x float>, ptr %vp1169 %shuf = shufflevector <8 x float> %vec, <8 x float> undef, <8 x i32> <i32 0, i32 0, i32 2, i32 2, i32 4, i32 4, i32 6, i32 6>1170 %cmp = fcmp oeq <8 x float> %mask, zeroinitializer1171 %res = select <8 x i1> %cmp, <8 x float> %shuf, <8 x float> zeroinitializer1172 ret <8 x float> %res1173}1174define <8 x float> @test_masked_8xfloat_dup_low_mem_mask2(ptr %vp, <8 x float> %vec2, <8 x float> %mask) {1175; CHECK-LABEL: test_masked_8xfloat_dup_low_mem_mask2:1176; CHECK: # %bb.0:1177; CHECK-NEXT: vxorps %xmm2, %xmm2, %xmm21178; CHECK-NEXT: vcmpeqps %ymm2, %ymm1, %k11179; CHECK-NEXT: vmovsldup {{.*#+}} ymm0 {%k1} = mem[0,0,2,2,4,4,6,6]1180; CHECK-NEXT: retq1181 %vec = load <8 x float>, ptr %vp1182 %shuf = shufflevector <8 x float> %vec, <8 x float> undef, <8 x i32> <i32 0, i32 0, i32 2, i32 2, i32 4, i32 4, i32 6, i32 6>1183 %cmp = fcmp oeq <8 x float> %mask, zeroinitializer1184 %res = select <8 x i1> %cmp, <8 x float> %shuf, <8 x float> %vec21185 ret <8 x float> %res1186}1187 1188define <8 x float> @test_masked_z_8xfloat_dup_low_mem_mask2(ptr %vp, <8 x float> %mask) {1189; CHECK-LABEL: test_masked_z_8xfloat_dup_low_mem_mask2:1190; CHECK: # %bb.0:1191; CHECK-NEXT: vxorps %xmm1, %xmm1, %xmm11192; CHECK-NEXT: vcmpeqps %ymm1, %ymm0, %k11193; CHECK-NEXT: vmovsldup {{.*#+}} ymm0 {%k1} {z} = mem[0,0,2,2,4,4,6,6]1194; CHECK-NEXT: retq1195 %vec = load <8 x float>, ptr %vp1196 %shuf = shufflevector <8 x float> %vec, <8 x float> undef, <8 x i32> <i32 0, i32 0, i32 2, i32 2, i32 4, i32 4, i32 6, i32 6>1197 %cmp = fcmp oeq <8 x float> %mask, zeroinitializer1198 %res = select <8 x i1> %cmp, <8 x float> %shuf, <8 x float> zeroinitializer1199 ret <8 x float> %res1200}1201define <8 x float> @test_masked_8xfloat_dup_low_mem_mask3(ptr %vp, <8 x float> %vec2, <8 x float> %mask) {1202; CHECK-LABEL: test_masked_8xfloat_dup_low_mem_mask3:1203; CHECK: # %bb.0:1204; CHECK-NEXT: vxorps %xmm2, %xmm2, %xmm21205; CHECK-NEXT: vcmpeqps %ymm2, %ymm1, %k11206; CHECK-NEXT: vmovsldup {{.*#+}} ymm0 {%k1} = mem[0,0,2,2,4,4,6,6]1207; CHECK-NEXT: retq1208 %vec = load <8 x float>, ptr %vp1209 %shuf = shufflevector <8 x float> %vec, <8 x float> undef, <8 x i32> <i32 0, i32 0, i32 2, i32 2, i32 4, i32 4, i32 6, i32 6>1210 %cmp = fcmp oeq <8 x float> %mask, zeroinitializer1211 %res = select <8 x i1> %cmp, <8 x float> %shuf, <8 x float> %vec21212 ret <8 x float> %res1213}1214 1215define <8 x float> @test_masked_z_8xfloat_dup_low_mem_mask3(ptr %vp, <8 x float> %mask) {1216; CHECK-LABEL: test_masked_z_8xfloat_dup_low_mem_mask3:1217; CHECK: # %bb.0:1218; CHECK-NEXT: vxorps %xmm1, %xmm1, %xmm11219; CHECK-NEXT: vcmpeqps %ymm1, %ymm0, %k11220; CHECK-NEXT: vmovsldup {{.*#+}} ymm0 {%k1} {z} = mem[0,0,2,2,4,4,6,6]1221; CHECK-NEXT: retq1222 %vec = load <8 x float>, ptr %vp1223 %shuf = shufflevector <8 x float> %vec, <8 x float> undef, <8 x i32> <i32 0, i32 0, i32 2, i32 2, i32 4, i32 4, i32 6, i32 6>1224 %cmp = fcmp oeq <8 x float> %mask, zeroinitializer1225 %res = select <8 x i1> %cmp, <8 x float> %shuf, <8 x float> zeroinitializer1226 ret <8 x float> %res1227}1228define <8 x float> @test_masked_8xfloat_dup_low_mem_mask4(ptr %vp, <8 x float> %vec2, <8 x float> %mask) {1229; CHECK-LABEL: test_masked_8xfloat_dup_low_mem_mask4:1230; CHECK: # %bb.0:1231; CHECK-NEXT: vxorps %xmm2, %xmm2, %xmm21232; CHECK-NEXT: vcmpeqps %ymm2, %ymm1, %k11233; CHECK-NEXT: vmovsldup {{.*#+}} ymm0 {%k1} = mem[0,0,2,2,4,4,6,6]1234; CHECK-NEXT: retq1235 %vec = load <8 x float>, ptr %vp1236 %shuf = shufflevector <8 x float> %vec, <8 x float> undef, <8 x i32> <i32 0, i32 0, i32 2, i32 2, i32 4, i32 4, i32 6, i32 6>1237 %cmp = fcmp oeq <8 x float> %mask, zeroinitializer1238 %res = select <8 x i1> %cmp, <8 x float> %shuf, <8 x float> %vec21239 ret <8 x float> %res1240}1241 1242define <8 x float> @test_masked_z_8xfloat_dup_low_mem_mask4(ptr %vp, <8 x float> %mask) {1243; CHECK-LABEL: test_masked_z_8xfloat_dup_low_mem_mask4:1244; CHECK: # %bb.0:1245; CHECK-NEXT: vxorps %xmm1, %xmm1, %xmm11246; CHECK-NEXT: vcmpeqps %ymm1, %ymm0, %k11247; CHECK-NEXT: vmovsldup {{.*#+}} ymm0 {%k1} {z} = mem[0,0,2,2,4,4,6,6]1248; CHECK-NEXT: retq1249 %vec = load <8 x float>, ptr %vp1250 %shuf = shufflevector <8 x float> %vec, <8 x float> undef, <8 x i32> <i32 0, i32 0, i32 2, i32 2, i32 4, i32 4, i32 6, i32 6>1251 %cmp = fcmp oeq <8 x float> %mask, zeroinitializer1252 %res = select <8 x i1> %cmp, <8 x float> %shuf, <8 x float> zeroinitializer1253 ret <8 x float> %res1254}1255define <16 x float> @test_16xfloat_dup_low(<16 x float> %vec) {1256; CHECK-LABEL: test_16xfloat_dup_low:1257; CHECK: # %bb.0:1258; CHECK-NEXT: vmovsldup {{.*#+}} zmm0 = zmm0[0,0,2,2,4,4,6,6,8,8,10,10,12,12,14,14]1259; CHECK-NEXT: retq1260 %res = shufflevector <16 x float> %vec, <16 x float> undef, <16 x i32> <i32 0, i32 0, i32 2, i32 2, i32 4, i32 4, i32 6, i32 6, i32 8, i32 8, i32 10, i32 10, i32 12, i32 12, i32 14, i32 14>1261 ret <16 x float> %res1262}1263define <16 x float> @test_masked_16xfloat_dup_low_mask0(<16 x float> %vec, <16 x float> %vec2, <16 x float> %mask) {1264; CHECK-LABEL: test_masked_16xfloat_dup_low_mask0:1265; CHECK: # %bb.0:1266; CHECK-NEXT: vxorps %xmm3, %xmm3, %xmm31267; CHECK-NEXT: vcmpeqps %zmm3, %zmm2, %k11268; CHECK-NEXT: vmovsldup {{.*#+}} zmm1 {%k1} = zmm0[0,0,2,2,4,4,6,6,8,8,10,10,12,12,14,14]1269; CHECK-NEXT: vmovaps %zmm1, %zmm01270; CHECK-NEXT: retq1271 %shuf = shufflevector <16 x float> %vec, <16 x float> undef, <16 x i32> <i32 0, i32 0, i32 2, i32 2, i32 4, i32 4, i32 6, i32 6, i32 8, i32 8, i32 10, i32 10, i32 12, i32 12, i32 14, i32 14>1272 %cmp = fcmp oeq <16 x float> %mask, zeroinitializer1273 %res = select <16 x i1> %cmp, <16 x float> %shuf, <16 x float> %vec21274 ret <16 x float> %res1275}1276 1277define <16 x float> @test_masked_z_16xfloat_dup_low_mask0(<16 x float> %vec, <16 x float> %mask) {1278; CHECK-LABEL: test_masked_z_16xfloat_dup_low_mask0:1279; CHECK: # %bb.0:1280; CHECK-NEXT: vxorps %xmm2, %xmm2, %xmm21281; CHECK-NEXT: vcmpeqps %zmm2, %zmm1, %k11282; CHECK-NEXT: vmovsldup {{.*#+}} zmm0 {%k1} {z} = zmm0[0,0,2,2,4,4,6,6,8,8,10,10,12,12,14,14]1283; CHECK-NEXT: retq1284 %shuf = shufflevector <16 x float> %vec, <16 x float> undef, <16 x i32> <i32 0, i32 0, i32 2, i32 2, i32 4, i32 4, i32 6, i32 6, i32 8, i32 8, i32 10, i32 10, i32 12, i32 12, i32 14, i32 14>1285 %cmp = fcmp oeq <16 x float> %mask, zeroinitializer1286 %res = select <16 x i1> %cmp, <16 x float> %shuf, <16 x float> zeroinitializer1287 ret <16 x float> %res1288}1289define <16 x float> @test_masked_16xfloat_dup_low_mask1(<16 x float> %vec, <16 x float> %vec2, <16 x float> %mask) {1290; CHECK-LABEL: test_masked_16xfloat_dup_low_mask1:1291; CHECK: # %bb.0:1292; CHECK-NEXT: vxorps %xmm3, %xmm3, %xmm31293; CHECK-NEXT: vcmpeqps %zmm3, %zmm2, %k11294; CHECK-NEXT: vmovsldup {{.*#+}} zmm1 {%k1} = zmm0[0,0,2,2,4,4,6,6,8,8,10,10,12,12,14,14]1295; CHECK-NEXT: vmovaps %zmm1, %zmm01296; CHECK-NEXT: retq1297 %shuf = shufflevector <16 x float> %vec, <16 x float> undef, <16 x i32> <i32 0, i32 0, i32 2, i32 2, i32 4, i32 4, i32 6, i32 6, i32 8, i32 8, i32 10, i32 10, i32 12, i32 12, i32 14, i32 14>1298 %cmp = fcmp oeq <16 x float> %mask, zeroinitializer1299 %res = select <16 x i1> %cmp, <16 x float> %shuf, <16 x float> %vec21300 ret <16 x float> %res1301}1302 1303define <16 x float> @test_masked_z_16xfloat_dup_low_mask1(<16 x float> %vec, <16 x float> %mask) {1304; CHECK-LABEL: test_masked_z_16xfloat_dup_low_mask1:1305; CHECK: # %bb.0:1306; CHECK-NEXT: vxorps %xmm2, %xmm2, %xmm21307; CHECK-NEXT: vcmpeqps %zmm2, %zmm1, %k11308; CHECK-NEXT: vmovsldup {{.*#+}} zmm0 {%k1} {z} = zmm0[0,0,2,2,4,4,6,6,8,8,10,10,12,12,14,14]1309; CHECK-NEXT: retq1310 %shuf = shufflevector <16 x float> %vec, <16 x float> undef, <16 x i32> <i32 0, i32 0, i32 2, i32 2, i32 4, i32 4, i32 6, i32 6, i32 8, i32 8, i32 10, i32 10, i32 12, i32 12, i32 14, i32 14>1311 %cmp = fcmp oeq <16 x float> %mask, zeroinitializer1312 %res = select <16 x i1> %cmp, <16 x float> %shuf, <16 x float> zeroinitializer1313 ret <16 x float> %res1314}1315define <16 x float> @test_masked_16xfloat_dup_low_mask2(<16 x float> %vec, <16 x float> %vec2, <16 x float> %mask) {1316; CHECK-LABEL: test_masked_16xfloat_dup_low_mask2:1317; CHECK: # %bb.0:1318; CHECK-NEXT: vxorps %xmm3, %xmm3, %xmm31319; CHECK-NEXT: vcmpeqps %zmm3, %zmm2, %k11320; CHECK-NEXT: vmovsldup {{.*#+}} zmm1 {%k1} = zmm0[0,0,2,2,4,4,6,6,8,8,10,10,12,12,14,14]1321; CHECK-NEXT: vmovaps %zmm1, %zmm01322; CHECK-NEXT: retq1323 %shuf = shufflevector <16 x float> %vec, <16 x float> undef, <16 x i32> <i32 0, i32 0, i32 2, i32 2, i32 4, i32 4, i32 6, i32 6, i32 8, i32 8, i32 10, i32 10, i32 12, i32 12, i32 14, i32 14>1324 %cmp = fcmp oeq <16 x float> %mask, zeroinitializer1325 %res = select <16 x i1> %cmp, <16 x float> %shuf, <16 x float> %vec21326 ret <16 x float> %res1327}1328 1329define <16 x float> @test_masked_z_16xfloat_dup_low_mask2(<16 x float> %vec, <16 x float> %mask) {1330; CHECK-LABEL: test_masked_z_16xfloat_dup_low_mask2:1331; CHECK: # %bb.0:1332; CHECK-NEXT: vxorps %xmm2, %xmm2, %xmm21333; CHECK-NEXT: vcmpeqps %zmm2, %zmm1, %k11334; CHECK-NEXT: vmovsldup {{.*#+}} zmm0 {%k1} {z} = zmm0[0,0,2,2,4,4,6,6,8,8,10,10,12,12,14,14]1335; CHECK-NEXT: retq1336 %shuf = shufflevector <16 x float> %vec, <16 x float> undef, <16 x i32> <i32 0, i32 0, i32 2, i32 2, i32 4, i32 4, i32 6, i32 6, i32 8, i32 8, i32 10, i32 10, i32 12, i32 12, i32 14, i32 14>1337 %cmp = fcmp oeq <16 x float> %mask, zeroinitializer1338 %res = select <16 x i1> %cmp, <16 x float> %shuf, <16 x float> zeroinitializer1339 ret <16 x float> %res1340}1341define <16 x float> @test_masked_16xfloat_dup_low_mask3(<16 x float> %vec, <16 x float> %vec2, <16 x float> %mask) {1342; CHECK-LABEL: test_masked_16xfloat_dup_low_mask3:1343; CHECK: # %bb.0:1344; CHECK-NEXT: vxorps %xmm3, %xmm3, %xmm31345; CHECK-NEXT: vcmpeqps %zmm3, %zmm2, %k11346; CHECK-NEXT: vmovsldup {{.*#+}} zmm1 {%k1} = zmm0[0,0,2,2,4,4,6,6,8,8,10,10,12,12,14,14]1347; CHECK-NEXT: vmovaps %zmm1, %zmm01348; CHECK-NEXT: retq1349 %shuf = shufflevector <16 x float> %vec, <16 x float> undef, <16 x i32> <i32 0, i32 0, i32 2, i32 2, i32 4, i32 4, i32 6, i32 6, i32 8, i32 8, i32 10, i32 10, i32 12, i32 12, i32 14, i32 14>1350 %cmp = fcmp oeq <16 x float> %mask, zeroinitializer1351 %res = select <16 x i1> %cmp, <16 x float> %shuf, <16 x float> %vec21352 ret <16 x float> %res1353}1354 1355define <16 x float> @test_masked_z_16xfloat_dup_low_mask3(<16 x float> %vec, <16 x float> %mask) {1356; CHECK-LABEL: test_masked_z_16xfloat_dup_low_mask3:1357; CHECK: # %bb.0:1358; CHECK-NEXT: vxorps %xmm2, %xmm2, %xmm21359; CHECK-NEXT: vcmpeqps %zmm2, %zmm1, %k11360; CHECK-NEXT: vmovsldup {{.*#+}} zmm0 {%k1} {z} = zmm0[0,0,2,2,4,4,6,6,8,8,10,10,12,12,14,14]1361; CHECK-NEXT: retq1362 %shuf = shufflevector <16 x float> %vec, <16 x float> undef, <16 x i32> <i32 0, i32 0, i32 2, i32 2, i32 4, i32 4, i32 6, i32 6, i32 8, i32 8, i32 10, i32 10, i32 12, i32 12, i32 14, i32 14>1363 %cmp = fcmp oeq <16 x float> %mask, zeroinitializer1364 %res = select <16 x i1> %cmp, <16 x float> %shuf, <16 x float> zeroinitializer1365 ret <16 x float> %res1366}1367define <16 x float> @test_masked_16xfloat_dup_low_mask4(<16 x float> %vec, <16 x float> %vec2, <16 x float> %mask) {1368; CHECK-LABEL: test_masked_16xfloat_dup_low_mask4:1369; CHECK: # %bb.0:1370; CHECK-NEXT: vxorps %xmm3, %xmm3, %xmm31371; CHECK-NEXT: vcmpeqps %zmm3, %zmm2, %k11372; CHECK-NEXT: vmovsldup {{.*#+}} zmm1 {%k1} = zmm0[0,0,2,2,4,4,6,6,8,8,10,10,12,12,14,14]1373; CHECK-NEXT: vmovaps %zmm1, %zmm01374; CHECK-NEXT: retq1375 %shuf = shufflevector <16 x float> %vec, <16 x float> undef, <16 x i32> <i32 0, i32 0, i32 2, i32 2, i32 4, i32 4, i32 6, i32 6, i32 8, i32 8, i32 10, i32 10, i32 12, i32 12, i32 14, i32 14>1376 %cmp = fcmp oeq <16 x float> %mask, zeroinitializer1377 %res = select <16 x i1> %cmp, <16 x float> %shuf, <16 x float> %vec21378 ret <16 x float> %res1379}1380 1381define <16 x float> @test_masked_z_16xfloat_dup_low_mask4(<16 x float> %vec, <16 x float> %mask) {1382; CHECK-LABEL: test_masked_z_16xfloat_dup_low_mask4:1383; CHECK: # %bb.0:1384; CHECK-NEXT: vxorps %xmm2, %xmm2, %xmm21385; CHECK-NEXT: vcmpeqps %zmm2, %zmm1, %k11386; CHECK-NEXT: vmovsldup {{.*#+}} zmm0 {%k1} {z} = zmm0[0,0,2,2,4,4,6,6,8,8,10,10,12,12,14,14]1387; CHECK-NEXT: retq1388 %shuf = shufflevector <16 x float> %vec, <16 x float> undef, <16 x i32> <i32 0, i32 0, i32 2, i32 2, i32 4, i32 4, i32 6, i32 6, i32 8, i32 8, i32 10, i32 10, i32 12, i32 12, i32 14, i32 14>1389 %cmp = fcmp oeq <16 x float> %mask, zeroinitializer1390 %res = select <16 x i1> %cmp, <16 x float> %shuf, <16 x float> zeroinitializer1391 ret <16 x float> %res1392}1393define <16 x float> @test_16xfloat_dup_low_mem(ptr %vp) {1394; CHECK-LABEL: test_16xfloat_dup_low_mem:1395; CHECK: # %bb.0:1396; CHECK-NEXT: vmovsldup {{.*#+}} zmm0 = mem[0,0,2,2,4,4,6,6,8,8,10,10,12,12,14,14]1397; CHECK-NEXT: retq1398 %vec = load <16 x float>, ptr %vp1399 %res = shufflevector <16 x float> %vec, <16 x float> undef, <16 x i32> <i32 0, i32 0, i32 2, i32 2, i32 4, i32 4, i32 6, i32 6, i32 8, i32 8, i32 10, i32 10, i32 12, i32 12, i32 14, i32 14>1400 ret <16 x float> %res1401}1402define <16 x float> @test_masked_16xfloat_dup_low_mem_mask0(ptr %vp, <16 x float> %vec2, <16 x float> %mask) {1403; CHECK-LABEL: test_masked_16xfloat_dup_low_mem_mask0:1404; CHECK: # %bb.0:1405; CHECK-NEXT: vxorps %xmm2, %xmm2, %xmm21406; CHECK-NEXT: vcmpeqps %zmm2, %zmm1, %k11407; CHECK-NEXT: vmovsldup {{.*#+}} zmm0 {%k1} = mem[0,0,2,2,4,4,6,6,8,8,10,10,12,12,14,14]1408; CHECK-NEXT: retq1409 %vec = load <16 x float>, ptr %vp1410 %shuf = shufflevector <16 x float> %vec, <16 x float> undef, <16 x i32> <i32 0, i32 0, i32 2, i32 2, i32 4, i32 4, i32 6, i32 6, i32 8, i32 8, i32 10, i32 10, i32 12, i32 12, i32 14, i32 14>1411 %cmp = fcmp oeq <16 x float> %mask, zeroinitializer1412 %res = select <16 x i1> %cmp, <16 x float> %shuf, <16 x float> %vec21413 ret <16 x float> %res1414}1415 1416define <16 x float> @test_masked_z_16xfloat_dup_low_mem_mask0(ptr %vp, <16 x float> %mask) {1417; CHECK-LABEL: test_masked_z_16xfloat_dup_low_mem_mask0:1418; CHECK: # %bb.0:1419; CHECK-NEXT: vxorps %xmm1, %xmm1, %xmm11420; CHECK-NEXT: vcmpeqps %zmm1, %zmm0, %k11421; CHECK-NEXT: vmovsldup {{.*#+}} zmm0 {%k1} {z} = mem[0,0,2,2,4,4,6,6,8,8,10,10,12,12,14,14]1422; CHECK-NEXT: retq1423 %vec = load <16 x float>, ptr %vp1424 %shuf = shufflevector <16 x float> %vec, <16 x float> undef, <16 x i32> <i32 0, i32 0, i32 2, i32 2, i32 4, i32 4, i32 6, i32 6, i32 8, i32 8, i32 10, i32 10, i32 12, i32 12, i32 14, i32 14>1425 %cmp = fcmp oeq <16 x float> %mask, zeroinitializer1426 %res = select <16 x i1> %cmp, <16 x float> %shuf, <16 x float> zeroinitializer1427 ret <16 x float> %res1428}1429define <16 x float> @test_masked_16xfloat_dup_low_mem_mask1(ptr %vp, <16 x float> %vec2, <16 x float> %mask) {1430; CHECK-LABEL: test_masked_16xfloat_dup_low_mem_mask1:1431; CHECK: # %bb.0:1432; CHECK-NEXT: vxorps %xmm2, %xmm2, %xmm21433; CHECK-NEXT: vcmpeqps %zmm2, %zmm1, %k11434; CHECK-NEXT: vmovsldup {{.*#+}} zmm0 {%k1} = mem[0,0,2,2,4,4,6,6,8,8,10,10,12,12,14,14]1435; CHECK-NEXT: retq1436 %vec = load <16 x float>, ptr %vp1437 %shuf = shufflevector <16 x float> %vec, <16 x float> undef, <16 x i32> <i32 0, i32 0, i32 2, i32 2, i32 4, i32 4, i32 6, i32 6, i32 8, i32 8, i32 10, i32 10, i32 12, i32 12, i32 14, i32 14>1438 %cmp = fcmp oeq <16 x float> %mask, zeroinitializer1439 %res = select <16 x i1> %cmp, <16 x float> %shuf, <16 x float> %vec21440 ret <16 x float> %res1441}1442 1443define <16 x float> @test_masked_z_16xfloat_dup_low_mem_mask1(ptr %vp, <16 x float> %mask) {1444; CHECK-LABEL: test_masked_z_16xfloat_dup_low_mem_mask1:1445; CHECK: # %bb.0:1446; CHECK-NEXT: vxorps %xmm1, %xmm1, %xmm11447; CHECK-NEXT: vcmpeqps %zmm1, %zmm0, %k11448; CHECK-NEXT: vmovsldup {{.*#+}} zmm0 {%k1} {z} = mem[0,0,2,2,4,4,6,6,8,8,10,10,12,12,14,14]1449; CHECK-NEXT: retq1450 %vec = load <16 x float>, ptr %vp1451 %shuf = shufflevector <16 x float> %vec, <16 x float> undef, <16 x i32> <i32 0, i32 0, i32 2, i32 2, i32 4, i32 4, i32 6, i32 6, i32 8, i32 8, i32 10, i32 10, i32 12, i32 12, i32 14, i32 14>1452 %cmp = fcmp oeq <16 x float> %mask, zeroinitializer1453 %res = select <16 x i1> %cmp, <16 x float> %shuf, <16 x float> zeroinitializer1454 ret <16 x float> %res1455}1456define <16 x float> @test_masked_16xfloat_dup_low_mem_mask2(ptr %vp, <16 x float> %vec2, <16 x float> %mask) {1457; CHECK-LABEL: test_masked_16xfloat_dup_low_mem_mask2:1458; CHECK: # %bb.0:1459; CHECK-NEXT: vxorps %xmm2, %xmm2, %xmm21460; CHECK-NEXT: vcmpeqps %zmm2, %zmm1, %k11461; CHECK-NEXT: vmovsldup {{.*#+}} zmm0 {%k1} = mem[0,0,2,2,4,4,6,6,8,8,10,10,12,12,14,14]1462; CHECK-NEXT: retq1463 %vec = load <16 x float>, ptr %vp1464 %shuf = shufflevector <16 x float> %vec, <16 x float> undef, <16 x i32> <i32 0, i32 0, i32 2, i32 2, i32 4, i32 4, i32 6, i32 6, i32 8, i32 8, i32 10, i32 10, i32 12, i32 12, i32 14, i32 14>1465 %cmp = fcmp oeq <16 x float> %mask, zeroinitializer1466 %res = select <16 x i1> %cmp, <16 x float> %shuf, <16 x float> %vec21467 ret <16 x float> %res1468}1469 1470define <16 x float> @test_masked_z_16xfloat_dup_low_mem_mask2(ptr %vp, <16 x float> %mask) {1471; CHECK-LABEL: test_masked_z_16xfloat_dup_low_mem_mask2:1472; CHECK: # %bb.0:1473; CHECK-NEXT: vxorps %xmm1, %xmm1, %xmm11474; CHECK-NEXT: vcmpeqps %zmm1, %zmm0, %k11475; CHECK-NEXT: vmovsldup {{.*#+}} zmm0 {%k1} {z} = mem[0,0,2,2,4,4,6,6,8,8,10,10,12,12,14,14]1476; CHECK-NEXT: retq1477 %vec = load <16 x float>, ptr %vp1478 %shuf = shufflevector <16 x float> %vec, <16 x float> undef, <16 x i32> <i32 0, i32 0, i32 2, i32 2, i32 4, i32 4, i32 6, i32 6, i32 8, i32 8, i32 10, i32 10, i32 12, i32 12, i32 14, i32 14>1479 %cmp = fcmp oeq <16 x float> %mask, zeroinitializer1480 %res = select <16 x i1> %cmp, <16 x float> %shuf, <16 x float> zeroinitializer1481 ret <16 x float> %res1482}1483define <16 x float> @test_masked_16xfloat_dup_low_mem_mask3(ptr %vp, <16 x float> %vec2, <16 x float> %mask) {1484; CHECK-LABEL: test_masked_16xfloat_dup_low_mem_mask3:1485; CHECK: # %bb.0:1486; CHECK-NEXT: vxorps %xmm2, %xmm2, %xmm21487; CHECK-NEXT: vcmpeqps %zmm2, %zmm1, %k11488; CHECK-NEXT: vmovsldup {{.*#+}} zmm0 {%k1} = mem[0,0,2,2,4,4,6,6,8,8,10,10,12,12,14,14]1489; CHECK-NEXT: retq1490 %vec = load <16 x float>, ptr %vp1491 %shuf = shufflevector <16 x float> %vec, <16 x float> undef, <16 x i32> <i32 0, i32 0, i32 2, i32 2, i32 4, i32 4, i32 6, i32 6, i32 8, i32 8, i32 10, i32 10, i32 12, i32 12, i32 14, i32 14>1492 %cmp = fcmp oeq <16 x float> %mask, zeroinitializer1493 %res = select <16 x i1> %cmp, <16 x float> %shuf, <16 x float> %vec21494 ret <16 x float> %res1495}1496 1497define <16 x float> @test_masked_z_16xfloat_dup_low_mem_mask3(ptr %vp, <16 x float> %mask) {1498; CHECK-LABEL: test_masked_z_16xfloat_dup_low_mem_mask3:1499; CHECK: # %bb.0:1500; CHECK-NEXT: vxorps %xmm1, %xmm1, %xmm11501; CHECK-NEXT: vcmpeqps %zmm1, %zmm0, %k11502; CHECK-NEXT: vmovsldup {{.*#+}} zmm0 {%k1} {z} = mem[0,0,2,2,4,4,6,6,8,8,10,10,12,12,14,14]1503; CHECK-NEXT: retq1504 %vec = load <16 x float>, ptr %vp1505 %shuf = shufflevector <16 x float> %vec, <16 x float> undef, <16 x i32> <i32 0, i32 0, i32 2, i32 2, i32 4, i32 4, i32 6, i32 6, i32 8, i32 8, i32 10, i32 10, i32 12, i32 12, i32 14, i32 14>1506 %cmp = fcmp oeq <16 x float> %mask, zeroinitializer1507 %res = select <16 x i1> %cmp, <16 x float> %shuf, <16 x float> zeroinitializer1508 ret <16 x float> %res1509}1510define <16 x float> @test_masked_16xfloat_dup_low_mem_mask4(ptr %vp, <16 x float> %vec2, <16 x float> %mask) {1511; CHECK-LABEL: test_masked_16xfloat_dup_low_mem_mask4:1512; CHECK: # %bb.0:1513; CHECK-NEXT: vxorps %xmm2, %xmm2, %xmm21514; CHECK-NEXT: vcmpeqps %zmm2, %zmm1, %k11515; CHECK-NEXT: vmovsldup {{.*#+}} zmm0 {%k1} = mem[0,0,2,2,4,4,6,6,8,8,10,10,12,12,14,14]1516; CHECK-NEXT: retq1517 %vec = load <16 x float>, ptr %vp1518 %shuf = shufflevector <16 x float> %vec, <16 x float> undef, <16 x i32> <i32 0, i32 0, i32 2, i32 2, i32 4, i32 4, i32 6, i32 6, i32 8, i32 8, i32 10, i32 10, i32 12, i32 12, i32 14, i32 14>1519 %cmp = fcmp oeq <16 x float> %mask, zeroinitializer1520 %res = select <16 x i1> %cmp, <16 x float> %shuf, <16 x float> %vec21521 ret <16 x float> %res1522}1523 1524define <16 x float> @test_masked_z_16xfloat_dup_low_mem_mask4(ptr %vp, <16 x float> %mask) {1525; CHECK-LABEL: test_masked_z_16xfloat_dup_low_mem_mask4:1526; CHECK: # %bb.0:1527; CHECK-NEXT: vxorps %xmm1, %xmm1, %xmm11528; CHECK-NEXT: vcmpeqps %zmm1, %zmm0, %k11529; CHECK-NEXT: vmovsldup {{.*#+}} zmm0 {%k1} {z} = mem[0,0,2,2,4,4,6,6,8,8,10,10,12,12,14,14]1530; CHECK-NEXT: retq1531 %vec = load <16 x float>, ptr %vp1532 %shuf = shufflevector <16 x float> %vec, <16 x float> undef, <16 x i32> <i32 0, i32 0, i32 2, i32 2, i32 4, i32 4, i32 6, i32 6, i32 8, i32 8, i32 10, i32 10, i32 12, i32 12, i32 14, i32 14>1533 %cmp = fcmp oeq <16 x float> %mask, zeroinitializer1534 %res = select <16 x i1> %cmp, <16 x float> %shuf, <16 x float> zeroinitializer1535 ret <16 x float> %res1536}1537