248 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s --mattr=+complxnum,+neon -o - | FileCheck %s3 4target triple = "aarch64"5 6; a * b + c7define <4 x double> @mull_add(<4 x double> %a, <4 x double> %b, <4 x double> %c) {8; CHECK-LABEL: mull_add:9; CHECK: // %bb.0: // %entry10; CHECK-NEXT: zip2 v4.2d, v2.2d, v3.2d11; CHECK-NEXT: zip2 v5.2d, v0.2d, v1.2d12; CHECK-NEXT: zip1 v0.2d, v0.2d, v1.2d13; CHECK-NEXT: zip1 v2.2d, v2.2d, v3.2d14; CHECK-NEXT: fmul v1.2d, v5.2d, v4.2d15; CHECK-NEXT: fmul v3.2d, v0.2d, v4.2d16; CHECK-NEXT: fneg v1.2d, v1.2d17; CHECK-NEXT: fmla v3.2d, v2.2d, v5.2d18; CHECK-NEXT: fmla v1.2d, v2.2d, v0.2d19; CHECK-NEXT: fadd v1.2d, v2.2d, v1.2d20; CHECK-NEXT: fadd v2.2d, v3.2d, v4.2d21; CHECK-NEXT: zip1 v0.2d, v1.2d, v2.2d22; CHECK-NEXT: zip2 v1.2d, v1.2d, v2.2d23; CHECK-NEXT: ret24entry:25 %strided.vec = shufflevector <4 x double> %a, <4 x double> poison, <2 x i32> <i32 0, i32 2>26 %strided.vec28 = shufflevector <4 x double> %a, <4 x double> poison, <2 x i32> <i32 1, i32 3>27 %strided.vec30 = shufflevector <4 x double> %b, <4 x double> poison, <2 x i32> <i32 0, i32 2>28 %strided.vec31 = shufflevector <4 x double> %b, <4 x double> poison, <2 x i32> <i32 1, i32 3>29 %0 = fmul contract <2 x double> %strided.vec, %strided.vec3130 %1 = fmul contract <2 x double> %strided.vec28, %strided.vec3031 %2 = fadd contract <2 x double> %1, %032 %3 = fmul contract <2 x double> %strided.vec, %strided.vec3033 %4 = fmul contract <2 x double> %strided.vec28, %strided.vec3134 %5 = fsub contract <2 x double> %3, %435 %strided.vec33 = shufflevector <4 x double> %b, <4 x double> poison, <2 x i32> <i32 0, i32 2>36 %strided.vec34 = shufflevector <4 x double> %b, <4 x double> poison, <2 x i32> <i32 1, i32 3>37 %6 = fadd contract <2 x double> %strided.vec33, %538 %7 = fadd contract <2 x double> %2, %strided.vec3439 %interleaved.vec = shufflevector <2 x double> %6, <2 x double> %7, <4 x i32> <i32 0, i32 2, i32 1, i32 3>40 ret <4 x double> %interleaved.vec41}42 43; a * b + c * d44define <4 x double> @mul_add_mull(<4 x double> %a, <4 x double> %b, <4 x double> %c, <4 x double> %d) {45; CHECK-LABEL: mul_add_mull:46; CHECK: // %bb.0: // %entry47; CHECK-NEXT: movi v16.2d, #000000000000000048; CHECK-NEXT: movi v17.2d, #000000000000000049; CHECK-NEXT: movi v18.2d, #000000000000000050; CHECK-NEXT: movi v19.2d, #000000000000000051; CHECK-NEXT: fcmla v16.2d, v2.2d, v0.2d, #052; CHECK-NEXT: fcmla v18.2d, v3.2d, v1.2d, #053; CHECK-NEXT: fcmla v17.2d, v7.2d, v5.2d, #054; CHECK-NEXT: fcmla v19.2d, v6.2d, v4.2d, #055; CHECK-NEXT: fcmla v16.2d, v2.2d, v0.2d, #9056; CHECK-NEXT: fcmla v18.2d, v3.2d, v1.2d, #9057; CHECK-NEXT: fcmla v17.2d, v7.2d, v5.2d, #9058; CHECK-NEXT: fcmla v19.2d, v6.2d, v4.2d, #9059; CHECK-NEXT: fadd v1.2d, v18.2d, v17.2d60; CHECK-NEXT: fadd v0.2d, v16.2d, v19.2d61; CHECK-NEXT: ret62entry:63 %strided.vec = shufflevector <4 x double> %a, <4 x double> poison, <2 x i32> <i32 0, i32 2>64 %strided.vec51 = shufflevector <4 x double> %a, <4 x double> poison, <2 x i32> <i32 1, i32 3>65 %strided.vec53 = shufflevector <4 x double> %b, <4 x double> poison, <2 x i32> <i32 0, i32 2>66 %strided.vec54 = shufflevector <4 x double> %b, <4 x double> poison, <2 x i32> <i32 1, i32 3>67 %0 = fmul contract <2 x double> %strided.vec, %strided.vec5468 %1 = fmul contract <2 x double> %strided.vec51, %strided.vec5369 %2 = fadd contract <2 x double> %1, %070 %3 = fmul contract <2 x double> %strided.vec, %strided.vec5371 %4 = fmul contract <2 x double> %strided.vec51, %strided.vec5472 %5 = fsub contract <2 x double> %3, %473 %strided.vec56 = shufflevector <4 x double> %c, <4 x double> poison, <2 x i32> <i32 0, i32 2>74 %strided.vec57 = shufflevector <4 x double> %c, <4 x double> poison, <2 x i32> <i32 1, i32 3>75 %strided.vec59 = shufflevector <4 x double> %d, <4 x double> poison, <2 x i32> <i32 0, i32 2>76 %strided.vec60 = shufflevector <4 x double> %d, <4 x double> poison, <2 x i32> <i32 1, i32 3>77 %6 = fmul contract <2 x double> %strided.vec56, %strided.vec6078 %7 = fmul contract <2 x double> %strided.vec57, %strided.vec5979 %8 = fadd contract <2 x double> %7, %680 %9 = fmul contract <2 x double> %strided.vec56, %strided.vec5981 %10 = fmul contract <2 x double> %strided.vec57, %strided.vec6082 %11 = fsub contract <2 x double> %9, %1083 %12 = fadd contract <2 x double> %5, %1184 %13 = fadd contract <2 x double> %2, %885 %interleaved.vec = shufflevector <2 x double> %12, <2 x double> %13, <4 x i32> <i32 0, i32 2, i32 1, i32 3>86 ret <4 x double> %interleaved.vec87}88 89; a * b - c * d90define <4 x double> @mul_sub_mull(<4 x double> %a, <4 x double> %b, <4 x double> %c, <4 x double> %d) {91; CHECK-LABEL: mul_sub_mull:92; CHECK: // %bb.0: // %entry93; CHECK-NEXT: movi v16.2d, #000000000000000094; CHECK-NEXT: movi v17.2d, #000000000000000095; CHECK-NEXT: movi v18.2d, #000000000000000096; CHECK-NEXT: movi v19.2d, #000000000000000097; CHECK-NEXT: fcmla v16.2d, v2.2d, v0.2d, #098; CHECK-NEXT: fcmla v18.2d, v3.2d, v1.2d, #099; CHECK-NEXT: fcmla v17.2d, v7.2d, v5.2d, #0100; CHECK-NEXT: fcmla v19.2d, v6.2d, v4.2d, #0101; CHECK-NEXT: fcmla v16.2d, v2.2d, v0.2d, #90102; CHECK-NEXT: fcmla v18.2d, v3.2d, v1.2d, #90103; CHECK-NEXT: fcmla v17.2d, v7.2d, v5.2d, #90104; CHECK-NEXT: fcmla v19.2d, v6.2d, v4.2d, #90105; CHECK-NEXT: fsub v1.2d, v18.2d, v17.2d106; CHECK-NEXT: fsub v0.2d, v16.2d, v19.2d107; CHECK-NEXT: ret108entry:109 %strided.vec = shufflevector <4 x double> %a, <4 x double> poison, <2 x i32> <i32 0, i32 2>110 %strided.vec51 = shufflevector <4 x double> %a, <4 x double> poison, <2 x i32> <i32 1, i32 3>111 %strided.vec53 = shufflevector <4 x double> %b, <4 x double> poison, <2 x i32> <i32 0, i32 2>112 %strided.vec54 = shufflevector <4 x double> %b, <4 x double> poison, <2 x i32> <i32 1, i32 3>113 %0 = fmul contract <2 x double> %strided.vec, %strided.vec54114 %1 = fmul contract <2 x double> %strided.vec51, %strided.vec53115 %2 = fadd contract <2 x double> %1, %0116 %3 = fmul contract <2 x double> %strided.vec, %strided.vec53117 %4 = fmul contract <2 x double> %strided.vec51, %strided.vec54118 %5 = fsub contract <2 x double> %3, %4119 %strided.vec56 = shufflevector <4 x double> %c, <4 x double> poison, <2 x i32> <i32 0, i32 2>120 %strided.vec57 = shufflevector <4 x double> %c, <4 x double> poison, <2 x i32> <i32 1, i32 3>121 %strided.vec59 = shufflevector <4 x double> %d, <4 x double> poison, <2 x i32> <i32 0, i32 2>122 %strided.vec60 = shufflevector <4 x double> %d, <4 x double> poison, <2 x i32> <i32 1, i32 3>123 %6 = fmul contract <2 x double> %strided.vec56, %strided.vec60124 %7 = fmul contract <2 x double> %strided.vec57, %strided.vec59125 %8 = fadd contract <2 x double> %7, %6126 %9 = fmul contract <2 x double> %strided.vec56, %strided.vec59127 %10 = fmul contract <2 x double> %strided.vec57, %strided.vec60128 %11 = fsub contract <2 x double> %9, %10129 %12 = fsub contract <2 x double> %5, %11130 %13 = fsub contract <2 x double> %2, %8131 %interleaved.vec = shufflevector <2 x double> %12, <2 x double> %13, <4 x i32> <i32 0, i32 2, i32 1, i32 3>132 ret <4 x double> %interleaved.vec133}134 135; a * b + conj(c) * d136define <4 x double> @mul_conj_mull(<4 x double> %a, <4 x double> %b, <4 x double> %c, <4 x double> %d) {137; CHECK-LABEL: mul_conj_mull:138; CHECK: // %bb.0: // %entry139; CHECK-NEXT: movi v16.2d, #0000000000000000140; CHECK-NEXT: movi v17.2d, #0000000000000000141; CHECK-NEXT: movi v18.2d, #0000000000000000142; CHECK-NEXT: movi v19.2d, #0000000000000000143; CHECK-NEXT: fcmla v16.2d, v2.2d, v0.2d, #0144; CHECK-NEXT: fcmla v18.2d, v3.2d, v1.2d, #0145; CHECK-NEXT: fcmla v17.2d, v5.2d, v7.2d, #0146; CHECK-NEXT: fcmla v19.2d, v4.2d, v6.2d, #0147; CHECK-NEXT: fcmla v16.2d, v2.2d, v0.2d, #90148; CHECK-NEXT: fcmla v18.2d, v3.2d, v1.2d, #90149; CHECK-NEXT: fcmla v17.2d, v5.2d, v7.2d, #270150; CHECK-NEXT: fcmla v19.2d, v4.2d, v6.2d, #270151; CHECK-NEXT: fadd v1.2d, v18.2d, v17.2d152; CHECK-NEXT: fadd v0.2d, v16.2d, v19.2d153; CHECK-NEXT: ret154entry:155 %strided.vec = shufflevector <4 x double> %a, <4 x double> poison, <2 x i32> <i32 0, i32 2>156 %strided.vec59 = shufflevector <4 x double> %a, <4 x double> poison, <2 x i32> <i32 1, i32 3>157 %strided.vec61 = shufflevector <4 x double> %b, <4 x double> poison, <2 x i32> <i32 0, i32 2>158 %strided.vec62 = shufflevector <4 x double> %b, <4 x double> poison, <2 x i32> <i32 1, i32 3>159 %0 = fmul contract <2 x double> %strided.vec, %strided.vec62160 %1 = fmul contract <2 x double> %strided.vec59, %strided.vec61161 %2 = fadd contract <2 x double> %1, %0162 %3 = fmul contract <2 x double> %strided.vec, %strided.vec61163 %4 = fmul contract <2 x double> %strided.vec59, %strided.vec62164 %5 = fsub contract <2 x double> %3, %4165 %strided.vec64 = shufflevector <4 x double> %c, <4 x double> poison, <2 x i32> <i32 0, i32 2>166 %strided.vec65 = shufflevector <4 x double> %c, <4 x double> poison, <2 x i32> <i32 1, i32 3>167 %strided.vec67 = shufflevector <4 x double> %d, <4 x double> poison, <2 x i32> <i32 0, i32 2>168 %strided.vec68 = shufflevector <4 x double> %d, <4 x double> poison, <2 x i32> <i32 1, i32 3>169 %6 = fmul contract <2 x double> %strided.vec64, %strided.vec68170 %7 = fmul contract <2 x double> %strided.vec65, %strided.vec67171 %8 = fsub contract <2 x double> %6, %7172 %9 = fmul contract <2 x double> %strided.vec64, %strided.vec67173 %10 = fmul contract <2 x double> %strided.vec65, %strided.vec68174 %11 = fadd contract <2 x double> %9, %10175 %12 = fadd contract <2 x double> %5, %11176 %13 = fadd contract <2 x double> %2, %8177 %interleaved.vec = shufflevector <2 x double> %12, <2 x double> %13, <4 x i32> <i32 0, i32 2, i32 1, i32 3>178 ret <4 x double> %interleaved.vec179}180 181; a + b + 1i * c * d182define <4 x double> @mul_add_rot_mull(<4 x double> %a, <4 x double> %b, <4 x double> %c, <4 x double> %d) {183; CHECK-LABEL: mul_add_rot_mull:184; CHECK: // %bb.0: // %entry185; CHECK-NEXT: movi v16.2d, #0xffffffffffffffff186; CHECK-NEXT: zip2 v17.2d, v4.2d, v5.2d187; CHECK-NEXT: movi v18.2d, #0000000000000000188; CHECK-NEXT: zip1 v4.2d, v4.2d, v5.2d189; CHECK-NEXT: zip2 v19.2d, v0.2d, v1.2d190; CHECK-NEXT: zip2 v20.2d, v2.2d, v3.2d191; CHECK-NEXT: zip1 v0.2d, v0.2d, v1.2d192; CHECK-NEXT: zip1 v2.2d, v2.2d, v3.2d193; CHECK-NEXT: fneg v16.2d, v16.2d194; CHECK-NEXT: fmul v1.2d, v19.2d, v20.2d195; CHECK-NEXT: fmul v3.2d, v0.2d, v20.2d196; CHECK-NEXT: mov v5.16b, v16.16b197; CHECK-NEXT: bsl v16.16b, v18.16b, v4.16b198; CHECK-NEXT: fneg v1.2d, v1.2d199; CHECK-NEXT: fmla v3.2d, v2.2d, v19.2d200; CHECK-NEXT: bsl v5.16b, v18.16b, v17.16b201; CHECK-NEXT: fsub v16.2d, v16.2d, v17.2d202; CHECK-NEXT: fmla v1.2d, v2.2d, v0.2d203; CHECK-NEXT: fadd v4.2d, v4.2d, v5.2d204; CHECK-NEXT: zip2 v5.2d, v6.2d, v7.2d205; CHECK-NEXT: zip1 v6.2d, v6.2d, v7.2d206; CHECK-NEXT: fmul v17.2d, v4.2d, v5.2d207; CHECK-NEXT: fmul v5.2d, v16.2d, v5.2d208; CHECK-NEXT: fneg v7.2d, v17.2d209; CHECK-NEXT: fmla v5.2d, v4.2d, v6.2d210; CHECK-NEXT: fmla v7.2d, v6.2d, v16.2d211; CHECK-NEXT: fadd v2.2d, v3.2d, v5.2d212; CHECK-NEXT: fadd v1.2d, v1.2d, v7.2d213; CHECK-NEXT: zip1 v0.2d, v1.2d, v2.2d214; CHECK-NEXT: zip2 v1.2d, v1.2d, v2.2d215; CHECK-NEXT: ret216entry:217 %strided.vec = shufflevector <4 x double> %a, <4 x double> poison, <2 x i32> <i32 0, i32 2>218 %strided.vec77 = shufflevector <4 x double> %a, <4 x double> poison, <2 x i32> <i32 1, i32 3>219 %strided.vec79 = shufflevector <4 x double> %b, <4 x double> poison, <2 x i32> <i32 0, i32 2>220 %strided.vec80 = shufflevector <4 x double> %b, <4 x double> poison, <2 x i32> <i32 1, i32 3>221 %0 = fmul contract <2 x double> %strided.vec, %strided.vec80222 %1 = fmul contract <2 x double> %strided.vec77, %strided.vec79223 %2 = fadd contract <2 x double> %1, %0224 %3 = fmul contract <2 x double> %strided.vec, %strided.vec79225 %4 = fmul contract <2 x double> %strided.vec77, %strided.vec80226 %5 = fsub contract <2 x double> %3, %4227 %strided.vec82 = shufflevector <4 x double> %c, <4 x double> poison, <2 x i32> <i32 0, i32 2>228 %strided.vec83 = shufflevector <4 x double> %c, <4 x double> poison, <2 x i32> <i32 1, i32 3>229 %6 = tail call contract <2 x double> @llvm.copysign.v2f64(<2 x double> zeroinitializer, <2 x double> %strided.vec83)230 %7 = fadd contract <2 x double> %strided.vec82, %6231 %8 = tail call contract <2 x double> @llvm.copysign.v2f64(<2 x double> zeroinitializer, <2 x double> %strided.vec82)232 %9 = fsub contract <2 x double> %8, %strided.vec83233 %strided.vec85 = shufflevector <4 x double> %d, <4 x double> poison, <2 x i32> <i32 0, i32 2>234 %strided.vec86 = shufflevector <4 x double> %d, <4 x double> poison, <2 x i32> <i32 1, i32 3>235 %10 = fmul contract <2 x double> %9, %strided.vec86236 %11 = fmul contract <2 x double> %strided.vec85, %7237 %12 = fadd contract <2 x double> %11, %10238 %13 = fmul contract <2 x double> %9, %strided.vec85239 %14 = fmul contract <2 x double> %7, %strided.vec86240 %15 = fsub contract <2 x double> %13, %14241 %16 = fadd contract <2 x double> %5, %15242 %17 = fadd contract <2 x double> %2, %12243 %interleaved.vec = shufflevector <2 x double> %16, <2 x double> %17, <4 x i32> <i32 0, i32 2, i32 1, i32 3>244 ret <4 x double> %interleaved.vec245}246 247declare <2 x double> @llvm.copysign.v2f64(<2 x double>, <2 x double>)248