brintos

brintos / llvm-project-archived public Read only

0
0
Text · 13.1 KiB · bf7336e Raw
275 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=riscv32 -mattr=+d,+zvfh,+v -target-abi=ilp32d \3; RUN:     -verify-machineinstrs < %s | FileCheck %s4; RUN: llc -mtriple=riscv64 -mattr=+d,+zvfh,+v -target-abi=lp64d \5; RUN:     -verify-machineinstrs < %s | FileCheck %s6 7; This tests a mix of vfmacc and vfmadd by using different operand orders to8; trigger commuting in TwoAddressInstructionPass.9 10define <2 x half> @vfmadd_vv_v2f16(<2 x half> %va, <2 x half> %vb, <2 x half> %vc) strictfp {11; CHECK-LABEL: vfmadd_vv_v2f16:12; CHECK:       # %bb.0:13; CHECK-NEXT:    vsetivli zero, 2, e16, mf4, ta, ma14; CHECK-NEXT:    vfmadd.vv v8, v10, v915; CHECK-NEXT:    ret16  %vd = call <2 x half> @llvm.experimental.constrained.fma.v2f16(<2 x half> %va, <2 x half> %vc, <2 x half> %vb, metadata !"round.dynamic", metadata !"fpexcept.strict")17  ret <2 x half> %vd18}19 20define <2 x half> @vfmadd_vf_v2f16(<2 x half> %va, <2 x half> %vb, half %c) strictfp {21; CHECK-LABEL: vfmadd_vf_v2f16:22; CHECK:       # %bb.0:23; CHECK-NEXT:    vsetivli zero, 2, e16, mf4, ta, ma24; CHECK-NEXT:    vfmacc.vf v8, fa0, v925; CHECK-NEXT:    ret26  %head = insertelement <2 x half> poison, half %c, i32 027  %splat = shufflevector <2 x half> %head, <2 x half> poison, <2 x i32> zeroinitializer28  %vd = call <2 x half> @llvm.experimental.constrained.fma.v2f16(<2 x half> %vb, <2 x half> %splat, <2 x half> %va, metadata !"round.dynamic", metadata !"fpexcept.strict")29  ret <2 x half> %vd30}31 32define <4 x half> @vfmadd_vv_v4f16(<4 x half> %va, <4 x half> %vb, <4 x half> %vc) strictfp {33; CHECK-LABEL: vfmadd_vv_v4f16:34; CHECK:       # %bb.0:35; CHECK-NEXT:    vsetivli zero, 4, e16, mf2, ta, ma36; CHECK-NEXT:    vfmadd.vv v8, v9, v1037; CHECK-NEXT:    ret38  %vd = call <4 x half> @llvm.experimental.constrained.fma.v4f16(<4 x half> %vb, <4 x half> %va, <4 x half> %vc, metadata !"round.dynamic", metadata !"fpexcept.strict")39  ret <4 x half> %vd40}41 42define <4 x half> @vfmadd_vf_v4f16(<4 x half> %va, <4 x half> %vb, half %c) strictfp {43; CHECK-LABEL: vfmadd_vf_v4f16:44; CHECK:       # %bb.0:45; CHECK-NEXT:    vsetivli zero, 4, e16, mf2, ta, ma46; CHECK-NEXT:    vfmadd.vf v8, fa0, v947; CHECK-NEXT:    ret48  %head = insertelement <4 x half> poison, half %c, i32 049  %splat = shufflevector <4 x half> %head, <4 x half> poison, <4 x i32> zeroinitializer50  %vd = call <4 x half> @llvm.experimental.constrained.fma.v4f16(<4 x half> %va, <4 x half> %splat, <4 x half> %vb, metadata !"round.dynamic", metadata !"fpexcept.strict")51  ret <4 x half> %vd52}53 54define <8 x half> @vfmadd_vv_v8f16(<8 x half> %va, <8 x half> %vb, <8 x half> %vc) strictfp {55; CHECK-LABEL: vfmadd_vv_v8f16:56; CHECK:       # %bb.0:57; CHECK-NEXT:    vsetivli zero, 8, e16, m1, ta, ma58; CHECK-NEXT:    vfmacc.vv v8, v10, v959; CHECK-NEXT:    ret60  %vd = call <8 x half> @llvm.experimental.constrained.fma.v8f16(<8 x half> %vb, <8 x half> %vc, <8 x half> %va, metadata !"round.dynamic", metadata !"fpexcept.strict")61  ret <8 x half> %vd62}63 64define <8 x half> @vfmadd_vf_v8f16(<8 x half> %va, <8 x half> %vb, half %c) strictfp {65; CHECK-LABEL: vfmadd_vf_v8f16:66; CHECK:       # %bb.0:67; CHECK-NEXT:    vsetivli zero, 8, e16, m1, ta, ma68; CHECK-NEXT:    vfmacc.vf v8, fa0, v969; CHECK-NEXT:    ret70  %head = insertelement <8 x half> poison, half %c, i32 071  %splat = shufflevector <8 x half> %head, <8 x half> poison, <8 x i32> zeroinitializer72  %vd = call <8 x half> @llvm.experimental.constrained.fma.v8f16(<8 x half> %vb, <8 x half> %splat, <8 x half> %va, metadata !"round.dynamic", metadata !"fpexcept.strict")73  ret <8 x half> %vd74}75 76define <16 x half> @vfmadd_vv_v16f16(<16 x half> %va, <16 x half> %vb, <16 x half> %vc) strictfp {77; CHECK-LABEL: vfmadd_vv_v16f16:78; CHECK:       # %bb.0:79; CHECK-NEXT:    vsetivli zero, 16, e16, m2, ta, ma80; CHECK-NEXT:    vfmadd.vv v8, v12, v1081; CHECK-NEXT:    ret82  %vd = call <16 x half> @llvm.experimental.constrained.fma.v16f16(<16 x half> %vc, <16 x half> %va, <16 x half> %vb, metadata !"round.dynamic", metadata !"fpexcept.strict")83  ret <16 x half> %vd84}85 86define <16 x half> @vfmadd_vf_v16f16(<16 x half> %va, <16 x half> %vb, half %c) strictfp {87; CHECK-LABEL: vfmadd_vf_v16f16:88; CHECK:       # %bb.0:89; CHECK-NEXT:    vsetivli zero, 16, e16, m2, ta, ma90; CHECK-NEXT:    vfmadd.vf v8, fa0, v1091; CHECK-NEXT:    ret92  %head = insertelement <16 x half> poison, half %c, i32 093  %splat = shufflevector <16 x half> %head, <16 x half> poison, <16 x i32> zeroinitializer94  %vd = call <16 x half> @llvm.experimental.constrained.fma.v16f16(<16 x half> %va, <16 x half> %splat, <16 x half> %vb, metadata !"round.dynamic", metadata !"fpexcept.strict")95  ret <16 x half> %vd96}97 98define <32 x half> @vfmadd_vv_v32f16(<32 x half> %va, <32 x half> %vb, <32 x half> %vc) strictfp {99; CHECK-LABEL: vfmadd_vv_v32f16:100; CHECK:       # %bb.0:101; CHECK-NEXT:    li a0, 32102; CHECK-NEXT:    vsetvli zero, a0, e16, m4, ta, ma103; CHECK-NEXT:    vfmacc.vv v8, v16, v12104; CHECK-NEXT:    ret105  %vd = call <32 x half> @llvm.experimental.constrained.fma.v32f16(<32 x half> %vc, <32 x half> %vb, <32 x half> %va, metadata !"round.dynamic", metadata !"fpexcept.strict")106  ret <32 x half> %vd107}108 109define <32 x half> @vfmadd_vf_v32f16(<32 x half> %va, <32 x half> %vb, half %c) strictfp {110; CHECK-LABEL: vfmadd_vf_v32f16:111; CHECK:       # %bb.0:112; CHECK-NEXT:    li a0, 32113; CHECK-NEXT:    vsetvli zero, a0, e16, m4, ta, ma114; CHECK-NEXT:    vfmacc.vf v8, fa0, v12115; CHECK-NEXT:    ret116  %head = insertelement <32 x half> poison, half %c, i32 0117  %splat = shufflevector <32 x half> %head, <32 x half> poison, <32 x i32> zeroinitializer118  %vd = call <32 x half> @llvm.experimental.constrained.fma.v32f16(<32 x half> %vb, <32 x half> %splat, <32 x half> %va, metadata !"round.dynamic", metadata !"fpexcept.strict")119  ret <32 x half> %vd120}121 122define <2 x float> @vfmadd_vv_v2f32(<2 x float> %va, <2 x float> %vb, <2 x float> %vc) strictfp {123; CHECK-LABEL: vfmadd_vv_v2f32:124; CHECK:       # %bb.0:125; CHECK-NEXT:    vsetivli zero, 2, e32, mf2, ta, ma126; CHECK-NEXT:    vfmadd.vv v8, v10, v9127; CHECK-NEXT:    ret128  %vd = call <2 x float> @llvm.experimental.constrained.fma.v2f32(<2 x float> %va, <2 x float> %vc, <2 x float> %vb, metadata !"round.dynamic", metadata !"fpexcept.strict")129  ret <2 x float> %vd130}131 132define <2 x float> @vfmadd_vf_v2f32(<2 x float> %va, <2 x float> %vb, float %c) strictfp {133; CHECK-LABEL: vfmadd_vf_v2f32:134; CHECK:       # %bb.0:135; CHECK-NEXT:    vsetivli zero, 2, e32, mf2, ta, ma136; CHECK-NEXT:    vfmacc.vf v8, fa0, v9137; CHECK-NEXT:    ret138  %head = insertelement <2 x float> poison, float %c, i32 0139  %splat = shufflevector <2 x float> %head, <2 x float> poison, <2 x i32> zeroinitializer140  %vd = call <2 x float> @llvm.experimental.constrained.fma.v2f32(<2 x float> %vb, <2 x float> %splat, <2 x float> %va, metadata !"round.dynamic", metadata !"fpexcept.strict")141  ret <2 x float> %vd142}143 144define <4 x float> @vfmadd_vv_v4f32(<4 x float> %va, <4 x float> %vb, <4 x float> %vc) strictfp {145; CHECK-LABEL: vfmadd_vv_v4f32:146; CHECK:       # %bb.0:147; CHECK-NEXT:    vsetivli zero, 4, e32, m1, ta, ma148; CHECK-NEXT:    vfmadd.vv v8, v9, v10149; CHECK-NEXT:    ret150  %vd = call <4 x float> @llvm.experimental.constrained.fma.v4f32(<4 x float> %vb, <4 x float> %va, <4 x float> %vc, metadata !"round.dynamic", metadata !"fpexcept.strict")151  ret <4 x float> %vd152}153 154define <4 x float> @vfmadd_vf_v4f32(<4 x float> %va, <4 x float> %vb, float %c) strictfp {155; CHECK-LABEL: vfmadd_vf_v4f32:156; CHECK:       # %bb.0:157; CHECK-NEXT:    vsetivli zero, 4, e32, m1, ta, ma158; CHECK-NEXT:    vfmadd.vf v8, fa0, v9159; CHECK-NEXT:    ret160  %head = insertelement <4 x float> poison, float %c, i32 0161  %splat = shufflevector <4 x float> %head, <4 x float> poison, <4 x i32> zeroinitializer162  %vd = call <4 x float> @llvm.experimental.constrained.fma.v4f32(<4 x float> %va, <4 x float> %splat, <4 x float> %vb, metadata !"round.dynamic", metadata !"fpexcept.strict")163  ret <4 x float> %vd164}165 166define <8 x float> @vfmadd_vv_v8f32(<8 x float> %va, <8 x float> %vb, <8 x float> %vc) strictfp {167; CHECK-LABEL: vfmadd_vv_v8f32:168; CHECK:       # %bb.0:169; CHECK-NEXT:    vsetivli zero, 8, e32, m2, ta, ma170; CHECK-NEXT:    vfmacc.vv v8, v12, v10171; CHECK-NEXT:    ret172  %vd = call <8 x float> @llvm.experimental.constrained.fma.v8f32(<8 x float> %vb, <8 x float> %vc, <8 x float> %va, metadata !"round.dynamic", metadata !"fpexcept.strict")173  ret <8 x float> %vd174}175 176define <8 x float> @vfmadd_vf_v8f32(<8 x float> %va, <8 x float> %vb, float %c) strictfp {177; CHECK-LABEL: vfmadd_vf_v8f32:178; CHECK:       # %bb.0:179; CHECK-NEXT:    vsetivli zero, 8, e32, m2, ta, ma180; CHECK-NEXT:    vfmacc.vf v8, fa0, v10181; CHECK-NEXT:    ret182  %head = insertelement <8 x float> poison, float %c, i32 0183  %splat = shufflevector <8 x float> %head, <8 x float> poison, <8 x i32> zeroinitializer184  %vd = call <8 x float> @llvm.experimental.constrained.fma.v8f32(<8 x float> %vb, <8 x float> %splat, <8 x float> %va, metadata !"round.dynamic", metadata !"fpexcept.strict")185  ret <8 x float> %vd186}187 188define <16 x float> @vfmadd_vv_v16f32(<16 x float> %va, <16 x float> %vb, <16 x float> %vc) strictfp {189; CHECK-LABEL: vfmadd_vv_v16f32:190; CHECK:       # %bb.0:191; CHECK-NEXT:    vsetivli zero, 16, e32, m4, ta, ma192; CHECK-NEXT:    vfmadd.vv v8, v16, v12193; CHECK-NEXT:    ret194  %vd = call <16 x float> @llvm.experimental.constrained.fma.v16f32(<16 x float> %vc, <16 x float> %va, <16 x float> %vb, metadata !"round.dynamic", metadata !"fpexcept.strict")195  ret <16 x float> %vd196}197 198define <16 x float> @vfmadd_vf_v16f32(<16 x float> %va, <16 x float> %vb, float %c) strictfp {199; CHECK-LABEL: vfmadd_vf_v16f32:200; CHECK:       # %bb.0:201; CHECK-NEXT:    vsetivli zero, 16, e32, m4, ta, ma202; CHECK-NEXT:    vfmadd.vf v8, fa0, v12203; CHECK-NEXT:    ret204  %head = insertelement <16 x float> poison, float %c, i32 0205  %splat = shufflevector <16 x float> %head, <16 x float> poison, <16 x i32> zeroinitializer206  %vd = call <16 x float> @llvm.experimental.constrained.fma.v16f32(<16 x float> %va, <16 x float> %splat, <16 x float> %vb, metadata !"round.dynamic", metadata !"fpexcept.strict")207  ret <16 x float> %vd208}209 210define <2 x double> @vfmadd_vv_v2f64(<2 x double> %va, <2 x double> %vb, <2 x double> %vc) strictfp {211; CHECK-LABEL: vfmadd_vv_v2f64:212; CHECK:       # %bb.0:213; CHECK-NEXT:    vsetivli zero, 2, e64, m1, ta, ma214; CHECK-NEXT:    vfmadd.vv v8, v10, v9215; CHECK-NEXT:    ret216  %vd = call <2 x double> @llvm.experimental.constrained.fma.v2f64(<2 x double> %va, <2 x double> %vc, <2 x double> %vb, metadata !"round.dynamic", metadata !"fpexcept.strict")217  ret <2 x double> %vd218}219 220define <2 x double> @vfmadd_vf_v2f64(<2 x double> %va, <2 x double> %vb, double %c) strictfp {221; CHECK-LABEL: vfmadd_vf_v2f64:222; CHECK:       # %bb.0:223; CHECK-NEXT:    vsetivli zero, 2, e64, m1, ta, ma224; CHECK-NEXT:    vfmacc.vf v8, fa0, v9225; CHECK-NEXT:    ret226  %head = insertelement <2 x double> poison, double %c, i32 0227  %splat = shufflevector <2 x double> %head, <2 x double> poison, <2 x i32> zeroinitializer228  %vd = call <2 x double> @llvm.experimental.constrained.fma.v2f64(<2 x double> %vb, <2 x double> %splat, <2 x double> %va, metadata !"round.dynamic", metadata !"fpexcept.strict")229  ret <2 x double> %vd230}231 232define <4 x double> @vfmadd_vv_v4f64(<4 x double> %va, <4 x double> %vb, <4 x double> %vc) strictfp {233; CHECK-LABEL: vfmadd_vv_v4f64:234; CHECK:       # %bb.0:235; CHECK-NEXT:    vsetivli zero, 4, e64, m2, ta, ma236; CHECK-NEXT:    vfmadd.vv v8, v10, v12237; CHECK-NEXT:    ret238  %vd = call <4 x double> @llvm.experimental.constrained.fma.v4f64(<4 x double> %vb, <4 x double> %va, <4 x double> %vc, metadata !"round.dynamic", metadata !"fpexcept.strict")239  ret <4 x double> %vd240}241 242define <4 x double> @vfmadd_vf_v4f64(<4 x double> %va, <4 x double> %vb, double %c) strictfp {243; CHECK-LABEL: vfmadd_vf_v4f64:244; CHECK:       # %bb.0:245; CHECK-NEXT:    vsetivli zero, 4, e64, m2, ta, ma246; CHECK-NEXT:    vfmadd.vf v8, fa0, v10247; CHECK-NEXT:    ret248  %head = insertelement <4 x double> poison, double %c, i32 0249  %splat = shufflevector <4 x double> %head, <4 x double> poison, <4 x i32> zeroinitializer250  %vd = call <4 x double> @llvm.experimental.constrained.fma.v4f64(<4 x double> %va, <4 x double> %splat, <4 x double> %vb, metadata !"round.dynamic", metadata !"fpexcept.strict")251  ret <4 x double> %vd252}253 254define <8 x double> @vfmadd_vv_v8f64(<8 x double> %va, <8 x double> %vb, <8 x double> %vc) strictfp {255; CHECK-LABEL: vfmadd_vv_v8f64:256; CHECK:       # %bb.0:257; CHECK-NEXT:    vsetivli zero, 8, e64, m4, ta, ma258; CHECK-NEXT:    vfmacc.vv v8, v16, v12259; CHECK-NEXT:    ret260  %vd = call <8 x double> @llvm.experimental.constrained.fma.v8f64(<8 x double> %vb, <8 x double> %vc, <8 x double> %va, metadata !"round.dynamic", metadata !"fpexcept.strict")261  ret <8 x double> %vd262}263 264define <8 x double> @vfmadd_vf_v8f64(<8 x double> %va, <8 x double> %vb, double %c) strictfp {265; CHECK-LABEL: vfmadd_vf_v8f64:266; CHECK:       # %bb.0:267; CHECK-NEXT:    vsetivli zero, 8, e64, m4, ta, ma268; CHECK-NEXT:    vfmacc.vf v8, fa0, v12269; CHECK-NEXT:    ret270  %head = insertelement <8 x double> poison, double %c, i32 0271  %splat = shufflevector <8 x double> %head, <8 x double> poison, <8 x i32> zeroinitializer272  %vd = call <8 x double> @llvm.experimental.constrained.fma.v8f64(<8 x double> %vb, <8 x double> %splat, <8 x double> %va, metadata !"round.dynamic", metadata !"fpexcept.strict")273  ret <8 x double> %vd274}275