brintos

brintos / llvm-project-archived public Read only

0
0
Text · 12.7 KiB · bb4df64 Raw
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