850 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 <4 x float> @test_4xfloat_dup_high(<4 x float> %vec) {5; CHECK-LABEL: test_4xfloat_dup_high:6; CHECK: # %bb.0:7; CHECK-NEXT: vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]8; CHECK-NEXT: retq9 %res = shufflevector <4 x float> %vec, <4 x float> undef, <4 x i32> <i32 1, i32 1, i32 3, i32 3>10 ret <4 x float> %res11}12define <4 x float> @test_masked_4xfloat_dup_high_mask0(<4 x float> %vec, <4 x float> %vec2, <4 x float> %mask) {13; CHECK-LABEL: test_masked_4xfloat_dup_high_mask0:14; CHECK: # %bb.0:15; CHECK-NEXT: vxorps %xmm3, %xmm3, %xmm316; CHECK-NEXT: vcmpeqps %xmm3, %xmm2, %k117; CHECK-NEXT: vmovshdup {{.*#+}} xmm1 {%k1} = xmm0[1,1,3,3]18; CHECK-NEXT: vmovaps %xmm1, %xmm019; CHECK-NEXT: retq20 %shuf = shufflevector <4 x float> %vec, <4 x float> undef, <4 x i32> <i32 1, i32 1, i32 3, i32 3>21 %cmp = fcmp oeq <4 x float> %mask, zeroinitializer22 %res = select <4 x i1> %cmp, <4 x float> %shuf, <4 x float> %vec223 ret <4 x float> %res24}25 26define <4 x float> @test_masked_z_4xfloat_dup_high_mask0(<4 x float> %vec, <4 x float> %mask) {27; CHECK-LABEL: test_masked_z_4xfloat_dup_high_mask0:28; CHECK: # %bb.0:29; CHECK-NEXT: vxorps %xmm2, %xmm2, %xmm230; CHECK-NEXT: vcmpeqps %xmm2, %xmm1, %k131; CHECK-NEXT: vmovshdup {{.*#+}} xmm0 {%k1} {z} = xmm0[1,1,3,3]32; CHECK-NEXT: retq33 %shuf = shufflevector <4 x float> %vec, <4 x float> undef, <4 x i32> <i32 1, i32 1, i32 3, i32 3>34 %cmp = fcmp oeq <4 x float> %mask, zeroinitializer35 %res = select <4 x i1> %cmp, <4 x float> %shuf, <4 x float> zeroinitializer36 ret <4 x float> %res37}38define <4 x float> @test_masked_4xfloat_dup_high_mask1(<4 x float> %vec, <4 x float> %vec2, <4 x float> %mask) {39; CHECK-LABEL: test_masked_4xfloat_dup_high_mask1:40; CHECK: # %bb.0:41; CHECK-NEXT: vxorps %xmm3, %xmm3, %xmm342; CHECK-NEXT: vcmpeqps %xmm3, %xmm2, %k143; CHECK-NEXT: vmovshdup {{.*#+}} xmm1 {%k1} = xmm0[1,1,3,3]44; CHECK-NEXT: vmovaps %xmm1, %xmm045; CHECK-NEXT: retq46 %shuf = shufflevector <4 x float> %vec, <4 x float> undef, <4 x i32> <i32 1, i32 1, i32 3, i32 3>47 %cmp = fcmp oeq <4 x float> %mask, zeroinitializer48 %res = select <4 x i1> %cmp, <4 x float> %shuf, <4 x float> %vec249 ret <4 x float> %res50}51 52define <4 x float> @test_masked_z_4xfloat_dup_high_mask1(<4 x float> %vec, <4 x float> %mask) {53; CHECK-LABEL: test_masked_z_4xfloat_dup_high_mask1:54; CHECK: # %bb.0:55; CHECK-NEXT: vxorps %xmm2, %xmm2, %xmm256; CHECK-NEXT: vcmpeqps %xmm2, %xmm1, %k157; CHECK-NEXT: vmovshdup {{.*#+}} xmm0 {%k1} {z} = xmm0[1,1,3,3]58; CHECK-NEXT: retq59 %shuf = shufflevector <4 x float> %vec, <4 x float> undef, <4 x i32> <i32 1, i32 1, i32 3, i32 3>60 %cmp = fcmp oeq <4 x float> %mask, zeroinitializer61 %res = select <4 x i1> %cmp, <4 x float> %shuf, <4 x float> zeroinitializer62 ret <4 x float> %res63}64define <4 x float> @test_masked_4xfloat_dup_high_mask2(<4 x float> %vec, <4 x float> %vec2, <4 x float> %mask) {65; CHECK-LABEL: test_masked_4xfloat_dup_high_mask2:66; CHECK: # %bb.0:67; CHECK-NEXT: vxorps %xmm3, %xmm3, %xmm368; CHECK-NEXT: vcmpeqps %xmm3, %xmm2, %k169; CHECK-NEXT: vmovshdup {{.*#+}} xmm1 {%k1} = xmm0[1,1,3,3]70; CHECK-NEXT: vmovaps %xmm1, %xmm071; CHECK-NEXT: retq72 %shuf = shufflevector <4 x float> %vec, <4 x float> undef, <4 x i32> <i32 1, i32 1, i32 3, i32 3>73 %cmp = fcmp oeq <4 x float> %mask, zeroinitializer74 %res = select <4 x i1> %cmp, <4 x float> %shuf, <4 x float> %vec275 ret <4 x float> %res76}77 78define <4 x float> @test_masked_z_4xfloat_dup_high_mask2(<4 x float> %vec, <4 x float> %mask) {79; CHECK-LABEL: test_masked_z_4xfloat_dup_high_mask2:80; CHECK: # %bb.0:81; CHECK-NEXT: vxorps %xmm2, %xmm2, %xmm282; CHECK-NEXT: vcmpeqps %xmm2, %xmm1, %k183; CHECK-NEXT: vmovshdup {{.*#+}} xmm0 {%k1} {z} = xmm0[1,1,3,3]84; CHECK-NEXT: retq85 %shuf = shufflevector <4 x float> %vec, <4 x float> undef, <4 x i32> <i32 1, i32 1, i32 3, i32 3>86 %cmp = fcmp oeq <4 x float> %mask, zeroinitializer87 %res = select <4 x i1> %cmp, <4 x float> %shuf, <4 x float> zeroinitializer88 ret <4 x float> %res89}90define <4 x float> @test_masked_4xfloat_dup_high_mask3(<4 x float> %vec, <4 x float> %vec2, <4 x float> %mask) {91; CHECK-LABEL: test_masked_4xfloat_dup_high_mask3:92; CHECK: # %bb.0:93; CHECK-NEXT: vxorps %xmm3, %xmm3, %xmm394; CHECK-NEXT: vcmpeqps %xmm3, %xmm2, %k195; CHECK-NEXT: vmovshdup {{.*#+}} xmm1 {%k1} = xmm0[1,1,3,3]96; CHECK-NEXT: vmovaps %xmm1, %xmm097; CHECK-NEXT: retq98 %shuf = shufflevector <4 x float> %vec, <4 x float> undef, <4 x i32> <i32 1, i32 1, i32 3, i32 3>99 %cmp = fcmp oeq <4 x float> %mask, zeroinitializer100 %res = select <4 x i1> %cmp, <4 x float> %shuf, <4 x float> %vec2101 ret <4 x float> %res102}103 104define <4 x float> @test_masked_z_4xfloat_dup_high_mask3(<4 x float> %vec, <4 x float> %mask) {105; CHECK-LABEL: test_masked_z_4xfloat_dup_high_mask3:106; CHECK: # %bb.0:107; CHECK-NEXT: vxorps %xmm2, %xmm2, %xmm2108; CHECK-NEXT: vcmpeqps %xmm2, %xmm1, %k1109; CHECK-NEXT: vmovshdup {{.*#+}} xmm0 {%k1} {z} = xmm0[1,1,3,3]110; CHECK-NEXT: retq111 %shuf = shufflevector <4 x float> %vec, <4 x float> undef, <4 x i32> <i32 1, i32 1, i32 3, i32 3>112 %cmp = fcmp oeq <4 x float> %mask, zeroinitializer113 %res = select <4 x i1> %cmp, <4 x float> %shuf, <4 x float> zeroinitializer114 ret <4 x float> %res115}116define <4 x float> @test_masked_4xfloat_dup_high_mask4(<4 x float> %vec, <4 x float> %vec2, <4 x float> %mask) {117; CHECK-LABEL: test_masked_4xfloat_dup_high_mask4:118; CHECK: # %bb.0:119; CHECK-NEXT: vxorps %xmm3, %xmm3, %xmm3120; CHECK-NEXT: vcmpeqps %xmm3, %xmm2, %k1121; CHECK-NEXT: vmovshdup {{.*#+}} xmm1 {%k1} = xmm0[1,1,3,3]122; CHECK-NEXT: vmovaps %xmm1, %xmm0123; CHECK-NEXT: retq124 %shuf = shufflevector <4 x float> %vec, <4 x float> undef, <4 x i32> <i32 1, i32 1, i32 3, i32 3>125 %cmp = fcmp oeq <4 x float> %mask, zeroinitializer126 %res = select <4 x i1> %cmp, <4 x float> %shuf, <4 x float> %vec2127 ret <4 x float> %res128}129 130define <4 x float> @test_masked_z_4xfloat_dup_high_mask4(<4 x float> %vec, <4 x float> %mask) {131; CHECK-LABEL: test_masked_z_4xfloat_dup_high_mask4:132; CHECK: # %bb.0:133; CHECK-NEXT: vxorps %xmm2, %xmm2, %xmm2134; CHECK-NEXT: vcmpeqps %xmm2, %xmm1, %k1135; CHECK-NEXT: vmovshdup {{.*#+}} xmm0 {%k1} {z} = xmm0[1,1,3,3]136; CHECK-NEXT: retq137 %shuf = shufflevector <4 x float> %vec, <4 x float> undef, <4 x i32> <i32 1, i32 1, i32 3, i32 3>138 %cmp = fcmp oeq <4 x float> %mask, zeroinitializer139 %res = select <4 x i1> %cmp, <4 x float> %shuf, <4 x float> zeroinitializer140 ret <4 x float> %res141}142define <4 x float> @test_4xfloat_dup_high_mem(ptr %vp) {143; CHECK-LABEL: test_4xfloat_dup_high_mem:144; CHECK: # %bb.0:145; CHECK-NEXT: vmovshdup {{.*#+}} xmm0 = mem[1,1,3,3]146; CHECK-NEXT: retq147 %vec = load <4 x float>, ptr %vp148 %res = shufflevector <4 x float> %vec, <4 x float> undef, <4 x i32> <i32 1, i32 1, i32 3, i32 3>149 ret <4 x float> %res150}151define <4 x float> @test_masked_4xfloat_dup_high_mem_mask0(ptr %vp, <4 x float> %vec2, <4 x float> %mask) {152; CHECK-LABEL: test_masked_4xfloat_dup_high_mem_mask0:153; CHECK: # %bb.0:154; CHECK-NEXT: vxorps %xmm2, %xmm2, %xmm2155; CHECK-NEXT: vcmpeqps %xmm2, %xmm1, %k1156; CHECK-NEXT: vmovshdup {{.*#+}} xmm0 {%k1} = mem[1,1,3,3]157; CHECK-NEXT: retq158 %vec = load <4 x float>, ptr %vp159 %shuf = shufflevector <4 x float> %vec, <4 x float> undef, <4 x i32> <i32 1, i32 1, i32 3, i32 3>160 %cmp = fcmp oeq <4 x float> %mask, zeroinitializer161 %res = select <4 x i1> %cmp, <4 x float> %shuf, <4 x float> %vec2162 ret <4 x float> %res163}164 165define <4 x float> @test_masked_z_4xfloat_dup_high_mem_mask0(ptr %vp, <4 x float> %mask) {166; CHECK-LABEL: test_masked_z_4xfloat_dup_high_mem_mask0:167; CHECK: # %bb.0:168; CHECK-NEXT: vxorps %xmm1, %xmm1, %xmm1169; CHECK-NEXT: vcmpeqps %xmm1, %xmm0, %k1170; CHECK-NEXT: vmovshdup {{.*#+}} xmm0 {%k1} {z} = mem[1,1,3,3]171; CHECK-NEXT: retq172 %vec = load <4 x float>, ptr %vp173 %shuf = shufflevector <4 x float> %vec, <4 x float> undef, <4 x i32> <i32 1, i32 1, i32 3, i32 3>174 %cmp = fcmp oeq <4 x float> %mask, zeroinitializer175 %res = select <4 x i1> %cmp, <4 x float> %shuf, <4 x float> zeroinitializer176 ret <4 x float> %res177}178define <4 x float> @test_masked_4xfloat_dup_high_mem_mask1(ptr %vp, <4 x float> %vec2, <4 x float> %mask) {179; CHECK-LABEL: test_masked_4xfloat_dup_high_mem_mask1:180; CHECK: # %bb.0:181; CHECK-NEXT: vxorps %xmm2, %xmm2, %xmm2182; CHECK-NEXT: vcmpeqps %xmm2, %xmm1, %k1183; CHECK-NEXT: vmovshdup {{.*#+}} xmm0 {%k1} = mem[1,1,3,3]184; CHECK-NEXT: retq185 %vec = load <4 x float>, ptr %vp186 %shuf = shufflevector <4 x float> %vec, <4 x float> undef, <4 x i32> <i32 1, i32 1, i32 3, i32 3>187 %cmp = fcmp oeq <4 x float> %mask, zeroinitializer188 %res = select <4 x i1> %cmp, <4 x float> %shuf, <4 x float> %vec2189 ret <4 x float> %res190}191 192define <4 x float> @test_masked_z_4xfloat_dup_high_mem_mask1(ptr %vp, <4 x float> %mask) {193; CHECK-LABEL: test_masked_z_4xfloat_dup_high_mem_mask1:194; CHECK: # %bb.0:195; CHECK-NEXT: vxorps %xmm1, %xmm1, %xmm1196; CHECK-NEXT: vcmpeqps %xmm1, %xmm0, %k1197; CHECK-NEXT: vmovshdup {{.*#+}} xmm0 {%k1} {z} = mem[1,1,3,3]198; CHECK-NEXT: retq199 %vec = load <4 x float>, ptr %vp200 %shuf = shufflevector <4 x float> %vec, <4 x float> undef, <4 x i32> <i32 1, i32 1, i32 3, i32 3>201 %cmp = fcmp oeq <4 x float> %mask, zeroinitializer202 %res = select <4 x i1> %cmp, <4 x float> %shuf, <4 x float> zeroinitializer203 ret <4 x float> %res204}205define <4 x float> @test_masked_4xfloat_dup_high_mem_mask2(ptr %vp, <4 x float> %vec2, <4 x float> %mask) {206; CHECK-LABEL: test_masked_4xfloat_dup_high_mem_mask2:207; CHECK: # %bb.0:208; CHECK-NEXT: vxorps %xmm2, %xmm2, %xmm2209; CHECK-NEXT: vcmpeqps %xmm2, %xmm1, %k1210; CHECK-NEXT: vmovshdup {{.*#+}} xmm0 {%k1} = mem[1,1,3,3]211; CHECK-NEXT: retq212 %vec = load <4 x float>, ptr %vp213 %shuf = shufflevector <4 x float> %vec, <4 x float> undef, <4 x i32> <i32 1, i32 1, i32 3, i32 3>214 %cmp = fcmp oeq <4 x float> %mask, zeroinitializer215 %res = select <4 x i1> %cmp, <4 x float> %shuf, <4 x float> %vec2216 ret <4 x float> %res217}218 219define <4 x float> @test_masked_z_4xfloat_dup_high_mem_mask2(ptr %vp, <4 x float> %mask) {220; CHECK-LABEL: test_masked_z_4xfloat_dup_high_mem_mask2:221; CHECK: # %bb.0:222; CHECK-NEXT: vxorps %xmm1, %xmm1, %xmm1223; CHECK-NEXT: vcmpeqps %xmm1, %xmm0, %k1224; CHECK-NEXT: vmovshdup {{.*#+}} xmm0 {%k1} {z} = mem[1,1,3,3]225; CHECK-NEXT: retq226 %vec = load <4 x float>, ptr %vp227 %shuf = shufflevector <4 x float> %vec, <4 x float> undef, <4 x i32> <i32 1, i32 1, i32 3, i32 3>228 %cmp = fcmp oeq <4 x float> %mask, zeroinitializer229 %res = select <4 x i1> %cmp, <4 x float> %shuf, <4 x float> zeroinitializer230 ret <4 x float> %res231}232define <4 x float> @test_masked_4xfloat_dup_high_mem_mask3(ptr %vp, <4 x float> %vec2, <4 x float> %mask) {233; CHECK-LABEL: test_masked_4xfloat_dup_high_mem_mask3:234; CHECK: # %bb.0:235; CHECK-NEXT: vxorps %xmm2, %xmm2, %xmm2236; CHECK-NEXT: vcmpeqps %xmm2, %xmm1, %k1237; CHECK-NEXT: vmovshdup {{.*#+}} xmm0 {%k1} = mem[1,1,3,3]238; CHECK-NEXT: retq239 %vec = load <4 x float>, ptr %vp240 %shuf = shufflevector <4 x float> %vec, <4 x float> undef, <4 x i32> <i32 1, i32 1, i32 3, i32 3>241 %cmp = fcmp oeq <4 x float> %mask, zeroinitializer242 %res = select <4 x i1> %cmp, <4 x float> %shuf, <4 x float> %vec2243 ret <4 x float> %res244}245 246define <4 x float> @test_masked_z_4xfloat_dup_high_mem_mask3(ptr %vp, <4 x float> %mask) {247; CHECK-LABEL: test_masked_z_4xfloat_dup_high_mem_mask3:248; CHECK: # %bb.0:249; CHECK-NEXT: vxorps %xmm1, %xmm1, %xmm1250; CHECK-NEXT: vcmpeqps %xmm1, %xmm0, %k1251; CHECK-NEXT: vmovshdup {{.*#+}} xmm0 {%k1} {z} = mem[1,1,3,3]252; CHECK-NEXT: retq253 %vec = load <4 x float>, ptr %vp254 %shuf = shufflevector <4 x float> %vec, <4 x float> undef, <4 x i32> <i32 1, i32 1, i32 3, i32 3>255 %cmp = fcmp oeq <4 x float> %mask, zeroinitializer256 %res = select <4 x i1> %cmp, <4 x float> %shuf, <4 x float> zeroinitializer257 ret <4 x float> %res258}259define <4 x float> @test_masked_4xfloat_dup_high_mem_mask4(ptr %vp, <4 x float> %vec2, <4 x float> %mask) {260; CHECK-LABEL: test_masked_4xfloat_dup_high_mem_mask4:261; CHECK: # %bb.0:262; CHECK-NEXT: vxorps %xmm2, %xmm2, %xmm2263; CHECK-NEXT: vcmpeqps %xmm2, %xmm1, %k1264; CHECK-NEXT: vmovshdup {{.*#+}} xmm0 {%k1} = mem[1,1,3,3]265; CHECK-NEXT: retq266 %vec = load <4 x float>, ptr %vp267 %shuf = shufflevector <4 x float> %vec, <4 x float> undef, <4 x i32> <i32 1, i32 1, i32 3, i32 3>268 %cmp = fcmp oeq <4 x float> %mask, zeroinitializer269 %res = select <4 x i1> %cmp, <4 x float> %shuf, <4 x float> %vec2270 ret <4 x float> %res271}272 273define <4 x float> @test_masked_z_4xfloat_dup_high_mem_mask4(ptr %vp, <4 x float> %mask) {274; CHECK-LABEL: test_masked_z_4xfloat_dup_high_mem_mask4:275; CHECK: # %bb.0:276; CHECK-NEXT: vxorps %xmm1, %xmm1, %xmm1277; CHECK-NEXT: vcmpeqps %xmm1, %xmm0, %k1278; CHECK-NEXT: vmovshdup {{.*#+}} xmm0 {%k1} {z} = mem[1,1,3,3]279; CHECK-NEXT: retq280 %vec = load <4 x float>, ptr %vp281 %shuf = shufflevector <4 x float> %vec, <4 x float> undef, <4 x i32> <i32 1, i32 1, i32 3, i32 3>282 %cmp = fcmp oeq <4 x float> %mask, zeroinitializer283 %res = select <4 x i1> %cmp, <4 x float> %shuf, <4 x float> zeroinitializer284 ret <4 x float> %res285}286define <8 x float> @test_8xfloat_dup_high(<8 x float> %vec) {287; CHECK-LABEL: test_8xfloat_dup_high:288; CHECK: # %bb.0:289; CHECK-NEXT: vmovshdup {{.*#+}} ymm0 = ymm0[1,1,3,3,5,5,7,7]290; CHECK-NEXT: retq291 %res = shufflevector <8 x float> %vec, <8 x float> undef, <8 x i32> <i32 1, i32 1, i32 3, i32 3, i32 5, i32 5, i32 7, i32 7>292 ret <8 x float> %res293}294define <8 x float> @test_masked_8xfloat_dup_high_mask0(<8 x float> %vec, <8 x float> %vec2, <8 x float> %mask) {295; CHECK-LABEL: test_masked_8xfloat_dup_high_mask0:296; CHECK: # %bb.0:297; CHECK-NEXT: vxorps %xmm3, %xmm3, %xmm3298; CHECK-NEXT: vcmpeqps %ymm3, %ymm2, %k1299; CHECK-NEXT: vmovshdup {{.*#+}} ymm1 {%k1} = ymm0[1,1,3,3,5,5,7,7]300; CHECK-NEXT: vmovaps %ymm1, %ymm0301; CHECK-NEXT: retq302 %shuf = shufflevector <8 x float> %vec, <8 x float> undef, <8 x i32> <i32 1, i32 1, i32 3, i32 3, i32 5, i32 5, i32 7, i32 7>303 %cmp = fcmp oeq <8 x float> %mask, zeroinitializer304 %res = select <8 x i1> %cmp, <8 x float> %shuf, <8 x float> %vec2305 ret <8 x float> %res306}307 308define <8 x float> @test_masked_z_8xfloat_dup_high_mask0(<8 x float> %vec, <8 x float> %mask) {309; CHECK-LABEL: test_masked_z_8xfloat_dup_high_mask0:310; CHECK: # %bb.0:311; CHECK-NEXT: vxorps %xmm2, %xmm2, %xmm2312; CHECK-NEXT: vcmpeqps %ymm2, %ymm1, %k1313; CHECK-NEXT: vmovshdup {{.*#+}} ymm0 {%k1} {z} = ymm0[1,1,3,3,5,5,7,7]314; CHECK-NEXT: retq315 %shuf = shufflevector <8 x float> %vec, <8 x float> undef, <8 x i32> <i32 1, i32 1, i32 3, i32 3, i32 5, i32 5, i32 7, i32 7>316 %cmp = fcmp oeq <8 x float> %mask, zeroinitializer317 %res = select <8 x i1> %cmp, <8 x float> %shuf, <8 x float> zeroinitializer318 ret <8 x float> %res319}320define <8 x float> @test_masked_8xfloat_dup_high_mask1(<8 x float> %vec, <8 x float> %vec2, <8 x float> %mask) {321; CHECK-LABEL: test_masked_8xfloat_dup_high_mask1:322; CHECK: # %bb.0:323; CHECK-NEXT: vxorps %xmm3, %xmm3, %xmm3324; CHECK-NEXT: vcmpeqps %ymm3, %ymm2, %k1325; CHECK-NEXT: vmovshdup {{.*#+}} ymm1 {%k1} = ymm0[1,1,3,3,5,5,7,7]326; CHECK-NEXT: vmovaps %ymm1, %ymm0327; CHECK-NEXT: retq328 %shuf = shufflevector <8 x float> %vec, <8 x float> undef, <8 x i32> <i32 1, i32 1, i32 3, i32 3, i32 5, i32 5, i32 7, i32 7>329 %cmp = fcmp oeq <8 x float> %mask, zeroinitializer330 %res = select <8 x i1> %cmp, <8 x float> %shuf, <8 x float> %vec2331 ret <8 x float> %res332}333 334define <8 x float> @test_masked_z_8xfloat_dup_high_mask1(<8 x float> %vec, <8 x float> %mask) {335; CHECK-LABEL: test_masked_z_8xfloat_dup_high_mask1:336; CHECK: # %bb.0:337; CHECK-NEXT: vxorps %xmm2, %xmm2, %xmm2338; CHECK-NEXT: vcmpeqps %ymm2, %ymm1, %k1339; CHECK-NEXT: vmovshdup {{.*#+}} ymm0 {%k1} {z} = ymm0[1,1,3,3,5,5,7,7]340; CHECK-NEXT: retq341 %shuf = shufflevector <8 x float> %vec, <8 x float> undef, <8 x i32> <i32 1, i32 1, i32 3, i32 3, i32 5, i32 5, i32 7, i32 7>342 %cmp = fcmp oeq <8 x float> %mask, zeroinitializer343 %res = select <8 x i1> %cmp, <8 x float> %shuf, <8 x float> zeroinitializer344 ret <8 x float> %res345}346define <8 x float> @test_masked_8xfloat_dup_high_mask2(<8 x float> %vec, <8 x float> %vec2, <8 x float> %mask) {347; CHECK-LABEL: test_masked_8xfloat_dup_high_mask2:348; CHECK: # %bb.0:349; CHECK-NEXT: vxorps %xmm3, %xmm3, %xmm3350; CHECK-NEXT: vcmpeqps %ymm3, %ymm2, %k1351; CHECK-NEXT: vmovshdup {{.*#+}} ymm1 {%k1} = ymm0[1,1,3,3,5,5,7,7]352; CHECK-NEXT: vmovaps %ymm1, %ymm0353; CHECK-NEXT: retq354 %shuf = shufflevector <8 x float> %vec, <8 x float> undef, <8 x i32> <i32 1, i32 1, i32 3, i32 3, i32 5, i32 5, i32 7, i32 7>355 %cmp = fcmp oeq <8 x float> %mask, zeroinitializer356 %res = select <8 x i1> %cmp, <8 x float> %shuf, <8 x float> %vec2357 ret <8 x float> %res358}359 360define <8 x float> @test_masked_z_8xfloat_dup_high_mask2(<8 x float> %vec, <8 x float> %mask) {361; CHECK-LABEL: test_masked_z_8xfloat_dup_high_mask2:362; CHECK: # %bb.0:363; CHECK-NEXT: vxorps %xmm2, %xmm2, %xmm2364; CHECK-NEXT: vcmpeqps %ymm2, %ymm1, %k1365; CHECK-NEXT: vmovshdup {{.*#+}} ymm0 {%k1} {z} = ymm0[1,1,3,3,5,5,7,7]366; CHECK-NEXT: retq367 %shuf = shufflevector <8 x float> %vec, <8 x float> undef, <8 x i32> <i32 1, i32 1, i32 3, i32 3, i32 5, i32 5, i32 7, i32 7>368 %cmp = fcmp oeq <8 x float> %mask, zeroinitializer369 %res = select <8 x i1> %cmp, <8 x float> %shuf, <8 x float> zeroinitializer370 ret <8 x float> %res371}372define <8 x float> @test_masked_8xfloat_dup_high_mask3(<8 x float> %vec, <8 x float> %vec2, <8 x float> %mask) {373; CHECK-LABEL: test_masked_8xfloat_dup_high_mask3:374; CHECK: # %bb.0:375; CHECK-NEXT: vxorps %xmm3, %xmm3, %xmm3376; CHECK-NEXT: vcmpeqps %ymm3, %ymm2, %k1377; CHECK-NEXT: vmovshdup {{.*#+}} ymm1 {%k1} = ymm0[1,1,3,3,5,5,7,7]378; CHECK-NEXT: vmovaps %ymm1, %ymm0379; CHECK-NEXT: retq380 %shuf = shufflevector <8 x float> %vec, <8 x float> undef, <8 x i32> <i32 1, i32 1, i32 3, i32 3, i32 5, i32 5, i32 7, i32 7>381 %cmp = fcmp oeq <8 x float> %mask, zeroinitializer382 %res = select <8 x i1> %cmp, <8 x float> %shuf, <8 x float> %vec2383 ret <8 x float> %res384}385 386define <8 x float> @test_masked_z_8xfloat_dup_high_mask3(<8 x float> %vec, <8 x float> %mask) {387; CHECK-LABEL: test_masked_z_8xfloat_dup_high_mask3:388; CHECK: # %bb.0:389; CHECK-NEXT: vxorps %xmm2, %xmm2, %xmm2390; CHECK-NEXT: vcmpeqps %ymm2, %ymm1, %k1391; CHECK-NEXT: vmovshdup {{.*#+}} ymm0 {%k1} {z} = ymm0[1,1,3,3,5,5,7,7]392; CHECK-NEXT: retq393 %shuf = shufflevector <8 x float> %vec, <8 x float> undef, <8 x i32> <i32 1, i32 1, i32 3, i32 3, i32 5, i32 5, i32 7, i32 7>394 %cmp = fcmp oeq <8 x float> %mask, zeroinitializer395 %res = select <8 x i1> %cmp, <8 x float> %shuf, <8 x float> zeroinitializer396 ret <8 x float> %res397}398define <8 x float> @test_masked_8xfloat_dup_high_mask4(<8 x float> %vec, <8 x float> %vec2, <8 x float> %mask) {399; CHECK-LABEL: test_masked_8xfloat_dup_high_mask4:400; CHECK: # %bb.0:401; CHECK-NEXT: vxorps %xmm3, %xmm3, %xmm3402; CHECK-NEXT: vcmpeqps %ymm3, %ymm2, %k1403; CHECK-NEXT: vmovshdup {{.*#+}} ymm1 {%k1} = ymm0[1,1,3,3,5,5,7,7]404; CHECK-NEXT: vmovaps %ymm1, %ymm0405; CHECK-NEXT: retq406 %shuf = shufflevector <8 x float> %vec, <8 x float> undef, <8 x i32> <i32 1, i32 1, i32 3, i32 3, i32 5, i32 5, i32 7, i32 7>407 %cmp = fcmp oeq <8 x float> %mask, zeroinitializer408 %res = select <8 x i1> %cmp, <8 x float> %shuf, <8 x float> %vec2409 ret <8 x float> %res410}411 412define <8 x float> @test_masked_z_8xfloat_dup_high_mask4(<8 x float> %vec, <8 x float> %mask) {413; CHECK-LABEL: test_masked_z_8xfloat_dup_high_mask4:414; CHECK: # %bb.0:415; CHECK-NEXT: vxorps %xmm2, %xmm2, %xmm2416; CHECK-NEXT: vcmpeqps %ymm2, %ymm1, %k1417; CHECK-NEXT: vmovshdup {{.*#+}} ymm0 {%k1} {z} = ymm0[1,1,3,3,5,5,7,7]418; CHECK-NEXT: retq419 %shuf = shufflevector <8 x float> %vec, <8 x float> undef, <8 x i32> <i32 1, i32 1, i32 3, i32 3, i32 5, i32 5, i32 7, i32 7>420 %cmp = fcmp oeq <8 x float> %mask, zeroinitializer421 %res = select <8 x i1> %cmp, <8 x float> %shuf, <8 x float> zeroinitializer422 ret <8 x float> %res423}424define <8 x float> @test_8xfloat_dup_high_mem(ptr %vp) {425; CHECK-LABEL: test_8xfloat_dup_high_mem:426; CHECK: # %bb.0:427; CHECK-NEXT: vmovshdup {{.*#+}} ymm0 = mem[1,1,3,3,5,5,7,7]428; CHECK-NEXT: retq429 %vec = load <8 x float>, ptr %vp430 %res = shufflevector <8 x float> %vec, <8 x float> undef, <8 x i32> <i32 1, i32 1, i32 3, i32 3, i32 5, i32 5, i32 7, i32 7>431 ret <8 x float> %res432}433define <8 x float> @test_masked_8xfloat_dup_high_mem_mask0(ptr %vp, <8 x float> %vec2, <8 x float> %mask) {434; CHECK-LABEL: test_masked_8xfloat_dup_high_mem_mask0:435; CHECK: # %bb.0:436; CHECK-NEXT: vxorps %xmm2, %xmm2, %xmm2437; CHECK-NEXT: vcmpeqps %ymm2, %ymm1, %k1438; CHECK-NEXT: vmovshdup {{.*#+}} ymm0 {%k1} = mem[1,1,3,3,5,5,7,7]439; CHECK-NEXT: retq440 %vec = load <8 x float>, ptr %vp441 %shuf = shufflevector <8 x float> %vec, <8 x float> undef, <8 x i32> <i32 1, i32 1, i32 3, i32 3, i32 5, i32 5, i32 7, i32 7>442 %cmp = fcmp oeq <8 x float> %mask, zeroinitializer443 %res = select <8 x i1> %cmp, <8 x float> %shuf, <8 x float> %vec2444 ret <8 x float> %res445}446 447define <8 x float> @test_masked_z_8xfloat_dup_high_mem_mask0(ptr %vp, <8 x float> %mask) {448; CHECK-LABEL: test_masked_z_8xfloat_dup_high_mem_mask0:449; CHECK: # %bb.0:450; CHECK-NEXT: vxorps %xmm1, %xmm1, %xmm1451; CHECK-NEXT: vcmpeqps %ymm1, %ymm0, %k1452; CHECK-NEXT: vmovshdup {{.*#+}} ymm0 {%k1} {z} = mem[1,1,3,3,5,5,7,7]453; CHECK-NEXT: retq454 %vec = load <8 x float>, ptr %vp455 %shuf = shufflevector <8 x float> %vec, <8 x float> undef, <8 x i32> <i32 1, i32 1, i32 3, i32 3, i32 5, i32 5, i32 7, i32 7>456 %cmp = fcmp oeq <8 x float> %mask, zeroinitializer457 %res = select <8 x i1> %cmp, <8 x float> %shuf, <8 x float> zeroinitializer458 ret <8 x float> %res459}460define <8 x float> @test_masked_8xfloat_dup_high_mem_mask1(ptr %vp, <8 x float> %vec2, <8 x float> %mask) {461; CHECK-LABEL: test_masked_8xfloat_dup_high_mem_mask1:462; CHECK: # %bb.0:463; CHECK-NEXT: vxorps %xmm2, %xmm2, %xmm2464; CHECK-NEXT: vcmpeqps %ymm2, %ymm1, %k1465; CHECK-NEXT: vmovshdup {{.*#+}} ymm0 {%k1} = mem[1,1,3,3,5,5,7,7]466; CHECK-NEXT: retq467 %vec = load <8 x float>, ptr %vp468 %shuf = shufflevector <8 x float> %vec, <8 x float> undef, <8 x i32> <i32 1, i32 1, i32 3, i32 3, i32 5, i32 5, i32 7, i32 7>469 %cmp = fcmp oeq <8 x float> %mask, zeroinitializer470 %res = select <8 x i1> %cmp, <8 x float> %shuf, <8 x float> %vec2471 ret <8 x float> %res472}473 474define <8 x float> @test_masked_z_8xfloat_dup_high_mem_mask1(ptr %vp, <8 x float> %mask) {475; CHECK-LABEL: test_masked_z_8xfloat_dup_high_mem_mask1:476; CHECK: # %bb.0:477; CHECK-NEXT: vxorps %xmm1, %xmm1, %xmm1478; CHECK-NEXT: vcmpeqps %ymm1, %ymm0, %k1479; CHECK-NEXT: vmovshdup {{.*#+}} ymm0 {%k1} {z} = mem[1,1,3,3,5,5,7,7]480; CHECK-NEXT: retq481 %vec = load <8 x float>, ptr %vp482 %shuf = shufflevector <8 x float> %vec, <8 x float> undef, <8 x i32> <i32 1, i32 1, i32 3, i32 3, i32 5, i32 5, i32 7, i32 7>483 %cmp = fcmp oeq <8 x float> %mask, zeroinitializer484 %res = select <8 x i1> %cmp, <8 x float> %shuf, <8 x float> zeroinitializer485 ret <8 x float> %res486}487define <8 x float> @test_masked_8xfloat_dup_high_mem_mask2(ptr %vp, <8 x float> %vec2, <8 x float> %mask) {488; CHECK-LABEL: test_masked_8xfloat_dup_high_mem_mask2:489; CHECK: # %bb.0:490; CHECK-NEXT: vxorps %xmm2, %xmm2, %xmm2491; CHECK-NEXT: vcmpeqps %ymm2, %ymm1, %k1492; CHECK-NEXT: vmovshdup {{.*#+}} ymm0 {%k1} = mem[1,1,3,3,5,5,7,7]493; CHECK-NEXT: retq494 %vec = load <8 x float>, ptr %vp495 %shuf = shufflevector <8 x float> %vec, <8 x float> undef, <8 x i32> <i32 1, i32 1, i32 3, i32 3, i32 5, i32 5, i32 7, i32 7>496 %cmp = fcmp oeq <8 x float> %mask, zeroinitializer497 %res = select <8 x i1> %cmp, <8 x float> %shuf, <8 x float> %vec2498 ret <8 x float> %res499}500 501define <8 x float> @test_masked_z_8xfloat_dup_high_mem_mask2(ptr %vp, <8 x float> %mask) {502; CHECK-LABEL: test_masked_z_8xfloat_dup_high_mem_mask2:503; CHECK: # %bb.0:504; CHECK-NEXT: vxorps %xmm1, %xmm1, %xmm1505; CHECK-NEXT: vcmpeqps %ymm1, %ymm0, %k1506; CHECK-NEXT: vmovshdup {{.*#+}} ymm0 {%k1} {z} = mem[1,1,3,3,5,5,7,7]507; CHECK-NEXT: retq508 %vec = load <8 x float>, ptr %vp509 %shuf = shufflevector <8 x float> %vec, <8 x float> undef, <8 x i32> <i32 1, i32 1, i32 3, i32 3, i32 5, i32 5, i32 7, i32 7>510 %cmp = fcmp oeq <8 x float> %mask, zeroinitializer511 %res = select <8 x i1> %cmp, <8 x float> %shuf, <8 x float> zeroinitializer512 ret <8 x float> %res513}514define <8 x float> @test_masked_8xfloat_dup_high_mem_mask3(ptr %vp, <8 x float> %vec2, <8 x float> %mask) {515; CHECK-LABEL: test_masked_8xfloat_dup_high_mem_mask3:516; CHECK: # %bb.0:517; CHECK-NEXT: vxorps %xmm2, %xmm2, %xmm2518; CHECK-NEXT: vcmpeqps %ymm2, %ymm1, %k1519; CHECK-NEXT: vmovshdup {{.*#+}} ymm0 {%k1} = mem[1,1,3,3,5,5,7,7]520; CHECK-NEXT: retq521 %vec = load <8 x float>, ptr %vp522 %shuf = shufflevector <8 x float> %vec, <8 x float> undef, <8 x i32> <i32 1, i32 1, i32 3, i32 3, i32 5, i32 5, i32 7, i32 7>523 %cmp = fcmp oeq <8 x float> %mask, zeroinitializer524 %res = select <8 x i1> %cmp, <8 x float> %shuf, <8 x float> %vec2525 ret <8 x float> %res526}527 528define <8 x float> @test_masked_z_8xfloat_dup_high_mem_mask3(ptr %vp, <8 x float> %mask) {529; CHECK-LABEL: test_masked_z_8xfloat_dup_high_mem_mask3:530; CHECK: # %bb.0:531; CHECK-NEXT: vxorps %xmm1, %xmm1, %xmm1532; CHECK-NEXT: vcmpeqps %ymm1, %ymm0, %k1533; CHECK-NEXT: vmovshdup {{.*#+}} ymm0 {%k1} {z} = mem[1,1,3,3,5,5,7,7]534; CHECK-NEXT: retq535 %vec = load <8 x float>, ptr %vp536 %shuf = shufflevector <8 x float> %vec, <8 x float> undef, <8 x i32> <i32 1, i32 1, i32 3, i32 3, i32 5, i32 5, i32 7, i32 7>537 %cmp = fcmp oeq <8 x float> %mask, zeroinitializer538 %res = select <8 x i1> %cmp, <8 x float> %shuf, <8 x float> zeroinitializer539 ret <8 x float> %res540}541define <8 x float> @test_masked_8xfloat_dup_high_mem_mask4(ptr %vp, <8 x float> %vec2, <8 x float> %mask) {542; CHECK-LABEL: test_masked_8xfloat_dup_high_mem_mask4:543; CHECK: # %bb.0:544; CHECK-NEXT: vxorps %xmm2, %xmm2, %xmm2545; CHECK-NEXT: vcmpeqps %ymm2, %ymm1, %k1546; CHECK-NEXT: vmovshdup {{.*#+}} ymm0 {%k1} = mem[1,1,3,3,5,5,7,7]547; CHECK-NEXT: retq548 %vec = load <8 x float>, ptr %vp549 %shuf = shufflevector <8 x float> %vec, <8 x float> undef, <8 x i32> <i32 1, i32 1, i32 3, i32 3, i32 5, i32 5, i32 7, i32 7>550 %cmp = fcmp oeq <8 x float> %mask, zeroinitializer551 %res = select <8 x i1> %cmp, <8 x float> %shuf, <8 x float> %vec2552 ret <8 x float> %res553}554 555define <8 x float> @test_masked_z_8xfloat_dup_high_mem_mask4(ptr %vp, <8 x float> %mask) {556; CHECK-LABEL: test_masked_z_8xfloat_dup_high_mem_mask4:557; CHECK: # %bb.0:558; CHECK-NEXT: vxorps %xmm1, %xmm1, %xmm1559; CHECK-NEXT: vcmpeqps %ymm1, %ymm0, %k1560; CHECK-NEXT: vmovshdup {{.*#+}} ymm0 {%k1} {z} = mem[1,1,3,3,5,5,7,7]561; CHECK-NEXT: retq562 %vec = load <8 x float>, ptr %vp563 %shuf = shufflevector <8 x float> %vec, <8 x float> undef, <8 x i32> <i32 1, i32 1, i32 3, i32 3, i32 5, i32 5, i32 7, i32 7>564 %cmp = fcmp oeq <8 x float> %mask, zeroinitializer565 %res = select <8 x i1> %cmp, <8 x float> %shuf, <8 x float> zeroinitializer566 ret <8 x float> %res567}568define <16 x float> @test_16xfloat_dup_high(<16 x float> %vec) {569; CHECK-LABEL: test_16xfloat_dup_high:570; CHECK: # %bb.0:571; CHECK-NEXT: vmovshdup {{.*#+}} zmm0 = zmm0[1,1,3,3,5,5,7,7,9,9,11,11,13,13,15,15]572; CHECK-NEXT: retq573 %res = shufflevector <16 x float> %vec, <16 x float> undef, <16 x i32> <i32 1, i32 1, i32 3, i32 3, i32 5, i32 5, i32 7, i32 7, i32 9, i32 9, i32 11, i32 11, i32 13, i32 13, i32 15, i32 15>574 ret <16 x float> %res575}576define <16 x float> @test_masked_16xfloat_dup_high_mask0(<16 x float> %vec, <16 x float> %vec2, <16 x float> %mask) {577; CHECK-LABEL: test_masked_16xfloat_dup_high_mask0:578; CHECK: # %bb.0:579; CHECK-NEXT: vxorps %xmm3, %xmm3, %xmm3580; CHECK-NEXT: vcmpeqps %zmm3, %zmm2, %k1581; CHECK-NEXT: vmovshdup {{.*#+}} zmm1 {%k1} = zmm0[1,1,3,3,5,5,7,7,9,9,11,11,13,13,15,15]582; CHECK-NEXT: vmovaps %zmm1, %zmm0583; CHECK-NEXT: retq584 %shuf = shufflevector <16 x float> %vec, <16 x float> undef, <16 x i32> <i32 1, i32 1, i32 3, i32 3, i32 5, i32 5, i32 7, i32 7, i32 9, i32 9, i32 11, i32 11, i32 13, i32 13, i32 15, i32 15>585 %cmp = fcmp oeq <16 x float> %mask, zeroinitializer586 %res = select <16 x i1> %cmp, <16 x float> %shuf, <16 x float> %vec2587 ret <16 x float> %res588}589 590define <16 x float> @test_masked_z_16xfloat_dup_high_mask0(<16 x float> %vec, <16 x float> %mask) {591; CHECK-LABEL: test_masked_z_16xfloat_dup_high_mask0:592; CHECK: # %bb.0:593; CHECK-NEXT: vxorps %xmm2, %xmm2, %xmm2594; CHECK-NEXT: vcmpeqps %zmm2, %zmm1, %k1595; CHECK-NEXT: vmovshdup {{.*#+}} zmm0 {%k1} {z} = zmm0[1,1,3,3,5,5,7,7,9,9,11,11,13,13,15,15]596; CHECK-NEXT: retq597 %shuf = shufflevector <16 x float> %vec, <16 x float> undef, <16 x i32> <i32 1, i32 1, i32 3, i32 3, i32 5, i32 5, i32 7, i32 7, i32 9, i32 9, i32 11, i32 11, i32 13, i32 13, i32 15, i32 15>598 %cmp = fcmp oeq <16 x float> %mask, zeroinitializer599 %res = select <16 x i1> %cmp, <16 x float> %shuf, <16 x float> zeroinitializer600 ret <16 x float> %res601}602define <16 x float> @test_masked_16xfloat_dup_high_mask1(<16 x float> %vec, <16 x float> %vec2, <16 x float> %mask) {603; CHECK-LABEL: test_masked_16xfloat_dup_high_mask1:604; CHECK: # %bb.0:605; CHECK-NEXT: vxorps %xmm3, %xmm3, %xmm3606; CHECK-NEXT: vcmpeqps %zmm3, %zmm2, %k1607; CHECK-NEXT: vmovshdup {{.*#+}} zmm1 {%k1} = zmm0[1,1,3,3,5,5,7,7,9,9,11,11,13,13,15,15]608; CHECK-NEXT: vmovaps %zmm1, %zmm0609; CHECK-NEXT: retq610 %shuf = shufflevector <16 x float> %vec, <16 x float> undef, <16 x i32> <i32 1, i32 1, i32 3, i32 3, i32 5, i32 5, i32 7, i32 7, i32 9, i32 9, i32 11, i32 11, i32 13, i32 13, i32 15, i32 15>611 %cmp = fcmp oeq <16 x float> %mask, zeroinitializer612 %res = select <16 x i1> %cmp, <16 x float> %shuf, <16 x float> %vec2613 ret <16 x float> %res614}615 616define <16 x float> @test_masked_z_16xfloat_dup_high_mask1(<16 x float> %vec, <16 x float> %mask) {617; CHECK-LABEL: test_masked_z_16xfloat_dup_high_mask1:618; CHECK: # %bb.0:619; CHECK-NEXT: vxorps %xmm2, %xmm2, %xmm2620; CHECK-NEXT: vcmpeqps %zmm2, %zmm1, %k1621; CHECK-NEXT: vmovshdup {{.*#+}} zmm0 {%k1} {z} = zmm0[1,1,3,3,5,5,7,7,9,9,11,11,13,13,15,15]622; CHECK-NEXT: retq623 %shuf = shufflevector <16 x float> %vec, <16 x float> undef, <16 x i32> <i32 1, i32 1, i32 3, i32 3, i32 5, i32 5, i32 7, i32 7, i32 9, i32 9, i32 11, i32 11, i32 13, i32 13, i32 15, i32 15>624 %cmp = fcmp oeq <16 x float> %mask, zeroinitializer625 %res = select <16 x i1> %cmp, <16 x float> %shuf, <16 x float> zeroinitializer626 ret <16 x float> %res627}628define <16 x float> @test_masked_16xfloat_dup_high_mask2(<16 x float> %vec, <16 x float> %vec2, <16 x float> %mask) {629; CHECK-LABEL: test_masked_16xfloat_dup_high_mask2:630; CHECK: # %bb.0:631; CHECK-NEXT: vxorps %xmm3, %xmm3, %xmm3632; CHECK-NEXT: vcmpeqps %zmm3, %zmm2, %k1633; CHECK-NEXT: vmovshdup {{.*#+}} zmm1 {%k1} = zmm0[1,1,3,3,5,5,7,7,9,9,11,11,13,13,15,15]634; CHECK-NEXT: vmovaps %zmm1, %zmm0635; CHECK-NEXT: retq636 %shuf = shufflevector <16 x float> %vec, <16 x float> undef, <16 x i32> <i32 1, i32 1, i32 3, i32 3, i32 5, i32 5, i32 7, i32 7, i32 9, i32 9, i32 11, i32 11, i32 13, i32 13, i32 15, i32 15>637 %cmp = fcmp oeq <16 x float> %mask, zeroinitializer638 %res = select <16 x i1> %cmp, <16 x float> %shuf, <16 x float> %vec2639 ret <16 x float> %res640}641 642define <16 x float> @test_masked_z_16xfloat_dup_high_mask2(<16 x float> %vec, <16 x float> %mask) {643; CHECK-LABEL: test_masked_z_16xfloat_dup_high_mask2:644; CHECK: # %bb.0:645; CHECK-NEXT: vxorps %xmm2, %xmm2, %xmm2646; CHECK-NEXT: vcmpeqps %zmm2, %zmm1, %k1647; CHECK-NEXT: vmovshdup {{.*#+}} zmm0 {%k1} {z} = zmm0[1,1,3,3,5,5,7,7,9,9,11,11,13,13,15,15]648; CHECK-NEXT: retq649 %shuf = shufflevector <16 x float> %vec, <16 x float> undef, <16 x i32> <i32 1, i32 1, i32 3, i32 3, i32 5, i32 5, i32 7, i32 7, i32 9, i32 9, i32 11, i32 11, i32 13, i32 13, i32 15, i32 15>650 %cmp = fcmp oeq <16 x float> %mask, zeroinitializer651 %res = select <16 x i1> %cmp, <16 x float> %shuf, <16 x float> zeroinitializer652 ret <16 x float> %res653}654define <16 x float> @test_masked_16xfloat_dup_high_mask3(<16 x float> %vec, <16 x float> %vec2, <16 x float> %mask) {655; CHECK-LABEL: test_masked_16xfloat_dup_high_mask3:656; CHECK: # %bb.0:657; CHECK-NEXT: vxorps %xmm3, %xmm3, %xmm3658; CHECK-NEXT: vcmpeqps %zmm3, %zmm2, %k1659; CHECK-NEXT: vmovshdup {{.*#+}} zmm1 {%k1} = zmm0[1,1,3,3,5,5,7,7,9,9,11,11,13,13,15,15]660; CHECK-NEXT: vmovaps %zmm1, %zmm0661; CHECK-NEXT: retq662 %shuf = shufflevector <16 x float> %vec, <16 x float> undef, <16 x i32> <i32 1, i32 1, i32 3, i32 3, i32 5, i32 5, i32 7, i32 7, i32 9, i32 9, i32 11, i32 11, i32 13, i32 13, i32 15, i32 15>663 %cmp = fcmp oeq <16 x float> %mask, zeroinitializer664 %res = select <16 x i1> %cmp, <16 x float> %shuf, <16 x float> %vec2665 ret <16 x float> %res666}667 668define <16 x float> @test_masked_z_16xfloat_dup_high_mask3(<16 x float> %vec, <16 x float> %mask) {669; CHECK-LABEL: test_masked_z_16xfloat_dup_high_mask3:670; CHECK: # %bb.0:671; CHECK-NEXT: vxorps %xmm2, %xmm2, %xmm2672; CHECK-NEXT: vcmpeqps %zmm2, %zmm1, %k1673; CHECK-NEXT: vmovshdup {{.*#+}} zmm0 {%k1} {z} = zmm0[1,1,3,3,5,5,7,7,9,9,11,11,13,13,15,15]674; CHECK-NEXT: retq675 %shuf = shufflevector <16 x float> %vec, <16 x float> undef, <16 x i32> <i32 1, i32 1, i32 3, i32 3, i32 5, i32 5, i32 7, i32 7, i32 9, i32 9, i32 11, i32 11, i32 13, i32 13, i32 15, i32 15>676 %cmp = fcmp oeq <16 x float> %mask, zeroinitializer677 %res = select <16 x i1> %cmp, <16 x float> %shuf, <16 x float> zeroinitializer678 ret <16 x float> %res679}680define <16 x float> @test_masked_16xfloat_dup_high_mask4(<16 x float> %vec, <16 x float> %vec2, <16 x float> %mask) {681; CHECK-LABEL: test_masked_16xfloat_dup_high_mask4:682; CHECK: # %bb.0:683; CHECK-NEXT: vxorps %xmm3, %xmm3, %xmm3684; CHECK-NEXT: vcmpeqps %zmm3, %zmm2, %k1685; CHECK-NEXT: vmovshdup {{.*#+}} zmm1 {%k1} = zmm0[1,1,3,3,5,5,7,7,9,9,11,11,13,13,15,15]686; CHECK-NEXT: vmovaps %zmm1, %zmm0687; CHECK-NEXT: retq688 %shuf = shufflevector <16 x float> %vec, <16 x float> undef, <16 x i32> <i32 1, i32 1, i32 3, i32 3, i32 5, i32 5, i32 7, i32 7, i32 9, i32 9, i32 11, i32 11, i32 13, i32 13, i32 15, i32 15>689 %cmp = fcmp oeq <16 x float> %mask, zeroinitializer690 %res = select <16 x i1> %cmp, <16 x float> %shuf, <16 x float> %vec2691 ret <16 x float> %res692}693 694define <16 x float> @test_masked_z_16xfloat_dup_high_mask4(<16 x float> %vec, <16 x float> %mask) {695; CHECK-LABEL: test_masked_z_16xfloat_dup_high_mask4:696; CHECK: # %bb.0:697; CHECK-NEXT: vxorps %xmm2, %xmm2, %xmm2698; CHECK-NEXT: vcmpeqps %zmm2, %zmm1, %k1699; CHECK-NEXT: vmovshdup {{.*#+}} zmm0 {%k1} {z} = zmm0[1,1,3,3,5,5,7,7,9,9,11,11,13,13,15,15]700; CHECK-NEXT: retq701 %shuf = shufflevector <16 x float> %vec, <16 x float> undef, <16 x i32> <i32 1, i32 1, i32 3, i32 3, i32 5, i32 5, i32 7, i32 7, i32 9, i32 9, i32 11, i32 11, i32 13, i32 13, i32 15, i32 15>702 %cmp = fcmp oeq <16 x float> %mask, zeroinitializer703 %res = select <16 x i1> %cmp, <16 x float> %shuf, <16 x float> zeroinitializer704 ret <16 x float> %res705}706define <16 x float> @test_16xfloat_dup_high_mem(ptr %vp) {707; CHECK-LABEL: test_16xfloat_dup_high_mem:708; CHECK: # %bb.0:709; CHECK-NEXT: vmovshdup {{.*#+}} zmm0 = mem[1,1,3,3,5,5,7,7,9,9,11,11,13,13,15,15]710; CHECK-NEXT: retq711 %vec = load <16 x float>, ptr %vp712 %res = shufflevector <16 x float> %vec, <16 x float> undef, <16 x i32> <i32 1, i32 1, i32 3, i32 3, i32 5, i32 5, i32 7, i32 7, i32 9, i32 9, i32 11, i32 11, i32 13, i32 13, i32 15, i32 15>713 ret <16 x float> %res714}715define <16 x float> @test_masked_16xfloat_dup_high_mem_mask0(ptr %vp, <16 x float> %vec2, <16 x float> %mask) {716; CHECK-LABEL: test_masked_16xfloat_dup_high_mem_mask0:717; CHECK: # %bb.0:718; CHECK-NEXT: vxorps %xmm2, %xmm2, %xmm2719; CHECK-NEXT: vcmpeqps %zmm2, %zmm1, %k1720; CHECK-NEXT: vmovshdup {{.*#+}} zmm0 {%k1} = mem[1,1,3,3,5,5,7,7,9,9,11,11,13,13,15,15]721; CHECK-NEXT: retq722 %vec = load <16 x float>, ptr %vp723 %shuf = shufflevector <16 x float> %vec, <16 x float> undef, <16 x i32> <i32 1, i32 1, i32 3, i32 3, i32 5, i32 5, i32 7, i32 7, i32 9, i32 9, i32 11, i32 11, i32 13, i32 13, i32 15, i32 15>724 %cmp = fcmp oeq <16 x float> %mask, zeroinitializer725 %res = select <16 x i1> %cmp, <16 x float> %shuf, <16 x float> %vec2726 ret <16 x float> %res727}728 729define <16 x float> @test_masked_z_16xfloat_dup_high_mem_mask0(ptr %vp, <16 x float> %mask) {730; CHECK-LABEL: test_masked_z_16xfloat_dup_high_mem_mask0:731; CHECK: # %bb.0:732; CHECK-NEXT: vxorps %xmm1, %xmm1, %xmm1733; CHECK-NEXT: vcmpeqps %zmm1, %zmm0, %k1734; CHECK-NEXT: vmovshdup {{.*#+}} zmm0 {%k1} {z} = mem[1,1,3,3,5,5,7,7,9,9,11,11,13,13,15,15]735; CHECK-NEXT: retq736 %vec = load <16 x float>, ptr %vp737 %shuf = shufflevector <16 x float> %vec, <16 x float> undef, <16 x i32> <i32 1, i32 1, i32 3, i32 3, i32 5, i32 5, i32 7, i32 7, i32 9, i32 9, i32 11, i32 11, i32 13, i32 13, i32 15, i32 15>738 %cmp = fcmp oeq <16 x float> %mask, zeroinitializer739 %res = select <16 x i1> %cmp, <16 x float> %shuf, <16 x float> zeroinitializer740 ret <16 x float> %res741}742define <16 x float> @test_masked_16xfloat_dup_high_mem_mask1(ptr %vp, <16 x float> %vec2, <16 x float> %mask) {743; CHECK-LABEL: test_masked_16xfloat_dup_high_mem_mask1:744; CHECK: # %bb.0:745; CHECK-NEXT: vxorps %xmm2, %xmm2, %xmm2746; CHECK-NEXT: vcmpeqps %zmm2, %zmm1, %k1747; CHECK-NEXT: vmovshdup {{.*#+}} zmm0 {%k1} = mem[1,1,3,3,5,5,7,7,9,9,11,11,13,13,15,15]748; CHECK-NEXT: retq749 %vec = load <16 x float>, ptr %vp750 %shuf = shufflevector <16 x float> %vec, <16 x float> undef, <16 x i32> <i32 1, i32 1, i32 3, i32 3, i32 5, i32 5, i32 7, i32 7, i32 9, i32 9, i32 11, i32 11, i32 13, i32 13, i32 15, i32 15>751 %cmp = fcmp oeq <16 x float> %mask, zeroinitializer752 %res = select <16 x i1> %cmp, <16 x float> %shuf, <16 x float> %vec2753 ret <16 x float> %res754}755 756define <16 x float> @test_masked_z_16xfloat_dup_high_mem_mask1(ptr %vp, <16 x float> %mask) {757; CHECK-LABEL: test_masked_z_16xfloat_dup_high_mem_mask1:758; CHECK: # %bb.0:759; CHECK-NEXT: vxorps %xmm1, %xmm1, %xmm1760; CHECK-NEXT: vcmpeqps %zmm1, %zmm0, %k1761; CHECK-NEXT: vmovshdup {{.*#+}} zmm0 {%k1} {z} = mem[1,1,3,3,5,5,7,7,9,9,11,11,13,13,15,15]762; CHECK-NEXT: retq763 %vec = load <16 x float>, ptr %vp764 %shuf = shufflevector <16 x float> %vec, <16 x float> undef, <16 x i32> <i32 1, i32 1, i32 3, i32 3, i32 5, i32 5, i32 7, i32 7, i32 9, i32 9, i32 11, i32 11, i32 13, i32 13, i32 15, i32 15>765 %cmp = fcmp oeq <16 x float> %mask, zeroinitializer766 %res = select <16 x i1> %cmp, <16 x float> %shuf, <16 x float> zeroinitializer767 ret <16 x float> %res768}769define <16 x float> @test_masked_16xfloat_dup_high_mem_mask2(ptr %vp, <16 x float> %vec2, <16 x float> %mask) {770; CHECK-LABEL: test_masked_16xfloat_dup_high_mem_mask2:771; CHECK: # %bb.0:772; CHECK-NEXT: vxorps %xmm2, %xmm2, %xmm2773; CHECK-NEXT: vcmpeqps %zmm2, %zmm1, %k1774; CHECK-NEXT: vmovshdup {{.*#+}} zmm0 {%k1} = mem[1,1,3,3,5,5,7,7,9,9,11,11,13,13,15,15]775; CHECK-NEXT: retq776 %vec = load <16 x float>, ptr %vp777 %shuf = shufflevector <16 x float> %vec, <16 x float> undef, <16 x i32> <i32 1, i32 1, i32 3, i32 3, i32 5, i32 5, i32 7, i32 7, i32 9, i32 9, i32 11, i32 11, i32 13, i32 13, i32 15, i32 15>778 %cmp = fcmp oeq <16 x float> %mask, zeroinitializer779 %res = select <16 x i1> %cmp, <16 x float> %shuf, <16 x float> %vec2780 ret <16 x float> %res781}782 783define <16 x float> @test_masked_z_16xfloat_dup_high_mem_mask2(ptr %vp, <16 x float> %mask) {784; CHECK-LABEL: test_masked_z_16xfloat_dup_high_mem_mask2:785; CHECK: # %bb.0:786; CHECK-NEXT: vxorps %xmm1, %xmm1, %xmm1787; CHECK-NEXT: vcmpeqps %zmm1, %zmm0, %k1788; CHECK-NEXT: vmovshdup {{.*#+}} zmm0 {%k1} {z} = mem[1,1,3,3,5,5,7,7,9,9,11,11,13,13,15,15]789; CHECK-NEXT: retq790 %vec = load <16 x float>, ptr %vp791 %shuf = shufflevector <16 x float> %vec, <16 x float> undef, <16 x i32> <i32 1, i32 1, i32 3, i32 3, i32 5, i32 5, i32 7, i32 7, i32 9, i32 9, i32 11, i32 11, i32 13, i32 13, i32 15, i32 15>792 %cmp = fcmp oeq <16 x float> %mask, zeroinitializer793 %res = select <16 x i1> %cmp, <16 x float> %shuf, <16 x float> zeroinitializer794 ret <16 x float> %res795}796define <16 x float> @test_masked_16xfloat_dup_high_mem_mask3(ptr %vp, <16 x float> %vec2, <16 x float> %mask) {797; CHECK-LABEL: test_masked_16xfloat_dup_high_mem_mask3:798; CHECK: # %bb.0:799; CHECK-NEXT: vxorps %xmm2, %xmm2, %xmm2800; CHECK-NEXT: vcmpeqps %zmm2, %zmm1, %k1801; CHECK-NEXT: vmovshdup {{.*#+}} zmm0 {%k1} = mem[1,1,3,3,5,5,7,7,9,9,11,11,13,13,15,15]802; CHECK-NEXT: retq803 %vec = load <16 x float>, ptr %vp804 %shuf = shufflevector <16 x float> %vec, <16 x float> undef, <16 x i32> <i32 1, i32 1, i32 3, i32 3, i32 5, i32 5, i32 7, i32 7, i32 9, i32 9, i32 11, i32 11, i32 13, i32 13, i32 15, i32 15>805 %cmp = fcmp oeq <16 x float> %mask, zeroinitializer806 %res = select <16 x i1> %cmp, <16 x float> %shuf, <16 x float> %vec2807 ret <16 x float> %res808}809 810define <16 x float> @test_masked_z_16xfloat_dup_high_mem_mask3(ptr %vp, <16 x float> %mask) {811; CHECK-LABEL: test_masked_z_16xfloat_dup_high_mem_mask3:812; CHECK: # %bb.0:813; CHECK-NEXT: vxorps %xmm1, %xmm1, %xmm1814; CHECK-NEXT: vcmpeqps %zmm1, %zmm0, %k1815; CHECK-NEXT: vmovshdup {{.*#+}} zmm0 {%k1} {z} = mem[1,1,3,3,5,5,7,7,9,9,11,11,13,13,15,15]816; CHECK-NEXT: retq817 %vec = load <16 x float>, ptr %vp818 %shuf = shufflevector <16 x float> %vec, <16 x float> undef, <16 x i32> <i32 1, i32 1, i32 3, i32 3, i32 5, i32 5, i32 7, i32 7, i32 9, i32 9, i32 11, i32 11, i32 13, i32 13, i32 15, i32 15>819 %cmp = fcmp oeq <16 x float> %mask, zeroinitializer820 %res = select <16 x i1> %cmp, <16 x float> %shuf, <16 x float> zeroinitializer821 ret <16 x float> %res822}823define <16 x float> @test_masked_16xfloat_dup_high_mem_mask4(ptr %vp, <16 x float> %vec2, <16 x float> %mask) {824; CHECK-LABEL: test_masked_16xfloat_dup_high_mem_mask4:825; CHECK: # %bb.0:826; CHECK-NEXT: vxorps %xmm2, %xmm2, %xmm2827; CHECK-NEXT: vcmpeqps %zmm2, %zmm1, %k1828; CHECK-NEXT: vmovshdup {{.*#+}} zmm0 {%k1} = mem[1,1,3,3,5,5,7,7,9,9,11,11,13,13,15,15]829; CHECK-NEXT: retq830 %vec = load <16 x float>, ptr %vp831 %shuf = shufflevector <16 x float> %vec, <16 x float> undef, <16 x i32> <i32 1, i32 1, i32 3, i32 3, i32 5, i32 5, i32 7, i32 7, i32 9, i32 9, i32 11, i32 11, i32 13, i32 13, i32 15, i32 15>832 %cmp = fcmp oeq <16 x float> %mask, zeroinitializer833 %res = select <16 x i1> %cmp, <16 x float> %shuf, <16 x float> %vec2834 ret <16 x float> %res835}836 837define <16 x float> @test_masked_z_16xfloat_dup_high_mem_mask4(ptr %vp, <16 x float> %mask) {838; CHECK-LABEL: test_masked_z_16xfloat_dup_high_mem_mask4:839; CHECK: # %bb.0:840; CHECK-NEXT: vxorps %xmm1, %xmm1, %xmm1841; CHECK-NEXT: vcmpeqps %zmm1, %zmm0, %k1842; CHECK-NEXT: vmovshdup {{.*#+}} zmm0 {%k1} {z} = mem[1,1,3,3,5,5,7,7,9,9,11,11,13,13,15,15]843; CHECK-NEXT: retq844 %vec = load <16 x float>, ptr %vp845 %shuf = shufflevector <16 x float> %vec, <16 x float> undef, <16 x i32> <i32 1, i32 1, i32 3, i32 3, i32 5, i32 5, i32 7, i32 7, i32 9, i32 9, i32 11, i32 11, i32 13, i32 13, i32 15, i32 15>846 %cmp = fcmp oeq <16 x float> %mask, zeroinitializer847 %res = select <16 x i1> %cmp, <16 x float> %shuf, <16 x float> zeroinitializer848 ret <16 x float> %res849}850