; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py ; RUN: llc -mtriple=riscv32 -mattr=+d,+zvfh,+v,+m -target-abi=ilp32d \ ; RUN: -verify-machineinstrs < %s | FileCheck --check-prefixes=CHECK,RV32 %s ; RUN: llc -mtriple=riscv64 -mattr=+d,+zvfh,+v,+m -target-abi=lp64d \ ; RUN: -verify-machineinstrs < %s | FileCheck --check-prefixes=CHECK,RV64 %s ; (-N0 * -N1) + N2 --> (N0 * N1) + N2 define @test1( %a, %b, %c, %m, i32 zeroext %evl) { ; CHECK-LABEL: test1: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a0, zero, e64, m1, ta, ma ; CHECK-NEXT: vfmadd.vv v8, v9, v10 ; CHECK-NEXT: ret %nega = call @llvm.vp.fneg.nxv1f64( %a, %m, i32 %evl) %negb = call @llvm.vp.fneg.nxv1f64( %b, %m, i32 %evl) %v = call @llvm.vp.fma.nxv1f64( %nega, %negb, %c, %m, i32 %evl) ret %v } ; (fma x, c1, (fmul x, c2)) -> (fmul x, c1+c2) define @test2( %a, %m, i32 zeroext %evl) { ; RV32-LABEL: test2: ; RV32: # %bb.0: ; RV32-NEXT: lui a0, %hi(.LCPI1_0) ; RV32-NEXT: fld fa5, %lo(.LCPI1_0)(a0) ; RV32-NEXT: vsetvli a0, zero, e64, m1, ta, ma ; RV32-NEXT: vfmul.vf v8, v8, fa5 ; RV32-NEXT: ret ; ; RV64-LABEL: test2: ; RV64: # %bb.0: ; RV64-NEXT: lui a0, 2051 ; RV64-NEXT: slli a0, a0, 39 ; RV64-NEXT: fmv.d.x fa5, a0 ; RV64-NEXT: vsetvli a0, zero, e64, m1, ta, ma ; RV64-NEXT: vfmul.vf v8, v8, fa5 ; RV64-NEXT: ret %t = call @llvm.vp.fmul.nxv1f64( %a, splat (double 2.0), %m, i32 %evl) %v = call fast @llvm.vp.fma.nxv1f64( %a, splat (double 4.0), %t, %m, i32 %evl) ret %v } ; (fma (fmul x, c1), c2, y) -> (fma x, c1*c2, y) define @test3( %a, %b, %m, i32 zeroext %evl) { ; RV32-LABEL: test3: ; RV32: # %bb.0: ; RV32-NEXT: lui a0, %hi(.LCPI2_0) ; RV32-NEXT: fld fa5, %lo(.LCPI2_0)(a0) ; RV32-NEXT: vsetvli a0, zero, e64, m1, ta, ma ; RV32-NEXT: vfmadd.vf v8, fa5, v9 ; RV32-NEXT: ret ; ; RV64-LABEL: test3: ; RV64: # %bb.0: ; RV64-NEXT: li a0, 513 ; RV64-NEXT: slli a0, a0, 53 ; RV64-NEXT: fmv.d.x fa5, a0 ; RV64-NEXT: vsetvli a0, zero, e64, m1, ta, ma ; RV64-NEXT: vfmadd.vf v8, fa5, v9 ; RV64-NEXT: ret %t = call @llvm.vp.fmul.nxv1f64( %a, splat (double 2.0), %m, i32 %evl) %v = call fast @llvm.vp.fma.nxv1f64( %t, splat (double 4.0), %b, %m, i32 %evl) ret %v }