brintos

brintos / llvm-project-archived public Read only

0
0
Text · 13.0 KiB · 09672d1 Raw
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