brintos

brintos / llvm-project-archived public Read only

0
0
Text · 15.9 KiB · 258eaab Raw
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