482 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 62; RUN: llc --mtriple=loongarch32 --mattr=+32s,+lasx < %s | FileCheck %s --check-prefixes=CHECK,LA323; RUN: llc --mtriple=loongarch64 --mattr=+lasx < %s | FileCheck %s --check-prefixes=CHECK,LA644 5define void @and_not_combine_v32i8(ptr %res, ptr %a0, ptr %a1, ptr %a2) nounwind {6; CHECK-LABEL: and_not_combine_v32i8:7; CHECK: # %bb.0: # %entry8; CHECK-NEXT: xvld $xr0, $a2, 09; CHECK-NEXT: xvld $xr1, $a3, 010; CHECK-NEXT: xvld $xr2, $a1, 011; CHECK-NEXT: xvsub.b $xr0, $xr0, $xr112; CHECK-NEXT: xvandn.v $xr0, $xr0, $xr213; CHECK-NEXT: xvst $xr0, $a0, 014; CHECK-NEXT: ret15entry:16 %v0 = load <32 x i8>, ptr %a017 %v1 = load <32 x i8>, ptr %a118 %v2 = load <32 x i8>, ptr %a219 %not = xor <32 x i8> %v1, <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1>20 %add = add <32 x i8> %not, %v221 %and = and <32 x i8> %v0, %add22 store <32 x i8> %and, ptr %res23 ret void24}25 26define void @and_not_combine_v16i16(ptr %res, ptr %a0, ptr %a1, ptr %a2) nounwind {27; CHECK-LABEL: and_not_combine_v16i16:28; CHECK: # %bb.0: # %entry29; CHECK-NEXT: xvld $xr0, $a2, 030; CHECK-NEXT: xvld $xr1, $a3, 031; CHECK-NEXT: xvld $xr2, $a1, 032; CHECK-NEXT: xvsub.h $xr0, $xr0, $xr133; CHECK-NEXT: xvandn.v $xr0, $xr0, $xr234; CHECK-NEXT: xvst $xr0, $a0, 035; CHECK-NEXT: ret36entry:37 %v0 = load <16 x i16>, ptr %a038 %v1 = load <16 x i16>, ptr %a139 %v2 = load <16 x i16>, ptr %a240 %not = xor <16 x i16> %v1, <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>41 %add = add <16 x i16> %not, %v242 %and = and <16 x i16> %v0, %add43 store <16 x i16> %and, ptr %res44 ret void45}46 47define void @and_not_combine_v8i32(ptr %res, ptr %a0, ptr %a1, ptr %a2) nounwind {48; CHECK-LABEL: and_not_combine_v8i32:49; CHECK: # %bb.0: # %entry50; CHECK-NEXT: xvld $xr0, $a2, 051; CHECK-NEXT: xvld $xr1, $a3, 052; CHECK-NEXT: xvld $xr2, $a1, 053; CHECK-NEXT: xvsub.w $xr0, $xr0, $xr154; CHECK-NEXT: xvandn.v $xr0, $xr0, $xr255; CHECK-NEXT: xvst $xr0, $a0, 056; CHECK-NEXT: ret57entry:58 %v0 = load <8 x i32>, ptr %a059 %v1 = load <8 x i32>, ptr %a160 %v2 = load <8 x i32>, ptr %a261 %not = xor <8 x i32> %v1, <i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1>62 %add = add <8 x i32> %not, %v263 %and = and <8 x i32> %v0, %add64 store <8 x i32> %and, ptr %res65 ret void66}67 68define void @and_not_combine_v4i64(ptr %res, ptr %a0, ptr %a1, ptr %a2) nounwind {69; CHECK-LABEL: and_not_combine_v4i64:70; CHECK: # %bb.0: # %entry71; CHECK-NEXT: xvld $xr0, $a2, 072; CHECK-NEXT: xvld $xr1, $a3, 073; CHECK-NEXT: xvld $xr2, $a1, 074; CHECK-NEXT: xvsub.d $xr0, $xr0, $xr175; CHECK-NEXT: xvandn.v $xr0, $xr0, $xr276; CHECK-NEXT: xvst $xr0, $a0, 077; CHECK-NEXT: ret78entry:79 %v0 = load <4 x i64>, ptr %a080 %v1 = load <4 x i64>, ptr %a181 %v2 = load <4 x i64>, ptr %a282 %not = xor <4 x i64> %v1, <i64 -1, i64 -1, i64 -1, i64 -1>83 %add = add <4 x i64> %not, %v284 %and = and <4 x i64> %v0, %add85 store <4 x i64> %and, ptr %res86 ret void87}88 89define void @pre_not_and_not_combine_v32i8(ptr %res, ptr %a, i8 %b) nounwind {90; CHECK-LABEL: pre_not_and_not_combine_v32i8:91; CHECK: # %bb.0:92; CHECK-NEXT: xvld $xr0, $a1, 093; CHECK-NEXT: xvreplgr2vr.b $xr1, $a294; CHECK-NEXT: xvnor.v $xr0, $xr0, $xr195; CHECK-NEXT: xvst $xr0, $a0, 096; CHECK-NEXT: ret97 %v0 = load <32 x i8>, ptr %a98 %b.not = xor i8 %b, -199 %b.not.ele = insertelement <32 x i8> poison, i8 %b.not, i64 0100 %v1.not = shufflevector <32 x i8> %b.not.ele, <32 x i8> poison, <32 x i32> zeroinitializer101 %v0.not = xor <32 x i8> %v0, splat (i8 -1)102 %and = and <32 x i8> %v0.not, %v1.not103 store <32 x i8> %and, ptr %res104 ret void105}106 107define void @post_not_and_not_combine_v32i8(ptr %res, ptr %a, i8 %b) nounwind {108; CHECK-LABEL: post_not_and_not_combine_v32i8:109; CHECK: # %bb.0:110; CHECK-NEXT: xvld $xr0, $a1, 0111; CHECK-NEXT: xvreplgr2vr.b $xr1, $a2112; CHECK-NEXT: xvnor.v $xr0, $xr0, $xr1113; CHECK-NEXT: xvst $xr0, $a0, 0114; CHECK-NEXT: ret115 %v0 = load <32 x i8>, ptr %a116 %b.ele = insertelement <32 x i8> poison, i8 %b, i64 0117 %v1 = shufflevector <32 x i8> %b.ele, <32 x i8> poison, <32 x i32> zeroinitializer118 %v0.not = xor <32 x i8> %v0, splat (i8 -1)119 %v1.not = xor <32 x i8> %v1, splat (i8 -1)120 %and = and <32 x i8> %v0.not, %v1.not121 store <32 x i8> %and, ptr %res122 ret void123}124 125define void @pre_not_and_not_combine_v16i16(ptr %res, ptr %a, i16 %b) nounwind {126; CHECK-LABEL: pre_not_and_not_combine_v16i16:127; CHECK: # %bb.0:128; CHECK-NEXT: xvld $xr0, $a1, 0129; CHECK-NEXT: xvreplgr2vr.h $xr1, $a2130; CHECK-NEXT: xvnor.v $xr0, $xr0, $xr1131; CHECK-NEXT: xvst $xr0, $a0, 0132; CHECK-NEXT: ret133 %v0 = load <16 x i16>, ptr %a134 %b.not = xor i16 %b, -1135 %b.not.ele = insertelement <16 x i16> poison, i16 %b.not, i64 0136 %v1.not = shufflevector <16 x i16> %b.not.ele, <16 x i16> poison, <16 x i32> zeroinitializer137 %v0.not = xor <16 x i16> %v0, splat (i16 -1)138 %and = and <16 x i16> %v0.not, %v1.not139 store <16 x i16> %and, ptr %res140 ret void141}142 143define void @post_not_and_not_combine_v16i16(ptr %res, ptr %a, i16 %b) nounwind {144; CHECK-LABEL: post_not_and_not_combine_v16i16:145; CHECK: # %bb.0:146; CHECK-NEXT: xvld $xr0, $a1, 0147; CHECK-NEXT: xvreplgr2vr.h $xr1, $a2148; CHECK-NEXT: xvnor.v $xr0, $xr0, $xr1149; CHECK-NEXT: xvst $xr0, $a0, 0150; CHECK-NEXT: ret151 %v0 = load <16 x i16>, ptr %a152 %b.ele = insertelement <16 x i16> poison, i16 %b, i64 0153 %v1 = shufflevector <16 x i16> %b.ele, <16 x i16> poison, <16 x i32> zeroinitializer154 %v0.not = xor <16 x i16> %v0, splat (i16 -1)155 %v1.not = xor <16 x i16> %v1, splat (i16 -1)156 %and = and <16 x i16> %v0.not, %v1.not157 store <16 x i16> %and, ptr %res158 ret void159}160 161define void @pre_not_and_not_combine_v8i32(ptr %res, ptr %a, i32 %b) nounwind {162; CHECK-LABEL: pre_not_and_not_combine_v8i32:163; CHECK: # %bb.0:164; CHECK-NEXT: xvld $xr0, $a1, 0165; CHECK-NEXT: xvreplgr2vr.w $xr1, $a2166; CHECK-NEXT: xvnor.v $xr0, $xr0, $xr1167; CHECK-NEXT: xvst $xr0, $a0, 0168; CHECK-NEXT: ret169 %v0 = load <8 x i32>, ptr %a170 %b.not = xor i32 %b, -1171 %b.not.ele = insertelement <8 x i32> poison, i32 %b.not, i64 0172 %v1.not = shufflevector <8 x i32> %b.not.ele, <8 x i32> poison, <8 x i32> zeroinitializer173 %v0.not = xor <8 x i32> %v0, splat (i32 -1)174 %and = and <8 x i32> %v0.not, %v1.not175 store <8 x i32> %and, ptr %res176 ret void177}178 179define void @post_not_and_not_combine_v8i32(ptr %res, ptr %a, i32 %b) nounwind {180; CHECK-LABEL: post_not_and_not_combine_v8i32:181; CHECK: # %bb.0:182; CHECK-NEXT: xvld $xr0, $a1, 0183; CHECK-NEXT: xvreplgr2vr.w $xr1, $a2184; CHECK-NEXT: xvnor.v $xr0, $xr0, $xr1185; CHECK-NEXT: xvst $xr0, $a0, 0186; CHECK-NEXT: ret187 %v0 = load <8 x i32>, ptr %a188 %b.ele = insertelement <8 x i32> poison, i32 %b, i64 0189 %v1 = shufflevector <8 x i32> %b.ele, <8 x i32> poison, <8 x i32> zeroinitializer190 %v0.not = xor <8 x i32> %v0, splat (i32 -1)191 %v1.not = xor <8 x i32> %v1, splat (i32 -1)192 %and = and <8 x i32> %v0.not, %v1.not193 store <8 x i32> %and, ptr %res194 ret void195}196 197define void @pre_not_and_not_combine_v4i64(ptr %res, ptr %a, i64 %b) nounwind {198; LA32-LABEL: pre_not_and_not_combine_v4i64:199; LA32: # %bb.0:200; LA32-NEXT: xvld $xr0, $a1, 0201; LA32-NEXT: nor $a1, $a3, $zero202; LA32-NEXT: nor $a2, $a2, $zero203; LA32-NEXT: vinsgr2vr.w $vr1, $a2, 0204; LA32-NEXT: vinsgr2vr.w $vr1, $a1, 1205; LA32-NEXT: xvreplve0.d $xr1, $xr1206; LA32-NEXT: xvandn.v $xr0, $xr0, $xr1207; LA32-NEXT: xvst $xr0, $a0, 0208; LA32-NEXT: ret209;210; LA64-LABEL: pre_not_and_not_combine_v4i64:211; LA64: # %bb.0:212; LA64-NEXT: xvld $xr0, $a1, 0213; LA64-NEXT: xvreplgr2vr.d $xr1, $a2214; LA64-NEXT: xvnor.v $xr0, $xr0, $xr1215; LA64-NEXT: xvst $xr0, $a0, 0216; LA64-NEXT: ret217 %v0 = load <4 x i64>, ptr %a218 %b.not = xor i64 %b, -1219 %b.not.ele = insertelement <4 x i64> poison, i64 %b.not, i64 0220 %v1.not = shufflevector <4 x i64> %b.not.ele, <4 x i64> poison, <4 x i32> zeroinitializer221 %v0.not = xor <4 x i64> %v0, splat (i64 -1)222 %and = and <4 x i64> %v0.not, %v1.not223 store <4 x i64> %and, ptr %res224 ret void225}226 227define void @post_not_and_not_combine_v4i64(ptr %res, ptr %a, i64 %b) nounwind {228; LA32-LABEL: post_not_and_not_combine_v4i64:229; LA32: # %bb.0:230; LA32-NEXT: xvld $xr0, $a1, 0231; LA32-NEXT: vinsgr2vr.w $vr1, $a2, 0232; LA32-NEXT: vinsgr2vr.w $vr1, $a3, 1233; LA32-NEXT: xvreplve0.d $xr1, $xr1234; LA32-NEXT: xvnor.v $xr0, $xr0, $xr1235; LA32-NEXT: xvst $xr0, $a0, 0236; LA32-NEXT: ret237;238; LA64-LABEL: post_not_and_not_combine_v4i64:239; LA64: # %bb.0:240; LA64-NEXT: xvld $xr0, $a1, 0241; LA64-NEXT: xvreplgr2vr.d $xr1, $a2242; LA64-NEXT: xvnor.v $xr0, $xr0, $xr1243; LA64-NEXT: xvst $xr0, $a0, 0244; LA64-NEXT: ret245 %v0 = load <4 x i64>, ptr %a246 %b.ele = insertelement <4 x i64> poison, i64 %b, i64 0247 %v1 = shufflevector <4 x i64> %b.ele, <4 x i64> poison, <4 x i32> zeroinitializer248 %v0.not = xor <4 x i64> %v0, splat (i64 -1)249 %v1.not = xor <4 x i64> %v1, splat (i64 -1)250 %and = and <4 x i64> %v0.not, %v1.not251 store <4 x i64> %and, ptr %res252 ret void253}254 255define void @and_not_combine_splatimm_v32i8(ptr %res, ptr %a0) nounwind {256; CHECK-LABEL: and_not_combine_splatimm_v32i8:257; CHECK: # %bb.0:258; CHECK-NEXT: xvld $xr0, $a1, 0259; CHECK-NEXT: xvnori.b $xr0, $xr0, 3260; CHECK-NEXT: xvst $xr0, $a0, 0261; CHECK-NEXT: ret262 %v0 = load <32 x i8>, ptr %a0263 %and = and <32 x i8> %v0, splat (i8 -4)264 %xor = xor <32 x i8> %and, splat (i8 -4)265 store <32 x i8> %xor, ptr %res266 ret void267}268 269define void @and_not_combine_splatimm_v16i16(ptr %res, ptr %a0) nounwind {270; CHECK-LABEL: and_not_combine_splatimm_v16i16:271; CHECK: # %bb.0:272; CHECK-NEXT: xvld $xr0, $a1, 0273; CHECK-NEXT: xvrepli.h $xr1, -4274; CHECK-NEXT: xvandn.v $xr0, $xr0, $xr1275; CHECK-NEXT: xvst $xr0, $a0, 0276; CHECK-NEXT: ret277 %v0 = load <16 x i16>, ptr %a0278 %and = and <16 x i16> %v0, splat (i16 -4)279 %xor = xor <16 x i16> %and, splat (i16 -4)280 store <16 x i16> %xor, ptr %res281 ret void282}283 284define void @and_not_combine_splatimm_v8i32(ptr %res, ptr %a0) nounwind {285; CHECK-LABEL: and_not_combine_splatimm_v8i32:286; CHECK: # %bb.0:287; CHECK-NEXT: xvld $xr0, $a1, 0288; CHECK-NEXT: xvrepli.w $xr1, -4289; CHECK-NEXT: xvandn.v $xr0, $xr0, $xr1290; CHECK-NEXT: xvst $xr0, $a0, 0291; CHECK-NEXT: ret292 %v0 = load <8 x i32>, ptr %a0293 %and = and <8 x i32> %v0, splat (i32 -4)294 %xor = xor <8 x i32> %and, splat (i32 -4)295 store <8 x i32> %xor, ptr %res296 ret void297}298 299define void @and_not_combine_splatimm_v4i64(ptr %res, ptr %a0) nounwind {300; CHECK-LABEL: and_not_combine_splatimm_v4i64:301; CHECK: # %bb.0:302; CHECK-NEXT: xvld $xr0, $a1, 0303; CHECK-NEXT: xvrepli.d $xr1, -4304; CHECK-NEXT: xvandn.v $xr0, $xr0, $xr1305; CHECK-NEXT: xvst $xr0, $a0, 0306; CHECK-NEXT: ret307 %v0 = load <4 x i64>, ptr %a0308 %and = and <4 x i64> %v0, splat (i64 -4)309 %xor = xor <4 x i64> %and, splat (i64 -4)310 store <4 x i64> %xor, ptr %res311 ret void312}313 314define void @and_or_not_combine_v32i8(ptr %pa, ptr %pb, ptr %pv, ptr %dst) nounwind {315; CHECK-LABEL: and_or_not_combine_v32i8:316; CHECK: # %bb.0:317; CHECK-NEXT: xvld $xr0, $a0, 0318; CHECK-NEXT: xvld $xr1, $a2, 0319; CHECK-NEXT: xvld $xr2, $a1, 0320; CHECK-NEXT: xvseq.b $xr0, $xr1, $xr0321; CHECK-NEXT: xvseq.b $xr1, $xr1, $xr2322; CHECK-NEXT: xvand.v $xr0, $xr0, $xr1323; CHECK-NEXT: xvnori.b $xr0, $xr0, 251324; CHECK-NEXT: xvst $xr0, $a3, 0325; CHECK-NEXT: ret326 %a = load <32 x i8>, ptr %pa327 %b = load <32 x i8>, ptr %pb328 %v = load <32 x i8>, ptr %pv329 %ca = icmp ne <32 x i8> %v, %a330 %cb = icmp ne <32 x i8> %v, %b331 %or = or <32 x i1> %ca, %cb332 %ext = sext <32 x i1> %or to <32 x i8>333 %and = and <32 x i8> %ext, splat (i8 4)334 store <32 x i8> %and, ptr %dst335 ret void336}337 338define void @and_or_not_combine_v16i16(ptr %pa, ptr %pb, ptr %pv, ptr %dst) nounwind {339; CHECK-LABEL: and_or_not_combine_v16i16:340; CHECK: # %bb.0:341; CHECK-NEXT: xvld $xr0, $a0, 0342; CHECK-NEXT: xvld $xr1, $a2, 0343; CHECK-NEXT: xvld $xr2, $a1, 0344; CHECK-NEXT: xvseq.h $xr0, $xr1, $xr0345; CHECK-NEXT: xvseq.h $xr1, $xr1, $xr2346; CHECK-NEXT: xvand.v $xr0, $xr0, $xr1347; CHECK-NEXT: xvrepli.h $xr1, 4348; CHECK-NEXT: xvandn.v $xr0, $xr0, $xr1349; CHECK-NEXT: xvst $xr0, $a3, 0350; CHECK-NEXT: ret351 %a = load <16 x i16>, ptr %pa352 %b = load <16 x i16>, ptr %pb353 %v = load <16 x i16>, ptr %pv354 %ca = icmp ne <16 x i16> %v, %a355 %cb = icmp ne <16 x i16> %v, %b356 %or = or <16 x i1> %ca, %cb357 %ext = sext <16 x i1> %or to <16 x i16>358 %and = and <16 x i16> %ext, splat (i16 4)359 store <16 x i16> %and, ptr %dst360 ret void361}362 363define void @and_or_not_combine_v8i32(ptr %pa, ptr %pb, ptr %pv, ptr %dst) nounwind {364; CHECK-LABEL: and_or_not_combine_v8i32:365; CHECK: # %bb.0:366; CHECK-NEXT: xvld $xr0, $a0, 0367; CHECK-NEXT: xvld $xr1, $a2, 0368; CHECK-NEXT: xvld $xr2, $a1, 0369; CHECK-NEXT: xvseq.w $xr0, $xr1, $xr0370; CHECK-NEXT: xvseq.w $xr1, $xr1, $xr2371; CHECK-NEXT: xvand.v $xr0, $xr0, $xr1372; CHECK-NEXT: xvrepli.w $xr1, 4373; CHECK-NEXT: xvandn.v $xr0, $xr0, $xr1374; CHECK-NEXT: xvst $xr0, $a3, 0375; CHECK-NEXT: ret376 %a = load <8 x i32>, ptr %pa377 %b = load <8 x i32>, ptr %pb378 %v = load <8 x i32>, ptr %pv379 %ca = icmp ne <8 x i32> %v, %a380 %cb = icmp ne <8 x i32> %v, %b381 %or = or <8 x i1> %ca, %cb382 %ext = sext <8 x i1> %or to <8 x i32>383 %and = and <8 x i32> %ext, splat (i32 4)384 store <8 x i32> %and, ptr %dst385 ret void386}387 388define void @and_or_not_combine_v4i64(ptr %pa, ptr %pb, ptr %pv, ptr %dst) nounwind {389; CHECK-LABEL: and_or_not_combine_v4i64:390; CHECK: # %bb.0:391; CHECK-NEXT: xvld $xr0, $a0, 0392; CHECK-NEXT: xvld $xr1, $a2, 0393; CHECK-NEXT: xvld $xr2, $a1, 0394; CHECK-NEXT: xvseq.d $xr0, $xr1, $xr0395; CHECK-NEXT: xvseq.d $xr1, $xr1, $xr2396; CHECK-NEXT: xvand.v $xr0, $xr0, $xr1397; CHECK-NEXT: xvrepli.d $xr1, 4398; CHECK-NEXT: xvandn.v $xr0, $xr0, $xr1399; CHECK-NEXT: xvst $xr0, $a3, 0400; CHECK-NEXT: ret401 %a = load <4 x i64>, ptr %pa402 %b = load <4 x i64>, ptr %pb403 %v = load <4 x i64>, ptr %pv404 %ca = icmp ne <4 x i64> %v, %a405 %cb = icmp ne <4 x i64> %v, %b406 %or = or <4 x i1> %ca, %cb407 %ext = sext <4 x i1> %or to <4 x i64>408 %and = and <4 x i64> %ext, splat (i64 4)409 store <4 x i64> %and, ptr %dst410 ret void411}412 413define void @and_extract_subvector_not_combine_v32i8(ptr %pa, ptr %dst) nounwind {414; CHECK-LABEL: and_extract_subvector_not_combine_v32i8:415; CHECK: # %bb.0:416; CHECK-NEXT: xvld $xr0, $a0, 0417; CHECK-NEXT: xvpermi.q $xr0, $xr0, 1418; CHECK-NEXT: vnori.b $vr0, $vr0, 251419; CHECK-NEXT: vst $vr0, $a1, 0420; CHECK-NEXT: ret421 %a = load volatile <32 x i8>, ptr %pa422 %a.not = xor <32 x i8> %a, splat (i8 -1)423 %subv = shufflevector <32 x i8> %a.not, <32 x i8> poison,424 <16 x i32> <i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23,425 i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31>426 %and = and <16 x i8> %subv, splat (i8 4)427 store <16 x i8> %and, ptr %dst428 ret void429}430 431define void @and_extract_subvector_not_combine_v16i16(ptr %pa, ptr %dst) nounwind {432; CHECK-LABEL: and_extract_subvector_not_combine_v16i16:433; CHECK: # %bb.0:434; CHECK-NEXT: xvld $xr0, $a0, 0435; CHECK-NEXT: xvpermi.q $xr0, $xr0, 1436; CHECK-NEXT: vrepli.h $vr1, 4437; CHECK-NEXT: vandn.v $vr0, $vr0, $vr1438; CHECK-NEXT: vst $vr0, $a1, 0439; CHECK-NEXT: ret440 %a = load volatile <16 x i16>, ptr %pa441 %a.not = xor <16 x i16> %a, splat (i16 -1)442 %subv = shufflevector <16 x i16> %a.not, <16 x i16> poison,443 <8 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>444 %and = and <8 x i16> %subv, splat (i16 4)445 store <8 x i16> %and, ptr %dst446 ret void447}448 449define void @and_extract_subvector_not_combine_v8i32(ptr %pa, ptr %dst) nounwind {450; CHECK-LABEL: and_extract_subvector_not_combine_v8i32:451; CHECK: # %bb.0:452; CHECK-NEXT: xvld $xr0, $a0, 0453; CHECK-NEXT: xvpermi.q $xr0, $xr0, 1454; CHECK-NEXT: vrepli.w $vr1, 4455; CHECK-NEXT: vandn.v $vr0, $vr0, $vr1456; CHECK-NEXT: vst $vr0, $a1, 0457; CHECK-NEXT: ret458 %a = load volatile <8 x i32>, ptr %pa459 %a.not = xor <8 x i32> %a, splat (i32 -1)460 %subv = shufflevector <8 x i32> %a.not, <8 x i32> poison, <4 x i32> <i32 4, i32 5, i32 6, i32 7>461 %and = and <4 x i32> %subv, splat (i32 4)462 store <4 x i32> %and, ptr %dst463 ret void464}465 466define void @and_extract_subvector_not_combine_v4i64(ptr %pa, ptr %dst) nounwind {467; CHECK-LABEL: and_extract_subvector_not_combine_v4i64:468; CHECK: # %bb.0:469; CHECK-NEXT: xvld $xr0, $a0, 0470; CHECK-NEXT: xvpermi.q $xr0, $xr0, 1471; CHECK-NEXT: vrepli.d $vr1, 4472; CHECK-NEXT: vandn.v $vr0, $vr0, $vr1473; CHECK-NEXT: vst $vr0, $a1, 0474; CHECK-NEXT: ret475 %a = load volatile <4 x i64>, ptr %pa476 %a.not = xor <4 x i64> %a, splat (i64 -1)477 %subv = shufflevector <4 x i64> %a.not, <4 x i64> poison, <2 x i32> <i32 2, i32 3>478 %and = and <2 x i64> %subv, splat (i64 4)479 store <2 x i64> %and, ptr %dst480 ret void481}482