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