380 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,+lsx < %s | FileCheck %s3; RUN: llc --mtriple=loongarch64 --mattr=+lsx < %s | FileCheck %s4 5define void @vavg_b(ptr %res, ptr %a, ptr %b) nounwind {6; CHECK-LABEL: vavg_b:7; CHECK: # %bb.0: # %entry8; CHECK-NEXT: vld $vr0, $a1, 09; CHECK-NEXT: vld $vr1, $a2, 010; CHECK-NEXT: vand.v $vr2, $vr0, $vr111; CHECK-NEXT: vxor.v $vr0, $vr0, $vr112; CHECK-NEXT: vsrai.b $vr0, $vr0, 113; CHECK-NEXT: vadd.b $vr0, $vr2, $vr014; CHECK-NEXT: vst $vr0, $a0, 015; CHECK-NEXT: ret16entry:17 %va = load <16 x i8>, ptr %a18 %vb = load <16 x i8>, ptr %b19 %ea = sext <16 x i8> %va to <16 x i16>20 %eb = sext <16 x i8> %vb to <16 x i16>21 %add = add <16 x i16> %ea, %eb22 %shr = lshr <16 x i16> %add, <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>23 %r = trunc <16 x i16> %shr to <16 x i8>24 store <16 x i8> %r, ptr %res25 ret void26}27 28define void @vavg_h(ptr %res, ptr %a, ptr %b) nounwind {29; CHECK-LABEL: vavg_h:30; CHECK: # %bb.0: # %entry31; CHECK-NEXT: vld $vr0, $a1, 032; CHECK-NEXT: vld $vr1, $a2, 033; CHECK-NEXT: vand.v $vr2, $vr0, $vr134; CHECK-NEXT: vxor.v $vr0, $vr0, $vr135; CHECK-NEXT: vsrai.h $vr0, $vr0, 136; CHECK-NEXT: vadd.h $vr0, $vr2, $vr037; CHECK-NEXT: vst $vr0, $a0, 038; CHECK-NEXT: ret39entry:40 %va = load <8 x i16>, ptr %a41 %vb = load <8 x i16>, ptr %b42 %ea = sext <8 x i16> %va to <8 x i32>43 %eb = sext <8 x i16> %vb to <8 x i32>44 %add = add <8 x i32> %ea, %eb45 %shr = lshr <8 x i32> %add, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>46 %r = trunc <8 x i32> %shr to <8 x i16>47 store <8 x i16> %r, ptr %res48 ret void49}50 51define void @vavg_w(ptr %res, ptr %a, ptr %b) nounwind {52; CHECK-LABEL: vavg_w:53; CHECK: # %bb.0: # %entry54; CHECK-NEXT: vld $vr0, $a1, 055; CHECK-NEXT: vld $vr1, $a2, 056; CHECK-NEXT: vand.v $vr2, $vr0, $vr157; CHECK-NEXT: vxor.v $vr0, $vr0, $vr158; CHECK-NEXT: vsrai.w $vr0, $vr0, 159; CHECK-NEXT: vadd.w $vr0, $vr2, $vr060; CHECK-NEXT: vst $vr0, $a0, 061; CHECK-NEXT: ret62entry:63 %va = load <4 x i32>, ptr %a64 %vb = load <4 x i32>, ptr %b65 %ea = sext <4 x i32> %va to <4 x i64>66 %eb = sext <4 x i32> %vb to <4 x i64>67 %add = add <4 x i64> %ea, %eb68 %shr = lshr <4 x i64> %add, <i64 1, i64 1, i64 1, i64 1>69 %r = trunc <4 x i64> %shr to <4 x i32>70 store <4 x i32> %r, ptr %res71 ret void72}73 74define void @vavg_d(ptr %res, ptr %a, ptr %b) nounwind {75; CHECK-LABEL: vavg_d:76; CHECK: # %bb.0: # %entry77; CHECK-NEXT: vld $vr0, $a1, 078; CHECK-NEXT: vld $vr1, $a2, 079; CHECK-NEXT: vand.v $vr2, $vr0, $vr180; CHECK-NEXT: vxor.v $vr0, $vr0, $vr181; CHECK-NEXT: vsrai.d $vr0, $vr0, 182; CHECK-NEXT: vadd.d $vr0, $vr2, $vr083; CHECK-NEXT: vst $vr0, $a0, 084; CHECK-NEXT: ret85entry:86 %va = load <2 x i64>, ptr %a87 %vb = load <2 x i64>, ptr %b88 %ea = sext <2 x i64> %va to <2 x i128>89 %eb = sext <2 x i64> %vb to <2 x i128>90 %add = add <2 x i128> %ea, %eb91 %shr = lshr <2 x i128> %add, <i128 1, i128 1>92 %r = trunc <2 x i128> %shr to <2 x i64>93 store <2 x i64> %r, ptr %res94 ret void95}96 97define void @vavg_bu(ptr %res, ptr %a, ptr %b) nounwind {98; CHECK-LABEL: vavg_bu:99; CHECK: # %bb.0: # %entry100; CHECK-NEXT: vld $vr0, $a1, 0101; CHECK-NEXT: vld $vr1, $a2, 0102; CHECK-NEXT: vand.v $vr2, $vr0, $vr1103; CHECK-NEXT: vxor.v $vr0, $vr0, $vr1104; CHECK-NEXT: vsrli.b $vr0, $vr0, 1105; CHECK-NEXT: vadd.b $vr0, $vr2, $vr0106; CHECK-NEXT: vst $vr0, $a0, 0107; CHECK-NEXT: ret108entry:109 %va = load <16 x i8>, ptr %a110 %vb = load <16 x i8>, ptr %b111 %ea = zext <16 x i8> %va to <16 x i16>112 %eb = zext <16 x i8> %vb to <16 x i16>113 %add = add <16 x i16> %ea, %eb114 %shr = lshr <16 x i16> %add, <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>115 %r = trunc <16 x i16> %shr to <16 x i8>116 store <16 x i8> %r, ptr %res117 ret void118}119 120define void @vavg_hu(ptr %res, ptr %a, ptr %b) nounwind {121; CHECK-LABEL: vavg_hu:122; CHECK: # %bb.0: # %entry123; CHECK-NEXT: vld $vr0, $a1, 0124; CHECK-NEXT: vld $vr1, $a2, 0125; CHECK-NEXT: vand.v $vr2, $vr0, $vr1126; CHECK-NEXT: vxor.v $vr0, $vr0, $vr1127; CHECK-NEXT: vsrli.h $vr0, $vr0, 1128; CHECK-NEXT: vadd.h $vr0, $vr2, $vr0129; CHECK-NEXT: vst $vr0, $a0, 0130; CHECK-NEXT: ret131entry:132 %va = load <8 x i16>, ptr %a133 %vb = load <8 x i16>, ptr %b134 %ea = zext <8 x i16> %va to <8 x i32>135 %eb = zext <8 x i16> %vb to <8 x i32>136 %add = add <8 x i32> %ea, %eb137 %shr = lshr <8 x i32> %add, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>138 %r = trunc <8 x i32> %shr to <8 x i16>139 store <8 x i16> %r, ptr %res140 ret void141}142 143define void @vavg_wu(ptr %res, ptr %a, ptr %b) nounwind {144; CHECK-LABEL: vavg_wu:145; CHECK: # %bb.0: # %entry146; CHECK-NEXT: vld $vr0, $a1, 0147; CHECK-NEXT: vld $vr1, $a2, 0148; CHECK-NEXT: vand.v $vr2, $vr0, $vr1149; CHECK-NEXT: vxor.v $vr0, $vr0, $vr1150; CHECK-NEXT: vsrli.w $vr0, $vr0, 1151; CHECK-NEXT: vadd.w $vr0, $vr2, $vr0152; CHECK-NEXT: vst $vr0, $a0, 0153; CHECK-NEXT: ret154entry:155 %va = load <4 x i32>, ptr %a156 %vb = load <4 x i32>, ptr %b157 %ea = zext <4 x i32> %va to <4 x i64>158 %eb = zext <4 x i32> %vb to <4 x i64>159 %add = add <4 x i64> %ea, %eb160 %shr = lshr <4 x i64> %add, <i64 1, i64 1, i64 1, i64 1>161 %r = trunc <4 x i64> %shr to <4 x i32>162 store <4 x i32> %r, ptr %res163 ret void164}165 166define void @vavg_du(ptr %res, ptr %a, ptr %b) nounwind {167; CHECK-LABEL: vavg_du:168; CHECK: # %bb.0: # %entry169; CHECK-NEXT: vld $vr0, $a1, 0170; CHECK-NEXT: vld $vr1, $a2, 0171; CHECK-NEXT: vand.v $vr2, $vr0, $vr1172; CHECK-NEXT: vxor.v $vr0, $vr0, $vr1173; CHECK-NEXT: vsrli.d $vr0, $vr0, 1174; CHECK-NEXT: vadd.d $vr0, $vr2, $vr0175; CHECK-NEXT: vst $vr0, $a0, 0176; CHECK-NEXT: ret177entry:178 %va = load <2 x i64>, ptr %a179 %vb = load <2 x i64>, ptr %b180 %ea = zext <2 x i64> %va to <2 x i128>181 %eb = zext <2 x i64> %vb to <2 x i128>182 %add = add <2 x i128> %ea, %eb183 %shr = lshr <2 x i128> %add, <i128 1, i128 1>184 %r = trunc <2 x i128> %shr to <2 x i64>185 store <2 x i64> %r, ptr %res186 ret void187}188 189define void @vavgr_b(ptr %res, ptr %a, ptr %b) nounwind {190; CHECK-LABEL: vavgr_b:191; CHECK: # %bb.0: # %entry192; CHECK-NEXT: vld $vr0, $a1, 0193; CHECK-NEXT: vld $vr1, $a2, 0194; CHECK-NEXT: vor.v $vr2, $vr0, $vr1195; CHECK-NEXT: vxor.v $vr0, $vr0, $vr1196; CHECK-NEXT: vsrai.b $vr0, $vr0, 1197; CHECK-NEXT: vsub.b $vr0, $vr2, $vr0198; CHECK-NEXT: vst $vr0, $a0, 0199; CHECK-NEXT: ret200entry:201 %va = load <16 x i8>, ptr %a202 %vb = load <16 x i8>, ptr %b203 %ea = sext <16 x i8> %va to <16 x i16>204 %eb = sext <16 x i8> %vb to <16 x i16>205 %add = add <16 x i16> %ea, %eb206 %add1 = add <16 x i16> %add, <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>207 %shr = lshr <16 x i16> %add1, <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>208 %r = trunc <16 x i16> %shr to <16 x i8>209 store <16 x i8> %r, ptr %res210 ret void211}212 213define void @vavgr_h(ptr %res, ptr %a, ptr %b) nounwind {214; CHECK-LABEL: vavgr_h:215; CHECK: # %bb.0: # %entry216; CHECK-NEXT: vld $vr0, $a1, 0217; CHECK-NEXT: vld $vr1, $a2, 0218; CHECK-NEXT: vor.v $vr2, $vr0, $vr1219; CHECK-NEXT: vxor.v $vr0, $vr0, $vr1220; CHECK-NEXT: vsrai.h $vr0, $vr0, 1221; CHECK-NEXT: vsub.h $vr0, $vr2, $vr0222; CHECK-NEXT: vst $vr0, $a0, 0223; CHECK-NEXT: ret224entry:225 %va = load <8 x i16>, ptr %a226 %vb = load <8 x i16>, ptr %b227 %ea = sext <8 x i16> %va to <8 x i32>228 %eb = sext <8 x i16> %vb to <8 x i32>229 %add = add <8 x i32> %ea, %eb230 %add1 = add <8 x i32> %add, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>231 %shr = lshr <8 x i32> %add1, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>232 %r = trunc <8 x i32> %shr to <8 x i16>233 store <8 x i16> %r, ptr %res234 ret void235}236 237define void @vavgr_w(ptr %res, ptr %a, ptr %b) nounwind {238; CHECK-LABEL: vavgr_w:239; CHECK: # %bb.0: # %entry240; CHECK-NEXT: vld $vr0, $a1, 0241; CHECK-NEXT: vld $vr1, $a2, 0242; CHECK-NEXT: vor.v $vr2, $vr0, $vr1243; CHECK-NEXT: vxor.v $vr0, $vr0, $vr1244; CHECK-NEXT: vsrai.w $vr0, $vr0, 1245; CHECK-NEXT: vsub.w $vr0, $vr2, $vr0246; CHECK-NEXT: vst $vr0, $a0, 0247; CHECK-NEXT: ret248entry:249 %va = load <4 x i32>, ptr %a250 %vb = load <4 x i32>, ptr %b251 %ea = sext <4 x i32> %va to <4 x i64>252 %eb = sext <4 x i32> %vb to <4 x i64>253 %add = add <4 x i64> %ea, %eb254 %add1 = add <4 x i64> %add, <i64 1, i64 1, i64 1, i64 1>255 %shr = lshr <4 x i64> %add1, <i64 1, i64 1, i64 1, i64 1>256 %r = trunc <4 x i64> %shr to <4 x i32>257 store <4 x i32> %r, ptr %res258 ret void259}260 261define void @vavgr_d(ptr %res, ptr %a, ptr %b) nounwind {262; CHECK-LABEL: vavgr_d:263; CHECK: # %bb.0: # %entry264; CHECK-NEXT: vld $vr0, $a1, 0265; CHECK-NEXT: vld $vr1, $a2, 0266; CHECK-NEXT: vor.v $vr2, $vr0, $vr1267; CHECK-NEXT: vxor.v $vr0, $vr0, $vr1268; CHECK-NEXT: vsrai.d $vr0, $vr0, 1269; CHECK-NEXT: vsub.d $vr0, $vr2, $vr0270; CHECK-NEXT: vst $vr0, $a0, 0271; CHECK-NEXT: ret272entry:273 %va = load <2 x i64>, ptr %a274 %vb = load <2 x i64>, ptr %b275 %ea = sext <2 x i64> %va to <2 x i128>276 %eb = sext <2 x i64> %vb to <2 x i128>277 %add = add <2 x i128> %ea, %eb278 %add1 = add <2 x i128> %add, <i128 1, i128 1>279 %shr = lshr <2 x i128> %add1, <i128 1, i128 1>280 %r = trunc <2 x i128> %shr to <2 x i64>281 store <2 x i64> %r, ptr %res282 ret void283}284 285define void @vavgr_bu(ptr %res, ptr %a, ptr %b) nounwind {286; CHECK-LABEL: vavgr_bu:287; CHECK: # %bb.0: # %entry288; CHECK-NEXT: vld $vr0, $a1, 0289; CHECK-NEXT: vld $vr1, $a2, 0290; CHECK-NEXT: vor.v $vr2, $vr0, $vr1291; CHECK-NEXT: vxor.v $vr0, $vr0, $vr1292; CHECK-NEXT: vsrli.b $vr0, $vr0, 1293; CHECK-NEXT: vsub.b $vr0, $vr2, $vr0294; CHECK-NEXT: vst $vr0, $a0, 0295; CHECK-NEXT: ret296entry:297 %va = load <16 x i8>, ptr %a298 %vb = load <16 x i8>, ptr %b299 %ea = zext <16 x i8> %va to <16 x i16>300 %eb = zext <16 x i8> %vb to <16 x i16>301 %add = add <16 x i16> %ea, %eb302 %add1 = add <16 x i16> %add, <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>303 %shr = lshr <16 x i16> %add1, <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>304 %r = trunc <16 x i16> %shr to <16 x i8>305 store <16 x i8> %r, ptr %res306 ret void307}308 309define void @vavgr_hu(ptr %res, ptr %a, ptr %b) nounwind {310; CHECK-LABEL: vavgr_hu:311; CHECK: # %bb.0: # %entry312; CHECK-NEXT: vld $vr0, $a1, 0313; CHECK-NEXT: vld $vr1, $a2, 0314; CHECK-NEXT: vor.v $vr2, $vr0, $vr1315; CHECK-NEXT: vxor.v $vr0, $vr0, $vr1316; CHECK-NEXT: vsrli.h $vr0, $vr0, 1317; CHECK-NEXT: vsub.h $vr0, $vr2, $vr0318; CHECK-NEXT: vst $vr0, $a0, 0319; CHECK-NEXT: ret320entry:321 %va = load <8 x i16>, ptr %a322 %vb = load <8 x i16>, ptr %b323 %ea = zext <8 x i16> %va to <8 x i32>324 %eb = zext <8 x i16> %vb to <8 x i32>325 %add = add <8 x i32> %ea, %eb326 %add1 = add <8 x i32> %add, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>327 %shr = lshr <8 x i32> %add1, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>328 %r = trunc <8 x i32> %shr to <8 x i16>329 store <8 x i16> %r, ptr %res330 ret void331}332 333define void @vavgr_wu(ptr %res, ptr %a, ptr %b) nounwind {334; CHECK-LABEL: vavgr_wu:335; CHECK: # %bb.0: # %entry336; CHECK-NEXT: vld $vr0, $a1, 0337; CHECK-NEXT: vld $vr1, $a2, 0338; CHECK-NEXT: vor.v $vr2, $vr0, $vr1339; CHECK-NEXT: vxor.v $vr0, $vr0, $vr1340; CHECK-NEXT: vsrli.w $vr0, $vr0, 1341; CHECK-NEXT: vsub.w $vr0, $vr2, $vr0342; CHECK-NEXT: vst $vr0, $a0, 0343; CHECK-NEXT: ret344entry:345 %va = load <4 x i32>, ptr %a346 %vb = load <4 x i32>, ptr %b347 %ea = zext <4 x i32> %va to <4 x i64>348 %eb = zext <4 x i32> %vb to <4 x i64>349 %add = add <4 x i64> %ea, %eb350 %add1 = add <4 x i64> %add, <i64 1, i64 1, i64 1, i64 1>351 %shr = lshr <4 x i64> %add1, <i64 1, i64 1, i64 1, i64 1>352 %r = trunc <4 x i64> %shr to <4 x i32>353 store <4 x i32> %r, ptr %res354 ret void355}356 357define void @vavgr_du(ptr %res, ptr %a, ptr %b) nounwind {358; CHECK-LABEL: vavgr_du:359; CHECK: # %bb.0: # %entry360; CHECK-NEXT: vld $vr0, $a1, 0361; CHECK-NEXT: vld $vr1, $a2, 0362; CHECK-NEXT: vor.v $vr2, $vr0, $vr1363; CHECK-NEXT: vxor.v $vr0, $vr0, $vr1364; CHECK-NEXT: vsrli.d $vr0, $vr0, 1365; CHECK-NEXT: vsub.d $vr0, $vr2, $vr0366; CHECK-NEXT: vst $vr0, $a0, 0367; CHECK-NEXT: ret368entry:369 %va = load <2 x i64>, ptr %a370 %vb = load <2 x i64>, ptr %b371 %ea = zext <2 x i64> %va to <2 x i128>372 %eb = zext <2 x i64> %vb to <2 x i128>373 %add = add <2 x i128> %ea, %eb374 %add1 = add <2 x i128> %add, <i128 1, i128 1>375 %shr = lshr <2 x i128> %add1, <i128 1, i128 1>376 %r = trunc <2 x i128> %shr to <2 x i64>377 store <2 x i64> %r, ptr %res378 ret void379}380