304 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc --mtriple=loongarch32 --mattr=+32s,+lasx < %s | FileCheck %s3; RUN: llc --mtriple=loongarch64 --mattr=+lasx < %s | FileCheck %s4 5declare <8 x float> @llvm.loongarch.lasx.cast.128.s(<4 x float>)6 7define void @lasx_cast_128_s(ptr %vd, ptr %va) {8; CHECK-LABEL: lasx_cast_128_s:9; CHECK: # %bb.0: # %entry10; CHECK-NEXT: vld $vr0, $a1, 011; CHECK-NEXT: xvst $xr0, $a0, 012; CHECK-NEXT: ret13entry:14 %a = load <4 x float>, ptr %va15 %b = call <8 x float> @llvm.loongarch.lasx.cast.128.s(<4 x float> %a)16 store <8 x float> %b, ptr %vd17 ret void18}19 20declare <4 x double> @llvm.loongarch.lasx.cast.128.d(<2 x double>)21 22define void @lasx_cast_128_d(ptr %vd, ptr %va) {23; CHECK-LABEL: lasx_cast_128_d:24; CHECK: # %bb.0: # %entry25; CHECK-NEXT: vld $vr0, $a1, 026; CHECK-NEXT: xvst $xr0, $a0, 027; CHECK-NEXT: ret28entry:29 %a = load <2 x double>, ptr %va30 %b = call <4 x double> @llvm.loongarch.lasx.cast.128.d(<2 x double> %a)31 store <4 x double> %b, ptr %vd32 ret void33}34 35declare <4 x i64> @llvm.loongarch.lasx.cast.128(<2 x i64>)36 37define void @lasx_cast_128(ptr %vd, ptr %va) {38; CHECK-LABEL: lasx_cast_128:39; CHECK: # %bb.0: # %entry40; CHECK-NEXT: vld $vr0, $a1, 041; CHECK-NEXT: xvst $xr0, $a0, 042; CHECK-NEXT: ret43entry:44 %a = load <2 x i64>, ptr %va45 %b = call <4 x i64> @llvm.loongarch.lasx.cast.128(<2 x i64> %a)46 store <4 x i64> %b, ptr %vd47 ret void48}49 50declare <8 x float> @llvm.loongarch.lasx.concat.128.s(<4 x float>, <4 x float>)51 52define void @lasx_concat_128_s(ptr %vd, ptr %va, ptr %vb) {53; CHECK-LABEL: lasx_concat_128_s:54; CHECK: # %bb.0: # %entry55; CHECK-NEXT: vld $vr0, $a1, 056; CHECK-NEXT: vld $vr1, $a2, 057; CHECK-NEXT: xvpermi.q $xr0, $xr1, 258; CHECK-NEXT: xvst $xr0, $a0, 059; CHECK-NEXT: ret60entry:61 %a = load <4 x float>, ptr %va62 %b = load <4 x float>, ptr %vb63 %c = call <8 x float> @llvm.loongarch.lasx.concat.128.s(<4 x float> %a, <4 x float> %b)64 store <8 x float> %c, ptr %vd65 ret void66}67 68declare <4 x double> @llvm.loongarch.lasx.concat.128.d(<2 x double>, <2 x double>)69 70define void @lasx_concat_128_d(ptr %vd, ptr %va, ptr %vb) {71; CHECK-LABEL: lasx_concat_128_d:72; CHECK: # %bb.0: # %entry73; CHECK-NEXT: vld $vr0, $a1, 074; CHECK-NEXT: vld $vr1, $a2, 075; CHECK-NEXT: xvpermi.q $xr0, $xr1, 276; CHECK-NEXT: xvst $xr0, $a0, 077; CHECK-NEXT: ret78entry:79 %a = load <2 x double>, ptr %va80 %b = load <2 x double>, ptr %vb81 %c = call <4 x double> @llvm.loongarch.lasx.concat.128.d(<2 x double> %a, <2 x double> %b)82 store <4 x double> %c, ptr %vd83 ret void84}85 86declare <4 x i64> @llvm.loongarch.lasx.concat.128(<2 x i64>, <2 x i64>)87 88define void @lasx_concat_128(ptr %vd, ptr %va, ptr %vb) {89; CHECK-LABEL: lasx_concat_128:90; CHECK: # %bb.0: # %entry91; CHECK-NEXT: vld $vr0, $a1, 092; CHECK-NEXT: vld $vr1, $a2, 093; CHECK-NEXT: xvpermi.q $xr0, $xr1, 294; CHECK-NEXT: xvst $xr0, $a0, 095; CHECK-NEXT: ret96entry:97 %a = load <2 x i64>, ptr %va98 %b = load <2 x i64>, ptr %vb99 %c = call <4 x i64> @llvm.loongarch.lasx.concat.128(<2 x i64> %a, <2 x i64> %b)100 store <4 x i64> %c, ptr %vd101 ret void102}103 104declare <4 x float> @llvm.loongarch.lasx.extract.128.lo.s(<8 x float>)105 106define void @lasx_extract_128_lo_s(ptr %vd, ptr %va) {107; CHECK-LABEL: lasx_extract_128_lo_s:108; CHECK: # %bb.0: # %entry109; CHECK-NEXT: xvld $xr0, $a1, 0110; CHECK-NEXT: vst $vr0, $a0, 0111; CHECK-NEXT: ret112entry:113 %a = load <8 x float>, ptr %va114 %c = call <4 x float> @llvm.loongarch.lasx.extract.128.lo.s(<8 x float> %a)115 store <4 x float> %c, ptr %vd116 ret void117}118 119declare <2 x double> @llvm.loongarch.lasx.extract.128.lo.d(<4 x double>)120 121define void @lasx_extract_128_lo_d(ptr %vd, ptr %va) {122; CHECK-LABEL: lasx_extract_128_lo_d:123; CHECK: # %bb.0: # %entry124; CHECK-NEXT: xvld $xr0, $a1, 0125; CHECK-NEXT: vst $vr0, $a0, 0126; CHECK-NEXT: ret127entry:128 %a = load <4 x double>, ptr %va129 %c = call <2 x double> @llvm.loongarch.lasx.extract.128.lo.d(<4 x double> %a)130 store <2 x double> %c, ptr %vd131 ret void132}133 134declare <2 x i64> @llvm.loongarch.lasx.extract.128.lo(<4 x i64>)135 136define void @lasx_extract_128_lo(ptr %vd, ptr %va) {137; CHECK-LABEL: lasx_extract_128_lo:138; CHECK: # %bb.0: # %entry139; CHECK-NEXT: xvld $xr0, $a1, 0140; CHECK-NEXT: vst $vr0, $a0, 0141; CHECK-NEXT: ret142entry:143 %a = load <4 x i64>, ptr %va144 %c = call <2 x i64> @llvm.loongarch.lasx.extract.128.lo(<4 x i64> %a)145 store <2 x i64> %c, ptr %vd146 ret void147}148 149declare <4 x float> @llvm.loongarch.lasx.extract.128.hi.s(<8 x float>)150 151define void @lasx_extract_128_hi_s(ptr %vd, ptr %va) {152; CHECK-LABEL: lasx_extract_128_hi_s:153; CHECK: # %bb.0: # %entry154; CHECK-NEXT: xvld $xr0, $a1, 0155; CHECK-NEXT: xvpermi.q $xr0, $xr0, 1156; CHECK-NEXT: vst $vr0, $a0, 0157; CHECK-NEXT: ret158entry:159 %a = load <8 x float>, ptr %va160 %c = call <4 x float> @llvm.loongarch.lasx.extract.128.hi.s(<8 x float> %a)161 store <4 x float> %c, ptr %vd162 ret void163}164 165declare <2 x double> @llvm.loongarch.lasx.extract.128.hi.d(<4 x double>)166 167define void @lasx_extract_128_hi_d(ptr %vd, ptr %va) {168; CHECK-LABEL: lasx_extract_128_hi_d:169; CHECK: # %bb.0: # %entry170; CHECK-NEXT: xvld $xr0, $a1, 0171; CHECK-NEXT: xvpermi.q $xr0, $xr0, 1172; CHECK-NEXT: vst $vr0, $a0, 0173; CHECK-NEXT: ret174entry:175 %a = load <4 x double>, ptr %va176 %c = call <2 x double> @llvm.loongarch.lasx.extract.128.hi.d(<4 x double> %a)177 store <2 x double> %c, ptr %vd178 ret void179}180 181declare <2 x i64> @llvm.loongarch.lasx.extract.128.hi(<4 x i64>)182 183define void @lasx_extract_128_hi(ptr %vd, ptr %va) {184; CHECK-LABEL: lasx_extract_128_hi:185; CHECK: # %bb.0: # %entry186; CHECK-NEXT: xvld $xr0, $a1, 0187; CHECK-NEXT: xvpermi.q $xr0, $xr0, 1188; CHECK-NEXT: vst $vr0, $a0, 0189; CHECK-NEXT: ret190entry:191 %a = load <4 x i64>, ptr %va192 %c = call <2 x i64> @llvm.loongarch.lasx.extract.128.hi(<4 x i64> %a)193 store <2 x i64> %c, ptr %vd194 ret void195}196 197declare <8 x float> @llvm.loongarch.lasx.insert.128.lo.s(<8 x float>, <4 x float>)198 199define void @lasx_insert_128_lo_s(ptr %vd, ptr %va, ptr %vb) {200; CHECK-LABEL: lasx_insert_128_lo_s:201; CHECK: # %bb.0: # %entry202; CHECK-NEXT: xvld $xr0, $a1, 0203; CHECK-NEXT: vld $vr1, $a2, 0204; CHECK-NEXT: xvpermi.q $xr0, $xr1, 48205; CHECK-NEXT: xvst $xr0, $a0, 0206; CHECK-NEXT: ret207entry:208 %a = load <8 x float>, ptr %va209 %b = load <4 x float>, ptr %vb210 %c = call <8 x float> @llvm.loongarch.lasx.insert.128.lo.s(<8 x float> %a, <4 x float> %b)211 store <8 x float> %c, ptr %vd212 ret void213}214 215declare <4 x double> @llvm.loongarch.lasx.insert.128.lo.d(<4 x double>, <2 x double>)216 217define void @lasx_insert_128_lo_d(ptr %vd, ptr %va, ptr %vb) {218; CHECK-LABEL: lasx_insert_128_lo_d:219; CHECK: # %bb.0: # %entry220; CHECK-NEXT: xvld $xr0, $a1, 0221; CHECK-NEXT: vld $vr1, $a2, 0222; CHECK-NEXT: xvpermi.q $xr0, $xr1, 48223; CHECK-NEXT: xvst $xr0, $a0, 0224; CHECK-NEXT: ret225entry:226 %a = load <4 x double>, ptr %va227 %b = load <2 x double>, ptr %vb228 %c = call <4 x double> @llvm.loongarch.lasx.insert.128.lo.d(<4 x double> %a, <2 x double> %b)229 store <4 x double> %c, ptr %vd230 ret void231}232 233declare <4 x i64> @llvm.loongarch.lasx.insert.128.lo(<4 x i64>, <2 x i64>)234 235define void @lasx_insert_128_lo(ptr %vd, ptr %va, ptr %vb) {236; CHECK-LABEL: lasx_insert_128_lo:237; CHECK: # %bb.0: # %entry238; CHECK-NEXT: xvld $xr0, $a1, 0239; CHECK-NEXT: vld $vr1, $a2, 0240; CHECK-NEXT: xvpermi.q $xr0, $xr1, 48241; CHECK-NEXT: xvst $xr0, $a0, 0242; CHECK-NEXT: ret243entry:244 %a = load <4 x i64>, ptr %va245 %b = load <2 x i64>, ptr %vb246 %c = call <4 x i64> @llvm.loongarch.lasx.insert.128.lo(<4 x i64> %a, <2 x i64> %b)247 store <4 x i64> %c, ptr %vd248 ret void249}250 251declare <8 x float> @llvm.loongarch.lasx.insert.128.hi.s(<8 x float>, <4 x float>)252 253define void @lasx_insert_128_hi_s(ptr %vd, ptr %va, ptr %vb) {254; CHECK-LABEL: lasx_insert_128_hi_s:255; CHECK: # %bb.0: # %entry256; CHECK-NEXT: xvld $xr0, $a1, 0257; CHECK-NEXT: vld $vr1, $a2, 0258; CHECK-NEXT: xvpermi.q $xr0, $xr1, 2259; CHECK-NEXT: xvst $xr0, $a0, 0260; CHECK-NEXT: ret261entry:262 %a = load <8 x float>, ptr %va263 %b = load <4 x float>, ptr %vb264 %c = call <8 x float> @llvm.loongarch.lasx.insert.128.hi.s(<8 x float> %a, <4 x float> %b)265 store <8 x float> %c, ptr %vd266 ret void267}268 269declare <4 x double> @llvm.loongarch.lasx.insert.128.hi.d(<4 x double>, <2 x double>)270 271define void @lasx_insert_128_hi_d(ptr %vd, ptr %va, ptr %vb) {272; CHECK-LABEL: lasx_insert_128_hi_d:273; CHECK: # %bb.0: # %entry274; CHECK-NEXT: xvld $xr0, $a1, 0275; CHECK-NEXT: vld $vr1, $a2, 0276; CHECK-NEXT: xvpermi.q $xr0, $xr1, 2277; CHECK-NEXT: xvst $xr0, $a0, 0278; CHECK-NEXT: ret279entry:280 %a = load <4 x double>, ptr %va281 %b = load <2 x double>, ptr %vb282 %c = call <4 x double> @llvm.loongarch.lasx.insert.128.hi.d(<4 x double> %a, <2 x double> %b)283 store <4 x double> %c, ptr %vd284 ret void285}286 287declare <4 x i64> @llvm.loongarch.lasx.insert.128.hi(<4 x i64>, <2 x i64>)288 289define void @lasx_insert_128_hi(ptr %vd, ptr %va, ptr %vb) {290; CHECK-LABEL: lasx_insert_128_hi:291; CHECK: # %bb.0: # %entry292; CHECK-NEXT: xvld $xr0, $a1, 0293; CHECK-NEXT: vld $vr1, $a2, 0294; CHECK-NEXT: xvpermi.q $xr0, $xr1, 2295; CHECK-NEXT: xvst $xr0, $a0, 0296; CHECK-NEXT: ret297entry:298 %a = load <4 x i64>, ptr %va299 %b = load <2 x i64>, ptr %vb300 %c = call <4 x i64> @llvm.loongarch.lasx.insert.128.hi(<4 x i64> %a, <2 x i64> %b)301 store <4 x i64> %c, ptr %vd302 ret void303}304