274 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s --mattr=+sve -o - | FileCheck %s3 4target triple = "aarch64-unknown-linux-gnu"5 6; a * b + c7define <vscale x 4 x double> @mull_add(<vscale x 4 x double> %a, <vscale x 4 x double> %b, <vscale x 4 x double> %c) {8; CHECK-LABEL: mull_add:9; CHECK: // %bb.0: // %entry10; CHECK-NEXT: uzp2 z6.d, z0.d, z1.d11; CHECK-NEXT: uzp1 z0.d, z0.d, z1.d12; CHECK-NEXT: uzp2 z1.d, z2.d, z3.d13; CHECK-NEXT: uzp1 z2.d, z2.d, z3.d14; CHECK-NEXT: ptrue p0.d15; CHECK-NEXT: fmul z7.d, z0.d, z1.d16; CHECK-NEXT: fmul z1.d, z6.d, z1.d17; CHECK-NEXT: fmad z6.d, p0/m, z2.d, z7.d18; CHECK-NEXT: fnmsb z0.d, p0/m, z2.d, z1.d19; CHECK-NEXT: uzp2 z1.d, z4.d, z5.d20; CHECK-NEXT: uzp1 z2.d, z4.d, z5.d21; CHECK-NEXT: fadd z2.d, z2.d, z0.d22; CHECK-NEXT: fadd z1.d, z6.d, z1.d23; CHECK-NEXT: zip1 z0.d, z2.d, z1.d24; CHECK-NEXT: zip2 z1.d, z2.d, z1.d25; CHECK-NEXT: ret26entry:27 %strided.vec = tail call { <vscale x 2 x double>, <vscale x 2 x double> } @llvm.vector.deinterleave2.nxv4f64(<vscale x 4 x double> %a)28 %0 = extractvalue { <vscale x 2 x double>, <vscale x 2 x double> } %strided.vec, 029 %1 = extractvalue { <vscale x 2 x double>, <vscale x 2 x double> } %strided.vec, 130 %strided.vec29 = tail call { <vscale x 2 x double>, <vscale x 2 x double> } @llvm.vector.deinterleave2.nxv4f64(<vscale x 4 x double> %b)31 %2 = extractvalue { <vscale x 2 x double>, <vscale x 2 x double> } %strided.vec29, 032 %3 = extractvalue { <vscale x 2 x double>, <vscale x 2 x double> } %strided.vec29, 133 %4 = fmul contract <vscale x 2 x double> %0, %334 %5 = fmul contract <vscale x 2 x double> %1, %235 %6 = fadd contract <vscale x 2 x double> %5, %436 %7 = fmul contract <vscale x 2 x double> %0, %237 %8 = fmul contract <vscale x 2 x double> %1, %338 %9 = fsub contract <vscale x 2 x double> %7, %839 %strided.vec31 = tail call { <vscale x 2 x double>, <vscale x 2 x double> } @llvm.vector.deinterleave2.nxv4f64(<vscale x 4 x double> %c)40 %10 = extractvalue { <vscale x 2 x double>, <vscale x 2 x double> } %strided.vec31, 041 %11 = extractvalue { <vscale x 2 x double>, <vscale x 2 x double> } %strided.vec31, 142 %12 = fadd contract <vscale x 2 x double> %10, %943 %13 = fadd contract <vscale x 2 x double> %6, %1144 %interleaved.vec = tail call <vscale x 4 x double> @llvm.vector.interleave2.nxv4f64(<vscale x 2 x double> %12, <vscale x 2 x double> %13)45 ret <vscale x 4 x double> %interleaved.vec46}47 48; a * b + c * d49define <vscale x 4 x double> @mul_add_mull(<vscale x 4 x double> %a, <vscale x 4 x double> %b, <vscale x 4 x double> %c, <vscale x 4 x double> %d) {50; CHECK-LABEL: mul_add_mull:51; CHECK: // %bb.0: // %entry52; CHECK-NEXT: movi v24.2d, #000000000000000053; CHECK-NEXT: movi v25.2d, #000000000000000054; CHECK-NEXT: movi v26.2d, #000000000000000055; CHECK-NEXT: movi v27.2d, #000000000000000056; CHECK-NEXT: ptrue p0.d57; CHECK-NEXT: fcmla z24.d, p0/m, z2.d, z0.d, #058; CHECK-NEXT: fcmla z25.d, p0/m, z3.d, z1.d, #059; CHECK-NEXT: fcmla z27.d, p0/m, z6.d, z4.d, #060; CHECK-NEXT: fcmla z26.d, p0/m, z7.d, z5.d, #061; CHECK-NEXT: fcmla z24.d, p0/m, z2.d, z0.d, #9062; CHECK-NEXT: fcmla z25.d, p0/m, z3.d, z1.d, #9063; CHECK-NEXT: fcmla z27.d, p0/m, z6.d, z4.d, #9064; CHECK-NEXT: fcmla z26.d, p0/m, z7.d, z5.d, #9065; CHECK-NEXT: fadd z0.d, z24.d, z27.d66; CHECK-NEXT: fadd z1.d, z25.d, z26.d67; CHECK-NEXT: ret68entry:69 %strided.vec = tail call { <vscale x 2 x double>, <vscale x 2 x double> } @llvm.vector.deinterleave2.nxv4f64(<vscale x 4 x double> %a)70 %0 = extractvalue { <vscale x 2 x double>, <vscale x 2 x double> } %strided.vec, 071 %1 = extractvalue { <vscale x 2 x double>, <vscale x 2 x double> } %strided.vec, 172 %strided.vec52 = tail call { <vscale x 2 x double>, <vscale x 2 x double> } @llvm.vector.deinterleave2.nxv4f64(<vscale x 4 x double> %b)73 %2 = extractvalue { <vscale x 2 x double>, <vscale x 2 x double> } %strided.vec52, 074 %3 = extractvalue { <vscale x 2 x double>, <vscale x 2 x double> } %strided.vec52, 175 %4 = fmul contract <vscale x 2 x double> %0, %376 %5 = fmul contract <vscale x 2 x double> %1, %277 %6 = fadd contract <vscale x 2 x double> %5, %478 %7 = fmul contract <vscale x 2 x double> %0, %279 %8 = fmul contract <vscale x 2 x double> %1, %380 %9 = fsub contract <vscale x 2 x double> %7, %881 %strided.vec54 = tail call { <vscale x 2 x double>, <vscale x 2 x double> } @llvm.vector.deinterleave2.nxv4f64(<vscale x 4 x double> %c)82 %10 = extractvalue { <vscale x 2 x double>, <vscale x 2 x double> } %strided.vec54, 083 %11 = extractvalue { <vscale x 2 x double>, <vscale x 2 x double> } %strided.vec54, 184 %strided.vec56 = tail call { <vscale x 2 x double>, <vscale x 2 x double> } @llvm.vector.deinterleave2.nxv4f64(<vscale x 4 x double> %d)85 %12 = extractvalue { <vscale x 2 x double>, <vscale x 2 x double> } %strided.vec56, 086 %13 = extractvalue { <vscale x 2 x double>, <vscale x 2 x double> } %strided.vec56, 187 %14 = fmul contract <vscale x 2 x double> %10, %1388 %15 = fmul contract <vscale x 2 x double> %11, %1289 %16 = fadd contract <vscale x 2 x double> %15, %1490 %17 = fmul contract <vscale x 2 x double> %10, %1291 %18 = fmul contract <vscale x 2 x double> %11, %1392 %19 = fsub contract <vscale x 2 x double> %17, %1893 %20 = fadd contract <vscale x 2 x double> %9, %1994 %21 = fadd contract <vscale x 2 x double> %6, %1695 %interleaved.vec = tail call <vscale x 4 x double> @llvm.vector.interleave2.nxv4f64(<vscale x 2 x double> %20, <vscale x 2 x double> %21)96 ret <vscale x 4 x double> %interleaved.vec97}98 99; a * b - c * d100define <vscale x 4 x double> @mul_sub_mull(<vscale x 4 x double> %a, <vscale x 4 x double> %b, <vscale x 4 x double> %c, <vscale x 4 x double> %d) {101; CHECK-LABEL: mul_sub_mull:102; CHECK: // %bb.0: // %entry103; CHECK-NEXT: movi v24.2d, #0000000000000000104; CHECK-NEXT: movi v25.2d, #0000000000000000105; CHECK-NEXT: movi v26.2d, #0000000000000000106; CHECK-NEXT: movi v27.2d, #0000000000000000107; CHECK-NEXT: ptrue p0.d108; CHECK-NEXT: fcmla z24.d, p0/m, z2.d, z0.d, #0109; CHECK-NEXT: fcmla z25.d, p0/m, z3.d, z1.d, #0110; CHECK-NEXT: fcmla z27.d, p0/m, z6.d, z4.d, #0111; CHECK-NEXT: fcmla z26.d, p0/m, z7.d, z5.d, #0112; CHECK-NEXT: fcmla z24.d, p0/m, z2.d, z0.d, #90113; CHECK-NEXT: fcmla z25.d, p0/m, z3.d, z1.d, #90114; CHECK-NEXT: fcmla z27.d, p0/m, z6.d, z4.d, #90115; CHECK-NEXT: fcmla z26.d, p0/m, z7.d, z5.d, #90116; CHECK-NEXT: fsub z0.d, z24.d, z27.d117; CHECK-NEXT: fsub z1.d, z25.d, z26.d118; CHECK-NEXT: ret119entry:120 %strided.vec = tail call { <vscale x 2 x double>, <vscale x 2 x double> } @llvm.vector.deinterleave2.nxv4f64(<vscale x 4 x double> %a)121 %0 = extractvalue { <vscale x 2 x double>, <vscale x 2 x double> } %strided.vec, 0122 %1 = extractvalue { <vscale x 2 x double>, <vscale x 2 x double> } %strided.vec, 1123 %strided.vec52 = tail call { <vscale x 2 x double>, <vscale x 2 x double> } @llvm.vector.deinterleave2.nxv4f64(<vscale x 4 x double> %b)124 %2 = extractvalue { <vscale x 2 x double>, <vscale x 2 x double> } %strided.vec52, 0125 %3 = extractvalue { <vscale x 2 x double>, <vscale x 2 x double> } %strided.vec52, 1126 %4 = fmul contract <vscale x 2 x double> %0, %3127 %5 = fmul contract <vscale x 2 x double> %1, %2128 %6 = fadd contract <vscale x 2 x double> %5, %4129 %7 = fmul contract <vscale x 2 x double> %0, %2130 %8 = fmul contract <vscale x 2 x double> %1, %3131 %9 = fsub contract <vscale x 2 x double> %7, %8132 %strided.vec54 = tail call { <vscale x 2 x double>, <vscale x 2 x double> } @llvm.vector.deinterleave2.nxv4f64(<vscale x 4 x double> %c)133 %10 = extractvalue { <vscale x 2 x double>, <vscale x 2 x double> } %strided.vec54, 0134 %11 = extractvalue { <vscale x 2 x double>, <vscale x 2 x double> } %strided.vec54, 1135 %strided.vec56 = tail call { <vscale x 2 x double>, <vscale x 2 x double> } @llvm.vector.deinterleave2.nxv4f64(<vscale x 4 x double> %d)136 %12 = extractvalue { <vscale x 2 x double>, <vscale x 2 x double> } %strided.vec56, 0137 %13 = extractvalue { <vscale x 2 x double>, <vscale x 2 x double> } %strided.vec56, 1138 %14 = fmul contract <vscale x 2 x double> %10, %13139 %15 = fmul contract <vscale x 2 x double> %11, %12140 %16 = fadd contract <vscale x 2 x double> %15, %14141 %17 = fmul contract <vscale x 2 x double> %10, %12142 %18 = fmul contract <vscale x 2 x double> %11, %13143 %19 = fsub contract <vscale x 2 x double> %17, %18144 %20 = fsub contract <vscale x 2 x double> %9, %19145 %21 = fsub contract <vscale x 2 x double> %6, %16146 %interleaved.vec = tail call <vscale x 4 x double> @llvm.vector.interleave2.nxv4f64(<vscale x 2 x double> %20, <vscale x 2 x double> %21)147 ret <vscale x 4 x double> %interleaved.vec148}149 150; a * b + conj(c) * d151define <vscale x 4 x double> @mul_conj_mull(<vscale x 4 x double> %a, <vscale x 4 x double> %b, <vscale x 4 x double> %c, <vscale x 4 x double> %d) {152; CHECK-LABEL: mul_conj_mull:153; CHECK: // %bb.0: // %entry154; CHECK-NEXT: movi v24.2d, #0000000000000000155; CHECK-NEXT: movi v25.2d, #0000000000000000156; CHECK-NEXT: movi v26.2d, #0000000000000000157; CHECK-NEXT: movi v27.2d, #0000000000000000158; CHECK-NEXT: ptrue p0.d159; CHECK-NEXT: fcmla z24.d, p0/m, z2.d, z0.d, #0160; CHECK-NEXT: fcmla z25.d, p0/m, z3.d, z1.d, #0161; CHECK-NEXT: fcmla z27.d, p0/m, z4.d, z6.d, #0162; CHECK-NEXT: fcmla z26.d, p0/m, z5.d, z7.d, #0163; CHECK-NEXT: fcmla z24.d, p0/m, z2.d, z0.d, #90164; CHECK-NEXT: fcmla z25.d, p0/m, z3.d, z1.d, #90165; CHECK-NEXT: fcmla z27.d, p0/m, z4.d, z6.d, #270166; CHECK-NEXT: fcmla z26.d, p0/m, z5.d, z7.d, #270167; CHECK-NEXT: fadd z0.d, z24.d, z27.d168; CHECK-NEXT: fadd z1.d, z25.d, z26.d169; CHECK-NEXT: ret170entry:171 %strided.vec = tail call { <vscale x 2 x double>, <vscale x 2 x double> } @llvm.vector.deinterleave2.nxv4f64(<vscale x 4 x double> %a)172 %0 = extractvalue { <vscale x 2 x double>, <vscale x 2 x double> } %strided.vec, 0173 %1 = extractvalue { <vscale x 2 x double>, <vscale x 2 x double> } %strided.vec, 1174 %strided.vec60 = tail call { <vscale x 2 x double>, <vscale x 2 x double> } @llvm.vector.deinterleave2.nxv4f64(<vscale x 4 x double> %b)175 %2 = extractvalue { <vscale x 2 x double>, <vscale x 2 x double> } %strided.vec60, 0176 %3 = extractvalue { <vscale x 2 x double>, <vscale x 2 x double> } %strided.vec60, 1177 %4 = fmul contract <vscale x 2 x double> %0, %3178 %5 = fmul contract <vscale x 2 x double> %1, %2179 %6 = fadd contract <vscale x 2 x double> %5, %4180 %7 = fmul contract <vscale x 2 x double> %0, %2181 %8 = fmul contract <vscale x 2 x double> %1, %3182 %9 = fsub contract <vscale x 2 x double> %7, %8183 %strided.vec62 = tail call { <vscale x 2 x double>, <vscale x 2 x double> } @llvm.vector.deinterleave2.nxv4f64(<vscale x 4 x double> %c)184 %10 = extractvalue { <vscale x 2 x double>, <vscale x 2 x double> } %strided.vec62, 0185 %11 = extractvalue { <vscale x 2 x double>, <vscale x 2 x double> } %strided.vec62, 1186 %strided.vec64 = tail call { <vscale x 2 x double>, <vscale x 2 x double> } @llvm.vector.deinterleave2.nxv4f64(<vscale x 4 x double> %d)187 %12 = extractvalue { <vscale x 2 x double>, <vscale x 2 x double> } %strided.vec64, 0188 %13 = extractvalue { <vscale x 2 x double>, <vscale x 2 x double> } %strided.vec64, 1189 %14 = fmul contract <vscale x 2 x double> %10, %13190 %15 = fmul contract <vscale x 2 x double> %11, %12191 %16 = fsub contract <vscale x 2 x double> %14, %15192 %17 = fmul contract <vscale x 2 x double> %10, %12193 %18 = fmul contract <vscale x 2 x double> %11, %13194 %19 = fadd contract <vscale x 2 x double> %17, %18195 %20 = fadd contract <vscale x 2 x double> %9, %19196 %21 = fadd contract <vscale x 2 x double> %6, %16197 %interleaved.vec = tail call <vscale x 4 x double> @llvm.vector.interleave2.nxv4f64(<vscale x 2 x double> %20, <vscale x 2 x double> %21)198 ret <vscale x 4 x double> %interleaved.vec199}200 201; a + b + 1i * c * d202define <vscale x 4 x double> @mul_add_rot_mull(<vscale x 4 x double> %a, <vscale x 4 x double> %b, <vscale x 4 x double> %c, <vscale x 4 x double> %d) {203; CHECK-LABEL: mul_add_rot_mull:204; CHECK: // %bb.0: // %entry205; CHECK-NEXT: uzp2 z24.d, z4.d, z5.d206; CHECK-NEXT: movi v25.2d, #0000000000000000207; CHECK-NEXT: uzp1 z4.d, z4.d, z5.d208; CHECK-NEXT: ptrue p0.d209; CHECK-NEXT: mov z26.d, z24.d210; CHECK-NEXT: and z25.d, z25.d, #0x7fffffffffffffff211; CHECK-NEXT: and z26.d, z26.d, #0x8000000000000000212; CHECK-NEXT: orr z5.d, z25.d, z26.d213; CHECK-NEXT: fadd z5.d, z4.d, z5.d214; CHECK-NEXT: and z4.d, z4.d, #0x8000000000000000215; CHECK-NEXT: orr z4.d, z25.d, z4.d216; CHECK-NEXT: uzp2 z25.d, z0.d, z1.d217; CHECK-NEXT: uzp1 z0.d, z0.d, z1.d218; CHECK-NEXT: uzp2 z1.d, z2.d, z3.d219; CHECK-NEXT: uzp1 z2.d, z2.d, z3.d220; CHECK-NEXT: fsub z4.d, z4.d, z24.d221; CHECK-NEXT: uzp2 z24.d, z6.d, z7.d222; CHECK-NEXT: uzp1 z6.d, z6.d, z7.d223; CHECK-NEXT: fmul z26.d, z0.d, z1.d224; CHECK-NEXT: fmul z1.d, z25.d, z1.d225; CHECK-NEXT: fmul z3.d, z4.d, z24.d226; CHECK-NEXT: fmul z24.d, z5.d, z24.d227; CHECK-NEXT: fmad z25.d, p0/m, z2.d, z26.d228; CHECK-NEXT: fnmsb z0.d, p0/m, z2.d, z1.d229; CHECK-NEXT: fmla z3.d, p0/m, z6.d, z5.d230; CHECK-NEXT: fnmsb z4.d, p0/m, z6.d, z24.d231; CHECK-NEXT: fadd z1.d, z0.d, z4.d232; CHECK-NEXT: fadd z2.d, z25.d, z3.d233; CHECK-NEXT: zip1 z0.d, z1.d, z2.d234; CHECK-NEXT: zip2 z1.d, z1.d, z2.d235; CHECK-NEXT: ret236entry:237 %strided.vec = tail call { <vscale x 2 x double>, <vscale x 2 x double> } @llvm.vector.deinterleave2.nxv4f64(<vscale x 4 x double> %a)238 %0 = extractvalue { <vscale x 2 x double>, <vscale x 2 x double> } %strided.vec, 0239 %1 = extractvalue { <vscale x 2 x double>, <vscale x 2 x double> } %strided.vec, 1240 %strided.vec78 = tail call { <vscale x 2 x double>, <vscale x 2 x double> } @llvm.vector.deinterleave2.nxv4f64(<vscale x 4 x double> %b)241 %2 = extractvalue { <vscale x 2 x double>, <vscale x 2 x double> } %strided.vec78, 0242 %3 = extractvalue { <vscale x 2 x double>, <vscale x 2 x double> } %strided.vec78, 1243 %4 = fmul contract <vscale x 2 x double> %0, %3244 %5 = fmul contract <vscale x 2 x double> %1, %2245 %6 = fadd contract <vscale x 2 x double> %5, %4246 %7 = fmul contract <vscale x 2 x double> %0, %2247 %8 = fmul contract <vscale x 2 x double> %1, %3248 %9 = fsub contract <vscale x 2 x double> %7, %8249 %strided.vec80 = tail call { <vscale x 2 x double>, <vscale x 2 x double> } @llvm.vector.deinterleave2.nxv4f64(<vscale x 4 x double> %c)250 %10 = extractvalue { <vscale x 2 x double>, <vscale x 2 x double> } %strided.vec80, 0251 %11 = extractvalue { <vscale x 2 x double>, <vscale x 2 x double> } %strided.vec80, 1252 %12 = tail call contract <vscale x 2 x double> @llvm.copysign.nxv2f64(<vscale x 2 x double> zeroinitializer, <vscale x 2 x double> %11)253 %13 = fadd contract <vscale x 2 x double> %10, %12254 %14 = tail call contract <vscale x 2 x double> @llvm.copysign.nxv2f64(<vscale x 2 x double> zeroinitializer, <vscale x 2 x double> %10)255 %15 = fsub contract <vscale x 2 x double> %14, %11256 %strided.vec82 = tail call { <vscale x 2 x double>, <vscale x 2 x double> } @llvm.vector.deinterleave2.nxv4f64(<vscale x 4 x double> %d)257 %16 = extractvalue { <vscale x 2 x double>, <vscale x 2 x double> } %strided.vec82, 0258 %17 = extractvalue { <vscale x 2 x double>, <vscale x 2 x double> } %strided.vec82, 1259 %18 = fmul contract <vscale x 2 x double> %15, %17260 %19 = fmul contract <vscale x 2 x double> %16, %13261 %20 = fadd contract <vscale x 2 x double> %19, %18262 %21 = fmul contract <vscale x 2 x double> %15, %16263 %22 = fmul contract <vscale x 2 x double> %13, %17264 %23 = fsub contract <vscale x 2 x double> %21, %22265 %24 = fadd contract <vscale x 2 x double> %9, %23266 %25 = fadd contract <vscale x 2 x double> %6, %20267 %interleaved.vec = tail call <vscale x 4 x double> @llvm.vector.interleave2.nxv4f64(<vscale x 2 x double> %24, <vscale x 2 x double> %25)268 ret <vscale x 4 x double> %interleaved.vec269}270 271declare { <vscale x 2 x double>, <vscale x 2 x double> } @llvm.vector.deinterleave2.nxv4f64(<vscale x 4 x double>)272declare <vscale x 4 x double> @llvm.vector.interleave2.nxv4f64(<vscale x 2 x double>, <vscale x 2 x double>)273declare <vscale x 2 x double> @llvm.copysign.nxv2f64(<vscale x 2 x double>, <vscale x 2 x double>)274