[llvm-branch-commits] [clang] 9caf9fc - Revert "DAGCombiner: Drop AllowFPOpFusion from visitFADDForFMACombine (#221436)"

via llvm-branch-commits llvm-branch-commits at lists.llvm.org
Sun Sep 6 05:22:35 PDT 2026


Author: Matt Arsenault
Date: 2026-09-06T14:22:31+02:00
New Revision: 9caf9fc3c0b598e728fea8d171dd66309170560a

URL: https://github.com/llvm/llvm-project/commit/9caf9fc3c0b598e728fea8d171dd66309170560a
DIFF: https://github.com/llvm/llvm-project/commit/9caf9fc3c0b598e728fea8d171dd66309170560a.diff

LOG: Revert "DAGCombiner: Drop AllowFPOpFusion from visitFADDForFMACombine (#221436)"

This reverts commit 44888f035b0f6049d6fae38addb02adf7d53c803.

Added: 
    

Modified: 
    clang/test/CodeGenCUDA/fp-contract.cu
    llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
    llvm/test/CodeGen/AArch64/arm64-fma-combine-with-fpfusion.ll
    llvm/test/CodeGen/AArch64/fp-dp3.ll
    llvm/test/CodeGen/AArch64/neon-fma.ll
    llvm/test/CodeGen/AMDGPU/madak.ll
    llvm/test/CodeGen/Hexagon/float-amode.ll
    llvm/test/CodeGen/Hexagon/fmadd.ll
    llvm/test/CodeGen/Hexagon/fp_latency.ll
    llvm/test/CodeGen/LoongArch/double-fma.ll
    llvm/test/CodeGen/LoongArch/float-fma.ll
    llvm/test/CodeGen/LoongArch/lasx/fma-v4f64.ll
    llvm/test/CodeGen/LoongArch/lasx/fma-v8f32.ll
    llvm/test/CodeGen/LoongArch/lsx/fma-v2f64.ll
    llvm/test/CodeGen/LoongArch/lsx/fma-v4f32.ll
    llvm/test/CodeGen/PowerPC/a2-fp-basic.ll
    llvm/test/CodeGen/PowerPC/fma-assoc.ll
    llvm/test/CodeGen/PowerPC/fma-ext.ll
    llvm/test/CodeGen/PowerPC/fma.ll
    llvm/test/CodeGen/PowerPC/ppc440-fp-basic.ll
    llvm/test/CodeGen/PowerPC/vsx-fma-mutate-trivial-copy.ll
    llvm/test/CodeGen/SPARC/float-ua2007.ll
    llvm/test/CodeGen/Thumb2/mve-fmas.ll

Removed: 
    


################################################################################
diff  --git a/clang/test/CodeGenCUDA/fp-contract.cu b/clang/test/CodeGenCUDA/fp-contract.cu
index d98d5ca3f462b..8e2942fc8104d 100644
--- a/clang/test/CodeGenCUDA/fp-contract.cu
+++ b/clang/test/CodeGenCUDA/fp-contract.cu
@@ -252,16 +252,21 @@ __host__ __device__ float func2(float a, float b, float c) {
 // AMD-OPT-OFF-NEXT: v_add_f32_e32
 // AMD-OPT-OFF-NEXT: s_setpc_b64
 
-// Test multiply/add in the 
diff erent statements, which is forced to be compiled
-// with fp contract on. fmul/fadd without contract flags are emitted in IR.
+// Test multiply/add in the 
diff erent statements, which is forced
+// to be compiled with fp contract on. fmul/fadd without contract
+// flags are emitted in IR. In nvptx, they are emitted as FMA in
+// fp-contract is fast but not on, as nvptx backend uses the same
+// fp fuse option as front end, whereas fast fp fuse option in
+// backend fuses fadd/fmul disregarding contract flag. In amdgcn
+// they are not fused as amdgcn always use standard fp fusion
+// option which respects contract flag.
   __host__ __device__ float func3(float a, float b, float c) {
 #pragma clang fp contract(on)
   float t = b * c;
   return t + a;
 }
 // COMMON-LABEL: _Z5func3fff
-// NV-OPT-FAST: mul.rn.f32
-// NV-OPT-FAST: add.rn.f32
+// NV-OPT-FAST: fma.rn.f32
 // NV-OPT-FAST-NEXT: st.param.b32
 // NV-OPT-FASTSTD: mul.rn.f32
 // NV-OPT-FASTSTD: add.rn.f32
@@ -280,8 +285,7 @@ __host__ __device__ float func2(float a, float b, float c) {
 // AMD-OPT-OFF-IR: fmul float
 // AMD-OPT-OFF-IR: fadd float
 
-// AMD-OPT-FAST: v_mul_f32_e32
-// AMD-OPT-FAST-NEXT: v_add_f32_e32
+// AMD-OPT-FAST: v_fmac_f32_e32
 // AMD-OPT-FAST-NEXT: s_setpc_b64
 // AMD-OPT-FASTSTD: v_mul_f32_e32
 // AMD-OPT-FASTSTD-NEXT: v_add_f32_e32

diff  --git a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
index 82d4921ae405b..70e23360ed9ea 100644
--- a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
@@ -18679,6 +18679,7 @@ SDValue DAGCombiner::visitFADDForFMACombine(SDNode *N) {
   SDValue N1 = N->getOperand(1);
   EVT VT = N->getValueType(0);
   SDLoc SL(N);
+  const TargetOptions &Options = DAG.getTarget().Options;
 
   // Floating-point multiply-add with intermediate rounding.
   bool HasFMAD = (LegalOperations && TLI.isFMADLegal(DAG, N));
@@ -18692,9 +18693,8 @@ SDValue DAGCombiner::visitFADDForFMACombine(SDNode *N) {
   if (!HasFMAD && !HasFMA)
     return SDValue();
 
-  // FMAD (with intermediate rounding) is always safe to form; FMA requires the
-  // contract fast-math flag.
-  bool AllowFusionGlobally = HasFMAD;
+  bool AllowFusionGlobally =
+      Options.AllowFPOpFusion == FPOpFusion::Fast || HasFMAD;
   // If the addition is not contractable, do not combine.
   if (!AllowFusionGlobally && !N->getFlags().hasAllowContract())
     return SDValue();

diff  --git a/llvm/test/CodeGen/AArch64/arm64-fma-combine-with-fpfusion.ll b/llvm/test/CodeGen/AArch64/arm64-fma-combine-with-fpfusion.ll
index daa9d38db78e3..0ddcdccca4ec4 100644
--- a/llvm/test/CodeGen/AArch64/arm64-fma-combine-with-fpfusion.ll
+++ b/llvm/test/CodeGen/AArch64/arm64-fma-combine-with-fpfusion.ll
@@ -1,10 +1,10 @@
-; RUN: llc < %s -mtriple=aarch64-linux-gnu | FileCheck %s
+; RUN: llc < %s -mtriple=aarch64-linux-gnu -fp-contract=fast | FileCheck %s
 define float @mul_add(float %a, float %b, float %c) local_unnamed_addr #0 {
 ; CHECK-LABEL: %entry
 ; CHECK: fmadd {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}
   entry:
-    %mul = fmul contract float %a, %b
-    %add = fadd contract float %mul, %c
+    %mul = fmul float %a, %b
+    %add = fadd float %mul, %c
     ret float %add
 }
 

diff  --git a/llvm/test/CodeGen/AArch64/fp-dp3.ll b/llvm/test/CodeGen/AArch64/fp-dp3.ll
index e5736eeb5c275..10f88fdbbe962 100644
--- a/llvm/test/CodeGen/AArch64/fp-dp3.ll
+++ b/llvm/test/CodeGen/AArch64/fp-dp3.ll
@@ -1,177 +1,137 @@
-; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 6
-; RUN: llc -mtriple=aarch64-none-linux < %s | FileCheck %s
+; RUN: llc -verify-machineinstrs -o - %s -mtriple=aarch64-none-linux-gnu -fp-contract=fast | FileCheck %s
+; RUN: llc -verify-machineinstrs -o - %s -mtriple=arm64-apple-ios7.0 | FileCheck %s -check-prefix=CHECK-NOFAST
 
 declare float @llvm.fma.f32(float, float, float)
 declare double @llvm.fma.f64(double, double, double)
 
 define float @test_fmadd(float %a, float %b, float %c) {
 ; CHECK-LABEL: test_fmadd:
-; CHECK:       // %bb.0:
-; CHECK-NEXT:    fmadd s0, s0, s1, s2
-; CHECK-NEXT:    ret
+; CHECK-NOFAST-LABEL: test_fmadd:
   %val = call float @llvm.fma.f32(float %a, float %b, float %c)
+; CHECK: fmadd {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}
+; CHECK-NOFAST: fmadd {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}
   ret float %val
 }
 
 define float @test_fmsub(float %a, float %b, float %c) {
 ; CHECK-LABEL: test_fmsub:
-; CHECK:       // %bb.0:
-; CHECK-NEXT:    fmsub s0, s0, s1, s2
-; CHECK-NEXT:    ret
+; CHECK-NOFAST-LABEL: test_fmsub:
   %nega = fsub float -0.0, %a
   %val = call float @llvm.fma.f32(float %nega, float %b, float %c)
+; CHECK: fmsub {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}
+; CHECK-NOFAST: fmsub {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}
   ret float %val
 }
 
 define float @test_fnmadd(float %a, float %b, float %c) {
 ; CHECK-LABEL: test_fnmadd:
-; CHECK:       // %bb.0:
-; CHECK-NEXT:    fnmadd s0, s0, s1, s2
-; CHECK-NEXT:    ret
+; CHECK-NOFAST-LABEL: test_fnmadd:
   %nega = fsub float -0.0, %a
   %negc = fsub float -0.0, %c
   %val = call float @llvm.fma.f32(float %nega, float %b, float %negc)
+; CHECK: fnmadd {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}
+; CHECK-NOFAST: fnmadd {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}
   ret float %val
 }
 
 define float @test_fnmsub(float %a, float %b, float %c) {
 ; CHECK-LABEL: test_fnmsub:
-; CHECK:       // %bb.0:
-; CHECK-NEXT:    fnmsub s0, s0, s1, s2
-; CHECK-NEXT:    ret
+; CHECK-NOFAST-LABEL: test_fnmsub:
   %negc = fsub float -0.0, %c
   %val = call float @llvm.fma.f32(float %a, float %b, float %negc)
+; CHECK: fnmsub {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}
+; CHECK-NOFAST: fnmsub {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}
   ret float %val
 }
 
 define double @testd_fmadd(double %a, double %b, double %c) {
 ; CHECK-LABEL: testd_fmadd:
-; CHECK:       // %bb.0:
-; CHECK-NEXT:    fmadd d0, d0, d1, d2
-; CHECK-NEXT:    ret
+; CHECK-NOFAST-LABEL: testd_fmadd:
   %val = call double @llvm.fma.f64(double %a, double %b, double %c)
+; CHECK: fmadd {{d[0-9]+}}, {{d[0-9]+}}, {{d[0-9]+}}, {{d[0-9]+}}
+; CHECK-NOFAST: fmadd {{d[0-9]+}}, {{d[0-9]+}}, {{d[0-9]+}}, {{d[0-9]+}}
   ret double %val
 }
 
 define double @testd_fmsub(double %a, double %b, double %c) {
 ; CHECK-LABEL: testd_fmsub:
-; CHECK:       // %bb.0:
-; CHECK-NEXT:    fmsub d0, d0, d1, d2
-; CHECK-NEXT:    ret
+; CHECK-NOFAST-LABEL: testd_fmsub:
   %nega = fsub double -0.0, %a
   %val = call double @llvm.fma.f64(double %nega, double %b, double %c)
+; CHECK: fmsub {{d[0-9]+}}, {{d[0-9]+}}, {{d[0-9]+}}, {{d[0-9]+}}
+; CHECK-NOFAST: fmsub {{d[0-9]+}}, {{d[0-9]+}}, {{d[0-9]+}}, {{d[0-9]+}}
   ret double %val
 }
 
 define double @testd_fnmadd(double %a, double %b, double %c) {
 ; CHECK-LABEL: testd_fnmadd:
-; CHECK:       // %bb.0:
-; CHECK-NEXT:    fnmadd d0, d0, d1, d2
-; CHECK-NEXT:    ret
+; CHECK-NOFAST-LABEL: testd_fnmadd:
   %nega = fsub double -0.0, %a
   %negc = fsub double -0.0, %c
   %val = call double @llvm.fma.f64(double %nega, double %b, double %negc)
+; CHECK: fnmadd {{d[0-9]+}}, {{d[0-9]+}}, {{d[0-9]+}}, {{d[0-9]+}}
+; CHECK-NOFAST: fnmadd {{d[0-9]+}}, {{d[0-9]+}}, {{d[0-9]+}}, {{d[0-9]+}}
   ret double %val
 }
 
 define double @testd_fnmsub(double %a, double %b, double %c) {
 ; CHECK-LABEL: testd_fnmsub:
-; CHECK:       // %bb.0:
-; CHECK-NEXT:    fnmsub d0, d0, d1, d2
-; CHECK-NEXT:    ret
+; CHECK-NOFAST-LABEL: testd_fnmsub:
   %negc = fsub double -0.0, %c
   %val = call double @llvm.fma.f64(double %a, double %b, double %negc)
+; CHECK: fnmsub {{d[0-9]+}}, {{d[0-9]+}}, {{d[0-9]+}}, {{d[0-9]+}}
+; CHECK-NOFAST: fnmsub {{d[0-9]+}}, {{d[0-9]+}}, {{d[0-9]+}}, {{d[0-9]+}}
   ret double %val
 }
 
 define float @test_fmadd_unfused(float %a, float %b, float %c) {
 ; CHECK-LABEL: test_fmadd_unfused:
-; CHECK:       // %bb.0:
-; CHECK-NEXT:    fmul s1, s1, s2
-; CHECK-NEXT:    fadd s0, s0, s1
-; CHECK-NEXT:    ret
+; CHECK-NOFAST-LABEL: test_fmadd_unfused:
   %prod = fmul float %b, %c
   %sum = fadd float %a, %prod
+; CHECK: fmadd {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}
+; CHECK-NOFAST-NOT: fmadd {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}
+; CHECK-NOFAST: fmul {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}
+; CHECK-NOFAST: fadd {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}
   ret float %sum
 }
 
 define float @test_fmsub_unfused(float %a, float %b, float %c) {
 ; CHECK-LABEL: test_fmsub_unfused:
-; CHECK:       // %bb.0:
-; CHECK-NEXT:    fmul s1, s1, s2
-; CHECK-NEXT:    fsub s0, s0, s1
-; CHECK-NEXT:    ret
+; CHECK-NOFAST-LABEL: test_fmsub_unfused:
   %prod = fmul float %b, %c
   %
diff  = fsub float %a, %prod
+; CHECK: fmsub {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}
+; CHECK-NOFAST-NOT: fmsub {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}
+; CHECK-NOFAST: fmul {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}
+; CHECK-NOFAST: fsub {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}
   ret float %
diff 
 }
 
 define float @test_fnmadd_unfused(float %a, float %b, float %c) {
 ; CHECK-LABEL: test_fnmadd_unfused:
-; CHECK:       // %bb.0:
-; CHECK-NEXT:    fneg s0, s0
-; CHECK-NEXT:    fmul s1, s1, s2
-; CHECK-NEXT:    fsub s0, s0, s1
-; CHECK-NEXT:    ret
+; CHECK-NOFAST-LABEL: test_fnmadd_unfused:
   %nega = fsub float -0.0, %a
   %prod = fmul float %b, %c
   %
diff  = fsub float %nega, %prod
+; CHECK: fnmadd {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}
+; CHECK-NOFAST-NOT: fnmadd {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}
+; CHECK-NOFAST: fmul {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}
+; CHECK-NOFAST: fsub {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}
+; CHECK-NOFAST: ret
   ret float %
diff 
 }
 
 define float @test_fnmsub_unfused(float %a, float %b, float %c) {
 ; CHECK-LABEL: test_fnmsub_unfused:
-; CHECK:       // %bb.0:
-; CHECK-NEXT:    fmul s1, s1, s2
-; CHECK-NEXT:    fsub s0, s1, s0
-; CHECK-NEXT:    ret
+; CHECK-NOFAST-LABEL: test_fnmsub_unfused:
   %nega = fsub float -0.0, %a
   %prod = fmul float %b, %c
   %sum = fadd float %nega, %prod
-  ret float %sum
-}
-
-; With the contract flag the multiply and add/subtract fuse to a single op.
-
-define float @test_fmadd_contract(float %a, float %b, float %c) {
-; CHECK-LABEL: test_fmadd_contract:
-; CHECK:       // %bb.0:
-; CHECK-NEXT:    fmadd s0, s1, s2, s0
-; CHECK-NEXT:    ret
-  %prod = fmul contract float %b, %c
-  %sum = fadd contract float %a, %prod
-  ret float %sum
-}
-
-define float @test_fmsub_contract(float %a, float %b, float %c) {
-; CHECK-LABEL: test_fmsub_contract:
-; CHECK:       // %bb.0:
-; CHECK-NEXT:    fmsub s0, s1, s2, s0
-; CHECK-NEXT:    ret
-  %prod = fmul contract float %b, %c
-  %
diff  = fsub contract float %a, %prod
-  ret float %
diff 
-}
-
-define float @test_fnmadd_contract(float %a, float %b, float %c) {
-; CHECK-LABEL: test_fnmadd_contract:
-; CHECK:       // %bb.0:
-; CHECK-NEXT:    fnmadd s0, s1, s2, s0
-; CHECK-NEXT:    ret
-  %nega = fsub float -0.0, %a
-  %prod = fmul contract float %b, %c
-  %
diff  = fsub contract float %nega, %prod
-  ret float %
diff 
-}
-
-define float @test_fnmsub_contract(float %a, float %b, float %c) {
-; CHECK-LABEL: test_fnmsub_contract:
-; CHECK:       // %bb.0:
-; CHECK-NEXT:    fnmsub s0, s1, s2, s0
-; CHECK-NEXT:    ret
-  %nega = fsub float -0.0, %a
-  %prod = fmul contract float %b, %c
-  %sum = fadd contract float %nega, %prod
+; CHECK: fnmsub {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}
+; CHECK-NOFAST-NOT: fnmsub {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}
+; CHECK-NOFAST: fmul {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}
+; CHECK-NOFAST: fsub {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}
   ret float %sum
 }
 
@@ -179,27 +139,25 @@ define float @test_fnmsub_contract(float %a, float %b, float %c) {
 
 define float @test_fmadd_unfused_su(float %a, float %b, float %c) {
 ; CHECK-LABEL: test_fmadd_unfused_su:
-; CHECK:       // %bb.0:
-; CHECK-NEXT:    fmul s1, s1, s2
-; CHECK-NEXT:    fadd s0, s0, s1
-; CHECK-NEXT:    fadd s0, s0, s1
-; CHECK-NEXT:    ret
   %prod = fmul float %b, %c
   %sum = fadd float %a, %prod
   %res = fadd float %sum, %prod
+; CHECK-NOT: fmadd {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}
+; CHECK: fmul {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}
+; CHECK: fadd {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}
+; CHECK: fadd {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}
   ret float %res
 }
 
 define float @test_fmsub_unfused_su(float %a, float %b, float %c) {
 ; CHECK-LABEL: test_fmsub_unfused_su:
-; CHECK:       // %bb.0:
-; CHECK-NEXT:    fmul s1, s1, s2
-; CHECK-NEXT:    fsub s0, s0, s1
-; CHECK-NEXT:    fsub s0, s0, s1
-; CHECK-NEXT:    ret
   %prod = fmul float %b, %c
   %
diff  = fsub float %a, %prod
   %res = fsub float %
diff , %prod
+; CHECK-NOT: fmsub {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}
+; CHECK: fmul {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}
+; CHECK: fsub {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}
+; CHECK: fsub {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}
   ret float %res
 }
 

diff  --git a/llvm/test/CodeGen/AArch64/neon-fma.ll b/llvm/test/CodeGen/AArch64/neon-fma.ll
index 25aeb6be65939..af70302ca939c 100644
--- a/llvm/test/CodeGen/AArch64/neon-fma.ll
+++ b/llvm/test/CodeGen/AArch64/neon-fma.ll
@@ -1,45 +1,45 @@
-; RUN: llc < %s -verify-machineinstrs -mtriple=aarch64-none-linux-gnu -mattr=+neon | FileCheck %s
+; RUN: llc < %s -verify-machineinstrs -mtriple=aarch64-none-linux-gnu -mattr=+neon -fp-contract=fast | FileCheck %s
 
 define <2 x float> @fmla2xfloat(<2 x float> %A, <2 x float> %B, <2 x float> %C) {
 ;CHECK: fmla {{v[0-9]+}}.2s, {{v[0-9]+}}.2s, {{v[0-9]+}}.2s
-	%tmp1 = fmul contract <2 x float> %A, %B;
-	%tmp2 = fadd contract <2 x float> %C, %tmp1;
+	%tmp1 = fmul <2 x float> %A, %B;
+	%tmp2 = fadd <2 x float> %C, %tmp1;
 	ret <2 x float> %tmp2
 }
 
 define <4 x float> @fmla4xfloat(<4 x float> %A, <4 x float> %B, <4 x float> %C) {
 ;CHECK: fmla {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s
-	%tmp1 = fmul contract <4 x float> %A, %B;
-	%tmp2 = fadd contract <4 x float> %C, %tmp1;
+	%tmp1 = fmul <4 x float> %A, %B;
+	%tmp2 = fadd <4 x float> %C, %tmp1;
 	ret <4 x float> %tmp2
 }
 
 define <2 x double> @fmla2xdouble(<2 x double> %A, <2 x double> %B, <2 x double> %C) {
 ;CHECK: fmla {{v[0-9]+}}.2d, {{v[0-9]+}}.2d, {{v[0-9]+}}.2d
-	%tmp1 = fmul contract <2 x double> %A, %B;
-	%tmp2 = fadd contract <2 x double> %C, %tmp1;
+	%tmp1 = fmul <2 x double> %A, %B;
+	%tmp2 = fadd <2 x double> %C, %tmp1;
 	ret <2 x double> %tmp2
 }
 
 
 define <2 x float> @fmls2xfloat(<2 x float> %A, <2 x float> %B, <2 x float> %C) {
 ;CHECK: fmls {{v[0-9]+}}.2s, {{v[0-9]+}}.2s, {{v[0-9]+}}.2s
-	%tmp1 = fmul contract <2 x float> %A, %B;
-	%tmp2 = fsub contract <2 x float> %C, %tmp1;
+	%tmp1 = fmul <2 x float> %A, %B;
+	%tmp2 = fsub <2 x float> %C, %tmp1;
 	ret <2 x float> %tmp2
 }
 
 define <4 x float> @fmls4xfloat(<4 x float> %A, <4 x float> %B, <4 x float> %C) {
 ;CHECK: fmls {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s
-	%tmp1 = fmul contract <4 x float> %A, %B;
-	%tmp2 = fsub contract <4 x float> %C, %tmp1;
+	%tmp1 = fmul <4 x float> %A, %B;
+	%tmp2 = fsub <4 x float> %C, %tmp1;
 	ret <4 x float> %tmp2
 }
 
 define <2 x double> @fmls2xdouble(<2 x double> %A, <2 x double> %B, <2 x double> %C) {
 ;CHECK: fmls {{v[0-9]+}}.2d, {{v[0-9]+}}.2d, {{v[0-9]+}}.2d
-	%tmp1 = fmul contract <2 x double> %A, %B;
-	%tmp2 = fsub contract <2 x double> %C, %tmp1;
+	%tmp1 = fmul <2 x double> %A, %B;
+	%tmp2 = fsub <2 x double> %C, %tmp1;
 	ret <2 x double> %tmp2
 }
 

diff  --git a/llvm/test/CodeGen/AMDGPU/madak.ll b/llvm/test/CodeGen/AMDGPU/madak.ll
index 4e640573c0193..211b93e9ace29 100644
--- a/llvm/test/CodeGen/AMDGPU/madak.ll
+++ b/llvm/test/CodeGen/AMDGPU/madak.ll
@@ -2,10 +2,13 @@
 ; RUN: llc -mtriple=amdgpu6.00 < %s | FileCheck -check-prefixes=GFX6 %s
 ; RUN: llc -mtriple=amdgpu8.02 < %s | FileCheck -check-prefixes=GFX8 %s
 ; RUN: llc -mtriple=amdgpu9.00 < %s | FileCheck -check-prefixes=GFX9 %s
-; RUN: llc -mtriple=amdgpu9.42 < %s | FileCheck -check-prefixes=GFX942 %s
 ; RUN: llc -mtriple=amdgpu10.10 < %s | FileCheck -check-prefixes=GFX10-MAD %s
 ; RUN: llc -mtriple=amdgpu11.00 < %s | FileCheck -check-prefixes=GFX11-MAD %s
 
+; RUN: llc -mtriple=amdgpu9.42 -fp-contract=fast < %s | FileCheck -check-prefixes=GFX942-FMA %s
+; RUN: llc -mtriple=amdgpu10.10 -fp-contract=fast < %s | FileCheck -check-prefixes=GFX10-FMA %s
+; RUN: llc -mtriple=amdgpu11.00 -fp-contract=fast < %s | FileCheck -check-prefixes=GFX11-FMA %s
+
 declare i32 @llvm.amdgcn.workitem.id.x() nounwind readnone
 declare float @llvm.fabs.f32(float) nounwind readnone
 
@@ -64,21 +67,6 @@ define amdgpu_kernel void @madak_f32(ptr addrspace(1) noalias %out, ptr addrspac
 ; GFX9-NEXT:    global_store_dword v0, v1, s[0:1]
 ; GFX9-NEXT:    s_endpgm
 ;
-; GFX942-LABEL: madak_f32:
-; GFX942:       ; %bb.0:
-; GFX942-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x24
-; GFX942-NEXT:    s_load_dwordx2 s[6:7], s[4:5], 0x34
-; GFX942-NEXT:    v_and_b32_e32 v0, 0x3ff, v0
-; GFX942-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
-; GFX942-NEXT:    s_waitcnt lgkmcnt(0)
-; GFX942-NEXT:    global_load_dword v1, v0, s[2:3]
-; GFX942-NEXT:    global_load_dword v2, v0, s[6:7]
-; GFX942-NEXT:    s_waitcnt vmcnt(0)
-; GFX942-NEXT:    v_mul_f32_e32 v1, v1, v2
-; GFX942-NEXT:    v_add_f32_e32 v1, 0x41200000, v1
-; GFX942-NEXT:    global_store_dword v0, v1, s[0:1]
-; GFX942-NEXT:    s_endpgm
-;
 ; GFX10-MAD-LABEL: madak_f32:
 ; GFX10-MAD:       ; %bb.0:
 ; GFX10-MAD-NEXT:    s_clause 0x1
@@ -112,6 +100,52 @@ define amdgpu_kernel void @madak_f32(ptr addrspace(1) noalias %out, ptr addrspac
 ; GFX11-MAD-NEXT:    v_add_f32_e32 v1, 0x41200000, v1
 ; GFX11-MAD-NEXT:    global_store_b32 v0, v1, s[0:1]
 ; GFX11-MAD-NEXT:    s_endpgm
+;
+; GFX942-FMA-LABEL: madak_f32:
+; GFX942-FMA:       ; %bb.0:
+; GFX942-FMA-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x24
+; GFX942-FMA-NEXT:    s_load_dwordx2 s[6:7], s[4:5], 0x34
+; GFX942-FMA-NEXT:    v_and_b32_e32 v0, 0x3ff, v0
+; GFX942-FMA-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
+; GFX942-FMA-NEXT:    s_waitcnt lgkmcnt(0)
+; GFX942-FMA-NEXT:    global_load_dword v1, v0, s[2:3]
+; GFX942-FMA-NEXT:    global_load_dword v2, v0, s[6:7]
+; GFX942-FMA-NEXT:    s_waitcnt vmcnt(0)
+; GFX942-FMA-NEXT:    v_fmaak_f32 v1, v1, v2, 0x41200000
+; GFX942-FMA-NEXT:    global_store_dword v0, v1, s[0:1]
+; GFX942-FMA-NEXT:    s_endpgm
+;
+; GFX10-FMA-LABEL: madak_f32:
+; GFX10-FMA:       ; %bb.0:
+; GFX10-FMA-NEXT:    s_clause 0x1
+; GFX10-FMA-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x24
+; GFX10-FMA-NEXT:    s_load_dwordx2 s[6:7], s[4:5], 0x34
+; GFX10-FMA-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
+; GFX10-FMA-NEXT:    s_waitcnt lgkmcnt(0)
+; GFX10-FMA-NEXT:    s_clause 0x1
+; GFX10-FMA-NEXT:    global_load_dword v1, v0, s[2:3]
+; GFX10-FMA-NEXT:    global_load_dword v2, v0, s[6:7]
+; GFX10-FMA-NEXT:    s_waitcnt vmcnt(0)
+; GFX10-FMA-NEXT:    v_fmaak_f32 v1, v1, v2, 0x41200000
+; GFX10-FMA-NEXT:    global_store_dword v0, v1, s[0:1]
+; GFX10-FMA-NEXT:    s_endpgm
+;
+; GFX11-FMA-LABEL: madak_f32:
+; GFX11-FMA:       ; %bb.0:
+; GFX11-FMA-NEXT:    s_clause 0x1
+; GFX11-FMA-NEXT:    s_load_b128 s[0:3], s[4:5], 0x24
+; GFX11-FMA-NEXT:    s_load_b64 s[4:5], s[4:5], 0x34
+; GFX11-FMA-NEXT:    v_and_b32_e32 v0, 0x3ff, v0
+; GFX11-FMA-NEXT:    s_delay_alu instid0(VALU_DEP_1)
+; GFX11-FMA-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
+; GFX11-FMA-NEXT:    s_waitcnt lgkmcnt(0)
+; GFX11-FMA-NEXT:    s_clause 0x1
+; GFX11-FMA-NEXT:    global_load_b32 v1, v0, s[2:3]
+; GFX11-FMA-NEXT:    global_load_b32 v2, v0, s[4:5]
+; GFX11-FMA-NEXT:    s_waitcnt vmcnt(0)
+; GFX11-FMA-NEXT:    v_fmaak_f32 v1, v1, v2, 0x41200000
+; GFX11-FMA-NEXT:    global_store_b32 v0, v1, s[0:1]
+; GFX11-FMA-NEXT:    s_endpgm
   %tid = tail call i32 @llvm.amdgcn.workitem.id.x() nounwind readnone
   %in.a.gep = getelementptr float, ptr addrspace(1) %in.a, i32 %tid
   %in.b.gep = getelementptr float, ptr addrspace(1) %in.b, i32 %tid
@@ -205,28 +239,6 @@ define amdgpu_kernel void @madak_2_use_f32(ptr addrspace(1) noalias %out, ptr ad
 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
 ; GFX9-NEXT:    s_endpgm
 ;
-; GFX942-LABEL: madak_2_use_f32:
-; GFX942:       ; %bb.0:
-; GFX942-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x24
-; GFX942-NEXT:    v_and_b32_e32 v0, 0x3ff, v0
-; GFX942-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
-; GFX942-NEXT:    s_waitcnt lgkmcnt(0)
-; GFX942-NEXT:    global_load_dword v1, v0, s[2:3] sc0 sc1
-; GFX942-NEXT:    s_waitcnt vmcnt(0)
-; GFX942-NEXT:    global_load_dword v2, v0, s[2:3] offset:4 sc0 sc1
-; GFX942-NEXT:    s_waitcnt vmcnt(0)
-; GFX942-NEXT:    global_load_dword v3, v0, s[2:3] offset:8 sc0 sc1
-; GFX942-NEXT:    s_waitcnt vmcnt(0)
-; GFX942-NEXT:    v_mul_f32_e32 v2, v1, v2
-; GFX942-NEXT:    v_mul_f32_e32 v1, v1, v3
-; GFX942-NEXT:    v_add_f32_e32 v2, 0x41200000, v2
-; GFX942-NEXT:    v_add_f32_e32 v1, 0x41200000, v1
-; GFX942-NEXT:    global_store_dword v0, v2, s[0:1] sc0 sc1
-; GFX942-NEXT:    s_waitcnt vmcnt(0)
-; GFX942-NEXT:    global_store_dword v0, v1, s[2:3] offset:4 sc0 sc1
-; GFX942-NEXT:    s_waitcnt vmcnt(0)
-; GFX942-NEXT:    s_endpgm
-;
 ; GFX10-MAD-LABEL: madak_2_use_f32:
 ; GFX10-MAD:       ; %bb.0:
 ; GFX10-MAD-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x24
@@ -268,6 +280,67 @@ define amdgpu_kernel void @madak_2_use_f32(ptr addrspace(1) noalias %out, ptr ad
 ; GFX11-MAD-NEXT:    global_store_b32 v0, v1, s[2:3] offset:4 dlc
 ; GFX11-MAD-NEXT:    s_waitcnt_vscnt null, 0x0
 ; GFX11-MAD-NEXT:    s_endpgm
+;
+; GFX942-FMA-LABEL: madak_2_use_f32:
+; GFX942-FMA:       ; %bb.0:
+; GFX942-FMA-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x24
+; GFX942-FMA-NEXT:    v_and_b32_e32 v0, 0x3ff, v0
+; GFX942-FMA-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
+; GFX942-FMA-NEXT:    v_mov_b32_e32 v4, 0x41200000
+; GFX942-FMA-NEXT:    s_waitcnt lgkmcnt(0)
+; GFX942-FMA-NEXT:    global_load_dword v1, v0, s[2:3] sc0 sc1
+; GFX942-FMA-NEXT:    s_waitcnt vmcnt(0)
+; GFX942-FMA-NEXT:    global_load_dword v2, v0, s[2:3] offset:4 sc0 sc1
+; GFX942-FMA-NEXT:    s_waitcnt vmcnt(0)
+; GFX942-FMA-NEXT:    global_load_dword v3, v0, s[2:3] offset:8 sc0 sc1
+; GFX942-FMA-NEXT:    s_waitcnt vmcnt(0)
+; GFX942-FMA-NEXT:    v_fmaak_f32 v2, v1, v2, 0x41200000
+; GFX942-FMA-NEXT:    v_fmac_f32_e32 v4, v1, v3
+; GFX942-FMA-NEXT:    global_store_dword v0, v2, s[0:1] sc0 sc1
+; GFX942-FMA-NEXT:    s_waitcnt vmcnt(0)
+; GFX942-FMA-NEXT:    global_store_dword v0, v4, s[2:3] offset:4 sc0 sc1
+; GFX942-FMA-NEXT:    s_waitcnt vmcnt(0)
+; GFX942-FMA-NEXT:    s_endpgm
+;
+; GFX10-FMA-LABEL: madak_2_use_f32:
+; GFX10-FMA:       ; %bb.0:
+; GFX10-FMA-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x24
+; GFX10-FMA-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
+; GFX10-FMA-NEXT:    s_waitcnt lgkmcnt(0)
+; GFX10-FMA-NEXT:    global_load_dword v1, v0, s[2:3] glc dlc
+; GFX10-FMA-NEXT:    s_waitcnt vmcnt(0)
+; GFX10-FMA-NEXT:    global_load_dword v2, v0, s[2:3] offset:4 glc dlc
+; GFX10-FMA-NEXT:    s_waitcnt vmcnt(0)
+; GFX10-FMA-NEXT:    global_load_dword v3, v0, s[2:3] offset:8 glc dlc
+; GFX10-FMA-NEXT:    s_waitcnt vmcnt(0)
+; GFX10-FMA-NEXT:    v_fmaak_f32 v2, v1, v2, 0x41200000
+; GFX10-FMA-NEXT:    v_fmaak_f32 v1, v1, v3, 0x41200000
+; GFX10-FMA-NEXT:    global_store_dword v0, v2, s[0:1]
+; GFX10-FMA-NEXT:    s_waitcnt_vscnt null, 0x0
+; GFX10-FMA-NEXT:    global_store_dword v0, v1, s[2:3] offset:4
+; GFX10-FMA-NEXT:    s_waitcnt_vscnt null, 0x0
+; GFX10-FMA-NEXT:    s_endpgm
+;
+; GFX11-FMA-LABEL: madak_2_use_f32:
+; GFX11-FMA:       ; %bb.0:
+; GFX11-FMA-NEXT:    s_load_b128 s[0:3], s[4:5], 0x24
+; GFX11-FMA-NEXT:    v_and_b32_e32 v0, 0x3ff, v0
+; GFX11-FMA-NEXT:    s_delay_alu instid0(VALU_DEP_1)
+; GFX11-FMA-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
+; GFX11-FMA-NEXT:    s_waitcnt lgkmcnt(0)
+; GFX11-FMA-NEXT:    global_load_b32 v1, v0, s[2:3] glc dlc
+; GFX11-FMA-NEXT:    s_waitcnt vmcnt(0)
+; GFX11-FMA-NEXT:    global_load_b32 v2, v0, s[2:3] offset:4 glc dlc
+; GFX11-FMA-NEXT:    s_waitcnt vmcnt(0)
+; GFX11-FMA-NEXT:    global_load_b32 v3, v0, s[2:3] offset:8 glc dlc
+; GFX11-FMA-NEXT:    s_waitcnt vmcnt(0)
+; GFX11-FMA-NEXT:    v_fmaak_f32 v2, v1, v2, 0x41200000
+; GFX11-FMA-NEXT:    v_fmaak_f32 v1, v1, v3, 0x41200000
+; GFX11-FMA-NEXT:    global_store_b32 v0, v2, s[0:1] dlc
+; GFX11-FMA-NEXT:    s_waitcnt_vscnt null, 0x0
+; GFX11-FMA-NEXT:    global_store_b32 v0, v1, s[2:3] offset:4 dlc
+; GFX11-FMA-NEXT:    s_waitcnt_vscnt null, 0x0
+; GFX11-FMA-NEXT:    s_endpgm
   %tid = tail call i32 @llvm.amdgcn.workitem.id.x() nounwind readnone
 
   %in.gep.0 = getelementptr float, ptr addrspace(1) %in, i32 %tid
@@ -336,19 +409,6 @@ define amdgpu_kernel void @madak_m_inline_imm_f32(ptr addrspace(1) noalias %out,
 ; GFX9-NEXT:    global_store_dword v0, v1, s[0:1]
 ; GFX9-NEXT:    s_endpgm
 ;
-; GFX942-LABEL: madak_m_inline_imm_f32:
-; GFX942:       ; %bb.0:
-; GFX942-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x24
-; GFX942-NEXT:    v_and_b32_e32 v0, 0x3ff, v0
-; GFX942-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
-; GFX942-NEXT:    s_waitcnt lgkmcnt(0)
-; GFX942-NEXT:    global_load_dword v1, v0, s[2:3]
-; GFX942-NEXT:    s_waitcnt vmcnt(0)
-; GFX942-NEXT:    v_mul_f32_e32 v1, 4.0, v1
-; GFX942-NEXT:    v_add_f32_e32 v1, 0x41200000, v1
-; GFX942-NEXT:    global_store_dword v0, v1, s[0:1]
-; GFX942-NEXT:    s_endpgm
-;
 ; GFX10-MAD-LABEL: madak_m_inline_imm_f32:
 ; GFX10-MAD:       ; %bb.0:
 ; GFX10-MAD-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x24
@@ -373,6 +433,42 @@ define amdgpu_kernel void @madak_m_inline_imm_f32(ptr addrspace(1) noalias %out,
 ; GFX11-MAD-NEXT:    v_add_f32_e32 v1, 0x41200000, v1
 ; GFX11-MAD-NEXT:    global_store_b32 v0, v1, s[0:1]
 ; GFX11-MAD-NEXT:    s_endpgm
+;
+; GFX942-FMA-LABEL: madak_m_inline_imm_f32:
+; GFX942-FMA:       ; %bb.0:
+; GFX942-FMA-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x24
+; GFX942-FMA-NEXT:    v_and_b32_e32 v0, 0x3ff, v0
+; GFX942-FMA-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
+; GFX942-FMA-NEXT:    s_waitcnt lgkmcnt(0)
+; GFX942-FMA-NEXT:    global_load_dword v1, v0, s[2:3]
+; GFX942-FMA-NEXT:    s_waitcnt vmcnt(0)
+; GFX942-FMA-NEXT:    v_fmaak_f32 v1, 4.0, v1, 0x41200000
+; GFX942-FMA-NEXT:    global_store_dword v0, v1, s[0:1]
+; GFX942-FMA-NEXT:    s_endpgm
+;
+; GFX10-FMA-LABEL: madak_m_inline_imm_f32:
+; GFX10-FMA:       ; %bb.0:
+; GFX10-FMA-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x24
+; GFX10-FMA-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
+; GFX10-FMA-NEXT:    s_waitcnt lgkmcnt(0)
+; GFX10-FMA-NEXT:    global_load_dword v1, v0, s[2:3]
+; GFX10-FMA-NEXT:    s_waitcnt vmcnt(0)
+; GFX10-FMA-NEXT:    v_fmaak_f32 v1, 4.0, v1, 0x41200000
+; GFX10-FMA-NEXT:    global_store_dword v0, v1, s[0:1]
+; GFX10-FMA-NEXT:    s_endpgm
+;
+; GFX11-FMA-LABEL: madak_m_inline_imm_f32:
+; GFX11-FMA:       ; %bb.0:
+; GFX11-FMA-NEXT:    s_load_b128 s[0:3], s[4:5], 0x24
+; GFX11-FMA-NEXT:    v_and_b32_e32 v0, 0x3ff, v0
+; GFX11-FMA-NEXT:    s_delay_alu instid0(VALU_DEP_1)
+; GFX11-FMA-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
+; GFX11-FMA-NEXT:    s_waitcnt lgkmcnt(0)
+; GFX11-FMA-NEXT:    global_load_b32 v1, v0, s[2:3]
+; GFX11-FMA-NEXT:    s_waitcnt vmcnt(0)
+; GFX11-FMA-NEXT:    v_fmaak_f32 v1, 4.0, v1, 0x41200000
+; GFX11-FMA-NEXT:    global_store_b32 v0, v1, s[0:1]
+; GFX11-FMA-NEXT:    s_endpgm
   %tid = tail call i32 @llvm.amdgcn.workitem.id.x() nounwind readnone
   %in.a.gep = getelementptr float, ptr addrspace(1) %in.a, i32 %tid
   %out.gep = getelementptr float, ptr addrspace(1) %out, i32 %tid
@@ -442,21 +538,6 @@ define amdgpu_kernel void @madak_inline_imm_f32(ptr addrspace(1) noalias %out, p
 ; GFX9-NEXT:    global_store_dword v0, v1, s[0:1]
 ; GFX9-NEXT:    s_endpgm
 ;
-; GFX942-LABEL: madak_inline_imm_f32:
-; GFX942:       ; %bb.0:
-; GFX942-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x24
-; GFX942-NEXT:    s_load_dwordx2 s[6:7], s[4:5], 0x34
-; GFX942-NEXT:    v_and_b32_e32 v0, 0x3ff, v0
-; GFX942-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
-; GFX942-NEXT:    s_waitcnt lgkmcnt(0)
-; GFX942-NEXT:    global_load_dword v1, v0, s[2:3]
-; GFX942-NEXT:    global_load_dword v2, v0, s[6:7]
-; GFX942-NEXT:    s_waitcnt vmcnt(0)
-; GFX942-NEXT:    v_mul_f32_e32 v1, v1, v2
-; GFX942-NEXT:    v_add_f32_e32 v1, 4.0, v1
-; GFX942-NEXT:    global_store_dword v0, v1, s[0:1]
-; GFX942-NEXT:    s_endpgm
-;
 ; GFX10-MAD-LABEL: madak_inline_imm_f32:
 ; GFX10-MAD:       ; %bb.0:
 ; GFX10-MAD-NEXT:    s_clause 0x1
@@ -490,6 +571,52 @@ define amdgpu_kernel void @madak_inline_imm_f32(ptr addrspace(1) noalias %out, p
 ; GFX11-MAD-NEXT:    v_add_f32_e32 v1, 4.0, v1
 ; GFX11-MAD-NEXT:    global_store_b32 v0, v1, s[0:1]
 ; GFX11-MAD-NEXT:    s_endpgm
+;
+; GFX942-FMA-LABEL: madak_inline_imm_f32:
+; GFX942-FMA:       ; %bb.0:
+; GFX942-FMA-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x24
+; GFX942-FMA-NEXT:    s_load_dwordx2 s[6:7], s[4:5], 0x34
+; GFX942-FMA-NEXT:    v_and_b32_e32 v0, 0x3ff, v0
+; GFX942-FMA-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
+; GFX942-FMA-NEXT:    s_waitcnt lgkmcnt(0)
+; GFX942-FMA-NEXT:    global_load_dword v1, v0, s[2:3]
+; GFX942-FMA-NEXT:    global_load_dword v2, v0, s[6:7]
+; GFX942-FMA-NEXT:    s_waitcnt vmcnt(0)
+; GFX942-FMA-NEXT:    v_fma_f32 v1, v1, v2, 4.0
+; GFX942-FMA-NEXT:    global_store_dword v0, v1, s[0:1]
+; GFX942-FMA-NEXT:    s_endpgm
+;
+; GFX10-FMA-LABEL: madak_inline_imm_f32:
+; GFX10-FMA:       ; %bb.0:
+; GFX10-FMA-NEXT:    s_clause 0x1
+; GFX10-FMA-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x24
+; GFX10-FMA-NEXT:    s_load_dwordx2 s[6:7], s[4:5], 0x34
+; GFX10-FMA-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
+; GFX10-FMA-NEXT:    s_waitcnt lgkmcnt(0)
+; GFX10-FMA-NEXT:    s_clause 0x1
+; GFX10-FMA-NEXT:    global_load_dword v1, v0, s[2:3]
+; GFX10-FMA-NEXT:    global_load_dword v2, v0, s[6:7]
+; GFX10-FMA-NEXT:    s_waitcnt vmcnt(0)
+; GFX10-FMA-NEXT:    v_fma_f32 v1, v1, v2, 4.0
+; GFX10-FMA-NEXT:    global_store_dword v0, v1, s[0:1]
+; GFX10-FMA-NEXT:    s_endpgm
+;
+; GFX11-FMA-LABEL: madak_inline_imm_f32:
+; GFX11-FMA:       ; %bb.0:
+; GFX11-FMA-NEXT:    s_clause 0x1
+; GFX11-FMA-NEXT:    s_load_b128 s[0:3], s[4:5], 0x24
+; GFX11-FMA-NEXT:    s_load_b64 s[4:5], s[4:5], 0x34
+; GFX11-FMA-NEXT:    v_and_b32_e32 v0, 0x3ff, v0
+; GFX11-FMA-NEXT:    s_delay_alu instid0(VALU_DEP_1)
+; GFX11-FMA-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
+; GFX11-FMA-NEXT:    s_waitcnt lgkmcnt(0)
+; GFX11-FMA-NEXT:    s_clause 0x1
+; GFX11-FMA-NEXT:    global_load_b32 v1, v0, s[2:3]
+; GFX11-FMA-NEXT:    global_load_b32 v2, v0, s[4:5]
+; GFX11-FMA-NEXT:    s_waitcnt vmcnt(0)
+; GFX11-FMA-NEXT:    v_fma_f32 v1, v1, v2, 4.0
+; GFX11-FMA-NEXT:    global_store_b32 v0, v1, s[0:1]
+; GFX11-FMA-NEXT:    s_endpgm
   %tid = tail call i32 @llvm.amdgcn.workitem.id.x() nounwind readnone
   %in.a.gep = getelementptr float, ptr addrspace(1) %in.a, i32 %tid
   %in.b.gep = getelementptr float, ptr addrspace(1) %in.b, i32 %tid
@@ -556,20 +683,6 @@ define amdgpu_kernel void @s_v_madak_f32(ptr addrspace(1) noalias %out, ptr addr
 ; GFX9-NEXT:    global_store_dword v0, v2, s[0:1]
 ; GFX9-NEXT:    s_endpgm
 ;
-; GFX942-LABEL: s_v_madak_f32:
-; GFX942:       ; %bb.0:
-; GFX942-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x24
-; GFX942-NEXT:    s_load_dword s6, s[4:5], 0x34
-; GFX942-NEXT:    v_and_b32_e32 v0, 0x3ff, v0
-; GFX942-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
-; GFX942-NEXT:    s_waitcnt lgkmcnt(0)
-; GFX942-NEXT:    global_load_dword v1, v0, s[2:3]
-; GFX942-NEXT:    s_waitcnt vmcnt(0)
-; GFX942-NEXT:    v_mul_f32_e32 v1, s6, v1
-; GFX942-NEXT:    v_add_f32_e32 v1, 0x41200000, v1
-; GFX942-NEXT:    global_store_dword v0, v1, s[0:1]
-; GFX942-NEXT:    s_endpgm
-;
 ; GFX10-MAD-LABEL: s_v_madak_f32:
 ; GFX10-MAD:       ; %bb.0:
 ; GFX10-MAD-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x24
@@ -596,6 +709,46 @@ define amdgpu_kernel void @s_v_madak_f32(ptr addrspace(1) noalias %out, ptr addr
 ; GFX11-MAD-NEXT:    v_add_f32_e32 v1, 0x41200000, v1
 ; GFX11-MAD-NEXT:    global_store_b32 v0, v1, s[0:1]
 ; GFX11-MAD-NEXT:    s_endpgm
+;
+; GFX942-FMA-LABEL: s_v_madak_f32:
+; GFX942-FMA:       ; %bb.0:
+; GFX942-FMA-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x24
+; GFX942-FMA-NEXT:    s_load_dword s6, s[4:5], 0x34
+; GFX942-FMA-NEXT:    v_and_b32_e32 v0, 0x3ff, v0
+; GFX942-FMA-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
+; GFX942-FMA-NEXT:    v_mov_b32_e32 v2, 0x41200000
+; GFX942-FMA-NEXT:    s_waitcnt lgkmcnt(0)
+; GFX942-FMA-NEXT:    global_load_dword v1, v0, s[2:3]
+; GFX942-FMA-NEXT:    s_waitcnt vmcnt(0)
+; GFX942-FMA-NEXT:    v_fmac_f32_e32 v2, s6, v1
+; GFX942-FMA-NEXT:    global_store_dword v0, v2, s[0:1]
+; GFX942-FMA-NEXT:    s_endpgm
+;
+; GFX10-FMA-LABEL: s_v_madak_f32:
+; GFX10-FMA:       ; %bb.0:
+; GFX10-FMA-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x24
+; GFX10-FMA-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
+; GFX10-FMA-NEXT:    s_load_dword s4, s[4:5], 0x34
+; GFX10-FMA-NEXT:    s_waitcnt lgkmcnt(0)
+; GFX10-FMA-NEXT:    global_load_dword v1, v0, s[2:3]
+; GFX10-FMA-NEXT:    s_waitcnt vmcnt(0)
+; GFX10-FMA-NEXT:    v_fmaak_f32 v1, s4, v1, 0x41200000
+; GFX10-FMA-NEXT:    global_store_dword v0, v1, s[0:1]
+; GFX10-FMA-NEXT:    s_endpgm
+;
+; GFX11-FMA-LABEL: s_v_madak_f32:
+; GFX11-FMA:       ; %bb.0:
+; GFX11-FMA-NEXT:    s_load_b128 s[0:3], s[4:5], 0x24
+; GFX11-FMA-NEXT:    v_and_b32_e32 v0, 0x3ff, v0
+; GFX11-FMA-NEXT:    s_load_b32 s4, s[4:5], 0x34
+; GFX11-FMA-NEXT:    s_delay_alu instid0(VALU_DEP_1)
+; GFX11-FMA-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
+; GFX11-FMA-NEXT:    s_waitcnt lgkmcnt(0)
+; GFX11-FMA-NEXT:    global_load_b32 v1, v0, s[2:3]
+; GFX11-FMA-NEXT:    s_waitcnt vmcnt(0)
+; GFX11-FMA-NEXT:    v_fmaak_f32 v1, s4, v1, 0x41200000
+; GFX11-FMA-NEXT:    global_store_b32 v0, v1, s[0:1]
+; GFX11-FMA-NEXT:    s_endpgm
   %tid = tail call i32 @llvm.amdgcn.workitem.id.x() nounwind readnone
   %in.a.gep = getelementptr float, ptr addrspace(1) %in.a, i32 %tid
   %out.gep = getelementptr float, ptr addrspace(1) %out, i32 %tid
@@ -661,21 +814,6 @@ define amdgpu_kernel void @v_s_madak_f32(ptr addrspace(1) noalias %out, float %a
 ; GFX9-NEXT:    global_store_dword v0, v2, s[0:1]
 ; GFX9-NEXT:    s_endpgm
 ;
-; GFX942-LABEL: v_s_madak_f32:
-; GFX942:       ; %bb.0:
-; GFX942-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x34
-; GFX942-NEXT:    v_and_b32_e32 v0, 0x3ff, v0
-; GFX942-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
-; GFX942-NEXT:    s_waitcnt lgkmcnt(0)
-; GFX942-NEXT:    global_load_dword v1, v0, s[0:1]
-; GFX942-NEXT:    s_load_dword s2, s[4:5], 0x2c
-; GFX942-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x24
-; GFX942-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
-; GFX942-NEXT:    v_mul_f32_e32 v1, s2, v1
-; GFX942-NEXT:    v_add_f32_e32 v1, 0x41200000, v1
-; GFX942-NEXT:    global_store_dword v0, v1, s[0:1]
-; GFX942-NEXT:    s_endpgm
-;
 ; GFX10-MAD-LABEL: v_s_madak_f32:
 ; GFX10-MAD:       ; %bb.0:
 ; GFX10-MAD-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x34
@@ -708,6 +846,52 @@ define amdgpu_kernel void @v_s_madak_f32(ptr addrspace(1) noalias %out, float %a
 ; GFX11-MAD-NEXT:    v_add_f32_e32 v1, 0x41200000, v1
 ; GFX11-MAD-NEXT:    global_store_b32 v0, v1, s[0:1]
 ; GFX11-MAD-NEXT:    s_endpgm
+;
+; GFX942-FMA-LABEL: v_s_madak_f32:
+; GFX942-FMA:       ; %bb.0:
+; GFX942-FMA-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x34
+; GFX942-FMA-NEXT:    v_and_b32_e32 v0, 0x3ff, v0
+; GFX942-FMA-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
+; GFX942-FMA-NEXT:    v_mov_b32_e32 v2, 0x41200000
+; GFX942-FMA-NEXT:    s_waitcnt lgkmcnt(0)
+; GFX942-FMA-NEXT:    global_load_dword v1, v0, s[0:1]
+; GFX942-FMA-NEXT:    s_load_dword s2, s[4:5], 0x2c
+; GFX942-FMA-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x24
+; GFX942-FMA-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
+; GFX942-FMA-NEXT:    v_fmac_f32_e32 v2, s2, v1
+; GFX942-FMA-NEXT:    global_store_dword v0, v2, s[0:1]
+; GFX942-FMA-NEXT:    s_endpgm
+;
+; GFX10-FMA-LABEL: v_s_madak_f32:
+; GFX10-FMA:       ; %bb.0:
+; GFX10-FMA-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x34
+; GFX10-FMA-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
+; GFX10-FMA-NEXT:    s_waitcnt lgkmcnt(0)
+; GFX10-FMA-NEXT:    global_load_dword v1, v0, s[0:1]
+; GFX10-FMA-NEXT:    s_clause 0x1
+; GFX10-FMA-NEXT:    s_load_dword s2, s[4:5], 0x2c
+; GFX10-FMA-NEXT:    s_waitcnt_depctr depctr_vm_vsrc(0)
+; GFX10-FMA-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x24
+; GFX10-FMA-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
+; GFX10-FMA-NEXT:    v_fmaak_f32 v1, s2, v1, 0x41200000
+; GFX10-FMA-NEXT:    global_store_dword v0, v1, s[0:1]
+; GFX10-FMA-NEXT:    s_endpgm
+;
+; GFX11-FMA-LABEL: v_s_madak_f32:
+; GFX11-FMA:       ; %bb.0:
+; GFX11-FMA-NEXT:    s_load_b64 s[0:1], s[4:5], 0x34
+; GFX11-FMA-NEXT:    v_and_b32_e32 v0, 0x3ff, v0
+; GFX11-FMA-NEXT:    s_delay_alu instid0(VALU_DEP_1)
+; GFX11-FMA-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
+; GFX11-FMA-NEXT:    s_waitcnt lgkmcnt(0)
+; GFX11-FMA-NEXT:    global_load_b32 v1, v0, s[0:1]
+; GFX11-FMA-NEXT:    s_clause 0x1
+; GFX11-FMA-NEXT:    s_load_b32 s2, s[4:5], 0x2c
+; GFX11-FMA-NEXT:    s_load_b64 s[0:1], s[4:5], 0x24
+; GFX11-FMA-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
+; GFX11-FMA-NEXT:    v_fmaak_f32 v1, s2, v1, 0x41200000
+; GFX11-FMA-NEXT:    global_store_b32 v0, v1, s[0:1]
+; GFX11-FMA-NEXT:    s_endpgm
   %tid = tail call i32 @llvm.amdgcn.workitem.id.x() nounwind readnone
   %in.b.gep = getelementptr float, ptr addrspace(1) %in.b, i32 %tid
   %out.gep = getelementptr float, ptr addrspace(1) %out, i32 %tid
@@ -758,17 +942,6 @@ define amdgpu_kernel void @s_s_madak_f32(ptr addrspace(1) %out, float %a, float
 ; GFX9-NEXT:    global_store_dword v0, v1, s[0:1]
 ; GFX9-NEXT:    s_endpgm
 ;
-; GFX942-LABEL: s_s_madak_f32:
-; GFX942:       ; %bb.0:
-; GFX942-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x24
-; GFX942-NEXT:    v_mov_b32_e32 v0, 0
-; GFX942-NEXT:    s_waitcnt lgkmcnt(0)
-; GFX942-NEXT:    v_mov_b32_e32 v1, s3
-; GFX942-NEXT:    v_mul_f32_e32 v1, s2, v1
-; GFX942-NEXT:    v_add_f32_e32 v1, 0x41200000, v1
-; GFX942-NEXT:    global_store_dword v0, v1, s[0:1]
-; GFX942-NEXT:    s_endpgm
-;
 ; GFX10-MAD-LABEL: s_s_madak_f32:
 ; GFX10-MAD:       ; %bb.0:
 ; GFX10-MAD-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x24
@@ -788,6 +961,37 @@ define amdgpu_kernel void @s_s_madak_f32(ptr addrspace(1) %out, float %a, float
 ; GFX11-MAD-NEXT:    v_dual_mov_b32 v1, 0 :: v_dual_add_f32 v0, 0x41200000, v0
 ; GFX11-MAD-NEXT:    global_store_b32 v1, v0, s[0:1]
 ; GFX11-MAD-NEXT:    s_endpgm
+;
+; GFX942-FMA-LABEL: s_s_madak_f32:
+; GFX942-FMA:       ; %bb.0:
+; GFX942-FMA-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x24
+; GFX942-FMA-NEXT:    v_mov_b32_e32 v1, 0x41200000
+; GFX942-FMA-NEXT:    v_mov_b32_e32 v0, 0
+; GFX942-FMA-NEXT:    s_waitcnt lgkmcnt(0)
+; GFX942-FMA-NEXT:    v_mov_b32_e32 v2, s3
+; GFX942-FMA-NEXT:    v_fmac_f32_e32 v1, s2, v2
+; GFX942-FMA-NEXT:    global_store_dword v0, v1, s[0:1]
+; GFX942-FMA-NEXT:    s_endpgm
+;
+; GFX10-FMA-LABEL: s_s_madak_f32:
+; GFX10-FMA:       ; %bb.0:
+; GFX10-FMA-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x24
+; GFX10-FMA-NEXT:    v_mov_b32_e32 v1, 0
+; GFX10-FMA-NEXT:    s_waitcnt lgkmcnt(0)
+; GFX10-FMA-NEXT:    v_mov_b32_e32 v0, s3
+; GFX10-FMA-NEXT:    v_fmaak_f32 v0, s2, v0, 0x41200000
+; GFX10-FMA-NEXT:    global_store_dword v1, v0, s[0:1]
+; GFX10-FMA-NEXT:    s_endpgm
+;
+; GFX11-FMA-LABEL: s_s_madak_f32:
+; GFX11-FMA:       ; %bb.0:
+; GFX11-FMA-NEXT:    s_load_b128 s[0:3], s[4:5], 0x24
+; GFX11-FMA-NEXT:    s_waitcnt lgkmcnt(0)
+; GFX11-FMA-NEXT:    v_dual_mov_b32 v1, 0 :: v_dual_mov_b32 v0, s3
+; GFX11-FMA-NEXT:    s_delay_alu instid0(VALU_DEP_1)
+; GFX11-FMA-NEXT:    v_fmaak_f32 v0, s2, v0, 0x41200000
+; GFX11-FMA-NEXT:    global_store_b32 v1, v0, s[0:1]
+; GFX11-FMA-NEXT:    s_endpgm
   %mul = fmul float %a, %b
   %madak = fadd float %mul, 10.0
   store float %madak, ptr addrspace(1) %out, align 4
@@ -852,21 +1056,6 @@ define amdgpu_kernel void @no_madak_src0_modifier_f32(ptr addrspace(1) noalias %
 ; GFX9-NEXT:    global_store_dword v0, v1, s[0:1]
 ; GFX9-NEXT:    s_endpgm
 ;
-; GFX942-LABEL: no_madak_src0_modifier_f32:
-; GFX942:       ; %bb.0:
-; GFX942-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x24
-; GFX942-NEXT:    s_load_dwordx2 s[6:7], s[4:5], 0x34
-; GFX942-NEXT:    v_and_b32_e32 v0, 0x3ff, v0
-; GFX942-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
-; GFX942-NEXT:    s_waitcnt lgkmcnt(0)
-; GFX942-NEXT:    global_load_dword v1, v0, s[2:3]
-; GFX942-NEXT:    global_load_dword v2, v0, s[6:7]
-; GFX942-NEXT:    s_waitcnt vmcnt(0)
-; GFX942-NEXT:    v_mul_f32_e64 v1, |v1|, v2
-; GFX942-NEXT:    v_add_f32_e32 v1, 0x41200000, v1
-; GFX942-NEXT:    global_store_dword v0, v1, s[0:1]
-; GFX942-NEXT:    s_endpgm
-;
 ; GFX10-MAD-LABEL: no_madak_src0_modifier_f32:
 ; GFX10-MAD:       ; %bb.0:
 ; GFX10-MAD-NEXT:    s_clause 0x1
@@ -900,6 +1089,53 @@ define amdgpu_kernel void @no_madak_src0_modifier_f32(ptr addrspace(1) noalias %
 ; GFX11-MAD-NEXT:    v_add_f32_e32 v1, 0x41200000, v1
 ; GFX11-MAD-NEXT:    global_store_b32 v0, v1, s[0:1]
 ; GFX11-MAD-NEXT:    s_endpgm
+;
+; GFX942-FMA-LABEL: no_madak_src0_modifier_f32:
+; GFX942-FMA:       ; %bb.0:
+; GFX942-FMA-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x24
+; GFX942-FMA-NEXT:    s_load_dwordx2 s[6:7], s[4:5], 0x34
+; GFX942-FMA-NEXT:    v_and_b32_e32 v0, 0x3ff, v0
+; GFX942-FMA-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
+; GFX942-FMA-NEXT:    s_waitcnt lgkmcnt(0)
+; GFX942-FMA-NEXT:    global_load_dword v1, v0, s[2:3]
+; GFX942-FMA-NEXT:    global_load_dword v2, v0, s[6:7]
+; GFX942-FMA-NEXT:    s_mov_b32 s2, 0x41200000
+; GFX942-FMA-NEXT:    s_waitcnt vmcnt(0)
+; GFX942-FMA-NEXT:    v_fma_f32 v1, |v1|, v2, s2
+; GFX942-FMA-NEXT:    global_store_dword v0, v1, s[0:1]
+; GFX942-FMA-NEXT:    s_endpgm
+;
+; GFX10-FMA-LABEL: no_madak_src0_modifier_f32:
+; GFX10-FMA:       ; %bb.0:
+; GFX10-FMA-NEXT:    s_clause 0x1
+; GFX10-FMA-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x24
+; GFX10-FMA-NEXT:    s_load_dwordx2 s[6:7], s[4:5], 0x34
+; GFX10-FMA-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
+; GFX10-FMA-NEXT:    s_waitcnt lgkmcnt(0)
+; GFX10-FMA-NEXT:    s_clause 0x1
+; GFX10-FMA-NEXT:    global_load_dword v1, v0, s[2:3]
+; GFX10-FMA-NEXT:    global_load_dword v2, v0, s[6:7]
+; GFX10-FMA-NEXT:    s_waitcnt vmcnt(0)
+; GFX10-FMA-NEXT:    v_fma_f32 v1, |v1|, v2, 0x41200000
+; GFX10-FMA-NEXT:    global_store_dword v0, v1, s[0:1]
+; GFX10-FMA-NEXT:    s_endpgm
+;
+; GFX11-FMA-LABEL: no_madak_src0_modifier_f32:
+; GFX11-FMA:       ; %bb.0:
+; GFX11-FMA-NEXT:    s_clause 0x1
+; GFX11-FMA-NEXT:    s_load_b128 s[0:3], s[4:5], 0x24
+; GFX11-FMA-NEXT:    s_load_b64 s[4:5], s[4:5], 0x34
+; GFX11-FMA-NEXT:    v_and_b32_e32 v0, 0x3ff, v0
+; GFX11-FMA-NEXT:    s_delay_alu instid0(VALU_DEP_1)
+; GFX11-FMA-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
+; GFX11-FMA-NEXT:    s_waitcnt lgkmcnt(0)
+; GFX11-FMA-NEXT:    s_clause 0x1
+; GFX11-FMA-NEXT:    global_load_b32 v1, v0, s[2:3]
+; GFX11-FMA-NEXT:    global_load_b32 v2, v0, s[4:5]
+; GFX11-FMA-NEXT:    s_waitcnt vmcnt(0)
+; GFX11-FMA-NEXT:    v_fma_f32 v1, |v1|, v2, 0x41200000
+; GFX11-FMA-NEXT:    global_store_b32 v0, v1, s[0:1]
+; GFX11-FMA-NEXT:    s_endpgm
   %tid = tail call i32 @llvm.amdgcn.workitem.id.x() nounwind readnone
   %in.a.gep = getelementptr float, ptr addrspace(1) %in.a, i32 %tid
   %in.b.gep = getelementptr float, ptr addrspace(1) %in.b, i32 %tid
@@ -974,21 +1210,6 @@ define amdgpu_kernel void @no_madak_src1_modifier_f32(ptr addrspace(1) noalias %
 ; GFX9-NEXT:    global_store_dword v0, v1, s[0:1]
 ; GFX9-NEXT:    s_endpgm
 ;
-; GFX942-LABEL: no_madak_src1_modifier_f32:
-; GFX942:       ; %bb.0:
-; GFX942-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x24
-; GFX942-NEXT:    s_load_dwordx2 s[6:7], s[4:5], 0x34
-; GFX942-NEXT:    v_and_b32_e32 v0, 0x3ff, v0
-; GFX942-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
-; GFX942-NEXT:    s_waitcnt lgkmcnt(0)
-; GFX942-NEXT:    global_load_dword v1, v0, s[2:3]
-; GFX942-NEXT:    global_load_dword v2, v0, s[6:7]
-; GFX942-NEXT:    s_waitcnt vmcnt(0)
-; GFX942-NEXT:    v_mul_f32_e64 v1, v1, |v2|
-; GFX942-NEXT:    v_add_f32_e32 v1, 0x41200000, v1
-; GFX942-NEXT:    global_store_dword v0, v1, s[0:1]
-; GFX942-NEXT:    s_endpgm
-;
 ; GFX10-MAD-LABEL: no_madak_src1_modifier_f32:
 ; GFX10-MAD:       ; %bb.0:
 ; GFX10-MAD-NEXT:    s_clause 0x1
@@ -1022,6 +1243,53 @@ define amdgpu_kernel void @no_madak_src1_modifier_f32(ptr addrspace(1) noalias %
 ; GFX11-MAD-NEXT:    v_add_f32_e32 v1, 0x41200000, v1
 ; GFX11-MAD-NEXT:    global_store_b32 v0, v1, s[0:1]
 ; GFX11-MAD-NEXT:    s_endpgm
+;
+; GFX942-FMA-LABEL: no_madak_src1_modifier_f32:
+; GFX942-FMA:       ; %bb.0:
+; GFX942-FMA-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x24
+; GFX942-FMA-NEXT:    s_load_dwordx2 s[6:7], s[4:5], 0x34
+; GFX942-FMA-NEXT:    v_and_b32_e32 v0, 0x3ff, v0
+; GFX942-FMA-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
+; GFX942-FMA-NEXT:    s_waitcnt lgkmcnt(0)
+; GFX942-FMA-NEXT:    global_load_dword v1, v0, s[2:3]
+; GFX942-FMA-NEXT:    global_load_dword v2, v0, s[6:7]
+; GFX942-FMA-NEXT:    s_mov_b32 s2, 0x41200000
+; GFX942-FMA-NEXT:    s_waitcnt vmcnt(0)
+; GFX942-FMA-NEXT:    v_fma_f32 v1, v1, |v2|, s2
+; GFX942-FMA-NEXT:    global_store_dword v0, v1, s[0:1]
+; GFX942-FMA-NEXT:    s_endpgm
+;
+; GFX10-FMA-LABEL: no_madak_src1_modifier_f32:
+; GFX10-FMA:       ; %bb.0:
+; GFX10-FMA-NEXT:    s_clause 0x1
+; GFX10-FMA-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x24
+; GFX10-FMA-NEXT:    s_load_dwordx2 s[6:7], s[4:5], 0x34
+; GFX10-FMA-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
+; GFX10-FMA-NEXT:    s_waitcnt lgkmcnt(0)
+; GFX10-FMA-NEXT:    s_clause 0x1
+; GFX10-FMA-NEXT:    global_load_dword v1, v0, s[2:3]
+; GFX10-FMA-NEXT:    global_load_dword v2, v0, s[6:7]
+; GFX10-FMA-NEXT:    s_waitcnt vmcnt(0)
+; GFX10-FMA-NEXT:    v_fma_f32 v1, v1, |v2|, 0x41200000
+; GFX10-FMA-NEXT:    global_store_dword v0, v1, s[0:1]
+; GFX10-FMA-NEXT:    s_endpgm
+;
+; GFX11-FMA-LABEL: no_madak_src1_modifier_f32:
+; GFX11-FMA:       ; %bb.0:
+; GFX11-FMA-NEXT:    s_clause 0x1
+; GFX11-FMA-NEXT:    s_load_b128 s[0:3], s[4:5], 0x24
+; GFX11-FMA-NEXT:    s_load_b64 s[4:5], s[4:5], 0x34
+; GFX11-FMA-NEXT:    v_and_b32_e32 v0, 0x3ff, v0
+; GFX11-FMA-NEXT:    s_delay_alu instid0(VALU_DEP_1)
+; GFX11-FMA-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
+; GFX11-FMA-NEXT:    s_waitcnt lgkmcnt(0)
+; GFX11-FMA-NEXT:    s_clause 0x1
+; GFX11-FMA-NEXT:    global_load_b32 v1, v0, s[2:3]
+; GFX11-FMA-NEXT:    global_load_b32 v2, v0, s[4:5]
+; GFX11-FMA-NEXT:    s_waitcnt vmcnt(0)
+; GFX11-FMA-NEXT:    v_fma_f32 v1, v1, |v2|, 0x41200000
+; GFX11-FMA-NEXT:    global_store_b32 v0, v1, s[0:1]
+; GFX11-FMA-NEXT:    s_endpgm
   %tid = tail call i32 @llvm.amdgcn.workitem.id.x() nounwind readnone
   %in.a.gep = getelementptr float, ptr addrspace(1) %in.a, i32 %tid
   %in.b.gep = getelementptr float, ptr addrspace(1) %in.b, i32 %tid
@@ -1113,28 +1381,6 @@ define amdgpu_kernel void @madak_constant_bus_violation(i32 %arg1, [8 x i32], fl
 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
 ; GFX9-NEXT:    s_endpgm
 ;
-; GFX942-LABEL: madak_constant_bus_violation:
-; GFX942:       ; %bb.0: ; %bb
-; GFX942-NEXT:    s_load_dword s0, s[4:5], 0x24
-; GFX942-NEXT:    s_waitcnt lgkmcnt(0)
-; GFX942-NEXT:    s_cmp_lg_u32 s0, 0
-; GFX942-NEXT:    s_cbranch_scc1 .LBB9_2
-; GFX942-NEXT:  ; %bb.1: ; %bb3
-; GFX942-NEXT:    v_mov_b32_e32 v0, 0
-; GFX942-NEXT:    global_store_dword v[0:1], v0, off sc0 sc1
-; GFX942-NEXT:    s_waitcnt vmcnt(0)
-; GFX942-NEXT:  .LBB9_2: ; %bb4
-; GFX942-NEXT:    global_load_dword v0, v[0:1], off sc0 sc1
-; GFX942-NEXT:    s_waitcnt vmcnt(0)
-; GFX942-NEXT:    s_load_dword s0, s[4:5], 0x48
-; GFX942-NEXT:    s_waitcnt lgkmcnt(0)
-; GFX942-NEXT:    v_mul_f32_e64 v1, s0, 0.5
-; GFX942-NEXT:    v_add_f32_e32 v1, 0x42280000, v1
-; GFX942-NEXT:    v_mul_f32_e32 v0, v1, v0
-; GFX942-NEXT:    global_store_dword v[0:1], v0, off sc0 sc1
-; GFX942-NEXT:    s_waitcnt vmcnt(0)
-; GFX942-NEXT:    s_endpgm
-;
 ; GFX10-MAD-LABEL: madak_constant_bus_violation:
 ; GFX10-MAD:       ; %bb.0: ; %bb
 ; GFX10-MAD-NEXT:    s_load_dword s0, s[4:5], 0x24
@@ -1179,6 +1425,73 @@ define amdgpu_kernel void @madak_constant_bus_violation(i32 %arg1, [8 x i32], fl
 ; GFX11-MAD-NEXT:    global_store_b32 v[0:1], v0, off dlc
 ; GFX11-MAD-NEXT:    s_waitcnt_vscnt null, 0x0
 ; GFX11-MAD-NEXT:    s_endpgm
+;
+; GFX942-FMA-LABEL: madak_constant_bus_violation:
+; GFX942-FMA:       ; %bb.0: ; %bb
+; GFX942-FMA-NEXT:    s_load_dword s0, s[4:5], 0x24
+; GFX942-FMA-NEXT:    s_waitcnt lgkmcnt(0)
+; GFX942-FMA-NEXT:    s_cmp_lg_u32 s0, 0
+; GFX942-FMA-NEXT:    s_cbranch_scc1 .LBB9_2
+; GFX942-FMA-NEXT:  ; %bb.1: ; %bb3
+; GFX942-FMA-NEXT:    v_mov_b32_e32 v0, 0
+; GFX942-FMA-NEXT:    global_store_dword v[0:1], v0, off sc0 sc1
+; GFX942-FMA-NEXT:    s_waitcnt vmcnt(0)
+; GFX942-FMA-NEXT:  .LBB9_2: ; %bb4
+; GFX942-FMA-NEXT:    global_load_dword v0, v[0:1], off sc0 sc1
+; GFX942-FMA-NEXT:    s_waitcnt vmcnt(0)
+; GFX942-FMA-NEXT:    s_load_dword s0, s[4:5], 0x48
+; GFX942-FMA-NEXT:    v_mov_b32_e32 v1, 0x42280000
+; GFX942-FMA-NEXT:    s_waitcnt lgkmcnt(0)
+; GFX942-FMA-NEXT:    v_fmac_f32_e64 v1, s0, 0.5
+; GFX942-FMA-NEXT:    v_mul_f32_e32 v0, v1, v0
+; GFX942-FMA-NEXT:    global_store_dword v[0:1], v0, off sc0 sc1
+; GFX942-FMA-NEXT:    s_waitcnt vmcnt(0)
+; GFX942-FMA-NEXT:    s_endpgm
+;
+; GFX10-FMA-LABEL: madak_constant_bus_violation:
+; GFX10-FMA:       ; %bb.0: ; %bb
+; GFX10-FMA-NEXT:    s_load_dword s0, s[4:5], 0x24
+; GFX10-FMA-NEXT:    s_waitcnt lgkmcnt(0)
+; GFX10-FMA-NEXT:    s_cmp_lg_u32 s0, 0
+; GFX10-FMA-NEXT:    s_cbranch_scc1 .LBB9_2
+; GFX10-FMA-NEXT:  ; %bb.1: ; %bb3
+; GFX10-FMA-NEXT:    v_mov_b32_e32 v0, 0
+; GFX10-FMA-NEXT:    global_store_dword v[0:1], v0, off
+; GFX10-FMA-NEXT:    s_waitcnt_vscnt null, 0x0
+; GFX10-FMA-NEXT:  .LBB9_2: ; %bb4
+; GFX10-FMA-NEXT:    global_load_dword v0, v[0:1], off glc dlc
+; GFX10-FMA-NEXT:    s_waitcnt vmcnt(0)
+; GFX10-FMA-NEXT:    s_load_dword s0, s[4:5], 0x48
+; GFX10-FMA-NEXT:    v_mov_b32_e32 v1, 0.5
+; GFX10-FMA-NEXT:    s_waitcnt lgkmcnt(0)
+; GFX10-FMA-NEXT:    v_fmaak_f32 v1, s0, v1, 0x42280000
+; GFX10-FMA-NEXT:    v_mul_f32_e32 v0, v1, v0
+; GFX10-FMA-NEXT:    global_store_dword v[0:1], v0, off
+; GFX10-FMA-NEXT:    s_waitcnt_vscnt null, 0x0
+; GFX10-FMA-NEXT:    s_endpgm
+;
+; GFX11-FMA-LABEL: madak_constant_bus_violation:
+; GFX11-FMA:       ; %bb.0: ; %bb
+; GFX11-FMA-NEXT:    s_load_b32 s0, s[4:5], 0x24
+; GFX11-FMA-NEXT:    s_waitcnt lgkmcnt(0)
+; GFX11-FMA-NEXT:    s_cmp_lg_u32 s0, 0
+; GFX11-FMA-NEXT:    s_cbranch_scc1 .LBB9_2
+; GFX11-FMA-NEXT:  ; %bb.1: ; %bb3
+; GFX11-FMA-NEXT:    v_mov_b32_e32 v0, 0
+; GFX11-FMA-NEXT:    global_store_b32 v[0:1], v0, off dlc
+; GFX11-FMA-NEXT:    s_waitcnt_vscnt null, 0x0
+; GFX11-FMA-NEXT:  .LBB9_2: ; %bb4
+; GFX11-FMA-NEXT:    global_load_b32 v0, v[0:1], off glc dlc
+; GFX11-FMA-NEXT:    s_waitcnt vmcnt(0)
+; GFX11-FMA-NEXT:    s_load_b32 s0, s[4:5], 0x48
+; GFX11-FMA-NEXT:    v_mov_b32_e32 v1, 0.5
+; GFX11-FMA-NEXT:    s_waitcnt lgkmcnt(0)
+; GFX11-FMA-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
+; GFX11-FMA-NEXT:    v_fmaak_f32 v1, s0, v1, 0x42280000
+; GFX11-FMA-NEXT:    v_mul_f32_e32 v0, v1, v0
+; GFX11-FMA-NEXT:    global_store_b32 v[0:1], v0, off dlc
+; GFX11-FMA-NEXT:    s_waitcnt_vscnt null, 0x0
+; GFX11-FMA-NEXT:    s_endpgm
 bb:
   %tmp = icmp eq i32 %arg1, 0
   br i1 %tmp, label %bb3, label %bb4
@@ -1196,234 +1509,4 @@ bb4:
   ret void
 }
 
-; With the contract flag, the mul+add fuses to v_fmaak on FMA targets.
-define amdgpu_kernel void @madak_f32_contract(ptr addrspace(1) noalias %out, ptr addrspace(1) noalias %in.a, ptr addrspace(1) noalias %in.b) #0 {
-; GFX6-LABEL: madak_f32_contract:
-; GFX6:       ; %bb.0:
-; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x9
-; GFX6-NEXT:    s_load_dwordx2 s[8:9], s[4:5], 0xd
-; GFX6-NEXT:    s_mov_b32 s7, 0xf000
-; GFX6-NEXT:    s_mov_b32 s6, 0
-; GFX6-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
-; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
-; GFX6-NEXT:    s_mov_b64 s[4:5], s[2:3]
-; GFX6-NEXT:    v_mov_b32_e32 v1, 0
-; GFX6-NEXT:    s_mov_b64 s[10:11], s[6:7]
-; GFX6-NEXT:    buffer_load_dword v2, v[0:1], s[4:7], 0 addr64
-; GFX6-NEXT:    buffer_load_dword v3, v[0:1], s[8:11], 0 addr64
-; GFX6-NEXT:    s_mov_b64 s[2:3], s[6:7]
-; GFX6-NEXT:    s_waitcnt vmcnt(0)
-; GFX6-NEXT:    v_madak_f32 v2, v2, v3, 0x41200000
-; GFX6-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
-; GFX6-NEXT:    s_endpgm
-;
-; GFX8-LABEL: madak_f32_contract:
-; GFX8:       ; %bb.0:
-; GFX8-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x24
-; GFX8-NEXT:    s_load_dwordx2 s[4:5], s[4:5], 0x34
-; GFX8-NEXT:    v_lshlrev_b32_e32 v4, 2, v0
-; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
-; GFX8-NEXT:    v_mov_b32_e32 v1, s3
-; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s2, v4
-; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
-; GFX8-NEXT:    v_mov_b32_e32 v3, s5
-; GFX8-NEXT:    v_add_u32_e32 v2, vcc, s4, v4
-; GFX8-NEXT:    v_addc_u32_e32 v3, vcc, 0, v3, vcc
-; GFX8-NEXT:    flat_load_dword v5, v[0:1]
-; GFX8-NEXT:    flat_load_dword v2, v[2:3]
-; GFX8-NEXT:    v_mov_b32_e32 v1, s1
-; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s0, v4
-; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
-; GFX8-NEXT:    s_waitcnt vmcnt(0)
-; GFX8-NEXT:    v_madak_f32 v2, v5, v2, 0x41200000
-; GFX8-NEXT:    flat_store_dword v[0:1], v2
-; GFX8-NEXT:    s_endpgm
-;
-; GFX9-LABEL: madak_f32_contract:
-; GFX9:       ; %bb.0:
-; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x24
-; GFX9-NEXT:    s_load_dwordx2 s[6:7], s[4:5], 0x34
-; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
-; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
-; GFX9-NEXT:    global_load_dword v1, v0, s[2:3]
-; GFX9-NEXT:    global_load_dword v2, v0, s[6:7]
-; GFX9-NEXT:    s_waitcnt vmcnt(0)
-; GFX9-NEXT:    v_madak_f32 v1, v1, v2, 0x41200000
-; GFX9-NEXT:    global_store_dword v0, v1, s[0:1]
-; GFX9-NEXT:    s_endpgm
-;
-; GFX942-LABEL: madak_f32_contract:
-; GFX942:       ; %bb.0:
-; GFX942-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x24
-; GFX942-NEXT:    s_load_dwordx2 s[6:7], s[4:5], 0x34
-; GFX942-NEXT:    v_and_b32_e32 v0, 0x3ff, v0
-; GFX942-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
-; GFX942-NEXT:    s_waitcnt lgkmcnt(0)
-; GFX942-NEXT:    global_load_dword v1, v0, s[2:3]
-; GFX942-NEXT:    global_load_dword v2, v0, s[6:7]
-; GFX942-NEXT:    s_waitcnt vmcnt(0)
-; GFX942-NEXT:    v_fmaak_f32 v1, v1, v2, 0x41200000
-; GFX942-NEXT:    global_store_dword v0, v1, s[0:1]
-; GFX942-NEXT:    s_endpgm
-;
-; GFX10-MAD-LABEL: madak_f32_contract:
-; GFX10-MAD:       ; %bb.0:
-; GFX10-MAD-NEXT:    s_clause 0x1
-; GFX10-MAD-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x24
-; GFX10-MAD-NEXT:    s_load_dwordx2 s[6:7], s[4:5], 0x34
-; GFX10-MAD-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
-; GFX10-MAD-NEXT:    s_waitcnt lgkmcnt(0)
-; GFX10-MAD-NEXT:    s_clause 0x1
-; GFX10-MAD-NEXT:    global_load_dword v1, v0, s[2:3]
-; GFX10-MAD-NEXT:    global_load_dword v2, v0, s[6:7]
-; GFX10-MAD-NEXT:    s_waitcnt vmcnt(0)
-; GFX10-MAD-NEXT:    v_fmaak_f32 v1, v1, v2, 0x41200000
-; GFX10-MAD-NEXT:    global_store_dword v0, v1, s[0:1]
-; GFX10-MAD-NEXT:    s_endpgm
-;
-; GFX11-MAD-LABEL: madak_f32_contract:
-; GFX11-MAD:       ; %bb.0:
-; GFX11-MAD-NEXT:    s_clause 0x1
-; GFX11-MAD-NEXT:    s_load_b128 s[0:3], s[4:5], 0x24
-; GFX11-MAD-NEXT:    s_load_b64 s[4:5], s[4:5], 0x34
-; GFX11-MAD-NEXT:    v_and_b32_e32 v0, 0x3ff, v0
-; GFX11-MAD-NEXT:    s_delay_alu instid0(VALU_DEP_1)
-; GFX11-MAD-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
-; GFX11-MAD-NEXT:    s_waitcnt lgkmcnt(0)
-; GFX11-MAD-NEXT:    s_clause 0x1
-; GFX11-MAD-NEXT:    global_load_b32 v1, v0, s[2:3]
-; GFX11-MAD-NEXT:    global_load_b32 v2, v0, s[4:5]
-; GFX11-MAD-NEXT:    s_waitcnt vmcnt(0)
-; GFX11-MAD-NEXT:    v_fmaak_f32 v1, v1, v2, 0x41200000
-; GFX11-MAD-NEXT:    global_store_b32 v0, v1, s[0:1]
-; GFX11-MAD-NEXT:    s_endpgm
-  %tid = tail call i32 @llvm.amdgcn.workitem.id.x() nounwind readnone
-  %in.a.gep = getelementptr float, ptr addrspace(1) %in.a, i32 %tid
-  %in.b.gep = getelementptr float, ptr addrspace(1) %in.b, i32 %tid
-  %out.gep = getelementptr float, ptr addrspace(1) %out, i32 %tid
-
-  %a = load float, ptr addrspace(1) %in.a.gep, align 4
-  %b = load float, ptr addrspace(1) %in.b.gep, align 4
-
-  %mul = fmul contract float %a, %b
-  %madak = fadd contract float %mul, 10.0
-  store float %madak, ptr addrspace(1) %out.gep, align 4
-  ret void
-}
-
-; With the contract flag, the mul-by-constant fuses to v_fmamk on FMA targets.
-define amdgpu_kernel void @madmk_f32_contract(ptr addrspace(1) noalias %out, ptr addrspace(1) noalias %in.a, ptr addrspace(1) noalias %in.b) #0 {
-; GFX6-LABEL: madmk_f32_contract:
-; GFX6:       ; %bb.0:
-; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x9
-; GFX6-NEXT:    s_load_dwordx2 s[8:9], s[4:5], 0xd
-; GFX6-NEXT:    s_mov_b32 s7, 0xf000
-; GFX6-NEXT:    s_mov_b32 s6, 0
-; GFX6-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
-; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
-; GFX6-NEXT:    s_mov_b64 s[4:5], s[2:3]
-; GFX6-NEXT:    v_mov_b32_e32 v1, 0
-; GFX6-NEXT:    s_mov_b64 s[10:11], s[6:7]
-; GFX6-NEXT:    buffer_load_dword v2, v[0:1], s[4:7], 0 addr64
-; GFX6-NEXT:    buffer_load_dword v3, v[0:1], s[8:11], 0 addr64
-; GFX6-NEXT:    s_mov_b64 s[2:3], s[6:7]
-; GFX6-NEXT:    s_waitcnt vmcnt(0)
-; GFX6-NEXT:    v_madmk_f32 v2, v2, 0x41200000, v3
-; GFX6-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
-; GFX6-NEXT:    s_endpgm
-;
-; GFX8-LABEL: madmk_f32_contract:
-; GFX8:       ; %bb.0:
-; GFX8-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x24
-; GFX8-NEXT:    s_load_dwordx2 s[4:5], s[4:5], 0x34
-; GFX8-NEXT:    v_lshlrev_b32_e32 v4, 2, v0
-; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
-; GFX8-NEXT:    v_mov_b32_e32 v1, s3
-; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s2, v4
-; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
-; GFX8-NEXT:    v_mov_b32_e32 v3, s5
-; GFX8-NEXT:    v_add_u32_e32 v2, vcc, s4, v4
-; GFX8-NEXT:    v_addc_u32_e32 v3, vcc, 0, v3, vcc
-; GFX8-NEXT:    flat_load_dword v5, v[0:1]
-; GFX8-NEXT:    flat_load_dword v2, v[2:3]
-; GFX8-NEXT:    v_mov_b32_e32 v1, s1
-; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s0, v4
-; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
-; GFX8-NEXT:    s_waitcnt vmcnt(0)
-; GFX8-NEXT:    v_madmk_f32 v2, v5, 0x41200000, v2
-; GFX8-NEXT:    flat_store_dword v[0:1], v2
-; GFX8-NEXT:    s_endpgm
-;
-; GFX9-LABEL: madmk_f32_contract:
-; GFX9:       ; %bb.0:
-; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x24
-; GFX9-NEXT:    s_load_dwordx2 s[6:7], s[4:5], 0x34
-; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
-; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
-; GFX9-NEXT:    global_load_dword v1, v0, s[2:3]
-; GFX9-NEXT:    global_load_dword v2, v0, s[6:7]
-; GFX9-NEXT:    s_waitcnt vmcnt(0)
-; GFX9-NEXT:    v_madmk_f32 v1, v1, 0x41200000, v2
-; GFX9-NEXT:    global_store_dword v0, v1, s[0:1]
-; GFX9-NEXT:    s_endpgm
-;
-; GFX942-LABEL: madmk_f32_contract:
-; GFX942:       ; %bb.0:
-; GFX942-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x24
-; GFX942-NEXT:    s_load_dwordx2 s[6:7], s[4:5], 0x34
-; GFX942-NEXT:    v_and_b32_e32 v0, 0x3ff, v0
-; GFX942-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
-; GFX942-NEXT:    s_waitcnt lgkmcnt(0)
-; GFX942-NEXT:    global_load_dword v1, v0, s[2:3]
-; GFX942-NEXT:    global_load_dword v2, v0, s[6:7]
-; GFX942-NEXT:    s_waitcnt vmcnt(0)
-; GFX942-NEXT:    v_fmamk_f32 v1, v1, 0x41200000, v2
-; GFX942-NEXT:    global_store_dword v0, v1, s[0:1]
-; GFX942-NEXT:    s_endpgm
-;
-; GFX10-MAD-LABEL: madmk_f32_contract:
-; GFX10-MAD:       ; %bb.0:
-; GFX10-MAD-NEXT:    s_clause 0x1
-; GFX10-MAD-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x24
-; GFX10-MAD-NEXT:    s_load_dwordx2 s[6:7], s[4:5], 0x34
-; GFX10-MAD-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
-; GFX10-MAD-NEXT:    s_waitcnt lgkmcnt(0)
-; GFX10-MAD-NEXT:    s_clause 0x1
-; GFX10-MAD-NEXT:    global_load_dword v1, v0, s[2:3]
-; GFX10-MAD-NEXT:    global_load_dword v2, v0, s[6:7]
-; GFX10-MAD-NEXT:    s_waitcnt vmcnt(0)
-; GFX10-MAD-NEXT:    v_fmamk_f32 v1, v1, 0x41200000, v2
-; GFX10-MAD-NEXT:    global_store_dword v0, v1, s[0:1]
-; GFX10-MAD-NEXT:    s_endpgm
-;
-; GFX11-MAD-LABEL: madmk_f32_contract:
-; GFX11-MAD:       ; %bb.0:
-; GFX11-MAD-NEXT:    s_clause 0x1
-; GFX11-MAD-NEXT:    s_load_b128 s[0:3], s[4:5], 0x24
-; GFX11-MAD-NEXT:    s_load_b64 s[4:5], s[4:5], 0x34
-; GFX11-MAD-NEXT:    v_and_b32_e32 v0, 0x3ff, v0
-; GFX11-MAD-NEXT:    s_delay_alu instid0(VALU_DEP_1)
-; GFX11-MAD-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
-; GFX11-MAD-NEXT:    s_waitcnt lgkmcnt(0)
-; GFX11-MAD-NEXT:    s_clause 0x1
-; GFX11-MAD-NEXT:    global_load_b32 v1, v0, s[2:3]
-; GFX11-MAD-NEXT:    global_load_b32 v2, v0, s[4:5]
-; GFX11-MAD-NEXT:    s_waitcnt vmcnt(0)
-; GFX11-MAD-NEXT:    v_fmamk_f32 v1, v1, 0x41200000, v2
-; GFX11-MAD-NEXT:    global_store_b32 v0, v1, s[0:1]
-; GFX11-MAD-NEXT:    s_endpgm
-  %tid = tail call i32 @llvm.amdgcn.workitem.id.x() nounwind readnone
-  %in.a.gep = getelementptr float, ptr addrspace(1) %in.a, i32 %tid
-  %in.b.gep = getelementptr float, ptr addrspace(1) %in.b, i32 %tid
-  %out.gep = getelementptr float, ptr addrspace(1) %out, i32 %tid
-
-  %a = load float, ptr addrspace(1) %in.a.gep, align 4
-  %b = load float, ptr addrspace(1) %in.b.gep, align 4
-
-  %mul = fmul contract float %a, 10.0
-  %madmk = fadd contract float %mul, %b
-  store float %madmk, ptr addrspace(1) %out.gep, align 4
-  ret void
-}
-
 attributes #0 = { nounwind denormal_fpenv(float: preservesign) }

diff  --git a/llvm/test/CodeGen/Hexagon/float-amode.ll b/llvm/test/CodeGen/Hexagon/float-amode.ll
index c455c3a6124a8..0f7133e2d1794 100644
--- a/llvm/test/CodeGen/Hexagon/float-amode.ll
+++ b/llvm/test/CodeGen/Hexagon/float-amode.ll
@@ -1,4 +1,4 @@
-; RUN: llc -mtriple=hexagon -disable-hexagon-peephole -disable-hexagon-amodeopt < %s | FileCheck %s
+; RUN: llc -mtriple=hexagon -fp-contract=fast -disable-hexagon-peephole -disable-hexagon-amodeopt < %s | FileCheck %s
 
 ; The test checks for various addressing modes for floating point loads/stores.
 
@@ -25,8 +25,8 @@ entry:
   %1 = load ptr, ptr %arrayidx, align 4
   %arrayidx1 = getelementptr inbounds float, ptr %1, i32 %col1
   %2 = load float, ptr %arrayidx1, align 4
-  %mul = fmul contract float %2, 2.000000e+01
-  %add = fadd contract float %mul, 1.000000e+01
+  %mul = fmul float %2, 2.000000e+01
+  %add = fadd float %mul, 1.000000e+01
   %arrayidx3 = getelementptr inbounds ptr, ptr %0, i32 5
   %3 = load ptr, ptr %arrayidx3, align 4
   %arrayidx4 = getelementptr inbounds float, ptr %3, i32 %col1

diff  --git a/llvm/test/CodeGen/Hexagon/fmadd.ll b/llvm/test/CodeGen/Hexagon/fmadd.ll
index f8fe9e858ca2f..f1740ccbdd202 100644
--- a/llvm/test/CodeGen/Hexagon/fmadd.ll
+++ b/llvm/test/CodeGen/Hexagon/fmadd.ll
@@ -1,4 +1,4 @@
-; RUN: llc -mtriple=hexagon < %s | FileCheck %s
+; RUN: llc -mtriple=hexagon -fp-contract=fast < %s | FileCheck %s
 
 @g0 = global float 0.000000e+00, align 4
 @g1 = global float 1.000000e+00, align 4
@@ -11,8 +11,8 @@ b0:
   %v1 = load float, ptr @g1, align 4
   %v2 = load float, ptr @g2, align 4
   %v3 = alloca float, align 4
-  %v4 = fmul contract float %v0, %v1
-  %v5 = fadd contract float %v2, %v4
+  %v4 = fmul float %v0, %v1
+  %v5 = fadd float %v2, %v4
   store float %v5, ptr %v3, align 4
   ret void
 }

diff  --git a/llvm/test/CodeGen/Hexagon/fp_latency.ll b/llvm/test/CodeGen/Hexagon/fp_latency.ll
index 1477d6b63b6c1..0da763c6c8bab 100644
--- a/llvm/test/CodeGen/Hexagon/fp_latency.ll
+++ b/llvm/test/CodeGen/Hexagon/fp_latency.ll
@@ -1,4 +1,4 @@
-; RUN: llc -O2 -mtriple=hexagon -pipeliner-prune-loop-carried=false < %s | FileCheck %s
+; RUN: llc -O2 -mtriple=hexagon -fp-contract=fast -pipeliner-prune-loop-carried=false < %s | FileCheck %s
 
 ; Test that there is 1 packet between the FP result and its use.
 
@@ -35,19 +35,19 @@ b2:                                               ; preds = %b2, %b1
   %v15 = add nsw i32 %v14, %v11
   %v16 = getelementptr inbounds [1000 x float], ptr %v1, i32 0, i32 %v15
   %v17 = load float, ptr %v16, align 4, !tbaa !0
-  %v18 = fmul contract float %v17, %v17
+  %v18 = fmul float %v17, %v17
   %v19 = mul nsw i32 %v13, 25
   %v20 = add nsw i32 %v19, %v11
   %v21 = getelementptr inbounds [1000 x float], ptr %v2, i32 0, i32 %v20
   %v22 = load float, ptr %v21, align 4, !tbaa !0
-  %v23 = fmul contract float %v22, %v22
-  %v24 = fadd contract float %v18, %v23
+  %v23 = fmul float %v22, %v22
+  %v24 = fadd float %v18, %v23
   %v25 = load float, ptr %v12, align 4, !tbaa !0
-  %v26 = fmul contract float %v25, %v25
-  %v27 = fadd contract float %v24, %v26
+  %v26 = fmul float %v25, %v25
+  %v27 = fadd float %v24, %v26
   %v28 = getelementptr inbounds [1000 x float], ptr %v0, i32 0, i32 %v20
   %v29 = load float, ptr %v28, align 4, !tbaa !0
-  %v30 = fadd contract float %v29, %v27
+  %v30 = fadd float %v29, %v27
   store float %v30, ptr %v28, align 4, !tbaa !0
   %v31 = add nuw nsw i32 %v13, 1
   %v32 = icmp eq i32 %v13, %v9

diff  --git a/llvm/test/CodeGen/LoongArch/double-fma.ll b/llvm/test/CodeGen/LoongArch/double-fma.ll
index 057260e3ed956..58d20c62a668a 100644
--- a/llvm/test/CodeGen/LoongArch/double-fma.ll
+++ b/llvm/test/CodeGen/LoongArch/double-fma.ll
@@ -1,57 +1,133 @@
 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
-; RUN: llc --mtriple=loongarch32 --mattr=+d < %s \
-; RUN:   | FileCheck %s --check-prefix=LA32
-; RUN: llc --mtriple=loongarch64 --mattr=+d < %s \
-; RUN:   | FileCheck %s --check-prefix=LA64
+; RUN: llc --mtriple=loongarch32 --mattr=+d --fp-contract=fast < %s \
+; RUN:   | FileCheck %s --check-prefix=LA32-CONTRACT-FAST
+; RUN: llc --mtriple=loongarch32 --mattr=+d --fp-contract=on < %s \
+; RUN:   | FileCheck %s --check-prefix=LA32-CONTRACT-ON
+; RUN: llc --mtriple=loongarch32 --mattr=+d --fp-contract=off < %s \
+; RUN:   | FileCheck %s --check-prefix=LA32-CONTRACT-OFF
+; RUN: llc --mtriple=loongarch64 --mattr=+d --fp-contract=fast < %s \
+; RUN:   | FileCheck %s --check-prefix=LA64-CONTRACT-FAST
+; RUN: llc --mtriple=loongarch64 --mattr=+d --fp-contract=on < %s \
+; RUN:   | FileCheck %s --check-prefix=LA64-CONTRACT-ON
+; RUN: llc --mtriple=loongarch64 --mattr=+d --fp-contract=off < %s \
+; RUN:   | FileCheck %s --check-prefix=LA64-CONTRACT-OFF
 
 define double @fmadd_d(double %a, double %b, double %c) nounwind {
-; LA32-LABEL: fmadd_d:
-; LA32:       # %bb.0:
-; LA32-NEXT:    fmul.d $fa0, $fa0, $fa1
-; LA32-NEXT:    fadd.d $fa0, $fa0, $fa2
-; LA32-NEXT:    ret
-;
-; LA64-LABEL: fmadd_d:
-; LA64:       # %bb.0:
-; LA64-NEXT:    fmul.d $fa0, $fa0, $fa1
-; LA64-NEXT:    fadd.d $fa0, $fa0, $fa2
-; LA64-NEXT:    ret
+; LA32-CONTRACT-FAST-LABEL: fmadd_d:
+; LA32-CONTRACT-FAST:       # %bb.0:
+; LA32-CONTRACT-FAST-NEXT:    fmadd.d $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-FAST-NEXT:    ret
+;
+; LA32-CONTRACT-ON-LABEL: fmadd_d:
+; LA32-CONTRACT-ON:       # %bb.0:
+; LA32-CONTRACT-ON-NEXT:    fmul.d $fa0, $fa0, $fa1
+; LA32-CONTRACT-ON-NEXT:    fadd.d $fa0, $fa0, $fa2
+; LA32-CONTRACT-ON-NEXT:    ret
+;
+; LA32-CONTRACT-OFF-LABEL: fmadd_d:
+; LA32-CONTRACT-OFF:       # %bb.0:
+; LA32-CONTRACT-OFF-NEXT:    fmul.d $fa0, $fa0, $fa1
+; LA32-CONTRACT-OFF-NEXT:    fadd.d $fa0, $fa0, $fa2
+; LA32-CONTRACT-OFF-NEXT:    ret
+;
+; LA64-CONTRACT-FAST-LABEL: fmadd_d:
+; LA64-CONTRACT-FAST:       # %bb.0:
+; LA64-CONTRACT-FAST-NEXT:    fmadd.d $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-FAST-NEXT:    ret
+;
+; LA64-CONTRACT-ON-LABEL: fmadd_d:
+; LA64-CONTRACT-ON:       # %bb.0:
+; LA64-CONTRACT-ON-NEXT:    fmul.d $fa0, $fa0, $fa1
+; LA64-CONTRACT-ON-NEXT:    fadd.d $fa0, $fa0, $fa2
+; LA64-CONTRACT-ON-NEXT:    ret
+;
+; LA64-CONTRACT-OFF-LABEL: fmadd_d:
+; LA64-CONTRACT-OFF:       # %bb.0:
+; LA64-CONTRACT-OFF-NEXT:    fmul.d $fa0, $fa0, $fa1
+; LA64-CONTRACT-OFF-NEXT:    fadd.d $fa0, $fa0, $fa2
+; LA64-CONTRACT-OFF-NEXT:    ret
   %mul = fmul double %a, %b
   %add = fadd double %mul, %c
   ret double %add
 }
 
 define double @fmsub_d(double %a, double %b, double %c) nounwind {
-; LA32-LABEL: fmsub_d:
-; LA32:       # %bb.0:
-; LA32-NEXT:    fmul.d $fa0, $fa0, $fa1
-; LA32-NEXT:    fsub.d $fa0, $fa0, $fa2
-; LA32-NEXT:    ret
-;
-; LA64-LABEL: fmsub_d:
-; LA64:       # %bb.0:
-; LA64-NEXT:    fmul.d $fa0, $fa0, $fa1
-; LA64-NEXT:    fsub.d $fa0, $fa0, $fa2
-; LA64-NEXT:    ret
+; LA32-CONTRACT-FAST-LABEL: fmsub_d:
+; LA32-CONTRACT-FAST:       # %bb.0:
+; LA32-CONTRACT-FAST-NEXT:    fmsub.d $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-FAST-NEXT:    ret
+;
+; LA32-CONTRACT-ON-LABEL: fmsub_d:
+; LA32-CONTRACT-ON:       # %bb.0:
+; LA32-CONTRACT-ON-NEXT:    fmul.d $fa0, $fa0, $fa1
+; LA32-CONTRACT-ON-NEXT:    fsub.d $fa0, $fa0, $fa2
+; LA32-CONTRACT-ON-NEXT:    ret
+;
+; LA32-CONTRACT-OFF-LABEL: fmsub_d:
+; LA32-CONTRACT-OFF:       # %bb.0:
+; LA32-CONTRACT-OFF-NEXT:    fmul.d $fa0, $fa0, $fa1
+; LA32-CONTRACT-OFF-NEXT:    fsub.d $fa0, $fa0, $fa2
+; LA32-CONTRACT-OFF-NEXT:    ret
+;
+; LA64-CONTRACT-FAST-LABEL: fmsub_d:
+; LA64-CONTRACT-FAST:       # %bb.0:
+; LA64-CONTRACT-FAST-NEXT:    fmsub.d $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-FAST-NEXT:    ret
+;
+; LA64-CONTRACT-ON-LABEL: fmsub_d:
+; LA64-CONTRACT-ON:       # %bb.0:
+; LA64-CONTRACT-ON-NEXT:    fmul.d $fa0, $fa0, $fa1
+; LA64-CONTRACT-ON-NEXT:    fsub.d $fa0, $fa0, $fa2
+; LA64-CONTRACT-ON-NEXT:    ret
+;
+; LA64-CONTRACT-OFF-LABEL: fmsub_d:
+; LA64-CONTRACT-OFF:       # %bb.0:
+; LA64-CONTRACT-OFF-NEXT:    fmul.d $fa0, $fa0, $fa1
+; LA64-CONTRACT-OFF-NEXT:    fsub.d $fa0, $fa0, $fa2
+; LA64-CONTRACT-OFF-NEXT:    ret
   %mul = fmul double %a, %b
   %sub = fsub double %mul, %c
   ret double %sub
 }
 
 define double @fnmadd_d(double %a, double %b, double %c) nounwind {
-; LA32-LABEL: fnmadd_d:
-; LA32:       # %bb.0:
-; LA32-NEXT:    fmul.d $fa0, $fa0, $fa1
-; LA32-NEXT:    fadd.d $fa0, $fa0, $fa2
-; LA32-NEXT:    fneg.d $fa0, $fa0
-; LA32-NEXT:    ret
-;
-; LA64-LABEL: fnmadd_d:
-; LA64:       # %bb.0:
-; LA64-NEXT:    fmul.d $fa0, $fa0, $fa1
-; LA64-NEXT:    fadd.d $fa0, $fa0, $fa2
-; LA64-NEXT:    fneg.d $fa0, $fa0
-; LA64-NEXT:    ret
+; LA32-CONTRACT-FAST-LABEL: fnmadd_d:
+; LA32-CONTRACT-FAST:       # %bb.0:
+; LA32-CONTRACT-FAST-NEXT:    fnmadd.d $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-FAST-NEXT:    ret
+;
+; LA32-CONTRACT-ON-LABEL: fnmadd_d:
+; LA32-CONTRACT-ON:       # %bb.0:
+; LA32-CONTRACT-ON-NEXT:    fmul.d $fa0, $fa0, $fa1
+; LA32-CONTRACT-ON-NEXT:    fadd.d $fa0, $fa0, $fa2
+; LA32-CONTRACT-ON-NEXT:    fneg.d $fa0, $fa0
+; LA32-CONTRACT-ON-NEXT:    ret
+;
+; LA32-CONTRACT-OFF-LABEL: fnmadd_d:
+; LA32-CONTRACT-OFF:       # %bb.0:
+; LA32-CONTRACT-OFF-NEXT:    fmul.d $fa0, $fa0, $fa1
+; LA32-CONTRACT-OFF-NEXT:    fadd.d $fa0, $fa0, $fa2
+; LA32-CONTRACT-OFF-NEXT:    fneg.d $fa0, $fa0
+; LA32-CONTRACT-OFF-NEXT:    ret
+;
+; LA64-CONTRACT-FAST-LABEL: fnmadd_d:
+; LA64-CONTRACT-FAST:       # %bb.0:
+; LA64-CONTRACT-FAST-NEXT:    fnmadd.d $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-FAST-NEXT:    ret
+;
+; LA64-CONTRACT-ON-LABEL: fnmadd_d:
+; LA64-CONTRACT-ON:       # %bb.0:
+; LA64-CONTRACT-ON-NEXT:    fmul.d $fa0, $fa0, $fa1
+; LA64-CONTRACT-ON-NEXT:    fadd.d $fa0, $fa0, $fa2
+; LA64-CONTRACT-ON-NEXT:    fneg.d $fa0, $fa0
+; LA64-CONTRACT-ON-NEXT:    ret
+;
+; LA64-CONTRACT-OFF-LABEL: fnmadd_d:
+; LA64-CONTRACT-OFF:       # %bb.0:
+; LA64-CONTRACT-OFF-NEXT:    fmul.d $fa0, $fa0, $fa1
+; LA64-CONTRACT-OFF-NEXT:    fadd.d $fa0, $fa0, $fa2
+; LA64-CONTRACT-OFF-NEXT:    fneg.d $fa0, $fa0
+; LA64-CONTRACT-OFF-NEXT:    ret
   %mul = fmul double %a, %b
   %add = fadd double %mul, %c
   %negadd = fneg double %add
@@ -59,19 +135,43 @@ define double @fnmadd_d(double %a, double %b, double %c) nounwind {
 }
 
 define double @fnmadd_d_nsz(double %a, double %b, double %c) nounwind {
-; LA32-LABEL: fnmadd_d_nsz:
-; LA32:       # %bb.0:
-; LA32-NEXT:    fneg.d $fa0, $fa0
-; LA32-NEXT:    fmul.d $fa0, $fa0, $fa1
-; LA32-NEXT:    fsub.d $fa0, $fa0, $fa2
-; LA32-NEXT:    ret
-;
-; LA64-LABEL: fnmadd_d_nsz:
-; LA64:       # %bb.0:
-; LA64-NEXT:    fneg.d $fa0, $fa0
-; LA64-NEXT:    fmul.d $fa0, $fa0, $fa1
-; LA64-NEXT:    fsub.d $fa0, $fa0, $fa2
-; LA64-NEXT:    ret
+; LA32-CONTRACT-FAST-LABEL: fnmadd_d_nsz:
+; LA32-CONTRACT-FAST:       # %bb.0:
+; LA32-CONTRACT-FAST-NEXT:    fnmadd.d $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-FAST-NEXT:    ret
+;
+; LA32-CONTRACT-ON-LABEL: fnmadd_d_nsz:
+; LA32-CONTRACT-ON:       # %bb.0:
+; LA32-CONTRACT-ON-NEXT:    fneg.d $fa0, $fa0
+; LA32-CONTRACT-ON-NEXT:    fmul.d $fa0, $fa0, $fa1
+; LA32-CONTRACT-ON-NEXT:    fsub.d $fa0, $fa0, $fa2
+; LA32-CONTRACT-ON-NEXT:    ret
+;
+; LA32-CONTRACT-OFF-LABEL: fnmadd_d_nsz:
+; LA32-CONTRACT-OFF:       # %bb.0:
+; LA32-CONTRACT-OFF-NEXT:    fneg.d $fa0, $fa0
+; LA32-CONTRACT-OFF-NEXT:    fmul.d $fa0, $fa0, $fa1
+; LA32-CONTRACT-OFF-NEXT:    fsub.d $fa0, $fa0, $fa2
+; LA32-CONTRACT-OFF-NEXT:    ret
+;
+; LA64-CONTRACT-FAST-LABEL: fnmadd_d_nsz:
+; LA64-CONTRACT-FAST:       # %bb.0:
+; LA64-CONTRACT-FAST-NEXT:    fnmadd.d $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-FAST-NEXT:    ret
+;
+; LA64-CONTRACT-ON-LABEL: fnmadd_d_nsz:
+; LA64-CONTRACT-ON:       # %bb.0:
+; LA64-CONTRACT-ON-NEXT:    fneg.d $fa0, $fa0
+; LA64-CONTRACT-ON-NEXT:    fmul.d $fa0, $fa0, $fa1
+; LA64-CONTRACT-ON-NEXT:    fsub.d $fa0, $fa0, $fa2
+; LA64-CONTRACT-ON-NEXT:    ret
+;
+; LA64-CONTRACT-OFF-LABEL: fnmadd_d_nsz:
+; LA64-CONTRACT-OFF:       # %bb.0:
+; LA64-CONTRACT-OFF-NEXT:    fneg.d $fa0, $fa0
+; LA64-CONTRACT-OFF-NEXT:    fmul.d $fa0, $fa0, $fa1
+; LA64-CONTRACT-OFF-NEXT:    fsub.d $fa0, $fa0, $fa2
+; LA64-CONTRACT-OFF-NEXT:    ret
   %nega = fneg nsz double %a
   %negc = fneg nsz double %c
   %mul = fmul nsz double %nega, %b
@@ -81,19 +181,45 @@ define double @fnmadd_d_nsz(double %a, double %b, double %c) nounwind {
 
 ;; Check that fnmadd.d is not emitted.
 define double @not_fnmadd_d(double %a, double %b, double %c) nounwind {
-; LA32-LABEL: not_fnmadd_d:
-; LA32:       # %bb.0:
-; LA32-NEXT:    fneg.d $fa0, $fa0
-; LA32-NEXT:    fmul.d $fa0, $fa0, $fa1
-; LA32-NEXT:    fsub.d $fa0, $fa0, $fa2
-; LA32-NEXT:    ret
-;
-; LA64-LABEL: not_fnmadd_d:
-; LA64:       # %bb.0:
-; LA64-NEXT:    fneg.d $fa0, $fa0
-; LA64-NEXT:    fmul.d $fa0, $fa0, $fa1
-; LA64-NEXT:    fsub.d $fa0, $fa0, $fa2
-; LA64-NEXT:    ret
+; LA32-CONTRACT-FAST-LABEL: not_fnmadd_d:
+; LA32-CONTRACT-FAST:       # %bb.0:
+; LA32-CONTRACT-FAST-NEXT:    fneg.d $fa0, $fa0
+; LA32-CONTRACT-FAST-NEXT:    fmsub.d $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-FAST-NEXT:    ret
+;
+; LA32-CONTRACT-ON-LABEL: not_fnmadd_d:
+; LA32-CONTRACT-ON:       # %bb.0:
+; LA32-CONTRACT-ON-NEXT:    fneg.d $fa0, $fa0
+; LA32-CONTRACT-ON-NEXT:    fmul.d $fa0, $fa0, $fa1
+; LA32-CONTRACT-ON-NEXT:    fsub.d $fa0, $fa0, $fa2
+; LA32-CONTRACT-ON-NEXT:    ret
+;
+; LA32-CONTRACT-OFF-LABEL: not_fnmadd_d:
+; LA32-CONTRACT-OFF:       # %bb.0:
+; LA32-CONTRACT-OFF-NEXT:    fneg.d $fa0, $fa0
+; LA32-CONTRACT-OFF-NEXT:    fmul.d $fa0, $fa0, $fa1
+; LA32-CONTRACT-OFF-NEXT:    fsub.d $fa0, $fa0, $fa2
+; LA32-CONTRACT-OFF-NEXT:    ret
+;
+; LA64-CONTRACT-FAST-LABEL: not_fnmadd_d:
+; LA64-CONTRACT-FAST:       # %bb.0:
+; LA64-CONTRACT-FAST-NEXT:    fneg.d $fa0, $fa0
+; LA64-CONTRACT-FAST-NEXT:    fmsub.d $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-FAST-NEXT:    ret
+;
+; LA64-CONTRACT-ON-LABEL: not_fnmadd_d:
+; LA64-CONTRACT-ON:       # %bb.0:
+; LA64-CONTRACT-ON-NEXT:    fneg.d $fa0, $fa0
+; LA64-CONTRACT-ON-NEXT:    fmul.d $fa0, $fa0, $fa1
+; LA64-CONTRACT-ON-NEXT:    fsub.d $fa0, $fa0, $fa2
+; LA64-CONTRACT-ON-NEXT:    ret
+;
+; LA64-CONTRACT-OFF-LABEL: not_fnmadd_d:
+; LA64-CONTRACT-OFF:       # %bb.0:
+; LA64-CONTRACT-OFF-NEXT:    fneg.d $fa0, $fa0
+; LA64-CONTRACT-OFF-NEXT:    fmul.d $fa0, $fa0, $fa1
+; LA64-CONTRACT-OFF-NEXT:    fsub.d $fa0, $fa0, $fa2
+; LA64-CONTRACT-OFF-NEXT:    ret
   %nega = fneg double %a
   %negc = fneg double %c
   %mul = fmul double %nega, %b
@@ -102,19 +228,43 @@ define double @not_fnmadd_d(double %a, double %b, double %c) nounwind {
 }
 
 define double @fnmsub_d(double %a, double %b, double %c) nounwind {
-; LA32-LABEL: fnmsub_d:
-; LA32:       # %bb.0:
-; LA32-NEXT:    fmul.d $fa0, $fa0, $fa1
-; LA32-NEXT:    fsub.d $fa0, $fa0, $fa2
-; LA32-NEXT:    fneg.d $fa0, $fa0
-; LA32-NEXT:    ret
-;
-; LA64-LABEL: fnmsub_d:
-; LA64:       # %bb.0:
-; LA64-NEXT:    fmul.d $fa0, $fa0, $fa1
-; LA64-NEXT:    fsub.d $fa0, $fa0, $fa2
-; LA64-NEXT:    fneg.d $fa0, $fa0
-; LA64-NEXT:    ret
+; LA32-CONTRACT-FAST-LABEL: fnmsub_d:
+; LA32-CONTRACT-FAST:       # %bb.0:
+; LA32-CONTRACT-FAST-NEXT:    fnmsub.d $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-FAST-NEXT:    ret
+;
+; LA32-CONTRACT-ON-LABEL: fnmsub_d:
+; LA32-CONTRACT-ON:       # %bb.0:
+; LA32-CONTRACT-ON-NEXT:    fmul.d $fa0, $fa0, $fa1
+; LA32-CONTRACT-ON-NEXT:    fsub.d $fa0, $fa0, $fa2
+; LA32-CONTRACT-ON-NEXT:    fneg.d $fa0, $fa0
+; LA32-CONTRACT-ON-NEXT:    ret
+;
+; LA32-CONTRACT-OFF-LABEL: fnmsub_d:
+; LA32-CONTRACT-OFF:       # %bb.0:
+; LA32-CONTRACT-OFF-NEXT:    fmul.d $fa0, $fa0, $fa1
+; LA32-CONTRACT-OFF-NEXT:    fsub.d $fa0, $fa0, $fa2
+; LA32-CONTRACT-OFF-NEXT:    fneg.d $fa0, $fa0
+; LA32-CONTRACT-OFF-NEXT:    ret
+;
+; LA64-CONTRACT-FAST-LABEL: fnmsub_d:
+; LA64-CONTRACT-FAST:       # %bb.0:
+; LA64-CONTRACT-FAST-NEXT:    fnmsub.d $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-FAST-NEXT:    ret
+;
+; LA64-CONTRACT-ON-LABEL: fnmsub_d:
+; LA64-CONTRACT-ON:       # %bb.0:
+; LA64-CONTRACT-ON-NEXT:    fmul.d $fa0, $fa0, $fa1
+; LA64-CONTRACT-ON-NEXT:    fsub.d $fa0, $fa0, $fa2
+; LA64-CONTRACT-ON-NEXT:    fneg.d $fa0, $fa0
+; LA64-CONTRACT-ON-NEXT:    ret
+;
+; LA64-CONTRACT-OFF-LABEL: fnmsub_d:
+; LA64-CONTRACT-OFF:       # %bb.0:
+; LA64-CONTRACT-OFF-NEXT:    fmul.d $fa0, $fa0, $fa1
+; LA64-CONTRACT-OFF-NEXT:    fsub.d $fa0, $fa0, $fa2
+; LA64-CONTRACT-OFF-NEXT:    fneg.d $fa0, $fa0
+; LA64-CONTRACT-OFF-NEXT:    ret
   %negc = fneg double %c
   %mul = fmul double %a, %b
   %add = fadd double %mul, %negc
@@ -123,17 +273,39 @@ define double @fnmsub_d(double %a, double %b, double %c) nounwind {
 }
 
 define double @fnmsub_d_nsz(double %a, double %b, double %c) nounwind {
-; LA32-LABEL: fnmsub_d_nsz:
-; LA32:       # %bb.0:
-; LA32-NEXT:    fmul.d $fa0, $fa0, $fa1
-; LA32-NEXT:    fsub.d $fa0, $fa2, $fa0
-; LA32-NEXT:    ret
-;
-; LA64-LABEL: fnmsub_d_nsz:
-; LA64:       # %bb.0:
-; LA64-NEXT:    fmul.d $fa0, $fa0, $fa1
-; LA64-NEXT:    fsub.d $fa0, $fa2, $fa0
-; LA64-NEXT:    ret
+; LA32-CONTRACT-FAST-LABEL: fnmsub_d_nsz:
+; LA32-CONTRACT-FAST:       # %bb.0:
+; LA32-CONTRACT-FAST-NEXT:    fnmsub.d $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-FAST-NEXT:    ret
+;
+; LA32-CONTRACT-ON-LABEL: fnmsub_d_nsz:
+; LA32-CONTRACT-ON:       # %bb.0:
+; LA32-CONTRACT-ON-NEXT:    fmul.d $fa0, $fa0, $fa1
+; LA32-CONTRACT-ON-NEXT:    fsub.d $fa0, $fa2, $fa0
+; LA32-CONTRACT-ON-NEXT:    ret
+;
+; LA32-CONTRACT-OFF-LABEL: fnmsub_d_nsz:
+; LA32-CONTRACT-OFF:       # %bb.0:
+; LA32-CONTRACT-OFF-NEXT:    fmul.d $fa0, $fa0, $fa1
+; LA32-CONTRACT-OFF-NEXT:    fsub.d $fa0, $fa2, $fa0
+; LA32-CONTRACT-OFF-NEXT:    ret
+;
+; LA64-CONTRACT-FAST-LABEL: fnmsub_d_nsz:
+; LA64-CONTRACT-FAST:       # %bb.0:
+; LA64-CONTRACT-FAST-NEXT:    fnmsub.d $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-FAST-NEXT:    ret
+;
+; LA64-CONTRACT-ON-LABEL: fnmsub_d_nsz:
+; LA64-CONTRACT-ON:       # %bb.0:
+; LA64-CONTRACT-ON-NEXT:    fmul.d $fa0, $fa0, $fa1
+; LA64-CONTRACT-ON-NEXT:    fsub.d $fa0, $fa2, $fa0
+; LA64-CONTRACT-ON-NEXT:    ret
+;
+; LA64-CONTRACT-OFF-LABEL: fnmsub_d_nsz:
+; LA64-CONTRACT-OFF:       # %bb.0:
+; LA64-CONTRACT-OFF-NEXT:    fmul.d $fa0, $fa0, $fa1
+; LA64-CONTRACT-OFF-NEXT:    fsub.d $fa0, $fa2, $fa0
+; LA64-CONTRACT-OFF-NEXT:    ret
   %nega = fneg nsz double %a
   %mul = fmul nsz double %nega, %b
   %add = fadd nsz double %mul, %c
@@ -142,17 +314,41 @@ define double @fnmsub_d_nsz(double %a, double %b, double %c) nounwind {
 
 ;; Check that fnmsub.d is not emitted.
 define double @not_fnmsub_d(double %a, double %b, double %c) nounwind {
-; LA32-LABEL: not_fnmsub_d:
-; LA32:       # %bb.0:
-; LA32-NEXT:    fmul.d $fa0, $fa0, $fa1
-; LA32-NEXT:    fsub.d $fa0, $fa2, $fa0
-; LA32-NEXT:    ret
-;
-; LA64-LABEL: not_fnmsub_d:
-; LA64:       # %bb.0:
-; LA64-NEXT:    fmul.d $fa0, $fa0, $fa1
-; LA64-NEXT:    fsub.d $fa0, $fa2, $fa0
-; LA64-NEXT:    ret
+; LA32-CONTRACT-FAST-LABEL: not_fnmsub_d:
+; LA32-CONTRACT-FAST:       # %bb.0:
+; LA32-CONTRACT-FAST-NEXT:    fneg.d $fa0, $fa0
+; LA32-CONTRACT-FAST-NEXT:    fmadd.d $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-FAST-NEXT:    ret
+;
+; LA32-CONTRACT-ON-LABEL: not_fnmsub_d:
+; LA32-CONTRACT-ON:       # %bb.0:
+; LA32-CONTRACT-ON-NEXT:    fmul.d $fa0, $fa0, $fa1
+; LA32-CONTRACT-ON-NEXT:    fsub.d $fa0, $fa2, $fa0
+; LA32-CONTRACT-ON-NEXT:    ret
+;
+; LA32-CONTRACT-OFF-LABEL: not_fnmsub_d:
+; LA32-CONTRACT-OFF:       # %bb.0:
+; LA32-CONTRACT-OFF-NEXT:    fmul.d $fa0, $fa0, $fa1
+; LA32-CONTRACT-OFF-NEXT:    fsub.d $fa0, $fa2, $fa0
+; LA32-CONTRACT-OFF-NEXT:    ret
+;
+; LA64-CONTRACT-FAST-LABEL: not_fnmsub_d:
+; LA64-CONTRACT-FAST:       # %bb.0:
+; LA64-CONTRACT-FAST-NEXT:    fneg.d $fa0, $fa0
+; LA64-CONTRACT-FAST-NEXT:    fmadd.d $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-FAST-NEXT:    ret
+;
+; LA64-CONTRACT-ON-LABEL: not_fnmsub_d:
+; LA64-CONTRACT-ON:       # %bb.0:
+; LA64-CONTRACT-ON-NEXT:    fmul.d $fa0, $fa0, $fa1
+; LA64-CONTRACT-ON-NEXT:    fsub.d $fa0, $fa2, $fa0
+; LA64-CONTRACT-ON-NEXT:    ret
+;
+; LA64-CONTRACT-OFF-LABEL: not_fnmsub_d:
+; LA64-CONTRACT-OFF:       # %bb.0:
+; LA64-CONTRACT-OFF-NEXT:    fmul.d $fa0, $fa0, $fa1
+; LA64-CONTRACT-OFF-NEXT:    fsub.d $fa0, $fa2, $fa0
+; LA64-CONTRACT-OFF-NEXT:    ret
   %nega = fneg double %a
   %mul = fmul double %nega, %b
   %add = fadd double %mul, %c
@@ -160,45 +356,105 @@ define double @not_fnmsub_d(double %a, double %b, double %c) nounwind {
 }
 
 define double @contract_fmadd_d(double %a, double %b, double %c) nounwind {
-; LA32-LABEL: contract_fmadd_d:
-; LA32:       # %bb.0:
-; LA32-NEXT:    fmadd.d $fa0, $fa0, $fa1, $fa2
-; LA32-NEXT:    ret
-;
-; LA64-LABEL: contract_fmadd_d:
-; LA64:       # %bb.0:
-; LA64-NEXT:    fmadd.d $fa0, $fa0, $fa1, $fa2
-; LA64-NEXT:    ret
+; LA32-CONTRACT-FAST-LABEL: contract_fmadd_d:
+; LA32-CONTRACT-FAST:       # %bb.0:
+; LA32-CONTRACT-FAST-NEXT:    fmadd.d $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-FAST-NEXT:    ret
+;
+; LA32-CONTRACT-ON-LABEL: contract_fmadd_d:
+; LA32-CONTRACT-ON:       # %bb.0:
+; LA32-CONTRACT-ON-NEXT:    fmadd.d $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-ON-NEXT:    ret
+;
+; LA32-CONTRACT-OFF-LABEL: contract_fmadd_d:
+; LA32-CONTRACT-OFF:       # %bb.0:
+; LA32-CONTRACT-OFF-NEXT:    fmadd.d $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-OFF-NEXT:    ret
+;
+; LA64-CONTRACT-FAST-LABEL: contract_fmadd_d:
+; LA64-CONTRACT-FAST:       # %bb.0:
+; LA64-CONTRACT-FAST-NEXT:    fmadd.d $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-FAST-NEXT:    ret
+;
+; LA64-CONTRACT-ON-LABEL: contract_fmadd_d:
+; LA64-CONTRACT-ON:       # %bb.0:
+; LA64-CONTRACT-ON-NEXT:    fmadd.d $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-ON-NEXT:    ret
+;
+; LA64-CONTRACT-OFF-LABEL: contract_fmadd_d:
+; LA64-CONTRACT-OFF:       # %bb.0:
+; LA64-CONTRACT-OFF-NEXT:    fmadd.d $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-OFF-NEXT:    ret
   %mul = fmul contract double %a, %b
   %add = fadd contract double %mul, %c
   ret double %add
 }
 
 define double @contract_fmsub_d(double %a, double %b, double %c) nounwind {
-; LA32-LABEL: contract_fmsub_d:
-; LA32:       # %bb.0:
-; LA32-NEXT:    fmsub.d $fa0, $fa0, $fa1, $fa2
-; LA32-NEXT:    ret
-;
-; LA64-LABEL: contract_fmsub_d:
-; LA64:       # %bb.0:
-; LA64-NEXT:    fmsub.d $fa0, $fa0, $fa1, $fa2
-; LA64-NEXT:    ret
+; LA32-CONTRACT-FAST-LABEL: contract_fmsub_d:
+; LA32-CONTRACT-FAST:       # %bb.0:
+; LA32-CONTRACT-FAST-NEXT:    fmsub.d $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-FAST-NEXT:    ret
+;
+; LA32-CONTRACT-ON-LABEL: contract_fmsub_d:
+; LA32-CONTRACT-ON:       # %bb.0:
+; LA32-CONTRACT-ON-NEXT:    fmsub.d $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-ON-NEXT:    ret
+;
+; LA32-CONTRACT-OFF-LABEL: contract_fmsub_d:
+; LA32-CONTRACT-OFF:       # %bb.0:
+; LA32-CONTRACT-OFF-NEXT:    fmsub.d $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-OFF-NEXT:    ret
+;
+; LA64-CONTRACT-FAST-LABEL: contract_fmsub_d:
+; LA64-CONTRACT-FAST:       # %bb.0:
+; LA64-CONTRACT-FAST-NEXT:    fmsub.d $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-FAST-NEXT:    ret
+;
+; LA64-CONTRACT-ON-LABEL: contract_fmsub_d:
+; LA64-CONTRACT-ON:       # %bb.0:
+; LA64-CONTRACT-ON-NEXT:    fmsub.d $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-ON-NEXT:    ret
+;
+; LA64-CONTRACT-OFF-LABEL: contract_fmsub_d:
+; LA64-CONTRACT-OFF:       # %bb.0:
+; LA64-CONTRACT-OFF-NEXT:    fmsub.d $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-OFF-NEXT:    ret
   %mul = fmul contract double %a, %b
   %sub = fsub contract double %mul, %c
   ret double %sub
 }
 
 define double @contract_fnmadd_d(double %a, double %b, double %c) nounwind {
-; LA32-LABEL: contract_fnmadd_d:
-; LA32:       # %bb.0:
-; LA32-NEXT:    fnmadd.d $fa0, $fa0, $fa1, $fa2
-; LA32-NEXT:    ret
-;
-; LA64-LABEL: contract_fnmadd_d:
-; LA64:       # %bb.0:
-; LA64-NEXT:    fnmadd.d $fa0, $fa0, $fa1, $fa2
-; LA64-NEXT:    ret
+; LA32-CONTRACT-FAST-LABEL: contract_fnmadd_d:
+; LA32-CONTRACT-FAST:       # %bb.0:
+; LA32-CONTRACT-FAST-NEXT:    fnmadd.d $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-FAST-NEXT:    ret
+;
+; LA32-CONTRACT-ON-LABEL: contract_fnmadd_d:
+; LA32-CONTRACT-ON:       # %bb.0:
+; LA32-CONTRACT-ON-NEXT:    fnmadd.d $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-ON-NEXT:    ret
+;
+; LA32-CONTRACT-OFF-LABEL: contract_fnmadd_d:
+; LA32-CONTRACT-OFF:       # %bb.0:
+; LA32-CONTRACT-OFF-NEXT:    fnmadd.d $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-OFF-NEXT:    ret
+;
+; LA64-CONTRACT-FAST-LABEL: contract_fnmadd_d:
+; LA64-CONTRACT-FAST:       # %bb.0:
+; LA64-CONTRACT-FAST-NEXT:    fnmadd.d $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-FAST-NEXT:    ret
+;
+; LA64-CONTRACT-ON-LABEL: contract_fnmadd_d:
+; LA64-CONTRACT-ON:       # %bb.0:
+; LA64-CONTRACT-ON-NEXT:    fnmadd.d $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-ON-NEXT:    ret
+;
+; LA64-CONTRACT-OFF-LABEL: contract_fnmadd_d:
+; LA64-CONTRACT-OFF:       # %bb.0:
+; LA64-CONTRACT-OFF-NEXT:    fnmadd.d $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-OFF-NEXT:    ret
   %mul = fmul contract double %a, %b
   %add = fadd contract double %mul, %c
   %negadd = fneg contract double %add
@@ -206,15 +462,35 @@ define double @contract_fnmadd_d(double %a, double %b, double %c) nounwind {
 }
 
 define double @contract_fnmadd_d_nsz(double %a, double %b, double %c) nounwind {
-; LA32-LABEL: contract_fnmadd_d_nsz:
-; LA32:       # %bb.0:
-; LA32-NEXT:    fnmadd.d $fa0, $fa0, $fa1, $fa2
-; LA32-NEXT:    ret
-;
-; LA64-LABEL: contract_fnmadd_d_nsz:
-; LA64:       # %bb.0:
-; LA64-NEXT:    fnmadd.d $fa0, $fa0, $fa1, $fa2
-; LA64-NEXT:    ret
+; LA32-CONTRACT-FAST-LABEL: contract_fnmadd_d_nsz:
+; LA32-CONTRACT-FAST:       # %bb.0:
+; LA32-CONTRACT-FAST-NEXT:    fnmadd.d $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-FAST-NEXT:    ret
+;
+; LA32-CONTRACT-ON-LABEL: contract_fnmadd_d_nsz:
+; LA32-CONTRACT-ON:       # %bb.0:
+; LA32-CONTRACT-ON-NEXT:    fnmadd.d $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-ON-NEXT:    ret
+;
+; LA32-CONTRACT-OFF-LABEL: contract_fnmadd_d_nsz:
+; LA32-CONTRACT-OFF:       # %bb.0:
+; LA32-CONTRACT-OFF-NEXT:    fnmadd.d $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-OFF-NEXT:    ret
+;
+; LA64-CONTRACT-FAST-LABEL: contract_fnmadd_d_nsz:
+; LA64-CONTRACT-FAST:       # %bb.0:
+; LA64-CONTRACT-FAST-NEXT:    fnmadd.d $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-FAST-NEXT:    ret
+;
+; LA64-CONTRACT-ON-LABEL: contract_fnmadd_d_nsz:
+; LA64-CONTRACT-ON:       # %bb.0:
+; LA64-CONTRACT-ON-NEXT:    fnmadd.d $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-ON-NEXT:    ret
+;
+; LA64-CONTRACT-OFF-LABEL: contract_fnmadd_d_nsz:
+; LA64-CONTRACT-OFF:       # %bb.0:
+; LA64-CONTRACT-OFF-NEXT:    fnmadd.d $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-OFF-NEXT:    ret
   %nega = fneg contract nsz double %a
   %negc = fneg contract nsz double %c
   %mul = fmul contract nsz double %nega, %b
@@ -224,17 +500,41 @@ define double @contract_fnmadd_d_nsz(double %a, double %b, double %c) nounwind {
 
 ;; Check that fnmadd.d is not emitted.
 define double @not_contract_fnmadd_d(double %a, double %b, double %c) nounwind {
-; LA32-LABEL: not_contract_fnmadd_d:
-; LA32:       # %bb.0:
-; LA32-NEXT:    fneg.d $fa0, $fa0
-; LA32-NEXT:    fmsub.d $fa0, $fa0, $fa1, $fa2
-; LA32-NEXT:    ret
-;
-; LA64-LABEL: not_contract_fnmadd_d:
-; LA64:       # %bb.0:
-; LA64-NEXT:    fneg.d $fa0, $fa0
-; LA64-NEXT:    fmsub.d $fa0, $fa0, $fa1, $fa2
-; LA64-NEXT:    ret
+; LA32-CONTRACT-FAST-LABEL: not_contract_fnmadd_d:
+; LA32-CONTRACT-FAST:       # %bb.0:
+; LA32-CONTRACT-FAST-NEXT:    fneg.d $fa0, $fa0
+; LA32-CONTRACT-FAST-NEXT:    fmsub.d $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-FAST-NEXT:    ret
+;
+; LA32-CONTRACT-ON-LABEL: not_contract_fnmadd_d:
+; LA32-CONTRACT-ON:       # %bb.0:
+; LA32-CONTRACT-ON-NEXT:    fneg.d $fa0, $fa0
+; LA32-CONTRACT-ON-NEXT:    fmsub.d $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-ON-NEXT:    ret
+;
+; LA32-CONTRACT-OFF-LABEL: not_contract_fnmadd_d:
+; LA32-CONTRACT-OFF:       # %bb.0:
+; LA32-CONTRACT-OFF-NEXT:    fneg.d $fa0, $fa0
+; LA32-CONTRACT-OFF-NEXT:    fmsub.d $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-OFF-NEXT:    ret
+;
+; LA64-CONTRACT-FAST-LABEL: not_contract_fnmadd_d:
+; LA64-CONTRACT-FAST:       # %bb.0:
+; LA64-CONTRACT-FAST-NEXT:    fneg.d $fa0, $fa0
+; LA64-CONTRACT-FAST-NEXT:    fmsub.d $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-FAST-NEXT:    ret
+;
+; LA64-CONTRACT-ON-LABEL: not_contract_fnmadd_d:
+; LA64-CONTRACT-ON:       # %bb.0:
+; LA64-CONTRACT-ON-NEXT:    fneg.d $fa0, $fa0
+; LA64-CONTRACT-ON-NEXT:    fmsub.d $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-ON-NEXT:    ret
+;
+; LA64-CONTRACT-OFF-LABEL: not_contract_fnmadd_d:
+; LA64-CONTRACT-OFF:       # %bb.0:
+; LA64-CONTRACT-OFF-NEXT:    fneg.d $fa0, $fa0
+; LA64-CONTRACT-OFF-NEXT:    fmsub.d $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-OFF-NEXT:    ret
   %nega = fneg contract double %a
   %negc = fneg contract double %c
   %mul = fmul contract double %nega, %b
@@ -243,15 +543,35 @@ define double @not_contract_fnmadd_d(double %a, double %b, double %c) nounwind {
 }
 
 define double @contract_fnmsub_d(double %a, double %b, double %c) nounwind {
-; LA32-LABEL: contract_fnmsub_d:
-; LA32:       # %bb.0:
-; LA32-NEXT:    fnmsub.d $fa0, $fa0, $fa1, $fa2
-; LA32-NEXT:    ret
-;
-; LA64-LABEL: contract_fnmsub_d:
-; LA64:       # %bb.0:
-; LA64-NEXT:    fnmsub.d $fa0, $fa0, $fa1, $fa2
-; LA64-NEXT:    ret
+; LA32-CONTRACT-FAST-LABEL: contract_fnmsub_d:
+; LA32-CONTRACT-FAST:       # %bb.0:
+; LA32-CONTRACT-FAST-NEXT:    fnmsub.d $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-FAST-NEXT:    ret
+;
+; LA32-CONTRACT-ON-LABEL: contract_fnmsub_d:
+; LA32-CONTRACT-ON:       # %bb.0:
+; LA32-CONTRACT-ON-NEXT:    fnmsub.d $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-ON-NEXT:    ret
+;
+; LA32-CONTRACT-OFF-LABEL: contract_fnmsub_d:
+; LA32-CONTRACT-OFF:       # %bb.0:
+; LA32-CONTRACT-OFF-NEXT:    fnmsub.d $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-OFF-NEXT:    ret
+;
+; LA64-CONTRACT-FAST-LABEL: contract_fnmsub_d:
+; LA64-CONTRACT-FAST:       # %bb.0:
+; LA64-CONTRACT-FAST-NEXT:    fnmsub.d $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-FAST-NEXT:    ret
+;
+; LA64-CONTRACT-ON-LABEL: contract_fnmsub_d:
+; LA64-CONTRACT-ON:       # %bb.0:
+; LA64-CONTRACT-ON-NEXT:    fnmsub.d $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-ON-NEXT:    ret
+;
+; LA64-CONTRACT-OFF-LABEL: contract_fnmsub_d:
+; LA64-CONTRACT-OFF:       # %bb.0:
+; LA64-CONTRACT-OFF-NEXT:    fnmsub.d $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-OFF-NEXT:    ret
   %negc = fneg contract double %c
   %mul = fmul contract double %a, %b
   %add = fadd contract double %mul, %negc
@@ -260,15 +580,35 @@ define double @contract_fnmsub_d(double %a, double %b, double %c) nounwind {
 }
 
 define double @contract_fnmsub_d_nsz(double %a, double %b, double %c) nounwind {
-; LA32-LABEL: contract_fnmsub_d_nsz:
-; LA32:       # %bb.0:
-; LA32-NEXT:    fnmsub.d $fa0, $fa0, $fa1, $fa2
-; LA32-NEXT:    ret
-;
-; LA64-LABEL: contract_fnmsub_d_nsz:
-; LA64:       # %bb.0:
-; LA64-NEXT:    fnmsub.d $fa0, $fa0, $fa1, $fa2
-; LA64-NEXT:    ret
+; LA32-CONTRACT-FAST-LABEL: contract_fnmsub_d_nsz:
+; LA32-CONTRACT-FAST:       # %bb.0:
+; LA32-CONTRACT-FAST-NEXT:    fnmsub.d $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-FAST-NEXT:    ret
+;
+; LA32-CONTRACT-ON-LABEL: contract_fnmsub_d_nsz:
+; LA32-CONTRACT-ON:       # %bb.0:
+; LA32-CONTRACT-ON-NEXT:    fnmsub.d $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-ON-NEXT:    ret
+;
+; LA32-CONTRACT-OFF-LABEL: contract_fnmsub_d_nsz:
+; LA32-CONTRACT-OFF:       # %bb.0:
+; LA32-CONTRACT-OFF-NEXT:    fnmsub.d $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-OFF-NEXT:    ret
+;
+; LA64-CONTRACT-FAST-LABEL: contract_fnmsub_d_nsz:
+; LA64-CONTRACT-FAST:       # %bb.0:
+; LA64-CONTRACT-FAST-NEXT:    fnmsub.d $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-FAST-NEXT:    ret
+;
+; LA64-CONTRACT-ON-LABEL: contract_fnmsub_d_nsz:
+; LA64-CONTRACT-ON:       # %bb.0:
+; LA64-CONTRACT-ON-NEXT:    fnmsub.d $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-ON-NEXT:    ret
+;
+; LA64-CONTRACT-OFF-LABEL: contract_fnmsub_d_nsz:
+; LA64-CONTRACT-OFF:       # %bb.0:
+; LA64-CONTRACT-OFF-NEXT:    fnmsub.d $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-OFF-NEXT:    ret
   %nega = fneg contract nsz double %a
   %mul = fmul contract nsz double %nega, %b
   %add = fadd contract nsz double %mul, %c
@@ -277,17 +617,41 @@ define double @contract_fnmsub_d_nsz(double %a, double %b, double %c) nounwind {
 
 ;; Check that fnmsub.d is not emitted.
 define double @not_contract_fnmsub_d(double %a, double %b, double %c) nounwind {
-; LA32-LABEL: not_contract_fnmsub_d:
-; LA32:       # %bb.0:
-; LA32-NEXT:    fneg.d $fa0, $fa0
-; LA32-NEXT:    fmadd.d $fa0, $fa0, $fa1, $fa2
-; LA32-NEXT:    ret
-;
-; LA64-LABEL: not_contract_fnmsub_d:
-; LA64:       # %bb.0:
-; LA64-NEXT:    fneg.d $fa0, $fa0
-; LA64-NEXT:    fmadd.d $fa0, $fa0, $fa1, $fa2
-; LA64-NEXT:    ret
+; LA32-CONTRACT-FAST-LABEL: not_contract_fnmsub_d:
+; LA32-CONTRACT-FAST:       # %bb.0:
+; LA32-CONTRACT-FAST-NEXT:    fneg.d $fa0, $fa0
+; LA32-CONTRACT-FAST-NEXT:    fmadd.d $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-FAST-NEXT:    ret
+;
+; LA32-CONTRACT-ON-LABEL: not_contract_fnmsub_d:
+; LA32-CONTRACT-ON:       # %bb.0:
+; LA32-CONTRACT-ON-NEXT:    fneg.d $fa0, $fa0
+; LA32-CONTRACT-ON-NEXT:    fmadd.d $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-ON-NEXT:    ret
+;
+; LA32-CONTRACT-OFF-LABEL: not_contract_fnmsub_d:
+; LA32-CONTRACT-OFF:       # %bb.0:
+; LA32-CONTRACT-OFF-NEXT:    fneg.d $fa0, $fa0
+; LA32-CONTRACT-OFF-NEXT:    fmadd.d $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-OFF-NEXT:    ret
+;
+; LA64-CONTRACT-FAST-LABEL: not_contract_fnmsub_d:
+; LA64-CONTRACT-FAST:       # %bb.0:
+; LA64-CONTRACT-FAST-NEXT:    fneg.d $fa0, $fa0
+; LA64-CONTRACT-FAST-NEXT:    fmadd.d $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-FAST-NEXT:    ret
+;
+; LA64-CONTRACT-ON-LABEL: not_contract_fnmsub_d:
+; LA64-CONTRACT-ON:       # %bb.0:
+; LA64-CONTRACT-ON-NEXT:    fneg.d $fa0, $fa0
+; LA64-CONTRACT-ON-NEXT:    fmadd.d $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-ON-NEXT:    ret
+;
+; LA64-CONTRACT-OFF-LABEL: not_contract_fnmsub_d:
+; LA64-CONTRACT-OFF:       # %bb.0:
+; LA64-CONTRACT-OFF-NEXT:    fneg.d $fa0, $fa0
+; LA64-CONTRACT-OFF-NEXT:    fmadd.d $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-OFF-NEXT:    ret
   %nega = fneg contract double %a
   %mul = fmul contract double %nega, %b
   %add = fadd contract double %mul, %c
@@ -297,59 +661,139 @@ define double @not_contract_fnmsub_d(double %a, double %b, double %c) nounwind {
 declare double @llvm.fma.f64(double, double, double)
 
 define double @fmadd_d_intrinsics(double %a, double %b, double %c) nounwind {
-; LA32-LABEL: fmadd_d_intrinsics:
-; LA32:       # %bb.0:
-; LA32-NEXT:    fmadd.d $fa0, $fa0, $fa1, $fa2
-; LA32-NEXT:    ret
-;
-; LA64-LABEL: fmadd_d_intrinsics:
-; LA64:       # %bb.0:
-; LA64-NEXT:    fmadd.d $fa0, $fa0, $fa1, $fa2
-; LA64-NEXT:    ret
+; LA32-CONTRACT-FAST-LABEL: fmadd_d_intrinsics:
+; LA32-CONTRACT-FAST:       # %bb.0:
+; LA32-CONTRACT-FAST-NEXT:    fmadd.d $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-FAST-NEXT:    ret
+;
+; LA32-CONTRACT-ON-LABEL: fmadd_d_intrinsics:
+; LA32-CONTRACT-ON:       # %bb.0:
+; LA32-CONTRACT-ON-NEXT:    fmadd.d $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-ON-NEXT:    ret
+;
+; LA32-CONTRACT-OFF-LABEL: fmadd_d_intrinsics:
+; LA32-CONTRACT-OFF:       # %bb.0:
+; LA32-CONTRACT-OFF-NEXT:    fmadd.d $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-OFF-NEXT:    ret
+;
+; LA64-CONTRACT-FAST-LABEL: fmadd_d_intrinsics:
+; LA64-CONTRACT-FAST:       # %bb.0:
+; LA64-CONTRACT-FAST-NEXT:    fmadd.d $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-FAST-NEXT:    ret
+;
+; LA64-CONTRACT-ON-LABEL: fmadd_d_intrinsics:
+; LA64-CONTRACT-ON:       # %bb.0:
+; LA64-CONTRACT-ON-NEXT:    fmadd.d $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-ON-NEXT:    ret
+;
+; LA64-CONTRACT-OFF-LABEL: fmadd_d_intrinsics:
+; LA64-CONTRACT-OFF:       # %bb.0:
+; LA64-CONTRACT-OFF-NEXT:    fmadd.d $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-OFF-NEXT:    ret
   %fma = call double @llvm.fma.f64(double %a, double %b, double %c)
   ret double %fma
 }
 
 define double @fmsub_d_intrinsics(double %a, double %b, double %c) nounwind {
-; LA32-LABEL: fmsub_d_intrinsics:
-; LA32:       # %bb.0:
-; LA32-NEXT:    fmsub.d $fa0, $fa0, $fa1, $fa2
-; LA32-NEXT:    ret
-;
-; LA64-LABEL: fmsub_d_intrinsics:
-; LA64:       # %bb.0:
-; LA64-NEXT:    fmsub.d $fa0, $fa0, $fa1, $fa2
-; LA64-NEXT:    ret
+; LA32-CONTRACT-FAST-LABEL: fmsub_d_intrinsics:
+; LA32-CONTRACT-FAST:       # %bb.0:
+; LA32-CONTRACT-FAST-NEXT:    fmsub.d $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-FAST-NEXT:    ret
+;
+; LA32-CONTRACT-ON-LABEL: fmsub_d_intrinsics:
+; LA32-CONTRACT-ON:       # %bb.0:
+; LA32-CONTRACT-ON-NEXT:    fmsub.d $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-ON-NEXT:    ret
+;
+; LA32-CONTRACT-OFF-LABEL: fmsub_d_intrinsics:
+; LA32-CONTRACT-OFF:       # %bb.0:
+; LA32-CONTRACT-OFF-NEXT:    fmsub.d $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-OFF-NEXT:    ret
+;
+; LA64-CONTRACT-FAST-LABEL: fmsub_d_intrinsics:
+; LA64-CONTRACT-FAST:       # %bb.0:
+; LA64-CONTRACT-FAST-NEXT:    fmsub.d $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-FAST-NEXT:    ret
+;
+; LA64-CONTRACT-ON-LABEL: fmsub_d_intrinsics:
+; LA64-CONTRACT-ON:       # %bb.0:
+; LA64-CONTRACT-ON-NEXT:    fmsub.d $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-ON-NEXT:    ret
+;
+; LA64-CONTRACT-OFF-LABEL: fmsub_d_intrinsics:
+; LA64-CONTRACT-OFF:       # %bb.0:
+; LA64-CONTRACT-OFF-NEXT:    fmsub.d $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-OFF-NEXT:    ret
   %negc = fneg double %c
   %fma = call double @llvm.fma.f64(double %a, double %b, double %negc)
   ret double %fma
 }
 
 define double @fnmadd_d_intrinsics(double %a, double %b, double %c) nounwind {
-; LA32-LABEL: fnmadd_d_intrinsics:
-; LA32:       # %bb.0:
-; LA32-NEXT:    fnmadd.d $fa0, $fa0, $fa1, $fa2
-; LA32-NEXT:    ret
-;
-; LA64-LABEL: fnmadd_d_intrinsics:
-; LA64:       # %bb.0:
-; LA64-NEXT:    fnmadd.d $fa0, $fa0, $fa1, $fa2
-; LA64-NEXT:    ret
+; LA32-CONTRACT-FAST-LABEL: fnmadd_d_intrinsics:
+; LA32-CONTRACT-FAST:       # %bb.0:
+; LA32-CONTRACT-FAST-NEXT:    fnmadd.d $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-FAST-NEXT:    ret
+;
+; LA32-CONTRACT-ON-LABEL: fnmadd_d_intrinsics:
+; LA32-CONTRACT-ON:       # %bb.0:
+; LA32-CONTRACT-ON-NEXT:    fnmadd.d $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-ON-NEXT:    ret
+;
+; LA32-CONTRACT-OFF-LABEL: fnmadd_d_intrinsics:
+; LA32-CONTRACT-OFF:       # %bb.0:
+; LA32-CONTRACT-OFF-NEXT:    fnmadd.d $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-OFF-NEXT:    ret
+;
+; LA64-CONTRACT-FAST-LABEL: fnmadd_d_intrinsics:
+; LA64-CONTRACT-FAST:       # %bb.0:
+; LA64-CONTRACT-FAST-NEXT:    fnmadd.d $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-FAST-NEXT:    ret
+;
+; LA64-CONTRACT-ON-LABEL: fnmadd_d_intrinsics:
+; LA64-CONTRACT-ON:       # %bb.0:
+; LA64-CONTRACT-ON-NEXT:    fnmadd.d $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-ON-NEXT:    ret
+;
+; LA64-CONTRACT-OFF-LABEL: fnmadd_d_intrinsics:
+; LA64-CONTRACT-OFF:       # %bb.0:
+; LA64-CONTRACT-OFF-NEXT:    fnmadd.d $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-OFF-NEXT:    ret
   %fma = call double @llvm.fma.f64(double %a, double %b, double %c)
   %negfma = fneg double %fma
   ret double %negfma
 }
 
 define double @fnmadd_d_nsz_intrinsics(double %a, double %b, double %c) nounwind {
-; LA32-LABEL: fnmadd_d_nsz_intrinsics:
-; LA32:       # %bb.0:
-; LA32-NEXT:    fnmadd.d $fa0, $fa0, $fa1, $fa2
-; LA32-NEXT:    ret
-;
-; LA64-LABEL: fnmadd_d_nsz_intrinsics:
-; LA64:       # %bb.0:
-; LA64-NEXT:    fnmadd.d $fa0, $fa0, $fa1, $fa2
-; LA64-NEXT:    ret
+; LA32-CONTRACT-FAST-LABEL: fnmadd_d_nsz_intrinsics:
+; LA32-CONTRACT-FAST:       # %bb.0:
+; LA32-CONTRACT-FAST-NEXT:    fnmadd.d $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-FAST-NEXT:    ret
+;
+; LA32-CONTRACT-ON-LABEL: fnmadd_d_nsz_intrinsics:
+; LA32-CONTRACT-ON:       # %bb.0:
+; LA32-CONTRACT-ON-NEXT:    fnmadd.d $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-ON-NEXT:    ret
+;
+; LA32-CONTRACT-OFF-LABEL: fnmadd_d_nsz_intrinsics:
+; LA32-CONTRACT-OFF:       # %bb.0:
+; LA32-CONTRACT-OFF-NEXT:    fnmadd.d $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-OFF-NEXT:    ret
+;
+; LA64-CONTRACT-FAST-LABEL: fnmadd_d_nsz_intrinsics:
+; LA64-CONTRACT-FAST:       # %bb.0:
+; LA64-CONTRACT-FAST-NEXT:    fnmadd.d $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-FAST-NEXT:    ret
+;
+; LA64-CONTRACT-ON-LABEL: fnmadd_d_nsz_intrinsics:
+; LA64-CONTRACT-ON:       # %bb.0:
+; LA64-CONTRACT-ON-NEXT:    fnmadd.d $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-ON-NEXT:    ret
+;
+; LA64-CONTRACT-OFF-LABEL: fnmadd_d_nsz_intrinsics:
+; LA64-CONTRACT-OFF:       # %bb.0:
+; LA64-CONTRACT-OFF-NEXT:    fnmadd.d $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-OFF-NEXT:    ret
   %nega = fneg double %a
   %negc = fneg double %c
   %fma = call nsz double @llvm.fma.f64(double %nega, double %b, double %negc)
@@ -358,17 +802,41 @@ define double @fnmadd_d_nsz_intrinsics(double %a, double %b, double %c) nounwind
 
 ;; Check that fnmadd.d is not emitted.
 define double @not_fnmadd_d_intrinsics(double %a, double %b, double %c) nounwind {
-; LA32-LABEL: not_fnmadd_d_intrinsics:
-; LA32:       # %bb.0:
-; LA32-NEXT:    fneg.d $fa0, $fa0
-; LA32-NEXT:    fmsub.d $fa0, $fa0, $fa1, $fa2
-; LA32-NEXT:    ret
-;
-; LA64-LABEL: not_fnmadd_d_intrinsics:
-; LA64:       # %bb.0:
-; LA64-NEXT:    fneg.d $fa0, $fa0
-; LA64-NEXT:    fmsub.d $fa0, $fa0, $fa1, $fa2
-; LA64-NEXT:    ret
+; LA32-CONTRACT-FAST-LABEL: not_fnmadd_d_intrinsics:
+; LA32-CONTRACT-FAST:       # %bb.0:
+; LA32-CONTRACT-FAST-NEXT:    fneg.d $fa0, $fa0
+; LA32-CONTRACT-FAST-NEXT:    fmsub.d $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-FAST-NEXT:    ret
+;
+; LA32-CONTRACT-ON-LABEL: not_fnmadd_d_intrinsics:
+; LA32-CONTRACT-ON:       # %bb.0:
+; LA32-CONTRACT-ON-NEXT:    fneg.d $fa0, $fa0
+; LA32-CONTRACT-ON-NEXT:    fmsub.d $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-ON-NEXT:    ret
+;
+; LA32-CONTRACT-OFF-LABEL: not_fnmadd_d_intrinsics:
+; LA32-CONTRACT-OFF:       # %bb.0:
+; LA32-CONTRACT-OFF-NEXT:    fneg.d $fa0, $fa0
+; LA32-CONTRACT-OFF-NEXT:    fmsub.d $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-OFF-NEXT:    ret
+;
+; LA64-CONTRACT-FAST-LABEL: not_fnmadd_d_intrinsics:
+; LA64-CONTRACT-FAST:       # %bb.0:
+; LA64-CONTRACT-FAST-NEXT:    fneg.d $fa0, $fa0
+; LA64-CONTRACT-FAST-NEXT:    fmsub.d $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-FAST-NEXT:    ret
+;
+; LA64-CONTRACT-ON-LABEL: not_fnmadd_d_intrinsics:
+; LA64-CONTRACT-ON:       # %bb.0:
+; LA64-CONTRACT-ON-NEXT:    fneg.d $fa0, $fa0
+; LA64-CONTRACT-ON-NEXT:    fmsub.d $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-ON-NEXT:    ret
+;
+; LA64-CONTRACT-OFF-LABEL: not_fnmadd_d_intrinsics:
+; LA64-CONTRACT-OFF:       # %bb.0:
+; LA64-CONTRACT-OFF-NEXT:    fneg.d $fa0, $fa0
+; LA64-CONTRACT-OFF-NEXT:    fmsub.d $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-OFF-NEXT:    ret
   %nega = fneg double %a
   %negc = fneg double %c
   %fma = call double @llvm.fma.f64(double %nega, double %b, double %negc)
@@ -376,15 +844,35 @@ define double @not_fnmadd_d_intrinsics(double %a, double %b, double %c) nounwind
 }
 
 define double @fnmsub_d_intrinsics(double %a, double %b, double %c) nounwind {
-; LA32-LABEL: fnmsub_d_intrinsics:
-; LA32:       # %bb.0:
-; LA32-NEXT:    fnmsub.d $fa0, $fa0, $fa1, $fa2
-; LA32-NEXT:    ret
-;
-; LA64-LABEL: fnmsub_d_intrinsics:
-; LA64:       # %bb.0:
-; LA64-NEXT:    fnmsub.d $fa0, $fa0, $fa1, $fa2
-; LA64-NEXT:    ret
+; LA32-CONTRACT-FAST-LABEL: fnmsub_d_intrinsics:
+; LA32-CONTRACT-FAST:       # %bb.0:
+; LA32-CONTRACT-FAST-NEXT:    fnmsub.d $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-FAST-NEXT:    ret
+;
+; LA32-CONTRACT-ON-LABEL: fnmsub_d_intrinsics:
+; LA32-CONTRACT-ON:       # %bb.0:
+; LA32-CONTRACT-ON-NEXT:    fnmsub.d $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-ON-NEXT:    ret
+;
+; LA32-CONTRACT-OFF-LABEL: fnmsub_d_intrinsics:
+; LA32-CONTRACT-OFF:       # %bb.0:
+; LA32-CONTRACT-OFF-NEXT:    fnmsub.d $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-OFF-NEXT:    ret
+;
+; LA64-CONTRACT-FAST-LABEL: fnmsub_d_intrinsics:
+; LA64-CONTRACT-FAST:       # %bb.0:
+; LA64-CONTRACT-FAST-NEXT:    fnmsub.d $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-FAST-NEXT:    ret
+;
+; LA64-CONTRACT-ON-LABEL: fnmsub_d_intrinsics:
+; LA64-CONTRACT-ON:       # %bb.0:
+; LA64-CONTRACT-ON-NEXT:    fnmsub.d $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-ON-NEXT:    ret
+;
+; LA64-CONTRACT-OFF-LABEL: fnmsub_d_intrinsics:
+; LA64-CONTRACT-OFF:       # %bb.0:
+; LA64-CONTRACT-OFF-NEXT:    fnmsub.d $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-OFF-NEXT:    ret
   %negc = fneg double %c
   %fma = call double @llvm.fma.f64(double %a, double %b, double %negc)
   %negfma = fneg double %fma
@@ -392,15 +880,35 @@ define double @fnmsub_d_intrinsics(double %a, double %b, double %c) nounwind {
 }
 
 define double @fnmsub_d_nsz_intrinsics(double %a, double %b, double %c) nounwind {
-; LA32-LABEL: fnmsub_d_nsz_intrinsics:
-; LA32:       # %bb.0:
-; LA32-NEXT:    fnmsub.d $fa0, $fa0, $fa1, $fa2
-; LA32-NEXT:    ret
-;
-; LA64-LABEL: fnmsub_d_nsz_intrinsics:
-; LA64:       # %bb.0:
-; LA64-NEXT:    fnmsub.d $fa0, $fa0, $fa1, $fa2
-; LA64-NEXT:    ret
+; LA32-CONTRACT-FAST-LABEL: fnmsub_d_nsz_intrinsics:
+; LA32-CONTRACT-FAST:       # %bb.0:
+; LA32-CONTRACT-FAST-NEXT:    fnmsub.d $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-FAST-NEXT:    ret
+;
+; LA32-CONTRACT-ON-LABEL: fnmsub_d_nsz_intrinsics:
+; LA32-CONTRACT-ON:       # %bb.0:
+; LA32-CONTRACT-ON-NEXT:    fnmsub.d $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-ON-NEXT:    ret
+;
+; LA32-CONTRACT-OFF-LABEL: fnmsub_d_nsz_intrinsics:
+; LA32-CONTRACT-OFF:       # %bb.0:
+; LA32-CONTRACT-OFF-NEXT:    fnmsub.d $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-OFF-NEXT:    ret
+;
+; LA64-CONTRACT-FAST-LABEL: fnmsub_d_nsz_intrinsics:
+; LA64-CONTRACT-FAST:       # %bb.0:
+; LA64-CONTRACT-FAST-NEXT:    fnmsub.d $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-FAST-NEXT:    ret
+;
+; LA64-CONTRACT-ON-LABEL: fnmsub_d_nsz_intrinsics:
+; LA64-CONTRACT-ON:       # %bb.0:
+; LA64-CONTRACT-ON-NEXT:    fnmsub.d $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-ON-NEXT:    ret
+;
+; LA64-CONTRACT-OFF-LABEL: fnmsub_d_nsz_intrinsics:
+; LA64-CONTRACT-OFF:       # %bb.0:
+; LA64-CONTRACT-OFF-NEXT:    fnmsub.d $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-OFF-NEXT:    ret
   %nega = fneg double %a
   %fma = call nsz double @llvm.fma.f64(double %nega, double %b, double %c)
   ret double %fma
@@ -408,62 +916,146 @@ define double @fnmsub_d_nsz_intrinsics(double %a, double %b, double %c) nounwind
 
 ;; Check that fnmsub.d is not emitted.
 define double @not_fnmsub_d_intrinsics(double %a, double %b, double %c) nounwind {
-; LA32-LABEL: not_fnmsub_d_intrinsics:
-; LA32:       # %bb.0:
-; LA32-NEXT:    fneg.d $fa0, $fa0
-; LA32-NEXT:    fmadd.d $fa0, $fa0, $fa1, $fa2
-; LA32-NEXT:    ret
-;
-; LA64-LABEL: not_fnmsub_d_intrinsics:
-; LA64:       # %bb.0:
-; LA64-NEXT:    fneg.d $fa0, $fa0
-; LA64-NEXT:    fmadd.d $fa0, $fa0, $fa1, $fa2
-; LA64-NEXT:    ret
+; LA32-CONTRACT-FAST-LABEL: not_fnmsub_d_intrinsics:
+; LA32-CONTRACT-FAST:       # %bb.0:
+; LA32-CONTRACT-FAST-NEXT:    fneg.d $fa0, $fa0
+; LA32-CONTRACT-FAST-NEXT:    fmadd.d $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-FAST-NEXT:    ret
+;
+; LA32-CONTRACT-ON-LABEL: not_fnmsub_d_intrinsics:
+; LA32-CONTRACT-ON:       # %bb.0:
+; LA32-CONTRACT-ON-NEXT:    fneg.d $fa0, $fa0
+; LA32-CONTRACT-ON-NEXT:    fmadd.d $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-ON-NEXT:    ret
+;
+; LA32-CONTRACT-OFF-LABEL: not_fnmsub_d_intrinsics:
+; LA32-CONTRACT-OFF:       # %bb.0:
+; LA32-CONTRACT-OFF-NEXT:    fneg.d $fa0, $fa0
+; LA32-CONTRACT-OFF-NEXT:    fmadd.d $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-OFF-NEXT:    ret
+;
+; LA64-CONTRACT-FAST-LABEL: not_fnmsub_d_intrinsics:
+; LA64-CONTRACT-FAST:       # %bb.0:
+; LA64-CONTRACT-FAST-NEXT:    fneg.d $fa0, $fa0
+; LA64-CONTRACT-FAST-NEXT:    fmadd.d $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-FAST-NEXT:    ret
+;
+; LA64-CONTRACT-ON-LABEL: not_fnmsub_d_intrinsics:
+; LA64-CONTRACT-ON:       # %bb.0:
+; LA64-CONTRACT-ON-NEXT:    fneg.d $fa0, $fa0
+; LA64-CONTRACT-ON-NEXT:    fmadd.d $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-ON-NEXT:    ret
+;
+; LA64-CONTRACT-OFF-LABEL: not_fnmsub_d_intrinsics:
+; LA64-CONTRACT-OFF:       # %bb.0:
+; LA64-CONTRACT-OFF-NEXT:    fneg.d $fa0, $fa0
+; LA64-CONTRACT-OFF-NEXT:    fmadd.d $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-OFF-NEXT:    ret
   %nega = fneg double %a
   %fma = call double @llvm.fma.f64(double %nega, double %b, double %c)
   ret double %fma
 }
 
 define double @fmadd_d_contract(double %a, double %b, double %c) nounwind {
-; LA32-LABEL: fmadd_d_contract:
-; LA32:       # %bb.0:
-; LA32-NEXT:    fmadd.d $fa0, $fa0, $fa1, $fa2
-; LA32-NEXT:    ret
-;
-; LA64-LABEL: fmadd_d_contract:
-; LA64:       # %bb.0:
-; LA64-NEXT:    fmadd.d $fa0, $fa0, $fa1, $fa2
-; LA64-NEXT:    ret
+; LA32-CONTRACT-FAST-LABEL: fmadd_d_contract:
+; LA32-CONTRACT-FAST:       # %bb.0:
+; LA32-CONTRACT-FAST-NEXT:    fmadd.d $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-FAST-NEXT:    ret
+;
+; LA32-CONTRACT-ON-LABEL: fmadd_d_contract:
+; LA32-CONTRACT-ON:       # %bb.0:
+; LA32-CONTRACT-ON-NEXT:    fmadd.d $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-ON-NEXT:    ret
+;
+; LA32-CONTRACT-OFF-LABEL: fmadd_d_contract:
+; LA32-CONTRACT-OFF:       # %bb.0:
+; LA32-CONTRACT-OFF-NEXT:    fmadd.d $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-OFF-NEXT:    ret
+;
+; LA64-CONTRACT-FAST-LABEL: fmadd_d_contract:
+; LA64-CONTRACT-FAST:       # %bb.0:
+; LA64-CONTRACT-FAST-NEXT:    fmadd.d $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-FAST-NEXT:    ret
+;
+; LA64-CONTRACT-ON-LABEL: fmadd_d_contract:
+; LA64-CONTRACT-ON:       # %bb.0:
+; LA64-CONTRACT-ON-NEXT:    fmadd.d $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-ON-NEXT:    ret
+;
+; LA64-CONTRACT-OFF-LABEL: fmadd_d_contract:
+; LA64-CONTRACT-OFF:       # %bb.0:
+; LA64-CONTRACT-OFF-NEXT:    fmadd.d $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-OFF-NEXT:    ret
   %mul = fmul contract double %a, %b
   %add = fadd contract double %mul, %c
   ret double %add
 }
 
 define double @fmsub_d_contract(double %a, double %b, double %c) nounwind {
-; LA32-LABEL: fmsub_d_contract:
-; LA32:       # %bb.0:
-; LA32-NEXT:    fmsub.d $fa0, $fa0, $fa1, $fa2
-; LA32-NEXT:    ret
-;
-; LA64-LABEL: fmsub_d_contract:
-; LA64:       # %bb.0:
-; LA64-NEXT:    fmsub.d $fa0, $fa0, $fa1, $fa2
-; LA64-NEXT:    ret
+; LA32-CONTRACT-FAST-LABEL: fmsub_d_contract:
+; LA32-CONTRACT-FAST:       # %bb.0:
+; LA32-CONTRACT-FAST-NEXT:    fmsub.d $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-FAST-NEXT:    ret
+;
+; LA32-CONTRACT-ON-LABEL: fmsub_d_contract:
+; LA32-CONTRACT-ON:       # %bb.0:
+; LA32-CONTRACT-ON-NEXT:    fmsub.d $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-ON-NEXT:    ret
+;
+; LA32-CONTRACT-OFF-LABEL: fmsub_d_contract:
+; LA32-CONTRACT-OFF:       # %bb.0:
+; LA32-CONTRACT-OFF-NEXT:    fmsub.d $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-OFF-NEXT:    ret
+;
+; LA64-CONTRACT-FAST-LABEL: fmsub_d_contract:
+; LA64-CONTRACT-FAST:       # %bb.0:
+; LA64-CONTRACT-FAST-NEXT:    fmsub.d $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-FAST-NEXT:    ret
+;
+; LA64-CONTRACT-ON-LABEL: fmsub_d_contract:
+; LA64-CONTRACT-ON:       # %bb.0:
+; LA64-CONTRACT-ON-NEXT:    fmsub.d $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-ON-NEXT:    ret
+;
+; LA64-CONTRACT-OFF-LABEL: fmsub_d_contract:
+; LA64-CONTRACT-OFF:       # %bb.0:
+; LA64-CONTRACT-OFF-NEXT:    fmsub.d $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-OFF-NEXT:    ret
   %mul = fmul contract double %a, %b
   %sub = fsub contract double %mul, %c
   ret double %sub
 }
 
 define double @fnmadd_d_contract(double %a, double %b, double %c) nounwind {
-; LA32-LABEL: fnmadd_d_contract:
-; LA32:       # %bb.0:
-; LA32-NEXT:    fnmadd.d $fa0, $fa0, $fa1, $fa2
-; LA32-NEXT:    ret
-;
-; LA64-LABEL: fnmadd_d_contract:
-; LA64:       # %bb.0:
-; LA64-NEXT:    fnmadd.d $fa0, $fa0, $fa1, $fa2
-; LA64-NEXT:    ret
+; LA32-CONTRACT-FAST-LABEL: fnmadd_d_contract:
+; LA32-CONTRACT-FAST:       # %bb.0:
+; LA32-CONTRACT-FAST-NEXT:    fnmadd.d $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-FAST-NEXT:    ret
+;
+; LA32-CONTRACT-ON-LABEL: fnmadd_d_contract:
+; LA32-CONTRACT-ON:       # %bb.0:
+; LA32-CONTRACT-ON-NEXT:    fnmadd.d $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-ON-NEXT:    ret
+;
+; LA32-CONTRACT-OFF-LABEL: fnmadd_d_contract:
+; LA32-CONTRACT-OFF:       # %bb.0:
+; LA32-CONTRACT-OFF-NEXT:    fnmadd.d $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-OFF-NEXT:    ret
+;
+; LA64-CONTRACT-FAST-LABEL: fnmadd_d_contract:
+; LA64-CONTRACT-FAST:       # %bb.0:
+; LA64-CONTRACT-FAST-NEXT:    fnmadd.d $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-FAST-NEXT:    ret
+;
+; LA64-CONTRACT-ON-LABEL: fnmadd_d_contract:
+; LA64-CONTRACT-ON:       # %bb.0:
+; LA64-CONTRACT-ON-NEXT:    fnmadd.d $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-ON-NEXT:    ret
+;
+; LA64-CONTRACT-OFF-LABEL: fnmadd_d_contract:
+; LA64-CONTRACT-OFF:       # %bb.0:
+; LA64-CONTRACT-OFF-NEXT:    fnmadd.d $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-OFF-NEXT:    ret
   %mul = fmul contract double %a, %b
   %add = fadd contract double %mul, %c
   %negadd = fneg contract double %add
@@ -471,15 +1063,35 @@ define double @fnmadd_d_contract(double %a, double %b, double %c) nounwind {
 }
 
 define double @fnmsub_d_contract(double %a, double %b, double %c) nounwind {
-; LA32-LABEL: fnmsub_d_contract:
-; LA32:       # %bb.0:
-; LA32-NEXT:    fnmsub.d $fa0, $fa0, $fa1, $fa2
-; LA32-NEXT:    ret
-;
-; LA64-LABEL: fnmsub_d_contract:
-; LA64:       # %bb.0:
-; LA64-NEXT:    fnmsub.d $fa0, $fa0, $fa1, $fa2
-; LA64-NEXT:    ret
+; LA32-CONTRACT-FAST-LABEL: fnmsub_d_contract:
+; LA32-CONTRACT-FAST:       # %bb.0:
+; LA32-CONTRACT-FAST-NEXT:    fnmsub.d $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-FAST-NEXT:    ret
+;
+; LA32-CONTRACT-ON-LABEL: fnmsub_d_contract:
+; LA32-CONTRACT-ON:       # %bb.0:
+; LA32-CONTRACT-ON-NEXT:    fnmsub.d $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-ON-NEXT:    ret
+;
+; LA32-CONTRACT-OFF-LABEL: fnmsub_d_contract:
+; LA32-CONTRACT-OFF:       # %bb.0:
+; LA32-CONTRACT-OFF-NEXT:    fnmsub.d $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-OFF-NEXT:    ret
+;
+; LA64-CONTRACT-FAST-LABEL: fnmsub_d_contract:
+; LA64-CONTRACT-FAST:       # %bb.0:
+; LA64-CONTRACT-FAST-NEXT:    fnmsub.d $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-FAST-NEXT:    ret
+;
+; LA64-CONTRACT-ON-LABEL: fnmsub_d_contract:
+; LA64-CONTRACT-ON:       # %bb.0:
+; LA64-CONTRACT-ON-NEXT:    fnmsub.d $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-ON-NEXT:    ret
+;
+; LA64-CONTRACT-OFF-LABEL: fnmsub_d_contract:
+; LA64-CONTRACT-OFF:       # %bb.0:
+; LA64-CONTRACT-OFF-NEXT:    fnmsub.d $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-OFF-NEXT:    ret
   %mul = fmul contract double %a, %b
   %negc = fneg contract double %c
   %add = fadd contract double %negc, %mul

diff  --git a/llvm/test/CodeGen/LoongArch/float-fma.ll b/llvm/test/CodeGen/LoongArch/float-fma.ll
index 54e4d938d2151..c236255d971a2 100644
--- a/llvm/test/CodeGen/LoongArch/float-fma.ll
+++ b/llvm/test/CodeGen/LoongArch/float-fma.ll
@@ -1,57 +1,133 @@
 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
-; RUN: llc --mtriple=loongarch32 --mattr=+f,-d < %s \
-; RUN:   | FileCheck %s --check-prefix=LA32
-; RUN: llc --mtriple=loongarch64 --mattr=+f,-d < %s \
-; RUN:   | FileCheck %s --check-prefix=LA64
+; RUN: llc --mtriple=loongarch32 --mattr=+f,-d --fp-contract=fast < %s \
+; RUN:   | FileCheck %s --check-prefix=LA32-CONTRACT-FAST
+; RUN: llc --mtriple=loongarch32 --mattr=+f,-d --fp-contract=on < %s \
+; RUN:   | FileCheck %s --check-prefix=LA32-CONTRACT-ON
+; RUN: llc --mtriple=loongarch32 --mattr=+f,-d --fp-contract=off < %s \
+; RUN:   | FileCheck %s --check-prefix=LA32-CONTRACT-OFF
+; RUN: llc --mtriple=loongarch64 --mattr=+f,-d --fp-contract=fast < %s \
+; RUN:   | FileCheck %s --check-prefix=LA64-CONTRACT-FAST
+; RUN: llc --mtriple=loongarch64 --mattr=+f,-d --fp-contract=on < %s \
+; RUN:   | FileCheck %s --check-prefix=LA64-CONTRACT-ON
+; RUN: llc --mtriple=loongarch64 --mattr=+f,-d --fp-contract=off < %s \
+; RUN:   | FileCheck %s --check-prefix=LA64-CONTRACT-OFF
 
 define float @fmadd_s(float %a, float %b, float %c) nounwind {
-; LA32-LABEL: fmadd_s:
-; LA32:       # %bb.0:
-; LA32-NEXT:    fmul.s $fa0, $fa0, $fa1
-; LA32-NEXT:    fadd.s $fa0, $fa0, $fa2
-; LA32-NEXT:    ret
-;
-; LA64-LABEL: fmadd_s:
-; LA64:       # %bb.0:
-; LA64-NEXT:    fmul.s $fa0, $fa0, $fa1
-; LA64-NEXT:    fadd.s $fa0, $fa0, $fa2
-; LA64-NEXT:    ret
+; LA32-CONTRACT-FAST-LABEL: fmadd_s:
+; LA32-CONTRACT-FAST:       # %bb.0:
+; LA32-CONTRACT-FAST-NEXT:    fmadd.s $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-FAST-NEXT:    ret
+;
+; LA32-CONTRACT-ON-LABEL: fmadd_s:
+; LA32-CONTRACT-ON:       # %bb.0:
+; LA32-CONTRACT-ON-NEXT:    fmul.s $fa0, $fa0, $fa1
+; LA32-CONTRACT-ON-NEXT:    fadd.s $fa0, $fa0, $fa2
+; LA32-CONTRACT-ON-NEXT:    ret
+;
+; LA32-CONTRACT-OFF-LABEL: fmadd_s:
+; LA32-CONTRACT-OFF:       # %bb.0:
+; LA32-CONTRACT-OFF-NEXT:    fmul.s $fa0, $fa0, $fa1
+; LA32-CONTRACT-OFF-NEXT:    fadd.s $fa0, $fa0, $fa2
+; LA32-CONTRACT-OFF-NEXT:    ret
+;
+; LA64-CONTRACT-FAST-LABEL: fmadd_s:
+; LA64-CONTRACT-FAST:       # %bb.0:
+; LA64-CONTRACT-FAST-NEXT:    fmadd.s $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-FAST-NEXT:    ret
+;
+; LA64-CONTRACT-ON-LABEL: fmadd_s:
+; LA64-CONTRACT-ON:       # %bb.0:
+; LA64-CONTRACT-ON-NEXT:    fmul.s $fa0, $fa0, $fa1
+; LA64-CONTRACT-ON-NEXT:    fadd.s $fa0, $fa0, $fa2
+; LA64-CONTRACT-ON-NEXT:    ret
+;
+; LA64-CONTRACT-OFF-LABEL: fmadd_s:
+; LA64-CONTRACT-OFF:       # %bb.0:
+; LA64-CONTRACT-OFF-NEXT:    fmul.s $fa0, $fa0, $fa1
+; LA64-CONTRACT-OFF-NEXT:    fadd.s $fa0, $fa0, $fa2
+; LA64-CONTRACT-OFF-NEXT:    ret
   %mul = fmul float %a, %b
   %add = fadd float %mul, %c
   ret float %add
 }
 
 define float @fmsub_s(float %a, float %b, float %c) nounwind {
-; LA32-LABEL: fmsub_s:
-; LA32:       # %bb.0:
-; LA32-NEXT:    fmul.s $fa0, $fa0, $fa1
-; LA32-NEXT:    fsub.s $fa0, $fa0, $fa2
-; LA32-NEXT:    ret
-;
-; LA64-LABEL: fmsub_s:
-; LA64:       # %bb.0:
-; LA64-NEXT:    fmul.s $fa0, $fa0, $fa1
-; LA64-NEXT:    fsub.s $fa0, $fa0, $fa2
-; LA64-NEXT:    ret
+; LA32-CONTRACT-FAST-LABEL: fmsub_s:
+; LA32-CONTRACT-FAST:       # %bb.0:
+; LA32-CONTRACT-FAST-NEXT:    fmsub.s $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-FAST-NEXT:    ret
+;
+; LA32-CONTRACT-ON-LABEL: fmsub_s:
+; LA32-CONTRACT-ON:       # %bb.0:
+; LA32-CONTRACT-ON-NEXT:    fmul.s $fa0, $fa0, $fa1
+; LA32-CONTRACT-ON-NEXT:    fsub.s $fa0, $fa0, $fa2
+; LA32-CONTRACT-ON-NEXT:    ret
+;
+; LA32-CONTRACT-OFF-LABEL: fmsub_s:
+; LA32-CONTRACT-OFF:       # %bb.0:
+; LA32-CONTRACT-OFF-NEXT:    fmul.s $fa0, $fa0, $fa1
+; LA32-CONTRACT-OFF-NEXT:    fsub.s $fa0, $fa0, $fa2
+; LA32-CONTRACT-OFF-NEXT:    ret
+;
+; LA64-CONTRACT-FAST-LABEL: fmsub_s:
+; LA64-CONTRACT-FAST:       # %bb.0:
+; LA64-CONTRACT-FAST-NEXT:    fmsub.s $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-FAST-NEXT:    ret
+;
+; LA64-CONTRACT-ON-LABEL: fmsub_s:
+; LA64-CONTRACT-ON:       # %bb.0:
+; LA64-CONTRACT-ON-NEXT:    fmul.s $fa0, $fa0, $fa1
+; LA64-CONTRACT-ON-NEXT:    fsub.s $fa0, $fa0, $fa2
+; LA64-CONTRACT-ON-NEXT:    ret
+;
+; LA64-CONTRACT-OFF-LABEL: fmsub_s:
+; LA64-CONTRACT-OFF:       # %bb.0:
+; LA64-CONTRACT-OFF-NEXT:    fmul.s $fa0, $fa0, $fa1
+; LA64-CONTRACT-OFF-NEXT:    fsub.s $fa0, $fa0, $fa2
+; LA64-CONTRACT-OFF-NEXT:    ret
   %mul = fmul float %a, %b
   %sub = fsub float %mul, %c
   ret float %sub
 }
 
 define float @fnmadd_s(float %a, float %b, float %c) nounwind {
-; LA32-LABEL: fnmadd_s:
-; LA32:       # %bb.0:
-; LA32-NEXT:    fmul.s $fa0, $fa0, $fa1
-; LA32-NEXT:    fadd.s $fa0, $fa0, $fa2
-; LA32-NEXT:    fneg.s $fa0, $fa0
-; LA32-NEXT:    ret
-;
-; LA64-LABEL: fnmadd_s:
-; LA64:       # %bb.0:
-; LA64-NEXT:    fmul.s $fa0, $fa0, $fa1
-; LA64-NEXT:    fadd.s $fa0, $fa0, $fa2
-; LA64-NEXT:    fneg.s $fa0, $fa0
-; LA64-NEXT:    ret
+; LA32-CONTRACT-FAST-LABEL: fnmadd_s:
+; LA32-CONTRACT-FAST:       # %bb.0:
+; LA32-CONTRACT-FAST-NEXT:    fnmadd.s $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-FAST-NEXT:    ret
+;
+; LA32-CONTRACT-ON-LABEL: fnmadd_s:
+; LA32-CONTRACT-ON:       # %bb.0:
+; LA32-CONTRACT-ON-NEXT:    fmul.s $fa0, $fa0, $fa1
+; LA32-CONTRACT-ON-NEXT:    fadd.s $fa0, $fa0, $fa2
+; LA32-CONTRACT-ON-NEXT:    fneg.s $fa0, $fa0
+; LA32-CONTRACT-ON-NEXT:    ret
+;
+; LA32-CONTRACT-OFF-LABEL: fnmadd_s:
+; LA32-CONTRACT-OFF:       # %bb.0:
+; LA32-CONTRACT-OFF-NEXT:    fmul.s $fa0, $fa0, $fa1
+; LA32-CONTRACT-OFF-NEXT:    fadd.s $fa0, $fa0, $fa2
+; LA32-CONTRACT-OFF-NEXT:    fneg.s $fa0, $fa0
+; LA32-CONTRACT-OFF-NEXT:    ret
+;
+; LA64-CONTRACT-FAST-LABEL: fnmadd_s:
+; LA64-CONTRACT-FAST:       # %bb.0:
+; LA64-CONTRACT-FAST-NEXT:    fnmadd.s $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-FAST-NEXT:    ret
+;
+; LA64-CONTRACT-ON-LABEL: fnmadd_s:
+; LA64-CONTRACT-ON:       # %bb.0:
+; LA64-CONTRACT-ON-NEXT:    fmul.s $fa0, $fa0, $fa1
+; LA64-CONTRACT-ON-NEXT:    fadd.s $fa0, $fa0, $fa2
+; LA64-CONTRACT-ON-NEXT:    fneg.s $fa0, $fa0
+; LA64-CONTRACT-ON-NEXT:    ret
+;
+; LA64-CONTRACT-OFF-LABEL: fnmadd_s:
+; LA64-CONTRACT-OFF:       # %bb.0:
+; LA64-CONTRACT-OFF-NEXT:    fmul.s $fa0, $fa0, $fa1
+; LA64-CONTRACT-OFF-NEXT:    fadd.s $fa0, $fa0, $fa2
+; LA64-CONTRACT-OFF-NEXT:    fneg.s $fa0, $fa0
+; LA64-CONTRACT-OFF-NEXT:    ret
   %mul = fmul float %a, %b
   %add = fadd float %mul, %c
   %negadd = fneg float %add
@@ -59,19 +135,43 @@ define float @fnmadd_s(float %a, float %b, float %c) nounwind {
 }
 
 define float @fnmadd_s_nsz(float %a, float %b, float %c) nounwind {
-; LA32-LABEL: fnmadd_s_nsz:
-; LA32:       # %bb.0:
-; LA32-NEXT:    fneg.s $fa0, $fa0
-; LA32-NEXT:    fmul.s $fa0, $fa0, $fa1
-; LA32-NEXT:    fsub.s $fa0, $fa0, $fa2
-; LA32-NEXT:    ret
-;
-; LA64-LABEL: fnmadd_s_nsz:
-; LA64:       # %bb.0:
-; LA64-NEXT:    fneg.s $fa0, $fa0
-; LA64-NEXT:    fmul.s $fa0, $fa0, $fa1
-; LA64-NEXT:    fsub.s $fa0, $fa0, $fa2
-; LA64-NEXT:    ret
+; LA32-CONTRACT-FAST-LABEL: fnmadd_s_nsz:
+; LA32-CONTRACT-FAST:       # %bb.0:
+; LA32-CONTRACT-FAST-NEXT:    fnmadd.s $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-FAST-NEXT:    ret
+;
+; LA32-CONTRACT-ON-LABEL: fnmadd_s_nsz:
+; LA32-CONTRACT-ON:       # %bb.0:
+; LA32-CONTRACT-ON-NEXT:    fneg.s $fa0, $fa0
+; LA32-CONTRACT-ON-NEXT:    fmul.s $fa0, $fa0, $fa1
+; LA32-CONTRACT-ON-NEXT:    fsub.s $fa0, $fa0, $fa2
+; LA32-CONTRACT-ON-NEXT:    ret
+;
+; LA32-CONTRACT-OFF-LABEL: fnmadd_s_nsz:
+; LA32-CONTRACT-OFF:       # %bb.0:
+; LA32-CONTRACT-OFF-NEXT:    fneg.s $fa0, $fa0
+; LA32-CONTRACT-OFF-NEXT:    fmul.s $fa0, $fa0, $fa1
+; LA32-CONTRACT-OFF-NEXT:    fsub.s $fa0, $fa0, $fa2
+; LA32-CONTRACT-OFF-NEXT:    ret
+;
+; LA64-CONTRACT-FAST-LABEL: fnmadd_s_nsz:
+; LA64-CONTRACT-FAST:       # %bb.0:
+; LA64-CONTRACT-FAST-NEXT:    fnmadd.s $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-FAST-NEXT:    ret
+;
+; LA64-CONTRACT-ON-LABEL: fnmadd_s_nsz:
+; LA64-CONTRACT-ON:       # %bb.0:
+; LA64-CONTRACT-ON-NEXT:    fneg.s $fa0, $fa0
+; LA64-CONTRACT-ON-NEXT:    fmul.s $fa0, $fa0, $fa1
+; LA64-CONTRACT-ON-NEXT:    fsub.s $fa0, $fa0, $fa2
+; LA64-CONTRACT-ON-NEXT:    ret
+;
+; LA64-CONTRACT-OFF-LABEL: fnmadd_s_nsz:
+; LA64-CONTRACT-OFF:       # %bb.0:
+; LA64-CONTRACT-OFF-NEXT:    fneg.s $fa0, $fa0
+; LA64-CONTRACT-OFF-NEXT:    fmul.s $fa0, $fa0, $fa1
+; LA64-CONTRACT-OFF-NEXT:    fsub.s $fa0, $fa0, $fa2
+; LA64-CONTRACT-OFF-NEXT:    ret
   %nega = fneg nsz float %a
   %negc = fneg nsz float %c
   %mul = fmul nsz float %nega, %b
@@ -81,19 +181,45 @@ define float @fnmadd_s_nsz(float %a, float %b, float %c) nounwind {
 
 ;; Check that fnmadd.s is not emitted.
 define float @not_fnmadd_s(float %a, float %b, float %c) nounwind {
-; LA32-LABEL: not_fnmadd_s:
-; LA32:       # %bb.0:
-; LA32-NEXT:    fneg.s $fa0, $fa0
-; LA32-NEXT:    fmul.s $fa0, $fa0, $fa1
-; LA32-NEXT:    fsub.s $fa0, $fa0, $fa2
-; LA32-NEXT:    ret
-;
-; LA64-LABEL: not_fnmadd_s:
-; LA64:       # %bb.0:
-; LA64-NEXT:    fneg.s $fa0, $fa0
-; LA64-NEXT:    fmul.s $fa0, $fa0, $fa1
-; LA64-NEXT:    fsub.s $fa0, $fa0, $fa2
-; LA64-NEXT:    ret
+; LA32-CONTRACT-FAST-LABEL: not_fnmadd_s:
+; LA32-CONTRACT-FAST:       # %bb.0:
+; LA32-CONTRACT-FAST-NEXT:    fneg.s $fa0, $fa0
+; LA32-CONTRACT-FAST-NEXT:    fmsub.s $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-FAST-NEXT:    ret
+;
+; LA32-CONTRACT-ON-LABEL: not_fnmadd_s:
+; LA32-CONTRACT-ON:       # %bb.0:
+; LA32-CONTRACT-ON-NEXT:    fneg.s $fa0, $fa0
+; LA32-CONTRACT-ON-NEXT:    fmul.s $fa0, $fa0, $fa1
+; LA32-CONTRACT-ON-NEXT:    fsub.s $fa0, $fa0, $fa2
+; LA32-CONTRACT-ON-NEXT:    ret
+;
+; LA32-CONTRACT-OFF-LABEL: not_fnmadd_s:
+; LA32-CONTRACT-OFF:       # %bb.0:
+; LA32-CONTRACT-OFF-NEXT:    fneg.s $fa0, $fa0
+; LA32-CONTRACT-OFF-NEXT:    fmul.s $fa0, $fa0, $fa1
+; LA32-CONTRACT-OFF-NEXT:    fsub.s $fa0, $fa0, $fa2
+; LA32-CONTRACT-OFF-NEXT:    ret
+;
+; LA64-CONTRACT-FAST-LABEL: not_fnmadd_s:
+; LA64-CONTRACT-FAST:       # %bb.0:
+; LA64-CONTRACT-FAST-NEXT:    fneg.s $fa0, $fa0
+; LA64-CONTRACT-FAST-NEXT:    fmsub.s $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-FAST-NEXT:    ret
+;
+; LA64-CONTRACT-ON-LABEL: not_fnmadd_s:
+; LA64-CONTRACT-ON:       # %bb.0:
+; LA64-CONTRACT-ON-NEXT:    fneg.s $fa0, $fa0
+; LA64-CONTRACT-ON-NEXT:    fmul.s $fa0, $fa0, $fa1
+; LA64-CONTRACT-ON-NEXT:    fsub.s $fa0, $fa0, $fa2
+; LA64-CONTRACT-ON-NEXT:    ret
+;
+; LA64-CONTRACT-OFF-LABEL: not_fnmadd_s:
+; LA64-CONTRACT-OFF:       # %bb.0:
+; LA64-CONTRACT-OFF-NEXT:    fneg.s $fa0, $fa0
+; LA64-CONTRACT-OFF-NEXT:    fmul.s $fa0, $fa0, $fa1
+; LA64-CONTRACT-OFF-NEXT:    fsub.s $fa0, $fa0, $fa2
+; LA64-CONTRACT-OFF-NEXT:    ret
   %nega = fneg float %a
   %negc = fneg float %c
   %mul = fmul float %nega, %b
@@ -102,19 +228,43 @@ define float @not_fnmadd_s(float %a, float %b, float %c) nounwind {
 }
 
 define float @fnmsub_s(float %a, float %b, float %c) nounwind {
-; LA32-LABEL: fnmsub_s:
-; LA32:       # %bb.0:
-; LA32-NEXT:    fmul.s $fa0, $fa0, $fa1
-; LA32-NEXT:    fsub.s $fa0, $fa0, $fa2
-; LA32-NEXT:    fneg.s $fa0, $fa0
-; LA32-NEXT:    ret
-;
-; LA64-LABEL: fnmsub_s:
-; LA64:       # %bb.0:
-; LA64-NEXT:    fmul.s $fa0, $fa0, $fa1
-; LA64-NEXT:    fsub.s $fa0, $fa0, $fa2
-; LA64-NEXT:    fneg.s $fa0, $fa0
-; LA64-NEXT:    ret
+; LA32-CONTRACT-FAST-LABEL: fnmsub_s:
+; LA32-CONTRACT-FAST:       # %bb.0:
+; LA32-CONTRACT-FAST-NEXT:    fnmsub.s $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-FAST-NEXT:    ret
+;
+; LA32-CONTRACT-ON-LABEL: fnmsub_s:
+; LA32-CONTRACT-ON:       # %bb.0:
+; LA32-CONTRACT-ON-NEXT:    fmul.s $fa0, $fa0, $fa1
+; LA32-CONTRACT-ON-NEXT:    fsub.s $fa0, $fa0, $fa2
+; LA32-CONTRACT-ON-NEXT:    fneg.s $fa0, $fa0
+; LA32-CONTRACT-ON-NEXT:    ret
+;
+; LA32-CONTRACT-OFF-LABEL: fnmsub_s:
+; LA32-CONTRACT-OFF:       # %bb.0:
+; LA32-CONTRACT-OFF-NEXT:    fmul.s $fa0, $fa0, $fa1
+; LA32-CONTRACT-OFF-NEXT:    fsub.s $fa0, $fa0, $fa2
+; LA32-CONTRACT-OFF-NEXT:    fneg.s $fa0, $fa0
+; LA32-CONTRACT-OFF-NEXT:    ret
+;
+; LA64-CONTRACT-FAST-LABEL: fnmsub_s:
+; LA64-CONTRACT-FAST:       # %bb.0:
+; LA64-CONTRACT-FAST-NEXT:    fnmsub.s $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-FAST-NEXT:    ret
+;
+; LA64-CONTRACT-ON-LABEL: fnmsub_s:
+; LA64-CONTRACT-ON:       # %bb.0:
+; LA64-CONTRACT-ON-NEXT:    fmul.s $fa0, $fa0, $fa1
+; LA64-CONTRACT-ON-NEXT:    fsub.s $fa0, $fa0, $fa2
+; LA64-CONTRACT-ON-NEXT:    fneg.s $fa0, $fa0
+; LA64-CONTRACT-ON-NEXT:    ret
+;
+; LA64-CONTRACT-OFF-LABEL: fnmsub_s:
+; LA64-CONTRACT-OFF:       # %bb.0:
+; LA64-CONTRACT-OFF-NEXT:    fmul.s $fa0, $fa0, $fa1
+; LA64-CONTRACT-OFF-NEXT:    fsub.s $fa0, $fa0, $fa2
+; LA64-CONTRACT-OFF-NEXT:    fneg.s $fa0, $fa0
+; LA64-CONTRACT-OFF-NEXT:    ret
   %negc = fneg float %c
   %mul = fmul float %a, %b
   %add = fadd float %mul, %negc
@@ -123,17 +273,39 @@ define float @fnmsub_s(float %a, float %b, float %c) nounwind {
 }
 
 define float @fnmsub_s_nsz(float %a, float %b, float %c) nounwind {
-; LA32-LABEL: fnmsub_s_nsz:
-; LA32:       # %bb.0:
-; LA32-NEXT:    fmul.s $fa0, $fa0, $fa1
-; LA32-NEXT:    fsub.s $fa0, $fa2, $fa0
-; LA32-NEXT:    ret
-;
-; LA64-LABEL: fnmsub_s_nsz:
-; LA64:       # %bb.0:
-; LA64-NEXT:    fmul.s $fa0, $fa0, $fa1
-; LA64-NEXT:    fsub.s $fa0, $fa2, $fa0
-; LA64-NEXT:    ret
+; LA32-CONTRACT-FAST-LABEL: fnmsub_s_nsz:
+; LA32-CONTRACT-FAST:       # %bb.0:
+; LA32-CONTRACT-FAST-NEXT:    fnmsub.s $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-FAST-NEXT:    ret
+;
+; LA32-CONTRACT-ON-LABEL: fnmsub_s_nsz:
+; LA32-CONTRACT-ON:       # %bb.0:
+; LA32-CONTRACT-ON-NEXT:    fmul.s $fa0, $fa0, $fa1
+; LA32-CONTRACT-ON-NEXT:    fsub.s $fa0, $fa2, $fa0
+; LA32-CONTRACT-ON-NEXT:    ret
+;
+; LA32-CONTRACT-OFF-LABEL: fnmsub_s_nsz:
+; LA32-CONTRACT-OFF:       # %bb.0:
+; LA32-CONTRACT-OFF-NEXT:    fmul.s $fa0, $fa0, $fa1
+; LA32-CONTRACT-OFF-NEXT:    fsub.s $fa0, $fa2, $fa0
+; LA32-CONTRACT-OFF-NEXT:    ret
+;
+; LA64-CONTRACT-FAST-LABEL: fnmsub_s_nsz:
+; LA64-CONTRACT-FAST:       # %bb.0:
+; LA64-CONTRACT-FAST-NEXT:    fnmsub.s $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-FAST-NEXT:    ret
+;
+; LA64-CONTRACT-ON-LABEL: fnmsub_s_nsz:
+; LA64-CONTRACT-ON:       # %bb.0:
+; LA64-CONTRACT-ON-NEXT:    fmul.s $fa0, $fa0, $fa1
+; LA64-CONTRACT-ON-NEXT:    fsub.s $fa0, $fa2, $fa0
+; LA64-CONTRACT-ON-NEXT:    ret
+;
+; LA64-CONTRACT-OFF-LABEL: fnmsub_s_nsz:
+; LA64-CONTRACT-OFF:       # %bb.0:
+; LA64-CONTRACT-OFF-NEXT:    fmul.s $fa0, $fa0, $fa1
+; LA64-CONTRACT-OFF-NEXT:    fsub.s $fa0, $fa2, $fa0
+; LA64-CONTRACT-OFF-NEXT:    ret
   %nega = fneg nsz float %a
   %mul = fmul nsz float %nega, %b
   %add = fadd nsz float %mul, %c
@@ -142,17 +314,41 @@ define float @fnmsub_s_nsz(float %a, float %b, float %c) nounwind {
 
 ;; Check that fnmsub.s is not emitted.
 define float @not_fnmsub_s(float %a, float %b, float %c) nounwind {
-; LA32-LABEL: not_fnmsub_s:
-; LA32:       # %bb.0:
-; LA32-NEXT:    fmul.s $fa0, $fa0, $fa1
-; LA32-NEXT:    fsub.s $fa0, $fa2, $fa0
-; LA32-NEXT:    ret
-;
-; LA64-LABEL: not_fnmsub_s:
-; LA64:       # %bb.0:
-; LA64-NEXT:    fmul.s $fa0, $fa0, $fa1
-; LA64-NEXT:    fsub.s $fa0, $fa2, $fa0
-; LA64-NEXT:    ret
+; LA32-CONTRACT-FAST-LABEL: not_fnmsub_s:
+; LA32-CONTRACT-FAST:       # %bb.0:
+; LA32-CONTRACT-FAST-NEXT:    fneg.s $fa0, $fa0
+; LA32-CONTRACT-FAST-NEXT:    fmadd.s $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-FAST-NEXT:    ret
+;
+; LA32-CONTRACT-ON-LABEL: not_fnmsub_s:
+; LA32-CONTRACT-ON:       # %bb.0:
+; LA32-CONTRACT-ON-NEXT:    fmul.s $fa0, $fa0, $fa1
+; LA32-CONTRACT-ON-NEXT:    fsub.s $fa0, $fa2, $fa0
+; LA32-CONTRACT-ON-NEXT:    ret
+;
+; LA32-CONTRACT-OFF-LABEL: not_fnmsub_s:
+; LA32-CONTRACT-OFF:       # %bb.0:
+; LA32-CONTRACT-OFF-NEXT:    fmul.s $fa0, $fa0, $fa1
+; LA32-CONTRACT-OFF-NEXT:    fsub.s $fa0, $fa2, $fa0
+; LA32-CONTRACT-OFF-NEXT:    ret
+;
+; LA64-CONTRACT-FAST-LABEL: not_fnmsub_s:
+; LA64-CONTRACT-FAST:       # %bb.0:
+; LA64-CONTRACT-FAST-NEXT:    fneg.s $fa0, $fa0
+; LA64-CONTRACT-FAST-NEXT:    fmadd.s $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-FAST-NEXT:    ret
+;
+; LA64-CONTRACT-ON-LABEL: not_fnmsub_s:
+; LA64-CONTRACT-ON:       # %bb.0:
+; LA64-CONTRACT-ON-NEXT:    fmul.s $fa0, $fa0, $fa1
+; LA64-CONTRACT-ON-NEXT:    fsub.s $fa0, $fa2, $fa0
+; LA64-CONTRACT-ON-NEXT:    ret
+;
+; LA64-CONTRACT-OFF-LABEL: not_fnmsub_s:
+; LA64-CONTRACT-OFF:       # %bb.0:
+; LA64-CONTRACT-OFF-NEXT:    fmul.s $fa0, $fa0, $fa1
+; LA64-CONTRACT-OFF-NEXT:    fsub.s $fa0, $fa2, $fa0
+; LA64-CONTRACT-OFF-NEXT:    ret
   %nega = fneg float %a
   %mul = fmul float %nega, %b
   %add = fadd float %mul, %c
@@ -160,45 +356,105 @@ define float @not_fnmsub_s(float %a, float %b, float %c) nounwind {
 }
 
 define float @contract_fmadd_s(float %a, float %b, float %c) nounwind {
-; LA32-LABEL: contract_fmadd_s:
-; LA32:       # %bb.0:
-; LA32-NEXT:    fmadd.s $fa0, $fa0, $fa1, $fa2
-; LA32-NEXT:    ret
-;
-; LA64-LABEL: contract_fmadd_s:
-; LA64:       # %bb.0:
-; LA64-NEXT:    fmadd.s $fa0, $fa0, $fa1, $fa2
-; LA64-NEXT:    ret
+; LA32-CONTRACT-FAST-LABEL: contract_fmadd_s:
+; LA32-CONTRACT-FAST:       # %bb.0:
+; LA32-CONTRACT-FAST-NEXT:    fmadd.s $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-FAST-NEXT:    ret
+;
+; LA32-CONTRACT-ON-LABEL: contract_fmadd_s:
+; LA32-CONTRACT-ON:       # %bb.0:
+; LA32-CONTRACT-ON-NEXT:    fmadd.s $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-ON-NEXT:    ret
+;
+; LA32-CONTRACT-OFF-LABEL: contract_fmadd_s:
+; LA32-CONTRACT-OFF:       # %bb.0:
+; LA32-CONTRACT-OFF-NEXT:    fmadd.s $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-OFF-NEXT:    ret
+;
+; LA64-CONTRACT-FAST-LABEL: contract_fmadd_s:
+; LA64-CONTRACT-FAST:       # %bb.0:
+; LA64-CONTRACT-FAST-NEXT:    fmadd.s $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-FAST-NEXT:    ret
+;
+; LA64-CONTRACT-ON-LABEL: contract_fmadd_s:
+; LA64-CONTRACT-ON:       # %bb.0:
+; LA64-CONTRACT-ON-NEXT:    fmadd.s $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-ON-NEXT:    ret
+;
+; LA64-CONTRACT-OFF-LABEL: contract_fmadd_s:
+; LA64-CONTRACT-OFF:       # %bb.0:
+; LA64-CONTRACT-OFF-NEXT:    fmadd.s $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-OFF-NEXT:    ret
   %mul = fmul contract float %a, %b
   %add = fadd contract float %mul, %c
   ret float %add
 }
 
 define float @contract_fmsub_s(float %a, float %b, float %c) nounwind {
-; LA32-LABEL: contract_fmsub_s:
-; LA32:       # %bb.0:
-; LA32-NEXT:    fmsub.s $fa0, $fa0, $fa1, $fa2
-; LA32-NEXT:    ret
-;
-; LA64-LABEL: contract_fmsub_s:
-; LA64:       # %bb.0:
-; LA64-NEXT:    fmsub.s $fa0, $fa0, $fa1, $fa2
-; LA64-NEXT:    ret
+; LA32-CONTRACT-FAST-LABEL: contract_fmsub_s:
+; LA32-CONTRACT-FAST:       # %bb.0:
+; LA32-CONTRACT-FAST-NEXT:    fmsub.s $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-FAST-NEXT:    ret
+;
+; LA32-CONTRACT-ON-LABEL: contract_fmsub_s:
+; LA32-CONTRACT-ON:       # %bb.0:
+; LA32-CONTRACT-ON-NEXT:    fmsub.s $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-ON-NEXT:    ret
+;
+; LA32-CONTRACT-OFF-LABEL: contract_fmsub_s:
+; LA32-CONTRACT-OFF:       # %bb.0:
+; LA32-CONTRACT-OFF-NEXT:    fmsub.s $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-OFF-NEXT:    ret
+;
+; LA64-CONTRACT-FAST-LABEL: contract_fmsub_s:
+; LA64-CONTRACT-FAST:       # %bb.0:
+; LA64-CONTRACT-FAST-NEXT:    fmsub.s $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-FAST-NEXT:    ret
+;
+; LA64-CONTRACT-ON-LABEL: contract_fmsub_s:
+; LA64-CONTRACT-ON:       # %bb.0:
+; LA64-CONTRACT-ON-NEXT:    fmsub.s $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-ON-NEXT:    ret
+;
+; LA64-CONTRACT-OFF-LABEL: contract_fmsub_s:
+; LA64-CONTRACT-OFF:       # %bb.0:
+; LA64-CONTRACT-OFF-NEXT:    fmsub.s $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-OFF-NEXT:    ret
   %mul = fmul contract float %a, %b
   %sub = fsub contract float %mul, %c
   ret float %sub
 }
 
 define float @contract_fnmadd_s(float %a, float %b, float %c) nounwind {
-; LA32-LABEL: contract_fnmadd_s:
-; LA32:       # %bb.0:
-; LA32-NEXT:    fnmadd.s $fa0, $fa0, $fa1, $fa2
-; LA32-NEXT:    ret
-;
-; LA64-LABEL: contract_fnmadd_s:
-; LA64:       # %bb.0:
-; LA64-NEXT:    fnmadd.s $fa0, $fa0, $fa1, $fa2
-; LA64-NEXT:    ret
+; LA32-CONTRACT-FAST-LABEL: contract_fnmadd_s:
+; LA32-CONTRACT-FAST:       # %bb.0:
+; LA32-CONTRACT-FAST-NEXT:    fnmadd.s $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-FAST-NEXT:    ret
+;
+; LA32-CONTRACT-ON-LABEL: contract_fnmadd_s:
+; LA32-CONTRACT-ON:       # %bb.0:
+; LA32-CONTRACT-ON-NEXT:    fnmadd.s $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-ON-NEXT:    ret
+;
+; LA32-CONTRACT-OFF-LABEL: contract_fnmadd_s:
+; LA32-CONTRACT-OFF:       # %bb.0:
+; LA32-CONTRACT-OFF-NEXT:    fnmadd.s $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-OFF-NEXT:    ret
+;
+; LA64-CONTRACT-FAST-LABEL: contract_fnmadd_s:
+; LA64-CONTRACT-FAST:       # %bb.0:
+; LA64-CONTRACT-FAST-NEXT:    fnmadd.s $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-FAST-NEXT:    ret
+;
+; LA64-CONTRACT-ON-LABEL: contract_fnmadd_s:
+; LA64-CONTRACT-ON:       # %bb.0:
+; LA64-CONTRACT-ON-NEXT:    fnmadd.s $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-ON-NEXT:    ret
+;
+; LA64-CONTRACT-OFF-LABEL: contract_fnmadd_s:
+; LA64-CONTRACT-OFF:       # %bb.0:
+; LA64-CONTRACT-OFF-NEXT:    fnmadd.s $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-OFF-NEXT:    ret
   %mul = fmul contract float %a, %b
   %add = fadd contract float %mul, %c
   %negadd = fneg contract float %add
@@ -206,15 +462,35 @@ define float @contract_fnmadd_s(float %a, float %b, float %c) nounwind {
 }
 
 define float @contract_fnmadd_s_nsz(float %a, float %b, float %c) nounwind {
-; LA32-LABEL: contract_fnmadd_s_nsz:
-; LA32:       # %bb.0:
-; LA32-NEXT:    fnmadd.s $fa0, $fa0, $fa1, $fa2
-; LA32-NEXT:    ret
-;
-; LA64-LABEL: contract_fnmadd_s_nsz:
-; LA64:       # %bb.0:
-; LA64-NEXT:    fnmadd.s $fa0, $fa0, $fa1, $fa2
-; LA64-NEXT:    ret
+; LA32-CONTRACT-FAST-LABEL: contract_fnmadd_s_nsz:
+; LA32-CONTRACT-FAST:       # %bb.0:
+; LA32-CONTRACT-FAST-NEXT:    fnmadd.s $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-FAST-NEXT:    ret
+;
+; LA32-CONTRACT-ON-LABEL: contract_fnmadd_s_nsz:
+; LA32-CONTRACT-ON:       # %bb.0:
+; LA32-CONTRACT-ON-NEXT:    fnmadd.s $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-ON-NEXT:    ret
+;
+; LA32-CONTRACT-OFF-LABEL: contract_fnmadd_s_nsz:
+; LA32-CONTRACT-OFF:       # %bb.0:
+; LA32-CONTRACT-OFF-NEXT:    fnmadd.s $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-OFF-NEXT:    ret
+;
+; LA64-CONTRACT-FAST-LABEL: contract_fnmadd_s_nsz:
+; LA64-CONTRACT-FAST:       # %bb.0:
+; LA64-CONTRACT-FAST-NEXT:    fnmadd.s $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-FAST-NEXT:    ret
+;
+; LA64-CONTRACT-ON-LABEL: contract_fnmadd_s_nsz:
+; LA64-CONTRACT-ON:       # %bb.0:
+; LA64-CONTRACT-ON-NEXT:    fnmadd.s $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-ON-NEXT:    ret
+;
+; LA64-CONTRACT-OFF-LABEL: contract_fnmadd_s_nsz:
+; LA64-CONTRACT-OFF:       # %bb.0:
+; LA64-CONTRACT-OFF-NEXT:    fnmadd.s $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-OFF-NEXT:    ret
   %nega = fneg contract nsz float %a
   %negc = fneg contract nsz float %c
   %mul = fmul contract nsz float %nega, %b
@@ -224,17 +500,41 @@ define float @contract_fnmadd_s_nsz(float %a, float %b, float %c) nounwind {
 
 ;; Check that fnmadd.s is not emitted.
 define float @not_contract_fnmadd_s(float %a, float %b, float %c) nounwind {
-; LA32-LABEL: not_contract_fnmadd_s:
-; LA32:       # %bb.0:
-; LA32-NEXT:    fneg.s $fa0, $fa0
-; LA32-NEXT:    fmsub.s $fa0, $fa0, $fa1, $fa2
-; LA32-NEXT:    ret
-;
-; LA64-LABEL: not_contract_fnmadd_s:
-; LA64:       # %bb.0:
-; LA64-NEXT:    fneg.s $fa0, $fa0
-; LA64-NEXT:    fmsub.s $fa0, $fa0, $fa1, $fa2
-; LA64-NEXT:    ret
+; LA32-CONTRACT-FAST-LABEL: not_contract_fnmadd_s:
+; LA32-CONTRACT-FAST:       # %bb.0:
+; LA32-CONTRACT-FAST-NEXT:    fneg.s $fa0, $fa0
+; LA32-CONTRACT-FAST-NEXT:    fmsub.s $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-FAST-NEXT:    ret
+;
+; LA32-CONTRACT-ON-LABEL: not_contract_fnmadd_s:
+; LA32-CONTRACT-ON:       # %bb.0:
+; LA32-CONTRACT-ON-NEXT:    fneg.s $fa0, $fa0
+; LA32-CONTRACT-ON-NEXT:    fmsub.s $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-ON-NEXT:    ret
+;
+; LA32-CONTRACT-OFF-LABEL: not_contract_fnmadd_s:
+; LA32-CONTRACT-OFF:       # %bb.0:
+; LA32-CONTRACT-OFF-NEXT:    fneg.s $fa0, $fa0
+; LA32-CONTRACT-OFF-NEXT:    fmsub.s $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-OFF-NEXT:    ret
+;
+; LA64-CONTRACT-FAST-LABEL: not_contract_fnmadd_s:
+; LA64-CONTRACT-FAST:       # %bb.0:
+; LA64-CONTRACT-FAST-NEXT:    fneg.s $fa0, $fa0
+; LA64-CONTRACT-FAST-NEXT:    fmsub.s $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-FAST-NEXT:    ret
+;
+; LA64-CONTRACT-ON-LABEL: not_contract_fnmadd_s:
+; LA64-CONTRACT-ON:       # %bb.0:
+; LA64-CONTRACT-ON-NEXT:    fneg.s $fa0, $fa0
+; LA64-CONTRACT-ON-NEXT:    fmsub.s $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-ON-NEXT:    ret
+;
+; LA64-CONTRACT-OFF-LABEL: not_contract_fnmadd_s:
+; LA64-CONTRACT-OFF:       # %bb.0:
+; LA64-CONTRACT-OFF-NEXT:    fneg.s $fa0, $fa0
+; LA64-CONTRACT-OFF-NEXT:    fmsub.s $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-OFF-NEXT:    ret
   %nega = fneg contract float %a
   %negc = fneg contract float %c
   %mul = fmul contract float %nega, %b
@@ -243,15 +543,35 @@ define float @not_contract_fnmadd_s(float %a, float %b, float %c) nounwind {
 }
 
 define float @contract_fnmsub_s(float %a, float %b, float %c) nounwind {
-; LA32-LABEL: contract_fnmsub_s:
-; LA32:       # %bb.0:
-; LA32-NEXT:    fnmsub.s $fa0, $fa0, $fa1, $fa2
-; LA32-NEXT:    ret
-;
-; LA64-LABEL: contract_fnmsub_s:
-; LA64:       # %bb.0:
-; LA64-NEXT:    fnmsub.s $fa0, $fa0, $fa1, $fa2
-; LA64-NEXT:    ret
+; LA32-CONTRACT-FAST-LABEL: contract_fnmsub_s:
+; LA32-CONTRACT-FAST:       # %bb.0:
+; LA32-CONTRACT-FAST-NEXT:    fnmsub.s $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-FAST-NEXT:    ret
+;
+; LA32-CONTRACT-ON-LABEL: contract_fnmsub_s:
+; LA32-CONTRACT-ON:       # %bb.0:
+; LA32-CONTRACT-ON-NEXT:    fnmsub.s $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-ON-NEXT:    ret
+;
+; LA32-CONTRACT-OFF-LABEL: contract_fnmsub_s:
+; LA32-CONTRACT-OFF:       # %bb.0:
+; LA32-CONTRACT-OFF-NEXT:    fnmsub.s $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-OFF-NEXT:    ret
+;
+; LA64-CONTRACT-FAST-LABEL: contract_fnmsub_s:
+; LA64-CONTRACT-FAST:       # %bb.0:
+; LA64-CONTRACT-FAST-NEXT:    fnmsub.s $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-FAST-NEXT:    ret
+;
+; LA64-CONTRACT-ON-LABEL: contract_fnmsub_s:
+; LA64-CONTRACT-ON:       # %bb.0:
+; LA64-CONTRACT-ON-NEXT:    fnmsub.s $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-ON-NEXT:    ret
+;
+; LA64-CONTRACT-OFF-LABEL: contract_fnmsub_s:
+; LA64-CONTRACT-OFF:       # %bb.0:
+; LA64-CONTRACT-OFF-NEXT:    fnmsub.s $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-OFF-NEXT:    ret
   %negc = fneg contract float %c
   %mul = fmul contract float %a, %b
   %add = fadd contract float %mul, %negc
@@ -260,15 +580,35 @@ define float @contract_fnmsub_s(float %a, float %b, float %c) nounwind {
 }
 
 define float @contract_fnmsub_s_nsz(float %a, float %b, float %c) nounwind {
-; LA32-LABEL: contract_fnmsub_s_nsz:
-; LA32:       # %bb.0:
-; LA32-NEXT:    fnmsub.s $fa0, $fa0, $fa1, $fa2
-; LA32-NEXT:    ret
-;
-; LA64-LABEL: contract_fnmsub_s_nsz:
-; LA64:       # %bb.0:
-; LA64-NEXT:    fnmsub.s $fa0, $fa0, $fa1, $fa2
-; LA64-NEXT:    ret
+; LA32-CONTRACT-FAST-LABEL: contract_fnmsub_s_nsz:
+; LA32-CONTRACT-FAST:       # %bb.0:
+; LA32-CONTRACT-FAST-NEXT:    fnmsub.s $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-FAST-NEXT:    ret
+;
+; LA32-CONTRACT-ON-LABEL: contract_fnmsub_s_nsz:
+; LA32-CONTRACT-ON:       # %bb.0:
+; LA32-CONTRACT-ON-NEXT:    fnmsub.s $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-ON-NEXT:    ret
+;
+; LA32-CONTRACT-OFF-LABEL: contract_fnmsub_s_nsz:
+; LA32-CONTRACT-OFF:       # %bb.0:
+; LA32-CONTRACT-OFF-NEXT:    fnmsub.s $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-OFF-NEXT:    ret
+;
+; LA64-CONTRACT-FAST-LABEL: contract_fnmsub_s_nsz:
+; LA64-CONTRACT-FAST:       # %bb.0:
+; LA64-CONTRACT-FAST-NEXT:    fnmsub.s $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-FAST-NEXT:    ret
+;
+; LA64-CONTRACT-ON-LABEL: contract_fnmsub_s_nsz:
+; LA64-CONTRACT-ON:       # %bb.0:
+; LA64-CONTRACT-ON-NEXT:    fnmsub.s $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-ON-NEXT:    ret
+;
+; LA64-CONTRACT-OFF-LABEL: contract_fnmsub_s_nsz:
+; LA64-CONTRACT-OFF:       # %bb.0:
+; LA64-CONTRACT-OFF-NEXT:    fnmsub.s $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-OFF-NEXT:    ret
   %nega = fneg contract nsz float %a
   %mul = fmul contract nsz float %nega, %b
   %add = fadd contract nsz float %mul, %c
@@ -277,17 +617,41 @@ define float @contract_fnmsub_s_nsz(float %a, float %b, float %c) nounwind {
 
 ;; Check that fnmsub.s is not emitted.
 define float @not_contract_fnmsub_s(float %a, float %b, float %c) nounwind {
-; LA32-LABEL: not_contract_fnmsub_s:
-; LA32:       # %bb.0:
-; LA32-NEXT:    fneg.s $fa0, $fa0
-; LA32-NEXT:    fmadd.s $fa0, $fa0, $fa1, $fa2
-; LA32-NEXT:    ret
-;
-; LA64-LABEL: not_contract_fnmsub_s:
-; LA64:       # %bb.0:
-; LA64-NEXT:    fneg.s $fa0, $fa0
-; LA64-NEXT:    fmadd.s $fa0, $fa0, $fa1, $fa2
-; LA64-NEXT:    ret
+; LA32-CONTRACT-FAST-LABEL: not_contract_fnmsub_s:
+; LA32-CONTRACT-FAST:       # %bb.0:
+; LA32-CONTRACT-FAST-NEXT:    fneg.s $fa0, $fa0
+; LA32-CONTRACT-FAST-NEXT:    fmadd.s $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-FAST-NEXT:    ret
+;
+; LA32-CONTRACT-ON-LABEL: not_contract_fnmsub_s:
+; LA32-CONTRACT-ON:       # %bb.0:
+; LA32-CONTRACT-ON-NEXT:    fneg.s $fa0, $fa0
+; LA32-CONTRACT-ON-NEXT:    fmadd.s $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-ON-NEXT:    ret
+;
+; LA32-CONTRACT-OFF-LABEL: not_contract_fnmsub_s:
+; LA32-CONTRACT-OFF:       # %bb.0:
+; LA32-CONTRACT-OFF-NEXT:    fneg.s $fa0, $fa0
+; LA32-CONTRACT-OFF-NEXT:    fmadd.s $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-OFF-NEXT:    ret
+;
+; LA64-CONTRACT-FAST-LABEL: not_contract_fnmsub_s:
+; LA64-CONTRACT-FAST:       # %bb.0:
+; LA64-CONTRACT-FAST-NEXT:    fneg.s $fa0, $fa0
+; LA64-CONTRACT-FAST-NEXT:    fmadd.s $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-FAST-NEXT:    ret
+;
+; LA64-CONTRACT-ON-LABEL: not_contract_fnmsub_s:
+; LA64-CONTRACT-ON:       # %bb.0:
+; LA64-CONTRACT-ON-NEXT:    fneg.s $fa0, $fa0
+; LA64-CONTRACT-ON-NEXT:    fmadd.s $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-ON-NEXT:    ret
+;
+; LA64-CONTRACT-OFF-LABEL: not_contract_fnmsub_s:
+; LA64-CONTRACT-OFF:       # %bb.0:
+; LA64-CONTRACT-OFF-NEXT:    fneg.s $fa0, $fa0
+; LA64-CONTRACT-OFF-NEXT:    fmadd.s $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-OFF-NEXT:    ret
   %nega = fneg contract float %a
   %mul = fmul contract float %nega, %b
   %add = fadd contract float %mul, %c
@@ -297,59 +661,139 @@ define float @not_contract_fnmsub_s(float %a, float %b, float %c) nounwind {
 declare float @llvm.fma.f64(float, float, float)
 
 define float @fmadd_s_intrinsics(float %a, float %b, float %c) nounwind {
-; LA32-LABEL: fmadd_s_intrinsics:
-; LA32:       # %bb.0:
-; LA32-NEXT:    fmadd.s $fa0, $fa0, $fa1, $fa2
-; LA32-NEXT:    ret
-;
-; LA64-LABEL: fmadd_s_intrinsics:
-; LA64:       # %bb.0:
-; LA64-NEXT:    fmadd.s $fa0, $fa0, $fa1, $fa2
-; LA64-NEXT:    ret
+; LA32-CONTRACT-FAST-LABEL: fmadd_s_intrinsics:
+; LA32-CONTRACT-FAST:       # %bb.0:
+; LA32-CONTRACT-FAST-NEXT:    fmadd.s $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-FAST-NEXT:    ret
+;
+; LA32-CONTRACT-ON-LABEL: fmadd_s_intrinsics:
+; LA32-CONTRACT-ON:       # %bb.0:
+; LA32-CONTRACT-ON-NEXT:    fmadd.s $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-ON-NEXT:    ret
+;
+; LA32-CONTRACT-OFF-LABEL: fmadd_s_intrinsics:
+; LA32-CONTRACT-OFF:       # %bb.0:
+; LA32-CONTRACT-OFF-NEXT:    fmadd.s $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-OFF-NEXT:    ret
+;
+; LA64-CONTRACT-FAST-LABEL: fmadd_s_intrinsics:
+; LA64-CONTRACT-FAST:       # %bb.0:
+; LA64-CONTRACT-FAST-NEXT:    fmadd.s $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-FAST-NEXT:    ret
+;
+; LA64-CONTRACT-ON-LABEL: fmadd_s_intrinsics:
+; LA64-CONTRACT-ON:       # %bb.0:
+; LA64-CONTRACT-ON-NEXT:    fmadd.s $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-ON-NEXT:    ret
+;
+; LA64-CONTRACT-OFF-LABEL: fmadd_s_intrinsics:
+; LA64-CONTRACT-OFF:       # %bb.0:
+; LA64-CONTRACT-OFF-NEXT:    fmadd.s $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-OFF-NEXT:    ret
   %fma = call float @llvm.fma.f64(float %a, float %b, float %c)
   ret float %fma
 }
 
 define float @fmsub_s_intrinsics(float %a, float %b, float %c) nounwind {
-; LA32-LABEL: fmsub_s_intrinsics:
-; LA32:       # %bb.0:
-; LA32-NEXT:    fmsub.s $fa0, $fa0, $fa1, $fa2
-; LA32-NEXT:    ret
-;
-; LA64-LABEL: fmsub_s_intrinsics:
-; LA64:       # %bb.0:
-; LA64-NEXT:    fmsub.s $fa0, $fa0, $fa1, $fa2
-; LA64-NEXT:    ret
+; LA32-CONTRACT-FAST-LABEL: fmsub_s_intrinsics:
+; LA32-CONTRACT-FAST:       # %bb.0:
+; LA32-CONTRACT-FAST-NEXT:    fmsub.s $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-FAST-NEXT:    ret
+;
+; LA32-CONTRACT-ON-LABEL: fmsub_s_intrinsics:
+; LA32-CONTRACT-ON:       # %bb.0:
+; LA32-CONTRACT-ON-NEXT:    fmsub.s $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-ON-NEXT:    ret
+;
+; LA32-CONTRACT-OFF-LABEL: fmsub_s_intrinsics:
+; LA32-CONTRACT-OFF:       # %bb.0:
+; LA32-CONTRACT-OFF-NEXT:    fmsub.s $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-OFF-NEXT:    ret
+;
+; LA64-CONTRACT-FAST-LABEL: fmsub_s_intrinsics:
+; LA64-CONTRACT-FAST:       # %bb.0:
+; LA64-CONTRACT-FAST-NEXT:    fmsub.s $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-FAST-NEXT:    ret
+;
+; LA64-CONTRACT-ON-LABEL: fmsub_s_intrinsics:
+; LA64-CONTRACT-ON:       # %bb.0:
+; LA64-CONTRACT-ON-NEXT:    fmsub.s $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-ON-NEXT:    ret
+;
+; LA64-CONTRACT-OFF-LABEL: fmsub_s_intrinsics:
+; LA64-CONTRACT-OFF:       # %bb.0:
+; LA64-CONTRACT-OFF-NEXT:    fmsub.s $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-OFF-NEXT:    ret
   %negc = fneg float %c
   %fma = call float @llvm.fma.f64(float %a, float %b, float %negc)
   ret float %fma
 }
 
 define float @fnmadd_s_intrinsics(float %a, float %b, float %c) nounwind {
-; LA32-LABEL: fnmadd_s_intrinsics:
-; LA32:       # %bb.0:
-; LA32-NEXT:    fnmadd.s $fa0, $fa0, $fa1, $fa2
-; LA32-NEXT:    ret
-;
-; LA64-LABEL: fnmadd_s_intrinsics:
-; LA64:       # %bb.0:
-; LA64-NEXT:    fnmadd.s $fa0, $fa0, $fa1, $fa2
-; LA64-NEXT:    ret
+; LA32-CONTRACT-FAST-LABEL: fnmadd_s_intrinsics:
+; LA32-CONTRACT-FAST:       # %bb.0:
+; LA32-CONTRACT-FAST-NEXT:    fnmadd.s $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-FAST-NEXT:    ret
+;
+; LA32-CONTRACT-ON-LABEL: fnmadd_s_intrinsics:
+; LA32-CONTRACT-ON:       # %bb.0:
+; LA32-CONTRACT-ON-NEXT:    fnmadd.s $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-ON-NEXT:    ret
+;
+; LA32-CONTRACT-OFF-LABEL: fnmadd_s_intrinsics:
+; LA32-CONTRACT-OFF:       # %bb.0:
+; LA32-CONTRACT-OFF-NEXT:    fnmadd.s $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-OFF-NEXT:    ret
+;
+; LA64-CONTRACT-FAST-LABEL: fnmadd_s_intrinsics:
+; LA64-CONTRACT-FAST:       # %bb.0:
+; LA64-CONTRACT-FAST-NEXT:    fnmadd.s $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-FAST-NEXT:    ret
+;
+; LA64-CONTRACT-ON-LABEL: fnmadd_s_intrinsics:
+; LA64-CONTRACT-ON:       # %bb.0:
+; LA64-CONTRACT-ON-NEXT:    fnmadd.s $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-ON-NEXT:    ret
+;
+; LA64-CONTRACT-OFF-LABEL: fnmadd_s_intrinsics:
+; LA64-CONTRACT-OFF:       # %bb.0:
+; LA64-CONTRACT-OFF-NEXT:    fnmadd.s $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-OFF-NEXT:    ret
   %fma = call float @llvm.fma.f64(float %a, float %b, float %c)
   %negfma = fneg float %fma
   ret float %negfma
 }
 
 define float @fnmadd_s_nsz_intrinsics(float %a, float %b, float %c) nounwind {
-; LA32-LABEL: fnmadd_s_nsz_intrinsics:
-; LA32:       # %bb.0:
-; LA32-NEXT:    fnmadd.s $fa0, $fa0, $fa1, $fa2
-; LA32-NEXT:    ret
-;
-; LA64-LABEL: fnmadd_s_nsz_intrinsics:
-; LA64:       # %bb.0:
-; LA64-NEXT:    fnmadd.s $fa0, $fa0, $fa1, $fa2
-; LA64-NEXT:    ret
+; LA32-CONTRACT-FAST-LABEL: fnmadd_s_nsz_intrinsics:
+; LA32-CONTRACT-FAST:       # %bb.0:
+; LA32-CONTRACT-FAST-NEXT:    fnmadd.s $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-FAST-NEXT:    ret
+;
+; LA32-CONTRACT-ON-LABEL: fnmadd_s_nsz_intrinsics:
+; LA32-CONTRACT-ON:       # %bb.0:
+; LA32-CONTRACT-ON-NEXT:    fnmadd.s $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-ON-NEXT:    ret
+;
+; LA32-CONTRACT-OFF-LABEL: fnmadd_s_nsz_intrinsics:
+; LA32-CONTRACT-OFF:       # %bb.0:
+; LA32-CONTRACT-OFF-NEXT:    fnmadd.s $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-OFF-NEXT:    ret
+;
+; LA64-CONTRACT-FAST-LABEL: fnmadd_s_nsz_intrinsics:
+; LA64-CONTRACT-FAST:       # %bb.0:
+; LA64-CONTRACT-FAST-NEXT:    fnmadd.s $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-FAST-NEXT:    ret
+;
+; LA64-CONTRACT-ON-LABEL: fnmadd_s_nsz_intrinsics:
+; LA64-CONTRACT-ON:       # %bb.0:
+; LA64-CONTRACT-ON-NEXT:    fnmadd.s $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-ON-NEXT:    ret
+;
+; LA64-CONTRACT-OFF-LABEL: fnmadd_s_nsz_intrinsics:
+; LA64-CONTRACT-OFF:       # %bb.0:
+; LA64-CONTRACT-OFF-NEXT:    fnmadd.s $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-OFF-NEXT:    ret
   %nega = fneg float %a
   %negc = fneg float %c
   %fma = call nsz float @llvm.fma.f64(float %nega, float %b, float %negc)
@@ -358,17 +802,41 @@ define float @fnmadd_s_nsz_intrinsics(float %a, float %b, float %c) nounwind {
 
 ;; Check that fnmadd.s is not emitted.
 define float @not_fnmadd_s_intrinsics(float %a, float %b, float %c) nounwind {
-; LA32-LABEL: not_fnmadd_s_intrinsics:
-; LA32:       # %bb.0:
-; LA32-NEXT:    fneg.s $fa0, $fa0
-; LA32-NEXT:    fmsub.s $fa0, $fa0, $fa1, $fa2
-; LA32-NEXT:    ret
-;
-; LA64-LABEL: not_fnmadd_s_intrinsics:
-; LA64:       # %bb.0:
-; LA64-NEXT:    fneg.s $fa0, $fa0
-; LA64-NEXT:    fmsub.s $fa0, $fa0, $fa1, $fa2
-; LA64-NEXT:    ret
+; LA32-CONTRACT-FAST-LABEL: not_fnmadd_s_intrinsics:
+; LA32-CONTRACT-FAST:       # %bb.0:
+; LA32-CONTRACT-FAST-NEXT:    fneg.s $fa0, $fa0
+; LA32-CONTRACT-FAST-NEXT:    fmsub.s $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-FAST-NEXT:    ret
+;
+; LA32-CONTRACT-ON-LABEL: not_fnmadd_s_intrinsics:
+; LA32-CONTRACT-ON:       # %bb.0:
+; LA32-CONTRACT-ON-NEXT:    fneg.s $fa0, $fa0
+; LA32-CONTRACT-ON-NEXT:    fmsub.s $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-ON-NEXT:    ret
+;
+; LA32-CONTRACT-OFF-LABEL: not_fnmadd_s_intrinsics:
+; LA32-CONTRACT-OFF:       # %bb.0:
+; LA32-CONTRACT-OFF-NEXT:    fneg.s $fa0, $fa0
+; LA32-CONTRACT-OFF-NEXT:    fmsub.s $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-OFF-NEXT:    ret
+;
+; LA64-CONTRACT-FAST-LABEL: not_fnmadd_s_intrinsics:
+; LA64-CONTRACT-FAST:       # %bb.0:
+; LA64-CONTRACT-FAST-NEXT:    fneg.s $fa0, $fa0
+; LA64-CONTRACT-FAST-NEXT:    fmsub.s $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-FAST-NEXT:    ret
+;
+; LA64-CONTRACT-ON-LABEL: not_fnmadd_s_intrinsics:
+; LA64-CONTRACT-ON:       # %bb.0:
+; LA64-CONTRACT-ON-NEXT:    fneg.s $fa0, $fa0
+; LA64-CONTRACT-ON-NEXT:    fmsub.s $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-ON-NEXT:    ret
+;
+; LA64-CONTRACT-OFF-LABEL: not_fnmadd_s_intrinsics:
+; LA64-CONTRACT-OFF:       # %bb.0:
+; LA64-CONTRACT-OFF-NEXT:    fneg.s $fa0, $fa0
+; LA64-CONTRACT-OFF-NEXT:    fmsub.s $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-OFF-NEXT:    ret
   %nega = fneg float %a
   %negc = fneg float %c
   %fma = call float @llvm.fma.f64(float %nega, float %b, float %negc)
@@ -376,15 +844,35 @@ define float @not_fnmadd_s_intrinsics(float %a, float %b, float %c) nounwind {
 }
 
 define float @fnmsub_s_intrinsics(float %a, float %b, float %c) nounwind {
-; LA32-LABEL: fnmsub_s_intrinsics:
-; LA32:       # %bb.0:
-; LA32-NEXT:    fnmsub.s $fa0, $fa0, $fa1, $fa2
-; LA32-NEXT:    ret
-;
-; LA64-LABEL: fnmsub_s_intrinsics:
-; LA64:       # %bb.0:
-; LA64-NEXT:    fnmsub.s $fa0, $fa0, $fa1, $fa2
-; LA64-NEXT:    ret
+; LA32-CONTRACT-FAST-LABEL: fnmsub_s_intrinsics:
+; LA32-CONTRACT-FAST:       # %bb.0:
+; LA32-CONTRACT-FAST-NEXT:    fnmsub.s $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-FAST-NEXT:    ret
+;
+; LA32-CONTRACT-ON-LABEL: fnmsub_s_intrinsics:
+; LA32-CONTRACT-ON:       # %bb.0:
+; LA32-CONTRACT-ON-NEXT:    fnmsub.s $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-ON-NEXT:    ret
+;
+; LA32-CONTRACT-OFF-LABEL: fnmsub_s_intrinsics:
+; LA32-CONTRACT-OFF:       # %bb.0:
+; LA32-CONTRACT-OFF-NEXT:    fnmsub.s $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-OFF-NEXT:    ret
+;
+; LA64-CONTRACT-FAST-LABEL: fnmsub_s_intrinsics:
+; LA64-CONTRACT-FAST:       # %bb.0:
+; LA64-CONTRACT-FAST-NEXT:    fnmsub.s $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-FAST-NEXT:    ret
+;
+; LA64-CONTRACT-ON-LABEL: fnmsub_s_intrinsics:
+; LA64-CONTRACT-ON:       # %bb.0:
+; LA64-CONTRACT-ON-NEXT:    fnmsub.s $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-ON-NEXT:    ret
+;
+; LA64-CONTRACT-OFF-LABEL: fnmsub_s_intrinsics:
+; LA64-CONTRACT-OFF:       # %bb.0:
+; LA64-CONTRACT-OFF-NEXT:    fnmsub.s $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-OFF-NEXT:    ret
   %negc = fneg float %c
   %fma = call float @llvm.fma.f64(float %a, float %b, float %negc)
   %negfma = fneg float %fma
@@ -392,15 +880,35 @@ define float @fnmsub_s_intrinsics(float %a, float %b, float %c) nounwind {
 }
 
 define float @fnmsub_s_nsz_intrinsics(float %a, float %b, float %c) nounwind {
-; LA32-LABEL: fnmsub_s_nsz_intrinsics:
-; LA32:       # %bb.0:
-; LA32-NEXT:    fnmsub.s $fa0, $fa0, $fa1, $fa2
-; LA32-NEXT:    ret
-;
-; LA64-LABEL: fnmsub_s_nsz_intrinsics:
-; LA64:       # %bb.0:
-; LA64-NEXT:    fnmsub.s $fa0, $fa0, $fa1, $fa2
-; LA64-NEXT:    ret
+; LA32-CONTRACT-FAST-LABEL: fnmsub_s_nsz_intrinsics:
+; LA32-CONTRACT-FAST:       # %bb.0:
+; LA32-CONTRACT-FAST-NEXT:    fnmsub.s $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-FAST-NEXT:    ret
+;
+; LA32-CONTRACT-ON-LABEL: fnmsub_s_nsz_intrinsics:
+; LA32-CONTRACT-ON:       # %bb.0:
+; LA32-CONTRACT-ON-NEXT:    fnmsub.s $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-ON-NEXT:    ret
+;
+; LA32-CONTRACT-OFF-LABEL: fnmsub_s_nsz_intrinsics:
+; LA32-CONTRACT-OFF:       # %bb.0:
+; LA32-CONTRACT-OFF-NEXT:    fnmsub.s $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-OFF-NEXT:    ret
+;
+; LA64-CONTRACT-FAST-LABEL: fnmsub_s_nsz_intrinsics:
+; LA64-CONTRACT-FAST:       # %bb.0:
+; LA64-CONTRACT-FAST-NEXT:    fnmsub.s $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-FAST-NEXT:    ret
+;
+; LA64-CONTRACT-ON-LABEL: fnmsub_s_nsz_intrinsics:
+; LA64-CONTRACT-ON:       # %bb.0:
+; LA64-CONTRACT-ON-NEXT:    fnmsub.s $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-ON-NEXT:    ret
+;
+; LA64-CONTRACT-OFF-LABEL: fnmsub_s_nsz_intrinsics:
+; LA64-CONTRACT-OFF:       # %bb.0:
+; LA64-CONTRACT-OFF-NEXT:    fnmsub.s $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-OFF-NEXT:    ret
   %nega = fneg float %a
   %fma = call nsz float @llvm.fma.f64(float %nega, float %b, float %c)
   ret float %fma
@@ -408,62 +916,146 @@ define float @fnmsub_s_nsz_intrinsics(float %a, float %b, float %c) nounwind {
 
 ;; Check that fnmsub.s is not emitted.
 define float @not_fnmsub_s_intrinsics(float %a, float %b, float %c) nounwind {
-; LA32-LABEL: not_fnmsub_s_intrinsics:
-; LA32:       # %bb.0:
-; LA32-NEXT:    fneg.s $fa0, $fa0
-; LA32-NEXT:    fmadd.s $fa0, $fa0, $fa1, $fa2
-; LA32-NEXT:    ret
-;
-; LA64-LABEL: not_fnmsub_s_intrinsics:
-; LA64:       # %bb.0:
-; LA64-NEXT:    fneg.s $fa0, $fa0
-; LA64-NEXT:    fmadd.s $fa0, $fa0, $fa1, $fa2
-; LA64-NEXT:    ret
+; LA32-CONTRACT-FAST-LABEL: not_fnmsub_s_intrinsics:
+; LA32-CONTRACT-FAST:       # %bb.0:
+; LA32-CONTRACT-FAST-NEXT:    fneg.s $fa0, $fa0
+; LA32-CONTRACT-FAST-NEXT:    fmadd.s $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-FAST-NEXT:    ret
+;
+; LA32-CONTRACT-ON-LABEL: not_fnmsub_s_intrinsics:
+; LA32-CONTRACT-ON:       # %bb.0:
+; LA32-CONTRACT-ON-NEXT:    fneg.s $fa0, $fa0
+; LA32-CONTRACT-ON-NEXT:    fmadd.s $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-ON-NEXT:    ret
+;
+; LA32-CONTRACT-OFF-LABEL: not_fnmsub_s_intrinsics:
+; LA32-CONTRACT-OFF:       # %bb.0:
+; LA32-CONTRACT-OFF-NEXT:    fneg.s $fa0, $fa0
+; LA32-CONTRACT-OFF-NEXT:    fmadd.s $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-OFF-NEXT:    ret
+;
+; LA64-CONTRACT-FAST-LABEL: not_fnmsub_s_intrinsics:
+; LA64-CONTRACT-FAST:       # %bb.0:
+; LA64-CONTRACT-FAST-NEXT:    fneg.s $fa0, $fa0
+; LA64-CONTRACT-FAST-NEXT:    fmadd.s $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-FAST-NEXT:    ret
+;
+; LA64-CONTRACT-ON-LABEL: not_fnmsub_s_intrinsics:
+; LA64-CONTRACT-ON:       # %bb.0:
+; LA64-CONTRACT-ON-NEXT:    fneg.s $fa0, $fa0
+; LA64-CONTRACT-ON-NEXT:    fmadd.s $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-ON-NEXT:    ret
+;
+; LA64-CONTRACT-OFF-LABEL: not_fnmsub_s_intrinsics:
+; LA64-CONTRACT-OFF:       # %bb.0:
+; LA64-CONTRACT-OFF-NEXT:    fneg.s $fa0, $fa0
+; LA64-CONTRACT-OFF-NEXT:    fmadd.s $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-OFF-NEXT:    ret
   %nega = fneg float %a
   %fma = call float @llvm.fma.f64(float %nega, float %b, float %c)
   ret float %fma
 }
 
 define float @fmadd_s_contract(float %a, float %b, float %c) nounwind {
-; LA32-LABEL: fmadd_s_contract:
-; LA32:       # %bb.0:
-; LA32-NEXT:    fmadd.s $fa0, $fa0, $fa1, $fa2
-; LA32-NEXT:    ret
-;
-; LA64-LABEL: fmadd_s_contract:
-; LA64:       # %bb.0:
-; LA64-NEXT:    fmadd.s $fa0, $fa0, $fa1, $fa2
-; LA64-NEXT:    ret
+; LA32-CONTRACT-FAST-LABEL: fmadd_s_contract:
+; LA32-CONTRACT-FAST:       # %bb.0:
+; LA32-CONTRACT-FAST-NEXT:    fmadd.s $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-FAST-NEXT:    ret
+;
+; LA32-CONTRACT-ON-LABEL: fmadd_s_contract:
+; LA32-CONTRACT-ON:       # %bb.0:
+; LA32-CONTRACT-ON-NEXT:    fmadd.s $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-ON-NEXT:    ret
+;
+; LA32-CONTRACT-OFF-LABEL: fmadd_s_contract:
+; LA32-CONTRACT-OFF:       # %bb.0:
+; LA32-CONTRACT-OFF-NEXT:    fmadd.s $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-OFF-NEXT:    ret
+;
+; LA64-CONTRACT-FAST-LABEL: fmadd_s_contract:
+; LA64-CONTRACT-FAST:       # %bb.0:
+; LA64-CONTRACT-FAST-NEXT:    fmadd.s $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-FAST-NEXT:    ret
+;
+; LA64-CONTRACT-ON-LABEL: fmadd_s_contract:
+; LA64-CONTRACT-ON:       # %bb.0:
+; LA64-CONTRACT-ON-NEXT:    fmadd.s $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-ON-NEXT:    ret
+;
+; LA64-CONTRACT-OFF-LABEL: fmadd_s_contract:
+; LA64-CONTRACT-OFF:       # %bb.0:
+; LA64-CONTRACT-OFF-NEXT:    fmadd.s $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-OFF-NEXT:    ret
   %mul = fmul contract float %a, %b
   %add = fadd contract float %mul, %c
   ret float %add
 }
 
 define float @fmsub_s_contract(float %a, float %b, float %c) nounwind {
-; LA32-LABEL: fmsub_s_contract:
-; LA32:       # %bb.0:
-; LA32-NEXT:    fmsub.s $fa0, $fa0, $fa1, $fa2
-; LA32-NEXT:    ret
-;
-; LA64-LABEL: fmsub_s_contract:
-; LA64:       # %bb.0:
-; LA64-NEXT:    fmsub.s $fa0, $fa0, $fa1, $fa2
-; LA64-NEXT:    ret
+; LA32-CONTRACT-FAST-LABEL: fmsub_s_contract:
+; LA32-CONTRACT-FAST:       # %bb.0:
+; LA32-CONTRACT-FAST-NEXT:    fmsub.s $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-FAST-NEXT:    ret
+;
+; LA32-CONTRACT-ON-LABEL: fmsub_s_contract:
+; LA32-CONTRACT-ON:       # %bb.0:
+; LA32-CONTRACT-ON-NEXT:    fmsub.s $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-ON-NEXT:    ret
+;
+; LA32-CONTRACT-OFF-LABEL: fmsub_s_contract:
+; LA32-CONTRACT-OFF:       # %bb.0:
+; LA32-CONTRACT-OFF-NEXT:    fmsub.s $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-OFF-NEXT:    ret
+;
+; LA64-CONTRACT-FAST-LABEL: fmsub_s_contract:
+; LA64-CONTRACT-FAST:       # %bb.0:
+; LA64-CONTRACT-FAST-NEXT:    fmsub.s $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-FAST-NEXT:    ret
+;
+; LA64-CONTRACT-ON-LABEL: fmsub_s_contract:
+; LA64-CONTRACT-ON:       # %bb.0:
+; LA64-CONTRACT-ON-NEXT:    fmsub.s $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-ON-NEXT:    ret
+;
+; LA64-CONTRACT-OFF-LABEL: fmsub_s_contract:
+; LA64-CONTRACT-OFF:       # %bb.0:
+; LA64-CONTRACT-OFF-NEXT:    fmsub.s $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-OFF-NEXT:    ret
   %mul = fmul contract float %a, %b
   %sub = fsub contract float %mul, %c
   ret float %sub
 }
 
 define float @fnmadd_s_contract(float %a, float %b, float %c) nounwind {
-; LA32-LABEL: fnmadd_s_contract:
-; LA32:       # %bb.0:
-; LA32-NEXT:    fnmadd.s $fa0, $fa0, $fa1, $fa2
-; LA32-NEXT:    ret
-;
-; LA64-LABEL: fnmadd_s_contract:
-; LA64:       # %bb.0:
-; LA64-NEXT:    fnmadd.s $fa0, $fa0, $fa1, $fa2
-; LA64-NEXT:    ret
+; LA32-CONTRACT-FAST-LABEL: fnmadd_s_contract:
+; LA32-CONTRACT-FAST:       # %bb.0:
+; LA32-CONTRACT-FAST-NEXT:    fnmadd.s $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-FAST-NEXT:    ret
+;
+; LA32-CONTRACT-ON-LABEL: fnmadd_s_contract:
+; LA32-CONTRACT-ON:       # %bb.0:
+; LA32-CONTRACT-ON-NEXT:    fnmadd.s $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-ON-NEXT:    ret
+;
+; LA32-CONTRACT-OFF-LABEL: fnmadd_s_contract:
+; LA32-CONTRACT-OFF:       # %bb.0:
+; LA32-CONTRACT-OFF-NEXT:    fnmadd.s $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-OFF-NEXT:    ret
+;
+; LA64-CONTRACT-FAST-LABEL: fnmadd_s_contract:
+; LA64-CONTRACT-FAST:       # %bb.0:
+; LA64-CONTRACT-FAST-NEXT:    fnmadd.s $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-FAST-NEXT:    ret
+;
+; LA64-CONTRACT-ON-LABEL: fnmadd_s_contract:
+; LA64-CONTRACT-ON:       # %bb.0:
+; LA64-CONTRACT-ON-NEXT:    fnmadd.s $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-ON-NEXT:    ret
+;
+; LA64-CONTRACT-OFF-LABEL: fnmadd_s_contract:
+; LA64-CONTRACT-OFF:       # %bb.0:
+; LA64-CONTRACT-OFF-NEXT:    fnmadd.s $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-OFF-NEXT:    ret
   %mul = fmul contract float %a, %b
   %add = fadd contract float %mul, %c
   %negadd = fneg contract float %add
@@ -471,15 +1063,35 @@ define float @fnmadd_s_contract(float %a, float %b, float %c) nounwind {
 }
 
 define float @fnmsub_s_contract(float %a, float %b, float %c) nounwind {
-; LA32-LABEL: fnmsub_s_contract:
-; LA32:       # %bb.0:
-; LA32-NEXT:    fnmsub.s $fa0, $fa0, $fa1, $fa2
-; LA32-NEXT:    ret
-;
-; LA64-LABEL: fnmsub_s_contract:
-; LA64:       # %bb.0:
-; LA64-NEXT:    fnmsub.s $fa0, $fa0, $fa1, $fa2
-; LA64-NEXT:    ret
+; LA32-CONTRACT-FAST-LABEL: fnmsub_s_contract:
+; LA32-CONTRACT-FAST:       # %bb.0:
+; LA32-CONTRACT-FAST-NEXT:    fnmsub.s $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-FAST-NEXT:    ret
+;
+; LA32-CONTRACT-ON-LABEL: fnmsub_s_contract:
+; LA32-CONTRACT-ON:       # %bb.0:
+; LA32-CONTRACT-ON-NEXT:    fnmsub.s $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-ON-NEXT:    ret
+;
+; LA32-CONTRACT-OFF-LABEL: fnmsub_s_contract:
+; LA32-CONTRACT-OFF:       # %bb.0:
+; LA32-CONTRACT-OFF-NEXT:    fnmsub.s $fa0, $fa0, $fa1, $fa2
+; LA32-CONTRACT-OFF-NEXT:    ret
+;
+; LA64-CONTRACT-FAST-LABEL: fnmsub_s_contract:
+; LA64-CONTRACT-FAST:       # %bb.0:
+; LA64-CONTRACT-FAST-NEXT:    fnmsub.s $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-FAST-NEXT:    ret
+;
+; LA64-CONTRACT-ON-LABEL: fnmsub_s_contract:
+; LA64-CONTRACT-ON:       # %bb.0:
+; LA64-CONTRACT-ON-NEXT:    fnmsub.s $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-ON-NEXT:    ret
+;
+; LA64-CONTRACT-OFF-LABEL: fnmsub_s_contract:
+; LA64-CONTRACT-OFF:       # %bb.0:
+; LA64-CONTRACT-OFF-NEXT:    fnmsub.s $fa0, $fa0, $fa1, $fa2
+; LA64-CONTRACT-OFF-NEXT:    ret
   %mul = fmul contract float %a, %b
   %negc = fneg contract float %c
   %add = fadd contract float %negc, %mul

diff  --git a/llvm/test/CodeGen/LoongArch/lasx/fma-v4f64.ll b/llvm/test/CodeGen/LoongArch/lasx/fma-v4f64.ll
index 76cc8f62b218c..8e1ba7ea16016 100644
--- a/llvm/test/CodeGen/LoongArch/lasx/fma-v4f64.ll
+++ b/llvm/test/CodeGen/LoongArch/lasx/fma-v4f64.ll
@@ -1,29 +1,75 @@
 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
-; RUN: llc --mtriple=loongarch32 --mattr=+32s,+lasx < %s \
-; RUN:   | FileCheck %s --check-prefix=LA32-CONTRACT
-; RUN: llc --mtriple=loongarch64 --mattr=+lasx < %s \
-; RUN:   | FileCheck %s --check-prefix=LA64-CONTRACT
+; RUN: llc --mtriple=loongarch32 --mattr=+32s,+lasx --fp-contract=fast < %s \
+; RUN:   | FileCheck %s --check-prefix=LA32-CONTRACT-FAST
+; RUN: llc --mtriple=loongarch32 --mattr=+32s,+lasx --fp-contract=on < %s \
+; RUN:   | FileCheck %s --check-prefix=LA32-CONTRACT-ON
+; RUN: llc --mtriple=loongarch32 --mattr=+32s,+lasx --fp-contract=off < %s \
+; RUN:   | FileCheck %s --check-prefix=LA32-CONTRACT-OFF
+; RUN: llc --mtriple=loongarch64 --mattr=+lasx --fp-contract=fast < %s \
+; RUN:   | FileCheck %s --check-prefix=LA64-CONTRACT-FAST
+; RUN: llc --mtriple=loongarch64 --mattr=+lasx --fp-contract=on < %s \
+; RUN:   | FileCheck %s --check-prefix=LA64-CONTRACT-ON
+; RUN: llc --mtriple=loongarch64 --mattr=+lasx --fp-contract=off < %s \
+; RUN:   | FileCheck %s --check-prefix=LA64-CONTRACT-OFF
 
 define void @xvfmadd_d(ptr %res, ptr %a0, ptr %a1, ptr %a2) nounwind {
-; LA32-CONTRACT-LABEL: xvfmadd_d:
-; LA32-CONTRACT:       # %bb.0: # %entry
-; LA32-CONTRACT-NEXT:    xvld $xr0, $a1, 0
-; LA32-CONTRACT-NEXT:    xvld $xr1, $a2, 0
-; LA32-CONTRACT-NEXT:    xvld $xr2, $a3, 0
-; LA32-CONTRACT-NEXT:    xvfmul.d $xr0, $xr0, $xr1
-; LA32-CONTRACT-NEXT:    xvfadd.d $xr0, $xr0, $xr2
-; LA32-CONTRACT-NEXT:    xvst $xr0, $a0, 0
-; LA32-CONTRACT-NEXT:    ret
-;
-; LA64-CONTRACT-LABEL: xvfmadd_d:
-; LA64-CONTRACT:       # %bb.0: # %entry
-; LA64-CONTRACT-NEXT:    xvld $xr0, $a1, 0
-; LA64-CONTRACT-NEXT:    xvld $xr1, $a2, 0
-; LA64-CONTRACT-NEXT:    xvld $xr2, $a3, 0
-; LA64-CONTRACT-NEXT:    xvfmul.d $xr0, $xr0, $xr1
-; LA64-CONTRACT-NEXT:    xvfadd.d $xr0, $xr0, $xr2
-; LA64-CONTRACT-NEXT:    xvst $xr0, $a0, 0
-; LA64-CONTRACT-NEXT:    ret
+; LA32-CONTRACT-FAST-LABEL: xvfmadd_d:
+; LA32-CONTRACT-FAST:       # %bb.0: # %entry
+; LA32-CONTRACT-FAST-NEXT:    xvld $xr0, $a1, 0
+; LA32-CONTRACT-FAST-NEXT:    xvld $xr1, $a2, 0
+; LA32-CONTRACT-FAST-NEXT:    xvld $xr2, $a3, 0
+; LA32-CONTRACT-FAST-NEXT:    xvfmadd.d $xr0, $xr0, $xr1, $xr2
+; LA32-CONTRACT-FAST-NEXT:    xvst $xr0, $a0, 0
+; LA32-CONTRACT-FAST-NEXT:    ret
+;
+; LA32-CONTRACT-ON-LABEL: xvfmadd_d:
+; LA32-CONTRACT-ON:       # %bb.0: # %entry
+; LA32-CONTRACT-ON-NEXT:    xvld $xr0, $a1, 0
+; LA32-CONTRACT-ON-NEXT:    xvld $xr1, $a2, 0
+; LA32-CONTRACT-ON-NEXT:    xvld $xr2, $a3, 0
+; LA32-CONTRACT-ON-NEXT:    xvfmul.d $xr0, $xr0, $xr1
+; LA32-CONTRACT-ON-NEXT:    xvfadd.d $xr0, $xr0, $xr2
+; LA32-CONTRACT-ON-NEXT:    xvst $xr0, $a0, 0
+; LA32-CONTRACT-ON-NEXT:    ret
+;
+; LA32-CONTRACT-OFF-LABEL: xvfmadd_d:
+; LA32-CONTRACT-OFF:       # %bb.0: # %entry
+; LA32-CONTRACT-OFF-NEXT:    xvld $xr0, $a1, 0
+; LA32-CONTRACT-OFF-NEXT:    xvld $xr1, $a2, 0
+; LA32-CONTRACT-OFF-NEXT:    xvld $xr2, $a3, 0
+; LA32-CONTRACT-OFF-NEXT:    xvfmul.d $xr0, $xr0, $xr1
+; LA32-CONTRACT-OFF-NEXT:    xvfadd.d $xr0, $xr0, $xr2
+; LA32-CONTRACT-OFF-NEXT:    xvst $xr0, $a0, 0
+; LA32-CONTRACT-OFF-NEXT:    ret
+;
+; LA64-CONTRACT-FAST-LABEL: xvfmadd_d:
+; LA64-CONTRACT-FAST:       # %bb.0: # %entry
+; LA64-CONTRACT-FAST-NEXT:    xvld $xr0, $a1, 0
+; LA64-CONTRACT-FAST-NEXT:    xvld $xr1, $a2, 0
+; LA64-CONTRACT-FAST-NEXT:    xvld $xr2, $a3, 0
+; LA64-CONTRACT-FAST-NEXT:    xvfmadd.d $xr0, $xr0, $xr1, $xr2
+; LA64-CONTRACT-FAST-NEXT:    xvst $xr0, $a0, 0
+; LA64-CONTRACT-FAST-NEXT:    ret
+;
+; LA64-CONTRACT-ON-LABEL: xvfmadd_d:
+; LA64-CONTRACT-ON:       # %bb.0: # %entry
+; LA64-CONTRACT-ON-NEXT:    xvld $xr0, $a1, 0
+; LA64-CONTRACT-ON-NEXT:    xvld $xr1, $a2, 0
+; LA64-CONTRACT-ON-NEXT:    xvld $xr2, $a3, 0
+; LA64-CONTRACT-ON-NEXT:    xvfmul.d $xr0, $xr0, $xr1
+; LA64-CONTRACT-ON-NEXT:    xvfadd.d $xr0, $xr0, $xr2
+; LA64-CONTRACT-ON-NEXT:    xvst $xr0, $a0, 0
+; LA64-CONTRACT-ON-NEXT:    ret
+;
+; LA64-CONTRACT-OFF-LABEL: xvfmadd_d:
+; LA64-CONTRACT-OFF:       # %bb.0: # %entry
+; LA64-CONTRACT-OFF-NEXT:    xvld $xr0, $a1, 0
+; LA64-CONTRACT-OFF-NEXT:    xvld $xr1, $a2, 0
+; LA64-CONTRACT-OFF-NEXT:    xvld $xr2, $a3, 0
+; LA64-CONTRACT-OFF-NEXT:    xvfmul.d $xr0, $xr0, $xr1
+; LA64-CONTRACT-OFF-NEXT:    xvfadd.d $xr0, $xr0, $xr2
+; LA64-CONTRACT-OFF-NEXT:    xvst $xr0, $a0, 0
+; LA64-CONTRACT-OFF-NEXT:    ret
 entry:
   %v0 = load <4 x double>, ptr %a0
   %v1 = load <4 x double>, ptr %a1
@@ -35,25 +81,63 @@ entry:
 }
 
 define void @xvfmsub_d(ptr %res, ptr %a0, ptr %a1, ptr %a2) nounwind {
-; LA32-CONTRACT-LABEL: xvfmsub_d:
-; LA32-CONTRACT:       # %bb.0: # %entry
-; LA32-CONTRACT-NEXT:    xvld $xr0, $a1, 0
-; LA32-CONTRACT-NEXT:    xvld $xr1, $a2, 0
-; LA32-CONTRACT-NEXT:    xvld $xr2, $a3, 0
-; LA32-CONTRACT-NEXT:    xvfmul.d $xr0, $xr0, $xr1
-; LA32-CONTRACT-NEXT:    xvfsub.d $xr0, $xr0, $xr2
-; LA32-CONTRACT-NEXT:    xvst $xr0, $a0, 0
-; LA32-CONTRACT-NEXT:    ret
-;
-; LA64-CONTRACT-LABEL: xvfmsub_d:
-; LA64-CONTRACT:       # %bb.0: # %entry
-; LA64-CONTRACT-NEXT:    xvld $xr0, $a1, 0
-; LA64-CONTRACT-NEXT:    xvld $xr1, $a2, 0
-; LA64-CONTRACT-NEXT:    xvld $xr2, $a3, 0
-; LA64-CONTRACT-NEXT:    xvfmul.d $xr0, $xr0, $xr1
-; LA64-CONTRACT-NEXT:    xvfsub.d $xr0, $xr0, $xr2
-; LA64-CONTRACT-NEXT:    xvst $xr0, $a0, 0
-; LA64-CONTRACT-NEXT:    ret
+; LA32-CONTRACT-FAST-LABEL: xvfmsub_d:
+; LA32-CONTRACT-FAST:       # %bb.0: # %entry
+; LA32-CONTRACT-FAST-NEXT:    xvld $xr0, $a1, 0
+; LA32-CONTRACT-FAST-NEXT:    xvld $xr1, $a2, 0
+; LA32-CONTRACT-FAST-NEXT:    xvld $xr2, $a3, 0
+; LA32-CONTRACT-FAST-NEXT:    xvfmsub.d $xr0, $xr0, $xr1, $xr2
+; LA32-CONTRACT-FAST-NEXT:    xvst $xr0, $a0, 0
+; LA32-CONTRACT-FAST-NEXT:    ret
+;
+; LA32-CONTRACT-ON-LABEL: xvfmsub_d:
+; LA32-CONTRACT-ON:       # %bb.0: # %entry
+; LA32-CONTRACT-ON-NEXT:    xvld $xr0, $a1, 0
+; LA32-CONTRACT-ON-NEXT:    xvld $xr1, $a2, 0
+; LA32-CONTRACT-ON-NEXT:    xvld $xr2, $a3, 0
+; LA32-CONTRACT-ON-NEXT:    xvfmul.d $xr0, $xr0, $xr1
+; LA32-CONTRACT-ON-NEXT:    xvfsub.d $xr0, $xr0, $xr2
+; LA32-CONTRACT-ON-NEXT:    xvst $xr0, $a0, 0
+; LA32-CONTRACT-ON-NEXT:    ret
+;
+; LA32-CONTRACT-OFF-LABEL: xvfmsub_d:
+; LA32-CONTRACT-OFF:       # %bb.0: # %entry
+; LA32-CONTRACT-OFF-NEXT:    xvld $xr0, $a1, 0
+; LA32-CONTRACT-OFF-NEXT:    xvld $xr1, $a2, 0
+; LA32-CONTRACT-OFF-NEXT:    xvld $xr2, $a3, 0
+; LA32-CONTRACT-OFF-NEXT:    xvfmul.d $xr0, $xr0, $xr1
+; LA32-CONTRACT-OFF-NEXT:    xvfsub.d $xr0, $xr0, $xr2
+; LA32-CONTRACT-OFF-NEXT:    xvst $xr0, $a0, 0
+; LA32-CONTRACT-OFF-NEXT:    ret
+;
+; LA64-CONTRACT-FAST-LABEL: xvfmsub_d:
+; LA64-CONTRACT-FAST:       # %bb.0: # %entry
+; LA64-CONTRACT-FAST-NEXT:    xvld $xr0, $a1, 0
+; LA64-CONTRACT-FAST-NEXT:    xvld $xr1, $a2, 0
+; LA64-CONTRACT-FAST-NEXT:    xvld $xr2, $a3, 0
+; LA64-CONTRACT-FAST-NEXT:    xvfmsub.d $xr0, $xr0, $xr1, $xr2
+; LA64-CONTRACT-FAST-NEXT:    xvst $xr0, $a0, 0
+; LA64-CONTRACT-FAST-NEXT:    ret
+;
+; LA64-CONTRACT-ON-LABEL: xvfmsub_d:
+; LA64-CONTRACT-ON:       # %bb.0: # %entry
+; LA64-CONTRACT-ON-NEXT:    xvld $xr0, $a1, 0
+; LA64-CONTRACT-ON-NEXT:    xvld $xr1, $a2, 0
+; LA64-CONTRACT-ON-NEXT:    xvld $xr2, $a3, 0
+; LA64-CONTRACT-ON-NEXT:    xvfmul.d $xr0, $xr0, $xr1
+; LA64-CONTRACT-ON-NEXT:    xvfsub.d $xr0, $xr0, $xr2
+; LA64-CONTRACT-ON-NEXT:    xvst $xr0, $a0, 0
+; LA64-CONTRACT-ON-NEXT:    ret
+;
+; LA64-CONTRACT-OFF-LABEL: xvfmsub_d:
+; LA64-CONTRACT-OFF:       # %bb.0: # %entry
+; LA64-CONTRACT-OFF-NEXT:    xvld $xr0, $a1, 0
+; LA64-CONTRACT-OFF-NEXT:    xvld $xr1, $a2, 0
+; LA64-CONTRACT-OFF-NEXT:    xvld $xr2, $a3, 0
+; LA64-CONTRACT-OFF-NEXT:    xvfmul.d $xr0, $xr0, $xr1
+; LA64-CONTRACT-OFF-NEXT:    xvfsub.d $xr0, $xr0, $xr2
+; LA64-CONTRACT-OFF-NEXT:    xvst $xr0, $a0, 0
+; LA64-CONTRACT-OFF-NEXT:    ret
 entry:
   %v0 = load <4 x double>, ptr %a0
   %v1 = load <4 x double>, ptr %a1
@@ -65,27 +149,67 @@ entry:
 }
 
 define void @xvfnmadd_d(ptr %res, ptr %a0, ptr %a1, ptr %a2) nounwind {
-; LA32-CONTRACT-LABEL: xvfnmadd_d:
-; LA32-CONTRACT:       # %bb.0: # %entry
-; LA32-CONTRACT-NEXT:    xvld $xr0, $a1, 0
-; LA32-CONTRACT-NEXT:    xvld $xr1, $a2, 0
-; LA32-CONTRACT-NEXT:    xvld $xr2, $a3, 0
-; LA32-CONTRACT-NEXT:    xvfmul.d $xr0, $xr0, $xr1
-; LA32-CONTRACT-NEXT:    xvfadd.d $xr0, $xr0, $xr2
-; LA32-CONTRACT-NEXT:    xvbitrevi.d $xr0, $xr0, 63
-; LA32-CONTRACT-NEXT:    xvst $xr0, $a0, 0
-; LA32-CONTRACT-NEXT:    ret
-;
-; LA64-CONTRACT-LABEL: xvfnmadd_d:
-; LA64-CONTRACT:       # %bb.0: # %entry
-; LA64-CONTRACT-NEXT:    xvld $xr0, $a1, 0
-; LA64-CONTRACT-NEXT:    xvld $xr1, $a2, 0
-; LA64-CONTRACT-NEXT:    xvld $xr2, $a3, 0
-; LA64-CONTRACT-NEXT:    xvfmul.d $xr0, $xr0, $xr1
-; LA64-CONTRACT-NEXT:    xvfadd.d $xr0, $xr0, $xr2
-; LA64-CONTRACT-NEXT:    xvbitrevi.d $xr0, $xr0, 63
-; LA64-CONTRACT-NEXT:    xvst $xr0, $a0, 0
-; LA64-CONTRACT-NEXT:    ret
+; LA32-CONTRACT-FAST-LABEL: xvfnmadd_d:
+; LA32-CONTRACT-FAST:       # %bb.0: # %entry
+; LA32-CONTRACT-FAST-NEXT:    xvld $xr0, $a1, 0
+; LA32-CONTRACT-FAST-NEXT:    xvld $xr1, $a2, 0
+; LA32-CONTRACT-FAST-NEXT:    xvld $xr2, $a3, 0
+; LA32-CONTRACT-FAST-NEXT:    xvfnmadd.d $xr0, $xr0, $xr1, $xr2
+; LA32-CONTRACT-FAST-NEXT:    xvst $xr0, $a0, 0
+; LA32-CONTRACT-FAST-NEXT:    ret
+;
+; LA32-CONTRACT-ON-LABEL: xvfnmadd_d:
+; LA32-CONTRACT-ON:       # %bb.0: # %entry
+; LA32-CONTRACT-ON-NEXT:    xvld $xr0, $a1, 0
+; LA32-CONTRACT-ON-NEXT:    xvld $xr1, $a2, 0
+; LA32-CONTRACT-ON-NEXT:    xvld $xr2, $a3, 0
+; LA32-CONTRACT-ON-NEXT:    xvfmul.d $xr0, $xr0, $xr1
+; LA32-CONTRACT-ON-NEXT:    xvfadd.d $xr0, $xr0, $xr2
+; LA32-CONTRACT-ON-NEXT:    xvbitrevi.d $xr0, $xr0, 63
+; LA32-CONTRACT-ON-NEXT:    xvst $xr0, $a0, 0
+; LA32-CONTRACT-ON-NEXT:    ret
+;
+; LA32-CONTRACT-OFF-LABEL: xvfnmadd_d:
+; LA32-CONTRACT-OFF:       # %bb.0: # %entry
+; LA32-CONTRACT-OFF-NEXT:    xvld $xr0, $a1, 0
+; LA32-CONTRACT-OFF-NEXT:    xvld $xr1, $a2, 0
+; LA32-CONTRACT-OFF-NEXT:    xvld $xr2, $a3, 0
+; LA32-CONTRACT-OFF-NEXT:    xvfmul.d $xr0, $xr0, $xr1
+; LA32-CONTRACT-OFF-NEXT:    xvfadd.d $xr0, $xr0, $xr2
+; LA32-CONTRACT-OFF-NEXT:    xvbitrevi.d $xr0, $xr0, 63
+; LA32-CONTRACT-OFF-NEXT:    xvst $xr0, $a0, 0
+; LA32-CONTRACT-OFF-NEXT:    ret
+;
+; LA64-CONTRACT-FAST-LABEL: xvfnmadd_d:
+; LA64-CONTRACT-FAST:       # %bb.0: # %entry
+; LA64-CONTRACT-FAST-NEXT:    xvld $xr0, $a1, 0
+; LA64-CONTRACT-FAST-NEXT:    xvld $xr1, $a2, 0
+; LA64-CONTRACT-FAST-NEXT:    xvld $xr2, $a3, 0
+; LA64-CONTRACT-FAST-NEXT:    xvfnmadd.d $xr0, $xr0, $xr1, $xr2
+; LA64-CONTRACT-FAST-NEXT:    xvst $xr0, $a0, 0
+; LA64-CONTRACT-FAST-NEXT:    ret
+;
+; LA64-CONTRACT-ON-LABEL: xvfnmadd_d:
+; LA64-CONTRACT-ON:       # %bb.0: # %entry
+; LA64-CONTRACT-ON-NEXT:    xvld $xr0, $a1, 0
+; LA64-CONTRACT-ON-NEXT:    xvld $xr1, $a2, 0
+; LA64-CONTRACT-ON-NEXT:    xvld $xr2, $a3, 0
+; LA64-CONTRACT-ON-NEXT:    xvfmul.d $xr0, $xr0, $xr1
+; LA64-CONTRACT-ON-NEXT:    xvfadd.d $xr0, $xr0, $xr2
+; LA64-CONTRACT-ON-NEXT:    xvbitrevi.d $xr0, $xr0, 63
+; LA64-CONTRACT-ON-NEXT:    xvst $xr0, $a0, 0
+; LA64-CONTRACT-ON-NEXT:    ret
+;
+; LA64-CONTRACT-OFF-LABEL: xvfnmadd_d:
+; LA64-CONTRACT-OFF:       # %bb.0: # %entry
+; LA64-CONTRACT-OFF-NEXT:    xvld $xr0, $a1, 0
+; LA64-CONTRACT-OFF-NEXT:    xvld $xr1, $a2, 0
+; LA64-CONTRACT-OFF-NEXT:    xvld $xr2, $a3, 0
+; LA64-CONTRACT-OFF-NEXT:    xvfmul.d $xr0, $xr0, $xr1
+; LA64-CONTRACT-OFF-NEXT:    xvfadd.d $xr0, $xr0, $xr2
+; LA64-CONTRACT-OFF-NEXT:    xvbitrevi.d $xr0, $xr0, 63
+; LA64-CONTRACT-OFF-NEXT:    xvst $xr0, $a0, 0
+; LA64-CONTRACT-OFF-NEXT:    ret
 entry:
   %v0 = load <4 x double>, ptr %a0
   %v1 = load <4 x double>, ptr %a1
@@ -98,27 +222,67 @@ entry:
 }
 
 define void @xvfnmadd_d_nsz(ptr %res, ptr %a0, ptr %a1, ptr %a2) nounwind {
-; LA32-CONTRACT-LABEL: xvfnmadd_d_nsz:
-; LA32-CONTRACT:       # %bb.0: # %entry
-; LA32-CONTRACT-NEXT:    xvld $xr0, $a1, 0
-; LA32-CONTRACT-NEXT:    xvld $xr1, $a2, 0
-; LA32-CONTRACT-NEXT:    xvld $xr2, $a3, 0
-; LA32-CONTRACT-NEXT:    xvbitrevi.d $xr0, $xr0, 63
-; LA32-CONTRACT-NEXT:    xvfmul.d $xr0, $xr0, $xr1
-; LA32-CONTRACT-NEXT:    xvfsub.d $xr0, $xr0, $xr2
-; LA32-CONTRACT-NEXT:    xvst $xr0, $a0, 0
-; LA32-CONTRACT-NEXT:    ret
-;
-; LA64-CONTRACT-LABEL: xvfnmadd_d_nsz:
-; LA64-CONTRACT:       # %bb.0: # %entry
-; LA64-CONTRACT-NEXT:    xvld $xr0, $a1, 0
-; LA64-CONTRACT-NEXT:    xvld $xr1, $a2, 0
-; LA64-CONTRACT-NEXT:    xvld $xr2, $a3, 0
-; LA64-CONTRACT-NEXT:    xvbitrevi.d $xr0, $xr0, 63
-; LA64-CONTRACT-NEXT:    xvfmul.d $xr0, $xr0, $xr1
-; LA64-CONTRACT-NEXT:    xvfsub.d $xr0, $xr0, $xr2
-; LA64-CONTRACT-NEXT:    xvst $xr0, $a0, 0
-; LA64-CONTRACT-NEXT:    ret
+; LA32-CONTRACT-FAST-LABEL: xvfnmadd_d_nsz:
+; LA32-CONTRACT-FAST:       # %bb.0: # %entry
+; LA32-CONTRACT-FAST-NEXT:    xvld $xr0, $a1, 0
+; LA32-CONTRACT-FAST-NEXT:    xvld $xr1, $a2, 0
+; LA32-CONTRACT-FAST-NEXT:    xvld $xr2, $a3, 0
+; LA32-CONTRACT-FAST-NEXT:    xvfnmadd.d $xr0, $xr0, $xr1, $xr2
+; LA32-CONTRACT-FAST-NEXT:    xvst $xr0, $a0, 0
+; LA32-CONTRACT-FAST-NEXT:    ret
+;
+; LA32-CONTRACT-ON-LABEL: xvfnmadd_d_nsz:
+; LA32-CONTRACT-ON:       # %bb.0: # %entry
+; LA32-CONTRACT-ON-NEXT:    xvld $xr0, $a1, 0
+; LA32-CONTRACT-ON-NEXT:    xvld $xr1, $a2, 0
+; LA32-CONTRACT-ON-NEXT:    xvld $xr2, $a3, 0
+; LA32-CONTRACT-ON-NEXT:    xvbitrevi.d $xr0, $xr0, 63
+; LA32-CONTRACT-ON-NEXT:    xvfmul.d $xr0, $xr0, $xr1
+; LA32-CONTRACT-ON-NEXT:    xvfsub.d $xr0, $xr0, $xr2
+; LA32-CONTRACT-ON-NEXT:    xvst $xr0, $a0, 0
+; LA32-CONTRACT-ON-NEXT:    ret
+;
+; LA32-CONTRACT-OFF-LABEL: xvfnmadd_d_nsz:
+; LA32-CONTRACT-OFF:       # %bb.0: # %entry
+; LA32-CONTRACT-OFF-NEXT:    xvld $xr0, $a1, 0
+; LA32-CONTRACT-OFF-NEXT:    xvld $xr1, $a2, 0
+; LA32-CONTRACT-OFF-NEXT:    xvld $xr2, $a3, 0
+; LA32-CONTRACT-OFF-NEXT:    xvbitrevi.d $xr0, $xr0, 63
+; LA32-CONTRACT-OFF-NEXT:    xvfmul.d $xr0, $xr0, $xr1
+; LA32-CONTRACT-OFF-NEXT:    xvfsub.d $xr0, $xr0, $xr2
+; LA32-CONTRACT-OFF-NEXT:    xvst $xr0, $a0, 0
+; LA32-CONTRACT-OFF-NEXT:    ret
+;
+; LA64-CONTRACT-FAST-LABEL: xvfnmadd_d_nsz:
+; LA64-CONTRACT-FAST:       # %bb.0: # %entry
+; LA64-CONTRACT-FAST-NEXT:    xvld $xr0, $a1, 0
+; LA64-CONTRACT-FAST-NEXT:    xvld $xr1, $a2, 0
+; LA64-CONTRACT-FAST-NEXT:    xvld $xr2, $a3, 0
+; LA64-CONTRACT-FAST-NEXT:    xvfnmadd.d $xr0, $xr0, $xr1, $xr2
+; LA64-CONTRACT-FAST-NEXT:    xvst $xr0, $a0, 0
+; LA64-CONTRACT-FAST-NEXT:    ret
+;
+; LA64-CONTRACT-ON-LABEL: xvfnmadd_d_nsz:
+; LA64-CONTRACT-ON:       # %bb.0: # %entry
+; LA64-CONTRACT-ON-NEXT:    xvld $xr0, $a1, 0
+; LA64-CONTRACT-ON-NEXT:    xvld $xr1, $a2, 0
+; LA64-CONTRACT-ON-NEXT:    xvld $xr2, $a3, 0
+; LA64-CONTRACT-ON-NEXT:    xvbitrevi.d $xr0, $xr0, 63
+; LA64-CONTRACT-ON-NEXT:    xvfmul.d $xr0, $xr0, $xr1
+; LA64-CONTRACT-ON-NEXT:    xvfsub.d $xr0, $xr0, $xr2
+; LA64-CONTRACT-ON-NEXT:    xvst $xr0, $a0, 0
+; LA64-CONTRACT-ON-NEXT:    ret
+;
+; LA64-CONTRACT-OFF-LABEL: xvfnmadd_d_nsz:
+; LA64-CONTRACT-OFF:       # %bb.0: # %entry
+; LA64-CONTRACT-OFF-NEXT:    xvld $xr0, $a1, 0
+; LA64-CONTRACT-OFF-NEXT:    xvld $xr1, $a2, 0
+; LA64-CONTRACT-OFF-NEXT:    xvld $xr2, $a3, 0
+; LA64-CONTRACT-OFF-NEXT:    xvbitrevi.d $xr0, $xr0, 63
+; LA64-CONTRACT-OFF-NEXT:    xvfmul.d $xr0, $xr0, $xr1
+; LA64-CONTRACT-OFF-NEXT:    xvfsub.d $xr0, $xr0, $xr2
+; LA64-CONTRACT-OFF-NEXT:    xvst $xr0, $a0, 0
+; LA64-CONTRACT-OFF-NEXT:    ret
 entry:
   %v0 = load <4 x double>, ptr %a0
   %v1 = load <4 x double>, ptr %a1
@@ -133,27 +297,69 @@ entry:
 
 ;; Check that xvfnmadd.d is not emitted.
 define void @not_xvfnmadd_d(ptr %res, ptr %a0, ptr %a1, ptr %a2) nounwind {
-; LA32-CONTRACT-LABEL: not_xvfnmadd_d:
-; LA32-CONTRACT:       # %bb.0: # %entry
-; LA32-CONTRACT-NEXT:    xvld $xr0, $a1, 0
-; LA32-CONTRACT-NEXT:    xvld $xr1, $a2, 0
-; LA32-CONTRACT-NEXT:    xvld $xr2, $a3, 0
-; LA32-CONTRACT-NEXT:    xvbitrevi.d $xr0, $xr0, 63
-; LA32-CONTRACT-NEXT:    xvfmul.d $xr0, $xr0, $xr1
-; LA32-CONTRACT-NEXT:    xvfsub.d $xr0, $xr0, $xr2
-; LA32-CONTRACT-NEXT:    xvst $xr0, $a0, 0
-; LA32-CONTRACT-NEXT:    ret
-;
-; LA64-CONTRACT-LABEL: not_xvfnmadd_d:
-; LA64-CONTRACT:       # %bb.0: # %entry
-; LA64-CONTRACT-NEXT:    xvld $xr0, $a1, 0
-; LA64-CONTRACT-NEXT:    xvld $xr1, $a2, 0
-; LA64-CONTRACT-NEXT:    xvld $xr2, $a3, 0
-; LA64-CONTRACT-NEXT:    xvbitrevi.d $xr0, $xr0, 63
-; LA64-CONTRACT-NEXT:    xvfmul.d $xr0, $xr0, $xr1
-; LA64-CONTRACT-NEXT:    xvfsub.d $xr0, $xr0, $xr2
-; LA64-CONTRACT-NEXT:    xvst $xr0, $a0, 0
-; LA64-CONTRACT-NEXT:    ret
+; LA32-CONTRACT-FAST-LABEL: not_xvfnmadd_d:
+; LA32-CONTRACT-FAST:       # %bb.0: # %entry
+; LA32-CONTRACT-FAST-NEXT:    xvld $xr0, $a1, 0
+; LA32-CONTRACT-FAST-NEXT:    xvld $xr1, $a2, 0
+; LA32-CONTRACT-FAST-NEXT:    xvld $xr2, $a3, 0
+; LA32-CONTRACT-FAST-NEXT:    xvbitrevi.d $xr0, $xr0, 63
+; LA32-CONTRACT-FAST-NEXT:    xvfmsub.d $xr0, $xr0, $xr1, $xr2
+; LA32-CONTRACT-FAST-NEXT:    xvst $xr0, $a0, 0
+; LA32-CONTRACT-FAST-NEXT:    ret
+;
+; LA32-CONTRACT-ON-LABEL: not_xvfnmadd_d:
+; LA32-CONTRACT-ON:       # %bb.0: # %entry
+; LA32-CONTRACT-ON-NEXT:    xvld $xr0, $a1, 0
+; LA32-CONTRACT-ON-NEXT:    xvld $xr1, $a2, 0
+; LA32-CONTRACT-ON-NEXT:    xvld $xr2, $a3, 0
+; LA32-CONTRACT-ON-NEXT:    xvbitrevi.d $xr0, $xr0, 63
+; LA32-CONTRACT-ON-NEXT:    xvfmul.d $xr0, $xr0, $xr1
+; LA32-CONTRACT-ON-NEXT:    xvfsub.d $xr0, $xr0, $xr2
+; LA32-CONTRACT-ON-NEXT:    xvst $xr0, $a0, 0
+; LA32-CONTRACT-ON-NEXT:    ret
+;
+; LA32-CONTRACT-OFF-LABEL: not_xvfnmadd_d:
+; LA32-CONTRACT-OFF:       # %bb.0: # %entry
+; LA32-CONTRACT-OFF-NEXT:    xvld $xr0, $a1, 0
+; LA32-CONTRACT-OFF-NEXT:    xvld $xr1, $a2, 0
+; LA32-CONTRACT-OFF-NEXT:    xvld $xr2, $a3, 0
+; LA32-CONTRACT-OFF-NEXT:    xvbitrevi.d $xr0, $xr0, 63
+; LA32-CONTRACT-OFF-NEXT:    xvfmul.d $xr0, $xr0, $xr1
+; LA32-CONTRACT-OFF-NEXT:    xvfsub.d $xr0, $xr0, $xr2
+; LA32-CONTRACT-OFF-NEXT:    xvst $xr0, $a0, 0
+; LA32-CONTRACT-OFF-NEXT:    ret
+;
+; LA64-CONTRACT-FAST-LABEL: not_xvfnmadd_d:
+; LA64-CONTRACT-FAST:       # %bb.0: # %entry
+; LA64-CONTRACT-FAST-NEXT:    xvld $xr0, $a1, 0
+; LA64-CONTRACT-FAST-NEXT:    xvld $xr1, $a2, 0
+; LA64-CONTRACT-FAST-NEXT:    xvld $xr2, $a3, 0
+; LA64-CONTRACT-FAST-NEXT:    xvbitrevi.d $xr0, $xr0, 63
+; LA64-CONTRACT-FAST-NEXT:    xvfmsub.d $xr0, $xr0, $xr1, $xr2
+; LA64-CONTRACT-FAST-NEXT:    xvst $xr0, $a0, 0
+; LA64-CONTRACT-FAST-NEXT:    ret
+;
+; LA64-CONTRACT-ON-LABEL: not_xvfnmadd_d:
+; LA64-CONTRACT-ON:       # %bb.0: # %entry
+; LA64-CONTRACT-ON-NEXT:    xvld $xr0, $a1, 0
+; LA64-CONTRACT-ON-NEXT:    xvld $xr1, $a2, 0
+; LA64-CONTRACT-ON-NEXT:    xvld $xr2, $a3, 0
+; LA64-CONTRACT-ON-NEXT:    xvbitrevi.d $xr0, $xr0, 63
+; LA64-CONTRACT-ON-NEXT:    xvfmul.d $xr0, $xr0, $xr1
+; LA64-CONTRACT-ON-NEXT:    xvfsub.d $xr0, $xr0, $xr2
+; LA64-CONTRACT-ON-NEXT:    xvst $xr0, $a0, 0
+; LA64-CONTRACT-ON-NEXT:    ret
+;
+; LA64-CONTRACT-OFF-LABEL: not_xvfnmadd_d:
+; LA64-CONTRACT-OFF:       # %bb.0: # %entry
+; LA64-CONTRACT-OFF-NEXT:    xvld $xr0, $a1, 0
+; LA64-CONTRACT-OFF-NEXT:    xvld $xr1, $a2, 0
+; LA64-CONTRACT-OFF-NEXT:    xvld $xr2, $a3, 0
+; LA64-CONTRACT-OFF-NEXT:    xvbitrevi.d $xr0, $xr0, 63
+; LA64-CONTRACT-OFF-NEXT:    xvfmul.d $xr0, $xr0, $xr1
+; LA64-CONTRACT-OFF-NEXT:    xvfsub.d $xr0, $xr0, $xr2
+; LA64-CONTRACT-OFF-NEXT:    xvst $xr0, $a0, 0
+; LA64-CONTRACT-OFF-NEXT:    ret
 entry:
   %v0 = load <4 x double>, ptr %a0
   %v1 = load <4 x double>, ptr %a1
@@ -167,27 +373,67 @@ entry:
 }
 
 define void @xvfnmsub_d(ptr %res, ptr %a0, ptr %a1, ptr %a2) nounwind {
-; LA32-CONTRACT-LABEL: xvfnmsub_d:
-; LA32-CONTRACT:       # %bb.0: # %entry
-; LA32-CONTRACT-NEXT:    xvld $xr0, $a1, 0
-; LA32-CONTRACT-NEXT:    xvld $xr1, $a2, 0
-; LA32-CONTRACT-NEXT:    xvld $xr2, $a3, 0
-; LA32-CONTRACT-NEXT:    xvfmul.d $xr0, $xr0, $xr1
-; LA32-CONTRACT-NEXT:    xvfsub.d $xr0, $xr0, $xr2
-; LA32-CONTRACT-NEXT:    xvbitrevi.d $xr0, $xr0, 63
-; LA32-CONTRACT-NEXT:    xvst $xr0, $a0, 0
-; LA32-CONTRACT-NEXT:    ret
-;
-; LA64-CONTRACT-LABEL: xvfnmsub_d:
-; LA64-CONTRACT:       # %bb.0: # %entry
-; LA64-CONTRACT-NEXT:    xvld $xr0, $a1, 0
-; LA64-CONTRACT-NEXT:    xvld $xr1, $a2, 0
-; LA64-CONTRACT-NEXT:    xvld $xr2, $a3, 0
-; LA64-CONTRACT-NEXT:    xvfmul.d $xr0, $xr0, $xr1
-; LA64-CONTRACT-NEXT:    xvfsub.d $xr0, $xr0, $xr2
-; LA64-CONTRACT-NEXT:    xvbitrevi.d $xr0, $xr0, 63
-; LA64-CONTRACT-NEXT:    xvst $xr0, $a0, 0
-; LA64-CONTRACT-NEXT:    ret
+; LA32-CONTRACT-FAST-LABEL: xvfnmsub_d:
+; LA32-CONTRACT-FAST:       # %bb.0: # %entry
+; LA32-CONTRACT-FAST-NEXT:    xvld $xr0, $a1, 0
+; LA32-CONTRACT-FAST-NEXT:    xvld $xr1, $a2, 0
+; LA32-CONTRACT-FAST-NEXT:    xvld $xr2, $a3, 0
+; LA32-CONTRACT-FAST-NEXT:    xvfnmsub.d $xr0, $xr0, $xr1, $xr2
+; LA32-CONTRACT-FAST-NEXT:    xvst $xr0, $a0, 0
+; LA32-CONTRACT-FAST-NEXT:    ret
+;
+; LA32-CONTRACT-ON-LABEL: xvfnmsub_d:
+; LA32-CONTRACT-ON:       # %bb.0: # %entry
+; LA32-CONTRACT-ON-NEXT:    xvld $xr0, $a1, 0
+; LA32-CONTRACT-ON-NEXT:    xvld $xr1, $a2, 0
+; LA32-CONTRACT-ON-NEXT:    xvld $xr2, $a3, 0
+; LA32-CONTRACT-ON-NEXT:    xvfmul.d $xr0, $xr0, $xr1
+; LA32-CONTRACT-ON-NEXT:    xvfsub.d $xr0, $xr0, $xr2
+; LA32-CONTRACT-ON-NEXT:    xvbitrevi.d $xr0, $xr0, 63
+; LA32-CONTRACT-ON-NEXT:    xvst $xr0, $a0, 0
+; LA32-CONTRACT-ON-NEXT:    ret
+;
+; LA32-CONTRACT-OFF-LABEL: xvfnmsub_d:
+; LA32-CONTRACT-OFF:       # %bb.0: # %entry
+; LA32-CONTRACT-OFF-NEXT:    xvld $xr0, $a1, 0
+; LA32-CONTRACT-OFF-NEXT:    xvld $xr1, $a2, 0
+; LA32-CONTRACT-OFF-NEXT:    xvld $xr2, $a3, 0
+; LA32-CONTRACT-OFF-NEXT:    xvfmul.d $xr0, $xr0, $xr1
+; LA32-CONTRACT-OFF-NEXT:    xvfsub.d $xr0, $xr0, $xr2
+; LA32-CONTRACT-OFF-NEXT:    xvbitrevi.d $xr0, $xr0, 63
+; LA32-CONTRACT-OFF-NEXT:    xvst $xr0, $a0, 0
+; LA32-CONTRACT-OFF-NEXT:    ret
+;
+; LA64-CONTRACT-FAST-LABEL: xvfnmsub_d:
+; LA64-CONTRACT-FAST:       # %bb.0: # %entry
+; LA64-CONTRACT-FAST-NEXT:    xvld $xr0, $a1, 0
+; LA64-CONTRACT-FAST-NEXT:    xvld $xr1, $a2, 0
+; LA64-CONTRACT-FAST-NEXT:    xvld $xr2, $a3, 0
+; LA64-CONTRACT-FAST-NEXT:    xvfnmsub.d $xr0, $xr0, $xr1, $xr2
+; LA64-CONTRACT-FAST-NEXT:    xvst $xr0, $a0, 0
+; LA64-CONTRACT-FAST-NEXT:    ret
+;
+; LA64-CONTRACT-ON-LABEL: xvfnmsub_d:
+; LA64-CONTRACT-ON:       # %bb.0: # %entry
+; LA64-CONTRACT-ON-NEXT:    xvld $xr0, $a1, 0
+; LA64-CONTRACT-ON-NEXT:    xvld $xr1, $a2, 0
+; LA64-CONTRACT-ON-NEXT:    xvld $xr2, $a3, 0
+; LA64-CONTRACT-ON-NEXT:    xvfmul.d $xr0, $xr0, $xr1
+; LA64-CONTRACT-ON-NEXT:    xvfsub.d $xr0, $xr0, $xr2
+; LA64-CONTRACT-ON-NEXT:    xvbitrevi.d $xr0, $xr0, 63
+; LA64-CONTRACT-ON-NEXT:    xvst $xr0, $a0, 0
+; LA64-CONTRACT-ON-NEXT:    ret
+;
+; LA64-CONTRACT-OFF-LABEL: xvfnmsub_d:
+; LA64-CONTRACT-OFF:       # %bb.0: # %entry
+; LA64-CONTRACT-OFF-NEXT:    xvld $xr0, $a1, 0
+; LA64-CONTRACT-OFF-NEXT:    xvld $xr1, $a2, 0
+; LA64-CONTRACT-OFF-NEXT:    xvld $xr2, $a3, 0
+; LA64-CONTRACT-OFF-NEXT:    xvfmul.d $xr0, $xr0, $xr1
+; LA64-CONTRACT-OFF-NEXT:    xvfsub.d $xr0, $xr0, $xr2
+; LA64-CONTRACT-OFF-NEXT:    xvbitrevi.d $xr0, $xr0, 63
+; LA64-CONTRACT-OFF-NEXT:    xvst $xr0, $a0, 0
+; LA64-CONTRACT-OFF-NEXT:    ret
 entry:
   %v0 = load <4 x double>, ptr %a0
   %v1 = load <4 x double>, ptr %a1
@@ -201,25 +447,63 @@ entry:
 }
 
 define void @xvfnmsub_d_nsz(ptr %res, ptr %a0, ptr %a1, ptr %a2) nounwind {
-; LA32-CONTRACT-LABEL: xvfnmsub_d_nsz:
-; LA32-CONTRACT:       # %bb.0: # %entry
-; LA32-CONTRACT-NEXT:    xvld $xr0, $a1, 0
-; LA32-CONTRACT-NEXT:    xvld $xr1, $a2, 0
-; LA32-CONTRACT-NEXT:    xvld $xr2, $a3, 0
-; LA32-CONTRACT-NEXT:    xvfmul.d $xr0, $xr0, $xr1
-; LA32-CONTRACT-NEXT:    xvfsub.d $xr0, $xr2, $xr0
-; LA32-CONTRACT-NEXT:    xvst $xr0, $a0, 0
-; LA32-CONTRACT-NEXT:    ret
-;
-; LA64-CONTRACT-LABEL: xvfnmsub_d_nsz:
-; LA64-CONTRACT:       # %bb.0: # %entry
-; LA64-CONTRACT-NEXT:    xvld $xr0, $a1, 0
-; LA64-CONTRACT-NEXT:    xvld $xr1, $a2, 0
-; LA64-CONTRACT-NEXT:    xvld $xr2, $a3, 0
-; LA64-CONTRACT-NEXT:    xvfmul.d $xr0, $xr0, $xr1
-; LA64-CONTRACT-NEXT:    xvfsub.d $xr0, $xr2, $xr0
-; LA64-CONTRACT-NEXT:    xvst $xr0, $a0, 0
-; LA64-CONTRACT-NEXT:    ret
+; LA32-CONTRACT-FAST-LABEL: xvfnmsub_d_nsz:
+; LA32-CONTRACT-FAST:       # %bb.0: # %entry
+; LA32-CONTRACT-FAST-NEXT:    xvld $xr0, $a1, 0
+; LA32-CONTRACT-FAST-NEXT:    xvld $xr1, $a2, 0
+; LA32-CONTRACT-FAST-NEXT:    xvld $xr2, $a3, 0
+; LA32-CONTRACT-FAST-NEXT:    xvfnmsub.d $xr0, $xr0, $xr1, $xr2
+; LA32-CONTRACT-FAST-NEXT:    xvst $xr0, $a0, 0
+; LA32-CONTRACT-FAST-NEXT:    ret
+;
+; LA32-CONTRACT-ON-LABEL: xvfnmsub_d_nsz:
+; LA32-CONTRACT-ON:       # %bb.0: # %entry
+; LA32-CONTRACT-ON-NEXT:    xvld $xr0, $a1, 0
+; LA32-CONTRACT-ON-NEXT:    xvld $xr1, $a2, 0
+; LA32-CONTRACT-ON-NEXT:    xvld $xr2, $a3, 0
+; LA32-CONTRACT-ON-NEXT:    xvfmul.d $xr0, $xr0, $xr1
+; LA32-CONTRACT-ON-NEXT:    xvfsub.d $xr0, $xr2, $xr0
+; LA32-CONTRACT-ON-NEXT:    xvst $xr0, $a0, 0
+; LA32-CONTRACT-ON-NEXT:    ret
+;
+; LA32-CONTRACT-OFF-LABEL: xvfnmsub_d_nsz:
+; LA32-CONTRACT-OFF:       # %bb.0: # %entry
+; LA32-CONTRACT-OFF-NEXT:    xvld $xr0, $a1, 0
+; LA32-CONTRACT-OFF-NEXT:    xvld $xr1, $a2, 0
+; LA32-CONTRACT-OFF-NEXT:    xvld $xr2, $a3, 0
+; LA32-CONTRACT-OFF-NEXT:    xvfmul.d $xr0, $xr0, $xr1
+; LA32-CONTRACT-OFF-NEXT:    xvfsub.d $xr0, $xr2, $xr0
+; LA32-CONTRACT-OFF-NEXT:    xvst $xr0, $a0, 0
+; LA32-CONTRACT-OFF-NEXT:    ret
+;
+; LA64-CONTRACT-FAST-LABEL: xvfnmsub_d_nsz:
+; LA64-CONTRACT-FAST:       # %bb.0: # %entry
+; LA64-CONTRACT-FAST-NEXT:    xvld $xr0, $a1, 0
+; LA64-CONTRACT-FAST-NEXT:    xvld $xr1, $a2, 0
+; LA64-CONTRACT-FAST-NEXT:    xvld $xr2, $a3, 0
+; LA64-CONTRACT-FAST-NEXT:    xvfnmsub.d $xr0, $xr0, $xr1, $xr2
+; LA64-CONTRACT-FAST-NEXT:    xvst $xr0, $a0, 0
+; LA64-CONTRACT-FAST-NEXT:    ret
+;
+; LA64-CONTRACT-ON-LABEL: xvfnmsub_d_nsz:
+; LA64-CONTRACT-ON:       # %bb.0: # %entry
+; LA64-CONTRACT-ON-NEXT:    xvld $xr0, $a1, 0
+; LA64-CONTRACT-ON-NEXT:    xvld $xr1, $a2, 0
+; LA64-CONTRACT-ON-NEXT:    xvld $xr2, $a3, 0
+; LA64-CONTRACT-ON-NEXT:    xvfmul.d $xr0, $xr0, $xr1
+; LA64-CONTRACT-ON-NEXT:    xvfsub.d $xr0, $xr2, $xr0
+; LA64-CONTRACT-ON-NEXT:    xvst $xr0, $a0, 0
+; LA64-CONTRACT-ON-NEXT:    ret
+;
+; LA64-CONTRACT-OFF-LABEL: xvfnmsub_d_nsz:
+; LA64-CONTRACT-OFF:       # %bb.0: # %entry
+; LA64-CONTRACT-OFF-NEXT:    xvld $xr0, $a1, 0
+; LA64-CONTRACT-OFF-NEXT:    xvld $xr1, $a2, 0
+; LA64-CONTRACT-OFF-NEXT:    xvld $xr2, $a3, 0
+; LA64-CONTRACT-OFF-NEXT:    xvfmul.d $xr0, $xr0, $xr1
+; LA64-CONTRACT-OFF-NEXT:    xvfsub.d $xr0, $xr2, $xr0
+; LA64-CONTRACT-OFF-NEXT:    xvst $xr0, $a0, 0
+; LA64-CONTRACT-OFF-NEXT:    ret
 entry:
   %v0 = load <4 x double>, ptr %a0
   %v1 = load <4 x double>, ptr %a1
@@ -233,25 +517,65 @@ entry:
 
 ;; Check that xvfnmsub.d is not emitted.
 define void @not_xvfnmsub_d(ptr %res, ptr %a0, ptr %a1, ptr %a2) nounwind {
-; LA32-CONTRACT-LABEL: not_xvfnmsub_d:
-; LA32-CONTRACT:       # %bb.0: # %entry
-; LA32-CONTRACT-NEXT:    xvld $xr0, $a1, 0
-; LA32-CONTRACT-NEXT:    xvld $xr1, $a2, 0
-; LA32-CONTRACT-NEXT:    xvld $xr2, $a3, 0
-; LA32-CONTRACT-NEXT:    xvfmul.d $xr0, $xr0, $xr1
-; LA32-CONTRACT-NEXT:    xvfsub.d $xr0, $xr2, $xr0
-; LA32-CONTRACT-NEXT:    xvst $xr0, $a0, 0
-; LA32-CONTRACT-NEXT:    ret
-;
-; LA64-CONTRACT-LABEL: not_xvfnmsub_d:
-; LA64-CONTRACT:       # %bb.0: # %entry
-; LA64-CONTRACT-NEXT:    xvld $xr0, $a1, 0
-; LA64-CONTRACT-NEXT:    xvld $xr1, $a2, 0
-; LA64-CONTRACT-NEXT:    xvld $xr2, $a3, 0
-; LA64-CONTRACT-NEXT:    xvfmul.d $xr0, $xr0, $xr1
-; LA64-CONTRACT-NEXT:    xvfsub.d $xr0, $xr2, $xr0
-; LA64-CONTRACT-NEXT:    xvst $xr0, $a0, 0
-; LA64-CONTRACT-NEXT:    ret
+; LA32-CONTRACT-FAST-LABEL: not_xvfnmsub_d:
+; LA32-CONTRACT-FAST:       # %bb.0: # %entry
+; LA32-CONTRACT-FAST-NEXT:    xvld $xr0, $a1, 0
+; LA32-CONTRACT-FAST-NEXT:    xvld $xr1, $a2, 0
+; LA32-CONTRACT-FAST-NEXT:    xvld $xr2, $a3, 0
+; LA32-CONTRACT-FAST-NEXT:    xvbitrevi.d $xr0, $xr0, 63
+; LA32-CONTRACT-FAST-NEXT:    xvfmadd.d $xr0, $xr0, $xr1, $xr2
+; LA32-CONTRACT-FAST-NEXT:    xvst $xr0, $a0, 0
+; LA32-CONTRACT-FAST-NEXT:    ret
+;
+; LA32-CONTRACT-ON-LABEL: not_xvfnmsub_d:
+; LA32-CONTRACT-ON:       # %bb.0: # %entry
+; LA32-CONTRACT-ON-NEXT:    xvld $xr0, $a1, 0
+; LA32-CONTRACT-ON-NEXT:    xvld $xr1, $a2, 0
+; LA32-CONTRACT-ON-NEXT:    xvld $xr2, $a3, 0
+; LA32-CONTRACT-ON-NEXT:    xvfmul.d $xr0, $xr0, $xr1
+; LA32-CONTRACT-ON-NEXT:    xvfsub.d $xr0, $xr2, $xr0
+; LA32-CONTRACT-ON-NEXT:    xvst $xr0, $a0, 0
+; LA32-CONTRACT-ON-NEXT:    ret
+;
+; LA32-CONTRACT-OFF-LABEL: not_xvfnmsub_d:
+; LA32-CONTRACT-OFF:       # %bb.0: # %entry
+; LA32-CONTRACT-OFF-NEXT:    xvld $xr0, $a1, 0
+; LA32-CONTRACT-OFF-NEXT:    xvld $xr1, $a2, 0
+; LA32-CONTRACT-OFF-NEXT:    xvld $xr2, $a3, 0
+; LA32-CONTRACT-OFF-NEXT:    xvfmul.d $xr0, $xr0, $xr1
+; LA32-CONTRACT-OFF-NEXT:    xvfsub.d $xr0, $xr2, $xr0
+; LA32-CONTRACT-OFF-NEXT:    xvst $xr0, $a0, 0
+; LA32-CONTRACT-OFF-NEXT:    ret
+;
+; LA64-CONTRACT-FAST-LABEL: not_xvfnmsub_d:
+; LA64-CONTRACT-FAST:       # %bb.0: # %entry
+; LA64-CONTRACT-FAST-NEXT:    xvld $xr0, $a1, 0
+; LA64-CONTRACT-FAST-NEXT:    xvld $xr1, $a2, 0
+; LA64-CONTRACT-FAST-NEXT:    xvld $xr2, $a3, 0
+; LA64-CONTRACT-FAST-NEXT:    xvbitrevi.d $xr0, $xr0, 63
+; LA64-CONTRACT-FAST-NEXT:    xvfmadd.d $xr0, $xr0, $xr1, $xr2
+; LA64-CONTRACT-FAST-NEXT:    xvst $xr0, $a0, 0
+; LA64-CONTRACT-FAST-NEXT:    ret
+;
+; LA64-CONTRACT-ON-LABEL: not_xvfnmsub_d:
+; LA64-CONTRACT-ON:       # %bb.0: # %entry
+; LA64-CONTRACT-ON-NEXT:    xvld $xr0, $a1, 0
+; LA64-CONTRACT-ON-NEXT:    xvld $xr1, $a2, 0
+; LA64-CONTRACT-ON-NEXT:    xvld $xr2, $a3, 0
+; LA64-CONTRACT-ON-NEXT:    xvfmul.d $xr0, $xr0, $xr1
+; LA64-CONTRACT-ON-NEXT:    xvfsub.d $xr0, $xr2, $xr0
+; LA64-CONTRACT-ON-NEXT:    xvst $xr0, $a0, 0
+; LA64-CONTRACT-ON-NEXT:    ret
+;
+; LA64-CONTRACT-OFF-LABEL: not_xvfnmsub_d:
+; LA64-CONTRACT-OFF:       # %bb.0: # %entry
+; LA64-CONTRACT-OFF-NEXT:    xvld $xr0, $a1, 0
+; LA64-CONTRACT-OFF-NEXT:    xvld $xr1, $a2, 0
+; LA64-CONTRACT-OFF-NEXT:    xvld $xr2, $a3, 0
+; LA64-CONTRACT-OFF-NEXT:    xvfmul.d $xr0, $xr0, $xr1
+; LA64-CONTRACT-OFF-NEXT:    xvfsub.d $xr0, $xr2, $xr0
+; LA64-CONTRACT-OFF-NEXT:    xvst $xr0, $a0, 0
+; LA64-CONTRACT-OFF-NEXT:    ret
 entry:
   %v0 = load <4 x double>, ptr %a0
   %v1 = load <4 x double>, ptr %a1
@@ -264,23 +588,59 @@ entry:
 }
 
 define void @contract_xvfmadd_d(ptr %res, ptr %a0, ptr %a1, ptr %a2) nounwind {
-; LA32-CONTRACT-LABEL: contract_xvfmadd_d:
-; LA32-CONTRACT:       # %bb.0: # %entry
-; LA32-CONTRACT-NEXT:    xvld $xr0, $a1, 0
-; LA32-CONTRACT-NEXT:    xvld $xr1, $a2, 0
-; LA32-CONTRACT-NEXT:    xvld $xr2, $a3, 0
-; LA32-CONTRACT-NEXT:    xvfmadd.d $xr0, $xr0, $xr1, $xr2
-; LA32-CONTRACT-NEXT:    xvst $xr0, $a0, 0
-; LA32-CONTRACT-NEXT:    ret
-;
-; LA64-CONTRACT-LABEL: contract_xvfmadd_d:
-; LA64-CONTRACT:       # %bb.0: # %entry
-; LA64-CONTRACT-NEXT:    xvld $xr0, $a1, 0
-; LA64-CONTRACT-NEXT:    xvld $xr1, $a2, 0
-; LA64-CONTRACT-NEXT:    xvld $xr2, $a3, 0
-; LA64-CONTRACT-NEXT:    xvfmadd.d $xr0, $xr0, $xr1, $xr2
-; LA64-CONTRACT-NEXT:    xvst $xr0, $a0, 0
-; LA64-CONTRACT-NEXT:    ret
+; LA32-CONTRACT-FAST-LABEL: contract_xvfmadd_d:
+; LA32-CONTRACT-FAST:       # %bb.0: # %entry
+; LA32-CONTRACT-FAST-NEXT:    xvld $xr0, $a1, 0
+; LA32-CONTRACT-FAST-NEXT:    xvld $xr1, $a2, 0
+; LA32-CONTRACT-FAST-NEXT:    xvld $xr2, $a3, 0
+; LA32-CONTRACT-FAST-NEXT:    xvfmadd.d $xr0, $xr0, $xr1, $xr2
+; LA32-CONTRACT-FAST-NEXT:    xvst $xr0, $a0, 0
+; LA32-CONTRACT-FAST-NEXT:    ret
+;
+; LA32-CONTRACT-ON-LABEL: contract_xvfmadd_d:
+; LA32-CONTRACT-ON:       # %bb.0: # %entry
+; LA32-CONTRACT-ON-NEXT:    xvld $xr0, $a1, 0
+; LA32-CONTRACT-ON-NEXT:    xvld $xr1, $a2, 0
+; LA32-CONTRACT-ON-NEXT:    xvld $xr2, $a3, 0
+; LA32-CONTRACT-ON-NEXT:    xvfmadd.d $xr0, $xr0, $xr1, $xr2
+; LA32-CONTRACT-ON-NEXT:    xvst $xr0, $a0, 0
+; LA32-CONTRACT-ON-NEXT:    ret
+;
+; LA32-CONTRACT-OFF-LABEL: contract_xvfmadd_d:
+; LA32-CONTRACT-OFF:       # %bb.0: # %entry
+; LA32-CONTRACT-OFF-NEXT:    xvld $xr0, $a1, 0
+; LA32-CONTRACT-OFF-NEXT:    xvld $xr1, $a2, 0
+; LA32-CONTRACT-OFF-NEXT:    xvld $xr2, $a3, 0
+; LA32-CONTRACT-OFF-NEXT:    xvfmadd.d $xr0, $xr0, $xr1, $xr2
+; LA32-CONTRACT-OFF-NEXT:    xvst $xr0, $a0, 0
+; LA32-CONTRACT-OFF-NEXT:    ret
+;
+; LA64-CONTRACT-FAST-LABEL: contract_xvfmadd_d:
+; LA64-CONTRACT-FAST:       # %bb.0: # %entry
+; LA64-CONTRACT-FAST-NEXT:    xvld $xr0, $a1, 0
+; LA64-CONTRACT-FAST-NEXT:    xvld $xr1, $a2, 0
+; LA64-CONTRACT-FAST-NEXT:    xvld $xr2, $a3, 0
+; LA64-CONTRACT-FAST-NEXT:    xvfmadd.d $xr0, $xr0, $xr1, $xr2
+; LA64-CONTRACT-FAST-NEXT:    xvst $xr0, $a0, 0
+; LA64-CONTRACT-FAST-NEXT:    ret
+;
+; LA64-CONTRACT-ON-LABEL: contract_xvfmadd_d:
+; LA64-CONTRACT-ON:       # %bb.0: # %entry
+; LA64-CONTRACT-ON-NEXT:    xvld $xr0, $a1, 0
+; LA64-CONTRACT-ON-NEXT:    xvld $xr1, $a2, 0
+; LA64-CONTRACT-ON-NEXT:    xvld $xr2, $a3, 0
+; LA64-CONTRACT-ON-NEXT:    xvfmadd.d $xr0, $xr0, $xr1, $xr2
+; LA64-CONTRACT-ON-NEXT:    xvst $xr0, $a0, 0
+; LA64-CONTRACT-ON-NEXT:    ret
+;
+; LA64-CONTRACT-OFF-LABEL: contract_xvfmadd_d:
+; LA64-CONTRACT-OFF:       # %bb.0: # %entry
+; LA64-CONTRACT-OFF-NEXT:    xvld $xr0, $a1, 0
+; LA64-CONTRACT-OFF-NEXT:    xvld $xr1, $a2, 0
+; LA64-CONTRACT-OFF-NEXT:    xvld $xr2, $a3, 0
+; LA64-CONTRACT-OFF-NEXT:    xvfmadd.d $xr0, $xr0, $xr1, $xr2
+; LA64-CONTRACT-OFF-NEXT:    xvst $xr0, $a0, 0
+; LA64-CONTRACT-OFF-NEXT:    ret
 entry:
   %v0 = load <4 x double>, ptr %a0
   %v1 = load <4 x double>, ptr %a1
@@ -292,23 +652,59 @@ entry:
 }
 
 define void @contract_xvfmsub_d(ptr %res, ptr %a0, ptr %a1, ptr %a2) nounwind {
-; LA32-CONTRACT-LABEL: contract_xvfmsub_d:
-; LA32-CONTRACT:       # %bb.0: # %entry
-; LA32-CONTRACT-NEXT:    xvld $xr0, $a1, 0
-; LA32-CONTRACT-NEXT:    xvld $xr1, $a2, 0
-; LA32-CONTRACT-NEXT:    xvld $xr2, $a3, 0
-; LA32-CONTRACT-NEXT:    xvfmsub.d $xr0, $xr0, $xr1, $xr2
-; LA32-CONTRACT-NEXT:    xvst $xr0, $a0, 0
-; LA32-CONTRACT-NEXT:    ret
-;
-; LA64-CONTRACT-LABEL: contract_xvfmsub_d:
-; LA64-CONTRACT:       # %bb.0: # %entry
-; LA64-CONTRACT-NEXT:    xvld $xr0, $a1, 0
-; LA64-CONTRACT-NEXT:    xvld $xr1, $a2, 0
-; LA64-CONTRACT-NEXT:    xvld $xr2, $a3, 0
-; LA64-CONTRACT-NEXT:    xvfmsub.d $xr0, $xr0, $xr1, $xr2
-; LA64-CONTRACT-NEXT:    xvst $xr0, $a0, 0
-; LA64-CONTRACT-NEXT:    ret
+; LA32-CONTRACT-FAST-LABEL: contract_xvfmsub_d:
+; LA32-CONTRACT-FAST:       # %bb.0: # %entry
+; LA32-CONTRACT-FAST-NEXT:    xvld $xr0, $a1, 0
+; LA32-CONTRACT-FAST-NEXT:    xvld $xr1, $a2, 0
+; LA32-CONTRACT-FAST-NEXT:    xvld $xr2, $a3, 0
+; LA32-CONTRACT-FAST-NEXT:    xvfmsub.d $xr0, $xr0, $xr1, $xr2
+; LA32-CONTRACT-FAST-NEXT:    xvst $xr0, $a0, 0
+; LA32-CONTRACT-FAST-NEXT:    ret
+;
+; LA32-CONTRACT-ON-LABEL: contract_xvfmsub_d:
+; LA32-CONTRACT-ON:       # %bb.0: # %entry
+; LA32-CONTRACT-ON-NEXT:    xvld $xr0, $a1, 0
+; LA32-CONTRACT-ON-NEXT:    xvld $xr1, $a2, 0
+; LA32-CONTRACT-ON-NEXT:    xvld $xr2, $a3, 0
+; LA32-CONTRACT-ON-NEXT:    xvfmsub.d $xr0, $xr0, $xr1, $xr2
+; LA32-CONTRACT-ON-NEXT:    xvst $xr0, $a0, 0
+; LA32-CONTRACT-ON-NEXT:    ret
+;
+; LA32-CONTRACT-OFF-LABEL: contract_xvfmsub_d:
+; LA32-CONTRACT-OFF:       # %bb.0: # %entry
+; LA32-CONTRACT-OFF-NEXT:    xvld $xr0, $a1, 0
+; LA32-CONTRACT-OFF-NEXT:    xvld $xr1, $a2, 0
+; LA32-CONTRACT-OFF-NEXT:    xvld $xr2, $a3, 0
+; LA32-CONTRACT-OFF-NEXT:    xvfmsub.d $xr0, $xr0, $xr1, $xr2
+; LA32-CONTRACT-OFF-NEXT:    xvst $xr0, $a0, 0
+; LA32-CONTRACT-OFF-NEXT:    ret
+;
+; LA64-CONTRACT-FAST-LABEL: contract_xvfmsub_d:
+; LA64-CONTRACT-FAST:       # %bb.0: # %entry
+; LA64-CONTRACT-FAST-NEXT:    xvld $xr0, $a1, 0
+; LA64-CONTRACT-FAST-NEXT:    xvld $xr1, $a2, 0
+; LA64-CONTRACT-FAST-NEXT:    xvld $xr2, $a3, 0
+; LA64-CONTRACT-FAST-NEXT:    xvfmsub.d $xr0, $xr0, $xr1, $xr2
+; LA64-CONTRACT-FAST-NEXT:    xvst $xr0, $a0, 0
+; LA64-CONTRACT-FAST-NEXT:    ret
+;
+; LA64-CONTRACT-ON-LABEL: contract_xvfmsub_d:
+; LA64-CONTRACT-ON:       # %bb.0: # %entry
+; LA64-CONTRACT-ON-NEXT:    xvld $xr0, $a1, 0
+; LA64-CONTRACT-ON-NEXT:    xvld $xr1, $a2, 0
+; LA64-CONTRACT-ON-NEXT:    xvld $xr2, $a3, 0
+; LA64-CONTRACT-ON-NEXT:    xvfmsub.d $xr0, $xr0, $xr1, $xr2
+; LA64-CONTRACT-ON-NEXT:    xvst $xr0, $a0, 0
+; LA64-CONTRACT-ON-NEXT:    ret
+;
+; LA64-CONTRACT-OFF-LABEL: contract_xvfmsub_d:
+; LA64-CONTRACT-OFF:       # %bb.0: # %entry
+; LA64-CONTRACT-OFF-NEXT:    xvld $xr0, $a1, 0
+; LA64-CONTRACT-OFF-NEXT:    xvld $xr1, $a2, 0
+; LA64-CONTRACT-OFF-NEXT:    xvld $xr2, $a3, 0
+; LA64-CONTRACT-OFF-NEXT:    xvfmsub.d $xr0, $xr0, $xr1, $xr2
+; LA64-CONTRACT-OFF-NEXT:    xvst $xr0, $a0, 0
+; LA64-CONTRACT-OFF-NEXT:    ret
 entry:
   %v0 = load <4 x double>, ptr %a0
   %v1 = load <4 x double>, ptr %a1
@@ -320,23 +716,59 @@ entry:
 }
 
 define void @contract_xvfnmadd_d(ptr %res, ptr %a0, ptr %a1, ptr %a2) nounwind {
-; LA32-CONTRACT-LABEL: contract_xvfnmadd_d:
-; LA32-CONTRACT:       # %bb.0: # %entry
-; LA32-CONTRACT-NEXT:    xvld $xr0, $a1, 0
-; LA32-CONTRACT-NEXT:    xvld $xr1, $a2, 0
-; LA32-CONTRACT-NEXT:    xvld $xr2, $a3, 0
-; LA32-CONTRACT-NEXT:    xvfnmadd.d $xr0, $xr0, $xr1, $xr2
-; LA32-CONTRACT-NEXT:    xvst $xr0, $a0, 0
-; LA32-CONTRACT-NEXT:    ret
-;
-; LA64-CONTRACT-LABEL: contract_xvfnmadd_d:
-; LA64-CONTRACT:       # %bb.0: # %entry
-; LA64-CONTRACT-NEXT:    xvld $xr0, $a1, 0
-; LA64-CONTRACT-NEXT:    xvld $xr1, $a2, 0
-; LA64-CONTRACT-NEXT:    xvld $xr2, $a3, 0
-; LA64-CONTRACT-NEXT:    xvfnmadd.d $xr0, $xr0, $xr1, $xr2
-; LA64-CONTRACT-NEXT:    xvst $xr0, $a0, 0
-; LA64-CONTRACT-NEXT:    ret
+; LA32-CONTRACT-FAST-LABEL: contract_xvfnmadd_d:
+; LA32-CONTRACT-FAST:       # %bb.0: # %entry
+; LA32-CONTRACT-FAST-NEXT:    xvld $xr0, $a1, 0
+; LA32-CONTRACT-FAST-NEXT:    xvld $xr1, $a2, 0
+; LA32-CONTRACT-FAST-NEXT:    xvld $xr2, $a3, 0
+; LA32-CONTRACT-FAST-NEXT:    xvfnmadd.d $xr0, $xr0, $xr1, $xr2
+; LA32-CONTRACT-FAST-NEXT:    xvst $xr0, $a0, 0
+; LA32-CONTRACT-FAST-NEXT:    ret
+;
+; LA32-CONTRACT-ON-LABEL: contract_xvfnmadd_d:
+; LA32-CONTRACT-ON:       # %bb.0: # %entry
+; LA32-CONTRACT-ON-NEXT:    xvld $xr0, $a1, 0
+; LA32-CONTRACT-ON-NEXT:    xvld $xr1, $a2, 0
+; LA32-CONTRACT-ON-NEXT:    xvld $xr2, $a3, 0
+; LA32-CONTRACT-ON-NEXT:    xvfnmadd.d $xr0, $xr0, $xr1, $xr2
+; LA32-CONTRACT-ON-NEXT:    xvst $xr0, $a0, 0
+; LA32-CONTRACT-ON-NEXT:    ret
+;
+; LA32-CONTRACT-OFF-LABEL: contract_xvfnmadd_d:
+; LA32-CONTRACT-OFF:       # %bb.0: # %entry
+; LA32-CONTRACT-OFF-NEXT:    xvld $xr0, $a1, 0
+; LA32-CONTRACT-OFF-NEXT:    xvld $xr1, $a2, 0
+; LA32-CONTRACT-OFF-NEXT:    xvld $xr2, $a3, 0
+; LA32-CONTRACT-OFF-NEXT:    xvfnmadd.d $xr0, $xr0, $xr1, $xr2
+; LA32-CONTRACT-OFF-NEXT:    xvst $xr0, $a0, 0
+; LA32-CONTRACT-OFF-NEXT:    ret
+;
+; LA64-CONTRACT-FAST-LABEL: contract_xvfnmadd_d:
+; LA64-CONTRACT-FAST:       # %bb.0: # %entry
+; LA64-CONTRACT-FAST-NEXT:    xvld $xr0, $a1, 0
+; LA64-CONTRACT-FAST-NEXT:    xvld $xr1, $a2, 0
+; LA64-CONTRACT-FAST-NEXT:    xvld $xr2, $a3, 0
+; LA64-CONTRACT-FAST-NEXT:    xvfnmadd.d $xr0, $xr0, $xr1, $xr2
+; LA64-CONTRACT-FAST-NEXT:    xvst $xr0, $a0, 0
+; LA64-CONTRACT-FAST-NEXT:    ret
+;
+; LA64-CONTRACT-ON-LABEL: contract_xvfnmadd_d:
+; LA64-CONTRACT-ON:       # %bb.0: # %entry
+; LA64-CONTRACT-ON-NEXT:    xvld $xr0, $a1, 0
+; LA64-CONTRACT-ON-NEXT:    xvld $xr1, $a2, 0
+; LA64-CONTRACT-ON-NEXT:    xvld $xr2, $a3, 0
+; LA64-CONTRACT-ON-NEXT:    xvfnmadd.d $xr0, $xr0, $xr1, $xr2
+; LA64-CONTRACT-ON-NEXT:    xvst $xr0, $a0, 0
+; LA64-CONTRACT-ON-NEXT:    ret
+;
+; LA64-CONTRACT-OFF-LABEL: contract_xvfnmadd_d:
+; LA64-CONTRACT-OFF:       # %bb.0: # %entry
+; LA64-CONTRACT-OFF-NEXT:    xvld $xr0, $a1, 0
+; LA64-CONTRACT-OFF-NEXT:    xvld $xr1, $a2, 0
+; LA64-CONTRACT-OFF-NEXT:    xvld $xr2, $a3, 0
+; LA64-CONTRACT-OFF-NEXT:    xvfnmadd.d $xr0, $xr0, $xr1, $xr2
+; LA64-CONTRACT-OFF-NEXT:    xvst $xr0, $a0, 0
+; LA64-CONTRACT-OFF-NEXT:    ret
 entry:
   %v0 = load <4 x double>, ptr %a0
   %v1 = load <4 x double>, ptr %a1
@@ -349,23 +781,59 @@ entry:
 }
 
 define void @contract_xvfnmadd_d_nsz(ptr %res, ptr %a0, ptr %a1, ptr %a2) nounwind {
-; LA32-CONTRACT-LABEL: contract_xvfnmadd_d_nsz:
-; LA32-CONTRACT:       # %bb.0: # %entry
-; LA32-CONTRACT-NEXT:    xvld $xr0, $a1, 0
-; LA32-CONTRACT-NEXT:    xvld $xr1, $a2, 0
-; LA32-CONTRACT-NEXT:    xvld $xr2, $a3, 0
-; LA32-CONTRACT-NEXT:    xvfnmadd.d $xr0, $xr0, $xr1, $xr2
-; LA32-CONTRACT-NEXT:    xvst $xr0, $a0, 0
-; LA32-CONTRACT-NEXT:    ret
-;
-; LA64-CONTRACT-LABEL: contract_xvfnmadd_d_nsz:
-; LA64-CONTRACT:       # %bb.0: # %entry
-; LA64-CONTRACT-NEXT:    xvld $xr0, $a1, 0
-; LA64-CONTRACT-NEXT:    xvld $xr1, $a2, 0
-; LA64-CONTRACT-NEXT:    xvld $xr2, $a3, 0
-; LA64-CONTRACT-NEXT:    xvfnmadd.d $xr0, $xr0, $xr1, $xr2
-; LA64-CONTRACT-NEXT:    xvst $xr0, $a0, 0
-; LA64-CONTRACT-NEXT:    ret
+; LA32-CONTRACT-FAST-LABEL: contract_xvfnmadd_d_nsz:
+; LA32-CONTRACT-FAST:       # %bb.0: # %entry
+; LA32-CONTRACT-FAST-NEXT:    xvld $xr0, $a1, 0
+; LA32-CONTRACT-FAST-NEXT:    xvld $xr1, $a2, 0
+; LA32-CONTRACT-FAST-NEXT:    xvld $xr2, $a3, 0
+; LA32-CONTRACT-FAST-NEXT:    xvfnmadd.d $xr0, $xr0, $xr1, $xr2
+; LA32-CONTRACT-FAST-NEXT:    xvst $xr0, $a0, 0
+; LA32-CONTRACT-FAST-NEXT:    ret
+;
+; LA32-CONTRACT-ON-LABEL: contract_xvfnmadd_d_nsz:
+; LA32-CONTRACT-ON:       # %bb.0: # %entry
+; LA32-CONTRACT-ON-NEXT:    xvld $xr0, $a1, 0
+; LA32-CONTRACT-ON-NEXT:    xvld $xr1, $a2, 0
+; LA32-CONTRACT-ON-NEXT:    xvld $xr2, $a3, 0
+; LA32-CONTRACT-ON-NEXT:    xvfnmadd.d $xr0, $xr0, $xr1, $xr2
+; LA32-CONTRACT-ON-NEXT:    xvst $xr0, $a0, 0
+; LA32-CONTRACT-ON-NEXT:    ret
+;
+; LA32-CONTRACT-OFF-LABEL: contract_xvfnmadd_d_nsz:
+; LA32-CONTRACT-OFF:       # %bb.0: # %entry
+; LA32-CONTRACT-OFF-NEXT:    xvld $xr0, $a1, 0
+; LA32-CONTRACT-OFF-NEXT:    xvld $xr1, $a2, 0
+; LA32-CONTRACT-OFF-NEXT:    xvld $xr2, $a3, 0
+; LA32-CONTRACT-OFF-NEXT:    xvfnmadd.d $xr0, $xr0, $xr1, $xr2
+; LA32-CONTRACT-OFF-NEXT:    xvst $xr0, $a0, 0
+; LA32-CONTRACT-OFF-NEXT:    ret
+;
+; LA64-CONTRACT-FAST-LABEL: contract_xvfnmadd_d_nsz:
+; LA64-CONTRACT-FAST:       # %bb.0: # %entry
+; LA64-CONTRACT-FAST-NEXT:    xvld $xr0, $a1, 0
+; LA64-CONTRACT-FAST-NEXT:    xvld $xr1, $a2, 0
+; LA64-CONTRACT-FAST-NEXT:    xvld $xr2, $a3, 0
+; LA64-CONTRACT-FAST-NEXT:    xvfnmadd.d $xr0, $xr0, $xr1, $xr2
+; LA64-CONTRACT-FAST-NEXT:    xvst $xr0, $a0, 0
+; LA64-CONTRACT-FAST-NEXT:    ret
+;
+; LA64-CONTRACT-ON-LABEL: contract_xvfnmadd_d_nsz:
+; LA64-CONTRACT-ON:       # %bb.0: # %entry
+; LA64-CONTRACT-ON-NEXT:    xvld $xr0, $a1, 0
+; LA64-CONTRACT-ON-NEXT:    xvld $xr1, $a2, 0
+; LA64-CONTRACT-ON-NEXT:    xvld $xr2, $a3, 0
+; LA64-CONTRACT-ON-NEXT:    xvfnmadd.d $xr0, $xr0, $xr1, $xr2
+; LA64-CONTRACT-ON-NEXT:    xvst $xr0, $a0, 0
+; LA64-CONTRACT-ON-NEXT:    ret
+;
+; LA64-CONTRACT-OFF-LABEL: contract_xvfnmadd_d_nsz:
+; LA64-CONTRACT-OFF:       # %bb.0: # %entry
+; LA64-CONTRACT-OFF-NEXT:    xvld $xr0, $a1, 0
+; LA64-CONTRACT-OFF-NEXT:    xvld $xr1, $a2, 0
+; LA64-CONTRACT-OFF-NEXT:    xvld $xr2, $a3, 0
+; LA64-CONTRACT-OFF-NEXT:    xvfnmadd.d $xr0, $xr0, $xr1, $xr2
+; LA64-CONTRACT-OFF-NEXT:    xvst $xr0, $a0, 0
+; LA64-CONTRACT-OFF-NEXT:    ret
 entry:
   %v0 = load <4 x double>, ptr %a0
   %v1 = load <4 x double>, ptr %a1
@@ -380,25 +848,65 @@ entry:
 
 ;; Check that xvfnmadd.d is not emitted.
 define void @not_contract_xvfnmadd_d(ptr %res, ptr %a0, ptr %a1, ptr %a2) nounwind {
-; LA32-CONTRACT-LABEL: not_contract_xvfnmadd_d:
-; LA32-CONTRACT:       # %bb.0: # %entry
-; LA32-CONTRACT-NEXT:    xvld $xr0, $a1, 0
-; LA32-CONTRACT-NEXT:    xvld $xr1, $a2, 0
-; LA32-CONTRACT-NEXT:    xvld $xr2, $a3, 0
-; LA32-CONTRACT-NEXT:    xvbitrevi.d $xr0, $xr0, 63
-; LA32-CONTRACT-NEXT:    xvfmsub.d $xr0, $xr0, $xr1, $xr2
-; LA32-CONTRACT-NEXT:    xvst $xr0, $a0, 0
-; LA32-CONTRACT-NEXT:    ret
-;
-; LA64-CONTRACT-LABEL: not_contract_xvfnmadd_d:
-; LA64-CONTRACT:       # %bb.0: # %entry
-; LA64-CONTRACT-NEXT:    xvld $xr0, $a1, 0
-; LA64-CONTRACT-NEXT:    xvld $xr1, $a2, 0
-; LA64-CONTRACT-NEXT:    xvld $xr2, $a3, 0
-; LA64-CONTRACT-NEXT:    xvbitrevi.d $xr0, $xr0, 63
-; LA64-CONTRACT-NEXT:    xvfmsub.d $xr0, $xr0, $xr1, $xr2
-; LA64-CONTRACT-NEXT:    xvst $xr0, $a0, 0
-; LA64-CONTRACT-NEXT:    ret
+; LA32-CONTRACT-FAST-LABEL: not_contract_xvfnmadd_d:
+; LA32-CONTRACT-FAST:       # %bb.0: # %entry
+; LA32-CONTRACT-FAST-NEXT:    xvld $xr0, $a1, 0
+; LA32-CONTRACT-FAST-NEXT:    xvld $xr1, $a2, 0
+; LA32-CONTRACT-FAST-NEXT:    xvld $xr2, $a3, 0
+; LA32-CONTRACT-FAST-NEXT:    xvbitrevi.d $xr0, $xr0, 63
+; LA32-CONTRACT-FAST-NEXT:    xvfmsub.d $xr0, $xr0, $xr1, $xr2
+; LA32-CONTRACT-FAST-NEXT:    xvst $xr0, $a0, 0
+; LA32-CONTRACT-FAST-NEXT:    ret
+;
+; LA32-CONTRACT-ON-LABEL: not_contract_xvfnmadd_d:
+; LA32-CONTRACT-ON:       # %bb.0: # %entry
+; LA32-CONTRACT-ON-NEXT:    xvld $xr0, $a1, 0
+; LA32-CONTRACT-ON-NEXT:    xvld $xr1, $a2, 0
+; LA32-CONTRACT-ON-NEXT:    xvld $xr2, $a3, 0
+; LA32-CONTRACT-ON-NEXT:    xvbitrevi.d $xr0, $xr0, 63
+; LA32-CONTRACT-ON-NEXT:    xvfmsub.d $xr0, $xr0, $xr1, $xr2
+; LA32-CONTRACT-ON-NEXT:    xvst $xr0, $a0, 0
+; LA32-CONTRACT-ON-NEXT:    ret
+;
+; LA32-CONTRACT-OFF-LABEL: not_contract_xvfnmadd_d:
+; LA32-CONTRACT-OFF:       # %bb.0: # %entry
+; LA32-CONTRACT-OFF-NEXT:    xvld $xr0, $a1, 0
+; LA32-CONTRACT-OFF-NEXT:    xvld $xr1, $a2, 0
+; LA32-CONTRACT-OFF-NEXT:    xvld $xr2, $a3, 0
+; LA32-CONTRACT-OFF-NEXT:    xvbitrevi.d $xr0, $xr0, 63
+; LA32-CONTRACT-OFF-NEXT:    xvfmsub.d $xr0, $xr0, $xr1, $xr2
+; LA32-CONTRACT-OFF-NEXT:    xvst $xr0, $a0, 0
+; LA32-CONTRACT-OFF-NEXT:    ret
+;
+; LA64-CONTRACT-FAST-LABEL: not_contract_xvfnmadd_d:
+; LA64-CONTRACT-FAST:       # %bb.0: # %entry
+; LA64-CONTRACT-FAST-NEXT:    xvld $xr0, $a1, 0
+; LA64-CONTRACT-FAST-NEXT:    xvld $xr1, $a2, 0
+; LA64-CONTRACT-FAST-NEXT:    xvld $xr2, $a3, 0
+; LA64-CONTRACT-FAST-NEXT:    xvbitrevi.d $xr0, $xr0, 63
+; LA64-CONTRACT-FAST-NEXT:    xvfmsub.d $xr0, $xr0, $xr1, $xr2
+; LA64-CONTRACT-FAST-NEXT:    xvst $xr0, $a0, 0
+; LA64-CONTRACT-FAST-NEXT:    ret
+;
+; LA64-CONTRACT-ON-LABEL: not_contract_xvfnmadd_d:
+; LA64-CONTRACT-ON:       # %bb.0: # %entry
+; LA64-CONTRACT-ON-NEXT:    xvld $xr0, $a1, 0
+; LA64-CONTRACT-ON-NEXT:    xvld $xr1, $a2, 0
+; LA64-CONTRACT-ON-NEXT:    xvld $xr2, $a3, 0
+; LA64-CONTRACT-ON-NEXT:    xvbitrevi.d $xr0, $xr0, 63
+; LA64-CONTRACT-ON-NEXT:    xvfmsub.d $xr0, $xr0, $xr1, $xr2
+; LA64-CONTRACT-ON-NEXT:    xvst $xr0, $a0, 0
+; LA64-CONTRACT-ON-NEXT:    ret
+;
+; LA64-CONTRACT-OFF-LABEL: not_contract_xvfnmadd_d:
+; LA64-CONTRACT-OFF:       # %bb.0: # %entry
+; LA64-CONTRACT-OFF-NEXT:    xvld $xr0, $a1, 0
+; LA64-CONTRACT-OFF-NEXT:    xvld $xr1, $a2, 0
+; LA64-CONTRACT-OFF-NEXT:    xvld $xr2, $a3, 0
+; LA64-CONTRACT-OFF-NEXT:    xvbitrevi.d $xr0, $xr0, 63
+; LA64-CONTRACT-OFF-NEXT:    xvfmsub.d $xr0, $xr0, $xr1, $xr2
+; LA64-CONTRACT-OFF-NEXT:    xvst $xr0, $a0, 0
+; LA64-CONTRACT-OFF-NEXT:    ret
 entry:
   %v0 = load <4 x double>, ptr %a0
   %v1 = load <4 x double>, ptr %a1
@@ -412,23 +920,59 @@ entry:
 }
 
 define void @contract_xvfnmsub_d(ptr %res, ptr %a0, ptr %a1, ptr %a2) nounwind {
-; LA32-CONTRACT-LABEL: contract_xvfnmsub_d:
-; LA32-CONTRACT:       # %bb.0: # %entry
-; LA32-CONTRACT-NEXT:    xvld $xr0, $a1, 0
-; LA32-CONTRACT-NEXT:    xvld $xr1, $a2, 0
-; LA32-CONTRACT-NEXT:    xvld $xr2, $a3, 0
-; LA32-CONTRACT-NEXT:    xvfnmsub.d $xr0, $xr0, $xr1, $xr2
-; LA32-CONTRACT-NEXT:    xvst $xr0, $a0, 0
-; LA32-CONTRACT-NEXT:    ret
-;
-; LA64-CONTRACT-LABEL: contract_xvfnmsub_d:
-; LA64-CONTRACT:       # %bb.0: # %entry
-; LA64-CONTRACT-NEXT:    xvld $xr0, $a1, 0
-; LA64-CONTRACT-NEXT:    xvld $xr1, $a2, 0
-; LA64-CONTRACT-NEXT:    xvld $xr2, $a3, 0
-; LA64-CONTRACT-NEXT:    xvfnmsub.d $xr0, $xr0, $xr1, $xr2
-; LA64-CONTRACT-NEXT:    xvst $xr0, $a0, 0
-; LA64-CONTRACT-NEXT:    ret
+; LA32-CONTRACT-FAST-LABEL: contract_xvfnmsub_d:
+; LA32-CONTRACT-FAST:       # %bb.0: # %entry
+; LA32-CONTRACT-FAST-NEXT:    xvld $xr0, $a1, 0
+; LA32-CONTRACT-FAST-NEXT:    xvld $xr1, $a2, 0
+; LA32-CONTRACT-FAST-NEXT:    xvld $xr2, $a3, 0
+; LA32-CONTRACT-FAST-NEXT:    xvfnmsub.d $xr0, $xr0, $xr1, $xr2
+; LA32-CONTRACT-FAST-NEXT:    xvst $xr0, $a0, 0
+; LA32-CONTRACT-FAST-NEXT:    ret
+;
+; LA32-CONTRACT-ON-LABEL: contract_xvfnmsub_d:
+; LA32-CONTRACT-ON:       # %bb.0: # %entry
+; LA32-CONTRACT-ON-NEXT:    xvld $xr0, $a1, 0
+; LA32-CONTRACT-ON-NEXT:    xvld $xr1, $a2, 0
+; LA32-CONTRACT-ON-NEXT:    xvld $xr2, $a3, 0
+; LA32-CONTRACT-ON-NEXT:    xvfnmsub.d $xr0, $xr0, $xr1, $xr2
+; LA32-CONTRACT-ON-NEXT:    xvst $xr0, $a0, 0
+; LA32-CONTRACT-ON-NEXT:    ret
+;
+; LA32-CONTRACT-OFF-LABEL: contract_xvfnmsub_d:
+; LA32-CONTRACT-OFF:       # %bb.0: # %entry
+; LA32-CONTRACT-OFF-NEXT:    xvld $xr0, $a1, 0
+; LA32-CONTRACT-OFF-NEXT:    xvld $xr1, $a2, 0
+; LA32-CONTRACT-OFF-NEXT:    xvld $xr2, $a3, 0
+; LA32-CONTRACT-OFF-NEXT:    xvfnmsub.d $xr0, $xr0, $xr1, $xr2
+; LA32-CONTRACT-OFF-NEXT:    xvst $xr0, $a0, 0
+; LA32-CONTRACT-OFF-NEXT:    ret
+;
+; LA64-CONTRACT-FAST-LABEL: contract_xvfnmsub_d:
+; LA64-CONTRACT-FAST:       # %bb.0: # %entry
+; LA64-CONTRACT-FAST-NEXT:    xvld $xr0, $a1, 0
+; LA64-CONTRACT-FAST-NEXT:    xvld $xr1, $a2, 0
+; LA64-CONTRACT-FAST-NEXT:    xvld $xr2, $a3, 0
+; LA64-CONTRACT-FAST-NEXT:    xvfnmsub.d $xr0, $xr0, $xr1, $xr2
+; LA64-CONTRACT-FAST-NEXT:    xvst $xr0, $a0, 0
+; LA64-CONTRACT-FAST-NEXT:    ret
+;
+; LA64-CONTRACT-ON-LABEL: contract_xvfnmsub_d:
+; LA64-CONTRACT-ON:       # %bb.0: # %entry
+; LA64-CONTRACT-ON-NEXT:    xvld $xr0, $a1, 0
+; LA64-CONTRACT-ON-NEXT:    xvld $xr1, $a2, 0
+; LA64-CONTRACT-ON-NEXT:    xvld $xr2, $a3, 0
+; LA64-CONTRACT-ON-NEXT:    xvfnmsub.d $xr0, $xr0, $xr1, $xr2
+; LA64-CONTRACT-ON-NEXT:    xvst $xr0, $a0, 0
+; LA64-CONTRACT-ON-NEXT:    ret
+;
+; LA64-CONTRACT-OFF-LABEL: contract_xvfnmsub_d:
+; LA64-CONTRACT-OFF:       # %bb.0: # %entry
+; LA64-CONTRACT-OFF-NEXT:    xvld $xr0, $a1, 0
+; LA64-CONTRACT-OFF-NEXT:    xvld $xr1, $a2, 0
+; LA64-CONTRACT-OFF-NEXT:    xvld $xr2, $a3, 0
+; LA64-CONTRACT-OFF-NEXT:    xvfnmsub.d $xr0, $xr0, $xr1, $xr2
+; LA64-CONTRACT-OFF-NEXT:    xvst $xr0, $a0, 0
+; LA64-CONTRACT-OFF-NEXT:    ret
 entry:
   %v0 = load <4 x double>, ptr %a0
   %v1 = load <4 x double>, ptr %a1
@@ -442,23 +986,59 @@ entry:
 }
 
 define void @contract_xvfnmsub_d_nsz(ptr %res, ptr %a0, ptr %a1, ptr %a2) nounwind {
-; LA32-CONTRACT-LABEL: contract_xvfnmsub_d_nsz:
-; LA32-CONTRACT:       # %bb.0: # %entry
-; LA32-CONTRACT-NEXT:    xvld $xr0, $a1, 0
-; LA32-CONTRACT-NEXT:    xvld $xr1, $a2, 0
-; LA32-CONTRACT-NEXT:    xvld $xr2, $a3, 0
-; LA32-CONTRACT-NEXT:    xvfnmsub.d $xr0, $xr0, $xr1, $xr2
-; LA32-CONTRACT-NEXT:    xvst $xr0, $a0, 0
-; LA32-CONTRACT-NEXT:    ret
-;
-; LA64-CONTRACT-LABEL: contract_xvfnmsub_d_nsz:
-; LA64-CONTRACT:       # %bb.0: # %entry
-; LA64-CONTRACT-NEXT:    xvld $xr0, $a1, 0
-; LA64-CONTRACT-NEXT:    xvld $xr1, $a2, 0
-; LA64-CONTRACT-NEXT:    xvld $xr2, $a3, 0
-; LA64-CONTRACT-NEXT:    xvfnmsub.d $xr0, $xr0, $xr1, $xr2
-; LA64-CONTRACT-NEXT:    xvst $xr0, $a0, 0
-; LA64-CONTRACT-NEXT:    ret
+; LA32-CONTRACT-FAST-LABEL: contract_xvfnmsub_d_nsz:
+; LA32-CONTRACT-FAST:       # %bb.0: # %entry
+; LA32-CONTRACT-FAST-NEXT:    xvld $xr0, $a1, 0
+; LA32-CONTRACT-FAST-NEXT:    xvld $xr1, $a2, 0
+; LA32-CONTRACT-FAST-NEXT:    xvld $xr2, $a3, 0
+; LA32-CONTRACT-FAST-NEXT:    xvfnmsub.d $xr0, $xr0, $xr1, $xr2
+; LA32-CONTRACT-FAST-NEXT:    xvst $xr0, $a0, 0
+; LA32-CONTRACT-FAST-NEXT:    ret
+;
+; LA32-CONTRACT-ON-LABEL: contract_xvfnmsub_d_nsz:
+; LA32-CONTRACT-ON:       # %bb.0: # %entry
+; LA32-CONTRACT-ON-NEXT:    xvld $xr0, $a1, 0
+; LA32-CONTRACT-ON-NEXT:    xvld $xr1, $a2, 0
+; LA32-CONTRACT-ON-NEXT:    xvld $xr2, $a3, 0
+; LA32-CONTRACT-ON-NEXT:    xvfnmsub.d $xr0, $xr0, $xr1, $xr2
+; LA32-CONTRACT-ON-NEXT:    xvst $xr0, $a0, 0
+; LA32-CONTRACT-ON-NEXT:    ret
+;
+; LA32-CONTRACT-OFF-LABEL: contract_xvfnmsub_d_nsz:
+; LA32-CONTRACT-OFF:       # %bb.0: # %entry
+; LA32-CONTRACT-OFF-NEXT:    xvld $xr0, $a1, 0
+; LA32-CONTRACT-OFF-NEXT:    xvld $xr1, $a2, 0
+; LA32-CONTRACT-OFF-NEXT:    xvld $xr2, $a3, 0
+; LA32-CONTRACT-OFF-NEXT:    xvfnmsub.d $xr0, $xr0, $xr1, $xr2
+; LA32-CONTRACT-OFF-NEXT:    xvst $xr0, $a0, 0
+; LA32-CONTRACT-OFF-NEXT:    ret
+;
+; LA64-CONTRACT-FAST-LABEL: contract_xvfnmsub_d_nsz:
+; LA64-CONTRACT-FAST:       # %bb.0: # %entry
+; LA64-CONTRACT-FAST-NEXT:    xvld $xr0, $a1, 0
+; LA64-CONTRACT-FAST-NEXT:    xvld $xr1, $a2, 0
+; LA64-CONTRACT-FAST-NEXT:    xvld $xr2, $a3, 0
+; LA64-CONTRACT-FAST-NEXT:    xvfnmsub.d $xr0, $xr0, $xr1, $xr2
+; LA64-CONTRACT-FAST-NEXT:    xvst $xr0, $a0, 0
+; LA64-CONTRACT-FAST-NEXT:    ret
+;
+; LA64-CONTRACT-ON-LABEL: contract_xvfnmsub_d_nsz:
+; LA64-CONTRACT-ON:       # %bb.0: # %entry
+; LA64-CONTRACT-ON-NEXT:    xvld $xr0, $a1, 0
+; LA64-CONTRACT-ON-NEXT:    xvld $xr1, $a2, 0
+; LA64-CONTRACT-ON-NEXT:    xvld $xr2, $a3, 0
+; LA64-CONTRACT-ON-NEXT:    xvfnmsub.d $xr0, $xr0, $xr1, $xr2
+; LA64-CONTRACT-ON-NEXT:    xvst $xr0, $a0, 0
+; LA64-CONTRACT-ON-NEXT:    ret
+;
+; LA64-CONTRACT-OFF-LABEL: contract_xvfnmsub_d_nsz:
+; LA64-CONTRACT-OFF:       # %bb.0: # %entry
+; LA64-CONTRACT-OFF-NEXT:    xvld $xr0, $a1, 0
+; LA64-CONTRACT-OFF-NEXT:    xvld $xr1, $a2, 0
+; LA64-CONTRACT-OFF-NEXT:    xvld $xr2, $a3, 0
+; LA64-CONTRACT-OFF-NEXT:    xvfnmsub.d $xr0, $xr0, $xr1, $xr2
+; LA64-CONTRACT-OFF-NEXT:    xvst $xr0, $a0, 0
+; LA64-CONTRACT-OFF-NEXT:    ret
 entry:
   %v0 = load <4 x double>, ptr %a0
   %v1 = load <4 x double>, ptr %a1
@@ -472,25 +1052,65 @@ entry:
 
 ;; Check that xvfnmsub.d is not emitted.
 define void @not_contract_xvfnmsub_d(ptr %res, ptr %a0, ptr %a1, ptr %a2) nounwind {
-; LA32-CONTRACT-LABEL: not_contract_xvfnmsub_d:
-; LA32-CONTRACT:       # %bb.0: # %entry
-; LA32-CONTRACT-NEXT:    xvld $xr0, $a1, 0
-; LA32-CONTRACT-NEXT:    xvld $xr1, $a2, 0
-; LA32-CONTRACT-NEXT:    xvld $xr2, $a3, 0
-; LA32-CONTRACT-NEXT:    xvbitrevi.d $xr0, $xr0, 63
-; LA32-CONTRACT-NEXT:    xvfmadd.d $xr0, $xr0, $xr1, $xr2
-; LA32-CONTRACT-NEXT:    xvst $xr0, $a0, 0
-; LA32-CONTRACT-NEXT:    ret
-;
-; LA64-CONTRACT-LABEL: not_contract_xvfnmsub_d:
-; LA64-CONTRACT:       # %bb.0: # %entry
-; LA64-CONTRACT-NEXT:    xvld $xr0, $a1, 0
-; LA64-CONTRACT-NEXT:    xvld $xr1, $a2, 0
-; LA64-CONTRACT-NEXT:    xvld $xr2, $a3, 0
-; LA64-CONTRACT-NEXT:    xvbitrevi.d $xr0, $xr0, 63
-; LA64-CONTRACT-NEXT:    xvfmadd.d $xr0, $xr0, $xr1, $xr2
-; LA64-CONTRACT-NEXT:    xvst $xr0, $a0, 0
-; LA64-CONTRACT-NEXT:    ret
+; LA32-CONTRACT-FAST-LABEL: not_contract_xvfnmsub_d:
+; LA32-CONTRACT-FAST:       # %bb.0: # %entry
+; LA32-CONTRACT-FAST-NEXT:    xvld $xr0, $a1, 0
+; LA32-CONTRACT-FAST-NEXT:    xvld $xr1, $a2, 0
+; LA32-CONTRACT-FAST-NEXT:    xvld $xr2, $a3, 0
+; LA32-CONTRACT-FAST-NEXT:    xvbitrevi.d $xr0, $xr0, 63
+; LA32-CONTRACT-FAST-NEXT:    xvfmadd.d $xr0, $xr0, $xr1, $xr2
+; LA32-CONTRACT-FAST-NEXT:    xvst $xr0, $a0, 0
+; LA32-CONTRACT-FAST-NEXT:    ret
+;
+; LA32-CONTRACT-ON-LABEL: not_contract_xvfnmsub_d:
+; LA32-CONTRACT-ON:       # %bb.0: # %entry
+; LA32-CONTRACT-ON-NEXT:    xvld $xr0, $a1, 0
+; LA32-CONTRACT-ON-NEXT:    xvld $xr1, $a2, 0
+; LA32-CONTRACT-ON-NEXT:    xvld $xr2, $a3, 0
+; LA32-CONTRACT-ON-NEXT:    xvbitrevi.d $xr0, $xr0, 63
+; LA32-CONTRACT-ON-NEXT:    xvfmadd.d $xr0, $xr0, $xr1, $xr2
+; LA32-CONTRACT-ON-NEXT:    xvst $xr0, $a0, 0
+; LA32-CONTRACT-ON-NEXT:    ret
+;
+; LA32-CONTRACT-OFF-LABEL: not_contract_xvfnmsub_d:
+; LA32-CONTRACT-OFF:       # %bb.0: # %entry
+; LA32-CONTRACT-OFF-NEXT:    xvld $xr0, $a1, 0
+; LA32-CONTRACT-OFF-NEXT:    xvld $xr1, $a2, 0
+; LA32-CONTRACT-OFF-NEXT:    xvld $xr2, $a3, 0
+; LA32-CONTRACT-OFF-NEXT:    xvbitrevi.d $xr0, $xr0, 63
+; LA32-CONTRACT-OFF-NEXT:    xvfmadd.d $xr0, $xr0, $xr1, $xr2
+; LA32-CONTRACT-OFF-NEXT:    xvst $xr0, $a0, 0
+; LA32-CONTRACT-OFF-NEXT:    ret
+;
+; LA64-CONTRACT-FAST-LABEL: not_contract_xvfnmsub_d:
+; LA64-CONTRACT-FAST:       # %bb.0: # %entry
+; LA64-CONTRACT-FAST-NEXT:    xvld $xr0, $a1, 0
+; LA64-CONTRACT-FAST-NEXT:    xvld $xr1, $a2, 0
+; LA64-CONTRACT-FAST-NEXT:    xvld $xr2, $a3, 0
+; LA64-CONTRACT-FAST-NEXT:    xvbitrevi.d $xr0, $xr0, 63
+; LA64-CONTRACT-FAST-NEXT:    xvfmadd.d $xr0, $xr0, $xr1, $xr2
+; LA64-CONTRACT-FAST-NEXT:    xvst $xr0, $a0, 0
+; LA64-CONTRACT-FAST-NEXT:    ret
+;
+; LA64-CONTRACT-ON-LABEL: not_contract_xvfnmsub_d:
+; LA64-CONTRACT-ON:       # %bb.0: # %entry
+; LA64-CONTRACT-ON-NEXT:    xvld $xr0, $a1, 0
+; LA64-CONTRACT-ON-NEXT:    xvld $xr1, $a2, 0
+; LA64-CONTRACT-ON-NEXT:    xvld $xr2, $a3, 0
+; LA64-CONTRACT-ON-NEXT:    xvbitrevi.d $xr0, $xr0, 63
+; LA64-CONTRACT-ON-NEXT:    xvfmadd.d $xr0, $xr0, $xr1, $xr2
+; LA64-CONTRACT-ON-NEXT:    xvst $xr0, $a0, 0
+; LA64-CONTRACT-ON-NEXT:    ret
+;
+; LA64-CONTRACT-OFF-LABEL: not_contract_xvfnmsub_d:
+; LA64-CONTRACT-OFF:       # %bb.0: # %entry
+; LA64-CONTRACT-OFF-NEXT:    xvld $xr0, $a1, 0
+; LA64-CONTRACT-OFF-NEXT:    xvld $xr1, $a2, 0
+; LA64-CONTRACT-OFF-NEXT:    xvld $xr2, $a3, 0
+; LA64-CONTRACT-OFF-NEXT:    xvbitrevi.d $xr0, $xr0, 63
+; LA64-CONTRACT-OFF-NEXT:    xvfmadd.d $xr0, $xr0, $xr1, $xr2
+; LA64-CONTRACT-OFF-NEXT:    xvst $xr0, $a0, 0
+; LA64-CONTRACT-OFF-NEXT:    ret
 entry:
   %v0 = load <4 x double>, ptr %a0
   %v1 = load <4 x double>, ptr %a1
@@ -503,23 +1123,59 @@ entry:
 }
 
 define void @xvfmadd_d_contract(ptr %res, ptr %a0, ptr %a1, ptr %a2) nounwind {
-; LA32-CONTRACT-LABEL: xvfmadd_d_contract:
-; LA32-CONTRACT:       # %bb.0: # %entry
-; LA32-CONTRACT-NEXT:    xvld $xr0, $a1, 0
-; LA32-CONTRACT-NEXT:    xvld $xr1, $a2, 0
-; LA32-CONTRACT-NEXT:    xvld $xr2, $a3, 0
-; LA32-CONTRACT-NEXT:    xvfmadd.d $xr0, $xr0, $xr1, $xr2
-; LA32-CONTRACT-NEXT:    xvst $xr0, $a0, 0
-; LA32-CONTRACT-NEXT:    ret
-;
-; LA64-CONTRACT-LABEL: xvfmadd_d_contract:
-; LA64-CONTRACT:       # %bb.0: # %entry
-; LA64-CONTRACT-NEXT:    xvld $xr0, $a1, 0
-; LA64-CONTRACT-NEXT:    xvld $xr1, $a2, 0
-; LA64-CONTRACT-NEXT:    xvld $xr2, $a3, 0
-; LA64-CONTRACT-NEXT:    xvfmadd.d $xr0, $xr0, $xr1, $xr2
-; LA64-CONTRACT-NEXT:    xvst $xr0, $a0, 0
-; LA64-CONTRACT-NEXT:    ret
+; LA32-CONTRACT-FAST-LABEL: xvfmadd_d_contract:
+; LA32-CONTRACT-FAST:       # %bb.0: # %entry
+; LA32-CONTRACT-FAST-NEXT:    xvld $xr0, $a1, 0
+; LA32-CONTRACT-FAST-NEXT:    xvld $xr1, $a2, 0
+; LA32-CONTRACT-FAST-NEXT:    xvld $xr2, $a3, 0
+; LA32-CONTRACT-FAST-NEXT:    xvfmadd.d $xr0, $xr0, $xr1, $xr2
+; LA32-CONTRACT-FAST-NEXT:    xvst $xr0, $a0, 0
+; LA32-CONTRACT-FAST-NEXT:    ret
+;
+; LA32-CONTRACT-ON-LABEL: xvfmadd_d_contract:
+; LA32-CONTRACT-ON:       # %bb.0: # %entry
+; LA32-CONTRACT-ON-NEXT:    xvld $xr0, $a1, 0
+; LA32-CONTRACT-ON-NEXT:    xvld $xr1, $a2, 0
+; LA32-CONTRACT-ON-NEXT:    xvld $xr2, $a3, 0
+; LA32-CONTRACT-ON-NEXT:    xvfmadd.d $xr0, $xr0, $xr1, $xr2
+; LA32-CONTRACT-ON-NEXT:    xvst $xr0, $a0, 0
+; LA32-CONTRACT-ON-NEXT:    ret
+;
+; LA32-CONTRACT-OFF-LABEL: xvfmadd_d_contract:
+; LA32-CONTRACT-OFF:       # %bb.0: # %entry
+; LA32-CONTRACT-OFF-NEXT:    xvld $xr0, $a1, 0
+; LA32-CONTRACT-OFF-NEXT:    xvld $xr1, $a2, 0
+; LA32-CONTRACT-OFF-NEXT:    xvld $xr2, $a3, 0
+; LA32-CONTRACT-OFF-NEXT:    xvfmadd.d $xr0, $xr0, $xr1, $xr2
+; LA32-CONTRACT-OFF-NEXT:    xvst $xr0, $a0, 0
+; LA32-CONTRACT-OFF-NEXT:    ret
+;
+; LA64-CONTRACT-FAST-LABEL: xvfmadd_d_contract:
+; LA64-CONTRACT-FAST:       # %bb.0: # %entry
+; LA64-CONTRACT-FAST-NEXT:    xvld $xr0, $a1, 0
+; LA64-CONTRACT-FAST-NEXT:    xvld $xr1, $a2, 0
+; LA64-CONTRACT-FAST-NEXT:    xvld $xr2, $a3, 0
+; LA64-CONTRACT-FAST-NEXT:    xvfmadd.d $xr0, $xr0, $xr1, $xr2
+; LA64-CONTRACT-FAST-NEXT:    xvst $xr0, $a0, 0
+; LA64-CONTRACT-FAST-NEXT:    ret
+;
+; LA64-CONTRACT-ON-LABEL: xvfmadd_d_contract:
+; LA64-CONTRACT-ON:       # %bb.0: # %entry
+; LA64-CONTRACT-ON-NEXT:    xvld $xr0, $a1, 0
+; LA64-CONTRACT-ON-NEXT:    xvld $xr1, $a2, 0
+; LA64-CONTRACT-ON-NEXT:    xvld $xr2, $a3, 0
+; LA64-CONTRACT-ON-NEXT:    xvfmadd.d $xr0, $xr0, $xr1, $xr2
+; LA64-CONTRACT-ON-NEXT:    xvst $xr0, $a0, 0
+; LA64-CONTRACT-ON-NEXT:    ret
+;
+; LA64-CONTRACT-OFF-LABEL: xvfmadd_d_contract:
+; LA64-CONTRACT-OFF:       # %bb.0: # %entry
+; LA64-CONTRACT-OFF-NEXT:    xvld $xr0, $a1, 0
+; LA64-CONTRACT-OFF-NEXT:    xvld $xr1, $a2, 0
+; LA64-CONTRACT-OFF-NEXT:    xvld $xr2, $a3, 0
+; LA64-CONTRACT-OFF-NEXT:    xvfmadd.d $xr0, $xr0, $xr1, $xr2
+; LA64-CONTRACT-OFF-NEXT:    xvst $xr0, $a0, 0
+; LA64-CONTRACT-OFF-NEXT:    ret
 entry:
   %v0 = load <4 x double>, ptr %a0
   %v1 = load <4 x double>, ptr %a1
@@ -531,23 +1187,59 @@ entry:
 }
 
 define void @xvfmsub_d_contract(ptr %res, ptr %a0, ptr %a1, ptr %a2) nounwind {
-; LA32-CONTRACT-LABEL: xvfmsub_d_contract:
-; LA32-CONTRACT:       # %bb.0: # %entry
-; LA32-CONTRACT-NEXT:    xvld $xr0, $a1, 0
-; LA32-CONTRACT-NEXT:    xvld $xr1, $a2, 0
-; LA32-CONTRACT-NEXT:    xvld $xr2, $a3, 0
-; LA32-CONTRACT-NEXT:    xvfmsub.d $xr0, $xr0, $xr1, $xr2
-; LA32-CONTRACT-NEXT:    xvst $xr0, $a0, 0
-; LA32-CONTRACT-NEXT:    ret
-;
-; LA64-CONTRACT-LABEL: xvfmsub_d_contract:
-; LA64-CONTRACT:       # %bb.0: # %entry
-; LA64-CONTRACT-NEXT:    xvld $xr0, $a1, 0
-; LA64-CONTRACT-NEXT:    xvld $xr1, $a2, 0
-; LA64-CONTRACT-NEXT:    xvld $xr2, $a3, 0
-; LA64-CONTRACT-NEXT:    xvfmsub.d $xr0, $xr0, $xr1, $xr2
-; LA64-CONTRACT-NEXT:    xvst $xr0, $a0, 0
-; LA64-CONTRACT-NEXT:    ret
+; LA32-CONTRACT-FAST-LABEL: xvfmsub_d_contract:
+; LA32-CONTRACT-FAST:       # %bb.0: # %entry
+; LA32-CONTRACT-FAST-NEXT:    xvld $xr0, $a1, 0
+; LA32-CONTRACT-FAST-NEXT:    xvld $xr1, $a2, 0
+; LA32-CONTRACT-FAST-NEXT:    xvld $xr2, $a3, 0
+; LA32-CONTRACT-FAST-NEXT:    xvfmsub.d $xr0, $xr0, $xr1, $xr2
+; LA32-CONTRACT-FAST-NEXT:    xvst $xr0, $a0, 0
+; LA32-CONTRACT-FAST-NEXT:    ret
+;
+; LA32-CONTRACT-ON-LABEL: xvfmsub_d_contract:
+; LA32-CONTRACT-ON:       # %bb.0: # %entry
+; LA32-CONTRACT-ON-NEXT:    xvld $xr0, $a1, 0
+; LA32-CONTRACT-ON-NEXT:    xvld $xr1, $a2, 0
+; LA32-CONTRACT-ON-NEXT:    xvld $xr2, $a3, 0
+; LA32-CONTRACT-ON-NEXT:    xvfmsub.d $xr0, $xr0, $xr1, $xr2
+; LA32-CONTRACT-ON-NEXT:    xvst $xr0, $a0, 0
+; LA32-CONTRACT-ON-NEXT:    ret
+;
+; LA32-CONTRACT-OFF-LABEL: xvfmsub_d_contract:
+; LA32-CONTRACT-OFF:       # %bb.0: # %entry
+; LA32-CONTRACT-OFF-NEXT:    xvld $xr0, $a1, 0
+; LA32-CONTRACT-OFF-NEXT:    xvld $xr1, $a2, 0
+; LA32-CONTRACT-OFF-NEXT:    xvld $xr2, $a3, 0
+; LA32-CONTRACT-OFF-NEXT:    xvfmsub.d $xr0, $xr0, $xr1, $xr2
+; LA32-CONTRACT-OFF-NEXT:    xvst $xr0, $a0, 0
+; LA32-CONTRACT-OFF-NEXT:    ret
+;
+; LA64-CONTRACT-FAST-LABEL: xvfmsub_d_contract:
+; LA64-CONTRACT-FAST:       # %bb.0: # %entry
+; LA64-CONTRACT-FAST-NEXT:    xvld $xr0, $a1, 0
+; LA64-CONTRACT-FAST-NEXT:    xvld $xr1, $a2, 0
+; LA64-CONTRACT-FAST-NEXT:    xvld $xr2, $a3, 0
+; LA64-CONTRACT-FAST-NEXT:    xvfmsub.d $xr0, $xr0, $xr1, $xr2
+; LA64-CONTRACT-FAST-NEXT:    xvst $xr0, $a0, 0
+; LA64-CONTRACT-FAST-NEXT:    ret
+;
+; LA64-CONTRACT-ON-LABEL: xvfmsub_d_contract:
+; LA64-CONTRACT-ON:       # %bb.0: # %entry
+; LA64-CONTRACT-ON-NEXT:    xvld $xr0, $a1, 0
+; LA64-CONTRACT-ON-NEXT:    xvld $xr1, $a2, 0
+; LA64-CONTRACT-ON-NEXT:    xvld $xr2, $a3, 0
+; LA64-CONTRACT-ON-NEXT:    xvfmsub.d $xr0, $xr0, $xr1, $xr2
+; LA64-CONTRACT-ON-NEXT:    xvst $xr0, $a0, 0
+; LA64-CONTRACT-ON-NEXT:    ret
+;
+; LA64-CONTRACT-OFF-LABEL: xvfmsub_d_contract:
+; LA64-CONTRACT-OFF:       # %bb.0: # %entry
+; LA64-CONTRACT-OFF-NEXT:    xvld $xr0, $a1, 0
+; LA64-CONTRACT-OFF-NEXT:    xvld $xr1, $a2, 0
+; LA64-CONTRACT-OFF-NEXT:    xvld $xr2, $a3, 0
+; LA64-CONTRACT-OFF-NEXT:    xvfmsub.d $xr0, $xr0, $xr1, $xr2
+; LA64-CONTRACT-OFF-NEXT:    xvst $xr0, $a0, 0
+; LA64-CONTRACT-OFF-NEXT:    ret
 entry:
   %v0 = load <4 x double>, ptr %a0
   %v1 = load <4 x double>, ptr %a1
@@ -559,23 +1251,59 @@ entry:
 }
 
 define void @xvfnmadd_d_contract(ptr %res, ptr %a0, ptr %a1, ptr %a2) nounwind {
-; LA32-CONTRACT-LABEL: xvfnmadd_d_contract:
-; LA32-CONTRACT:       # %bb.0: # %entry
-; LA32-CONTRACT-NEXT:    xvld $xr0, $a1, 0
-; LA32-CONTRACT-NEXT:    xvld $xr1, $a2, 0
-; LA32-CONTRACT-NEXT:    xvld $xr2, $a3, 0
-; LA32-CONTRACT-NEXT:    xvfnmadd.d $xr0, $xr0, $xr1, $xr2
-; LA32-CONTRACT-NEXT:    xvst $xr0, $a0, 0
-; LA32-CONTRACT-NEXT:    ret
-;
-; LA64-CONTRACT-LABEL: xvfnmadd_d_contract:
-; LA64-CONTRACT:       # %bb.0: # %entry
-; LA64-CONTRACT-NEXT:    xvld $xr0, $a1, 0
-; LA64-CONTRACT-NEXT:    xvld $xr1, $a2, 0
-; LA64-CONTRACT-NEXT:    xvld $xr2, $a3, 0
-; LA64-CONTRACT-NEXT:    xvfnmadd.d $xr0, $xr0, $xr1, $xr2
-; LA64-CONTRACT-NEXT:    xvst $xr0, $a0, 0
-; LA64-CONTRACT-NEXT:    ret
+; LA32-CONTRACT-FAST-LABEL: xvfnmadd_d_contract:
+; LA32-CONTRACT-FAST:       # %bb.0: # %entry
+; LA32-CONTRACT-FAST-NEXT:    xvld $xr0, $a1, 0
+; LA32-CONTRACT-FAST-NEXT:    xvld $xr1, $a2, 0
+; LA32-CONTRACT-FAST-NEXT:    xvld $xr2, $a3, 0
+; LA32-CONTRACT-FAST-NEXT:    xvfnmadd.d $xr0, $xr0, $xr1, $xr2
+; LA32-CONTRACT-FAST-NEXT:    xvst $xr0, $a0, 0
+; LA32-CONTRACT-FAST-NEXT:    ret
+;
+; LA32-CONTRACT-ON-LABEL: xvfnmadd_d_contract:
+; LA32-CONTRACT-ON:       # %bb.0: # %entry
+; LA32-CONTRACT-ON-NEXT:    xvld $xr0, $a1, 0
+; LA32-CONTRACT-ON-NEXT:    xvld $xr1, $a2, 0
+; LA32-CONTRACT-ON-NEXT:    xvld $xr2, $a3, 0
+; LA32-CONTRACT-ON-NEXT:    xvfnmadd.d $xr0, $xr0, $xr1, $xr2
+; LA32-CONTRACT-ON-NEXT:    xvst $xr0, $a0, 0
+; LA32-CONTRACT-ON-NEXT:    ret
+;
+; LA32-CONTRACT-OFF-LABEL: xvfnmadd_d_contract:
+; LA32-CONTRACT-OFF:       # %bb.0: # %entry
+; LA32-CONTRACT-OFF-NEXT:    xvld $xr0, $a1, 0
+; LA32-CONTRACT-OFF-NEXT:    xvld $xr1, $a2, 0
+; LA32-CONTRACT-OFF-NEXT:    xvld $xr2, $a3, 0
+; LA32-CONTRACT-OFF-NEXT:    xvfnmadd.d $xr0, $xr0, $xr1, $xr2
+; LA32-CONTRACT-OFF-NEXT:    xvst $xr0, $a0, 0
+; LA32-CONTRACT-OFF-NEXT:    ret
+;
+; LA64-CONTRACT-FAST-LABEL: xvfnmadd_d_contract:
+; LA64-CONTRACT-FAST:       # %bb.0: # %entry
+; LA64-CONTRACT-FAST-NEXT:    xvld $xr0, $a1, 0
+; LA64-CONTRACT-FAST-NEXT:    xvld $xr1, $a2, 0
+; LA64-CONTRACT-FAST-NEXT:    xvld $xr2, $a3, 0
+; LA64-CONTRACT-FAST-NEXT:    xvfnmadd.d $xr0, $xr0, $xr1, $xr2
+; LA64-CONTRACT-FAST-NEXT:    xvst $xr0, $a0, 0
+; LA64-CONTRACT-FAST-NEXT:    ret
+;
+; LA64-CONTRACT-ON-LABEL: xvfnmadd_d_contract:
+; LA64-CONTRACT-ON:       # %bb.0: # %entry
+; LA64-CONTRACT-ON-NEXT:    xvld $xr0, $a1, 0
+; LA64-CONTRACT-ON-NEXT:    xvld $xr1, $a2, 0
+; LA64-CONTRACT-ON-NEXT:    xvld $xr2, $a3, 0
+; LA64-CONTRACT-ON-NEXT:    xvfnmadd.d $xr0, $xr0, $xr1, $xr2
+; LA64-CONTRACT-ON-NEXT:    xvst $xr0, $a0, 0
+; LA64-CONTRACT-ON-NEXT:    ret
+;
+; LA64-CONTRACT-OFF-LABEL: xvfnmadd_d_contract:
+; LA64-CONTRACT-OFF:       # %bb.0: # %entry
+; LA64-CONTRACT-OFF-NEXT:    xvld $xr0, $a1, 0
+; LA64-CONTRACT-OFF-NEXT:    xvld $xr1, $a2, 0
+; LA64-CONTRACT-OFF-NEXT:    xvld $xr2, $a3, 0
+; LA64-CONTRACT-OFF-NEXT:    xvfnmadd.d $xr0, $xr0, $xr1, $xr2
+; LA64-CONTRACT-OFF-NEXT:    xvst $xr0, $a0, 0
+; LA64-CONTRACT-OFF-NEXT:    ret
 entry:
   %v0 = load <4 x double>, ptr %a0
   %v1 = load <4 x double>, ptr %a1
@@ -588,23 +1316,59 @@ entry:
 }
 
 define void @xvfnmsub_d_contract(ptr %res, ptr %a0, ptr %a1, ptr %a2) nounwind {
-; LA32-CONTRACT-LABEL: xvfnmsub_d_contract:
-; LA32-CONTRACT:       # %bb.0: # %entry
-; LA32-CONTRACT-NEXT:    xvld $xr0, $a1, 0
-; LA32-CONTRACT-NEXT:    xvld $xr1, $a2, 0
-; LA32-CONTRACT-NEXT:    xvld $xr2, $a3, 0
-; LA32-CONTRACT-NEXT:    xvfnmsub.d $xr0, $xr0, $xr1, $xr2
-; LA32-CONTRACT-NEXT:    xvst $xr0, $a0, 0
-; LA32-CONTRACT-NEXT:    ret
-;
-; LA64-CONTRACT-LABEL: xvfnmsub_d_contract:
-; LA64-CONTRACT:       # %bb.0: # %entry
-; LA64-CONTRACT-NEXT:    xvld $xr0, $a1, 0
-; LA64-CONTRACT-NEXT:    xvld $xr1, $a2, 0
-; LA64-CONTRACT-NEXT:    xvld $xr2, $a3, 0
-; LA64-CONTRACT-NEXT:    xvfnmsub.d $xr0, $xr0, $xr1, $xr2
-; LA64-CONTRACT-NEXT:    xvst $xr0, $a0, 0
-; LA64-CONTRACT-NEXT:    ret
+; LA32-CONTRACT-FAST-LABEL: xvfnmsub_d_contract:
+; LA32-CONTRACT-FAST:       # %bb.0: # %entry
+; LA32-CONTRACT-FAST-NEXT:    xvld $xr0, $a1, 0
+; LA32-CONTRACT-FAST-NEXT:    xvld $xr1, $a2, 0
+; LA32-CONTRACT-FAST-NEXT:    xvld $xr2, $a3, 0
+; LA32-CONTRACT-FAST-NEXT:    xvfnmsub.d $xr0, $xr0, $xr1, $xr2
+; LA32-CONTRACT-FAST-NEXT:    xvst $xr0, $a0, 0
+; LA32-CONTRACT-FAST-NEXT:    ret
+;
+; LA32-CONTRACT-ON-LABEL: xvfnmsub_d_contract:
+; LA32-CONTRACT-ON:       # %bb.0: # %entry
+; LA32-CONTRACT-ON-NEXT:    xvld $xr0, $a1, 0
+; LA32-CONTRACT-ON-NEXT:    xvld $xr1, $a2, 0
+; LA32-CONTRACT-ON-NEXT:    xvld $xr2, $a3, 0
+; LA32-CONTRACT-ON-NEXT:    xvfnmsub.d $xr0, $xr0, $xr1, $xr2
+; LA32-CONTRACT-ON-NEXT:    xvst $xr0, $a0, 0
+; LA32-CONTRACT-ON-NEXT:    ret
+;
+; LA32-CONTRACT-OFF-LABEL: xvfnmsub_d_contract:
+; LA32-CONTRACT-OFF:       # %bb.0: # %entry
+; LA32-CONTRACT-OFF-NEXT:    xvld $xr0, $a1, 0
+; LA32-CONTRACT-OFF-NEXT:    xvld $xr1, $a2, 0
+; LA32-CONTRACT-OFF-NEXT:    xvld $xr2, $a3, 0
+; LA32-CONTRACT-OFF-NEXT:    xvfnmsub.d $xr0, $xr0, $xr1, $xr2
+; LA32-CONTRACT-OFF-NEXT:    xvst $xr0, $a0, 0
+; LA32-CONTRACT-OFF-NEXT:    ret
+;
+; LA64-CONTRACT-FAST-LABEL: xvfnmsub_d_contract:
+; LA64-CONTRACT-FAST:       # %bb.0: # %entry
+; LA64-CONTRACT-FAST-NEXT:    xvld $xr0, $a1, 0
+; LA64-CONTRACT-FAST-NEXT:    xvld $xr1, $a2, 0
+; LA64-CONTRACT-FAST-NEXT:    xvld $xr2, $a3, 0
+; LA64-CONTRACT-FAST-NEXT:    xvfnmsub.d $xr0, $xr0, $xr1, $xr2
+; LA64-CONTRACT-FAST-NEXT:    xvst $xr0, $a0, 0
+; LA64-CONTRACT-FAST-NEXT:    ret
+;
+; LA64-CONTRACT-ON-LABEL: xvfnmsub_d_contract:
+; LA64-CONTRACT-ON:       # %bb.0: # %entry
+; LA64-CONTRACT-ON-NEXT:    xvld $xr0, $a1, 0
+; LA64-CONTRACT-ON-NEXT:    xvld $xr1, $a2, 0
+; LA64-CONTRACT-ON-NEXT:    xvld $xr2, $a3, 0
+; LA64-CONTRACT-ON-NEXT:    xvfnmsub.d $xr0, $xr0, $xr1, $xr2
+; LA64-CONTRACT-ON-NEXT:    xvst $xr0, $a0, 0
+; LA64-CONTRACT-ON-NEXT:    ret
+;
+; LA64-CONTRACT-OFF-LABEL: xvfnmsub_d_contract:
+; LA64-CONTRACT-OFF:       # %bb.0: # %entry
+; LA64-CONTRACT-OFF-NEXT:    xvld $xr0, $a1, 0
+; LA64-CONTRACT-OFF-NEXT:    xvld $xr1, $a2, 0
+; LA64-CONTRACT-OFF-NEXT:    xvld $xr2, $a3, 0
+; LA64-CONTRACT-OFF-NEXT:    xvfnmsub.d $xr0, $xr0, $xr1, $xr2
+; LA64-CONTRACT-OFF-NEXT:    xvst $xr0, $a0, 0
+; LA64-CONTRACT-OFF-NEXT:    ret
 entry:
   %v0 = load <4 x double>, ptr %a0
   %v1 = load <4 x double>, ptr %a1

diff  --git a/llvm/test/CodeGen/LoongArch/lasx/fma-v8f32.ll b/llvm/test/CodeGen/LoongArch/lasx/fma-v8f32.ll
index a74dc007694b3..57b283801675b 100644
--- a/llvm/test/CodeGen/LoongArch/lasx/fma-v8f32.ll
+++ b/llvm/test/CodeGen/LoongArch/lasx/fma-v8f32.ll
@@ -1,29 +1,75 @@
 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
-; RUN: llc --mtriple=loongarch32 --mattr=+32s,+lasx < %s \
-; RUN:   | FileCheck %s --check-prefix=LA32-CONTRACT
-; RUN: llc --mtriple=loongarch64 --mattr=+lasx < %s \
-; RUN:   | FileCheck %s --check-prefix=LA64-CONTRACT
+; RUN: llc --mtriple=loongarch32 --mattr=+32s,+lasx --fp-contract=fast < %s \
+; RUN:   | FileCheck %s --check-prefix=LA32-CONTRACT-FAST
+; RUN: llc --mtriple=loongarch32 --mattr=+32s,+lasx --fp-contract=on < %s \
+; RUN:   | FileCheck %s --check-prefix=LA32-CONTRACT-ON
+; RUN: llc --mtriple=loongarch32 --mattr=+32s,+lasx --fp-contract=off < %s \
+; RUN:   | FileCheck %s --check-prefix=LA32-CONTRACT-OFF
+; RUN: llc --mtriple=loongarch64 --mattr=+lasx --fp-contract=fast < %s \
+; RUN:   | FileCheck %s --check-prefix=LA64-CONTRACT-FAST
+; RUN: llc --mtriple=loongarch64 --mattr=+lasx --fp-contract=on < %s \
+; RUN:   | FileCheck %s --check-prefix=LA64-CONTRACT-ON
+; RUN: llc --mtriple=loongarch64 --mattr=+lasx --fp-contract=off < %s \
+; RUN:   | FileCheck %s --check-prefix=LA64-CONTRACT-OFF
 
 define void @xvfmadd_s(ptr %res, ptr %a0, ptr %a1, ptr %a2) nounwind {
-; LA32-CONTRACT-LABEL: xvfmadd_s:
-; LA32-CONTRACT:       # %bb.0: # %entry
-; LA32-CONTRACT-NEXT:    xvld $xr0, $a1, 0
-; LA32-CONTRACT-NEXT:    xvld $xr1, $a2, 0
-; LA32-CONTRACT-NEXT:    xvld $xr2, $a3, 0
-; LA32-CONTRACT-NEXT:    xvfmul.s $xr0, $xr0, $xr1
-; LA32-CONTRACT-NEXT:    xvfadd.s $xr0, $xr0, $xr2
-; LA32-CONTRACT-NEXT:    xvst $xr0, $a0, 0
-; LA32-CONTRACT-NEXT:    ret
-;
-; LA64-CONTRACT-LABEL: xvfmadd_s:
-; LA64-CONTRACT:       # %bb.0: # %entry
-; LA64-CONTRACT-NEXT:    xvld $xr0, $a1, 0
-; LA64-CONTRACT-NEXT:    xvld $xr1, $a2, 0
-; LA64-CONTRACT-NEXT:    xvld $xr2, $a3, 0
-; LA64-CONTRACT-NEXT:    xvfmul.s $xr0, $xr0, $xr1
-; LA64-CONTRACT-NEXT:    xvfadd.s $xr0, $xr0, $xr2
-; LA64-CONTRACT-NEXT:    xvst $xr0, $a0, 0
-; LA64-CONTRACT-NEXT:    ret
+; LA32-CONTRACT-FAST-LABEL: xvfmadd_s:
+; LA32-CONTRACT-FAST:       # %bb.0: # %entry
+; LA32-CONTRACT-FAST-NEXT:    xvld $xr0, $a1, 0
+; LA32-CONTRACT-FAST-NEXT:    xvld $xr1, $a2, 0
+; LA32-CONTRACT-FAST-NEXT:    xvld $xr2, $a3, 0
+; LA32-CONTRACT-FAST-NEXT:    xvfmadd.s $xr0, $xr0, $xr1, $xr2
+; LA32-CONTRACT-FAST-NEXT:    xvst $xr0, $a0, 0
+; LA32-CONTRACT-FAST-NEXT:    ret
+;
+; LA32-CONTRACT-ON-LABEL: xvfmadd_s:
+; LA32-CONTRACT-ON:       # %bb.0: # %entry
+; LA32-CONTRACT-ON-NEXT:    xvld $xr0, $a1, 0
+; LA32-CONTRACT-ON-NEXT:    xvld $xr1, $a2, 0
+; LA32-CONTRACT-ON-NEXT:    xvld $xr2, $a3, 0
+; LA32-CONTRACT-ON-NEXT:    xvfmul.s $xr0, $xr0, $xr1
+; LA32-CONTRACT-ON-NEXT:    xvfadd.s $xr0, $xr0, $xr2
+; LA32-CONTRACT-ON-NEXT:    xvst $xr0, $a0, 0
+; LA32-CONTRACT-ON-NEXT:    ret
+;
+; LA32-CONTRACT-OFF-LABEL: xvfmadd_s:
+; LA32-CONTRACT-OFF:       # %bb.0: # %entry
+; LA32-CONTRACT-OFF-NEXT:    xvld $xr0, $a1, 0
+; LA32-CONTRACT-OFF-NEXT:    xvld $xr1, $a2, 0
+; LA32-CONTRACT-OFF-NEXT:    xvld $xr2, $a3, 0
+; LA32-CONTRACT-OFF-NEXT:    xvfmul.s $xr0, $xr0, $xr1
+; LA32-CONTRACT-OFF-NEXT:    xvfadd.s $xr0, $xr0, $xr2
+; LA32-CONTRACT-OFF-NEXT:    xvst $xr0, $a0, 0
+; LA32-CONTRACT-OFF-NEXT:    ret
+;
+; LA64-CONTRACT-FAST-LABEL: xvfmadd_s:
+; LA64-CONTRACT-FAST:       # %bb.0: # %entry
+; LA64-CONTRACT-FAST-NEXT:    xvld $xr0, $a1, 0
+; LA64-CONTRACT-FAST-NEXT:    xvld $xr1, $a2, 0
+; LA64-CONTRACT-FAST-NEXT:    xvld $xr2, $a3, 0
+; LA64-CONTRACT-FAST-NEXT:    xvfmadd.s $xr0, $xr0, $xr1, $xr2
+; LA64-CONTRACT-FAST-NEXT:    xvst $xr0, $a0, 0
+; LA64-CONTRACT-FAST-NEXT:    ret
+;
+; LA64-CONTRACT-ON-LABEL: xvfmadd_s:
+; LA64-CONTRACT-ON:       # %bb.0: # %entry
+; LA64-CONTRACT-ON-NEXT:    xvld $xr0, $a1, 0
+; LA64-CONTRACT-ON-NEXT:    xvld $xr1, $a2, 0
+; LA64-CONTRACT-ON-NEXT:    xvld $xr2, $a3, 0
+; LA64-CONTRACT-ON-NEXT:    xvfmul.s $xr0, $xr0, $xr1
+; LA64-CONTRACT-ON-NEXT:    xvfadd.s $xr0, $xr0, $xr2
+; LA64-CONTRACT-ON-NEXT:    xvst $xr0, $a0, 0
+; LA64-CONTRACT-ON-NEXT:    ret
+;
+; LA64-CONTRACT-OFF-LABEL: xvfmadd_s:
+; LA64-CONTRACT-OFF:       # %bb.0: # %entry
+; LA64-CONTRACT-OFF-NEXT:    xvld $xr0, $a1, 0
+; LA64-CONTRACT-OFF-NEXT:    xvld $xr1, $a2, 0
+; LA64-CONTRACT-OFF-NEXT:    xvld $xr2, $a3, 0
+; LA64-CONTRACT-OFF-NEXT:    xvfmul.s $xr0, $xr0, $xr1
+; LA64-CONTRACT-OFF-NEXT:    xvfadd.s $xr0, $xr0, $xr2
+; LA64-CONTRACT-OFF-NEXT:    xvst $xr0, $a0, 0
+; LA64-CONTRACT-OFF-NEXT:    ret
 entry:
   %v0 = load <8 x float>, ptr %a0
   %v1 = load <8 x float>, ptr %a1
@@ -35,25 +81,63 @@ entry:
 }
 
 define void @xvfmsub_s(ptr %res, ptr %a0, ptr %a1, ptr %a2) nounwind {
-; LA32-CONTRACT-LABEL: xvfmsub_s:
-; LA32-CONTRACT:       # %bb.0: # %entry
-; LA32-CONTRACT-NEXT:    xvld $xr0, $a1, 0
-; LA32-CONTRACT-NEXT:    xvld $xr1, $a2, 0
-; LA32-CONTRACT-NEXT:    xvld $xr2, $a3, 0
-; LA32-CONTRACT-NEXT:    xvfmul.s $xr0, $xr0, $xr1
-; LA32-CONTRACT-NEXT:    xvfsub.s $xr0, $xr0, $xr2
-; LA32-CONTRACT-NEXT:    xvst $xr0, $a0, 0
-; LA32-CONTRACT-NEXT:    ret
-;
-; LA64-CONTRACT-LABEL: xvfmsub_s:
-; LA64-CONTRACT:       # %bb.0: # %entry
-; LA64-CONTRACT-NEXT:    xvld $xr0, $a1, 0
-; LA64-CONTRACT-NEXT:    xvld $xr1, $a2, 0
-; LA64-CONTRACT-NEXT:    xvld $xr2, $a3, 0
-; LA64-CONTRACT-NEXT:    xvfmul.s $xr0, $xr0, $xr1
-; LA64-CONTRACT-NEXT:    xvfsub.s $xr0, $xr0, $xr2
-; LA64-CONTRACT-NEXT:    xvst $xr0, $a0, 0
-; LA64-CONTRACT-NEXT:    ret
+; LA32-CONTRACT-FAST-LABEL: xvfmsub_s:
+; LA32-CONTRACT-FAST:       # %bb.0: # %entry
+; LA32-CONTRACT-FAST-NEXT:    xvld $xr0, $a1, 0
+; LA32-CONTRACT-FAST-NEXT:    xvld $xr1, $a2, 0
+; LA32-CONTRACT-FAST-NEXT:    xvld $xr2, $a3, 0
+; LA32-CONTRACT-FAST-NEXT:    xvfmsub.s $xr0, $xr0, $xr1, $xr2
+; LA32-CONTRACT-FAST-NEXT:    xvst $xr0, $a0, 0
+; LA32-CONTRACT-FAST-NEXT:    ret
+;
+; LA32-CONTRACT-ON-LABEL: xvfmsub_s:
+; LA32-CONTRACT-ON:       # %bb.0: # %entry
+; LA32-CONTRACT-ON-NEXT:    xvld $xr0, $a1, 0
+; LA32-CONTRACT-ON-NEXT:    xvld $xr1, $a2, 0
+; LA32-CONTRACT-ON-NEXT:    xvld $xr2, $a3, 0
+; LA32-CONTRACT-ON-NEXT:    xvfmul.s $xr0, $xr0, $xr1
+; LA32-CONTRACT-ON-NEXT:    xvfsub.s $xr0, $xr0, $xr2
+; LA32-CONTRACT-ON-NEXT:    xvst $xr0, $a0, 0
+; LA32-CONTRACT-ON-NEXT:    ret
+;
+; LA32-CONTRACT-OFF-LABEL: xvfmsub_s:
+; LA32-CONTRACT-OFF:       # %bb.0: # %entry
+; LA32-CONTRACT-OFF-NEXT:    xvld $xr0, $a1, 0
+; LA32-CONTRACT-OFF-NEXT:    xvld $xr1, $a2, 0
+; LA32-CONTRACT-OFF-NEXT:    xvld $xr2, $a3, 0
+; LA32-CONTRACT-OFF-NEXT:    xvfmul.s $xr0, $xr0, $xr1
+; LA32-CONTRACT-OFF-NEXT:    xvfsub.s $xr0, $xr0, $xr2
+; LA32-CONTRACT-OFF-NEXT:    xvst $xr0, $a0, 0
+; LA32-CONTRACT-OFF-NEXT:    ret
+;
+; LA64-CONTRACT-FAST-LABEL: xvfmsub_s:
+; LA64-CONTRACT-FAST:       # %bb.0: # %entry
+; LA64-CONTRACT-FAST-NEXT:    xvld $xr0, $a1, 0
+; LA64-CONTRACT-FAST-NEXT:    xvld $xr1, $a2, 0
+; LA64-CONTRACT-FAST-NEXT:    xvld $xr2, $a3, 0
+; LA64-CONTRACT-FAST-NEXT:    xvfmsub.s $xr0, $xr0, $xr1, $xr2
+; LA64-CONTRACT-FAST-NEXT:    xvst $xr0, $a0, 0
+; LA64-CONTRACT-FAST-NEXT:    ret
+;
+; LA64-CONTRACT-ON-LABEL: xvfmsub_s:
+; LA64-CONTRACT-ON:       # %bb.0: # %entry
+; LA64-CONTRACT-ON-NEXT:    xvld $xr0, $a1, 0
+; LA64-CONTRACT-ON-NEXT:    xvld $xr1, $a2, 0
+; LA64-CONTRACT-ON-NEXT:    xvld $xr2, $a3, 0
+; LA64-CONTRACT-ON-NEXT:    xvfmul.s $xr0, $xr0, $xr1
+; LA64-CONTRACT-ON-NEXT:    xvfsub.s $xr0, $xr0, $xr2
+; LA64-CONTRACT-ON-NEXT:    xvst $xr0, $a0, 0
+; LA64-CONTRACT-ON-NEXT:    ret
+;
+; LA64-CONTRACT-OFF-LABEL: xvfmsub_s:
+; LA64-CONTRACT-OFF:       # %bb.0: # %entry
+; LA64-CONTRACT-OFF-NEXT:    xvld $xr0, $a1, 0
+; LA64-CONTRACT-OFF-NEXT:    xvld $xr1, $a2, 0
+; LA64-CONTRACT-OFF-NEXT:    xvld $xr2, $a3, 0
+; LA64-CONTRACT-OFF-NEXT:    xvfmul.s $xr0, $xr0, $xr1
+; LA64-CONTRACT-OFF-NEXT:    xvfsub.s $xr0, $xr0, $xr2
+; LA64-CONTRACT-OFF-NEXT:    xvst $xr0, $a0, 0
+; LA64-CONTRACT-OFF-NEXT:    ret
 entry:
   %v0 = load <8 x float>, ptr %a0
   %v1 = load <8 x float>, ptr %a1
@@ -65,27 +149,67 @@ entry:
 }
 
 define void @xvfnmadd_s(ptr %res, ptr %a0, ptr %a1, ptr %a2) nounwind {
-; LA32-CONTRACT-LABEL: xvfnmadd_s:
-; LA32-CONTRACT:       # %bb.0: # %entry
-; LA32-CONTRACT-NEXT:    xvld $xr0, $a1, 0
-; LA32-CONTRACT-NEXT:    xvld $xr1, $a2, 0
-; LA32-CONTRACT-NEXT:    xvld $xr2, $a3, 0
-; LA32-CONTRACT-NEXT:    xvfmul.s $xr0, $xr0, $xr1
-; LA32-CONTRACT-NEXT:    xvfadd.s $xr0, $xr0, $xr2
-; LA32-CONTRACT-NEXT:    xvbitrevi.w $xr0, $xr0, 31
-; LA32-CONTRACT-NEXT:    xvst $xr0, $a0, 0
-; LA32-CONTRACT-NEXT:    ret
-;
-; LA64-CONTRACT-LABEL: xvfnmadd_s:
-; LA64-CONTRACT:       # %bb.0: # %entry
-; LA64-CONTRACT-NEXT:    xvld $xr0, $a1, 0
-; LA64-CONTRACT-NEXT:    xvld $xr1, $a2, 0
-; LA64-CONTRACT-NEXT:    xvld $xr2, $a3, 0
-; LA64-CONTRACT-NEXT:    xvfmul.s $xr0, $xr0, $xr1
-; LA64-CONTRACT-NEXT:    xvfadd.s $xr0, $xr0, $xr2
-; LA64-CONTRACT-NEXT:    xvbitrevi.w $xr0, $xr0, 31
-; LA64-CONTRACT-NEXT:    xvst $xr0, $a0, 0
-; LA64-CONTRACT-NEXT:    ret
+; LA32-CONTRACT-FAST-LABEL: xvfnmadd_s:
+; LA32-CONTRACT-FAST:       # %bb.0: # %entry
+; LA32-CONTRACT-FAST-NEXT:    xvld $xr0, $a1, 0
+; LA32-CONTRACT-FAST-NEXT:    xvld $xr1, $a2, 0
+; LA32-CONTRACT-FAST-NEXT:    xvld $xr2, $a3, 0
+; LA32-CONTRACT-FAST-NEXT:    xvfnmadd.s $xr0, $xr0, $xr1, $xr2
+; LA32-CONTRACT-FAST-NEXT:    xvst $xr0, $a0, 0
+; LA32-CONTRACT-FAST-NEXT:    ret
+;
+; LA32-CONTRACT-ON-LABEL: xvfnmadd_s:
+; LA32-CONTRACT-ON:       # %bb.0: # %entry
+; LA32-CONTRACT-ON-NEXT:    xvld $xr0, $a1, 0
+; LA32-CONTRACT-ON-NEXT:    xvld $xr1, $a2, 0
+; LA32-CONTRACT-ON-NEXT:    xvld $xr2, $a3, 0
+; LA32-CONTRACT-ON-NEXT:    xvfmul.s $xr0, $xr0, $xr1
+; LA32-CONTRACT-ON-NEXT:    xvfadd.s $xr0, $xr0, $xr2
+; LA32-CONTRACT-ON-NEXT:    xvbitrevi.w $xr0, $xr0, 31
+; LA32-CONTRACT-ON-NEXT:    xvst $xr0, $a0, 0
+; LA32-CONTRACT-ON-NEXT:    ret
+;
+; LA32-CONTRACT-OFF-LABEL: xvfnmadd_s:
+; LA32-CONTRACT-OFF:       # %bb.0: # %entry
+; LA32-CONTRACT-OFF-NEXT:    xvld $xr0, $a1, 0
+; LA32-CONTRACT-OFF-NEXT:    xvld $xr1, $a2, 0
+; LA32-CONTRACT-OFF-NEXT:    xvld $xr2, $a3, 0
+; LA32-CONTRACT-OFF-NEXT:    xvfmul.s $xr0, $xr0, $xr1
+; LA32-CONTRACT-OFF-NEXT:    xvfadd.s $xr0, $xr0, $xr2
+; LA32-CONTRACT-OFF-NEXT:    xvbitrevi.w $xr0, $xr0, 31
+; LA32-CONTRACT-OFF-NEXT:    xvst $xr0, $a0, 0
+; LA32-CONTRACT-OFF-NEXT:    ret
+;
+; LA64-CONTRACT-FAST-LABEL: xvfnmadd_s:
+; LA64-CONTRACT-FAST:       # %bb.0: # %entry
+; LA64-CONTRACT-FAST-NEXT:    xvld $xr0, $a1, 0
+; LA64-CONTRACT-FAST-NEXT:    xvld $xr1, $a2, 0
+; LA64-CONTRACT-FAST-NEXT:    xvld $xr2, $a3, 0
+; LA64-CONTRACT-FAST-NEXT:    xvfnmadd.s $xr0, $xr0, $xr1, $xr2
+; LA64-CONTRACT-FAST-NEXT:    xvst $xr0, $a0, 0
+; LA64-CONTRACT-FAST-NEXT:    ret
+;
+; LA64-CONTRACT-ON-LABEL: xvfnmadd_s:
+; LA64-CONTRACT-ON:       # %bb.0: # %entry
+; LA64-CONTRACT-ON-NEXT:    xvld $xr0, $a1, 0
+; LA64-CONTRACT-ON-NEXT:    xvld $xr1, $a2, 0
+; LA64-CONTRACT-ON-NEXT:    xvld $xr2, $a3, 0
+; LA64-CONTRACT-ON-NEXT:    xvfmul.s $xr0, $xr0, $xr1
+; LA64-CONTRACT-ON-NEXT:    xvfadd.s $xr0, $xr0, $xr2
+; LA64-CONTRACT-ON-NEXT:    xvbitrevi.w $xr0, $xr0, 31
+; LA64-CONTRACT-ON-NEXT:    xvst $xr0, $a0, 0
+; LA64-CONTRACT-ON-NEXT:    ret
+;
+; LA64-CONTRACT-OFF-LABEL: xvfnmadd_s:
+; LA64-CONTRACT-OFF:       # %bb.0: # %entry
+; LA64-CONTRACT-OFF-NEXT:    xvld $xr0, $a1, 0
+; LA64-CONTRACT-OFF-NEXT:    xvld $xr1, $a2, 0
+; LA64-CONTRACT-OFF-NEXT:    xvld $xr2, $a3, 0
+; LA64-CONTRACT-OFF-NEXT:    xvfmul.s $xr0, $xr0, $xr1
+; LA64-CONTRACT-OFF-NEXT:    xvfadd.s $xr0, $xr0, $xr2
+; LA64-CONTRACT-OFF-NEXT:    xvbitrevi.w $xr0, $xr0, 31
+; LA64-CONTRACT-OFF-NEXT:    xvst $xr0, $a0, 0
+; LA64-CONTRACT-OFF-NEXT:    ret
 entry:
   %v0 = load <8 x float>, ptr %a0
   %v1 = load <8 x float>, ptr %a1
@@ -98,27 +222,67 @@ entry:
 }
 
 define void @xvfnmadd_s_nsz(ptr %res, ptr %a0, ptr %a1, ptr %a2) nounwind {
-; LA32-CONTRACT-LABEL: xvfnmadd_s_nsz:
-; LA32-CONTRACT:       # %bb.0: # %entry
-; LA32-CONTRACT-NEXT:    xvld $xr0, $a1, 0
-; LA32-CONTRACT-NEXT:    xvld $xr1, $a2, 0
-; LA32-CONTRACT-NEXT:    xvld $xr2, $a3, 0
-; LA32-CONTRACT-NEXT:    xvbitrevi.w $xr0, $xr0, 31
-; LA32-CONTRACT-NEXT:    xvfmul.s $xr0, $xr0, $xr1
-; LA32-CONTRACT-NEXT:    xvfsub.s $xr0, $xr0, $xr2
-; LA32-CONTRACT-NEXT:    xvst $xr0, $a0, 0
-; LA32-CONTRACT-NEXT:    ret
-;
-; LA64-CONTRACT-LABEL: xvfnmadd_s_nsz:
-; LA64-CONTRACT:       # %bb.0: # %entry
-; LA64-CONTRACT-NEXT:    xvld $xr0, $a1, 0
-; LA64-CONTRACT-NEXT:    xvld $xr1, $a2, 0
-; LA64-CONTRACT-NEXT:    xvld $xr2, $a3, 0
-; LA64-CONTRACT-NEXT:    xvbitrevi.w $xr0, $xr0, 31
-; LA64-CONTRACT-NEXT:    xvfmul.s $xr0, $xr0, $xr1
-; LA64-CONTRACT-NEXT:    xvfsub.s $xr0, $xr0, $xr2
-; LA64-CONTRACT-NEXT:    xvst $xr0, $a0, 0
-; LA64-CONTRACT-NEXT:    ret
+; LA32-CONTRACT-FAST-LABEL: xvfnmadd_s_nsz:
+; LA32-CONTRACT-FAST:       # %bb.0: # %entry
+; LA32-CONTRACT-FAST-NEXT:    xvld $xr0, $a1, 0
+; LA32-CONTRACT-FAST-NEXT:    xvld $xr1, $a2, 0
+; LA32-CONTRACT-FAST-NEXT:    xvld $xr2, $a3, 0
+; LA32-CONTRACT-FAST-NEXT:    xvfnmadd.s $xr0, $xr0, $xr1, $xr2
+; LA32-CONTRACT-FAST-NEXT:    xvst $xr0, $a0, 0
+; LA32-CONTRACT-FAST-NEXT:    ret
+;
+; LA32-CONTRACT-ON-LABEL: xvfnmadd_s_nsz:
+; LA32-CONTRACT-ON:       # %bb.0: # %entry
+; LA32-CONTRACT-ON-NEXT:    xvld $xr0, $a1, 0
+; LA32-CONTRACT-ON-NEXT:    xvld $xr1, $a2, 0
+; LA32-CONTRACT-ON-NEXT:    xvld $xr2, $a3, 0
+; LA32-CONTRACT-ON-NEXT:    xvbitrevi.w $xr0, $xr0, 31
+; LA32-CONTRACT-ON-NEXT:    xvfmul.s $xr0, $xr0, $xr1
+; LA32-CONTRACT-ON-NEXT:    xvfsub.s $xr0, $xr0, $xr2
+; LA32-CONTRACT-ON-NEXT:    xvst $xr0, $a0, 0
+; LA32-CONTRACT-ON-NEXT:    ret
+;
+; LA32-CONTRACT-OFF-LABEL: xvfnmadd_s_nsz:
+; LA32-CONTRACT-OFF:       # %bb.0: # %entry
+; LA32-CONTRACT-OFF-NEXT:    xvld $xr0, $a1, 0
+; LA32-CONTRACT-OFF-NEXT:    xvld $xr1, $a2, 0
+; LA32-CONTRACT-OFF-NEXT:    xvld $xr2, $a3, 0
+; LA32-CONTRACT-OFF-NEXT:    xvbitrevi.w $xr0, $xr0, 31
+; LA32-CONTRACT-OFF-NEXT:    xvfmul.s $xr0, $xr0, $xr1
+; LA32-CONTRACT-OFF-NEXT:    xvfsub.s $xr0, $xr0, $xr2
+; LA32-CONTRACT-OFF-NEXT:    xvst $xr0, $a0, 0
+; LA32-CONTRACT-OFF-NEXT:    ret
+;
+; LA64-CONTRACT-FAST-LABEL: xvfnmadd_s_nsz:
+; LA64-CONTRACT-FAST:       # %bb.0: # %entry
+; LA64-CONTRACT-FAST-NEXT:    xvld $xr0, $a1, 0
+; LA64-CONTRACT-FAST-NEXT:    xvld $xr1, $a2, 0
+; LA64-CONTRACT-FAST-NEXT:    xvld $xr2, $a3, 0
+; LA64-CONTRACT-FAST-NEXT:    xvfnmadd.s $xr0, $xr0, $xr1, $xr2
+; LA64-CONTRACT-FAST-NEXT:    xvst $xr0, $a0, 0
+; LA64-CONTRACT-FAST-NEXT:    ret
+;
+; LA64-CONTRACT-ON-LABEL: xvfnmadd_s_nsz:
+; LA64-CONTRACT-ON:       # %bb.0: # %entry
+; LA64-CONTRACT-ON-NEXT:    xvld $xr0, $a1, 0
+; LA64-CONTRACT-ON-NEXT:    xvld $xr1, $a2, 0
+; LA64-CONTRACT-ON-NEXT:    xvld $xr2, $a3, 0
+; LA64-CONTRACT-ON-NEXT:    xvbitrevi.w $xr0, $xr0, 31
+; LA64-CONTRACT-ON-NEXT:    xvfmul.s $xr0, $xr0, $xr1
+; LA64-CONTRACT-ON-NEXT:    xvfsub.s $xr0, $xr0, $xr2
+; LA64-CONTRACT-ON-NEXT:    xvst $xr0, $a0, 0
+; LA64-CONTRACT-ON-NEXT:    ret
+;
+; LA64-CONTRACT-OFF-LABEL: xvfnmadd_s_nsz:
+; LA64-CONTRACT-OFF:       # %bb.0: # %entry
+; LA64-CONTRACT-OFF-NEXT:    xvld $xr0, $a1, 0
+; LA64-CONTRACT-OFF-NEXT:    xvld $xr1, $a2, 0
+; LA64-CONTRACT-OFF-NEXT:    xvld $xr2, $a3, 0
+; LA64-CONTRACT-OFF-NEXT:    xvbitrevi.w $xr0, $xr0, 31
+; LA64-CONTRACT-OFF-NEXT:    xvfmul.s $xr0, $xr0, $xr1
+; LA64-CONTRACT-OFF-NEXT:    xvfsub.s $xr0, $xr0, $xr2
+; LA64-CONTRACT-OFF-NEXT:    xvst $xr0, $a0, 0
+; LA64-CONTRACT-OFF-NEXT:    ret
 entry:
   %v0 = load <8 x float>, ptr %a0
   %v1 = load <8 x float>, ptr %a1
@@ -133,27 +297,69 @@ entry:
 
 ;; Check that fnmadd.s is not emitted.
 define void @not_xvfnmadd_s(ptr %res, ptr %a0, ptr %a1, ptr %a2) nounwind {
-; LA32-CONTRACT-LABEL: not_xvfnmadd_s:
-; LA32-CONTRACT:       # %bb.0: # %entry
-; LA32-CONTRACT-NEXT:    xvld $xr0, $a1, 0
-; LA32-CONTRACT-NEXT:    xvld $xr1, $a2, 0
-; LA32-CONTRACT-NEXT:    xvld $xr2, $a3, 0
-; LA32-CONTRACT-NEXT:    xvbitrevi.w $xr0, $xr0, 31
-; LA32-CONTRACT-NEXT:    xvfmul.s $xr0, $xr0, $xr1
-; LA32-CONTRACT-NEXT:    xvfsub.s $xr0, $xr0, $xr2
-; LA32-CONTRACT-NEXT:    xvst $xr0, $a0, 0
-; LA32-CONTRACT-NEXT:    ret
-;
-; LA64-CONTRACT-LABEL: not_xvfnmadd_s:
-; LA64-CONTRACT:       # %bb.0: # %entry
-; LA64-CONTRACT-NEXT:    xvld $xr0, $a1, 0
-; LA64-CONTRACT-NEXT:    xvld $xr1, $a2, 0
-; LA64-CONTRACT-NEXT:    xvld $xr2, $a3, 0
-; LA64-CONTRACT-NEXT:    xvbitrevi.w $xr0, $xr0, 31
-; LA64-CONTRACT-NEXT:    xvfmul.s $xr0, $xr0, $xr1
-; LA64-CONTRACT-NEXT:    xvfsub.s $xr0, $xr0, $xr2
-; LA64-CONTRACT-NEXT:    xvst $xr0, $a0, 0
-; LA64-CONTRACT-NEXT:    ret
+; LA32-CONTRACT-FAST-LABEL: not_xvfnmadd_s:
+; LA32-CONTRACT-FAST:       # %bb.0: # %entry
+; LA32-CONTRACT-FAST-NEXT:    xvld $xr0, $a1, 0
+; LA32-CONTRACT-FAST-NEXT:    xvld $xr1, $a2, 0
+; LA32-CONTRACT-FAST-NEXT:    xvld $xr2, $a3, 0
+; LA32-CONTRACT-FAST-NEXT:    xvbitrevi.w $xr0, $xr0, 31
+; LA32-CONTRACT-FAST-NEXT:    xvfmsub.s $xr0, $xr0, $xr1, $xr2
+; LA32-CONTRACT-FAST-NEXT:    xvst $xr0, $a0, 0
+; LA32-CONTRACT-FAST-NEXT:    ret
+;
+; LA32-CONTRACT-ON-LABEL: not_xvfnmadd_s:
+; LA32-CONTRACT-ON:       # %bb.0: # %entry
+; LA32-CONTRACT-ON-NEXT:    xvld $xr0, $a1, 0
+; LA32-CONTRACT-ON-NEXT:    xvld $xr1, $a2, 0
+; LA32-CONTRACT-ON-NEXT:    xvld $xr2, $a3, 0
+; LA32-CONTRACT-ON-NEXT:    xvbitrevi.w $xr0, $xr0, 31
+; LA32-CONTRACT-ON-NEXT:    xvfmul.s $xr0, $xr0, $xr1
+; LA32-CONTRACT-ON-NEXT:    xvfsub.s $xr0, $xr0, $xr2
+; LA32-CONTRACT-ON-NEXT:    xvst $xr0, $a0, 0
+; LA32-CONTRACT-ON-NEXT:    ret
+;
+; LA32-CONTRACT-OFF-LABEL: not_xvfnmadd_s:
+; LA32-CONTRACT-OFF:       # %bb.0: # %entry
+; LA32-CONTRACT-OFF-NEXT:    xvld $xr0, $a1, 0
+; LA32-CONTRACT-OFF-NEXT:    xvld $xr1, $a2, 0
+; LA32-CONTRACT-OFF-NEXT:    xvld $xr2, $a3, 0
+; LA32-CONTRACT-OFF-NEXT:    xvbitrevi.w $xr0, $xr0, 31
+; LA32-CONTRACT-OFF-NEXT:    xvfmul.s $xr0, $xr0, $xr1
+; LA32-CONTRACT-OFF-NEXT:    xvfsub.s $xr0, $xr0, $xr2
+; LA32-CONTRACT-OFF-NEXT:    xvst $xr0, $a0, 0
+; LA32-CONTRACT-OFF-NEXT:    ret
+;
+; LA64-CONTRACT-FAST-LABEL: not_xvfnmadd_s:
+; LA64-CONTRACT-FAST:       # %bb.0: # %entry
+; LA64-CONTRACT-FAST-NEXT:    xvld $xr0, $a1, 0
+; LA64-CONTRACT-FAST-NEXT:    xvld $xr1, $a2, 0
+; LA64-CONTRACT-FAST-NEXT:    xvld $xr2, $a3, 0
+; LA64-CONTRACT-FAST-NEXT:    xvbitrevi.w $xr0, $xr0, 31
+; LA64-CONTRACT-FAST-NEXT:    xvfmsub.s $xr0, $xr0, $xr1, $xr2
+; LA64-CONTRACT-FAST-NEXT:    xvst $xr0, $a0, 0
+; LA64-CONTRACT-FAST-NEXT:    ret
+;
+; LA64-CONTRACT-ON-LABEL: not_xvfnmadd_s:
+; LA64-CONTRACT-ON:       # %bb.0: # %entry
+; LA64-CONTRACT-ON-NEXT:    xvld $xr0, $a1, 0
+; LA64-CONTRACT-ON-NEXT:    xvld $xr1, $a2, 0
+; LA64-CONTRACT-ON-NEXT:    xvld $xr2, $a3, 0
+; LA64-CONTRACT-ON-NEXT:    xvbitrevi.w $xr0, $xr0, 31
+; LA64-CONTRACT-ON-NEXT:    xvfmul.s $xr0, $xr0, $xr1
+; LA64-CONTRACT-ON-NEXT:    xvfsub.s $xr0, $xr0, $xr2
+; LA64-CONTRACT-ON-NEXT:    xvst $xr0, $a0, 0
+; LA64-CONTRACT-ON-NEXT:    ret
+;
+; LA64-CONTRACT-OFF-LABEL: not_xvfnmadd_s:
+; LA64-CONTRACT-OFF:       # %bb.0: # %entry
+; LA64-CONTRACT-OFF-NEXT:    xvld $xr0, $a1, 0
+; LA64-CONTRACT-OFF-NEXT:    xvld $xr1, $a2, 0
+; LA64-CONTRACT-OFF-NEXT:    xvld $xr2, $a3, 0
+; LA64-CONTRACT-OFF-NEXT:    xvbitrevi.w $xr0, $xr0, 31
+; LA64-CONTRACT-OFF-NEXT:    xvfmul.s $xr0, $xr0, $xr1
+; LA64-CONTRACT-OFF-NEXT:    xvfsub.s $xr0, $xr0, $xr2
+; LA64-CONTRACT-OFF-NEXT:    xvst $xr0, $a0, 0
+; LA64-CONTRACT-OFF-NEXT:    ret
 entry:
   %v0 = load <8 x float>, ptr %a0
   %v1 = load <8 x float>, ptr %a1
@@ -167,27 +373,67 @@ entry:
 }
 
 define void @xvfnmsub_s(ptr %res, ptr %a0, ptr %a1, ptr %a2) nounwind {
-; LA32-CONTRACT-LABEL: xvfnmsub_s:
-; LA32-CONTRACT:       # %bb.0: # %entry
-; LA32-CONTRACT-NEXT:    xvld $xr0, $a1, 0
-; LA32-CONTRACT-NEXT:    xvld $xr1, $a2, 0
-; LA32-CONTRACT-NEXT:    xvld $xr2, $a3, 0
-; LA32-CONTRACT-NEXT:    xvfmul.s $xr0, $xr0, $xr1
-; LA32-CONTRACT-NEXT:    xvfsub.s $xr0, $xr0, $xr2
-; LA32-CONTRACT-NEXT:    xvbitrevi.w $xr0, $xr0, 31
-; LA32-CONTRACT-NEXT:    xvst $xr0, $a0, 0
-; LA32-CONTRACT-NEXT:    ret
-;
-; LA64-CONTRACT-LABEL: xvfnmsub_s:
-; LA64-CONTRACT:       # %bb.0: # %entry
-; LA64-CONTRACT-NEXT:    xvld $xr0, $a1, 0
-; LA64-CONTRACT-NEXT:    xvld $xr1, $a2, 0
-; LA64-CONTRACT-NEXT:    xvld $xr2, $a3, 0
-; LA64-CONTRACT-NEXT:    xvfmul.s $xr0, $xr0, $xr1
-; LA64-CONTRACT-NEXT:    xvfsub.s $xr0, $xr0, $xr2
-; LA64-CONTRACT-NEXT:    xvbitrevi.w $xr0, $xr0, 31
-; LA64-CONTRACT-NEXT:    xvst $xr0, $a0, 0
-; LA64-CONTRACT-NEXT:    ret
+; LA32-CONTRACT-FAST-LABEL: xvfnmsub_s:
+; LA32-CONTRACT-FAST:       # %bb.0: # %entry
+; LA32-CONTRACT-FAST-NEXT:    xvld $xr0, $a1, 0
+; LA32-CONTRACT-FAST-NEXT:    xvld $xr1, $a2, 0
+; LA32-CONTRACT-FAST-NEXT:    xvld $xr2, $a3, 0
+; LA32-CONTRACT-FAST-NEXT:    xvfnmsub.s $xr0, $xr0, $xr1, $xr2
+; LA32-CONTRACT-FAST-NEXT:    xvst $xr0, $a0, 0
+; LA32-CONTRACT-FAST-NEXT:    ret
+;
+; LA32-CONTRACT-ON-LABEL: xvfnmsub_s:
+; LA32-CONTRACT-ON:       # %bb.0: # %entry
+; LA32-CONTRACT-ON-NEXT:    xvld $xr0, $a1, 0
+; LA32-CONTRACT-ON-NEXT:    xvld $xr1, $a2, 0
+; LA32-CONTRACT-ON-NEXT:    xvld $xr2, $a3, 0
+; LA32-CONTRACT-ON-NEXT:    xvfmul.s $xr0, $xr0, $xr1
+; LA32-CONTRACT-ON-NEXT:    xvfsub.s $xr0, $xr0, $xr2
+; LA32-CONTRACT-ON-NEXT:    xvbitrevi.w $xr0, $xr0, 31
+; LA32-CONTRACT-ON-NEXT:    xvst $xr0, $a0, 0
+; LA32-CONTRACT-ON-NEXT:    ret
+;
+; LA32-CONTRACT-OFF-LABEL: xvfnmsub_s:
+; LA32-CONTRACT-OFF:       # %bb.0: # %entry
+; LA32-CONTRACT-OFF-NEXT:    xvld $xr0, $a1, 0
+; LA32-CONTRACT-OFF-NEXT:    xvld $xr1, $a2, 0
+; LA32-CONTRACT-OFF-NEXT:    xvld $xr2, $a3, 0
+; LA32-CONTRACT-OFF-NEXT:    xvfmul.s $xr0, $xr0, $xr1
+; LA32-CONTRACT-OFF-NEXT:    xvfsub.s $xr0, $xr0, $xr2
+; LA32-CONTRACT-OFF-NEXT:    xvbitrevi.w $xr0, $xr0, 31
+; LA32-CONTRACT-OFF-NEXT:    xvst $xr0, $a0, 0
+; LA32-CONTRACT-OFF-NEXT:    ret
+;
+; LA64-CONTRACT-FAST-LABEL: xvfnmsub_s:
+; LA64-CONTRACT-FAST:       # %bb.0: # %entry
+; LA64-CONTRACT-FAST-NEXT:    xvld $xr0, $a1, 0
+; LA64-CONTRACT-FAST-NEXT:    xvld $xr1, $a2, 0
+; LA64-CONTRACT-FAST-NEXT:    xvld $xr2, $a3, 0
+; LA64-CONTRACT-FAST-NEXT:    xvfnmsub.s $xr0, $xr0, $xr1, $xr2
+; LA64-CONTRACT-FAST-NEXT:    xvst $xr0, $a0, 0
+; LA64-CONTRACT-FAST-NEXT:    ret
+;
+; LA64-CONTRACT-ON-LABEL: xvfnmsub_s:
+; LA64-CONTRACT-ON:       # %bb.0: # %entry
+; LA64-CONTRACT-ON-NEXT:    xvld $xr0, $a1, 0
+; LA64-CONTRACT-ON-NEXT:    xvld $xr1, $a2, 0
+; LA64-CONTRACT-ON-NEXT:    xvld $xr2, $a3, 0
+; LA64-CONTRACT-ON-NEXT:    xvfmul.s $xr0, $xr0, $xr1
+; LA64-CONTRACT-ON-NEXT:    xvfsub.s $xr0, $xr0, $xr2
+; LA64-CONTRACT-ON-NEXT:    xvbitrevi.w $xr0, $xr0, 31
+; LA64-CONTRACT-ON-NEXT:    xvst $xr0, $a0, 0
+; LA64-CONTRACT-ON-NEXT:    ret
+;
+; LA64-CONTRACT-OFF-LABEL: xvfnmsub_s:
+; LA64-CONTRACT-OFF:       # %bb.0: # %entry
+; LA64-CONTRACT-OFF-NEXT:    xvld $xr0, $a1, 0
+; LA64-CONTRACT-OFF-NEXT:    xvld $xr1, $a2, 0
+; LA64-CONTRACT-OFF-NEXT:    xvld $xr2, $a3, 0
+; LA64-CONTRACT-OFF-NEXT:    xvfmul.s $xr0, $xr0, $xr1
+; LA64-CONTRACT-OFF-NEXT:    xvfsub.s $xr0, $xr0, $xr2
+; LA64-CONTRACT-OFF-NEXT:    xvbitrevi.w $xr0, $xr0, 31
+; LA64-CONTRACT-OFF-NEXT:    xvst $xr0, $a0, 0
+; LA64-CONTRACT-OFF-NEXT:    ret
 entry:
   %v0 = load <8 x float>, ptr %a0
   %v1 = load <8 x float>, ptr %a1
@@ -201,25 +447,63 @@ entry:
 }
 
 define void @xvfnmsub_s_nsz(ptr %res, ptr %a0, ptr %a1, ptr %a2) nounwind {
-; LA32-CONTRACT-LABEL: xvfnmsub_s_nsz:
-; LA32-CONTRACT:       # %bb.0: # %entry
-; LA32-CONTRACT-NEXT:    xvld $xr0, $a1, 0
-; LA32-CONTRACT-NEXT:    xvld $xr1, $a2, 0
-; LA32-CONTRACT-NEXT:    xvld $xr2, $a3, 0
-; LA32-CONTRACT-NEXT:    xvfmul.s $xr0, $xr0, $xr1
-; LA32-CONTRACT-NEXT:    xvfsub.s $xr0, $xr2, $xr0
-; LA32-CONTRACT-NEXT:    xvst $xr0, $a0, 0
-; LA32-CONTRACT-NEXT:    ret
-;
-; LA64-CONTRACT-LABEL: xvfnmsub_s_nsz:
-; LA64-CONTRACT:       # %bb.0: # %entry
-; LA64-CONTRACT-NEXT:    xvld $xr0, $a1, 0
-; LA64-CONTRACT-NEXT:    xvld $xr1, $a2, 0
-; LA64-CONTRACT-NEXT:    xvld $xr2, $a3, 0
-; LA64-CONTRACT-NEXT:    xvfmul.s $xr0, $xr0, $xr1
-; LA64-CONTRACT-NEXT:    xvfsub.s $xr0, $xr2, $xr0
-; LA64-CONTRACT-NEXT:    xvst $xr0, $a0, 0
-; LA64-CONTRACT-NEXT:    ret
+; LA32-CONTRACT-FAST-LABEL: xvfnmsub_s_nsz:
+; LA32-CONTRACT-FAST:       # %bb.0: # %entry
+; LA32-CONTRACT-FAST-NEXT:    xvld $xr0, $a1, 0
+; LA32-CONTRACT-FAST-NEXT:    xvld $xr1, $a2, 0
+; LA32-CONTRACT-FAST-NEXT:    xvld $xr2, $a3, 0
+; LA32-CONTRACT-FAST-NEXT:    xvfnmsub.s $xr0, $xr0, $xr1, $xr2
+; LA32-CONTRACT-FAST-NEXT:    xvst $xr0, $a0, 0
+; LA32-CONTRACT-FAST-NEXT:    ret
+;
+; LA32-CONTRACT-ON-LABEL: xvfnmsub_s_nsz:
+; LA32-CONTRACT-ON:       # %bb.0: # %entry
+; LA32-CONTRACT-ON-NEXT:    xvld $xr0, $a1, 0
+; LA32-CONTRACT-ON-NEXT:    xvld $xr1, $a2, 0
+; LA32-CONTRACT-ON-NEXT:    xvld $xr2, $a3, 0
+; LA32-CONTRACT-ON-NEXT:    xvfmul.s $xr0, $xr0, $xr1
+; LA32-CONTRACT-ON-NEXT:    xvfsub.s $xr0, $xr2, $xr0
+; LA32-CONTRACT-ON-NEXT:    xvst $xr0, $a0, 0
+; LA32-CONTRACT-ON-NEXT:    ret
+;
+; LA32-CONTRACT-OFF-LABEL: xvfnmsub_s_nsz:
+; LA32-CONTRACT-OFF:       # %bb.0: # %entry
+; LA32-CONTRACT-OFF-NEXT:    xvld $xr0, $a1, 0
+; LA32-CONTRACT-OFF-NEXT:    xvld $xr1, $a2, 0
+; LA32-CONTRACT-OFF-NEXT:    xvld $xr2, $a3, 0
+; LA32-CONTRACT-OFF-NEXT:    xvfmul.s $xr0, $xr0, $xr1
+; LA32-CONTRACT-OFF-NEXT:    xvfsub.s $xr0, $xr2, $xr0
+; LA32-CONTRACT-OFF-NEXT:    xvst $xr0, $a0, 0
+; LA32-CONTRACT-OFF-NEXT:    ret
+;
+; LA64-CONTRACT-FAST-LABEL: xvfnmsub_s_nsz:
+; LA64-CONTRACT-FAST:       # %bb.0: # %entry
+; LA64-CONTRACT-FAST-NEXT:    xvld $xr0, $a1, 0
+; LA64-CONTRACT-FAST-NEXT:    xvld $xr1, $a2, 0
+; LA64-CONTRACT-FAST-NEXT:    xvld $xr2, $a3, 0
+; LA64-CONTRACT-FAST-NEXT:    xvfnmsub.s $xr0, $xr0, $xr1, $xr2
+; LA64-CONTRACT-FAST-NEXT:    xvst $xr0, $a0, 0
+; LA64-CONTRACT-FAST-NEXT:    ret
+;
+; LA64-CONTRACT-ON-LABEL: xvfnmsub_s_nsz:
+; LA64-CONTRACT-ON:       # %bb.0: # %entry
+; LA64-CONTRACT-ON-NEXT:    xvld $xr0, $a1, 0
+; LA64-CONTRACT-ON-NEXT:    xvld $xr1, $a2, 0
+; LA64-CONTRACT-ON-NEXT:    xvld $xr2, $a3, 0
+; LA64-CONTRACT-ON-NEXT:    xvfmul.s $xr0, $xr0, $xr1
+; LA64-CONTRACT-ON-NEXT:    xvfsub.s $xr0, $xr2, $xr0
+; LA64-CONTRACT-ON-NEXT:    xvst $xr0, $a0, 0
+; LA64-CONTRACT-ON-NEXT:    ret
+;
+; LA64-CONTRACT-OFF-LABEL: xvfnmsub_s_nsz:
+; LA64-CONTRACT-OFF:       # %bb.0: # %entry
+; LA64-CONTRACT-OFF-NEXT:    xvld $xr0, $a1, 0
+; LA64-CONTRACT-OFF-NEXT:    xvld $xr1, $a2, 0
+; LA64-CONTRACT-OFF-NEXT:    xvld $xr2, $a3, 0
+; LA64-CONTRACT-OFF-NEXT:    xvfmul.s $xr0, $xr0, $xr1
+; LA64-CONTRACT-OFF-NEXT:    xvfsub.s $xr0, $xr2, $xr0
+; LA64-CONTRACT-OFF-NEXT:    xvst $xr0, $a0, 0
+; LA64-CONTRACT-OFF-NEXT:    ret
 entry:
   %v0 = load <8 x float>, ptr %a0
   %v1 = load <8 x float>, ptr %a1
@@ -233,25 +517,65 @@ entry:
 
 ;; Check that fnmsub.s is not emitted.
 define void @not_xvfnmsub_s(ptr %res, ptr %a0, ptr %a1, ptr %a2) nounwind {
-; LA32-CONTRACT-LABEL: not_xvfnmsub_s:
-; LA32-CONTRACT:       # %bb.0: # %entry
-; LA32-CONTRACT-NEXT:    xvld $xr0, $a1, 0
-; LA32-CONTRACT-NEXT:    xvld $xr1, $a2, 0
-; LA32-CONTRACT-NEXT:    xvld $xr2, $a3, 0
-; LA32-CONTRACT-NEXT:    xvfmul.s $xr0, $xr0, $xr1
-; LA32-CONTRACT-NEXT:    xvfsub.s $xr0, $xr2, $xr0
-; LA32-CONTRACT-NEXT:    xvst $xr0, $a0, 0
-; LA32-CONTRACT-NEXT:    ret
-;
-; LA64-CONTRACT-LABEL: not_xvfnmsub_s:
-; LA64-CONTRACT:       # %bb.0: # %entry
-; LA64-CONTRACT-NEXT:    xvld $xr0, $a1, 0
-; LA64-CONTRACT-NEXT:    xvld $xr1, $a2, 0
-; LA64-CONTRACT-NEXT:    xvld $xr2, $a3, 0
-; LA64-CONTRACT-NEXT:    xvfmul.s $xr0, $xr0, $xr1
-; LA64-CONTRACT-NEXT:    xvfsub.s $xr0, $xr2, $xr0
-; LA64-CONTRACT-NEXT:    xvst $xr0, $a0, 0
-; LA64-CONTRACT-NEXT:    ret
+; LA32-CONTRACT-FAST-LABEL: not_xvfnmsub_s:
+; LA32-CONTRACT-FAST:       # %bb.0: # %entry
+; LA32-CONTRACT-FAST-NEXT:    xvld $xr0, $a1, 0
+; LA32-CONTRACT-FAST-NEXT:    xvld $xr1, $a2, 0
+; LA32-CONTRACT-FAST-NEXT:    xvld $xr2, $a3, 0
+; LA32-CONTRACT-FAST-NEXT:    xvbitrevi.w $xr0, $xr0, 31
+; LA32-CONTRACT-FAST-NEXT:    xvfmadd.s $xr0, $xr0, $xr1, $xr2
+; LA32-CONTRACT-FAST-NEXT:    xvst $xr0, $a0, 0
+; LA32-CONTRACT-FAST-NEXT:    ret
+;
+; LA32-CONTRACT-ON-LABEL: not_xvfnmsub_s:
+; LA32-CONTRACT-ON:       # %bb.0: # %entry
+; LA32-CONTRACT-ON-NEXT:    xvld $xr0, $a1, 0
+; LA32-CONTRACT-ON-NEXT:    xvld $xr1, $a2, 0
+; LA32-CONTRACT-ON-NEXT:    xvld $xr2, $a3, 0
+; LA32-CONTRACT-ON-NEXT:    xvfmul.s $xr0, $xr0, $xr1
+; LA32-CONTRACT-ON-NEXT:    xvfsub.s $xr0, $xr2, $xr0
+; LA32-CONTRACT-ON-NEXT:    xvst $xr0, $a0, 0
+; LA32-CONTRACT-ON-NEXT:    ret
+;
+; LA32-CONTRACT-OFF-LABEL: not_xvfnmsub_s:
+; LA32-CONTRACT-OFF:       # %bb.0: # %entry
+; LA32-CONTRACT-OFF-NEXT:    xvld $xr0, $a1, 0
+; LA32-CONTRACT-OFF-NEXT:    xvld $xr1, $a2, 0
+; LA32-CONTRACT-OFF-NEXT:    xvld $xr2, $a3, 0
+; LA32-CONTRACT-OFF-NEXT:    xvfmul.s $xr0, $xr0, $xr1
+; LA32-CONTRACT-OFF-NEXT:    xvfsub.s $xr0, $xr2, $xr0
+; LA32-CONTRACT-OFF-NEXT:    xvst $xr0, $a0, 0
+; LA32-CONTRACT-OFF-NEXT:    ret
+;
+; LA64-CONTRACT-FAST-LABEL: not_xvfnmsub_s:
+; LA64-CONTRACT-FAST:       # %bb.0: # %entry
+; LA64-CONTRACT-FAST-NEXT:    xvld $xr0, $a1, 0
+; LA64-CONTRACT-FAST-NEXT:    xvld $xr1, $a2, 0
+; LA64-CONTRACT-FAST-NEXT:    xvld $xr2, $a3, 0
+; LA64-CONTRACT-FAST-NEXT:    xvbitrevi.w $xr0, $xr0, 31
+; LA64-CONTRACT-FAST-NEXT:    xvfmadd.s $xr0, $xr0, $xr1, $xr2
+; LA64-CONTRACT-FAST-NEXT:    xvst $xr0, $a0, 0
+; LA64-CONTRACT-FAST-NEXT:    ret
+;
+; LA64-CONTRACT-ON-LABEL: not_xvfnmsub_s:
+; LA64-CONTRACT-ON:       # %bb.0: # %entry
+; LA64-CONTRACT-ON-NEXT:    xvld $xr0, $a1, 0
+; LA64-CONTRACT-ON-NEXT:    xvld $xr1, $a2, 0
+; LA64-CONTRACT-ON-NEXT:    xvld $xr2, $a3, 0
+; LA64-CONTRACT-ON-NEXT:    xvfmul.s $xr0, $xr0, $xr1
+; LA64-CONTRACT-ON-NEXT:    xvfsub.s $xr0, $xr2, $xr0
+; LA64-CONTRACT-ON-NEXT:    xvst $xr0, $a0, 0
+; LA64-CONTRACT-ON-NEXT:    ret
+;
+; LA64-CONTRACT-OFF-LABEL: not_xvfnmsub_s:
+; LA64-CONTRACT-OFF:       # %bb.0: # %entry
+; LA64-CONTRACT-OFF-NEXT:    xvld $xr0, $a1, 0
+; LA64-CONTRACT-OFF-NEXT:    xvld $xr1, $a2, 0
+; LA64-CONTRACT-OFF-NEXT:    xvld $xr2, $a3, 0
+; LA64-CONTRACT-OFF-NEXT:    xvfmul.s $xr0, $xr0, $xr1
+; LA64-CONTRACT-OFF-NEXT:    xvfsub.s $xr0, $xr2, $xr0
+; LA64-CONTRACT-OFF-NEXT:    xvst $xr0, $a0, 0
+; LA64-CONTRACT-OFF-NEXT:    ret
 entry:
   %v0 = load <8 x float>, ptr %a0
   %v1 = load <8 x float>, ptr %a1
@@ -264,23 +588,59 @@ entry:
 }
 
 define void @contract_xvfmadd_s(ptr %res, ptr %a0, ptr %a1, ptr %a2) nounwind {
-; LA32-CONTRACT-LABEL: contract_xvfmadd_s:
-; LA32-CONTRACT:       # %bb.0: # %entry
-; LA32-CONTRACT-NEXT:    xvld $xr0, $a1, 0
-; LA32-CONTRACT-NEXT:    xvld $xr1, $a2, 0
-; LA32-CONTRACT-NEXT:    xvld $xr2, $a3, 0
-; LA32-CONTRACT-NEXT:    xvfmadd.s $xr0, $xr0, $xr1, $xr2
-; LA32-CONTRACT-NEXT:    xvst $xr0, $a0, 0
-; LA32-CONTRACT-NEXT:    ret
-;
-; LA64-CONTRACT-LABEL: contract_xvfmadd_s:
-; LA64-CONTRACT:       # %bb.0: # %entry
-; LA64-CONTRACT-NEXT:    xvld $xr0, $a1, 0
-; LA64-CONTRACT-NEXT:    xvld $xr1, $a2, 0
-; LA64-CONTRACT-NEXT:    xvld $xr2, $a3, 0
-; LA64-CONTRACT-NEXT:    xvfmadd.s $xr0, $xr0, $xr1, $xr2
-; LA64-CONTRACT-NEXT:    xvst $xr0, $a0, 0
-; LA64-CONTRACT-NEXT:    ret
+; LA32-CONTRACT-FAST-LABEL: contract_xvfmadd_s:
+; LA32-CONTRACT-FAST:       # %bb.0: # %entry
+; LA32-CONTRACT-FAST-NEXT:    xvld $xr0, $a1, 0
+; LA32-CONTRACT-FAST-NEXT:    xvld $xr1, $a2, 0
+; LA32-CONTRACT-FAST-NEXT:    xvld $xr2, $a3, 0
+; LA32-CONTRACT-FAST-NEXT:    xvfmadd.s $xr0, $xr0, $xr1, $xr2
+; LA32-CONTRACT-FAST-NEXT:    xvst $xr0, $a0, 0
+; LA32-CONTRACT-FAST-NEXT:    ret
+;
+; LA32-CONTRACT-ON-LABEL: contract_xvfmadd_s:
+; LA32-CONTRACT-ON:       # %bb.0: # %entry
+; LA32-CONTRACT-ON-NEXT:    xvld $xr0, $a1, 0
+; LA32-CONTRACT-ON-NEXT:    xvld $xr1, $a2, 0
+; LA32-CONTRACT-ON-NEXT:    xvld $xr2, $a3, 0
+; LA32-CONTRACT-ON-NEXT:    xvfmadd.s $xr0, $xr0, $xr1, $xr2
+; LA32-CONTRACT-ON-NEXT:    xvst $xr0, $a0, 0
+; LA32-CONTRACT-ON-NEXT:    ret
+;
+; LA32-CONTRACT-OFF-LABEL: contract_xvfmadd_s:
+; LA32-CONTRACT-OFF:       # %bb.0: # %entry
+; LA32-CONTRACT-OFF-NEXT:    xvld $xr0, $a1, 0
+; LA32-CONTRACT-OFF-NEXT:    xvld $xr1, $a2, 0
+; LA32-CONTRACT-OFF-NEXT:    xvld $xr2, $a3, 0
+; LA32-CONTRACT-OFF-NEXT:    xvfmadd.s $xr0, $xr0, $xr1, $xr2
+; LA32-CONTRACT-OFF-NEXT:    xvst $xr0, $a0, 0
+; LA32-CONTRACT-OFF-NEXT:    ret
+;
+; LA64-CONTRACT-FAST-LABEL: contract_xvfmadd_s:
+; LA64-CONTRACT-FAST:       # %bb.0: # %entry
+; LA64-CONTRACT-FAST-NEXT:    xvld $xr0, $a1, 0
+; LA64-CONTRACT-FAST-NEXT:    xvld $xr1, $a2, 0
+; LA64-CONTRACT-FAST-NEXT:    xvld $xr2, $a3, 0
+; LA64-CONTRACT-FAST-NEXT:    xvfmadd.s $xr0, $xr0, $xr1, $xr2
+; LA64-CONTRACT-FAST-NEXT:    xvst $xr0, $a0, 0
+; LA64-CONTRACT-FAST-NEXT:    ret
+;
+; LA64-CONTRACT-ON-LABEL: contract_xvfmadd_s:
+; LA64-CONTRACT-ON:       # %bb.0: # %entry
+; LA64-CONTRACT-ON-NEXT:    xvld $xr0, $a1, 0
+; LA64-CONTRACT-ON-NEXT:    xvld $xr1, $a2, 0
+; LA64-CONTRACT-ON-NEXT:    xvld $xr2, $a3, 0
+; LA64-CONTRACT-ON-NEXT:    xvfmadd.s $xr0, $xr0, $xr1, $xr2
+; LA64-CONTRACT-ON-NEXT:    xvst $xr0, $a0, 0
+; LA64-CONTRACT-ON-NEXT:    ret
+;
+; LA64-CONTRACT-OFF-LABEL: contract_xvfmadd_s:
+; LA64-CONTRACT-OFF:       # %bb.0: # %entry
+; LA64-CONTRACT-OFF-NEXT:    xvld $xr0, $a1, 0
+; LA64-CONTRACT-OFF-NEXT:    xvld $xr1, $a2, 0
+; LA64-CONTRACT-OFF-NEXT:    xvld $xr2, $a3, 0
+; LA64-CONTRACT-OFF-NEXT:    xvfmadd.s $xr0, $xr0, $xr1, $xr2
+; LA64-CONTRACT-OFF-NEXT:    xvst $xr0, $a0, 0
+; LA64-CONTRACT-OFF-NEXT:    ret
 entry:
   %v0 = load <8 x float>, ptr %a0
   %v1 = load <8 x float>, ptr %a1
@@ -292,23 +652,59 @@ entry:
 }
 
 define void @contract_xvfmsub_s(ptr %res, ptr %a0, ptr %a1, ptr %a2) nounwind {
-; LA32-CONTRACT-LABEL: contract_xvfmsub_s:
-; LA32-CONTRACT:       # %bb.0: # %entry
-; LA32-CONTRACT-NEXT:    xvld $xr0, $a1, 0
-; LA32-CONTRACT-NEXT:    xvld $xr1, $a2, 0
-; LA32-CONTRACT-NEXT:    xvld $xr2, $a3, 0
-; LA32-CONTRACT-NEXT:    xvfmsub.s $xr0, $xr0, $xr1, $xr2
-; LA32-CONTRACT-NEXT:    xvst $xr0, $a0, 0
-; LA32-CONTRACT-NEXT:    ret
-;
-; LA64-CONTRACT-LABEL: contract_xvfmsub_s:
-; LA64-CONTRACT:       # %bb.0: # %entry
-; LA64-CONTRACT-NEXT:    xvld $xr0, $a1, 0
-; LA64-CONTRACT-NEXT:    xvld $xr1, $a2, 0
-; LA64-CONTRACT-NEXT:    xvld $xr2, $a3, 0
-; LA64-CONTRACT-NEXT:    xvfmsub.s $xr0, $xr0, $xr1, $xr2
-; LA64-CONTRACT-NEXT:    xvst $xr0, $a0, 0
-; LA64-CONTRACT-NEXT:    ret
+; LA32-CONTRACT-FAST-LABEL: contract_xvfmsub_s:
+; LA32-CONTRACT-FAST:       # %bb.0: # %entry
+; LA32-CONTRACT-FAST-NEXT:    xvld $xr0, $a1, 0
+; LA32-CONTRACT-FAST-NEXT:    xvld $xr1, $a2, 0
+; LA32-CONTRACT-FAST-NEXT:    xvld $xr2, $a3, 0
+; LA32-CONTRACT-FAST-NEXT:    xvfmsub.s $xr0, $xr0, $xr1, $xr2
+; LA32-CONTRACT-FAST-NEXT:    xvst $xr0, $a0, 0
+; LA32-CONTRACT-FAST-NEXT:    ret
+;
+; LA32-CONTRACT-ON-LABEL: contract_xvfmsub_s:
+; LA32-CONTRACT-ON:       # %bb.0: # %entry
+; LA32-CONTRACT-ON-NEXT:    xvld $xr0, $a1, 0
+; LA32-CONTRACT-ON-NEXT:    xvld $xr1, $a2, 0
+; LA32-CONTRACT-ON-NEXT:    xvld $xr2, $a3, 0
+; LA32-CONTRACT-ON-NEXT:    xvfmsub.s $xr0, $xr0, $xr1, $xr2
+; LA32-CONTRACT-ON-NEXT:    xvst $xr0, $a0, 0
+; LA32-CONTRACT-ON-NEXT:    ret
+;
+; LA32-CONTRACT-OFF-LABEL: contract_xvfmsub_s:
+; LA32-CONTRACT-OFF:       # %bb.0: # %entry
+; LA32-CONTRACT-OFF-NEXT:    xvld $xr0, $a1, 0
+; LA32-CONTRACT-OFF-NEXT:    xvld $xr1, $a2, 0
+; LA32-CONTRACT-OFF-NEXT:    xvld $xr2, $a3, 0
+; LA32-CONTRACT-OFF-NEXT:    xvfmsub.s $xr0, $xr0, $xr1, $xr2
+; LA32-CONTRACT-OFF-NEXT:    xvst $xr0, $a0, 0
+; LA32-CONTRACT-OFF-NEXT:    ret
+;
+; LA64-CONTRACT-FAST-LABEL: contract_xvfmsub_s:
+; LA64-CONTRACT-FAST:       # %bb.0: # %entry
+; LA64-CONTRACT-FAST-NEXT:    xvld $xr0, $a1, 0
+; LA64-CONTRACT-FAST-NEXT:    xvld $xr1, $a2, 0
+; LA64-CONTRACT-FAST-NEXT:    xvld $xr2, $a3, 0
+; LA64-CONTRACT-FAST-NEXT:    xvfmsub.s $xr0, $xr0, $xr1, $xr2
+; LA64-CONTRACT-FAST-NEXT:    xvst $xr0, $a0, 0
+; LA64-CONTRACT-FAST-NEXT:    ret
+;
+; LA64-CONTRACT-ON-LABEL: contract_xvfmsub_s:
+; LA64-CONTRACT-ON:       # %bb.0: # %entry
+; LA64-CONTRACT-ON-NEXT:    xvld $xr0, $a1, 0
+; LA64-CONTRACT-ON-NEXT:    xvld $xr1, $a2, 0
+; LA64-CONTRACT-ON-NEXT:    xvld $xr2, $a3, 0
+; LA64-CONTRACT-ON-NEXT:    xvfmsub.s $xr0, $xr0, $xr1, $xr2
+; LA64-CONTRACT-ON-NEXT:    xvst $xr0, $a0, 0
+; LA64-CONTRACT-ON-NEXT:    ret
+;
+; LA64-CONTRACT-OFF-LABEL: contract_xvfmsub_s:
+; LA64-CONTRACT-OFF:       # %bb.0: # %entry
+; LA64-CONTRACT-OFF-NEXT:    xvld $xr0, $a1, 0
+; LA64-CONTRACT-OFF-NEXT:    xvld $xr1, $a2, 0
+; LA64-CONTRACT-OFF-NEXT:    xvld $xr2, $a3, 0
+; LA64-CONTRACT-OFF-NEXT:    xvfmsub.s $xr0, $xr0, $xr1, $xr2
+; LA64-CONTRACT-OFF-NEXT:    xvst $xr0, $a0, 0
+; LA64-CONTRACT-OFF-NEXT:    ret
 entry:
   %v0 = load <8 x float>, ptr %a0
   %v1 = load <8 x float>, ptr %a1
@@ -320,23 +716,59 @@ entry:
 }
 
 define void @contract_xvfnmadd_s(ptr %res, ptr %a0, ptr %a1, ptr %a2) nounwind {
-; LA32-CONTRACT-LABEL: contract_xvfnmadd_s:
-; LA32-CONTRACT:       # %bb.0: # %entry
-; LA32-CONTRACT-NEXT:    xvld $xr0, $a1, 0
-; LA32-CONTRACT-NEXT:    xvld $xr1, $a2, 0
-; LA32-CONTRACT-NEXT:    xvld $xr2, $a3, 0
-; LA32-CONTRACT-NEXT:    xvfnmadd.s $xr0, $xr0, $xr1, $xr2
-; LA32-CONTRACT-NEXT:    xvst $xr0, $a0, 0
-; LA32-CONTRACT-NEXT:    ret
-;
-; LA64-CONTRACT-LABEL: contract_xvfnmadd_s:
-; LA64-CONTRACT:       # %bb.0: # %entry
-; LA64-CONTRACT-NEXT:    xvld $xr0, $a1, 0
-; LA64-CONTRACT-NEXT:    xvld $xr1, $a2, 0
-; LA64-CONTRACT-NEXT:    xvld $xr2, $a3, 0
-; LA64-CONTRACT-NEXT:    xvfnmadd.s $xr0, $xr0, $xr1, $xr2
-; LA64-CONTRACT-NEXT:    xvst $xr0, $a0, 0
-; LA64-CONTRACT-NEXT:    ret
+; LA32-CONTRACT-FAST-LABEL: contract_xvfnmadd_s:
+; LA32-CONTRACT-FAST:       # %bb.0: # %entry
+; LA32-CONTRACT-FAST-NEXT:    xvld $xr0, $a1, 0
+; LA32-CONTRACT-FAST-NEXT:    xvld $xr1, $a2, 0
+; LA32-CONTRACT-FAST-NEXT:    xvld $xr2, $a3, 0
+; LA32-CONTRACT-FAST-NEXT:    xvfnmadd.s $xr0, $xr0, $xr1, $xr2
+; LA32-CONTRACT-FAST-NEXT:    xvst $xr0, $a0, 0
+; LA32-CONTRACT-FAST-NEXT:    ret
+;
+; LA32-CONTRACT-ON-LABEL: contract_xvfnmadd_s:
+; LA32-CONTRACT-ON:       # %bb.0: # %entry
+; LA32-CONTRACT-ON-NEXT:    xvld $xr0, $a1, 0
+; LA32-CONTRACT-ON-NEXT:    xvld $xr1, $a2, 0
+; LA32-CONTRACT-ON-NEXT:    xvld $xr2, $a3, 0
+; LA32-CONTRACT-ON-NEXT:    xvfnmadd.s $xr0, $xr0, $xr1, $xr2
+; LA32-CONTRACT-ON-NEXT:    xvst $xr0, $a0, 0
+; LA32-CONTRACT-ON-NEXT:    ret
+;
+; LA32-CONTRACT-OFF-LABEL: contract_xvfnmadd_s:
+; LA32-CONTRACT-OFF:       # %bb.0: # %entry
+; LA32-CONTRACT-OFF-NEXT:    xvld $xr0, $a1, 0
+; LA32-CONTRACT-OFF-NEXT:    xvld $xr1, $a2, 0
+; LA32-CONTRACT-OFF-NEXT:    xvld $xr2, $a3, 0
+; LA32-CONTRACT-OFF-NEXT:    xvfnmadd.s $xr0, $xr0, $xr1, $xr2
+; LA32-CONTRACT-OFF-NEXT:    xvst $xr0, $a0, 0
+; LA32-CONTRACT-OFF-NEXT:    ret
+;
+; LA64-CONTRACT-FAST-LABEL: contract_xvfnmadd_s:
+; LA64-CONTRACT-FAST:       # %bb.0: # %entry
+; LA64-CONTRACT-FAST-NEXT:    xvld $xr0, $a1, 0
+; LA64-CONTRACT-FAST-NEXT:    xvld $xr1, $a2, 0
+; LA64-CONTRACT-FAST-NEXT:    xvld $xr2, $a3, 0
+; LA64-CONTRACT-FAST-NEXT:    xvfnmadd.s $xr0, $xr0, $xr1, $xr2
+; LA64-CONTRACT-FAST-NEXT:    xvst $xr0, $a0, 0
+; LA64-CONTRACT-FAST-NEXT:    ret
+;
+; LA64-CONTRACT-ON-LABEL: contract_xvfnmadd_s:
+; LA64-CONTRACT-ON:       # %bb.0: # %entry
+; LA64-CONTRACT-ON-NEXT:    xvld $xr0, $a1, 0
+; LA64-CONTRACT-ON-NEXT:    xvld $xr1, $a2, 0
+; LA64-CONTRACT-ON-NEXT:    xvld $xr2, $a3, 0
+; LA64-CONTRACT-ON-NEXT:    xvfnmadd.s $xr0, $xr0, $xr1, $xr2
+; LA64-CONTRACT-ON-NEXT:    xvst $xr0, $a0, 0
+; LA64-CONTRACT-ON-NEXT:    ret
+;
+; LA64-CONTRACT-OFF-LABEL: contract_xvfnmadd_s:
+; LA64-CONTRACT-OFF:       # %bb.0: # %entry
+; LA64-CONTRACT-OFF-NEXT:    xvld $xr0, $a1, 0
+; LA64-CONTRACT-OFF-NEXT:    xvld $xr1, $a2, 0
+; LA64-CONTRACT-OFF-NEXT:    xvld $xr2, $a3, 0
+; LA64-CONTRACT-OFF-NEXT:    xvfnmadd.s $xr0, $xr0, $xr1, $xr2
+; LA64-CONTRACT-OFF-NEXT:    xvst $xr0, $a0, 0
+; LA64-CONTRACT-OFF-NEXT:    ret
 entry:
   %v0 = load <8 x float>, ptr %a0
   %v1 = load <8 x float>, ptr %a1
@@ -349,23 +781,59 @@ entry:
 }
 
 define void @contract_xvfnmadd_s_nsz(ptr %res, ptr %a0, ptr %a1, ptr %a2) nounwind {
-; LA32-CONTRACT-LABEL: contract_xvfnmadd_s_nsz:
-; LA32-CONTRACT:       # %bb.0: # %entry
-; LA32-CONTRACT-NEXT:    xvld $xr0, $a1, 0
-; LA32-CONTRACT-NEXT:    xvld $xr1, $a2, 0
-; LA32-CONTRACT-NEXT:    xvld $xr2, $a3, 0
-; LA32-CONTRACT-NEXT:    xvfnmadd.s $xr0, $xr0, $xr1, $xr2
-; LA32-CONTRACT-NEXT:    xvst $xr0, $a0, 0
-; LA32-CONTRACT-NEXT:    ret
-;
-; LA64-CONTRACT-LABEL: contract_xvfnmadd_s_nsz:
-; LA64-CONTRACT:       # %bb.0: # %entry
-; LA64-CONTRACT-NEXT:    xvld $xr0, $a1, 0
-; LA64-CONTRACT-NEXT:    xvld $xr1, $a2, 0
-; LA64-CONTRACT-NEXT:    xvld $xr2, $a3, 0
-; LA64-CONTRACT-NEXT:    xvfnmadd.s $xr0, $xr0, $xr1, $xr2
-; LA64-CONTRACT-NEXT:    xvst $xr0, $a0, 0
-; LA64-CONTRACT-NEXT:    ret
+; LA32-CONTRACT-FAST-LABEL: contract_xvfnmadd_s_nsz:
+; LA32-CONTRACT-FAST:       # %bb.0: # %entry
+; LA32-CONTRACT-FAST-NEXT:    xvld $xr0, $a1, 0
+; LA32-CONTRACT-FAST-NEXT:    xvld $xr1, $a2, 0
+; LA32-CONTRACT-FAST-NEXT:    xvld $xr2, $a3, 0
+; LA32-CONTRACT-FAST-NEXT:    xvfnmadd.s $xr0, $xr0, $xr1, $xr2
+; LA32-CONTRACT-FAST-NEXT:    xvst $xr0, $a0, 0
+; LA32-CONTRACT-FAST-NEXT:    ret
+;
+; LA32-CONTRACT-ON-LABEL: contract_xvfnmadd_s_nsz:
+; LA32-CONTRACT-ON:       # %bb.0: # %entry
+; LA32-CONTRACT-ON-NEXT:    xvld $xr0, $a1, 0
+; LA32-CONTRACT-ON-NEXT:    xvld $xr1, $a2, 0
+; LA32-CONTRACT-ON-NEXT:    xvld $xr2, $a3, 0
+; LA32-CONTRACT-ON-NEXT:    xvfnmadd.s $xr0, $xr0, $xr1, $xr2
+; LA32-CONTRACT-ON-NEXT:    xvst $xr0, $a0, 0
+; LA32-CONTRACT-ON-NEXT:    ret
+;
+; LA32-CONTRACT-OFF-LABEL: contract_xvfnmadd_s_nsz:
+; LA32-CONTRACT-OFF:       # %bb.0: # %entry
+; LA32-CONTRACT-OFF-NEXT:    xvld $xr0, $a1, 0
+; LA32-CONTRACT-OFF-NEXT:    xvld $xr1, $a2, 0
+; LA32-CONTRACT-OFF-NEXT:    xvld $xr2, $a3, 0
+; LA32-CONTRACT-OFF-NEXT:    xvfnmadd.s $xr0, $xr0, $xr1, $xr2
+; LA32-CONTRACT-OFF-NEXT:    xvst $xr0, $a0, 0
+; LA32-CONTRACT-OFF-NEXT:    ret
+;
+; LA64-CONTRACT-FAST-LABEL: contract_xvfnmadd_s_nsz:
+; LA64-CONTRACT-FAST:       # %bb.0: # %entry
+; LA64-CONTRACT-FAST-NEXT:    xvld $xr0, $a1, 0
+; LA64-CONTRACT-FAST-NEXT:    xvld $xr1, $a2, 0
+; LA64-CONTRACT-FAST-NEXT:    xvld $xr2, $a3, 0
+; LA64-CONTRACT-FAST-NEXT:    xvfnmadd.s $xr0, $xr0, $xr1, $xr2
+; LA64-CONTRACT-FAST-NEXT:    xvst $xr0, $a0, 0
+; LA64-CONTRACT-FAST-NEXT:    ret
+;
+; LA64-CONTRACT-ON-LABEL: contract_xvfnmadd_s_nsz:
+; LA64-CONTRACT-ON:       # %bb.0: # %entry
+; LA64-CONTRACT-ON-NEXT:    xvld $xr0, $a1, 0
+; LA64-CONTRACT-ON-NEXT:    xvld $xr1, $a2, 0
+; LA64-CONTRACT-ON-NEXT:    xvld $xr2, $a3, 0
+; LA64-CONTRACT-ON-NEXT:    xvfnmadd.s $xr0, $xr0, $xr1, $xr2
+; LA64-CONTRACT-ON-NEXT:    xvst $xr0, $a0, 0
+; LA64-CONTRACT-ON-NEXT:    ret
+;
+; LA64-CONTRACT-OFF-LABEL: contract_xvfnmadd_s_nsz:
+; LA64-CONTRACT-OFF:       # %bb.0: # %entry
+; LA64-CONTRACT-OFF-NEXT:    xvld $xr0, $a1, 0
+; LA64-CONTRACT-OFF-NEXT:    xvld $xr1, $a2, 0
+; LA64-CONTRACT-OFF-NEXT:    xvld $xr2, $a3, 0
+; LA64-CONTRACT-OFF-NEXT:    xvfnmadd.s $xr0, $xr0, $xr1, $xr2
+; LA64-CONTRACT-OFF-NEXT:    xvst $xr0, $a0, 0
+; LA64-CONTRACT-OFF-NEXT:    ret
 entry:
   %v0 = load <8 x float>, ptr %a0
   %v1 = load <8 x float>, ptr %a1
@@ -380,25 +848,65 @@ entry:
 
 ;; Check that fnmadd.s is not emitted.
 define void @not_contract_xvfnmadd_s(ptr %res, ptr %a0, ptr %a1, ptr %a2) nounwind {
-; LA32-CONTRACT-LABEL: not_contract_xvfnmadd_s:
-; LA32-CONTRACT:       # %bb.0: # %entry
-; LA32-CONTRACT-NEXT:    xvld $xr0, $a1, 0
-; LA32-CONTRACT-NEXT:    xvld $xr1, $a2, 0
-; LA32-CONTRACT-NEXT:    xvld $xr2, $a3, 0
-; LA32-CONTRACT-NEXT:    xvbitrevi.w $xr0, $xr0, 31
-; LA32-CONTRACT-NEXT:    xvfmsub.s $xr0, $xr0, $xr1, $xr2
-; LA32-CONTRACT-NEXT:    xvst $xr0, $a0, 0
-; LA32-CONTRACT-NEXT:    ret
-;
-; LA64-CONTRACT-LABEL: not_contract_xvfnmadd_s:
-; LA64-CONTRACT:       # %bb.0: # %entry
-; LA64-CONTRACT-NEXT:    xvld $xr0, $a1, 0
-; LA64-CONTRACT-NEXT:    xvld $xr1, $a2, 0
-; LA64-CONTRACT-NEXT:    xvld $xr2, $a3, 0
-; LA64-CONTRACT-NEXT:    xvbitrevi.w $xr0, $xr0, 31
-; LA64-CONTRACT-NEXT:    xvfmsub.s $xr0, $xr0, $xr1, $xr2
-; LA64-CONTRACT-NEXT:    xvst $xr0, $a0, 0
-; LA64-CONTRACT-NEXT:    ret
+; LA32-CONTRACT-FAST-LABEL: not_contract_xvfnmadd_s:
+; LA32-CONTRACT-FAST:       # %bb.0: # %entry
+; LA32-CONTRACT-FAST-NEXT:    xvld $xr0, $a1, 0
+; LA32-CONTRACT-FAST-NEXT:    xvld $xr1, $a2, 0
+; LA32-CONTRACT-FAST-NEXT:    xvld $xr2, $a3, 0
+; LA32-CONTRACT-FAST-NEXT:    xvbitrevi.w $xr0, $xr0, 31
+; LA32-CONTRACT-FAST-NEXT:    xvfmsub.s $xr0, $xr0, $xr1, $xr2
+; LA32-CONTRACT-FAST-NEXT:    xvst $xr0, $a0, 0
+; LA32-CONTRACT-FAST-NEXT:    ret
+;
+; LA32-CONTRACT-ON-LABEL: not_contract_xvfnmadd_s:
+; LA32-CONTRACT-ON:       # %bb.0: # %entry
+; LA32-CONTRACT-ON-NEXT:    xvld $xr0, $a1, 0
+; LA32-CONTRACT-ON-NEXT:    xvld $xr1, $a2, 0
+; LA32-CONTRACT-ON-NEXT:    xvld $xr2, $a3, 0
+; LA32-CONTRACT-ON-NEXT:    xvbitrevi.w $xr0, $xr0, 31
+; LA32-CONTRACT-ON-NEXT:    xvfmsub.s $xr0, $xr0, $xr1, $xr2
+; LA32-CONTRACT-ON-NEXT:    xvst $xr0, $a0, 0
+; LA32-CONTRACT-ON-NEXT:    ret
+;
+; LA32-CONTRACT-OFF-LABEL: not_contract_xvfnmadd_s:
+; LA32-CONTRACT-OFF:       # %bb.0: # %entry
+; LA32-CONTRACT-OFF-NEXT:    xvld $xr0, $a1, 0
+; LA32-CONTRACT-OFF-NEXT:    xvld $xr1, $a2, 0
+; LA32-CONTRACT-OFF-NEXT:    xvld $xr2, $a3, 0
+; LA32-CONTRACT-OFF-NEXT:    xvbitrevi.w $xr0, $xr0, 31
+; LA32-CONTRACT-OFF-NEXT:    xvfmsub.s $xr0, $xr0, $xr1, $xr2
+; LA32-CONTRACT-OFF-NEXT:    xvst $xr0, $a0, 0
+; LA32-CONTRACT-OFF-NEXT:    ret
+;
+; LA64-CONTRACT-FAST-LABEL: not_contract_xvfnmadd_s:
+; LA64-CONTRACT-FAST:       # %bb.0: # %entry
+; LA64-CONTRACT-FAST-NEXT:    xvld $xr0, $a1, 0
+; LA64-CONTRACT-FAST-NEXT:    xvld $xr1, $a2, 0
+; LA64-CONTRACT-FAST-NEXT:    xvld $xr2, $a3, 0
+; LA64-CONTRACT-FAST-NEXT:    xvbitrevi.w $xr0, $xr0, 31
+; LA64-CONTRACT-FAST-NEXT:    xvfmsub.s $xr0, $xr0, $xr1, $xr2
+; LA64-CONTRACT-FAST-NEXT:    xvst $xr0, $a0, 0
+; LA64-CONTRACT-FAST-NEXT:    ret
+;
+; LA64-CONTRACT-ON-LABEL: not_contract_xvfnmadd_s:
+; LA64-CONTRACT-ON:       # %bb.0: # %entry
+; LA64-CONTRACT-ON-NEXT:    xvld $xr0, $a1, 0
+; LA64-CONTRACT-ON-NEXT:    xvld $xr1, $a2, 0
+; LA64-CONTRACT-ON-NEXT:    xvld $xr2, $a3, 0
+; LA64-CONTRACT-ON-NEXT:    xvbitrevi.w $xr0, $xr0, 31
+; LA64-CONTRACT-ON-NEXT:    xvfmsub.s $xr0, $xr0, $xr1, $xr2
+; LA64-CONTRACT-ON-NEXT:    xvst $xr0, $a0, 0
+; LA64-CONTRACT-ON-NEXT:    ret
+;
+; LA64-CONTRACT-OFF-LABEL: not_contract_xvfnmadd_s:
+; LA64-CONTRACT-OFF:       # %bb.0: # %entry
+; LA64-CONTRACT-OFF-NEXT:    xvld $xr0, $a1, 0
+; LA64-CONTRACT-OFF-NEXT:    xvld $xr1, $a2, 0
+; LA64-CONTRACT-OFF-NEXT:    xvld $xr2, $a3, 0
+; LA64-CONTRACT-OFF-NEXT:    xvbitrevi.w $xr0, $xr0, 31
+; LA64-CONTRACT-OFF-NEXT:    xvfmsub.s $xr0, $xr0, $xr1, $xr2
+; LA64-CONTRACT-OFF-NEXT:    xvst $xr0, $a0, 0
+; LA64-CONTRACT-OFF-NEXT:    ret
 entry:
   %v0 = load <8 x float>, ptr %a0
   %v1 = load <8 x float>, ptr %a1
@@ -412,23 +920,59 @@ entry:
 }
 
 define void @contract_xvfnmsub_s(ptr %res, ptr %a0, ptr %a1, ptr %a2) nounwind {
-; LA32-CONTRACT-LABEL: contract_xvfnmsub_s:
-; LA32-CONTRACT:       # %bb.0: # %entry
-; LA32-CONTRACT-NEXT:    xvld $xr0, $a1, 0
-; LA32-CONTRACT-NEXT:    xvld $xr1, $a2, 0
-; LA32-CONTRACT-NEXT:    xvld $xr2, $a3, 0
-; LA32-CONTRACT-NEXT:    xvfnmsub.s $xr0, $xr0, $xr1, $xr2
-; LA32-CONTRACT-NEXT:    xvst $xr0, $a0, 0
-; LA32-CONTRACT-NEXT:    ret
-;
-; LA64-CONTRACT-LABEL: contract_xvfnmsub_s:
-; LA64-CONTRACT:       # %bb.0: # %entry
-; LA64-CONTRACT-NEXT:    xvld $xr0, $a1, 0
-; LA64-CONTRACT-NEXT:    xvld $xr1, $a2, 0
-; LA64-CONTRACT-NEXT:    xvld $xr2, $a3, 0
-; LA64-CONTRACT-NEXT:    xvfnmsub.s $xr0, $xr0, $xr1, $xr2
-; LA64-CONTRACT-NEXT:    xvst $xr0, $a0, 0
-; LA64-CONTRACT-NEXT:    ret
+; LA32-CONTRACT-FAST-LABEL: contract_xvfnmsub_s:
+; LA32-CONTRACT-FAST:       # %bb.0: # %entry
+; LA32-CONTRACT-FAST-NEXT:    xvld $xr0, $a1, 0
+; LA32-CONTRACT-FAST-NEXT:    xvld $xr1, $a2, 0
+; LA32-CONTRACT-FAST-NEXT:    xvld $xr2, $a3, 0
+; LA32-CONTRACT-FAST-NEXT:    xvfnmsub.s $xr0, $xr0, $xr1, $xr2
+; LA32-CONTRACT-FAST-NEXT:    xvst $xr0, $a0, 0
+; LA32-CONTRACT-FAST-NEXT:    ret
+;
+; LA32-CONTRACT-ON-LABEL: contract_xvfnmsub_s:
+; LA32-CONTRACT-ON:       # %bb.0: # %entry
+; LA32-CONTRACT-ON-NEXT:    xvld $xr0, $a1, 0
+; LA32-CONTRACT-ON-NEXT:    xvld $xr1, $a2, 0
+; LA32-CONTRACT-ON-NEXT:    xvld $xr2, $a3, 0
+; LA32-CONTRACT-ON-NEXT:    xvfnmsub.s $xr0, $xr0, $xr1, $xr2
+; LA32-CONTRACT-ON-NEXT:    xvst $xr0, $a0, 0
+; LA32-CONTRACT-ON-NEXT:    ret
+;
+; LA32-CONTRACT-OFF-LABEL: contract_xvfnmsub_s:
+; LA32-CONTRACT-OFF:       # %bb.0: # %entry
+; LA32-CONTRACT-OFF-NEXT:    xvld $xr0, $a1, 0
+; LA32-CONTRACT-OFF-NEXT:    xvld $xr1, $a2, 0
+; LA32-CONTRACT-OFF-NEXT:    xvld $xr2, $a3, 0
+; LA32-CONTRACT-OFF-NEXT:    xvfnmsub.s $xr0, $xr0, $xr1, $xr2
+; LA32-CONTRACT-OFF-NEXT:    xvst $xr0, $a0, 0
+; LA32-CONTRACT-OFF-NEXT:    ret
+;
+; LA64-CONTRACT-FAST-LABEL: contract_xvfnmsub_s:
+; LA64-CONTRACT-FAST:       # %bb.0: # %entry
+; LA64-CONTRACT-FAST-NEXT:    xvld $xr0, $a1, 0
+; LA64-CONTRACT-FAST-NEXT:    xvld $xr1, $a2, 0
+; LA64-CONTRACT-FAST-NEXT:    xvld $xr2, $a3, 0
+; LA64-CONTRACT-FAST-NEXT:    xvfnmsub.s $xr0, $xr0, $xr1, $xr2
+; LA64-CONTRACT-FAST-NEXT:    xvst $xr0, $a0, 0
+; LA64-CONTRACT-FAST-NEXT:    ret
+;
+; LA64-CONTRACT-ON-LABEL: contract_xvfnmsub_s:
+; LA64-CONTRACT-ON:       # %bb.0: # %entry
+; LA64-CONTRACT-ON-NEXT:    xvld $xr0, $a1, 0
+; LA64-CONTRACT-ON-NEXT:    xvld $xr1, $a2, 0
+; LA64-CONTRACT-ON-NEXT:    xvld $xr2, $a3, 0
+; LA64-CONTRACT-ON-NEXT:    xvfnmsub.s $xr0, $xr0, $xr1, $xr2
+; LA64-CONTRACT-ON-NEXT:    xvst $xr0, $a0, 0
+; LA64-CONTRACT-ON-NEXT:    ret
+;
+; LA64-CONTRACT-OFF-LABEL: contract_xvfnmsub_s:
+; LA64-CONTRACT-OFF:       # %bb.0: # %entry
+; LA64-CONTRACT-OFF-NEXT:    xvld $xr0, $a1, 0
+; LA64-CONTRACT-OFF-NEXT:    xvld $xr1, $a2, 0
+; LA64-CONTRACT-OFF-NEXT:    xvld $xr2, $a3, 0
+; LA64-CONTRACT-OFF-NEXT:    xvfnmsub.s $xr0, $xr0, $xr1, $xr2
+; LA64-CONTRACT-OFF-NEXT:    xvst $xr0, $a0, 0
+; LA64-CONTRACT-OFF-NEXT:    ret
 entry:
   %v0 = load <8 x float>, ptr %a0
   %v1 = load <8 x float>, ptr %a1
@@ -442,23 +986,59 @@ entry:
 }
 
 define void @contract_xvfnmsub_s_nsz(ptr %res, ptr %a0, ptr %a1, ptr %a2) nounwind {
-; LA32-CONTRACT-LABEL: contract_xvfnmsub_s_nsz:
-; LA32-CONTRACT:       # %bb.0: # %entry
-; LA32-CONTRACT-NEXT:    xvld $xr0, $a1, 0
-; LA32-CONTRACT-NEXT:    xvld $xr1, $a2, 0
-; LA32-CONTRACT-NEXT:    xvld $xr2, $a3, 0
-; LA32-CONTRACT-NEXT:    xvfnmsub.s $xr0, $xr0, $xr1, $xr2
-; LA32-CONTRACT-NEXT:    xvst $xr0, $a0, 0
-; LA32-CONTRACT-NEXT:    ret
-;
-; LA64-CONTRACT-LABEL: contract_xvfnmsub_s_nsz:
-; LA64-CONTRACT:       # %bb.0: # %entry
-; LA64-CONTRACT-NEXT:    xvld $xr0, $a1, 0
-; LA64-CONTRACT-NEXT:    xvld $xr1, $a2, 0
-; LA64-CONTRACT-NEXT:    xvld $xr2, $a3, 0
-; LA64-CONTRACT-NEXT:    xvfnmsub.s $xr0, $xr0, $xr1, $xr2
-; LA64-CONTRACT-NEXT:    xvst $xr0, $a0, 0
-; LA64-CONTRACT-NEXT:    ret
+; LA32-CONTRACT-FAST-LABEL: contract_xvfnmsub_s_nsz:
+; LA32-CONTRACT-FAST:       # %bb.0: # %entry
+; LA32-CONTRACT-FAST-NEXT:    xvld $xr0, $a1, 0
+; LA32-CONTRACT-FAST-NEXT:    xvld $xr1, $a2, 0
+; LA32-CONTRACT-FAST-NEXT:    xvld $xr2, $a3, 0
+; LA32-CONTRACT-FAST-NEXT:    xvfnmsub.s $xr0, $xr0, $xr1, $xr2
+; LA32-CONTRACT-FAST-NEXT:    xvst $xr0, $a0, 0
+; LA32-CONTRACT-FAST-NEXT:    ret
+;
+; LA32-CONTRACT-ON-LABEL: contract_xvfnmsub_s_nsz:
+; LA32-CONTRACT-ON:       # %bb.0: # %entry
+; LA32-CONTRACT-ON-NEXT:    xvld $xr0, $a1, 0
+; LA32-CONTRACT-ON-NEXT:    xvld $xr1, $a2, 0
+; LA32-CONTRACT-ON-NEXT:    xvld $xr2, $a3, 0
+; LA32-CONTRACT-ON-NEXT:    xvfnmsub.s $xr0, $xr0, $xr1, $xr2
+; LA32-CONTRACT-ON-NEXT:    xvst $xr0, $a0, 0
+; LA32-CONTRACT-ON-NEXT:    ret
+;
+; LA32-CONTRACT-OFF-LABEL: contract_xvfnmsub_s_nsz:
+; LA32-CONTRACT-OFF:       # %bb.0: # %entry
+; LA32-CONTRACT-OFF-NEXT:    xvld $xr0, $a1, 0
+; LA32-CONTRACT-OFF-NEXT:    xvld $xr1, $a2, 0
+; LA32-CONTRACT-OFF-NEXT:    xvld $xr2, $a3, 0
+; LA32-CONTRACT-OFF-NEXT:    xvfnmsub.s $xr0, $xr0, $xr1, $xr2
+; LA32-CONTRACT-OFF-NEXT:    xvst $xr0, $a0, 0
+; LA32-CONTRACT-OFF-NEXT:    ret
+;
+; LA64-CONTRACT-FAST-LABEL: contract_xvfnmsub_s_nsz:
+; LA64-CONTRACT-FAST:       # %bb.0: # %entry
+; LA64-CONTRACT-FAST-NEXT:    xvld $xr0, $a1, 0
+; LA64-CONTRACT-FAST-NEXT:    xvld $xr1, $a2, 0
+; LA64-CONTRACT-FAST-NEXT:    xvld $xr2, $a3, 0
+; LA64-CONTRACT-FAST-NEXT:    xvfnmsub.s $xr0, $xr0, $xr1, $xr2
+; LA64-CONTRACT-FAST-NEXT:    xvst $xr0, $a0, 0
+; LA64-CONTRACT-FAST-NEXT:    ret
+;
+; LA64-CONTRACT-ON-LABEL: contract_xvfnmsub_s_nsz:
+; LA64-CONTRACT-ON:       # %bb.0: # %entry
+; LA64-CONTRACT-ON-NEXT:    xvld $xr0, $a1, 0
+; LA64-CONTRACT-ON-NEXT:    xvld $xr1, $a2, 0
+; LA64-CONTRACT-ON-NEXT:    xvld $xr2, $a3, 0
+; LA64-CONTRACT-ON-NEXT:    xvfnmsub.s $xr0, $xr0, $xr1, $xr2
+; LA64-CONTRACT-ON-NEXT:    xvst $xr0, $a0, 0
+; LA64-CONTRACT-ON-NEXT:    ret
+;
+; LA64-CONTRACT-OFF-LABEL: contract_xvfnmsub_s_nsz:
+; LA64-CONTRACT-OFF:       # %bb.0: # %entry
+; LA64-CONTRACT-OFF-NEXT:    xvld $xr0, $a1, 0
+; LA64-CONTRACT-OFF-NEXT:    xvld $xr1, $a2, 0
+; LA64-CONTRACT-OFF-NEXT:    xvld $xr2, $a3, 0
+; LA64-CONTRACT-OFF-NEXT:    xvfnmsub.s $xr0, $xr0, $xr1, $xr2
+; LA64-CONTRACT-OFF-NEXT:    xvst $xr0, $a0, 0
+; LA64-CONTRACT-OFF-NEXT:    ret
 entry:
   %v0 = load <8 x float>, ptr %a0
   %v1 = load <8 x float>, ptr %a1
@@ -472,25 +1052,65 @@ entry:
 
 ;; Check that fnmsub.s is not emitted.
 define void @not_contract_xvfnmsub_s(ptr %res, ptr %a0, ptr %a1, ptr %a2) nounwind {
-; LA32-CONTRACT-LABEL: not_contract_xvfnmsub_s:
-; LA32-CONTRACT:       # %bb.0: # %entry
-; LA32-CONTRACT-NEXT:    xvld $xr0, $a1, 0
-; LA32-CONTRACT-NEXT:    xvld $xr1, $a2, 0
-; LA32-CONTRACT-NEXT:    xvld $xr2, $a3, 0
-; LA32-CONTRACT-NEXT:    xvbitrevi.w $xr0, $xr0, 31
-; LA32-CONTRACT-NEXT:    xvfmadd.s $xr0, $xr0, $xr1, $xr2
-; LA32-CONTRACT-NEXT:    xvst $xr0, $a0, 0
-; LA32-CONTRACT-NEXT:    ret
-;
-; LA64-CONTRACT-LABEL: not_contract_xvfnmsub_s:
-; LA64-CONTRACT:       # %bb.0: # %entry
-; LA64-CONTRACT-NEXT:    xvld $xr0, $a1, 0
-; LA64-CONTRACT-NEXT:    xvld $xr1, $a2, 0
-; LA64-CONTRACT-NEXT:    xvld $xr2, $a3, 0
-; LA64-CONTRACT-NEXT:    xvbitrevi.w $xr0, $xr0, 31
-; LA64-CONTRACT-NEXT:    xvfmadd.s $xr0, $xr0, $xr1, $xr2
-; LA64-CONTRACT-NEXT:    xvst $xr0, $a0, 0
-; LA64-CONTRACT-NEXT:    ret
+; LA32-CONTRACT-FAST-LABEL: not_contract_xvfnmsub_s:
+; LA32-CONTRACT-FAST:       # %bb.0: # %entry
+; LA32-CONTRACT-FAST-NEXT:    xvld $xr0, $a1, 0
+; LA32-CONTRACT-FAST-NEXT:    xvld $xr1, $a2, 0
+; LA32-CONTRACT-FAST-NEXT:    xvld $xr2, $a3, 0
+; LA32-CONTRACT-FAST-NEXT:    xvbitrevi.w $xr0, $xr0, 31
+; LA32-CONTRACT-FAST-NEXT:    xvfmadd.s $xr0, $xr0, $xr1, $xr2
+; LA32-CONTRACT-FAST-NEXT:    xvst $xr0, $a0, 0
+; LA32-CONTRACT-FAST-NEXT:    ret
+;
+; LA32-CONTRACT-ON-LABEL: not_contract_xvfnmsub_s:
+; LA32-CONTRACT-ON:       # %bb.0: # %entry
+; LA32-CONTRACT-ON-NEXT:    xvld $xr0, $a1, 0
+; LA32-CONTRACT-ON-NEXT:    xvld $xr1, $a2, 0
+; LA32-CONTRACT-ON-NEXT:    xvld $xr2, $a3, 0
+; LA32-CONTRACT-ON-NEXT:    xvbitrevi.w $xr0, $xr0, 31
+; LA32-CONTRACT-ON-NEXT:    xvfmadd.s $xr0, $xr0, $xr1, $xr2
+; LA32-CONTRACT-ON-NEXT:    xvst $xr0, $a0, 0
+; LA32-CONTRACT-ON-NEXT:    ret
+;
+; LA32-CONTRACT-OFF-LABEL: not_contract_xvfnmsub_s:
+; LA32-CONTRACT-OFF:       # %bb.0: # %entry
+; LA32-CONTRACT-OFF-NEXT:    xvld $xr0, $a1, 0
+; LA32-CONTRACT-OFF-NEXT:    xvld $xr1, $a2, 0
+; LA32-CONTRACT-OFF-NEXT:    xvld $xr2, $a3, 0
+; LA32-CONTRACT-OFF-NEXT:    xvbitrevi.w $xr0, $xr0, 31
+; LA32-CONTRACT-OFF-NEXT:    xvfmadd.s $xr0, $xr0, $xr1, $xr2
+; LA32-CONTRACT-OFF-NEXT:    xvst $xr0, $a0, 0
+; LA32-CONTRACT-OFF-NEXT:    ret
+;
+; LA64-CONTRACT-FAST-LABEL: not_contract_xvfnmsub_s:
+; LA64-CONTRACT-FAST:       # %bb.0: # %entry
+; LA64-CONTRACT-FAST-NEXT:    xvld $xr0, $a1, 0
+; LA64-CONTRACT-FAST-NEXT:    xvld $xr1, $a2, 0
+; LA64-CONTRACT-FAST-NEXT:    xvld $xr2, $a3, 0
+; LA64-CONTRACT-FAST-NEXT:    xvbitrevi.w $xr0, $xr0, 31
+; LA64-CONTRACT-FAST-NEXT:    xvfmadd.s $xr0, $xr0, $xr1, $xr2
+; LA64-CONTRACT-FAST-NEXT:    xvst $xr0, $a0, 0
+; LA64-CONTRACT-FAST-NEXT:    ret
+;
+; LA64-CONTRACT-ON-LABEL: not_contract_xvfnmsub_s:
+; LA64-CONTRACT-ON:       # %bb.0: # %entry
+; LA64-CONTRACT-ON-NEXT:    xvld $xr0, $a1, 0
+; LA64-CONTRACT-ON-NEXT:    xvld $xr1, $a2, 0
+; LA64-CONTRACT-ON-NEXT:    xvld $xr2, $a3, 0
+; LA64-CONTRACT-ON-NEXT:    xvbitrevi.w $xr0, $xr0, 31
+; LA64-CONTRACT-ON-NEXT:    xvfmadd.s $xr0, $xr0, $xr1, $xr2
+; LA64-CONTRACT-ON-NEXT:    xvst $xr0, $a0, 0
+; LA64-CONTRACT-ON-NEXT:    ret
+;
+; LA64-CONTRACT-OFF-LABEL: not_contract_xvfnmsub_s:
+; LA64-CONTRACT-OFF:       # %bb.0: # %entry
+; LA64-CONTRACT-OFF-NEXT:    xvld $xr0, $a1, 0
+; LA64-CONTRACT-OFF-NEXT:    xvld $xr1, $a2, 0
+; LA64-CONTRACT-OFF-NEXT:    xvld $xr2, $a3, 0
+; LA64-CONTRACT-OFF-NEXT:    xvbitrevi.w $xr0, $xr0, 31
+; LA64-CONTRACT-OFF-NEXT:    xvfmadd.s $xr0, $xr0, $xr1, $xr2
+; LA64-CONTRACT-OFF-NEXT:    xvst $xr0, $a0, 0
+; LA64-CONTRACT-OFF-NEXT:    ret
 entry:
   %v0 = load <8 x float>, ptr %a0
   %v1 = load <8 x float>, ptr %a1
@@ -503,23 +1123,59 @@ entry:
 }
 
 define void @xvfmadd_s_contract(ptr %res, ptr %a0, ptr %a1, ptr %a2) nounwind {
-; LA32-CONTRACT-LABEL: xvfmadd_s_contract:
-; LA32-CONTRACT:       # %bb.0: # %entry
-; LA32-CONTRACT-NEXT:    xvld $xr0, $a1, 0
-; LA32-CONTRACT-NEXT:    xvld $xr1, $a2, 0
-; LA32-CONTRACT-NEXT:    xvld $xr2, $a3, 0
-; LA32-CONTRACT-NEXT:    xvfmadd.s $xr0, $xr0, $xr1, $xr2
-; LA32-CONTRACT-NEXT:    xvst $xr0, $a0, 0
-; LA32-CONTRACT-NEXT:    ret
-;
-; LA64-CONTRACT-LABEL: xvfmadd_s_contract:
-; LA64-CONTRACT:       # %bb.0: # %entry
-; LA64-CONTRACT-NEXT:    xvld $xr0, $a1, 0
-; LA64-CONTRACT-NEXT:    xvld $xr1, $a2, 0
-; LA64-CONTRACT-NEXT:    xvld $xr2, $a3, 0
-; LA64-CONTRACT-NEXT:    xvfmadd.s $xr0, $xr0, $xr1, $xr2
-; LA64-CONTRACT-NEXT:    xvst $xr0, $a0, 0
-; LA64-CONTRACT-NEXT:    ret
+; LA32-CONTRACT-FAST-LABEL: xvfmadd_s_contract:
+; LA32-CONTRACT-FAST:       # %bb.0: # %entry
+; LA32-CONTRACT-FAST-NEXT:    xvld $xr0, $a1, 0
+; LA32-CONTRACT-FAST-NEXT:    xvld $xr1, $a2, 0
+; LA32-CONTRACT-FAST-NEXT:    xvld $xr2, $a3, 0
+; LA32-CONTRACT-FAST-NEXT:    xvfmadd.s $xr0, $xr0, $xr1, $xr2
+; LA32-CONTRACT-FAST-NEXT:    xvst $xr0, $a0, 0
+; LA32-CONTRACT-FAST-NEXT:    ret
+;
+; LA32-CONTRACT-ON-LABEL: xvfmadd_s_contract:
+; LA32-CONTRACT-ON:       # %bb.0: # %entry
+; LA32-CONTRACT-ON-NEXT:    xvld $xr0, $a1, 0
+; LA32-CONTRACT-ON-NEXT:    xvld $xr1, $a2, 0
+; LA32-CONTRACT-ON-NEXT:    xvld $xr2, $a3, 0
+; LA32-CONTRACT-ON-NEXT:    xvfmadd.s $xr0, $xr0, $xr1, $xr2
+; LA32-CONTRACT-ON-NEXT:    xvst $xr0, $a0, 0
+; LA32-CONTRACT-ON-NEXT:    ret
+;
+; LA32-CONTRACT-OFF-LABEL: xvfmadd_s_contract:
+; LA32-CONTRACT-OFF:       # %bb.0: # %entry
+; LA32-CONTRACT-OFF-NEXT:    xvld $xr0, $a1, 0
+; LA32-CONTRACT-OFF-NEXT:    xvld $xr1, $a2, 0
+; LA32-CONTRACT-OFF-NEXT:    xvld $xr2, $a3, 0
+; LA32-CONTRACT-OFF-NEXT:    xvfmadd.s $xr0, $xr0, $xr1, $xr2
+; LA32-CONTRACT-OFF-NEXT:    xvst $xr0, $a0, 0
+; LA32-CONTRACT-OFF-NEXT:    ret
+;
+; LA64-CONTRACT-FAST-LABEL: xvfmadd_s_contract:
+; LA64-CONTRACT-FAST:       # %bb.0: # %entry
+; LA64-CONTRACT-FAST-NEXT:    xvld $xr0, $a1, 0
+; LA64-CONTRACT-FAST-NEXT:    xvld $xr1, $a2, 0
+; LA64-CONTRACT-FAST-NEXT:    xvld $xr2, $a3, 0
+; LA64-CONTRACT-FAST-NEXT:    xvfmadd.s $xr0, $xr0, $xr1, $xr2
+; LA64-CONTRACT-FAST-NEXT:    xvst $xr0, $a0, 0
+; LA64-CONTRACT-FAST-NEXT:    ret
+;
+; LA64-CONTRACT-ON-LABEL: xvfmadd_s_contract:
+; LA64-CONTRACT-ON:       # %bb.0: # %entry
+; LA64-CONTRACT-ON-NEXT:    xvld $xr0, $a1, 0
+; LA64-CONTRACT-ON-NEXT:    xvld $xr1, $a2, 0
+; LA64-CONTRACT-ON-NEXT:    xvld $xr2, $a3, 0
+; LA64-CONTRACT-ON-NEXT:    xvfmadd.s $xr0, $xr0, $xr1, $xr2
+; LA64-CONTRACT-ON-NEXT:    xvst $xr0, $a0, 0
+; LA64-CONTRACT-ON-NEXT:    ret
+;
+; LA64-CONTRACT-OFF-LABEL: xvfmadd_s_contract:
+; LA64-CONTRACT-OFF:       # %bb.0: # %entry
+; LA64-CONTRACT-OFF-NEXT:    xvld $xr0, $a1, 0
+; LA64-CONTRACT-OFF-NEXT:    xvld $xr1, $a2, 0
+; LA64-CONTRACT-OFF-NEXT:    xvld $xr2, $a3, 0
+; LA64-CONTRACT-OFF-NEXT:    xvfmadd.s $xr0, $xr0, $xr1, $xr2
+; LA64-CONTRACT-OFF-NEXT:    xvst $xr0, $a0, 0
+; LA64-CONTRACT-OFF-NEXT:    ret
 entry:
   %v0 = load <8 x float>, ptr %a0
   %v1 = load <8 x float>, ptr %a1
@@ -531,23 +1187,59 @@ entry:
 }
 
 define void @xvfmsub_s_contract(ptr %res, ptr %a0, ptr %a1, ptr %a2) nounwind {
-; LA32-CONTRACT-LABEL: xvfmsub_s_contract:
-; LA32-CONTRACT:       # %bb.0: # %entry
-; LA32-CONTRACT-NEXT:    xvld $xr0, $a1, 0
-; LA32-CONTRACT-NEXT:    xvld $xr1, $a2, 0
-; LA32-CONTRACT-NEXT:    xvld $xr2, $a3, 0
-; LA32-CONTRACT-NEXT:    xvfmsub.s $xr0, $xr0, $xr1, $xr2
-; LA32-CONTRACT-NEXT:    xvst $xr0, $a0, 0
-; LA32-CONTRACT-NEXT:    ret
-;
-; LA64-CONTRACT-LABEL: xvfmsub_s_contract:
-; LA64-CONTRACT:       # %bb.0: # %entry
-; LA64-CONTRACT-NEXT:    xvld $xr0, $a1, 0
-; LA64-CONTRACT-NEXT:    xvld $xr1, $a2, 0
-; LA64-CONTRACT-NEXT:    xvld $xr2, $a3, 0
-; LA64-CONTRACT-NEXT:    xvfmsub.s $xr0, $xr0, $xr1, $xr2
-; LA64-CONTRACT-NEXT:    xvst $xr0, $a0, 0
-; LA64-CONTRACT-NEXT:    ret
+; LA32-CONTRACT-FAST-LABEL: xvfmsub_s_contract:
+; LA32-CONTRACT-FAST:       # %bb.0: # %entry
+; LA32-CONTRACT-FAST-NEXT:    xvld $xr0, $a1, 0
+; LA32-CONTRACT-FAST-NEXT:    xvld $xr1, $a2, 0
+; LA32-CONTRACT-FAST-NEXT:    xvld $xr2, $a3, 0
+; LA32-CONTRACT-FAST-NEXT:    xvfmsub.s $xr0, $xr0, $xr1, $xr2
+; LA32-CONTRACT-FAST-NEXT:    xvst $xr0, $a0, 0
+; LA32-CONTRACT-FAST-NEXT:    ret
+;
+; LA32-CONTRACT-ON-LABEL: xvfmsub_s_contract:
+; LA32-CONTRACT-ON:       # %bb.0: # %entry
+; LA32-CONTRACT-ON-NEXT:    xvld $xr0, $a1, 0
+; LA32-CONTRACT-ON-NEXT:    xvld $xr1, $a2, 0
+; LA32-CONTRACT-ON-NEXT:    xvld $xr2, $a3, 0
+; LA32-CONTRACT-ON-NEXT:    xvfmsub.s $xr0, $xr0, $xr1, $xr2
+; LA32-CONTRACT-ON-NEXT:    xvst $xr0, $a0, 0
+; LA32-CONTRACT-ON-NEXT:    ret
+;
+; LA32-CONTRACT-OFF-LABEL: xvfmsub_s_contract:
+; LA32-CONTRACT-OFF:       # %bb.0: # %entry
+; LA32-CONTRACT-OFF-NEXT:    xvld $xr0, $a1, 0
+; LA32-CONTRACT-OFF-NEXT:    xvld $xr1, $a2, 0
+; LA32-CONTRACT-OFF-NEXT:    xvld $xr2, $a3, 0
+; LA32-CONTRACT-OFF-NEXT:    xvfmsub.s $xr0, $xr0, $xr1, $xr2
+; LA32-CONTRACT-OFF-NEXT:    xvst $xr0, $a0, 0
+; LA32-CONTRACT-OFF-NEXT:    ret
+;
+; LA64-CONTRACT-FAST-LABEL: xvfmsub_s_contract:
+; LA64-CONTRACT-FAST:       # %bb.0: # %entry
+; LA64-CONTRACT-FAST-NEXT:    xvld $xr0, $a1, 0
+; LA64-CONTRACT-FAST-NEXT:    xvld $xr1, $a2, 0
+; LA64-CONTRACT-FAST-NEXT:    xvld $xr2, $a3, 0
+; LA64-CONTRACT-FAST-NEXT:    xvfmsub.s $xr0, $xr0, $xr1, $xr2
+; LA64-CONTRACT-FAST-NEXT:    xvst $xr0, $a0, 0
+; LA64-CONTRACT-FAST-NEXT:    ret
+;
+; LA64-CONTRACT-ON-LABEL: xvfmsub_s_contract:
+; LA64-CONTRACT-ON:       # %bb.0: # %entry
+; LA64-CONTRACT-ON-NEXT:    xvld $xr0, $a1, 0
+; LA64-CONTRACT-ON-NEXT:    xvld $xr1, $a2, 0
+; LA64-CONTRACT-ON-NEXT:    xvld $xr2, $a3, 0
+; LA64-CONTRACT-ON-NEXT:    xvfmsub.s $xr0, $xr0, $xr1, $xr2
+; LA64-CONTRACT-ON-NEXT:    xvst $xr0, $a0, 0
+; LA64-CONTRACT-ON-NEXT:    ret
+;
+; LA64-CONTRACT-OFF-LABEL: xvfmsub_s_contract:
+; LA64-CONTRACT-OFF:       # %bb.0: # %entry
+; LA64-CONTRACT-OFF-NEXT:    xvld $xr0, $a1, 0
+; LA64-CONTRACT-OFF-NEXT:    xvld $xr1, $a2, 0
+; LA64-CONTRACT-OFF-NEXT:    xvld $xr2, $a3, 0
+; LA64-CONTRACT-OFF-NEXT:    xvfmsub.s $xr0, $xr0, $xr1, $xr2
+; LA64-CONTRACT-OFF-NEXT:    xvst $xr0, $a0, 0
+; LA64-CONTRACT-OFF-NEXT:    ret
 entry:
   %v0 = load <8 x float>, ptr %a0
   %v1 = load <8 x float>, ptr %a1
@@ -559,23 +1251,59 @@ entry:
 }
 
 define void @xvfnmadd_s_contract(ptr %res, ptr %a0, ptr %a1, ptr %a2) nounwind {
-; LA32-CONTRACT-LABEL: xvfnmadd_s_contract:
-; LA32-CONTRACT:       # %bb.0: # %entry
-; LA32-CONTRACT-NEXT:    xvld $xr0, $a1, 0
-; LA32-CONTRACT-NEXT:    xvld $xr1, $a2, 0
-; LA32-CONTRACT-NEXT:    xvld $xr2, $a3, 0
-; LA32-CONTRACT-NEXT:    xvfnmadd.s $xr0, $xr0, $xr1, $xr2
-; LA32-CONTRACT-NEXT:    xvst $xr0, $a0, 0
-; LA32-CONTRACT-NEXT:    ret
-;
-; LA64-CONTRACT-LABEL: xvfnmadd_s_contract:
-; LA64-CONTRACT:       # %bb.0: # %entry
-; LA64-CONTRACT-NEXT:    xvld $xr0, $a1, 0
-; LA64-CONTRACT-NEXT:    xvld $xr1, $a2, 0
-; LA64-CONTRACT-NEXT:    xvld $xr2, $a3, 0
-; LA64-CONTRACT-NEXT:    xvfnmadd.s $xr0, $xr0, $xr1, $xr2
-; LA64-CONTRACT-NEXT:    xvst $xr0, $a0, 0
-; LA64-CONTRACT-NEXT:    ret
+; LA32-CONTRACT-FAST-LABEL: xvfnmadd_s_contract:
+; LA32-CONTRACT-FAST:       # %bb.0: # %entry
+; LA32-CONTRACT-FAST-NEXT:    xvld $xr0, $a1, 0
+; LA32-CONTRACT-FAST-NEXT:    xvld $xr1, $a2, 0
+; LA32-CONTRACT-FAST-NEXT:    xvld $xr2, $a3, 0
+; LA32-CONTRACT-FAST-NEXT:    xvfnmadd.s $xr0, $xr0, $xr1, $xr2
+; LA32-CONTRACT-FAST-NEXT:    xvst $xr0, $a0, 0
+; LA32-CONTRACT-FAST-NEXT:    ret
+;
+; LA32-CONTRACT-ON-LABEL: xvfnmadd_s_contract:
+; LA32-CONTRACT-ON:       # %bb.0: # %entry
+; LA32-CONTRACT-ON-NEXT:    xvld $xr0, $a1, 0
+; LA32-CONTRACT-ON-NEXT:    xvld $xr1, $a2, 0
+; LA32-CONTRACT-ON-NEXT:    xvld $xr2, $a3, 0
+; LA32-CONTRACT-ON-NEXT:    xvfnmadd.s $xr0, $xr0, $xr1, $xr2
+; LA32-CONTRACT-ON-NEXT:    xvst $xr0, $a0, 0
+; LA32-CONTRACT-ON-NEXT:    ret
+;
+; LA32-CONTRACT-OFF-LABEL: xvfnmadd_s_contract:
+; LA32-CONTRACT-OFF:       # %bb.0: # %entry
+; LA32-CONTRACT-OFF-NEXT:    xvld $xr0, $a1, 0
+; LA32-CONTRACT-OFF-NEXT:    xvld $xr1, $a2, 0
+; LA32-CONTRACT-OFF-NEXT:    xvld $xr2, $a3, 0
+; LA32-CONTRACT-OFF-NEXT:    xvfnmadd.s $xr0, $xr0, $xr1, $xr2
+; LA32-CONTRACT-OFF-NEXT:    xvst $xr0, $a0, 0
+; LA32-CONTRACT-OFF-NEXT:    ret
+;
+; LA64-CONTRACT-FAST-LABEL: xvfnmadd_s_contract:
+; LA64-CONTRACT-FAST:       # %bb.0: # %entry
+; LA64-CONTRACT-FAST-NEXT:    xvld $xr0, $a1, 0
+; LA64-CONTRACT-FAST-NEXT:    xvld $xr1, $a2, 0
+; LA64-CONTRACT-FAST-NEXT:    xvld $xr2, $a3, 0
+; LA64-CONTRACT-FAST-NEXT:    xvfnmadd.s $xr0, $xr0, $xr1, $xr2
+; LA64-CONTRACT-FAST-NEXT:    xvst $xr0, $a0, 0
+; LA64-CONTRACT-FAST-NEXT:    ret
+;
+; LA64-CONTRACT-ON-LABEL: xvfnmadd_s_contract:
+; LA64-CONTRACT-ON:       # %bb.0: # %entry
+; LA64-CONTRACT-ON-NEXT:    xvld $xr0, $a1, 0
+; LA64-CONTRACT-ON-NEXT:    xvld $xr1, $a2, 0
+; LA64-CONTRACT-ON-NEXT:    xvld $xr2, $a3, 0
+; LA64-CONTRACT-ON-NEXT:    xvfnmadd.s $xr0, $xr0, $xr1, $xr2
+; LA64-CONTRACT-ON-NEXT:    xvst $xr0, $a0, 0
+; LA64-CONTRACT-ON-NEXT:    ret
+;
+; LA64-CONTRACT-OFF-LABEL: xvfnmadd_s_contract:
+; LA64-CONTRACT-OFF:       # %bb.0: # %entry
+; LA64-CONTRACT-OFF-NEXT:    xvld $xr0, $a1, 0
+; LA64-CONTRACT-OFF-NEXT:    xvld $xr1, $a2, 0
+; LA64-CONTRACT-OFF-NEXT:    xvld $xr2, $a3, 0
+; LA64-CONTRACT-OFF-NEXT:    xvfnmadd.s $xr0, $xr0, $xr1, $xr2
+; LA64-CONTRACT-OFF-NEXT:    xvst $xr0, $a0, 0
+; LA64-CONTRACT-OFF-NEXT:    ret
 entry:
   %v0 = load <8 x float>, ptr %a0
   %v1 = load <8 x float>, ptr %a1
@@ -588,23 +1316,59 @@ entry:
 }
 
 define void @xvfnmsub_s_contract(ptr %res, ptr %a0, ptr %a1, ptr %a2) nounwind {
-; LA32-CONTRACT-LABEL: xvfnmsub_s_contract:
-; LA32-CONTRACT:       # %bb.0: # %entry
-; LA32-CONTRACT-NEXT:    xvld $xr0, $a1, 0
-; LA32-CONTRACT-NEXT:    xvld $xr1, $a2, 0
-; LA32-CONTRACT-NEXT:    xvld $xr2, $a3, 0
-; LA32-CONTRACT-NEXT:    xvfnmsub.s $xr0, $xr0, $xr1, $xr2
-; LA32-CONTRACT-NEXT:    xvst $xr0, $a0, 0
-; LA32-CONTRACT-NEXT:    ret
-;
-; LA64-CONTRACT-LABEL: xvfnmsub_s_contract:
-; LA64-CONTRACT:       # %bb.0: # %entry
-; LA64-CONTRACT-NEXT:    xvld $xr0, $a1, 0
-; LA64-CONTRACT-NEXT:    xvld $xr1, $a2, 0
-; LA64-CONTRACT-NEXT:    xvld $xr2, $a3, 0
-; LA64-CONTRACT-NEXT:    xvfnmsub.s $xr0, $xr0, $xr1, $xr2
-; LA64-CONTRACT-NEXT:    xvst $xr0, $a0, 0
-; LA64-CONTRACT-NEXT:    ret
+; LA32-CONTRACT-FAST-LABEL: xvfnmsub_s_contract:
+; LA32-CONTRACT-FAST:       # %bb.0: # %entry
+; LA32-CONTRACT-FAST-NEXT:    xvld $xr0, $a1, 0
+; LA32-CONTRACT-FAST-NEXT:    xvld $xr1, $a2, 0
+; LA32-CONTRACT-FAST-NEXT:    xvld $xr2, $a3, 0
+; LA32-CONTRACT-FAST-NEXT:    xvfnmsub.s $xr0, $xr0, $xr1, $xr2
+; LA32-CONTRACT-FAST-NEXT:    xvst $xr0, $a0, 0
+; LA32-CONTRACT-FAST-NEXT:    ret
+;
+; LA32-CONTRACT-ON-LABEL: xvfnmsub_s_contract:
+; LA32-CONTRACT-ON:       # %bb.0: # %entry
+; LA32-CONTRACT-ON-NEXT:    xvld $xr0, $a1, 0
+; LA32-CONTRACT-ON-NEXT:    xvld $xr1, $a2, 0
+; LA32-CONTRACT-ON-NEXT:    xvld $xr2, $a3, 0
+; LA32-CONTRACT-ON-NEXT:    xvfnmsub.s $xr0, $xr0, $xr1, $xr2
+; LA32-CONTRACT-ON-NEXT:    xvst $xr0, $a0, 0
+; LA32-CONTRACT-ON-NEXT:    ret
+;
+; LA32-CONTRACT-OFF-LABEL: xvfnmsub_s_contract:
+; LA32-CONTRACT-OFF:       # %bb.0: # %entry
+; LA32-CONTRACT-OFF-NEXT:    xvld $xr0, $a1, 0
+; LA32-CONTRACT-OFF-NEXT:    xvld $xr1, $a2, 0
+; LA32-CONTRACT-OFF-NEXT:    xvld $xr2, $a3, 0
+; LA32-CONTRACT-OFF-NEXT:    xvfnmsub.s $xr0, $xr0, $xr1, $xr2
+; LA32-CONTRACT-OFF-NEXT:    xvst $xr0, $a0, 0
+; LA32-CONTRACT-OFF-NEXT:    ret
+;
+; LA64-CONTRACT-FAST-LABEL: xvfnmsub_s_contract:
+; LA64-CONTRACT-FAST:       # %bb.0: # %entry
+; LA64-CONTRACT-FAST-NEXT:    xvld $xr0, $a1, 0
+; LA64-CONTRACT-FAST-NEXT:    xvld $xr1, $a2, 0
+; LA64-CONTRACT-FAST-NEXT:    xvld $xr2, $a3, 0
+; LA64-CONTRACT-FAST-NEXT:    xvfnmsub.s $xr0, $xr0, $xr1, $xr2
+; LA64-CONTRACT-FAST-NEXT:    xvst $xr0, $a0, 0
+; LA64-CONTRACT-FAST-NEXT:    ret
+;
+; LA64-CONTRACT-ON-LABEL: xvfnmsub_s_contract:
+; LA64-CONTRACT-ON:       # %bb.0: # %entry
+; LA64-CONTRACT-ON-NEXT:    xvld $xr0, $a1, 0
+; LA64-CONTRACT-ON-NEXT:    xvld $xr1, $a2, 0
+; LA64-CONTRACT-ON-NEXT:    xvld $xr2, $a3, 0
+; LA64-CONTRACT-ON-NEXT:    xvfnmsub.s $xr0, $xr0, $xr1, $xr2
+; LA64-CONTRACT-ON-NEXT:    xvst $xr0, $a0, 0
+; LA64-CONTRACT-ON-NEXT:    ret
+;
+; LA64-CONTRACT-OFF-LABEL: xvfnmsub_s_contract:
+; LA64-CONTRACT-OFF:       # %bb.0: # %entry
+; LA64-CONTRACT-OFF-NEXT:    xvld $xr0, $a1, 0
+; LA64-CONTRACT-OFF-NEXT:    xvld $xr1, $a2, 0
+; LA64-CONTRACT-OFF-NEXT:    xvld $xr2, $a3, 0
+; LA64-CONTRACT-OFF-NEXT:    xvfnmsub.s $xr0, $xr0, $xr1, $xr2
+; LA64-CONTRACT-OFF-NEXT:    xvst $xr0, $a0, 0
+; LA64-CONTRACT-OFF-NEXT:    ret
 entry:
   %v0 = load <8 x float>, ptr %a0
   %v1 = load <8 x float>, ptr %a1

diff  --git a/llvm/test/CodeGen/LoongArch/lsx/fma-v2f64.ll b/llvm/test/CodeGen/LoongArch/lsx/fma-v2f64.ll
index 987aee0dcf24a..89442908b31be 100644
--- a/llvm/test/CodeGen/LoongArch/lsx/fma-v2f64.ll
+++ b/llvm/test/CodeGen/LoongArch/lsx/fma-v2f64.ll
@@ -1,19 +1,46 @@
 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
-; RUN: llc --mtriple=loongarch32 --mattr=+32s,+lsx < %s \
-; RUN:   | FileCheck %s --check-prefix=CONTRACT
-; RUN: llc --mtriple=loongarch64 --mattr=+lsx < %s \
-; RUN:   | FileCheck %s --check-prefix=CONTRACT
+; RUN: llc --mtriple=loongarch32 --mattr=+32s,+lsx --fp-contract=fast < %s \
+; RUN:   | FileCheck %s --check-prefix=CONTRACT-FAST
+; RUN: llc --mtriple=loongarch64 --mattr=+lsx --fp-contract=fast < %s \
+; RUN:   | FileCheck %s --check-prefix=CONTRACT-FAST
+; RUN: llc --mtriple=loongarch32 --mattr=+32s,+lsx --fp-contract=on < %s \
+; RUN:   | FileCheck %s --check-prefix=CONTRACT-ON
+; RUN: llc --mtriple=loongarch64 --mattr=+lsx --fp-contract=on < %s \
+; RUN:   | FileCheck %s --check-prefix=CONTRACT-ON
+; RUN: llc --mtriple=loongarch32 --mattr=+32s,+lsx --fp-contract=off < %s \
+; RUN:   | FileCheck %s --check-prefix=CONTRACT-OFF
+; RUN: llc --mtriple=loongarch64 --mattr=+lsx --fp-contract=off < %s \
+; RUN:   | FileCheck %s --check-prefix=CONTRACT-OFF
 
 define void @vfmadd_d(ptr %res, ptr %a0, ptr %a1, ptr %a2) nounwind {
-; CONTRACT-LABEL: vfmadd_d:
-; CONTRACT:       # %bb.0: # %entry
-; CONTRACT-NEXT:    vld $vr0, $a1, 0
-; CONTRACT-NEXT:    vld $vr1, $a2, 0
-; CONTRACT-NEXT:    vld $vr2, $a3, 0
-; CONTRACT-NEXT:    vfmul.d $vr0, $vr0, $vr1
-; CONTRACT-NEXT:    vfadd.d $vr0, $vr0, $vr2
-; CONTRACT-NEXT:    vst $vr0, $a0, 0
-; CONTRACT-NEXT:    ret
+; CONTRACT-FAST-LABEL: vfmadd_d:
+; CONTRACT-FAST:       # %bb.0: # %entry
+; CONTRACT-FAST-NEXT:    vld $vr0, $a1, 0
+; CONTRACT-FAST-NEXT:    vld $vr1, $a2, 0
+; CONTRACT-FAST-NEXT:    vld $vr2, $a3, 0
+; CONTRACT-FAST-NEXT:    vfmadd.d $vr0, $vr0, $vr1, $vr2
+; CONTRACT-FAST-NEXT:    vst $vr0, $a0, 0
+; CONTRACT-FAST-NEXT:    ret
+;
+; CONTRACT-ON-LABEL: vfmadd_d:
+; CONTRACT-ON:       # %bb.0: # %entry
+; CONTRACT-ON-NEXT:    vld $vr0, $a1, 0
+; CONTRACT-ON-NEXT:    vld $vr1, $a2, 0
+; CONTRACT-ON-NEXT:    vld $vr2, $a3, 0
+; CONTRACT-ON-NEXT:    vfmul.d $vr0, $vr0, $vr1
+; CONTRACT-ON-NEXT:    vfadd.d $vr0, $vr0, $vr2
+; CONTRACT-ON-NEXT:    vst $vr0, $a0, 0
+; CONTRACT-ON-NEXT:    ret
+;
+; CONTRACT-OFF-LABEL: vfmadd_d:
+; CONTRACT-OFF:       # %bb.0: # %entry
+; CONTRACT-OFF-NEXT:    vld $vr0, $a1, 0
+; CONTRACT-OFF-NEXT:    vld $vr1, $a2, 0
+; CONTRACT-OFF-NEXT:    vld $vr2, $a3, 0
+; CONTRACT-OFF-NEXT:    vfmul.d $vr0, $vr0, $vr1
+; CONTRACT-OFF-NEXT:    vfadd.d $vr0, $vr0, $vr2
+; CONTRACT-OFF-NEXT:    vst $vr0, $a0, 0
+; CONTRACT-OFF-NEXT:    ret
 entry:
   %v0 = load <2 x double>, ptr %a0
   %v1 = load <2 x double>, ptr %a1
@@ -25,15 +52,34 @@ entry:
 }
 
 define void @vfmsub_d(ptr %res, ptr %a0, ptr %a1, ptr %a2) nounwind {
-; CONTRACT-LABEL: vfmsub_d:
-; CONTRACT:       # %bb.0: # %entry
-; CONTRACT-NEXT:    vld $vr0, $a1, 0
-; CONTRACT-NEXT:    vld $vr1, $a2, 0
-; CONTRACT-NEXT:    vld $vr2, $a3, 0
-; CONTRACT-NEXT:    vfmul.d $vr0, $vr0, $vr1
-; CONTRACT-NEXT:    vfsub.d $vr0, $vr0, $vr2
-; CONTRACT-NEXT:    vst $vr0, $a0, 0
-; CONTRACT-NEXT:    ret
+; CONTRACT-FAST-LABEL: vfmsub_d:
+; CONTRACT-FAST:       # %bb.0: # %entry
+; CONTRACT-FAST-NEXT:    vld $vr0, $a1, 0
+; CONTRACT-FAST-NEXT:    vld $vr1, $a2, 0
+; CONTRACT-FAST-NEXT:    vld $vr2, $a3, 0
+; CONTRACT-FAST-NEXT:    vfmsub.d $vr0, $vr0, $vr1, $vr2
+; CONTRACT-FAST-NEXT:    vst $vr0, $a0, 0
+; CONTRACT-FAST-NEXT:    ret
+;
+; CONTRACT-ON-LABEL: vfmsub_d:
+; CONTRACT-ON:       # %bb.0: # %entry
+; CONTRACT-ON-NEXT:    vld $vr0, $a1, 0
+; CONTRACT-ON-NEXT:    vld $vr1, $a2, 0
+; CONTRACT-ON-NEXT:    vld $vr2, $a3, 0
+; CONTRACT-ON-NEXT:    vfmul.d $vr0, $vr0, $vr1
+; CONTRACT-ON-NEXT:    vfsub.d $vr0, $vr0, $vr2
+; CONTRACT-ON-NEXT:    vst $vr0, $a0, 0
+; CONTRACT-ON-NEXT:    ret
+;
+; CONTRACT-OFF-LABEL: vfmsub_d:
+; CONTRACT-OFF:       # %bb.0: # %entry
+; CONTRACT-OFF-NEXT:    vld $vr0, $a1, 0
+; CONTRACT-OFF-NEXT:    vld $vr1, $a2, 0
+; CONTRACT-OFF-NEXT:    vld $vr2, $a3, 0
+; CONTRACT-OFF-NEXT:    vfmul.d $vr0, $vr0, $vr1
+; CONTRACT-OFF-NEXT:    vfsub.d $vr0, $vr0, $vr2
+; CONTRACT-OFF-NEXT:    vst $vr0, $a0, 0
+; CONTRACT-OFF-NEXT:    ret
 entry:
   %v0 = load <2 x double>, ptr %a0
   %v1 = load <2 x double>, ptr %a1
@@ -45,16 +91,36 @@ entry:
 }
 
 define void @vfnmadd_d(ptr %res, ptr %a0, ptr %a1, ptr %a2) nounwind {
-; CONTRACT-LABEL: vfnmadd_d:
-; CONTRACT:       # %bb.0: # %entry
-; CONTRACT-NEXT:    vld $vr0, $a1, 0
-; CONTRACT-NEXT:    vld $vr1, $a2, 0
-; CONTRACT-NEXT:    vld $vr2, $a3, 0
-; CONTRACT-NEXT:    vfmul.d $vr0, $vr0, $vr1
-; CONTRACT-NEXT:    vfadd.d $vr0, $vr0, $vr2
-; CONTRACT-NEXT:    vbitrevi.d $vr0, $vr0, 63
-; CONTRACT-NEXT:    vst $vr0, $a0, 0
-; CONTRACT-NEXT:    ret
+; CONTRACT-FAST-LABEL: vfnmadd_d:
+; CONTRACT-FAST:       # %bb.0: # %entry
+; CONTRACT-FAST-NEXT:    vld $vr0, $a1, 0
+; CONTRACT-FAST-NEXT:    vld $vr1, $a2, 0
+; CONTRACT-FAST-NEXT:    vld $vr2, $a3, 0
+; CONTRACT-FAST-NEXT:    vfnmadd.d $vr0, $vr0, $vr1, $vr2
+; CONTRACT-FAST-NEXT:    vst $vr0, $a0, 0
+; CONTRACT-FAST-NEXT:    ret
+;
+; CONTRACT-ON-LABEL: vfnmadd_d:
+; CONTRACT-ON:       # %bb.0: # %entry
+; CONTRACT-ON-NEXT:    vld $vr0, $a1, 0
+; CONTRACT-ON-NEXT:    vld $vr1, $a2, 0
+; CONTRACT-ON-NEXT:    vld $vr2, $a3, 0
+; CONTRACT-ON-NEXT:    vfmul.d $vr0, $vr0, $vr1
+; CONTRACT-ON-NEXT:    vfadd.d $vr0, $vr0, $vr2
+; CONTRACT-ON-NEXT:    vbitrevi.d $vr0, $vr0, 63
+; CONTRACT-ON-NEXT:    vst $vr0, $a0, 0
+; CONTRACT-ON-NEXT:    ret
+;
+; CONTRACT-OFF-LABEL: vfnmadd_d:
+; CONTRACT-OFF:       # %bb.0: # %entry
+; CONTRACT-OFF-NEXT:    vld $vr0, $a1, 0
+; CONTRACT-OFF-NEXT:    vld $vr1, $a2, 0
+; CONTRACT-OFF-NEXT:    vld $vr2, $a3, 0
+; CONTRACT-OFF-NEXT:    vfmul.d $vr0, $vr0, $vr1
+; CONTRACT-OFF-NEXT:    vfadd.d $vr0, $vr0, $vr2
+; CONTRACT-OFF-NEXT:    vbitrevi.d $vr0, $vr0, 63
+; CONTRACT-OFF-NEXT:    vst $vr0, $a0, 0
+; CONTRACT-OFF-NEXT:    ret
 entry:
   %v0 = load <2 x double>, ptr %a0
   %v1 = load <2 x double>, ptr %a1
@@ -67,16 +133,36 @@ entry:
 }
 
 define void @vfnmadd_d_nsz(ptr %res, ptr %a0, ptr %a1, ptr %a2) nounwind {
-; CONTRACT-LABEL: vfnmadd_d_nsz:
-; CONTRACT:       # %bb.0: # %entry
-; CONTRACT-NEXT:    vld $vr0, $a1, 0
-; CONTRACT-NEXT:    vld $vr1, $a2, 0
-; CONTRACT-NEXT:    vld $vr2, $a3, 0
-; CONTRACT-NEXT:    vbitrevi.d $vr0, $vr0, 63
-; CONTRACT-NEXT:    vfmul.d $vr0, $vr0, $vr1
-; CONTRACT-NEXT:    vfsub.d $vr0, $vr0, $vr2
-; CONTRACT-NEXT:    vst $vr0, $a0, 0
-; CONTRACT-NEXT:    ret
+; CONTRACT-FAST-LABEL: vfnmadd_d_nsz:
+; CONTRACT-FAST:       # %bb.0: # %entry
+; CONTRACT-FAST-NEXT:    vld $vr0, $a1, 0
+; CONTRACT-FAST-NEXT:    vld $vr1, $a2, 0
+; CONTRACT-FAST-NEXT:    vld $vr2, $a3, 0
+; CONTRACT-FAST-NEXT:    vfnmadd.d $vr0, $vr0, $vr1, $vr2
+; CONTRACT-FAST-NEXT:    vst $vr0, $a0, 0
+; CONTRACT-FAST-NEXT:    ret
+;
+; CONTRACT-ON-LABEL: vfnmadd_d_nsz:
+; CONTRACT-ON:       # %bb.0: # %entry
+; CONTRACT-ON-NEXT:    vld $vr0, $a1, 0
+; CONTRACT-ON-NEXT:    vld $vr1, $a2, 0
+; CONTRACT-ON-NEXT:    vld $vr2, $a3, 0
+; CONTRACT-ON-NEXT:    vbitrevi.d $vr0, $vr0, 63
+; CONTRACT-ON-NEXT:    vfmul.d $vr0, $vr0, $vr1
+; CONTRACT-ON-NEXT:    vfsub.d $vr0, $vr0, $vr2
+; CONTRACT-ON-NEXT:    vst $vr0, $a0, 0
+; CONTRACT-ON-NEXT:    ret
+;
+; CONTRACT-OFF-LABEL: vfnmadd_d_nsz:
+; CONTRACT-OFF:       # %bb.0: # %entry
+; CONTRACT-OFF-NEXT:    vld $vr0, $a1, 0
+; CONTRACT-OFF-NEXT:    vld $vr1, $a2, 0
+; CONTRACT-OFF-NEXT:    vld $vr2, $a3, 0
+; CONTRACT-OFF-NEXT:    vbitrevi.d $vr0, $vr0, 63
+; CONTRACT-OFF-NEXT:    vfmul.d $vr0, $vr0, $vr1
+; CONTRACT-OFF-NEXT:    vfsub.d $vr0, $vr0, $vr2
+; CONTRACT-OFF-NEXT:    vst $vr0, $a0, 0
+; CONTRACT-OFF-NEXT:    ret
 entry:
   %v0 = load <2 x double>, ptr %a0
   %v1 = load <2 x double>, ptr %a1
@@ -91,16 +177,37 @@ entry:
 
 ;; Check that vfnmadd.d is not emitted.
 define void @not_vfnmadd_d(ptr %res, ptr %a0, ptr %a1, ptr %a2) nounwind {
-; CONTRACT-LABEL: not_vfnmadd_d:
-; CONTRACT:       # %bb.0: # %entry
-; CONTRACT-NEXT:    vld $vr0, $a1, 0
-; CONTRACT-NEXT:    vld $vr1, $a2, 0
-; CONTRACT-NEXT:    vld $vr2, $a3, 0
-; CONTRACT-NEXT:    vbitrevi.d $vr0, $vr0, 63
-; CONTRACT-NEXT:    vfmul.d $vr0, $vr0, $vr1
-; CONTRACT-NEXT:    vfsub.d $vr0, $vr0, $vr2
-; CONTRACT-NEXT:    vst $vr0, $a0, 0
-; CONTRACT-NEXT:    ret
+; CONTRACT-FAST-LABEL: not_vfnmadd_d:
+; CONTRACT-FAST:       # %bb.0: # %entry
+; CONTRACT-FAST-NEXT:    vld $vr0, $a1, 0
+; CONTRACT-FAST-NEXT:    vld $vr1, $a2, 0
+; CONTRACT-FAST-NEXT:    vld $vr2, $a3, 0
+; CONTRACT-FAST-NEXT:    vbitrevi.d $vr0, $vr0, 63
+; CONTRACT-FAST-NEXT:    vfmsub.d $vr0, $vr0, $vr1, $vr2
+; CONTRACT-FAST-NEXT:    vst $vr0, $a0, 0
+; CONTRACT-FAST-NEXT:    ret
+;
+; CONTRACT-ON-LABEL: not_vfnmadd_d:
+; CONTRACT-ON:       # %bb.0: # %entry
+; CONTRACT-ON-NEXT:    vld $vr0, $a1, 0
+; CONTRACT-ON-NEXT:    vld $vr1, $a2, 0
+; CONTRACT-ON-NEXT:    vld $vr2, $a3, 0
+; CONTRACT-ON-NEXT:    vbitrevi.d $vr0, $vr0, 63
+; CONTRACT-ON-NEXT:    vfmul.d $vr0, $vr0, $vr1
+; CONTRACT-ON-NEXT:    vfsub.d $vr0, $vr0, $vr2
+; CONTRACT-ON-NEXT:    vst $vr0, $a0, 0
+; CONTRACT-ON-NEXT:    ret
+;
+; CONTRACT-OFF-LABEL: not_vfnmadd_d:
+; CONTRACT-OFF:       # %bb.0: # %entry
+; CONTRACT-OFF-NEXT:    vld $vr0, $a1, 0
+; CONTRACT-OFF-NEXT:    vld $vr1, $a2, 0
+; CONTRACT-OFF-NEXT:    vld $vr2, $a3, 0
+; CONTRACT-OFF-NEXT:    vbitrevi.d $vr0, $vr0, 63
+; CONTRACT-OFF-NEXT:    vfmul.d $vr0, $vr0, $vr1
+; CONTRACT-OFF-NEXT:    vfsub.d $vr0, $vr0, $vr2
+; CONTRACT-OFF-NEXT:    vst $vr0, $a0, 0
+; CONTRACT-OFF-NEXT:    ret
 entry:
   %v0 = load <2 x double>, ptr %a0
   %v1 = load <2 x double>, ptr %a1
@@ -114,16 +221,36 @@ entry:
 }
 
 define void @vfnmsub_d(ptr %res, ptr %a0, ptr %a1, ptr %a2) nounwind {
-; CONTRACT-LABEL: vfnmsub_d:
-; CONTRACT:       # %bb.0: # %entry
-; CONTRACT-NEXT:    vld $vr0, $a1, 0
-; CONTRACT-NEXT:    vld $vr1, $a2, 0
-; CONTRACT-NEXT:    vld $vr2, $a3, 0
-; CONTRACT-NEXT:    vfmul.d $vr0, $vr0, $vr1
-; CONTRACT-NEXT:    vfsub.d $vr0, $vr0, $vr2
-; CONTRACT-NEXT:    vbitrevi.d $vr0, $vr0, 63
-; CONTRACT-NEXT:    vst $vr0, $a0, 0
-; CONTRACT-NEXT:    ret
+; CONTRACT-FAST-LABEL: vfnmsub_d:
+; CONTRACT-FAST:       # %bb.0: # %entry
+; CONTRACT-FAST-NEXT:    vld $vr0, $a1, 0
+; CONTRACT-FAST-NEXT:    vld $vr1, $a2, 0
+; CONTRACT-FAST-NEXT:    vld $vr2, $a3, 0
+; CONTRACT-FAST-NEXT:    vfnmsub.d $vr0, $vr0, $vr1, $vr2
+; CONTRACT-FAST-NEXT:    vst $vr0, $a0, 0
+; CONTRACT-FAST-NEXT:    ret
+;
+; CONTRACT-ON-LABEL: vfnmsub_d:
+; CONTRACT-ON:       # %bb.0: # %entry
+; CONTRACT-ON-NEXT:    vld $vr0, $a1, 0
+; CONTRACT-ON-NEXT:    vld $vr1, $a2, 0
+; CONTRACT-ON-NEXT:    vld $vr2, $a3, 0
+; CONTRACT-ON-NEXT:    vfmul.d $vr0, $vr0, $vr1
+; CONTRACT-ON-NEXT:    vfsub.d $vr0, $vr0, $vr2
+; CONTRACT-ON-NEXT:    vbitrevi.d $vr0, $vr0, 63
+; CONTRACT-ON-NEXT:    vst $vr0, $a0, 0
+; CONTRACT-ON-NEXT:    ret
+;
+; CONTRACT-OFF-LABEL: vfnmsub_d:
+; CONTRACT-OFF:       # %bb.0: # %entry
+; CONTRACT-OFF-NEXT:    vld $vr0, $a1, 0
+; CONTRACT-OFF-NEXT:    vld $vr1, $a2, 0
+; CONTRACT-OFF-NEXT:    vld $vr2, $a3, 0
+; CONTRACT-OFF-NEXT:    vfmul.d $vr0, $vr0, $vr1
+; CONTRACT-OFF-NEXT:    vfsub.d $vr0, $vr0, $vr2
+; CONTRACT-OFF-NEXT:    vbitrevi.d $vr0, $vr0, 63
+; CONTRACT-OFF-NEXT:    vst $vr0, $a0, 0
+; CONTRACT-OFF-NEXT:    ret
 entry:
   %v0 = load <2 x double>, ptr %a0
   %v1 = load <2 x double>, ptr %a1
@@ -137,15 +264,34 @@ entry:
 }
 
 define void @vfnmsub_d_nsz(ptr %res, ptr %a0, ptr %a1, ptr %a2) nounwind {
-; CONTRACT-LABEL: vfnmsub_d_nsz:
-; CONTRACT:       # %bb.0: # %entry
-; CONTRACT-NEXT:    vld $vr0, $a1, 0
-; CONTRACT-NEXT:    vld $vr1, $a2, 0
-; CONTRACT-NEXT:    vld $vr2, $a3, 0
-; CONTRACT-NEXT:    vfmul.d $vr0, $vr0, $vr1
-; CONTRACT-NEXT:    vfsub.d $vr0, $vr2, $vr0
-; CONTRACT-NEXT:    vst $vr0, $a0, 0
-; CONTRACT-NEXT:    ret
+; CONTRACT-FAST-LABEL: vfnmsub_d_nsz:
+; CONTRACT-FAST:       # %bb.0: # %entry
+; CONTRACT-FAST-NEXT:    vld $vr0, $a1, 0
+; CONTRACT-FAST-NEXT:    vld $vr1, $a2, 0
+; CONTRACT-FAST-NEXT:    vld $vr2, $a3, 0
+; CONTRACT-FAST-NEXT:    vfnmsub.d $vr0, $vr0, $vr1, $vr2
+; CONTRACT-FAST-NEXT:    vst $vr0, $a0, 0
+; CONTRACT-FAST-NEXT:    ret
+;
+; CONTRACT-ON-LABEL: vfnmsub_d_nsz:
+; CONTRACT-ON:       # %bb.0: # %entry
+; CONTRACT-ON-NEXT:    vld $vr0, $a1, 0
+; CONTRACT-ON-NEXT:    vld $vr1, $a2, 0
+; CONTRACT-ON-NEXT:    vld $vr2, $a3, 0
+; CONTRACT-ON-NEXT:    vfmul.d $vr0, $vr0, $vr1
+; CONTRACT-ON-NEXT:    vfsub.d $vr0, $vr2, $vr0
+; CONTRACT-ON-NEXT:    vst $vr0, $a0, 0
+; CONTRACT-ON-NEXT:    ret
+;
+; CONTRACT-OFF-LABEL: vfnmsub_d_nsz:
+; CONTRACT-OFF:       # %bb.0: # %entry
+; CONTRACT-OFF-NEXT:    vld $vr0, $a1, 0
+; CONTRACT-OFF-NEXT:    vld $vr1, $a2, 0
+; CONTRACT-OFF-NEXT:    vld $vr2, $a3, 0
+; CONTRACT-OFF-NEXT:    vfmul.d $vr0, $vr0, $vr1
+; CONTRACT-OFF-NEXT:    vfsub.d $vr0, $vr2, $vr0
+; CONTRACT-OFF-NEXT:    vst $vr0, $a0, 0
+; CONTRACT-OFF-NEXT:    ret
 entry:
   %v0 = load <2 x double>, ptr %a0
   %v1 = load <2 x double>, ptr %a1
@@ -159,15 +305,35 @@ entry:
 
 ;; Check that vfnmsub.d is not emitted.
 define void @not_vfnmsub_d(ptr %res, ptr %a0, ptr %a1, ptr %a2) nounwind {
-; CONTRACT-LABEL: not_vfnmsub_d:
-; CONTRACT:       # %bb.0: # %entry
-; CONTRACT-NEXT:    vld $vr0, $a1, 0
-; CONTRACT-NEXT:    vld $vr1, $a2, 0
-; CONTRACT-NEXT:    vld $vr2, $a3, 0
-; CONTRACT-NEXT:    vfmul.d $vr0, $vr0, $vr1
-; CONTRACT-NEXT:    vfsub.d $vr0, $vr2, $vr0
-; CONTRACT-NEXT:    vst $vr0, $a0, 0
-; CONTRACT-NEXT:    ret
+; CONTRACT-FAST-LABEL: not_vfnmsub_d:
+; CONTRACT-FAST:       # %bb.0: # %entry
+; CONTRACT-FAST-NEXT:    vld $vr0, $a1, 0
+; CONTRACT-FAST-NEXT:    vld $vr1, $a2, 0
+; CONTRACT-FAST-NEXT:    vld $vr2, $a3, 0
+; CONTRACT-FAST-NEXT:    vbitrevi.d $vr0, $vr0, 63
+; CONTRACT-FAST-NEXT:    vfmadd.d $vr0, $vr0, $vr1, $vr2
+; CONTRACT-FAST-NEXT:    vst $vr0, $a0, 0
+; CONTRACT-FAST-NEXT:    ret
+;
+; CONTRACT-ON-LABEL: not_vfnmsub_d:
+; CONTRACT-ON:       # %bb.0: # %entry
+; CONTRACT-ON-NEXT:    vld $vr0, $a1, 0
+; CONTRACT-ON-NEXT:    vld $vr1, $a2, 0
+; CONTRACT-ON-NEXT:    vld $vr2, $a3, 0
+; CONTRACT-ON-NEXT:    vfmul.d $vr0, $vr0, $vr1
+; CONTRACT-ON-NEXT:    vfsub.d $vr0, $vr2, $vr0
+; CONTRACT-ON-NEXT:    vst $vr0, $a0, 0
+; CONTRACT-ON-NEXT:    ret
+;
+; CONTRACT-OFF-LABEL: not_vfnmsub_d:
+; CONTRACT-OFF:       # %bb.0: # %entry
+; CONTRACT-OFF-NEXT:    vld $vr0, $a1, 0
+; CONTRACT-OFF-NEXT:    vld $vr1, $a2, 0
+; CONTRACT-OFF-NEXT:    vld $vr2, $a3, 0
+; CONTRACT-OFF-NEXT:    vfmul.d $vr0, $vr0, $vr1
+; CONTRACT-OFF-NEXT:    vfsub.d $vr0, $vr2, $vr0
+; CONTRACT-OFF-NEXT:    vst $vr0, $a0, 0
+; CONTRACT-OFF-NEXT:    ret
 entry:
   %v0 = load <2 x double>, ptr %a0
   %v1 = load <2 x double>, ptr %a1
@@ -180,14 +346,32 @@ entry:
 }
 
 define void @contract_vfmadd_d(ptr %res, ptr %a0, ptr %a1, ptr %a2) nounwind {
-; CONTRACT-LABEL: contract_vfmadd_d:
-; CONTRACT:       # %bb.0: # %entry
-; CONTRACT-NEXT:    vld $vr0, $a1, 0
-; CONTRACT-NEXT:    vld $vr1, $a2, 0
-; CONTRACT-NEXT:    vld $vr2, $a3, 0
-; CONTRACT-NEXT:    vfmadd.d $vr0, $vr0, $vr1, $vr2
-; CONTRACT-NEXT:    vst $vr0, $a0, 0
-; CONTRACT-NEXT:    ret
+; CONTRACT-FAST-LABEL: contract_vfmadd_d:
+; CONTRACT-FAST:       # %bb.0: # %entry
+; CONTRACT-FAST-NEXT:    vld $vr0, $a1, 0
+; CONTRACT-FAST-NEXT:    vld $vr1, $a2, 0
+; CONTRACT-FAST-NEXT:    vld $vr2, $a3, 0
+; CONTRACT-FAST-NEXT:    vfmadd.d $vr0, $vr0, $vr1, $vr2
+; CONTRACT-FAST-NEXT:    vst $vr0, $a0, 0
+; CONTRACT-FAST-NEXT:    ret
+;
+; CONTRACT-ON-LABEL: contract_vfmadd_d:
+; CONTRACT-ON:       # %bb.0: # %entry
+; CONTRACT-ON-NEXT:    vld $vr0, $a1, 0
+; CONTRACT-ON-NEXT:    vld $vr1, $a2, 0
+; CONTRACT-ON-NEXT:    vld $vr2, $a3, 0
+; CONTRACT-ON-NEXT:    vfmadd.d $vr0, $vr0, $vr1, $vr2
+; CONTRACT-ON-NEXT:    vst $vr0, $a0, 0
+; CONTRACT-ON-NEXT:    ret
+;
+; CONTRACT-OFF-LABEL: contract_vfmadd_d:
+; CONTRACT-OFF:       # %bb.0: # %entry
+; CONTRACT-OFF-NEXT:    vld $vr0, $a1, 0
+; CONTRACT-OFF-NEXT:    vld $vr1, $a2, 0
+; CONTRACT-OFF-NEXT:    vld $vr2, $a3, 0
+; CONTRACT-OFF-NEXT:    vfmadd.d $vr0, $vr0, $vr1, $vr2
+; CONTRACT-OFF-NEXT:    vst $vr0, $a0, 0
+; CONTRACT-OFF-NEXT:    ret
 entry:
   %v0 = load <2 x double>, ptr %a0
   %v1 = load <2 x double>, ptr %a1
@@ -199,14 +383,32 @@ entry:
 }
 
 define void @contract_vfmsub_d(ptr %res, ptr %a0, ptr %a1, ptr %a2) nounwind {
-; CONTRACT-LABEL: contract_vfmsub_d:
-; CONTRACT:       # %bb.0: # %entry
-; CONTRACT-NEXT:    vld $vr0, $a1, 0
-; CONTRACT-NEXT:    vld $vr1, $a2, 0
-; CONTRACT-NEXT:    vld $vr2, $a3, 0
-; CONTRACT-NEXT:    vfmsub.d $vr0, $vr0, $vr1, $vr2
-; CONTRACT-NEXT:    vst $vr0, $a0, 0
-; CONTRACT-NEXT:    ret
+; CONTRACT-FAST-LABEL: contract_vfmsub_d:
+; CONTRACT-FAST:       # %bb.0: # %entry
+; CONTRACT-FAST-NEXT:    vld $vr0, $a1, 0
+; CONTRACT-FAST-NEXT:    vld $vr1, $a2, 0
+; CONTRACT-FAST-NEXT:    vld $vr2, $a3, 0
+; CONTRACT-FAST-NEXT:    vfmsub.d $vr0, $vr0, $vr1, $vr2
+; CONTRACT-FAST-NEXT:    vst $vr0, $a0, 0
+; CONTRACT-FAST-NEXT:    ret
+;
+; CONTRACT-ON-LABEL: contract_vfmsub_d:
+; CONTRACT-ON:       # %bb.0: # %entry
+; CONTRACT-ON-NEXT:    vld $vr0, $a1, 0
+; CONTRACT-ON-NEXT:    vld $vr1, $a2, 0
+; CONTRACT-ON-NEXT:    vld $vr2, $a3, 0
+; CONTRACT-ON-NEXT:    vfmsub.d $vr0, $vr0, $vr1, $vr2
+; CONTRACT-ON-NEXT:    vst $vr0, $a0, 0
+; CONTRACT-ON-NEXT:    ret
+;
+; CONTRACT-OFF-LABEL: contract_vfmsub_d:
+; CONTRACT-OFF:       # %bb.0: # %entry
+; CONTRACT-OFF-NEXT:    vld $vr0, $a1, 0
+; CONTRACT-OFF-NEXT:    vld $vr1, $a2, 0
+; CONTRACT-OFF-NEXT:    vld $vr2, $a3, 0
+; CONTRACT-OFF-NEXT:    vfmsub.d $vr0, $vr0, $vr1, $vr2
+; CONTRACT-OFF-NEXT:    vst $vr0, $a0, 0
+; CONTRACT-OFF-NEXT:    ret
 entry:
   %v0 = load <2 x double>, ptr %a0
   %v1 = load <2 x double>, ptr %a1
@@ -218,14 +420,32 @@ entry:
 }
 
 define void @contract_vfnmadd_d(ptr %res, ptr %a0, ptr %a1, ptr %a2) nounwind {
-; CONTRACT-LABEL: contract_vfnmadd_d:
-; CONTRACT:       # %bb.0: # %entry
-; CONTRACT-NEXT:    vld $vr0, $a1, 0
-; CONTRACT-NEXT:    vld $vr1, $a2, 0
-; CONTRACT-NEXT:    vld $vr2, $a3, 0
-; CONTRACT-NEXT:    vfnmadd.d $vr0, $vr0, $vr1, $vr2
-; CONTRACT-NEXT:    vst $vr0, $a0, 0
-; CONTRACT-NEXT:    ret
+; CONTRACT-FAST-LABEL: contract_vfnmadd_d:
+; CONTRACT-FAST:       # %bb.0: # %entry
+; CONTRACT-FAST-NEXT:    vld $vr0, $a1, 0
+; CONTRACT-FAST-NEXT:    vld $vr1, $a2, 0
+; CONTRACT-FAST-NEXT:    vld $vr2, $a3, 0
+; CONTRACT-FAST-NEXT:    vfnmadd.d $vr0, $vr0, $vr1, $vr2
+; CONTRACT-FAST-NEXT:    vst $vr0, $a0, 0
+; CONTRACT-FAST-NEXT:    ret
+;
+; CONTRACT-ON-LABEL: contract_vfnmadd_d:
+; CONTRACT-ON:       # %bb.0: # %entry
+; CONTRACT-ON-NEXT:    vld $vr0, $a1, 0
+; CONTRACT-ON-NEXT:    vld $vr1, $a2, 0
+; CONTRACT-ON-NEXT:    vld $vr2, $a3, 0
+; CONTRACT-ON-NEXT:    vfnmadd.d $vr0, $vr0, $vr1, $vr2
+; CONTRACT-ON-NEXT:    vst $vr0, $a0, 0
+; CONTRACT-ON-NEXT:    ret
+;
+; CONTRACT-OFF-LABEL: contract_vfnmadd_d:
+; CONTRACT-OFF:       # %bb.0: # %entry
+; CONTRACT-OFF-NEXT:    vld $vr0, $a1, 0
+; CONTRACT-OFF-NEXT:    vld $vr1, $a2, 0
+; CONTRACT-OFF-NEXT:    vld $vr2, $a3, 0
+; CONTRACT-OFF-NEXT:    vfnmadd.d $vr0, $vr0, $vr1, $vr2
+; CONTRACT-OFF-NEXT:    vst $vr0, $a0, 0
+; CONTRACT-OFF-NEXT:    ret
 entry:
   %v0 = load <2 x double>, ptr %a0
   %v1 = load <2 x double>, ptr %a1
@@ -238,14 +458,32 @@ entry:
 }
 
 define void @contract_vfnmadd_d_nsz(ptr %res, ptr %a0, ptr %a1, ptr %a2) nounwind {
-; CONTRACT-LABEL: contract_vfnmadd_d_nsz:
-; CONTRACT:       # %bb.0: # %entry
-; CONTRACT-NEXT:    vld $vr0, $a1, 0
-; CONTRACT-NEXT:    vld $vr1, $a2, 0
-; CONTRACT-NEXT:    vld $vr2, $a3, 0
-; CONTRACT-NEXT:    vfnmadd.d $vr0, $vr0, $vr1, $vr2
-; CONTRACT-NEXT:    vst $vr0, $a0, 0
-; CONTRACT-NEXT:    ret
+; CONTRACT-FAST-LABEL: contract_vfnmadd_d_nsz:
+; CONTRACT-FAST:       # %bb.0: # %entry
+; CONTRACT-FAST-NEXT:    vld $vr0, $a1, 0
+; CONTRACT-FAST-NEXT:    vld $vr1, $a2, 0
+; CONTRACT-FAST-NEXT:    vld $vr2, $a3, 0
+; CONTRACT-FAST-NEXT:    vfnmadd.d $vr0, $vr0, $vr1, $vr2
+; CONTRACT-FAST-NEXT:    vst $vr0, $a0, 0
+; CONTRACT-FAST-NEXT:    ret
+;
+; CONTRACT-ON-LABEL: contract_vfnmadd_d_nsz:
+; CONTRACT-ON:       # %bb.0: # %entry
+; CONTRACT-ON-NEXT:    vld $vr0, $a1, 0
+; CONTRACT-ON-NEXT:    vld $vr1, $a2, 0
+; CONTRACT-ON-NEXT:    vld $vr2, $a3, 0
+; CONTRACT-ON-NEXT:    vfnmadd.d $vr0, $vr0, $vr1, $vr2
+; CONTRACT-ON-NEXT:    vst $vr0, $a0, 0
+; CONTRACT-ON-NEXT:    ret
+;
+; CONTRACT-OFF-LABEL: contract_vfnmadd_d_nsz:
+; CONTRACT-OFF:       # %bb.0: # %entry
+; CONTRACT-OFF-NEXT:    vld $vr0, $a1, 0
+; CONTRACT-OFF-NEXT:    vld $vr1, $a2, 0
+; CONTRACT-OFF-NEXT:    vld $vr2, $a3, 0
+; CONTRACT-OFF-NEXT:    vfnmadd.d $vr0, $vr0, $vr1, $vr2
+; CONTRACT-OFF-NEXT:    vst $vr0, $a0, 0
+; CONTRACT-OFF-NEXT:    ret
 entry:
   %v0 = load <2 x double>, ptr %a0
   %v1 = load <2 x double>, ptr %a1
@@ -260,15 +498,35 @@ entry:
 
 ;; Check that vfnmadd.d is not emitted.
 define void @not_contract_vfnmadd_d(ptr %res, ptr %a0, ptr %a1, ptr %a2) nounwind {
-; CONTRACT-LABEL: not_contract_vfnmadd_d:
-; CONTRACT:       # %bb.0: # %entry
-; CONTRACT-NEXT:    vld $vr0, $a1, 0
-; CONTRACT-NEXT:    vld $vr1, $a2, 0
-; CONTRACT-NEXT:    vld $vr2, $a3, 0
-; CONTRACT-NEXT:    vbitrevi.d $vr0, $vr0, 63
-; CONTRACT-NEXT:    vfmsub.d $vr0, $vr0, $vr1, $vr2
-; CONTRACT-NEXT:    vst $vr0, $a0, 0
-; CONTRACT-NEXT:    ret
+; CONTRACT-FAST-LABEL: not_contract_vfnmadd_d:
+; CONTRACT-FAST:       # %bb.0: # %entry
+; CONTRACT-FAST-NEXT:    vld $vr0, $a1, 0
+; CONTRACT-FAST-NEXT:    vld $vr1, $a2, 0
+; CONTRACT-FAST-NEXT:    vld $vr2, $a3, 0
+; CONTRACT-FAST-NEXT:    vbitrevi.d $vr0, $vr0, 63
+; CONTRACT-FAST-NEXT:    vfmsub.d $vr0, $vr0, $vr1, $vr2
+; CONTRACT-FAST-NEXT:    vst $vr0, $a0, 0
+; CONTRACT-FAST-NEXT:    ret
+;
+; CONTRACT-ON-LABEL: not_contract_vfnmadd_d:
+; CONTRACT-ON:       # %bb.0: # %entry
+; CONTRACT-ON-NEXT:    vld $vr0, $a1, 0
+; CONTRACT-ON-NEXT:    vld $vr1, $a2, 0
+; CONTRACT-ON-NEXT:    vld $vr2, $a3, 0
+; CONTRACT-ON-NEXT:    vbitrevi.d $vr0, $vr0, 63
+; CONTRACT-ON-NEXT:    vfmsub.d $vr0, $vr0, $vr1, $vr2
+; CONTRACT-ON-NEXT:    vst $vr0, $a0, 0
+; CONTRACT-ON-NEXT:    ret
+;
+; CONTRACT-OFF-LABEL: not_contract_vfnmadd_d:
+; CONTRACT-OFF:       # %bb.0: # %entry
+; CONTRACT-OFF-NEXT:    vld $vr0, $a1, 0
+; CONTRACT-OFF-NEXT:    vld $vr1, $a2, 0
+; CONTRACT-OFF-NEXT:    vld $vr2, $a3, 0
+; CONTRACT-OFF-NEXT:    vbitrevi.d $vr0, $vr0, 63
+; CONTRACT-OFF-NEXT:    vfmsub.d $vr0, $vr0, $vr1, $vr2
+; CONTRACT-OFF-NEXT:    vst $vr0, $a0, 0
+; CONTRACT-OFF-NEXT:    ret
 entry:
   %v0 = load <2 x double>, ptr %a0
   %v1 = load <2 x double>, ptr %a1
@@ -282,14 +540,32 @@ entry:
 }
 
 define void @contract_vfnmsub_d(ptr %res, ptr %a0, ptr %a1, ptr %a2) nounwind {
-; CONTRACT-LABEL: contract_vfnmsub_d:
-; CONTRACT:       # %bb.0: # %entry
-; CONTRACT-NEXT:    vld $vr0, $a1, 0
-; CONTRACT-NEXT:    vld $vr1, $a2, 0
-; CONTRACT-NEXT:    vld $vr2, $a3, 0
-; CONTRACT-NEXT:    vfnmsub.d $vr0, $vr0, $vr1, $vr2
-; CONTRACT-NEXT:    vst $vr0, $a0, 0
-; CONTRACT-NEXT:    ret
+; CONTRACT-FAST-LABEL: contract_vfnmsub_d:
+; CONTRACT-FAST:       # %bb.0: # %entry
+; CONTRACT-FAST-NEXT:    vld $vr0, $a1, 0
+; CONTRACT-FAST-NEXT:    vld $vr1, $a2, 0
+; CONTRACT-FAST-NEXT:    vld $vr2, $a3, 0
+; CONTRACT-FAST-NEXT:    vfnmsub.d $vr0, $vr0, $vr1, $vr2
+; CONTRACT-FAST-NEXT:    vst $vr0, $a0, 0
+; CONTRACT-FAST-NEXT:    ret
+;
+; CONTRACT-ON-LABEL: contract_vfnmsub_d:
+; CONTRACT-ON:       # %bb.0: # %entry
+; CONTRACT-ON-NEXT:    vld $vr0, $a1, 0
+; CONTRACT-ON-NEXT:    vld $vr1, $a2, 0
+; CONTRACT-ON-NEXT:    vld $vr2, $a3, 0
+; CONTRACT-ON-NEXT:    vfnmsub.d $vr0, $vr0, $vr1, $vr2
+; CONTRACT-ON-NEXT:    vst $vr0, $a0, 0
+; CONTRACT-ON-NEXT:    ret
+;
+; CONTRACT-OFF-LABEL: contract_vfnmsub_d:
+; CONTRACT-OFF:       # %bb.0: # %entry
+; CONTRACT-OFF-NEXT:    vld $vr0, $a1, 0
+; CONTRACT-OFF-NEXT:    vld $vr1, $a2, 0
+; CONTRACT-OFF-NEXT:    vld $vr2, $a3, 0
+; CONTRACT-OFF-NEXT:    vfnmsub.d $vr0, $vr0, $vr1, $vr2
+; CONTRACT-OFF-NEXT:    vst $vr0, $a0, 0
+; CONTRACT-OFF-NEXT:    ret
 entry:
   %v0 = load <2 x double>, ptr %a0
   %v1 = load <2 x double>, ptr %a1
@@ -303,14 +579,32 @@ entry:
 }
 
 define void @contract_vfnmsub_d_nsz(ptr %res, ptr %a0, ptr %a1, ptr %a2) nounwind {
-; CONTRACT-LABEL: contract_vfnmsub_d_nsz:
-; CONTRACT:       # %bb.0: # %entry
-; CONTRACT-NEXT:    vld $vr0, $a1, 0
-; CONTRACT-NEXT:    vld $vr1, $a2, 0
-; CONTRACT-NEXT:    vld $vr2, $a3, 0
-; CONTRACT-NEXT:    vfnmsub.d $vr0, $vr0, $vr1, $vr2
-; CONTRACT-NEXT:    vst $vr0, $a0, 0
-; CONTRACT-NEXT:    ret
+; CONTRACT-FAST-LABEL: contract_vfnmsub_d_nsz:
+; CONTRACT-FAST:       # %bb.0: # %entry
+; CONTRACT-FAST-NEXT:    vld $vr0, $a1, 0
+; CONTRACT-FAST-NEXT:    vld $vr1, $a2, 0
+; CONTRACT-FAST-NEXT:    vld $vr2, $a3, 0
+; CONTRACT-FAST-NEXT:    vfnmsub.d $vr0, $vr0, $vr1, $vr2
+; CONTRACT-FAST-NEXT:    vst $vr0, $a0, 0
+; CONTRACT-FAST-NEXT:    ret
+;
+; CONTRACT-ON-LABEL: contract_vfnmsub_d_nsz:
+; CONTRACT-ON:       # %bb.0: # %entry
+; CONTRACT-ON-NEXT:    vld $vr0, $a1, 0
+; CONTRACT-ON-NEXT:    vld $vr1, $a2, 0
+; CONTRACT-ON-NEXT:    vld $vr2, $a3, 0
+; CONTRACT-ON-NEXT:    vfnmsub.d $vr0, $vr0, $vr1, $vr2
+; CONTRACT-ON-NEXT:    vst $vr0, $a0, 0
+; CONTRACT-ON-NEXT:    ret
+;
+; CONTRACT-OFF-LABEL: contract_vfnmsub_d_nsz:
+; CONTRACT-OFF:       # %bb.0: # %entry
+; CONTRACT-OFF-NEXT:    vld $vr0, $a1, 0
+; CONTRACT-OFF-NEXT:    vld $vr1, $a2, 0
+; CONTRACT-OFF-NEXT:    vld $vr2, $a3, 0
+; CONTRACT-OFF-NEXT:    vfnmsub.d $vr0, $vr0, $vr1, $vr2
+; CONTRACT-OFF-NEXT:    vst $vr0, $a0, 0
+; CONTRACT-OFF-NEXT:    ret
 entry:
   %v0 = load <2 x double>, ptr %a0
   %v1 = load <2 x double>, ptr %a1
@@ -324,15 +618,35 @@ entry:
 
 ;; Check that vfnmsub.d is not emitted.
 define void @not_contract_vfnmsub_d(ptr %res, ptr %a0, ptr %a1, ptr %a2) nounwind {
-; CONTRACT-LABEL: not_contract_vfnmsub_d:
-; CONTRACT:       # %bb.0: # %entry
-; CONTRACT-NEXT:    vld $vr0, $a1, 0
-; CONTRACT-NEXT:    vld $vr1, $a2, 0
-; CONTRACT-NEXT:    vld $vr2, $a3, 0
-; CONTRACT-NEXT:    vbitrevi.d $vr0, $vr0, 63
-; CONTRACT-NEXT:    vfmadd.d $vr0, $vr0, $vr1, $vr2
-; CONTRACT-NEXT:    vst $vr0, $a0, 0
-; CONTRACT-NEXT:    ret
+; CONTRACT-FAST-LABEL: not_contract_vfnmsub_d:
+; CONTRACT-FAST:       # %bb.0: # %entry
+; CONTRACT-FAST-NEXT:    vld $vr0, $a1, 0
+; CONTRACT-FAST-NEXT:    vld $vr1, $a2, 0
+; CONTRACT-FAST-NEXT:    vld $vr2, $a3, 0
+; CONTRACT-FAST-NEXT:    vbitrevi.d $vr0, $vr0, 63
+; CONTRACT-FAST-NEXT:    vfmadd.d $vr0, $vr0, $vr1, $vr2
+; CONTRACT-FAST-NEXT:    vst $vr0, $a0, 0
+; CONTRACT-FAST-NEXT:    ret
+;
+; CONTRACT-ON-LABEL: not_contract_vfnmsub_d:
+; CONTRACT-ON:       # %bb.0: # %entry
+; CONTRACT-ON-NEXT:    vld $vr0, $a1, 0
+; CONTRACT-ON-NEXT:    vld $vr1, $a2, 0
+; CONTRACT-ON-NEXT:    vld $vr2, $a3, 0
+; CONTRACT-ON-NEXT:    vbitrevi.d $vr0, $vr0, 63
+; CONTRACT-ON-NEXT:    vfmadd.d $vr0, $vr0, $vr1, $vr2
+; CONTRACT-ON-NEXT:    vst $vr0, $a0, 0
+; CONTRACT-ON-NEXT:    ret
+;
+; CONTRACT-OFF-LABEL: not_contract_vfnmsub_d:
+; CONTRACT-OFF:       # %bb.0: # %entry
+; CONTRACT-OFF-NEXT:    vld $vr0, $a1, 0
+; CONTRACT-OFF-NEXT:    vld $vr1, $a2, 0
+; CONTRACT-OFF-NEXT:    vld $vr2, $a3, 0
+; CONTRACT-OFF-NEXT:    vbitrevi.d $vr0, $vr0, 63
+; CONTRACT-OFF-NEXT:    vfmadd.d $vr0, $vr0, $vr1, $vr2
+; CONTRACT-OFF-NEXT:    vst $vr0, $a0, 0
+; CONTRACT-OFF-NEXT:    ret
 entry:
   %v0 = load <2 x double>, ptr %a0
   %v1 = load <2 x double>, ptr %a1
@@ -345,14 +659,32 @@ entry:
 }
 
 define void @vfmadd_d_contract(ptr %res, ptr %a0, ptr %a1, ptr %a2) nounwind {
-; CONTRACT-LABEL: vfmadd_d_contract:
-; CONTRACT:       # %bb.0: # %entry
-; CONTRACT-NEXT:    vld $vr0, $a1, 0
-; CONTRACT-NEXT:    vld $vr1, $a2, 0
-; CONTRACT-NEXT:    vld $vr2, $a3, 0
-; CONTRACT-NEXT:    vfmadd.d $vr0, $vr0, $vr1, $vr2
-; CONTRACT-NEXT:    vst $vr0, $a0, 0
-; CONTRACT-NEXT:    ret
+; CONTRACT-FAST-LABEL: vfmadd_d_contract:
+; CONTRACT-FAST:       # %bb.0: # %entry
+; CONTRACT-FAST-NEXT:    vld $vr0, $a1, 0
+; CONTRACT-FAST-NEXT:    vld $vr1, $a2, 0
+; CONTRACT-FAST-NEXT:    vld $vr2, $a3, 0
+; CONTRACT-FAST-NEXT:    vfmadd.d $vr0, $vr0, $vr1, $vr2
+; CONTRACT-FAST-NEXT:    vst $vr0, $a0, 0
+; CONTRACT-FAST-NEXT:    ret
+;
+; CONTRACT-ON-LABEL: vfmadd_d_contract:
+; CONTRACT-ON:       # %bb.0: # %entry
+; CONTRACT-ON-NEXT:    vld $vr0, $a1, 0
+; CONTRACT-ON-NEXT:    vld $vr1, $a2, 0
+; CONTRACT-ON-NEXT:    vld $vr2, $a3, 0
+; CONTRACT-ON-NEXT:    vfmadd.d $vr0, $vr0, $vr1, $vr2
+; CONTRACT-ON-NEXT:    vst $vr0, $a0, 0
+; CONTRACT-ON-NEXT:    ret
+;
+; CONTRACT-OFF-LABEL: vfmadd_d_contract:
+; CONTRACT-OFF:       # %bb.0: # %entry
+; CONTRACT-OFF-NEXT:    vld $vr0, $a1, 0
+; CONTRACT-OFF-NEXT:    vld $vr1, $a2, 0
+; CONTRACT-OFF-NEXT:    vld $vr2, $a3, 0
+; CONTRACT-OFF-NEXT:    vfmadd.d $vr0, $vr0, $vr1, $vr2
+; CONTRACT-OFF-NEXT:    vst $vr0, $a0, 0
+; CONTRACT-OFF-NEXT:    ret
 entry:
   %v0 = load <2 x double>, ptr %a0
   %v1 = load <2 x double>, ptr %a1
@@ -364,14 +696,32 @@ entry:
 }
 
 define void @vfmsub_d_contract(ptr %res, ptr %a0, ptr %a1, ptr %a2) nounwind {
-; CONTRACT-LABEL: vfmsub_d_contract:
-; CONTRACT:       # %bb.0: # %entry
-; CONTRACT-NEXT:    vld $vr0, $a1, 0
-; CONTRACT-NEXT:    vld $vr1, $a2, 0
-; CONTRACT-NEXT:    vld $vr2, $a3, 0
-; CONTRACT-NEXT:    vfmsub.d $vr0, $vr0, $vr1, $vr2
-; CONTRACT-NEXT:    vst $vr0, $a0, 0
-; CONTRACT-NEXT:    ret
+; CONTRACT-FAST-LABEL: vfmsub_d_contract:
+; CONTRACT-FAST:       # %bb.0: # %entry
+; CONTRACT-FAST-NEXT:    vld $vr0, $a1, 0
+; CONTRACT-FAST-NEXT:    vld $vr1, $a2, 0
+; CONTRACT-FAST-NEXT:    vld $vr2, $a3, 0
+; CONTRACT-FAST-NEXT:    vfmsub.d $vr0, $vr0, $vr1, $vr2
+; CONTRACT-FAST-NEXT:    vst $vr0, $a0, 0
+; CONTRACT-FAST-NEXT:    ret
+;
+; CONTRACT-ON-LABEL: vfmsub_d_contract:
+; CONTRACT-ON:       # %bb.0: # %entry
+; CONTRACT-ON-NEXT:    vld $vr0, $a1, 0
+; CONTRACT-ON-NEXT:    vld $vr1, $a2, 0
+; CONTRACT-ON-NEXT:    vld $vr2, $a3, 0
+; CONTRACT-ON-NEXT:    vfmsub.d $vr0, $vr0, $vr1, $vr2
+; CONTRACT-ON-NEXT:    vst $vr0, $a0, 0
+; CONTRACT-ON-NEXT:    ret
+;
+; CONTRACT-OFF-LABEL: vfmsub_d_contract:
+; CONTRACT-OFF:       # %bb.0: # %entry
+; CONTRACT-OFF-NEXT:    vld $vr0, $a1, 0
+; CONTRACT-OFF-NEXT:    vld $vr1, $a2, 0
+; CONTRACT-OFF-NEXT:    vld $vr2, $a3, 0
+; CONTRACT-OFF-NEXT:    vfmsub.d $vr0, $vr0, $vr1, $vr2
+; CONTRACT-OFF-NEXT:    vst $vr0, $a0, 0
+; CONTRACT-OFF-NEXT:    ret
 entry:
   %v0 = load <2 x double>, ptr %a0
   %v1 = load <2 x double>, ptr %a1
@@ -383,14 +733,32 @@ entry:
 }
 
 define void @vfnmadd_d_contract(ptr %res, ptr %a0, ptr %a1, ptr %a2) nounwind {
-; CONTRACT-LABEL: vfnmadd_d_contract:
-; CONTRACT:       # %bb.0: # %entry
-; CONTRACT-NEXT:    vld $vr0, $a1, 0
-; CONTRACT-NEXT:    vld $vr1, $a2, 0
-; CONTRACT-NEXT:    vld $vr2, $a3, 0
-; CONTRACT-NEXT:    vfnmadd.d $vr0, $vr0, $vr1, $vr2
-; CONTRACT-NEXT:    vst $vr0, $a0, 0
-; CONTRACT-NEXT:    ret
+; CONTRACT-FAST-LABEL: vfnmadd_d_contract:
+; CONTRACT-FAST:       # %bb.0: # %entry
+; CONTRACT-FAST-NEXT:    vld $vr0, $a1, 0
+; CONTRACT-FAST-NEXT:    vld $vr1, $a2, 0
+; CONTRACT-FAST-NEXT:    vld $vr2, $a3, 0
+; CONTRACT-FAST-NEXT:    vfnmadd.d $vr0, $vr0, $vr1, $vr2
+; CONTRACT-FAST-NEXT:    vst $vr0, $a0, 0
+; CONTRACT-FAST-NEXT:    ret
+;
+; CONTRACT-ON-LABEL: vfnmadd_d_contract:
+; CONTRACT-ON:       # %bb.0: # %entry
+; CONTRACT-ON-NEXT:    vld $vr0, $a1, 0
+; CONTRACT-ON-NEXT:    vld $vr1, $a2, 0
+; CONTRACT-ON-NEXT:    vld $vr2, $a3, 0
+; CONTRACT-ON-NEXT:    vfnmadd.d $vr0, $vr0, $vr1, $vr2
+; CONTRACT-ON-NEXT:    vst $vr0, $a0, 0
+; CONTRACT-ON-NEXT:    ret
+;
+; CONTRACT-OFF-LABEL: vfnmadd_d_contract:
+; CONTRACT-OFF:       # %bb.0: # %entry
+; CONTRACT-OFF-NEXT:    vld $vr0, $a1, 0
+; CONTRACT-OFF-NEXT:    vld $vr1, $a2, 0
+; CONTRACT-OFF-NEXT:    vld $vr2, $a3, 0
+; CONTRACT-OFF-NEXT:    vfnmadd.d $vr0, $vr0, $vr1, $vr2
+; CONTRACT-OFF-NEXT:    vst $vr0, $a0, 0
+; CONTRACT-OFF-NEXT:    ret
 entry:
   %v0 = load <2 x double>, ptr %a0
   %v1 = load <2 x double>, ptr %a1
@@ -403,14 +771,32 @@ entry:
 }
 
 define void @vfnmsub_d_contract(ptr %res, ptr %a0, ptr %a1, ptr %a2) nounwind {
-; CONTRACT-LABEL: vfnmsub_d_contract:
-; CONTRACT:       # %bb.0: # %entry
-; CONTRACT-NEXT:    vld $vr0, $a1, 0
-; CONTRACT-NEXT:    vld $vr1, $a2, 0
-; CONTRACT-NEXT:    vld $vr2, $a3, 0
-; CONTRACT-NEXT:    vfnmsub.d $vr0, $vr0, $vr1, $vr2
-; CONTRACT-NEXT:    vst $vr0, $a0, 0
-; CONTRACT-NEXT:    ret
+; CONTRACT-FAST-LABEL: vfnmsub_d_contract:
+; CONTRACT-FAST:       # %bb.0: # %entry
+; CONTRACT-FAST-NEXT:    vld $vr0, $a1, 0
+; CONTRACT-FAST-NEXT:    vld $vr1, $a2, 0
+; CONTRACT-FAST-NEXT:    vld $vr2, $a3, 0
+; CONTRACT-FAST-NEXT:    vfnmsub.d $vr0, $vr0, $vr1, $vr2
+; CONTRACT-FAST-NEXT:    vst $vr0, $a0, 0
+; CONTRACT-FAST-NEXT:    ret
+;
+; CONTRACT-ON-LABEL: vfnmsub_d_contract:
+; CONTRACT-ON:       # %bb.0: # %entry
+; CONTRACT-ON-NEXT:    vld $vr0, $a1, 0
+; CONTRACT-ON-NEXT:    vld $vr1, $a2, 0
+; CONTRACT-ON-NEXT:    vld $vr2, $a3, 0
+; CONTRACT-ON-NEXT:    vfnmsub.d $vr0, $vr0, $vr1, $vr2
+; CONTRACT-ON-NEXT:    vst $vr0, $a0, 0
+; CONTRACT-ON-NEXT:    ret
+;
+; CONTRACT-OFF-LABEL: vfnmsub_d_contract:
+; CONTRACT-OFF:       # %bb.0: # %entry
+; CONTRACT-OFF-NEXT:    vld $vr0, $a1, 0
+; CONTRACT-OFF-NEXT:    vld $vr1, $a2, 0
+; CONTRACT-OFF-NEXT:    vld $vr2, $a3, 0
+; CONTRACT-OFF-NEXT:    vfnmsub.d $vr0, $vr0, $vr1, $vr2
+; CONTRACT-OFF-NEXT:    vst $vr0, $a0, 0
+; CONTRACT-OFF-NEXT:    ret
 entry:
   %v0 = load <2 x double>, ptr %a0
   %v1 = load <2 x double>, ptr %a1

diff  --git a/llvm/test/CodeGen/LoongArch/lsx/fma-v4f32.ll b/llvm/test/CodeGen/LoongArch/lsx/fma-v4f32.ll
index 4432388f54cc5..0e5cd3cdcd35a 100644
--- a/llvm/test/CodeGen/LoongArch/lsx/fma-v4f32.ll
+++ b/llvm/test/CodeGen/LoongArch/lsx/fma-v4f32.ll
@@ -1,19 +1,46 @@
 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
-; RUN: llc --mtriple=loongarch32 --mattr=+32s,+lsx < %s \
-; RUN:   | FileCheck %s --check-prefix=CONTRACT
-; RUN: llc --mtriple=loongarch64 --mattr=+lsx < %s \
-; RUN:   | FileCheck %s --check-prefix=CONTRACT
+; RUN: llc --mtriple=loongarch32 --mattr=+32s,+lsx --fp-contract=fast < %s \
+; RUN:   | FileCheck %s --check-prefix=CONTRACT-FAST
+; RUN: llc --mtriple=loongarch64 --mattr=+lsx --fp-contract=fast < %s \
+; RUN:   | FileCheck %s --check-prefix=CONTRACT-FAST
+; RUN: llc --mtriple=loongarch32 --mattr=+32s,+lsx --fp-contract=on < %s \
+; RUN:   | FileCheck %s --check-prefix=CONTRACT-ON
+; RUN: llc --mtriple=loongarch64 --mattr=+lsx --fp-contract=on < %s \
+; RUN:   | FileCheck %s --check-prefix=CONTRACT-ON
+; RUN: llc --mtriple=loongarch32 --mattr=+32s,+lsx --fp-contract=off < %s \
+; RUN:   | FileCheck %s --check-prefix=CONTRACT-OFF
+; RUN: llc --mtriple=loongarch64 --mattr=+lsx --fp-contract=off < %s \
+; RUN:   | FileCheck %s --check-prefix=CONTRACT-OFF
 
 define void @vfmadd_s(ptr %res, ptr %a0, ptr %a1, ptr %a2) nounwind {
-; CONTRACT-LABEL: vfmadd_s:
-; CONTRACT:       # %bb.0: # %entry
-; CONTRACT-NEXT:    vld $vr0, $a1, 0
-; CONTRACT-NEXT:    vld $vr1, $a2, 0
-; CONTRACT-NEXT:    vld $vr2, $a3, 0
-; CONTRACT-NEXT:    vfmul.s $vr0, $vr0, $vr1
-; CONTRACT-NEXT:    vfadd.s $vr0, $vr0, $vr2
-; CONTRACT-NEXT:    vst $vr0, $a0, 0
-; CONTRACT-NEXT:    ret
+; CONTRACT-FAST-LABEL: vfmadd_s:
+; CONTRACT-FAST:       # %bb.0: # %entry
+; CONTRACT-FAST-NEXT:    vld $vr0, $a1, 0
+; CONTRACT-FAST-NEXT:    vld $vr1, $a2, 0
+; CONTRACT-FAST-NEXT:    vld $vr2, $a3, 0
+; CONTRACT-FAST-NEXT:    vfmadd.s $vr0, $vr0, $vr1, $vr2
+; CONTRACT-FAST-NEXT:    vst $vr0, $a0, 0
+; CONTRACT-FAST-NEXT:    ret
+;
+; CONTRACT-ON-LABEL: vfmadd_s:
+; CONTRACT-ON:       # %bb.0: # %entry
+; CONTRACT-ON-NEXT:    vld $vr0, $a1, 0
+; CONTRACT-ON-NEXT:    vld $vr1, $a2, 0
+; CONTRACT-ON-NEXT:    vld $vr2, $a3, 0
+; CONTRACT-ON-NEXT:    vfmul.s $vr0, $vr0, $vr1
+; CONTRACT-ON-NEXT:    vfadd.s $vr0, $vr0, $vr2
+; CONTRACT-ON-NEXT:    vst $vr0, $a0, 0
+; CONTRACT-ON-NEXT:    ret
+;
+; CONTRACT-OFF-LABEL: vfmadd_s:
+; CONTRACT-OFF:       # %bb.0: # %entry
+; CONTRACT-OFF-NEXT:    vld $vr0, $a1, 0
+; CONTRACT-OFF-NEXT:    vld $vr1, $a2, 0
+; CONTRACT-OFF-NEXT:    vld $vr2, $a3, 0
+; CONTRACT-OFF-NEXT:    vfmul.s $vr0, $vr0, $vr1
+; CONTRACT-OFF-NEXT:    vfadd.s $vr0, $vr0, $vr2
+; CONTRACT-OFF-NEXT:    vst $vr0, $a0, 0
+; CONTRACT-OFF-NEXT:    ret
 entry:
   %v0 = load <4 x float>, ptr %a0
   %v1 = load <4 x float>, ptr %a1
@@ -25,15 +52,34 @@ entry:
 }
 
 define void @vfmsub_s(ptr %res, ptr %a0, ptr %a1, ptr %a2) nounwind {
-; CONTRACT-LABEL: vfmsub_s:
-; CONTRACT:       # %bb.0: # %entry
-; CONTRACT-NEXT:    vld $vr0, $a1, 0
-; CONTRACT-NEXT:    vld $vr1, $a2, 0
-; CONTRACT-NEXT:    vld $vr2, $a3, 0
-; CONTRACT-NEXT:    vfmul.s $vr0, $vr0, $vr1
-; CONTRACT-NEXT:    vfsub.s $vr0, $vr0, $vr2
-; CONTRACT-NEXT:    vst $vr0, $a0, 0
-; CONTRACT-NEXT:    ret
+; CONTRACT-FAST-LABEL: vfmsub_s:
+; CONTRACT-FAST:       # %bb.0: # %entry
+; CONTRACT-FAST-NEXT:    vld $vr0, $a1, 0
+; CONTRACT-FAST-NEXT:    vld $vr1, $a2, 0
+; CONTRACT-FAST-NEXT:    vld $vr2, $a3, 0
+; CONTRACT-FAST-NEXT:    vfmsub.s $vr0, $vr0, $vr1, $vr2
+; CONTRACT-FAST-NEXT:    vst $vr0, $a0, 0
+; CONTRACT-FAST-NEXT:    ret
+;
+; CONTRACT-ON-LABEL: vfmsub_s:
+; CONTRACT-ON:       # %bb.0: # %entry
+; CONTRACT-ON-NEXT:    vld $vr0, $a1, 0
+; CONTRACT-ON-NEXT:    vld $vr1, $a2, 0
+; CONTRACT-ON-NEXT:    vld $vr2, $a3, 0
+; CONTRACT-ON-NEXT:    vfmul.s $vr0, $vr0, $vr1
+; CONTRACT-ON-NEXT:    vfsub.s $vr0, $vr0, $vr2
+; CONTRACT-ON-NEXT:    vst $vr0, $a0, 0
+; CONTRACT-ON-NEXT:    ret
+;
+; CONTRACT-OFF-LABEL: vfmsub_s:
+; CONTRACT-OFF:       # %bb.0: # %entry
+; CONTRACT-OFF-NEXT:    vld $vr0, $a1, 0
+; CONTRACT-OFF-NEXT:    vld $vr1, $a2, 0
+; CONTRACT-OFF-NEXT:    vld $vr2, $a3, 0
+; CONTRACT-OFF-NEXT:    vfmul.s $vr0, $vr0, $vr1
+; CONTRACT-OFF-NEXT:    vfsub.s $vr0, $vr0, $vr2
+; CONTRACT-OFF-NEXT:    vst $vr0, $a0, 0
+; CONTRACT-OFF-NEXT:    ret
 entry:
   %v0 = load <4 x float>, ptr %a0
   %v1 = load <4 x float>, ptr %a1
@@ -45,16 +91,36 @@ entry:
 }
 
 define void @vfnmadd_s(ptr %res, ptr %a0, ptr %a1, ptr %a2) nounwind {
-; CONTRACT-LABEL: vfnmadd_s:
-; CONTRACT:       # %bb.0: # %entry
-; CONTRACT-NEXT:    vld $vr0, $a1, 0
-; CONTRACT-NEXT:    vld $vr1, $a2, 0
-; CONTRACT-NEXT:    vld $vr2, $a3, 0
-; CONTRACT-NEXT:    vfmul.s $vr0, $vr0, $vr1
-; CONTRACT-NEXT:    vfadd.s $vr0, $vr0, $vr2
-; CONTRACT-NEXT:    vbitrevi.w $vr0, $vr0, 31
-; CONTRACT-NEXT:    vst $vr0, $a0, 0
-; CONTRACT-NEXT:    ret
+; CONTRACT-FAST-LABEL: vfnmadd_s:
+; CONTRACT-FAST:       # %bb.0: # %entry
+; CONTRACT-FAST-NEXT:    vld $vr0, $a1, 0
+; CONTRACT-FAST-NEXT:    vld $vr1, $a2, 0
+; CONTRACT-FAST-NEXT:    vld $vr2, $a3, 0
+; CONTRACT-FAST-NEXT:    vfnmadd.s $vr0, $vr0, $vr1, $vr2
+; CONTRACT-FAST-NEXT:    vst $vr0, $a0, 0
+; CONTRACT-FAST-NEXT:    ret
+;
+; CONTRACT-ON-LABEL: vfnmadd_s:
+; CONTRACT-ON:       # %bb.0: # %entry
+; CONTRACT-ON-NEXT:    vld $vr0, $a1, 0
+; CONTRACT-ON-NEXT:    vld $vr1, $a2, 0
+; CONTRACT-ON-NEXT:    vld $vr2, $a3, 0
+; CONTRACT-ON-NEXT:    vfmul.s $vr0, $vr0, $vr1
+; CONTRACT-ON-NEXT:    vfadd.s $vr0, $vr0, $vr2
+; CONTRACT-ON-NEXT:    vbitrevi.w $vr0, $vr0, 31
+; CONTRACT-ON-NEXT:    vst $vr0, $a0, 0
+; CONTRACT-ON-NEXT:    ret
+;
+; CONTRACT-OFF-LABEL: vfnmadd_s:
+; CONTRACT-OFF:       # %bb.0: # %entry
+; CONTRACT-OFF-NEXT:    vld $vr0, $a1, 0
+; CONTRACT-OFF-NEXT:    vld $vr1, $a2, 0
+; CONTRACT-OFF-NEXT:    vld $vr2, $a3, 0
+; CONTRACT-OFF-NEXT:    vfmul.s $vr0, $vr0, $vr1
+; CONTRACT-OFF-NEXT:    vfadd.s $vr0, $vr0, $vr2
+; CONTRACT-OFF-NEXT:    vbitrevi.w $vr0, $vr0, 31
+; CONTRACT-OFF-NEXT:    vst $vr0, $a0, 0
+; CONTRACT-OFF-NEXT:    ret
 entry:
   %v0 = load <4 x float>, ptr %a0
   %v1 = load <4 x float>, ptr %a1
@@ -67,16 +133,36 @@ entry:
 }
 
 define void @vfnmadd_s_nsz(ptr %res, ptr %a0, ptr %a1, ptr %a2) nounwind {
-; CONTRACT-LABEL: vfnmadd_s_nsz:
-; CONTRACT:       # %bb.0: # %entry
-; CONTRACT-NEXT:    vld $vr0, $a1, 0
-; CONTRACT-NEXT:    vld $vr1, $a2, 0
-; CONTRACT-NEXT:    vld $vr2, $a3, 0
-; CONTRACT-NEXT:    vbitrevi.w $vr0, $vr0, 31
-; CONTRACT-NEXT:    vfmul.s $vr0, $vr0, $vr1
-; CONTRACT-NEXT:    vfsub.s $vr0, $vr0, $vr2
-; CONTRACT-NEXT:    vst $vr0, $a0, 0
-; CONTRACT-NEXT:    ret
+; CONTRACT-FAST-LABEL: vfnmadd_s_nsz:
+; CONTRACT-FAST:       # %bb.0: # %entry
+; CONTRACT-FAST-NEXT:    vld $vr0, $a1, 0
+; CONTRACT-FAST-NEXT:    vld $vr1, $a2, 0
+; CONTRACT-FAST-NEXT:    vld $vr2, $a3, 0
+; CONTRACT-FAST-NEXT:    vfnmadd.s $vr0, $vr0, $vr1, $vr2
+; CONTRACT-FAST-NEXT:    vst $vr0, $a0, 0
+; CONTRACT-FAST-NEXT:    ret
+;
+; CONTRACT-ON-LABEL: vfnmadd_s_nsz:
+; CONTRACT-ON:       # %bb.0: # %entry
+; CONTRACT-ON-NEXT:    vld $vr0, $a1, 0
+; CONTRACT-ON-NEXT:    vld $vr1, $a2, 0
+; CONTRACT-ON-NEXT:    vld $vr2, $a3, 0
+; CONTRACT-ON-NEXT:    vbitrevi.w $vr0, $vr0, 31
+; CONTRACT-ON-NEXT:    vfmul.s $vr0, $vr0, $vr1
+; CONTRACT-ON-NEXT:    vfsub.s $vr0, $vr0, $vr2
+; CONTRACT-ON-NEXT:    vst $vr0, $a0, 0
+; CONTRACT-ON-NEXT:    ret
+;
+; CONTRACT-OFF-LABEL: vfnmadd_s_nsz:
+; CONTRACT-OFF:       # %bb.0: # %entry
+; CONTRACT-OFF-NEXT:    vld $vr0, $a1, 0
+; CONTRACT-OFF-NEXT:    vld $vr1, $a2, 0
+; CONTRACT-OFF-NEXT:    vld $vr2, $a3, 0
+; CONTRACT-OFF-NEXT:    vbitrevi.w $vr0, $vr0, 31
+; CONTRACT-OFF-NEXT:    vfmul.s $vr0, $vr0, $vr1
+; CONTRACT-OFF-NEXT:    vfsub.s $vr0, $vr0, $vr2
+; CONTRACT-OFF-NEXT:    vst $vr0, $a0, 0
+; CONTRACT-OFF-NEXT:    ret
 entry:
   %v0 = load <4 x float>, ptr %a0
   %v1 = load <4 x float>, ptr %a1
@@ -91,16 +177,37 @@ entry:
 
 ;; Check that vfnmadd.s is not emitted.
 define void @not_vfnmadd_s(ptr %res, ptr %a0, ptr %a1, ptr %a2) nounwind {
-; CONTRACT-LABEL: not_vfnmadd_s:
-; CONTRACT:       # %bb.0: # %entry
-; CONTRACT-NEXT:    vld $vr0, $a1, 0
-; CONTRACT-NEXT:    vld $vr1, $a2, 0
-; CONTRACT-NEXT:    vld $vr2, $a3, 0
-; CONTRACT-NEXT:    vbitrevi.w $vr0, $vr0, 31
-; CONTRACT-NEXT:    vfmul.s $vr0, $vr0, $vr1
-; CONTRACT-NEXT:    vfsub.s $vr0, $vr0, $vr2
-; CONTRACT-NEXT:    vst $vr0, $a0, 0
-; CONTRACT-NEXT:    ret
+; CONTRACT-FAST-LABEL: not_vfnmadd_s:
+; CONTRACT-FAST:       # %bb.0: # %entry
+; CONTRACT-FAST-NEXT:    vld $vr0, $a1, 0
+; CONTRACT-FAST-NEXT:    vld $vr1, $a2, 0
+; CONTRACT-FAST-NEXT:    vld $vr2, $a3, 0
+; CONTRACT-FAST-NEXT:    vbitrevi.w $vr0, $vr0, 31
+; CONTRACT-FAST-NEXT:    vfmsub.s $vr0, $vr0, $vr1, $vr2
+; CONTRACT-FAST-NEXT:    vst $vr0, $a0, 0
+; CONTRACT-FAST-NEXT:    ret
+;
+; CONTRACT-ON-LABEL: not_vfnmadd_s:
+; CONTRACT-ON:       # %bb.0: # %entry
+; CONTRACT-ON-NEXT:    vld $vr0, $a1, 0
+; CONTRACT-ON-NEXT:    vld $vr1, $a2, 0
+; CONTRACT-ON-NEXT:    vld $vr2, $a3, 0
+; CONTRACT-ON-NEXT:    vbitrevi.w $vr0, $vr0, 31
+; CONTRACT-ON-NEXT:    vfmul.s $vr0, $vr0, $vr1
+; CONTRACT-ON-NEXT:    vfsub.s $vr0, $vr0, $vr2
+; CONTRACT-ON-NEXT:    vst $vr0, $a0, 0
+; CONTRACT-ON-NEXT:    ret
+;
+; CONTRACT-OFF-LABEL: not_vfnmadd_s:
+; CONTRACT-OFF:       # %bb.0: # %entry
+; CONTRACT-OFF-NEXT:    vld $vr0, $a1, 0
+; CONTRACT-OFF-NEXT:    vld $vr1, $a2, 0
+; CONTRACT-OFF-NEXT:    vld $vr2, $a3, 0
+; CONTRACT-OFF-NEXT:    vbitrevi.w $vr0, $vr0, 31
+; CONTRACT-OFF-NEXT:    vfmul.s $vr0, $vr0, $vr1
+; CONTRACT-OFF-NEXT:    vfsub.s $vr0, $vr0, $vr2
+; CONTRACT-OFF-NEXT:    vst $vr0, $a0, 0
+; CONTRACT-OFF-NEXT:    ret
 entry:
   %v0 = load <4 x float>, ptr %a0
   %v1 = load <4 x float>, ptr %a1
@@ -114,16 +221,36 @@ entry:
 }
 
 define void @vfnmsub_s(ptr %res, ptr %a0, ptr %a1, ptr %a2) nounwind {
-; CONTRACT-LABEL: vfnmsub_s:
-; CONTRACT:       # %bb.0: # %entry
-; CONTRACT-NEXT:    vld $vr0, $a1, 0
-; CONTRACT-NEXT:    vld $vr1, $a2, 0
-; CONTRACT-NEXT:    vld $vr2, $a3, 0
-; CONTRACT-NEXT:    vfmul.s $vr0, $vr0, $vr1
-; CONTRACT-NEXT:    vfsub.s $vr0, $vr0, $vr2
-; CONTRACT-NEXT:    vbitrevi.w $vr0, $vr0, 31
-; CONTRACT-NEXT:    vst $vr0, $a0, 0
-; CONTRACT-NEXT:    ret
+; CONTRACT-FAST-LABEL: vfnmsub_s:
+; CONTRACT-FAST:       # %bb.0: # %entry
+; CONTRACT-FAST-NEXT:    vld $vr0, $a1, 0
+; CONTRACT-FAST-NEXT:    vld $vr1, $a2, 0
+; CONTRACT-FAST-NEXT:    vld $vr2, $a3, 0
+; CONTRACT-FAST-NEXT:    vfnmsub.s $vr0, $vr0, $vr1, $vr2
+; CONTRACT-FAST-NEXT:    vst $vr0, $a0, 0
+; CONTRACT-FAST-NEXT:    ret
+;
+; CONTRACT-ON-LABEL: vfnmsub_s:
+; CONTRACT-ON:       # %bb.0: # %entry
+; CONTRACT-ON-NEXT:    vld $vr0, $a1, 0
+; CONTRACT-ON-NEXT:    vld $vr1, $a2, 0
+; CONTRACT-ON-NEXT:    vld $vr2, $a3, 0
+; CONTRACT-ON-NEXT:    vfmul.s $vr0, $vr0, $vr1
+; CONTRACT-ON-NEXT:    vfsub.s $vr0, $vr0, $vr2
+; CONTRACT-ON-NEXT:    vbitrevi.w $vr0, $vr0, 31
+; CONTRACT-ON-NEXT:    vst $vr0, $a0, 0
+; CONTRACT-ON-NEXT:    ret
+;
+; CONTRACT-OFF-LABEL: vfnmsub_s:
+; CONTRACT-OFF:       # %bb.0: # %entry
+; CONTRACT-OFF-NEXT:    vld $vr0, $a1, 0
+; CONTRACT-OFF-NEXT:    vld $vr1, $a2, 0
+; CONTRACT-OFF-NEXT:    vld $vr2, $a3, 0
+; CONTRACT-OFF-NEXT:    vfmul.s $vr0, $vr0, $vr1
+; CONTRACT-OFF-NEXT:    vfsub.s $vr0, $vr0, $vr2
+; CONTRACT-OFF-NEXT:    vbitrevi.w $vr0, $vr0, 31
+; CONTRACT-OFF-NEXT:    vst $vr0, $a0, 0
+; CONTRACT-OFF-NEXT:    ret
 entry:
   %v0 = load <4 x float>, ptr %a0
   %v1 = load <4 x float>, ptr %a1
@@ -137,15 +264,34 @@ entry:
 }
 
 define void @vfnmsub_s_nsz(ptr %res, ptr %a0, ptr %a1, ptr %a2) nounwind {
-; CONTRACT-LABEL: vfnmsub_s_nsz:
-; CONTRACT:       # %bb.0: # %entry
-; CONTRACT-NEXT:    vld $vr0, $a1, 0
-; CONTRACT-NEXT:    vld $vr1, $a2, 0
-; CONTRACT-NEXT:    vld $vr2, $a3, 0
-; CONTRACT-NEXT:    vfmul.s $vr0, $vr0, $vr1
-; CONTRACT-NEXT:    vfsub.s $vr0, $vr2, $vr0
-; CONTRACT-NEXT:    vst $vr0, $a0, 0
-; CONTRACT-NEXT:    ret
+; CONTRACT-FAST-LABEL: vfnmsub_s_nsz:
+; CONTRACT-FAST:       # %bb.0: # %entry
+; CONTRACT-FAST-NEXT:    vld $vr0, $a1, 0
+; CONTRACT-FAST-NEXT:    vld $vr1, $a2, 0
+; CONTRACT-FAST-NEXT:    vld $vr2, $a3, 0
+; CONTRACT-FAST-NEXT:    vfnmsub.s $vr0, $vr0, $vr1, $vr2
+; CONTRACT-FAST-NEXT:    vst $vr0, $a0, 0
+; CONTRACT-FAST-NEXT:    ret
+;
+; CONTRACT-ON-LABEL: vfnmsub_s_nsz:
+; CONTRACT-ON:       # %bb.0: # %entry
+; CONTRACT-ON-NEXT:    vld $vr0, $a1, 0
+; CONTRACT-ON-NEXT:    vld $vr1, $a2, 0
+; CONTRACT-ON-NEXT:    vld $vr2, $a3, 0
+; CONTRACT-ON-NEXT:    vfmul.s $vr0, $vr0, $vr1
+; CONTRACT-ON-NEXT:    vfsub.s $vr0, $vr2, $vr0
+; CONTRACT-ON-NEXT:    vst $vr0, $a0, 0
+; CONTRACT-ON-NEXT:    ret
+;
+; CONTRACT-OFF-LABEL: vfnmsub_s_nsz:
+; CONTRACT-OFF:       # %bb.0: # %entry
+; CONTRACT-OFF-NEXT:    vld $vr0, $a1, 0
+; CONTRACT-OFF-NEXT:    vld $vr1, $a2, 0
+; CONTRACT-OFF-NEXT:    vld $vr2, $a3, 0
+; CONTRACT-OFF-NEXT:    vfmul.s $vr0, $vr0, $vr1
+; CONTRACT-OFF-NEXT:    vfsub.s $vr0, $vr2, $vr0
+; CONTRACT-OFF-NEXT:    vst $vr0, $a0, 0
+; CONTRACT-OFF-NEXT:    ret
 entry:
   %v0 = load <4 x float>, ptr %a0
   %v1 = load <4 x float>, ptr %a1
@@ -159,15 +305,35 @@ entry:
 
 ;; Check that vfnmsub.s is not emitted.
 define void @not_vfnmsub_s(ptr %res, ptr %a0, ptr %a1, ptr %a2) nounwind {
-; CONTRACT-LABEL: not_vfnmsub_s:
-; CONTRACT:       # %bb.0: # %entry
-; CONTRACT-NEXT:    vld $vr0, $a1, 0
-; CONTRACT-NEXT:    vld $vr1, $a2, 0
-; CONTRACT-NEXT:    vld $vr2, $a3, 0
-; CONTRACT-NEXT:    vfmul.s $vr0, $vr0, $vr1
-; CONTRACT-NEXT:    vfsub.s $vr0, $vr2, $vr0
-; CONTRACT-NEXT:    vst $vr0, $a0, 0
-; CONTRACT-NEXT:    ret
+; CONTRACT-FAST-LABEL: not_vfnmsub_s:
+; CONTRACT-FAST:       # %bb.0: # %entry
+; CONTRACT-FAST-NEXT:    vld $vr0, $a1, 0
+; CONTRACT-FAST-NEXT:    vld $vr1, $a2, 0
+; CONTRACT-FAST-NEXT:    vld $vr2, $a3, 0
+; CONTRACT-FAST-NEXT:    vbitrevi.w $vr0, $vr0, 31
+; CONTRACT-FAST-NEXT:    vfmadd.s $vr0, $vr0, $vr1, $vr2
+; CONTRACT-FAST-NEXT:    vst $vr0, $a0, 0
+; CONTRACT-FAST-NEXT:    ret
+;
+; CONTRACT-ON-LABEL: not_vfnmsub_s:
+; CONTRACT-ON:       # %bb.0: # %entry
+; CONTRACT-ON-NEXT:    vld $vr0, $a1, 0
+; CONTRACT-ON-NEXT:    vld $vr1, $a2, 0
+; CONTRACT-ON-NEXT:    vld $vr2, $a3, 0
+; CONTRACT-ON-NEXT:    vfmul.s $vr0, $vr0, $vr1
+; CONTRACT-ON-NEXT:    vfsub.s $vr0, $vr2, $vr0
+; CONTRACT-ON-NEXT:    vst $vr0, $a0, 0
+; CONTRACT-ON-NEXT:    ret
+;
+; CONTRACT-OFF-LABEL: not_vfnmsub_s:
+; CONTRACT-OFF:       # %bb.0: # %entry
+; CONTRACT-OFF-NEXT:    vld $vr0, $a1, 0
+; CONTRACT-OFF-NEXT:    vld $vr1, $a2, 0
+; CONTRACT-OFF-NEXT:    vld $vr2, $a3, 0
+; CONTRACT-OFF-NEXT:    vfmul.s $vr0, $vr0, $vr1
+; CONTRACT-OFF-NEXT:    vfsub.s $vr0, $vr2, $vr0
+; CONTRACT-OFF-NEXT:    vst $vr0, $a0, 0
+; CONTRACT-OFF-NEXT:    ret
 entry:
   %v0 = load <4 x float>, ptr %a0
   %v1 = load <4 x float>, ptr %a1
@@ -180,14 +346,32 @@ entry:
 }
 
 define void @contract_vfmadd_s(ptr %res, ptr %a0, ptr %a1, ptr %a2) nounwind {
-; CONTRACT-LABEL: contract_vfmadd_s:
-; CONTRACT:       # %bb.0: # %entry
-; CONTRACT-NEXT:    vld $vr0, $a1, 0
-; CONTRACT-NEXT:    vld $vr1, $a2, 0
-; CONTRACT-NEXT:    vld $vr2, $a3, 0
-; CONTRACT-NEXT:    vfmadd.s $vr0, $vr0, $vr1, $vr2
-; CONTRACT-NEXT:    vst $vr0, $a0, 0
-; CONTRACT-NEXT:    ret
+; CONTRACT-FAST-LABEL: contract_vfmadd_s:
+; CONTRACT-FAST:       # %bb.0: # %entry
+; CONTRACT-FAST-NEXT:    vld $vr0, $a1, 0
+; CONTRACT-FAST-NEXT:    vld $vr1, $a2, 0
+; CONTRACT-FAST-NEXT:    vld $vr2, $a3, 0
+; CONTRACT-FAST-NEXT:    vfmadd.s $vr0, $vr0, $vr1, $vr2
+; CONTRACT-FAST-NEXT:    vst $vr0, $a0, 0
+; CONTRACT-FAST-NEXT:    ret
+;
+; CONTRACT-ON-LABEL: contract_vfmadd_s:
+; CONTRACT-ON:       # %bb.0: # %entry
+; CONTRACT-ON-NEXT:    vld $vr0, $a1, 0
+; CONTRACT-ON-NEXT:    vld $vr1, $a2, 0
+; CONTRACT-ON-NEXT:    vld $vr2, $a3, 0
+; CONTRACT-ON-NEXT:    vfmadd.s $vr0, $vr0, $vr1, $vr2
+; CONTRACT-ON-NEXT:    vst $vr0, $a0, 0
+; CONTRACT-ON-NEXT:    ret
+;
+; CONTRACT-OFF-LABEL: contract_vfmadd_s:
+; CONTRACT-OFF:       # %bb.0: # %entry
+; CONTRACT-OFF-NEXT:    vld $vr0, $a1, 0
+; CONTRACT-OFF-NEXT:    vld $vr1, $a2, 0
+; CONTRACT-OFF-NEXT:    vld $vr2, $a3, 0
+; CONTRACT-OFF-NEXT:    vfmadd.s $vr0, $vr0, $vr1, $vr2
+; CONTRACT-OFF-NEXT:    vst $vr0, $a0, 0
+; CONTRACT-OFF-NEXT:    ret
 entry:
   %v0 = load <4 x float>, ptr %a0
   %v1 = load <4 x float>, ptr %a1
@@ -199,14 +383,32 @@ entry:
 }
 
 define void @contract_vfmsub_s(ptr %res, ptr %a0, ptr %a1, ptr %a2) nounwind {
-; CONTRACT-LABEL: contract_vfmsub_s:
-; CONTRACT:       # %bb.0: # %entry
-; CONTRACT-NEXT:    vld $vr0, $a1, 0
-; CONTRACT-NEXT:    vld $vr1, $a2, 0
-; CONTRACT-NEXT:    vld $vr2, $a3, 0
-; CONTRACT-NEXT:    vfmsub.s $vr0, $vr0, $vr1, $vr2
-; CONTRACT-NEXT:    vst $vr0, $a0, 0
-; CONTRACT-NEXT:    ret
+; CONTRACT-FAST-LABEL: contract_vfmsub_s:
+; CONTRACT-FAST:       # %bb.0: # %entry
+; CONTRACT-FAST-NEXT:    vld $vr0, $a1, 0
+; CONTRACT-FAST-NEXT:    vld $vr1, $a2, 0
+; CONTRACT-FAST-NEXT:    vld $vr2, $a3, 0
+; CONTRACT-FAST-NEXT:    vfmsub.s $vr0, $vr0, $vr1, $vr2
+; CONTRACT-FAST-NEXT:    vst $vr0, $a0, 0
+; CONTRACT-FAST-NEXT:    ret
+;
+; CONTRACT-ON-LABEL: contract_vfmsub_s:
+; CONTRACT-ON:       # %bb.0: # %entry
+; CONTRACT-ON-NEXT:    vld $vr0, $a1, 0
+; CONTRACT-ON-NEXT:    vld $vr1, $a2, 0
+; CONTRACT-ON-NEXT:    vld $vr2, $a3, 0
+; CONTRACT-ON-NEXT:    vfmsub.s $vr0, $vr0, $vr1, $vr2
+; CONTRACT-ON-NEXT:    vst $vr0, $a0, 0
+; CONTRACT-ON-NEXT:    ret
+;
+; CONTRACT-OFF-LABEL: contract_vfmsub_s:
+; CONTRACT-OFF:       # %bb.0: # %entry
+; CONTRACT-OFF-NEXT:    vld $vr0, $a1, 0
+; CONTRACT-OFF-NEXT:    vld $vr1, $a2, 0
+; CONTRACT-OFF-NEXT:    vld $vr2, $a3, 0
+; CONTRACT-OFF-NEXT:    vfmsub.s $vr0, $vr0, $vr1, $vr2
+; CONTRACT-OFF-NEXT:    vst $vr0, $a0, 0
+; CONTRACT-OFF-NEXT:    ret
 entry:
   %v0 = load <4 x float>, ptr %a0
   %v1 = load <4 x float>, ptr %a1
@@ -218,14 +420,32 @@ entry:
 }
 
 define void @contract_vfnmadd_s(ptr %res, ptr %a0, ptr %a1, ptr %a2) nounwind {
-; CONTRACT-LABEL: contract_vfnmadd_s:
-; CONTRACT:       # %bb.0: # %entry
-; CONTRACT-NEXT:    vld $vr0, $a1, 0
-; CONTRACT-NEXT:    vld $vr1, $a2, 0
-; CONTRACT-NEXT:    vld $vr2, $a3, 0
-; CONTRACT-NEXT:    vfnmadd.s $vr0, $vr0, $vr1, $vr2
-; CONTRACT-NEXT:    vst $vr0, $a0, 0
-; CONTRACT-NEXT:    ret
+; CONTRACT-FAST-LABEL: contract_vfnmadd_s:
+; CONTRACT-FAST:       # %bb.0: # %entry
+; CONTRACT-FAST-NEXT:    vld $vr0, $a1, 0
+; CONTRACT-FAST-NEXT:    vld $vr1, $a2, 0
+; CONTRACT-FAST-NEXT:    vld $vr2, $a3, 0
+; CONTRACT-FAST-NEXT:    vfnmadd.s $vr0, $vr0, $vr1, $vr2
+; CONTRACT-FAST-NEXT:    vst $vr0, $a0, 0
+; CONTRACT-FAST-NEXT:    ret
+;
+; CONTRACT-ON-LABEL: contract_vfnmadd_s:
+; CONTRACT-ON:       # %bb.0: # %entry
+; CONTRACT-ON-NEXT:    vld $vr0, $a1, 0
+; CONTRACT-ON-NEXT:    vld $vr1, $a2, 0
+; CONTRACT-ON-NEXT:    vld $vr2, $a3, 0
+; CONTRACT-ON-NEXT:    vfnmadd.s $vr0, $vr0, $vr1, $vr2
+; CONTRACT-ON-NEXT:    vst $vr0, $a0, 0
+; CONTRACT-ON-NEXT:    ret
+;
+; CONTRACT-OFF-LABEL: contract_vfnmadd_s:
+; CONTRACT-OFF:       # %bb.0: # %entry
+; CONTRACT-OFF-NEXT:    vld $vr0, $a1, 0
+; CONTRACT-OFF-NEXT:    vld $vr1, $a2, 0
+; CONTRACT-OFF-NEXT:    vld $vr2, $a3, 0
+; CONTRACT-OFF-NEXT:    vfnmadd.s $vr0, $vr0, $vr1, $vr2
+; CONTRACT-OFF-NEXT:    vst $vr0, $a0, 0
+; CONTRACT-OFF-NEXT:    ret
 entry:
   %v0 = load <4 x float>, ptr %a0
   %v1 = load <4 x float>, ptr %a1
@@ -238,14 +458,32 @@ entry:
 }
 
 define void @contract_vfnmadd_s_nsz(ptr %res, ptr %a0, ptr %a1, ptr %a2) nounwind {
-; CONTRACT-LABEL: contract_vfnmadd_s_nsz:
-; CONTRACT:       # %bb.0: # %entry
-; CONTRACT-NEXT:    vld $vr0, $a1, 0
-; CONTRACT-NEXT:    vld $vr1, $a2, 0
-; CONTRACT-NEXT:    vld $vr2, $a3, 0
-; CONTRACT-NEXT:    vfnmadd.s $vr0, $vr0, $vr1, $vr2
-; CONTRACT-NEXT:    vst $vr0, $a0, 0
-; CONTRACT-NEXT:    ret
+; CONTRACT-FAST-LABEL: contract_vfnmadd_s_nsz:
+; CONTRACT-FAST:       # %bb.0: # %entry
+; CONTRACT-FAST-NEXT:    vld $vr0, $a1, 0
+; CONTRACT-FAST-NEXT:    vld $vr1, $a2, 0
+; CONTRACT-FAST-NEXT:    vld $vr2, $a3, 0
+; CONTRACT-FAST-NEXT:    vfnmadd.s $vr0, $vr0, $vr1, $vr2
+; CONTRACT-FAST-NEXT:    vst $vr0, $a0, 0
+; CONTRACT-FAST-NEXT:    ret
+;
+; CONTRACT-ON-LABEL: contract_vfnmadd_s_nsz:
+; CONTRACT-ON:       # %bb.0: # %entry
+; CONTRACT-ON-NEXT:    vld $vr0, $a1, 0
+; CONTRACT-ON-NEXT:    vld $vr1, $a2, 0
+; CONTRACT-ON-NEXT:    vld $vr2, $a3, 0
+; CONTRACT-ON-NEXT:    vfnmadd.s $vr0, $vr0, $vr1, $vr2
+; CONTRACT-ON-NEXT:    vst $vr0, $a0, 0
+; CONTRACT-ON-NEXT:    ret
+;
+; CONTRACT-OFF-LABEL: contract_vfnmadd_s_nsz:
+; CONTRACT-OFF:       # %bb.0: # %entry
+; CONTRACT-OFF-NEXT:    vld $vr0, $a1, 0
+; CONTRACT-OFF-NEXT:    vld $vr1, $a2, 0
+; CONTRACT-OFF-NEXT:    vld $vr2, $a3, 0
+; CONTRACT-OFF-NEXT:    vfnmadd.s $vr0, $vr0, $vr1, $vr2
+; CONTRACT-OFF-NEXT:    vst $vr0, $a0, 0
+; CONTRACT-OFF-NEXT:    ret
 entry:
   %v0 = load <4 x float>, ptr %a0
   %v1 = load <4 x float>, ptr %a1
@@ -260,15 +498,35 @@ entry:
 
 ;; Check that vfnmadd.s is not emitted.
 define void @not_contract_vfnmadd_s(ptr %res, ptr %a0, ptr %a1, ptr %a2) nounwind {
-; CONTRACT-LABEL: not_contract_vfnmadd_s:
-; CONTRACT:       # %bb.0: # %entry
-; CONTRACT-NEXT:    vld $vr0, $a1, 0
-; CONTRACT-NEXT:    vld $vr1, $a2, 0
-; CONTRACT-NEXT:    vld $vr2, $a3, 0
-; CONTRACT-NEXT:    vbitrevi.w $vr0, $vr0, 31
-; CONTRACT-NEXT:    vfmsub.s $vr0, $vr0, $vr1, $vr2
-; CONTRACT-NEXT:    vst $vr0, $a0, 0
-; CONTRACT-NEXT:    ret
+; CONTRACT-FAST-LABEL: not_contract_vfnmadd_s:
+; CONTRACT-FAST:       # %bb.0: # %entry
+; CONTRACT-FAST-NEXT:    vld $vr0, $a1, 0
+; CONTRACT-FAST-NEXT:    vld $vr1, $a2, 0
+; CONTRACT-FAST-NEXT:    vld $vr2, $a3, 0
+; CONTRACT-FAST-NEXT:    vbitrevi.w $vr0, $vr0, 31
+; CONTRACT-FAST-NEXT:    vfmsub.s $vr0, $vr0, $vr1, $vr2
+; CONTRACT-FAST-NEXT:    vst $vr0, $a0, 0
+; CONTRACT-FAST-NEXT:    ret
+;
+; CONTRACT-ON-LABEL: not_contract_vfnmadd_s:
+; CONTRACT-ON:       # %bb.0: # %entry
+; CONTRACT-ON-NEXT:    vld $vr0, $a1, 0
+; CONTRACT-ON-NEXT:    vld $vr1, $a2, 0
+; CONTRACT-ON-NEXT:    vld $vr2, $a3, 0
+; CONTRACT-ON-NEXT:    vbitrevi.w $vr0, $vr0, 31
+; CONTRACT-ON-NEXT:    vfmsub.s $vr0, $vr0, $vr1, $vr2
+; CONTRACT-ON-NEXT:    vst $vr0, $a0, 0
+; CONTRACT-ON-NEXT:    ret
+;
+; CONTRACT-OFF-LABEL: not_contract_vfnmadd_s:
+; CONTRACT-OFF:       # %bb.0: # %entry
+; CONTRACT-OFF-NEXT:    vld $vr0, $a1, 0
+; CONTRACT-OFF-NEXT:    vld $vr1, $a2, 0
+; CONTRACT-OFF-NEXT:    vld $vr2, $a3, 0
+; CONTRACT-OFF-NEXT:    vbitrevi.w $vr0, $vr0, 31
+; CONTRACT-OFF-NEXT:    vfmsub.s $vr0, $vr0, $vr1, $vr2
+; CONTRACT-OFF-NEXT:    vst $vr0, $a0, 0
+; CONTRACT-OFF-NEXT:    ret
 entry:
   %v0 = load <4 x float>, ptr %a0
   %v1 = load <4 x float>, ptr %a1
@@ -282,14 +540,32 @@ entry:
 }
 
 define void @contract_vfnmsub_s(ptr %res, ptr %a0, ptr %a1, ptr %a2) nounwind {
-; CONTRACT-LABEL: contract_vfnmsub_s:
-; CONTRACT:       # %bb.0: # %entry
-; CONTRACT-NEXT:    vld $vr0, $a1, 0
-; CONTRACT-NEXT:    vld $vr1, $a2, 0
-; CONTRACT-NEXT:    vld $vr2, $a3, 0
-; CONTRACT-NEXT:    vfnmsub.s $vr0, $vr0, $vr1, $vr2
-; CONTRACT-NEXT:    vst $vr0, $a0, 0
-; CONTRACT-NEXT:    ret
+; CONTRACT-FAST-LABEL: contract_vfnmsub_s:
+; CONTRACT-FAST:       # %bb.0: # %entry
+; CONTRACT-FAST-NEXT:    vld $vr0, $a1, 0
+; CONTRACT-FAST-NEXT:    vld $vr1, $a2, 0
+; CONTRACT-FAST-NEXT:    vld $vr2, $a3, 0
+; CONTRACT-FAST-NEXT:    vfnmsub.s $vr0, $vr0, $vr1, $vr2
+; CONTRACT-FAST-NEXT:    vst $vr0, $a0, 0
+; CONTRACT-FAST-NEXT:    ret
+;
+; CONTRACT-ON-LABEL: contract_vfnmsub_s:
+; CONTRACT-ON:       # %bb.0: # %entry
+; CONTRACT-ON-NEXT:    vld $vr0, $a1, 0
+; CONTRACT-ON-NEXT:    vld $vr1, $a2, 0
+; CONTRACT-ON-NEXT:    vld $vr2, $a3, 0
+; CONTRACT-ON-NEXT:    vfnmsub.s $vr0, $vr0, $vr1, $vr2
+; CONTRACT-ON-NEXT:    vst $vr0, $a0, 0
+; CONTRACT-ON-NEXT:    ret
+;
+; CONTRACT-OFF-LABEL: contract_vfnmsub_s:
+; CONTRACT-OFF:       # %bb.0: # %entry
+; CONTRACT-OFF-NEXT:    vld $vr0, $a1, 0
+; CONTRACT-OFF-NEXT:    vld $vr1, $a2, 0
+; CONTRACT-OFF-NEXT:    vld $vr2, $a3, 0
+; CONTRACT-OFF-NEXT:    vfnmsub.s $vr0, $vr0, $vr1, $vr2
+; CONTRACT-OFF-NEXT:    vst $vr0, $a0, 0
+; CONTRACT-OFF-NEXT:    ret
 entry:
   %v0 = load <4 x float>, ptr %a0
   %v1 = load <4 x float>, ptr %a1
@@ -303,14 +579,32 @@ entry:
 }
 
 define void @contract_vfnmsub_s_nsz(ptr %res, ptr %a0, ptr %a1, ptr %a2) nounwind {
-; CONTRACT-LABEL: contract_vfnmsub_s_nsz:
-; CONTRACT:       # %bb.0: # %entry
-; CONTRACT-NEXT:    vld $vr0, $a1, 0
-; CONTRACT-NEXT:    vld $vr1, $a2, 0
-; CONTRACT-NEXT:    vld $vr2, $a3, 0
-; CONTRACT-NEXT:    vfnmsub.s $vr0, $vr0, $vr1, $vr2
-; CONTRACT-NEXT:    vst $vr0, $a0, 0
-; CONTRACT-NEXT:    ret
+; CONTRACT-FAST-LABEL: contract_vfnmsub_s_nsz:
+; CONTRACT-FAST:       # %bb.0: # %entry
+; CONTRACT-FAST-NEXT:    vld $vr0, $a1, 0
+; CONTRACT-FAST-NEXT:    vld $vr1, $a2, 0
+; CONTRACT-FAST-NEXT:    vld $vr2, $a3, 0
+; CONTRACT-FAST-NEXT:    vfnmsub.s $vr0, $vr0, $vr1, $vr2
+; CONTRACT-FAST-NEXT:    vst $vr0, $a0, 0
+; CONTRACT-FAST-NEXT:    ret
+;
+; CONTRACT-ON-LABEL: contract_vfnmsub_s_nsz:
+; CONTRACT-ON:       # %bb.0: # %entry
+; CONTRACT-ON-NEXT:    vld $vr0, $a1, 0
+; CONTRACT-ON-NEXT:    vld $vr1, $a2, 0
+; CONTRACT-ON-NEXT:    vld $vr2, $a3, 0
+; CONTRACT-ON-NEXT:    vfnmsub.s $vr0, $vr0, $vr1, $vr2
+; CONTRACT-ON-NEXT:    vst $vr0, $a0, 0
+; CONTRACT-ON-NEXT:    ret
+;
+; CONTRACT-OFF-LABEL: contract_vfnmsub_s_nsz:
+; CONTRACT-OFF:       # %bb.0: # %entry
+; CONTRACT-OFF-NEXT:    vld $vr0, $a1, 0
+; CONTRACT-OFF-NEXT:    vld $vr1, $a2, 0
+; CONTRACT-OFF-NEXT:    vld $vr2, $a3, 0
+; CONTRACT-OFF-NEXT:    vfnmsub.s $vr0, $vr0, $vr1, $vr2
+; CONTRACT-OFF-NEXT:    vst $vr0, $a0, 0
+; CONTRACT-OFF-NEXT:    ret
 entry:
   %v0 = load <4 x float>, ptr %a0
   %v1 = load <4 x float>, ptr %a1
@@ -324,15 +618,35 @@ entry:
 
 ;; Check that vfnmsub.s is not emitted.
 define void @not_contract_vfnmsub_s(ptr %res, ptr %a0, ptr %a1, ptr %a2) nounwind {
-; CONTRACT-LABEL: not_contract_vfnmsub_s:
-; CONTRACT:       # %bb.0: # %entry
-; CONTRACT-NEXT:    vld $vr0, $a1, 0
-; CONTRACT-NEXT:    vld $vr1, $a2, 0
-; CONTRACT-NEXT:    vld $vr2, $a3, 0
-; CONTRACT-NEXT:    vbitrevi.w $vr0, $vr0, 31
-; CONTRACT-NEXT:    vfmadd.s $vr0, $vr0, $vr1, $vr2
-; CONTRACT-NEXT:    vst $vr0, $a0, 0
-; CONTRACT-NEXT:    ret
+; CONTRACT-FAST-LABEL: not_contract_vfnmsub_s:
+; CONTRACT-FAST:       # %bb.0: # %entry
+; CONTRACT-FAST-NEXT:    vld $vr0, $a1, 0
+; CONTRACT-FAST-NEXT:    vld $vr1, $a2, 0
+; CONTRACT-FAST-NEXT:    vld $vr2, $a3, 0
+; CONTRACT-FAST-NEXT:    vbitrevi.w $vr0, $vr0, 31
+; CONTRACT-FAST-NEXT:    vfmadd.s $vr0, $vr0, $vr1, $vr2
+; CONTRACT-FAST-NEXT:    vst $vr0, $a0, 0
+; CONTRACT-FAST-NEXT:    ret
+;
+; CONTRACT-ON-LABEL: not_contract_vfnmsub_s:
+; CONTRACT-ON:       # %bb.0: # %entry
+; CONTRACT-ON-NEXT:    vld $vr0, $a1, 0
+; CONTRACT-ON-NEXT:    vld $vr1, $a2, 0
+; CONTRACT-ON-NEXT:    vld $vr2, $a3, 0
+; CONTRACT-ON-NEXT:    vbitrevi.w $vr0, $vr0, 31
+; CONTRACT-ON-NEXT:    vfmadd.s $vr0, $vr0, $vr1, $vr2
+; CONTRACT-ON-NEXT:    vst $vr0, $a0, 0
+; CONTRACT-ON-NEXT:    ret
+;
+; CONTRACT-OFF-LABEL: not_contract_vfnmsub_s:
+; CONTRACT-OFF:       # %bb.0: # %entry
+; CONTRACT-OFF-NEXT:    vld $vr0, $a1, 0
+; CONTRACT-OFF-NEXT:    vld $vr1, $a2, 0
+; CONTRACT-OFF-NEXT:    vld $vr2, $a3, 0
+; CONTRACT-OFF-NEXT:    vbitrevi.w $vr0, $vr0, 31
+; CONTRACT-OFF-NEXT:    vfmadd.s $vr0, $vr0, $vr1, $vr2
+; CONTRACT-OFF-NEXT:    vst $vr0, $a0, 0
+; CONTRACT-OFF-NEXT:    ret
 entry:
   %v0 = load <4 x float>, ptr %a0
   %v1 = load <4 x float>, ptr %a1
@@ -345,14 +659,32 @@ entry:
 }
 
 define void @vfmadd_s_contract(ptr %res, ptr %a0, ptr %a1, ptr %a2) nounwind {
-; CONTRACT-LABEL: vfmadd_s_contract:
-; CONTRACT:       # %bb.0: # %entry
-; CONTRACT-NEXT:    vld $vr0, $a1, 0
-; CONTRACT-NEXT:    vld $vr1, $a2, 0
-; CONTRACT-NEXT:    vld $vr2, $a3, 0
-; CONTRACT-NEXT:    vfmadd.s $vr0, $vr0, $vr1, $vr2
-; CONTRACT-NEXT:    vst $vr0, $a0, 0
-; CONTRACT-NEXT:    ret
+; CONTRACT-FAST-LABEL: vfmadd_s_contract:
+; CONTRACT-FAST:       # %bb.0: # %entry
+; CONTRACT-FAST-NEXT:    vld $vr0, $a1, 0
+; CONTRACT-FAST-NEXT:    vld $vr1, $a2, 0
+; CONTRACT-FAST-NEXT:    vld $vr2, $a3, 0
+; CONTRACT-FAST-NEXT:    vfmadd.s $vr0, $vr0, $vr1, $vr2
+; CONTRACT-FAST-NEXT:    vst $vr0, $a0, 0
+; CONTRACT-FAST-NEXT:    ret
+;
+; CONTRACT-ON-LABEL: vfmadd_s_contract:
+; CONTRACT-ON:       # %bb.0: # %entry
+; CONTRACT-ON-NEXT:    vld $vr0, $a1, 0
+; CONTRACT-ON-NEXT:    vld $vr1, $a2, 0
+; CONTRACT-ON-NEXT:    vld $vr2, $a3, 0
+; CONTRACT-ON-NEXT:    vfmadd.s $vr0, $vr0, $vr1, $vr2
+; CONTRACT-ON-NEXT:    vst $vr0, $a0, 0
+; CONTRACT-ON-NEXT:    ret
+;
+; CONTRACT-OFF-LABEL: vfmadd_s_contract:
+; CONTRACT-OFF:       # %bb.0: # %entry
+; CONTRACT-OFF-NEXT:    vld $vr0, $a1, 0
+; CONTRACT-OFF-NEXT:    vld $vr1, $a2, 0
+; CONTRACT-OFF-NEXT:    vld $vr2, $a3, 0
+; CONTRACT-OFF-NEXT:    vfmadd.s $vr0, $vr0, $vr1, $vr2
+; CONTRACT-OFF-NEXT:    vst $vr0, $a0, 0
+; CONTRACT-OFF-NEXT:    ret
 entry:
   %v0 = load <4 x float>, ptr %a0
   %v1 = load <4 x float>, ptr %a1
@@ -364,14 +696,32 @@ entry:
 }
 
 define void @vfmsub_s_contract(ptr %res, ptr %a0, ptr %a1, ptr %a2) nounwind {
-; CONTRACT-LABEL: vfmsub_s_contract:
-; CONTRACT:       # %bb.0: # %entry
-; CONTRACT-NEXT:    vld $vr0, $a1, 0
-; CONTRACT-NEXT:    vld $vr1, $a2, 0
-; CONTRACT-NEXT:    vld $vr2, $a3, 0
-; CONTRACT-NEXT:    vfmsub.s $vr0, $vr0, $vr1, $vr2
-; CONTRACT-NEXT:    vst $vr0, $a0, 0
-; CONTRACT-NEXT:    ret
+; CONTRACT-FAST-LABEL: vfmsub_s_contract:
+; CONTRACT-FAST:       # %bb.0: # %entry
+; CONTRACT-FAST-NEXT:    vld $vr0, $a1, 0
+; CONTRACT-FAST-NEXT:    vld $vr1, $a2, 0
+; CONTRACT-FAST-NEXT:    vld $vr2, $a3, 0
+; CONTRACT-FAST-NEXT:    vfmsub.s $vr0, $vr0, $vr1, $vr2
+; CONTRACT-FAST-NEXT:    vst $vr0, $a0, 0
+; CONTRACT-FAST-NEXT:    ret
+;
+; CONTRACT-ON-LABEL: vfmsub_s_contract:
+; CONTRACT-ON:       # %bb.0: # %entry
+; CONTRACT-ON-NEXT:    vld $vr0, $a1, 0
+; CONTRACT-ON-NEXT:    vld $vr1, $a2, 0
+; CONTRACT-ON-NEXT:    vld $vr2, $a3, 0
+; CONTRACT-ON-NEXT:    vfmsub.s $vr0, $vr0, $vr1, $vr2
+; CONTRACT-ON-NEXT:    vst $vr0, $a0, 0
+; CONTRACT-ON-NEXT:    ret
+;
+; CONTRACT-OFF-LABEL: vfmsub_s_contract:
+; CONTRACT-OFF:       # %bb.0: # %entry
+; CONTRACT-OFF-NEXT:    vld $vr0, $a1, 0
+; CONTRACT-OFF-NEXT:    vld $vr1, $a2, 0
+; CONTRACT-OFF-NEXT:    vld $vr2, $a3, 0
+; CONTRACT-OFF-NEXT:    vfmsub.s $vr0, $vr0, $vr1, $vr2
+; CONTRACT-OFF-NEXT:    vst $vr0, $a0, 0
+; CONTRACT-OFF-NEXT:    ret
 entry:
   %v0 = load <4 x float>, ptr %a0
   %v1 = load <4 x float>, ptr %a1
@@ -383,14 +733,32 @@ entry:
 }
 
 define void @vfnmadd_s_contract(ptr %res, ptr %a0, ptr %a1, ptr %a2) nounwind {
-; CONTRACT-LABEL: vfnmadd_s_contract:
-; CONTRACT:       # %bb.0: # %entry
-; CONTRACT-NEXT:    vld $vr0, $a1, 0
-; CONTRACT-NEXT:    vld $vr1, $a2, 0
-; CONTRACT-NEXT:    vld $vr2, $a3, 0
-; CONTRACT-NEXT:    vfnmadd.s $vr0, $vr0, $vr1, $vr2
-; CONTRACT-NEXT:    vst $vr0, $a0, 0
-; CONTRACT-NEXT:    ret
+; CONTRACT-FAST-LABEL: vfnmadd_s_contract:
+; CONTRACT-FAST:       # %bb.0: # %entry
+; CONTRACT-FAST-NEXT:    vld $vr0, $a1, 0
+; CONTRACT-FAST-NEXT:    vld $vr1, $a2, 0
+; CONTRACT-FAST-NEXT:    vld $vr2, $a3, 0
+; CONTRACT-FAST-NEXT:    vfnmadd.s $vr0, $vr0, $vr1, $vr2
+; CONTRACT-FAST-NEXT:    vst $vr0, $a0, 0
+; CONTRACT-FAST-NEXT:    ret
+;
+; CONTRACT-ON-LABEL: vfnmadd_s_contract:
+; CONTRACT-ON:       # %bb.0: # %entry
+; CONTRACT-ON-NEXT:    vld $vr0, $a1, 0
+; CONTRACT-ON-NEXT:    vld $vr1, $a2, 0
+; CONTRACT-ON-NEXT:    vld $vr2, $a3, 0
+; CONTRACT-ON-NEXT:    vfnmadd.s $vr0, $vr0, $vr1, $vr2
+; CONTRACT-ON-NEXT:    vst $vr0, $a0, 0
+; CONTRACT-ON-NEXT:    ret
+;
+; CONTRACT-OFF-LABEL: vfnmadd_s_contract:
+; CONTRACT-OFF:       # %bb.0: # %entry
+; CONTRACT-OFF-NEXT:    vld $vr0, $a1, 0
+; CONTRACT-OFF-NEXT:    vld $vr1, $a2, 0
+; CONTRACT-OFF-NEXT:    vld $vr2, $a3, 0
+; CONTRACT-OFF-NEXT:    vfnmadd.s $vr0, $vr0, $vr1, $vr2
+; CONTRACT-OFF-NEXT:    vst $vr0, $a0, 0
+; CONTRACT-OFF-NEXT:    ret
 entry:
   %v0 = load <4 x float>, ptr %a0
   %v1 = load <4 x float>, ptr %a1
@@ -403,14 +771,32 @@ entry:
 }
 
 define void @vfnmsub_s_contract(ptr %res, ptr %a0, ptr %a1, ptr %a2) nounwind {
-; CONTRACT-LABEL: vfnmsub_s_contract:
-; CONTRACT:       # %bb.0: # %entry
-; CONTRACT-NEXT:    vld $vr0, $a1, 0
-; CONTRACT-NEXT:    vld $vr1, $a2, 0
-; CONTRACT-NEXT:    vld $vr2, $a3, 0
-; CONTRACT-NEXT:    vfnmsub.s $vr0, $vr0, $vr1, $vr2
-; CONTRACT-NEXT:    vst $vr0, $a0, 0
-; CONTRACT-NEXT:    ret
+; CONTRACT-FAST-LABEL: vfnmsub_s_contract:
+; CONTRACT-FAST:       # %bb.0: # %entry
+; CONTRACT-FAST-NEXT:    vld $vr0, $a1, 0
+; CONTRACT-FAST-NEXT:    vld $vr1, $a2, 0
+; CONTRACT-FAST-NEXT:    vld $vr2, $a3, 0
+; CONTRACT-FAST-NEXT:    vfnmsub.s $vr0, $vr0, $vr1, $vr2
+; CONTRACT-FAST-NEXT:    vst $vr0, $a0, 0
+; CONTRACT-FAST-NEXT:    ret
+;
+; CONTRACT-ON-LABEL: vfnmsub_s_contract:
+; CONTRACT-ON:       # %bb.0: # %entry
+; CONTRACT-ON-NEXT:    vld $vr0, $a1, 0
+; CONTRACT-ON-NEXT:    vld $vr1, $a2, 0
+; CONTRACT-ON-NEXT:    vld $vr2, $a3, 0
+; CONTRACT-ON-NEXT:    vfnmsub.s $vr0, $vr0, $vr1, $vr2
+; CONTRACT-ON-NEXT:    vst $vr0, $a0, 0
+; CONTRACT-ON-NEXT:    ret
+;
+; CONTRACT-OFF-LABEL: vfnmsub_s_contract:
+; CONTRACT-OFF:       # %bb.0: # %entry
+; CONTRACT-OFF-NEXT:    vld $vr0, $a1, 0
+; CONTRACT-OFF-NEXT:    vld $vr1, $a2, 0
+; CONTRACT-OFF-NEXT:    vld $vr2, $a3, 0
+; CONTRACT-OFF-NEXT:    vfnmsub.s $vr0, $vr0, $vr1, $vr2
+; CONTRACT-OFF-NEXT:    vst $vr0, $a0, 0
+; CONTRACT-OFF-NEXT:    ret
 entry:
   %v0 = load <4 x float>, ptr %a0
   %v1 = load <4 x float>, ptr %a1

diff  --git a/llvm/test/CodeGen/PowerPC/a2-fp-basic.ll b/llvm/test/CodeGen/PowerPC/a2-fp-basic.ll
index e1d771b0c1e46..200b6f44f8416 100644
--- a/llvm/test/CodeGen/PowerPC/a2-fp-basic.ll
+++ b/llvm/test/CodeGen/PowerPC/a2-fp-basic.ll
@@ -1,4 +1,4 @@
-; RUN: llc -verify-machineinstrs < %s -mtriple=ppc64-- -mcpu=a2 | FileCheck %s
+; RUN: llc -verify-machineinstrs < %s -mtriple=ppc64-- -mcpu=a2 -fp-contract=fast | FileCheck %s
 
 %0 = type { double, double }
 
@@ -10,17 +10,17 @@ entry:
   %b.real = load double, ptr %b
   %b.imagp = getelementptr inbounds %0, ptr %b, i32 0, i32 1
   %b.imag = load double, ptr %b.imagp
-  %mul.rl = fmul contract double %a.real, %b.real
-  %mul.rr = fmul contract double %a.imag, %b.imag
-  %mul.r = fsub contract double %mul.rl, %mul.rr
-  %mul.il = fmul contract double %a.imag, %b.real
-  %mul.ir = fmul contract double %a.real, %b.imag
-  %mul.i = fadd contract double %mul.il, %mul.ir
+  %mul.rl = fmul double %a.real, %b.real
+  %mul.rr = fmul double %a.imag, %b.imag
+  %mul.r = fsub double %mul.rl, %mul.rr
+  %mul.il = fmul double %a.imag, %b.real
+  %mul.ir = fmul double %a.real, %b.imag
+  %mul.i = fadd double %mul.il, %mul.ir
   %c.real = load double, ptr %c
   %c.imagp = getelementptr inbounds %0, ptr %c, i32 0, i32 1
   %c.imag = load double, ptr %c.imagp
-  %add.r = fadd contract double %mul.r, %c.real
-  %add.i = fadd contract double %mul.i, %c.imag
+  %add.r = fadd double %mul.r, %c.real
+  %add.i = fadd double %mul.i, %c.imag
   %imag = getelementptr inbounds %0, ptr %agg.result, i32 0, i32 1
   store double %add.r, ptr %agg.result
   store double %add.i, ptr %imag

diff  --git a/llvm/test/CodeGen/PowerPC/fma-assoc.ll b/llvm/test/CodeGen/PowerPC/fma-assoc.ll
index c2004f79219c0..c59d7414e628b 100644
--- a/llvm/test/CodeGen/PowerPC/fma-assoc.ll
+++ b/llvm/test/CodeGen/PowerPC/fma-assoc.ll
@@ -1,13 +1,13 @@
 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
-; RUN: llc -verify-machineinstrs < %s -mtriple=ppc32-- \
+; RUN: llc -verify-machineinstrs < %s -mtriple=ppc32-- -fp-contract=fast \
 ; RUN:   -mcpu=ppc -mattr=-vsx -disable-ppc-vsx-fma-mutation=false | FileCheck %s
-; RUN: llc -verify-machineinstrs < %s -mtriple=powerpc-ibm-aix-xcoff \
+; RUN: llc -verify-machineinstrs < %s -mtriple=powerpc-ibm-aix-xcoff -fp-contract=fast \
 ; RUN:   -mcpu=ppc -mattr=-vsx -disable-ppc-vsx-fma-mutation=false | FileCheck %s
 ; RUN: llc -verify-machineinstrs < %s -mtriple=powerpc64-unknown-linux-gnu \
-; RUN:   -mattr=+vsx -disable-ppc-vsx-fma-mutation=false \
+; RUN:   -fp-contract=fast -mattr=+vsx -disable-ppc-vsx-fma-mutation=false \
 ; RUN:   -mcpu=pwr7 | FileCheck -check-prefix=CHECK-VSX %s
 ; RUN: llc -verify-machineinstrs < %s -mtriple=powerpc64-ibm-aix-xcoff \
-; RUN:   -mattr=+vsx -disable-ppc-vsx-fma-mutation=false \
+; RUN:   -fp-contract=fast -mattr=+vsx -disable-ppc-vsx-fma-mutation=false \
 ; RUN:   -mcpu=pwr7 -vec-extabi | FileCheck -check-prefix=CHECK-VSX %s
 ; RUN: llc -verify-machineinstrs < %s -mtriple=powerpcspe-linux-unknown-gnu \
 ; RUN:   | FileCheck -check-prefix=CHECK-SPE %s
@@ -41,10 +41,10 @@ define double @test_FMADD_ASSOC1(double %A, double %B, double %C,
 ; CHECK-SPE-NEXT:    evmergehi 3, 4, 4
 ; CHECK-SPE-NEXT:    blr
                                  double %D, double %E) {
-  %F = fmul contract double %A, %B         ; <double> [#uses=1]
-  %G = fmul contract double %C, %D         ; <double> [#uses=1]
-  %H = fadd contract double %F, %G         ; <double> [#uses=1]
-  %I = fadd contract double %H, %E         ; <double> [#uses=1]
+  %F = fmul double %A, %B         ; <double> [#uses=1]
+  %G = fmul double %C, %D         ; <double> [#uses=1]
+  %H = fadd double %F, %G         ; <double> [#uses=1]
+  %I = fadd double %H, %E         ; <double> [#uses=1]
   ret double %I
 }
 
@@ -77,10 +77,10 @@ define double @test_FMADD_ASSOC2(double %A, double %B, double %C,
 ; CHECK-SPE-NEXT:    evmergehi 3, 4, 4
 ; CHECK-SPE-NEXT:    blr
                                  double %D, double %E) {
-  %F = fmul contract double %A, %B         ; <double> [#uses=1]
-  %G = fmul contract double %C, %D         ; <double> [#uses=1]
-  %H = fadd contract double %F, %G         ; <double> [#uses=1]
-  %I = fadd contract double %E, %H         ; <double> [#uses=1]
+  %F = fmul double %A, %B         ; <double> [#uses=1]
+  %G = fmul double %C, %D         ; <double> [#uses=1]
+  %H = fadd double %F, %G         ; <double> [#uses=1]
+  %I = fadd double %E, %H         ; <double> [#uses=1]
   ret double %I
 }
 
@@ -113,10 +113,10 @@ define double @test_FMSUB_ASSOC1(double %A, double %B, double %C,
 ; CHECK-SPE-NEXT:    evmergehi 3, 4, 4
 ; CHECK-SPE-NEXT:    blr
                                  double %D, double %E) {
-  %F = fmul contract double %A, %B         ; <double> [#uses=1]
-  %G = fmul contract double %C, %D         ; <double> [#uses=1]
-  %H = fadd contract double %F, %G         ; <double> [#uses=1]
-  %I = fsub contract double %H, %E         ; <double> [#uses=1]
+  %F = fmul double %A, %B         ; <double> [#uses=1]
+  %G = fmul double %C, %D         ; <double> [#uses=1]
+  %H = fadd double %F, %G         ; <double> [#uses=1]
+  %I = fsub double %H, %E         ; <double> [#uses=1]
   ret double %I
 }
 
@@ -149,10 +149,10 @@ define double @test_FMSUB_ASSOC2(double %A, double %B, double %C,
 ; CHECK-SPE-NEXT:    evmergehi 3, 4, 4
 ; CHECK-SPE-NEXT:    blr
                                  double %D, double %E) {
-  %F = fmul contract double %A, %B         ; <double> [#uses=1]
-  %G = fmul contract double %C, %D         ; <double> [#uses=1]
-  %H = fadd contract double %F, %G         ; <double> [#uses=1]
-  %I = fsub contract double %E, %H         ; <double> [#uses=1]
+  %F = fmul double %A, %B         ; <double> [#uses=1]
+  %G = fmul double %C, %D         ; <double> [#uses=1]
+  %H = fadd double %F, %G         ; <double> [#uses=1]
+  %I = fsub double %E, %H         ; <double> [#uses=1]
   ret double %I
 }
 
@@ -182,11 +182,11 @@ define double @test_FMADD_ASSOC_EXT1(float %A, float %B, double %C,
 ; CHECK-SPE-NEXT:    evmergehi 3, 4, 4
 ; CHECK-SPE-NEXT:    blr
                                  double %D, double %E) {
-  %F = fmul contract float %A, %B         ; <float> [#uses=1]
+  %F = fmul float %A, %B         ; <float> [#uses=1]
   %G = fpext float %F to double   ; <double> [#uses=1]
-  %H = fmul contract double %C, %D         ; <double> [#uses=1]
-  %I = fadd contract double %H, %G         ; <double> [#uses=1]
-  %J = fadd contract double %I, %E         ; <double> [#uses=1]
+  %H = fmul double %C, %D         ; <double> [#uses=1]
+  %I = fadd double %H, %G         ; <double> [#uses=1]
+  %J = fadd double %I, %E         ; <double> [#uses=1]
   ret double %J
 }
 
@@ -215,11 +215,11 @@ define double @test_FMADD_ASSOC_EXT2(float %A, float %B, float %C,
 ; CHECK-SPE-NEXT:    evmergehi 3, 4, 4
 ; CHECK-SPE-NEXT:    blr
                                  float %D, double %E) {
-  %F = fmul contract float %A, %B         ; <float> [#uses=1]
-  %G = fmul contract float %C, %D         ; <float> [#uses=1]
-  %H = fadd contract float %F, %G         ; <float> [#uses=1]
+  %F = fmul float %A, %B         ; <float> [#uses=1]
+  %G = fmul float %C, %D         ; <float> [#uses=1]
+  %H = fadd float %F, %G         ; <float> [#uses=1]
   %I = fpext float %H to double   ; <double> [#uses=1]
-  %J = fadd contract double %I, %E         ; <double> [#uses=1]
+  %J = fadd double %I, %E         ; <double> [#uses=1]
   ret double %J
 }
 
@@ -249,11 +249,11 @@ define double @test_FMADD_ASSOC_EXT3(float %A, float %B, double %C,
 ; CHECK-SPE-NEXT:    evmergehi 3, 4, 4
 ; CHECK-SPE-NEXT:    blr
                                  double %D, double %E) {
-  %F = fmul contract float %A, %B          ; <float> [#uses=1]
+  %F = fmul float %A, %B          ; <float> [#uses=1]
   %G = fpext float %F to double   ; <double> [#uses=1]
-  %H = fmul contract double %C, %D         ; <double> [#uses=1]
-  %I = fadd contract double %H, %G         ; <double> [#uses=1]
-  %J = fadd contract double %E, %I         ; <double> [#uses=1]
+  %H = fmul double %C, %D         ; <double> [#uses=1]
+  %I = fadd double %H, %G         ; <double> [#uses=1]
+  %J = fadd double %E, %I         ; <double> [#uses=1]
   ret double %J
 }
 
@@ -282,11 +282,11 @@ define double @test_FMADD_ASSOC_EXT4(float %A, float %B, float %C,
 ; CHECK-SPE-NEXT:    evmergehi 3, 4, 4
 ; CHECK-SPE-NEXT:    blr
                                  float %D, double %E) {
-  %F = fmul contract float %A, %B          ; <float> [#uses=1]
-  %G = fmul contract float %C, %D          ; <float> [#uses=1]
-  %H = fadd contract float %F, %G          ; <float> [#uses=1]
+  %F = fmul float %A, %B          ; <float> [#uses=1]
+  %G = fmul float %C, %D          ; <float> [#uses=1]
+  %H = fadd float %F, %G          ; <float> [#uses=1]
   %I = fpext float %H to double   ; <double> [#uses=1]
-  %J = fadd contract double %E, %I         ; <double> [#uses=1]
+  %J = fadd double %E, %I         ; <double> [#uses=1]
   ret double %J
 }
 
@@ -318,11 +318,11 @@ define double @test_FMSUB_ASSOC_EXT1(float %A, float %B, double %C,
 ; CHECK-SPE-NEXT:    evmergehi 3, 4, 4
 ; CHECK-SPE-NEXT:    blr
                                  double %D, double %E) {
-  %F = fmul contract float %A, %B          ; <float> [#uses=1]
+  %F = fmul float %A, %B          ; <float> [#uses=1]
   %G = fpext float %F to double   ; <double> [#uses=1]
-  %H = fmul contract double %C, %D         ; <double> [#uses=1]
-  %I = fadd contract double %H, %G         ; <double> [#uses=1]
-  %J = fsub contract double %I, %E         ; <double> [#uses=1]
+  %H = fmul double %C, %D         ; <double> [#uses=1]
+  %I = fadd double %H, %G         ; <double> [#uses=1]
+  %J = fsub double %I, %E         ; <double> [#uses=1]
   ret double %J
 }
 
@@ -352,11 +352,11 @@ define double @test_FMSUB_ASSOC_EXT2(float %A, float %B, float %C,
 ; CHECK-SPE-NEXT:    evmergehi 3, 4, 4
 ; CHECK-SPE-NEXT:    blr
                                  float %D, double %E) {
-  %F = fmul contract float %A, %B          ; <float> [#uses=1]
-  %G = fmul contract float %C, %D          ; <float> [#uses=1]
-  %H = fadd contract float %F, %G          ; <float> [#uses=1]
+  %F = fmul float %A, %B          ; <float> [#uses=1]
+  %G = fmul float %C, %D          ; <float> [#uses=1]
+  %H = fadd float %F, %G          ; <float> [#uses=1]
   %I = fpext float %H to double   ; <double> [#uses=1]
-  %J = fsub contract double %I, %E         ; <double> [#uses=1]
+  %J = fsub double %I, %E         ; <double> [#uses=1]
   ret double %J
 }
 
@@ -388,11 +388,11 @@ define double @test_FMSUB_ASSOC_EXT3(float %A, float %B, double %C,
 ; CHECK-SPE-NEXT:    evmergehi 3, 4, 4
 ; CHECK-SPE-NEXT:    blr
                                  double %D, double %E) {
-  %F = fmul contract float %A, %B          ; <float> [#uses=1]
+  %F = fmul float %A, %B          ; <float> [#uses=1]
   %G = fpext float %F to double   ; <double> [#uses=1]
-  %H = fmul contract double %C, %D         ; <double> [#uses=1]
-  %I = fadd contract double %H, %G         ; <double> [#uses=1]
-  %J = fsub contract double %E, %I         ; <double> [#uses=1]
+  %H = fmul double %C, %D         ; <double> [#uses=1]
+  %I = fadd double %H, %G         ; <double> [#uses=1]
+  %J = fsub double %E, %I         ; <double> [#uses=1]
   ret double %J
 }
 
@@ -422,11 +422,11 @@ define double @test_FMSUB_ASSOC_EXT4(float %A, float %B, float %C,
 ; CHECK-SPE-NEXT:    evmergehi 3, 4, 4
 ; CHECK-SPE-NEXT:    blr
                                  float %D, double %E) {
-  %F = fmul contract float %A, %B          ; <float> [#uses=1]
-  %G = fmul contract float %C, %D          ; <float> [#uses=1]
-  %H = fadd contract float %F, %G          ; <float> [#uses=1]
+  %F = fmul float %A, %B          ; <float> [#uses=1]
+  %G = fmul float %C, %D          ; <float> [#uses=1]
+  %H = fadd float %F, %G          ; <float> [#uses=1]
   %I = fpext float %H to double   ; <double> [#uses=1]
-  %J = fsub contract double %E, %I         ; <double> [#uses=1]
+  %J = fsub double %E, %I         ; <double> [#uses=1]
   ret double %J
 }
 
@@ -458,10 +458,10 @@ define double @test_reassoc_FMADD_ASSOC1(double %A, double %B, double %C,
 ; CHECK-SPE-NEXT:    evmergehi 3, 4, 4
 ; CHECK-SPE-NEXT:    blr
                                  double %D, double %E) {
-  %F = fmul contract reassoc double %A, %B         ; <double> [#uses=1]
-  %G = fmul contract reassoc double %C, %D         ; <double> [#uses=1]
-  %H = fadd contract reassoc double %F, %G         ; <double> [#uses=1]
-  %I = fadd contract reassoc double %H, %E         ; <double> [#uses=1]
+  %F = fmul reassoc double %A, %B         ; <double> [#uses=1]
+  %G = fmul reassoc double %C, %D         ; <double> [#uses=1]
+  %H = fadd reassoc double %F, %G         ; <double> [#uses=1]
+  %I = fadd reassoc double %H, %E         ; <double> [#uses=1]
   ret double %I
 }
 
@@ -493,25 +493,27 @@ define double @test_reassoc_FMADD_ASSOC2(double %A, double %B, double %C,
 ; CHECK-SPE-NEXT:    evmergehi 3, 4, 4
 ; CHECK-SPE-NEXT:    blr
                                  double %D, double %E) {
-  %F = fmul contract reassoc double %A, %B         ; <double> [#uses=1]
-  %G = fmul contract reassoc double %C, %D         ; <double> [#uses=1]
-  %H = fadd contract reassoc double %F, %G         ; <double> [#uses=1]
-  %I = fadd contract reassoc double %E, %H         ; <double> [#uses=1]
+  %F = fmul reassoc double %A, %B         ; <double> [#uses=1]
+  %G = fmul reassoc double %C, %D         ; <double> [#uses=1]
+  %H = fadd reassoc double %F, %G         ; <double> [#uses=1]
+  %I = fadd reassoc double %E, %H         ; <double> [#uses=1]
   ret double %I
 }
 
+; FIXME: -ffp-contract=fast does NOT work here?
 define double @test_reassoc_FMSUB_ASSOC1(double %A, double %B, double %C,
 ; CHECK-LABEL: test_reassoc_FMSUB_ASSOC1:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    fmsub 0, 3, 4, 5
-; CHECK-NEXT:    fmadd 1, 1, 2, 0
+; CHECK-NEXT:    fmul 0, 3, 4
+; CHECK-NEXT:    fmadd 0, 1, 2, 0
+; CHECK-NEXT:    fsub 1, 0, 5
 ; CHECK-NEXT:    blr
 ;
 ; CHECK-VSX-LABEL: test_reassoc_FMSUB_ASSOC1:
 ; CHECK-VSX:       # %bb.0:
-; CHECK-VSX-NEXT:    xsmsubmdp 3, 4, 5
-; CHECK-VSX-NEXT:    xsmaddadp 3, 1, 2
-; CHECK-VSX-NEXT:    fmr 1, 3
+; CHECK-VSX-NEXT:    xsmuldp 0, 3, 4
+; CHECK-VSX-NEXT:    xsmaddadp 0, 1, 2
+; CHECK-VSX-NEXT:    xssubdp 1, 0, 5
 ; CHECK-VSX-NEXT:    blr
 ;
 ; CHECK-SPE-LABEL: test_reassoc_FMSUB_ASSOC1:
@@ -528,10 +530,10 @@ define double @test_reassoc_FMSUB_ASSOC1(double %A, double %B, double %C,
 ; CHECK-SPE-NEXT:    evmergehi 3, 4, 4
 ; CHECK-SPE-NEXT:    blr
                                  double %D, double %E) {
-  %F = fmul contract reassoc double %A, %B         ; <double> [#uses=1]
-  %G = fmul contract reassoc double %C, %D         ; <double> [#uses=1]
-  %H = fadd contract reassoc double %F, %G         ; <double> [#uses=1]
-  %I = fsub contract reassoc double %H, %E         ; <double> [#uses=1]
+  %F = fmul reassoc double %A, %B         ; <double> [#uses=1]
+  %G = fmul reassoc double %C, %D         ; <double> [#uses=1]
+  %H = fadd reassoc double %F, %G         ; <double> [#uses=1]
+  %I = fsub reassoc double %H, %E         ; <double> [#uses=1]
   ret double %I
 }
 
@@ -600,25 +602,26 @@ define double @test_reassoc_FMSUB_ASSOC2(double %A, double %B, double %C,
 ; CHECK-SPE-NEXT:    evmergehi 3, 4, 4
 ; CHECK-SPE-NEXT:    blr
                                  double %D, double %E) {
-  %F = fmul contract reassoc double %A, %B         ; <double> [#uses=1]
-  %G = fmul contract reassoc double %C, %D         ; <double> [#uses=1]
-  %H = fadd contract reassoc double %F, %G         ; <double> [#uses=1]
-  %I = fsub contract reassoc double %E, %H         ; <double> [#uses=1]
+  %F = fmul reassoc double %A, %B         ; <double> [#uses=1]
+  %G = fmul reassoc double %C, %D         ; <double> [#uses=1]
+  %H = fadd reassoc double %F, %G         ; <double> [#uses=1]
+  %I = fsub reassoc double %E, %H         ; <double> [#uses=1]
   ret double %I
 }
 
 define double @test_fast_FMSUB_ASSOC2(double %A, double %B, double %C,
 ; CHECK-LABEL: test_fast_FMSUB_ASSOC2:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    fnmsub 0, 3, 4, 5
-; CHECK-NEXT:    fnmsub 1, 1, 2, 0
+; CHECK-NEXT:    fmul 0, 3, 4
+; CHECK-NEXT:    fmadd 0, 1, 2, 0
+; CHECK-NEXT:    fsub 1, 5, 0
 ; CHECK-NEXT:    blr
 ;
 ; CHECK-VSX-LABEL: test_fast_FMSUB_ASSOC2:
 ; CHECK-VSX:       # %bb.0:
-; CHECK-VSX-NEXT:    xsnmsubmdp 3, 4, 5
-; CHECK-VSX-NEXT:    xsnmsubadp 3, 1, 2
-; CHECK-VSX-NEXT:    fmr 1, 3
+; CHECK-VSX-NEXT:    xsmuldp 0, 3, 4
+; CHECK-VSX-NEXT:    xsmaddadp 0, 1, 2
+; CHECK-VSX-NEXT:    xssubdp 1, 5, 0
 ; CHECK-VSX-NEXT:    blr
 ;
 ; CHECK-SPE-LABEL: test_fast_FMSUB_ASSOC2:
@@ -635,10 +638,10 @@ define double @test_fast_FMSUB_ASSOC2(double %A, double %B, double %C,
 ; CHECK-SPE-NEXT:    evmergehi 3, 4, 4
 ; CHECK-SPE-NEXT:    blr
                                  double %D, double %E) {
-  %F = fmul contract reassoc double %A, %B         ; <double> [#uses=1]
-  %G = fmul contract reassoc double %C, %D         ; <double> [#uses=1]
-  %H = fadd contract reassoc double %F, %G         ; <double> [#uses=1]
-  %I = fsub contract reassoc nsz double %E, %H         ; <double> [#uses=1]
+  %F = fmul reassoc double %A, %B         ; <double> [#uses=1]
+  %G = fmul reassoc double %C, %D         ; <double> [#uses=1]
+  %H = fadd reassoc double %F, %G         ; <double> [#uses=1]
+  %I = fsub reassoc nsz double %E, %H         ; <double> [#uses=1]
   ret double %I
 }
 
@@ -668,11 +671,11 @@ define double @test_reassoc_FMADD_ASSOC_EXT1(float %A, float %B, double %C,
 ; CHECK-SPE-NEXT:    evmergehi 3, 4, 4
 ; CHECK-SPE-NEXT:    blr
                                  double %D, double %E) {
-  %F = fmul contract reassoc float %A, %B         ; <float> [#uses=1]
+  %F = fmul reassoc float %A, %B         ; <float> [#uses=1]
   %G = fpext float %F to double   ; <double> [#uses=1]
-  %H = fmul contract reassoc double %C, %D         ; <double> [#uses=1]
-  %I = fadd contract reassoc double %H, %G         ; <double> [#uses=1]
-  %J = fadd contract reassoc double %I, %E         ; <double> [#uses=1]
+  %H = fmul reassoc double %C, %D         ; <double> [#uses=1]
+  %I = fadd reassoc double %H, %G         ; <double> [#uses=1]
+  %J = fadd reassoc double %I, %E         ; <double> [#uses=1]
   ret double %J
 }
 
@@ -701,11 +704,11 @@ define double @test_reassoc_FMADD_ASSOC_EXT2(float %A, float %B, float %C,
 ; CHECK-SPE-NEXT:    evmergehi 3, 4, 4
 ; CHECK-SPE-NEXT:    blr
                                  float %D, double %E) {
-  %F = fmul contract reassoc float %A, %B         ; <float> [#uses=1]
-  %G = fmul contract reassoc float %C, %D         ; <float> [#uses=1]
-  %H = fadd contract reassoc float %F, %G         ; <float> [#uses=1]
+  %F = fmul reassoc float %A, %B         ; <float> [#uses=1]
+  %G = fmul reassoc float %C, %D         ; <float> [#uses=1]
+  %H = fadd reassoc float %F, %G         ; <float> [#uses=1]
   %I = fpext float %H to double   ; <double> [#uses=1]
-  %J = fadd contract reassoc double %I, %E         ; <double> [#uses=1]
+  %J = fadd reassoc double %I, %E         ; <double> [#uses=1]
   ret double %J
 }
 
@@ -735,11 +738,11 @@ define double @test_reassoc_FMADD_ASSOC_EXT3(float %A, float %B, double %C,
 ; CHECK-SPE-NEXT:    evmergehi 3, 4, 4
 ; CHECK-SPE-NEXT:    blr
                                  double %D, double %E) {
-  %F = fmul contract reassoc float %A, %B          ; <float> [#uses=1]
+  %F = fmul reassoc float %A, %B          ; <float> [#uses=1]
   %G = fpext float %F to double   ; <double> [#uses=1]
-  %H = fmul contract reassoc double %C, %D         ; <double> [#uses=1]
-  %I = fadd contract reassoc double %H, %G         ; <double> [#uses=1]
-  %J = fadd contract reassoc double %E, %I         ; <double> [#uses=1]
+  %H = fmul reassoc double %C, %D         ; <double> [#uses=1]
+  %I = fadd reassoc double %H, %G         ; <double> [#uses=1]
+  %J = fadd reassoc double %E, %I         ; <double> [#uses=1]
   ret double %J
 }
 
@@ -768,11 +771,11 @@ define double @test_reassoc_FMADD_ASSOC_EXT4(float %A, float %B, float %C,
 ; CHECK-SPE-NEXT:    evmergehi 3, 4, 4
 ; CHECK-SPE-NEXT:    blr
                                  float %D, double %E) {
-  %F = fmul contract reassoc float %A, %B          ; <float> [#uses=1]
-  %G = fmul contract reassoc float %C, %D          ; <float> [#uses=1]
-  %H = fadd contract reassoc float %F, %G          ; <float> [#uses=1]
+  %F = fmul reassoc float %A, %B          ; <float> [#uses=1]
+  %G = fmul reassoc float %C, %D          ; <float> [#uses=1]
+  %H = fadd reassoc float %F, %G          ; <float> [#uses=1]
   %I = fpext float %H to double   ; <double> [#uses=1]
-  %J = fadd contract reassoc double %E, %I         ; <double> [#uses=1]
+  %J = fadd reassoc double %E, %I         ; <double> [#uses=1]
   ret double %J
 }
 
@@ -802,11 +805,11 @@ define double @test_reassoc_FMSUB_ASSOC_EXT1(float %A, float %B, double %C,
 ; CHECK-SPE-NEXT:    evmergehi 3, 4, 4
 ; CHECK-SPE-NEXT:    blr
                                  double %D, double %E) {
-  %F = fmul contract reassoc float %A, %B          ; <float> [#uses=1]
+  %F = fmul reassoc float %A, %B          ; <float> [#uses=1]
   %G = fpext float %F to double   ; <double> [#uses=1]
-  %H = fmul contract reassoc double %C, %D         ; <double> [#uses=1]
-  %I = fadd contract reassoc double %H, %G         ; <double> [#uses=1]
-  %J = fsub contract reassoc double %I, %E         ; <double> [#uses=1]
+  %H = fmul reassoc double %C, %D         ; <double> [#uses=1]
+  %I = fadd reassoc double %H, %G         ; <double> [#uses=1]
+  %J = fsub reassoc double %I, %E         ; <double> [#uses=1]
   ret double %J
 }
 
@@ -835,11 +838,11 @@ define double @test_reassoc_FMSUB_ASSOC_EXT2(float %A, float %B, float %C,
 ; CHECK-SPE-NEXT:    evmergehi 3, 4, 4
 ; CHECK-SPE-NEXT:    blr
                                  float %D, double %E) {
-  %F = fmul contract reassoc float %A, %B          ; <float> [#uses=1]
-  %G = fmul contract reassoc float %C, %D          ; <float> [#uses=1]
-  %H = fadd contract reassoc float %F, %G          ; <float> [#uses=1]
+  %F = fmul reassoc float %A, %B          ; <float> [#uses=1]
+  %G = fmul reassoc float %C, %D          ; <float> [#uses=1]
+  %H = fadd reassoc float %F, %G          ; <float> [#uses=1]
   %I = fpext float %H to double   ; <double> [#uses=1]
-  %J = fsub contract reassoc double %I, %E         ; <double> [#uses=1]
+  %J = fsub reassoc double %I, %E         ; <double> [#uses=1]
   ret double %J
 }
 
@@ -873,11 +876,11 @@ define double @test_reassoc_FMSUB_ASSOC_EXT3(float %A, float %B, double %C,
 ; CHECK-SPE-NEXT:    evmergehi 3, 4, 4
 ; CHECK-SPE-NEXT:    blr
                                  double %D, double %E) {
-  %F = fmul contract reassoc float %A, %B          ; <float> [#uses=1]
+  %F = fmul reassoc float %A, %B          ; <float> [#uses=1]
   %G = fpext float %F to double   ; <double> [#uses=1]
-  %H = fmul contract reassoc double %C, %D         ; <double> [#uses=1]
-  %I = fadd contract reassoc double %H, %G         ; <double> [#uses=1]
-  %J = fsub contract reassoc double %E, %I         ; <double> [#uses=1]
+  %H = fmul reassoc double %C, %D         ; <double> [#uses=1]
+  %I = fadd reassoc double %H, %G         ; <double> [#uses=1]
+  %J = fsub reassoc double %E, %I         ; <double> [#uses=1]
   ret double %J
 }
 
@@ -909,11 +912,11 @@ define double @test_fast_FMSUB_ASSOC_EXT3(float %A, float %B, double %C,
 ; CHECK-SPE-NEXT:    evmergehi 3, 4, 4
 ; CHECK-SPE-NEXT:    blr
                                              double %D, double %E) {
-  %F = fmul contract reassoc float %A, %B
+  %F = fmul reassoc float %A, %B
   %G = fpext float %F to double
-  %H = fmul contract reassoc double %C, %D
-  %I = fadd contract reassoc nsz double %H, %G
-  %J = fsub contract reassoc nsz double %E, %I
+  %H = fmul reassoc double %C, %D
+  %I = fadd reassoc nsz double %H, %G
+  %J = fsub reassoc nsz double %E, %I
   ret double %J
 }
 
@@ -946,11 +949,11 @@ define double @test_reassoc_FMSUB_ASSOC_EXT4(float %A, float %B, float %C,
 ; CHECK-SPE-NEXT:    evmergehi 3, 4, 4
 ; CHECK-SPE-NEXT:    blr
                                  float %D, double %E) {
-  %F = fmul contract reassoc float %A, %B          ; <float> [#uses=1]
-  %G = fmul contract reassoc float %C, %D          ; <float> [#uses=1]
-  %H = fadd contract reassoc float %F, %G          ; <float> [#uses=1]
+  %F = fmul reassoc float %A, %B          ; <float> [#uses=1]
+  %G = fmul reassoc float %C, %D          ; <float> [#uses=1]
+  %H = fadd reassoc float %F, %G          ; <float> [#uses=1]
   %I = fpext float %H to double   ; <double> [#uses=1]
-  %J = fsub contract reassoc double %E, %I         ; <double> [#uses=1]
+  %J = fsub reassoc double %E, %I         ; <double> [#uses=1]
   ret double %J
 }
 
@@ -979,10 +982,10 @@ define double @test_fast_FMSUB_ASSOC_EXT4(float %A, float %B, float %C,
 ; CHECK-SPE-NEXT:    evmergehi 3, 4, 4
 ; CHECK-SPE-NEXT:    blr
                                           float %D, double %E) {
-  %F = fmul contract reassoc float %A, %B
-  %G = fmul contract reassoc float %C, %D
-  %H = fadd contract reassoc nsz float %F, %G
+  %F = fmul reassoc float %A, %B
+  %G = fmul reassoc float %C, %D
+  %H = fadd reassoc nsz float %F, %G
   %I = fpext float %H to double
-  %J = fsub contract reassoc nsz double %E, %I
+  %J = fsub reassoc nsz double %E, %I
   ret double %J
 }

diff  --git a/llvm/test/CodeGen/PowerPC/fma-ext.ll b/llvm/test/CodeGen/PowerPC/fma-ext.ll
index 494bb8cfe34b5..8bd09375a38a0 100644
--- a/llvm/test/CodeGen/PowerPC/fma-ext.ll
+++ b/llvm/test/CodeGen/PowerPC/fma-ext.ll
@@ -1,10 +1,10 @@
-; RUN: llc -verify-machineinstrs < %s -mtriple=ppc32-- -mattr=-vsx -disable-ppc-vsx-fma-mutation=false | FileCheck %s
-; RUN: llc -verify-machineinstrs < %s -mtriple=powerpc64-unknown-linux-gnu -mattr=+vsx -mcpu=pwr7 -disable-ppc-vsx-fma-mutation=false | FileCheck -check-prefix=CHECK-VSX %s
+; RUN: llc -verify-machineinstrs < %s -mtriple=ppc32-- -fp-contract=fast -mattr=-vsx -disable-ppc-vsx-fma-mutation=false | FileCheck %s
+; RUN: llc -verify-machineinstrs < %s -mtriple=powerpc64-unknown-linux-gnu -fp-contract=fast -mattr=+vsx -mcpu=pwr7 -disable-ppc-vsx-fma-mutation=false | FileCheck -check-prefix=CHECK-VSX %s
 
 define double @test_FMADD_EXT1(float %A, float %B, double %C) {
-    %D = fmul contract float %A, %B          ; <float> [#uses=1]
+    %D = fmul float %A, %B          ; <float> [#uses=1]
     %E = fpext float %D to double   ; <double> [#uses=1]
-    %F = fadd contract double %E, %C         ; <double> [#uses=1]
+    %F = fadd double %E, %C         ; <double> [#uses=1]
     ret double %F
 ; CHECK-LABEL: test_FMADD_EXT1:
 ; CHECK: fmadd
@@ -16,9 +16,9 @@ define double @test_FMADD_EXT1(float %A, float %B, double %C) {
 }
 
 define double @test_FMADD_EXT2(float %A, float %B, double %C) {
-    %D = fmul contract float %A, %B          ; <float> [#uses=1]
+    %D = fmul float %A, %B          ; <float> [#uses=1]
     %E = fpext float %D to double   ; <double> [#uses=1]
-    %F = fadd contract double %C, %E         ; <double> [#uses=1]
+    %F = fadd double %C, %E         ; <double> [#uses=1]
     ret double %F
 ; CHECK-LABEL: test_FMADD_EXT2:
 ; CHECK: fmadd
@@ -30,9 +30,9 @@ define double @test_FMADD_EXT2(float %A, float %B, double %C) {
 }
 
 define double @test_FMSUB_EXT1(float %A, float %B, double %C) {
-    %D = fmul contract float %A, %B          ; <float> [#uses=1]
+    %D = fmul float %A, %B          ; <float> [#uses=1]
     %E = fpext float %D to double   ; <double> [#uses=1]
-    %F = fsub contract double %E, %C         ; <double> [#uses=1]
+    %F = fsub double %E, %C         ; <double> [#uses=1]
     ret double %F
 ; CHECK-LABEL: test_FMSUB_EXT1:
 ; CHECK: fmsub
@@ -44,9 +44,9 @@ define double @test_FMSUB_EXT1(float %A, float %B, double %C) {
 }
 
 define double @test_FMSUB_EXT2(float %A, float %B, double %C) {
-    %D = fmul contract float %A, %B          ; <float> [#uses=1]
+    %D = fmul float %A, %B          ; <float> [#uses=1]
     %E = fpext float %D to double   ; <double> [#uses=1]
-    %F = fsub contract double %C, %E         ; <double> [#uses=1]
+    %F = fsub double %C, %E         ; <double> [#uses=1]
     ret double %F
 ; CHECK-LABEL: test_FMSUB_EXT2:
 ; CHECK: fneg
@@ -61,9 +61,9 @@ define double @test_FMSUB_EXT2(float %A, float %B, double %C) {
 
 ; need nsz flag to generate fnmsub since it may affect sign of zero
 define double @test_FMSUB_EXT2_NSZ(float %A, float %B, double %C) {
-    %D = fmul nsz contract float %A, %B      ; <float> [#uses=1]
+    %D = fmul nsz float %A, %B      ; <float> [#uses=1]
     %E = fpext float %D to double   ; <double> [#uses=1]
-    %F = fsub nsz contract double %C, %E     ; <double> [#uses=1]
+    %F = fsub nsz double %C, %E     ; <double> [#uses=1]
     ret double %F
 ; CHECK-LABEL: test_FMSUB_EXT2_NSZ:
 ; CHECK: fnmsub
@@ -75,10 +75,10 @@ define double @test_FMSUB_EXT2_NSZ(float %A, float %B, double %C) {
 }
 
 define double @test_FMSUB_EXT3(float %A, float %B, double %C) {
-    %D = fmul contract float %A, %B          ; <float> [#uses=1]
+    %D = fmul float %A, %B          ; <float> [#uses=1]
     %E = fsub float -0.000000e+00, %D ;    <float> [#uses=1]
     %F = fpext float %E to double   ; <double> [#uses=1]
-    %G = fsub contract double %F, %C         ; <double> [#uses=1]
+    %G = fsub double %F, %C         ; <double> [#uses=1]
     ret double %G
 ; CHECK-LABEL: test_FMSUB_EXT3:
 ; CHECK: fnmadd
@@ -92,10 +92,10 @@ define double @test_FMSUB_EXT3(float %A, float %B, double %C) {
 }
     
 define double @test_FMSUB_EXT4(float %A, float %B, double %C) {
-    %D = fmul contract float %A, %B          ; <float> [#uses=1]
+    %D = fmul float %A, %B          ; <float> [#uses=1]
     %E = fpext float %D to double   ; <double> [#uses=1]
     %F = fsub double -0.000000e+00, %E ;    <double> [#uses=1]
-    %G = fsub contract double %F, %C         ; <double> [#uses=1]
+    %G = fsub double %F, %C         ; <double> [#uses=1]
     ret double %G
 ; CHECK-LABEL: test_FMSUB_EXT4:
 ; CHECK: fnmadd

diff  --git a/llvm/test/CodeGen/PowerPC/fma.ll b/llvm/test/CodeGen/PowerPC/fma.ll
index 993746c0b51bd..b49b93b83b689 100644
--- a/llvm/test/CodeGen/PowerPC/fma.ll
+++ b/llvm/test/CodeGen/PowerPC/fma.ll
@@ -1,7 +1,7 @@
-; RUN: llc -verify-machineinstrs < %s -mtriple=ppc32-- -mattr=-vsx -disable-ppc-vsx-fma-mutation=false | FileCheck %s
-; RUN: llc -verify-machineinstrs < %s -mtriple=powerpc64-unknown-linux-gnu -mattr=+vsx -mcpu=pwr7 -disable-ppc-vsx-fma-mutation=false | FileCheck -check-prefix=CHECK-VSX %s
-; RUN: llc -verify-machineinstrs < %s -mtriple=powerpc64-unknown-linux-gnu -mcpu=pwr8 -disable-ppc-vsx-fma-mutation=false | FileCheck -check-prefix=CHECK-P8 %s
-; RUN: llc -verify-machineinstrs < %s -mtriple=powerpc64le-unknown-linux-gnu -mcpu=pwr8 -disable-ppc-vsx-fma-mutation=false | FileCheck -check-prefix=CHECK-P8 %s
+; RUN: llc -verify-machineinstrs < %s -mtriple=ppc32-- -fp-contract=fast -mattr=-vsx -disable-ppc-vsx-fma-mutation=false | FileCheck %s
+; RUN: llc -verify-machineinstrs < %s -mtriple=powerpc64-unknown-linux-gnu -fp-contract=fast -mattr=+vsx -mcpu=pwr7 -disable-ppc-vsx-fma-mutation=false | FileCheck -check-prefix=CHECK-VSX %s
+; RUN: llc -verify-machineinstrs < %s -mtriple=powerpc64-unknown-linux-gnu -fp-contract=fast -mcpu=pwr8 -disable-ppc-vsx-fma-mutation=false | FileCheck -check-prefix=CHECK-P8 %s
+; RUN: llc -verify-machineinstrs < %s -mtriple=powerpc64le-unknown-linux-gnu -fp-contract=fast -mcpu=pwr8 -disable-ppc-vsx-fma-mutation=false | FileCheck -check-prefix=CHECK-P8 %s
 
 declare double @dummy1(double) #0
 declare double @dummy2(double, double) #0
@@ -9,8 +9,8 @@ declare double @dummy3(double, double, double) #0
 declare float @dummy4(float, float) #0
 
 define double @test_FMADD1(double %A, double %B, double %C) {
-	%D = fmul contract double %A, %B		; <double> [#uses=1]
-	%E = fadd contract double %C, %D		; <double> [#uses=1]
+	%D = fmul double %A, %B		; <double> [#uses=1]
+	%E = fadd double %C, %D		; <double> [#uses=1]
 	ret double %E
 ; CHECK-LABEL: test_FMADD1:
 ; CHECK: fmadd
@@ -22,8 +22,8 @@ define double @test_FMADD1(double %A, double %B, double %C) {
 }
 
 define double @test_FMADD2(double %A, double %B, double %C) {
-	%D = fmul contract double %A, %B		; <double> [#uses=1]
-	%E = fadd contract double %D, %C		; <double> [#uses=1]
+	%D = fmul double %A, %B		; <double> [#uses=1]
+	%E = fadd double %D, %C		; <double> [#uses=1]
 	ret double %E
 ; CHECK-LABEL: test_FMADD2:
 ; CHECK: fmadd
@@ -35,8 +35,8 @@ define double @test_FMADD2(double %A, double %B, double %C) {
 }
 
 define double @test_FMSUB1(double %A, double %B, double %C) {
-	%D = fmul contract double %A, %B		; <double> [#uses=1]
-	%E = fsub contract double %D, %C		; <double> [#uses=1]
+	%D = fmul double %A, %B		; <double> [#uses=1]
+	%E = fsub double %D, %C		; <double> [#uses=1]
 	ret double %E
 ; CHECK-LABEL: test_FMSUB1:
 ; CHECK: fmsub
@@ -48,9 +48,9 @@ define double @test_FMSUB1(double %A, double %B, double %C) {
 }
 
 define double @test_FMSUB2(double %A, double %B, double %C, double %D) {
-	%E = fmul contract double %A, %B 	; <double> [#uses=2]
-	%F = fadd contract double %E, %C 	; <double> [#uses=1]
-	%G = fsub contract double %E, %D 	; <double> [#uses=1]
+	%E = fmul double %A, %B 	; <double> [#uses=2]
+	%F = fadd double %E, %C 	; <double> [#uses=1]
+	%G = fsub double %E, %D 	; <double> [#uses=1]
 	%H = call double @dummy2(double %F, double %G)      ; <double> [#uses=1]
 	ret double %H
 ; CHECK-LABEL: test_FMSUB2:
@@ -63,8 +63,8 @@ define double @test_FMSUB2(double %A, double %B, double %C, double %D) {
 }
 
 define double @test_FNMADD1(double %A, double %B, double %C) {
-	%D = fmul contract double %A, %B		; <double> [#uses=1]
-	%E = fadd contract double %D, %C		; <double> [#uses=1]
+	%D = fmul double %A, %B		; <double> [#uses=1]
+	%E = fadd double %D, %C		; <double> [#uses=1]
 	%F = fsub double -0.000000e+00, %E		; <double> [#uses=1]
 	ret double %F
 ; CHECK-LABEL: test_FNMADD1:
@@ -77,8 +77,8 @@ define double @test_FNMADD1(double %A, double %B, double %C) {
 }
 
 define double @test_FNMADD2(double %A, double %B, double %C) {
-	%D = fmul contract double %A, %B		; <double> [#uses=1]
-	%E = fadd contract double %C, %D		; <double> [#uses=1]
+	%D = fmul double %A, %B		; <double> [#uses=1]
+	%E = fadd double %C, %D		; <double> [#uses=1]
 	%F = fsub double -0.000000e+00, %E		; <double> [#uses=1]
 	ret double %F
 ; CHECK-LABEL: test_FNMADD2:
@@ -91,8 +91,8 @@ define double @test_FNMADD2(double %A, double %B, double %C) {
 }
 
 define double @test_FNMSUB1(double %A, double %B, double %C) {
-	%D = fmul contract double %A, %B		; <double> [#uses=1]
-	%E = fsub contract double %C, %D		; <double> [#uses=1]
+	%D = fmul double %A, %B		; <double> [#uses=1]
+	%E = fsub double %C, %D		; <double> [#uses=1]
 	ret double %E
 ; CHECK-LABEL: test_FNMSUB1:
 ; CHECK: fneg
@@ -106,8 +106,8 @@ define double @test_FNMSUB1(double %A, double %B, double %C) {
 
 ; need nsz flag to generate fnmsub since it may affect sign of zero
 define double @test_FNMSUB1_NSZ(double %A, double %B, double %C) {
-	%D = fmul nsz contract double %A, %B		; <double> [#uses=1]
-	%E = fsub nsz contract double %C, %D		; <double> [#uses=1]
+	%D = fmul nsz double %A, %B		; <double> [#uses=1]
+	%E = fsub nsz double %C, %D		; <double> [#uses=1]
 	ret double %E
 ; CHECK-LABEL: test_FNMSUB1_NSZ:
 ; CHECK: fnmsub
@@ -118,8 +118,8 @@ define double @test_FNMSUB1_NSZ(double %A, double %B, double %C) {
 }
 
 define double @test_FNMSUB2(double %A, double %B, double %C) {
-	%D = fmul contract double %A, %B		; <double> [#uses=1]
-	%E = fsub contract double %D, %C		; <double> [#uses=1]
+	%D = fmul double %A, %B		; <double> [#uses=1]
+	%E = fsub double %D, %C		; <double> [#uses=1]
 	%F = fsub double -0.000000e+00, %E		; <double> [#uses=1]
 	ret double %F
 ; CHECK-LABEL: test_FNMSUB2:
@@ -132,8 +132,8 @@ define double @test_FNMSUB2(double %A, double %B, double %C) {
 }
 
 define float @test_FNMSUBS(float %A, float %B, float %C) {
-	%D = fmul contract float %A, %B		; <float> [#uses=1]
-	%E = fsub contract float %D, %C		; <float> [#uses=1]
+	%D = fmul float %A, %B		; <float> [#uses=1]
+	%E = fsub float %D, %C		; <float> [#uses=1]
 	%F = fsub float -0.000000e+00, %E		; <float> [#uses=1]
 	ret float %F
 ; CHECK-LABEL: test_FNMSUBS:
@@ -146,8 +146,8 @@ define float @test_FNMSUBS(float %A, float %B, float %C) {
 }
 
 define float @test_XSMADDMSP(float %A, float %B, float %C) {
-	%D = fmul contract float %A, %B		; <float> [#uses=1]
-	%E = fadd contract float %C, %D		; <float> [#uses=1]
+	%D = fmul float %A, %B		; <float> [#uses=1]
+	%E = fadd float %C, %D		; <float> [#uses=1]
 	ret float %E
 ; CHECK-P8-LABEL: test_XSMADDMSP:
 ; CHECK-P8: xsmaddmsp
@@ -155,8 +155,8 @@ define float @test_XSMADDMSP(float %A, float %B, float %C) {
 }
 
 define float @test_XSMSUBMSP(float %A, float %B, float %C) {
-	%D = fmul contract float %A, %B		; <float> [#uses=1]
-	%E = fsub contract float %D, %C		; <float> [#uses=1]
+	%D = fmul float %A, %B		; <float> [#uses=1]
+	%E = fsub float %D, %C		; <float> [#uses=1]
 	ret float %E
 ; CHECK-P8-LABEL: test_XSMSUBMSP:
 ; CHECK-P8: xsmsubmsp
@@ -164,9 +164,9 @@ define float @test_XSMSUBMSP(float %A, float %B, float %C) {
 }
 
 define float @test_XSMADDASP(float %A, float %B, float %C, float %D) {
-	%E = fmul contract float %A, %B 	; <float> [#uses=2]
-	%F = fadd contract float %E, %C 	; <float> [#uses=1]
-	%G = fsub contract float %E, %D 	; <float> [#uses=1]
+	%E = fmul float %A, %B 	; <float> [#uses=2]
+	%F = fadd float %E, %C 	; <float> [#uses=1]
+	%G = fsub float %E, %D 	; <float> [#uses=1]
 	%H = call float @dummy4(float %F, float %G)      ; <float> [#uses=1]
 	ret float %H
 ; CHECK-P8-LABEL: test_XSMADDASP:
@@ -175,9 +175,9 @@ define float @test_XSMADDASP(float %A, float %B, float %C, float %D) {
 }
 
 define float @test_XSMSUBASP(float %A, float %B, float %C, float %D) {
-	%E = fmul contract float %A, %B 	; <float> [#uses=2]
-	%F = fsub contract float %E, %C 	; <float> [#uses=1]
-	%G = fsub contract float %E, %D 	; <float> [#uses=1]
+	%E = fmul float %A, %B 	; <float> [#uses=2]
+	%F = fsub float %E, %C 	; <float> [#uses=1]
+	%G = fsub float %E, %D 	; <float> [#uses=1]
 	%H = call float @dummy4(float %F, float %G)      ; <float> [#uses=1]
 	ret float %H
 ; CHECK-P8-LABEL: test_XSMSUBASP:
@@ -186,8 +186,8 @@ define float @test_XSMSUBASP(float %A, float %B, float %C, float %D) {
 }
 
 define float @test_XSNMADDMSP(float %A, float %B, float %C) {
-	%D = fmul contract float %A, %B		; <float> [#uses=1]
-	%E = fadd contract float %D, %C		; <float> [#uses=1]
+	%D = fmul float %A, %B		; <float> [#uses=1]
+	%E = fadd float %D, %C		; <float> [#uses=1]
 	%F = fsub float -0.000000e+00, %E		; <float> [#uses=1]
 	ret float %F
 ; CHECK-P8-LABEL: test_XSNMADDMSP:
@@ -196,8 +196,8 @@ define float @test_XSNMADDMSP(float %A, float %B, float %C) {
 }
 
 define float @test_XSNMSUBMSP(float %A, float %B, float %C) {
-	%D = fmul contract float %A, %B		; <float> [#uses=1]
-	%E = fsub contract float %D, %C		; <float> [#uses=1]
+	%D = fmul float %A, %B		; <float> [#uses=1]
+	%E = fsub float %D, %C		; <float> [#uses=1]
 	%F = fsub float -0.000000e+00, %E		; <float> [#uses=1]
 	ret float %F
 ; CHECK-P8-LABEL: test_XSNMSUBMSP:
@@ -206,8 +206,8 @@ define float @test_XSNMSUBMSP(float %A, float %B, float %C) {
 }
 
 define float @test_XSNMADDASP(float %A, float %B, float %C) {
-	%D = fmul contract float %A, %B		; <float> [#uses=1]
-	%E = fadd contract float %D, %C		; <float> [#uses=1]
+	%D = fmul float %A, %B		; <float> [#uses=1]
+	%E = fadd float %D, %C		; <float> [#uses=1]
 	%F = fsub float -0.000000e+00, %E		; <float> [#uses=1]
 	%H = call float @dummy4(float %E, float %F)      ; <float> [#uses=1]
 	ret float %F
@@ -219,8 +219,8 @@ define float @test_XSNMADDASP(float %A, float %B, float %C) {
 }
 
 define float @test_XSNMSUBASP(float %A, float %B, float %C) {
-	%D = fmul contract float %A, %B		; <float> [#uses=1]
-	%E = fsub contract float %D, %C		; <float> [#uses=1]
+	%D = fmul float %A, %B		; <float> [#uses=1]
+	%E = fsub float %D, %C		; <float> [#uses=1]
 	%F = fsub float -0.000000e+00, %E		; <float> [#uses=1]
 	%H = call float @dummy4(float %E, float %F)      ; <float> [#uses=1]
 	ret float %F

diff  --git a/llvm/test/CodeGen/PowerPC/ppc440-fp-basic.ll b/llvm/test/CodeGen/PowerPC/ppc440-fp-basic.ll
index c0e0517bca8e1..fb4985e8b5eed 100644
--- a/llvm/test/CodeGen/PowerPC/ppc440-fp-basic.ll
+++ b/llvm/test/CodeGen/PowerPC/ppc440-fp-basic.ll
@@ -1,4 +1,4 @@
-; RUN: llc -verify-machineinstrs < %s -mtriple=ppc32-- -mcpu=440 | FileCheck %s
+; RUN: llc -verify-machineinstrs < %s -mtriple=ppc32-- -mcpu=440 -fp-contract=fast | FileCheck %s
 
 %0 = type { double, double }
 
@@ -10,17 +10,17 @@ entry:
   %b.real = load double, ptr %b
   %b.imagp = getelementptr inbounds %0, ptr %b, i32 0, i32 1
   %b.imag = load double, ptr %b.imagp
-  %mul.rl = fmul contract double %a.real, %b.real
-  %mul.rr = fmul contract double %a.imag, %b.imag
-  %mul.r = fsub contract double %mul.rl, %mul.rr
-  %mul.il = fmul contract double %a.imag, %b.real
-  %mul.ir = fmul contract double %a.real, %b.imag
-  %mul.i = fadd contract double %mul.il, %mul.ir
+  %mul.rl = fmul double %a.real, %b.real
+  %mul.rr = fmul double %a.imag, %b.imag
+  %mul.r = fsub double %mul.rl, %mul.rr
+  %mul.il = fmul double %a.imag, %b.real
+  %mul.ir = fmul double %a.real, %b.imag
+  %mul.i = fadd double %mul.il, %mul.ir
   %c.real = load double, ptr %c
   %c.imagp = getelementptr inbounds %0, ptr %c, i32 0, i32 1
   %c.imag = load double, ptr %c.imagp
-  %add.r = fadd contract double %mul.r, %c.real
-  %add.i = fadd contract double %mul.i, %c.imag
+  %add.r = fadd double %mul.r, %c.real
+  %add.i = fadd double %mul.i, %c.imag
   %imag = getelementptr inbounds %0, ptr %agg.result, i32 0, i32 1
   store double %add.r, ptr %agg.result
   store double %add.i, ptr %imag

diff  --git a/llvm/test/CodeGen/PowerPC/vsx-fma-mutate-trivial-copy.ll b/llvm/test/CodeGen/PowerPC/vsx-fma-mutate-trivial-copy.ll
index c2a3a72208e4d..539b563691723 100644
--- a/llvm/test/CodeGen/PowerPC/vsx-fma-mutate-trivial-copy.ll
+++ b/llvm/test/CodeGen/PowerPC/vsx-fma-mutate-trivial-copy.ll
@@ -1,4 +1,4 @@
-; RUN: llc -verify-machineinstrs < %s | FileCheck %s
+; RUN: llc -verify-machineinstrs -fp-contract=fast < %s | FileCheck %s
 target datalayout = "E-m:e-i64:64-n32:64"
 target triple = "powerpc64-unknown-linux-gnu"
 
@@ -14,11 +14,11 @@ for.body.lr.ph:                                   ; preds = %entry
   br label %for.body
 
 for.body:                                         ; preds = %for.body, %for.body.lr.ph
-  %div = fdiv reassoc arcp contract float 0.000000e+00, %W
-  %add = fadd reassoc contract float %div, %d_min
+  %div = fdiv reassoc arcp float 0.000000e+00, %W
+  %add = fadd reassoc float %div, %d_min
   %conv2 = fpext float %add to double
   %0 = tail call double @llvm.sqrt.f64(double %conv2)
-  %div4 = fdiv reassoc arcp contract double %conv3, %0
+  %div4 = fdiv reassoc arcp double %conv3, %0
   %call = tail call signext i32 @p_col_helper(double %div4) #2
   br label %for.body
 

diff  --git a/llvm/test/CodeGen/SPARC/float-ua2007.ll b/llvm/test/CodeGen/SPARC/float-ua2007.ll
index 2e83ea8e287a9..252b47943fe43 100644
--- a/llvm/test/CodeGen/SPARC/float-ua2007.ll
+++ b/llvm/test/CodeGen/SPARC/float-ua2007.ll
@@ -1,6 +1,6 @@
 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
-; RUN: llc -mtriple=sparc64 -mattr=-ua2007 < %s | FileCheck %s -check-prefix=NO-UA2007
-; RUN: llc -mtriple=sparc64 -mattr=+ua2007 < %s | FileCheck %s -check-prefix=UA2007
+; RUN: llc -mtriple=sparc64 --fp-contract=fast -mattr=-ua2007 < %s | FileCheck %s -check-prefix=NO-UA2007
+; RUN: llc -mtriple=sparc64 --fp-contract=fast -mattr=+ua2007 < %s | FileCheck %s -check-prefix=UA2007
 
 define float @fmadds(float %a, float %b, float %c) nounwind {
 ; NO-UA2007-LABEL: fmadds:
@@ -146,8 +146,8 @@ define float @combine_madds(float %a, float %b, float %c) nounwind {
 ; UA2007:       ! %bb.0:
 ; UA2007-NEXT:    retl
 ; UA2007-NEXT:    fmadds %f1, %f3, %f5, %f0
-  %mul = fmul contract float %a, %b
-  %add = fadd contract float %mul, %c
+  %mul = fmul float %a, %b
+  %add = fadd float %mul, %c
   ret float %add
 }
 
@@ -162,8 +162,8 @@ define double @combine_maddd(double %a, double %b, double %c) nounwind {
 ; UA2007:       ! %bb.0:
 ; UA2007-NEXT:    retl
 ; UA2007-NEXT:    fmaddd %f0, %f2, %f4, %f0
-  %mul = fmul contract double %a, %b
-  %add = fadd contract double %mul, %c
+  %mul = fmul double %a, %b
+  %add = fadd double %mul, %c
   ret double %add
 }
 
@@ -178,8 +178,8 @@ define float @combine_msubs(float %a, float %b, float %c) nounwind {
 ; UA2007:       ! %bb.0:
 ; UA2007-NEXT:    retl
 ; UA2007-NEXT:    fmsubs %f1, %f3, %f5, %f0
-  %mul = fmul contract float %a, %b
-  %sub = fsub contract float %mul, %c
+  %mul = fmul float %a, %b
+  %sub = fsub float %mul, %c
   ret float %sub
 }
 
@@ -194,8 +194,8 @@ define double @combine_msubd(double %a, double %b, double %c) nounwind {
 ; UA2007:       ! %bb.0:
 ; UA2007-NEXT:    retl
 ; UA2007-NEXT:    fmsubd %f0, %f2, %f4, %f0
-  %mul = fmul contract double %a, %b
-  %sub = fsub contract double %mul, %c
+  %mul = fmul double %a, %b
+  %sub = fsub double %mul, %c
   ret double %sub
 }
 
@@ -211,8 +211,8 @@ define float @combine_nmadds(float %a, float %b, float %c) nounwind {
 ; UA2007:       ! %bb.0:
 ; UA2007-NEXT:    retl
 ; UA2007-NEXT:    fnmadds %f1, %f3, %f5, %f0
-  %mul = fmul contract float %a, %b
-  %add = fadd contract float %mul, %c
+  %mul = fmul float %a, %b
+  %add = fadd float %mul, %c
   %neg = fneg float %add
   ret float %neg
 }
@@ -229,8 +229,8 @@ define double @combine_nmaddd(double %a, double %b, double %c) nounwind {
 ; UA2007:       ! %bb.0:
 ; UA2007-NEXT:    retl
 ; UA2007-NEXT:    fnmaddd %f0, %f2, %f4, %f0
-  %mul = fmul contract double %a, %b
-  %add = fadd contract double %mul, %c
+  %mul = fmul double %a, %b
+  %add = fadd double %mul, %c
   %neg = fneg double %add
   ret double %neg
 }
@@ -247,8 +247,8 @@ define float @combine_nmsubs(float %a, float %b, float %c) nounwind {
 ; UA2007:       ! %bb.0:
 ; UA2007-NEXT:    retl
 ; UA2007-NEXT:    fnmsubs %f1, %f3, %f5, %f0
-  %mul = fmul contract float %a, %b
-  %sub = fsub contract float %mul, %c
+  %mul = fmul float %a, %b
+  %sub = fsub float %mul, %c
   %neg = fneg float %sub
   ret float %neg
 }
@@ -265,8 +265,8 @@ define double @combine_nmsubd(double %a, double %b, double %c) nounwind {
 ; UA2007:       ! %bb.0:
 ; UA2007-NEXT:    retl
 ; UA2007-NEXT:    fnmsubd %f0, %f2, %f4, %f0
-  %mul = fmul contract double %a, %b
-  %sub = fsub contract double %mul, %c
+  %mul = fmul double %a, %b
+  %sub = fsub double %mul, %c
   %neg = fneg double %sub
   ret double %neg
 }

diff  --git a/llvm/test/CodeGen/Thumb2/mve-fmas.ll b/llvm/test/CodeGen/Thumb2/mve-fmas.ll
index ca688cd77d2d9..94921c78ad912 100644
--- a/llvm/test/CodeGen/Thumb2/mve-fmas.ll
+++ b/llvm/test/CodeGen/Thumb2/mve-fmas.ll
@@ -1,8 +1,14 @@
 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
-; RUN: llc -mtriple=thumbv8.1m.main-none-none-eabi, -mattr=+mve.fp -verify-machineinstrs %s -o - | FileCheck %s --check-prefix=CHECK-MVE-VMLA
+; RUN: llc -mtriple=thumbv8.1m.main-none-none-eabi, -mattr=+mve.fp -verify-machineinstrs %s -o - | FileCheck %s --check-prefix=CHECK-MVE-FP
+; RUN: llc -mtriple=thumbv8.1m.main-none-none-eabi, -mattr=+mve.fp -fp-contract=fast -verify-machineinstrs %s -o - | FileCheck %s --check-prefix=CHECK-MVE-VMLA
 ; RUN: llc -mtriple=thumbv8.1m.main-none-none-eabi -mattr=+mve,+fullfp16 -verify-machineinstrs %s -o - | FileCheck %s --check-prefix=CHECK-MVE
 
 define arm_aapcs_vfpcc <8 x half> @vfma16_v1(<8 x half> %src1, <8 x half> %src2, <8 x half> %src3) {
+; CHECK-MVE-FP-LABEL: vfma16_v1:
+; CHECK-MVE-FP:       @ %bb.0: @ %entry
+; CHECK-MVE-FP-NEXT:    vmul.f16 q1, q1, q2
+; CHECK-MVE-FP-NEXT:    vadd.f16 q0, q0, q1
+; CHECK-MVE-FP-NEXT:    bx lr
 ;
 ; CHECK-MVE-VMLA-LABEL: vfma16_v1:
 ; CHECK-MVE-VMLA:       @ %bb.0: @ %entry
@@ -14,35 +20,40 @@ define arm_aapcs_vfpcc <8 x half> @vfma16_v1(<8 x half> %src1, <8 x half> %src2,
 ; CHECK-MVE-NEXT:    vmovx.f16 s13, s0
 ; CHECK-MVE-NEXT:    vmovx.f16 s12, s8
 ; CHECK-MVE-NEXT:    vmovx.f16 s14, s4
-; CHECK-MVE-NEXT:    vfma.f16 s0, s4, s8
-; CHECK-MVE-NEXT:    vfma.f16 s13, s14, s12
+; CHECK-MVE-NEXT:    vmla.f16 s0, s4, s8
+; CHECK-MVE-NEXT:    vmla.f16 s13, s14, s12
 ; CHECK-MVE-NEXT:    vmovx.f16 s12, s1
 ; CHECK-MVE-NEXT:    vmovx.f16 s4, s9
 ; CHECK-MVE-NEXT:    vmovx.f16 s8, s5
-; CHECK-MVE-NEXT:    vfma.f16 s12, s8, s4
-; CHECK-MVE-NEXT:    vfma.f16 s1, s5, s9
+; CHECK-MVE-NEXT:    vmla.f16 s12, s8, s4
+; CHECK-MVE-NEXT:    vmla.f16 s1, s5, s9
 ; CHECK-MVE-NEXT:    vins.f16 s1, s12
 ; CHECK-MVE-NEXT:    vmovx.f16 s12, s2
 ; CHECK-MVE-NEXT:    vmovx.f16 s4, s10
 ; CHECK-MVE-NEXT:    vmovx.f16 s8, s6
-; CHECK-MVE-NEXT:    vfma.f16 s12, s8, s4
-; CHECK-MVE-NEXT:    vfma.f16 s2, s6, s10
+; CHECK-MVE-NEXT:    vmla.f16 s12, s8, s4
+; CHECK-MVE-NEXT:    vmla.f16 s2, s6, s10
 ; CHECK-MVE-NEXT:    vmovx.f16 s8, s3
 ; CHECK-MVE-NEXT:    vmovx.f16 s4, s11
 ; CHECK-MVE-NEXT:    vmovx.f16 s6, s7
-; CHECK-MVE-NEXT:    vfma.f16 s3, s7, s11
-; CHECK-MVE-NEXT:    vfma.f16 s8, s6, s4
+; CHECK-MVE-NEXT:    vmla.f16 s3, s7, s11
+; CHECK-MVE-NEXT:    vmla.f16 s8, s6, s4
 ; CHECK-MVE-NEXT:    vins.f16 s0, s13
 ; CHECK-MVE-NEXT:    vins.f16 s2, s12
 ; CHECK-MVE-NEXT:    vins.f16 s3, s8
 ; CHECK-MVE-NEXT:    bx lr
 entry:
-  %0 = fmul contract <8 x half> %src2, %src3
-  %1 = fadd contract <8 x half> %src1, %0
+  %0 = fmul <8 x half> %src2, %src3
+  %1 = fadd <8 x half> %src1, %0
   ret <8 x half> %1
 }
 
 define arm_aapcs_vfpcc <8 x half> @vfma16_v2(<8 x half> %src1, <8 x half> %src2, <8 x half> %src3) {
+; CHECK-MVE-FP-LABEL: vfma16_v2:
+; CHECK-MVE-FP:       @ %bb.0: @ %entry
+; CHECK-MVE-FP-NEXT:    vmul.f16 q1, q1, q2
+; CHECK-MVE-FP-NEXT:    vadd.f16 q0, q1, q0
+; CHECK-MVE-FP-NEXT:    bx lr
 ;
 ; CHECK-MVE-VMLA-LABEL: vfma16_v2:
 ; CHECK-MVE-VMLA:       @ %bb.0: @ %entry
@@ -54,35 +65,40 @@ define arm_aapcs_vfpcc <8 x half> @vfma16_v2(<8 x half> %src1, <8 x half> %src2,
 ; CHECK-MVE-NEXT:    vmovx.f16 s13, s0
 ; CHECK-MVE-NEXT:    vmovx.f16 s12, s8
 ; CHECK-MVE-NEXT:    vmovx.f16 s14, s4
-; CHECK-MVE-NEXT:    vfma.f16 s0, s4, s8
-; CHECK-MVE-NEXT:    vfma.f16 s13, s14, s12
+; CHECK-MVE-NEXT:    vmla.f16 s0, s4, s8
+; CHECK-MVE-NEXT:    vmla.f16 s13, s14, s12
 ; CHECK-MVE-NEXT:    vmovx.f16 s12, s1
 ; CHECK-MVE-NEXT:    vmovx.f16 s4, s9
 ; CHECK-MVE-NEXT:    vmovx.f16 s8, s5
-; CHECK-MVE-NEXT:    vfma.f16 s12, s8, s4
-; CHECK-MVE-NEXT:    vfma.f16 s1, s5, s9
+; CHECK-MVE-NEXT:    vmla.f16 s12, s8, s4
+; CHECK-MVE-NEXT:    vmla.f16 s1, s5, s9
 ; CHECK-MVE-NEXT:    vins.f16 s1, s12
 ; CHECK-MVE-NEXT:    vmovx.f16 s12, s2
 ; CHECK-MVE-NEXT:    vmovx.f16 s4, s10
 ; CHECK-MVE-NEXT:    vmovx.f16 s8, s6
-; CHECK-MVE-NEXT:    vfma.f16 s12, s8, s4
-; CHECK-MVE-NEXT:    vfma.f16 s2, s6, s10
+; CHECK-MVE-NEXT:    vmla.f16 s12, s8, s4
+; CHECK-MVE-NEXT:    vmla.f16 s2, s6, s10
 ; CHECK-MVE-NEXT:    vmovx.f16 s8, s3
 ; CHECK-MVE-NEXT:    vmovx.f16 s4, s11
 ; CHECK-MVE-NEXT:    vmovx.f16 s6, s7
-; CHECK-MVE-NEXT:    vfma.f16 s3, s7, s11
-; CHECK-MVE-NEXT:    vfma.f16 s8, s6, s4
+; CHECK-MVE-NEXT:    vmla.f16 s3, s7, s11
+; CHECK-MVE-NEXT:    vmla.f16 s8, s6, s4
 ; CHECK-MVE-NEXT:    vins.f16 s0, s13
 ; CHECK-MVE-NEXT:    vins.f16 s2, s12
 ; CHECK-MVE-NEXT:    vins.f16 s3, s8
 ; CHECK-MVE-NEXT:    bx lr
 entry:
-  %0 = fmul contract <8 x half> %src2, %src3
-  %1 = fadd contract <8 x half> %0, %src1
+  %0 = fmul <8 x half> %src2, %src3
+  %1 = fadd <8 x half> %0, %src1
   ret <8 x half> %1
 }
 
 define arm_aapcs_vfpcc <8 x half> @vfms16(<8 x half> %src1, <8 x half> %src2, <8 x half> %src3) {
+; CHECK-MVE-FP-LABEL: vfms16:
+; CHECK-MVE-FP:       @ %bb.0: @ %entry
+; CHECK-MVE-FP-NEXT:    vmul.f16 q1, q1, q2
+; CHECK-MVE-FP-NEXT:    vsub.f16 q0, q0, q1
+; CHECK-MVE-FP-NEXT:    bx lr
 ;
 ; CHECK-MVE-VMLA-LABEL: vfms16:
 ; CHECK-MVE-VMLA:       @ %bb.0: @ %entry
@@ -94,35 +110,42 @@ define arm_aapcs_vfpcc <8 x half> @vfms16(<8 x half> %src1, <8 x half> %src2, <8
 ; CHECK-MVE-NEXT:    vmovx.f16 s13, s0
 ; CHECK-MVE-NEXT:    vmovx.f16 s12, s8
 ; CHECK-MVE-NEXT:    vmovx.f16 s14, s4
-; CHECK-MVE-NEXT:    vfms.f16 s0, s4, s8
-; CHECK-MVE-NEXT:    vfms.f16 s13, s14, s12
+; CHECK-MVE-NEXT:    vmls.f16 s0, s4, s8
+; CHECK-MVE-NEXT:    vmls.f16 s13, s14, s12
 ; CHECK-MVE-NEXT:    vmovx.f16 s12, s1
 ; CHECK-MVE-NEXT:    vmovx.f16 s4, s9
 ; CHECK-MVE-NEXT:    vmovx.f16 s8, s5
-; CHECK-MVE-NEXT:    vfms.f16 s12, s8, s4
-; CHECK-MVE-NEXT:    vfms.f16 s1, s5, s9
+; CHECK-MVE-NEXT:    vmls.f16 s12, s8, s4
+; CHECK-MVE-NEXT:    vmls.f16 s1, s5, s9
 ; CHECK-MVE-NEXT:    vins.f16 s1, s12
 ; CHECK-MVE-NEXT:    vmovx.f16 s12, s2
 ; CHECK-MVE-NEXT:    vmovx.f16 s4, s10
 ; CHECK-MVE-NEXT:    vmovx.f16 s8, s6
-; CHECK-MVE-NEXT:    vfms.f16 s12, s8, s4
-; CHECK-MVE-NEXT:    vfms.f16 s2, s6, s10
+; CHECK-MVE-NEXT:    vmls.f16 s12, s8, s4
+; CHECK-MVE-NEXT:    vmls.f16 s2, s6, s10
 ; CHECK-MVE-NEXT:    vmovx.f16 s8, s3
 ; CHECK-MVE-NEXT:    vmovx.f16 s4, s11
 ; CHECK-MVE-NEXT:    vmovx.f16 s6, s7
-; CHECK-MVE-NEXT:    vfms.f16 s3, s7, s11
-; CHECK-MVE-NEXT:    vfms.f16 s8, s6, s4
+; CHECK-MVE-NEXT:    vmls.f16 s3, s7, s11
+; CHECK-MVE-NEXT:    vmls.f16 s8, s6, s4
 ; CHECK-MVE-NEXT:    vins.f16 s0, s13
 ; CHECK-MVE-NEXT:    vins.f16 s2, s12
 ; CHECK-MVE-NEXT:    vins.f16 s3, s8
 ; CHECK-MVE-NEXT:    bx lr
 entry:
-  %0 = fmul contract <8 x half> %src2, %src3
-  %1 = fsub contract <8 x half> %src1, %0
+  %0 = fmul <8 x half> %src2, %src3
+  %1 = fsub <8 x half> %src1, %0
   ret <8 x half> %1
 }
 
 define arm_aapcs_vfpcc <8 x half> @vfmar16(<8 x half> %src1, <8 x half> %src2, float %src3o) {
+; CHECK-MVE-FP-LABEL: vfmar16:
+; CHECK-MVE-FP:       @ %bb.0: @ %entry
+; CHECK-MVE-FP-NEXT:    vcvtb.f16.f32 s8, s8
+; CHECK-MVE-FP-NEXT:    vmov.f16 r0, s8
+; CHECK-MVE-FP-NEXT:    vmul.f16 q1, q1, r0
+; CHECK-MVE-FP-NEXT:    vadd.f16 q0, q0, q1
+; CHECK-MVE-FP-NEXT:    bx lr
 ;
 ; CHECK-MVE-VMLA-LABEL: vfmar16:
 ; CHECK-MVE-VMLA:       @ %bb.0: @ %entry
@@ -136,21 +159,21 @@ define arm_aapcs_vfpcc <8 x half> @vfmar16(<8 x half> %src1, <8 x half> %src2, f
 ; CHECK-MVE-NEXT:    vcvtb.f16.f32 s8, s8
 ; CHECK-MVE-NEXT:    vmovx.f16 s12, s0
 ; CHECK-MVE-NEXT:    vmovx.f16 s10, s4
-; CHECK-MVE-NEXT:    vfma.f16 s0, s4, s8
-; CHECK-MVE-NEXT:    vfma.f16 s12, s10, s8
+; CHECK-MVE-NEXT:    vmla.f16 s0, s4, s8
+; CHECK-MVE-NEXT:    vmla.f16 s12, s10, s8
 ; CHECK-MVE-NEXT:    vmovx.f16 s10, s1
 ; CHECK-MVE-NEXT:    vmovx.f16 s4, s5
-; CHECK-MVE-NEXT:    vfma.f16 s1, s5, s8
-; CHECK-MVE-NEXT:    vfma.f16 s10, s4, s8
+; CHECK-MVE-NEXT:    vmla.f16 s1, s5, s8
+; CHECK-MVE-NEXT:    vmla.f16 s10, s4, s8
 ; CHECK-MVE-NEXT:    vmovx.f16 s4, s6
 ; CHECK-MVE-NEXT:    vins.f16 s1, s10
 ; CHECK-MVE-NEXT:    vmovx.f16 s10, s2
-; CHECK-MVE-NEXT:    vfma.f16 s10, s4, s8
-; CHECK-MVE-NEXT:    vfma.f16 s2, s6, s8
+; CHECK-MVE-NEXT:    vmla.f16 s10, s4, s8
+; CHECK-MVE-NEXT:    vmla.f16 s2, s6, s8
 ; CHECK-MVE-NEXT:    vmovx.f16 s6, s3
 ; CHECK-MVE-NEXT:    vmovx.f16 s4, s7
-; CHECK-MVE-NEXT:    vfma.f16 s6, s4, s8
-; CHECK-MVE-NEXT:    vfma.f16 s3, s7, s8
+; CHECK-MVE-NEXT:    vmla.f16 s6, s4, s8
+; CHECK-MVE-NEXT:    vmla.f16 s3, s7, s8
 ; CHECK-MVE-NEXT:    vins.f16 s0, s12
 ; CHECK-MVE-NEXT:    vins.f16 s2, s10
 ; CHECK-MVE-NEXT:    vins.f16 s3, s6
@@ -159,12 +182,19 @@ entry:
   %src3 = fptrunc float %src3o to half
   %i = insertelement <8 x half> undef, half %src3, i32 0
   %sp = shufflevector <8 x half> %i, <8 x half> undef, <8 x i32> zeroinitializer
-  %0 = fmul contract <8 x half> %src2, %sp
-  %1 = fadd contract <8 x half> %src1, %0
+  %0 = fmul <8 x half> %src2, %sp
+  %1 = fadd <8 x half> %src1, %0
   ret <8 x half> %1
 }
 
 define arm_aapcs_vfpcc <8 x half> @vfma16(<8 x half> %src1, <8 x half> %src2, float %src3o) {
+; CHECK-MVE-FP-LABEL: vfma16:
+; CHECK-MVE-FP:       @ %bb.0: @ %entry
+; CHECK-MVE-FP-NEXT:    vcvtb.f16.f32 s8, s8
+; CHECK-MVE-FP-NEXT:    vmul.f16 q0, q0, q1
+; CHECK-MVE-FP-NEXT:    vmov.f16 r0, s8
+; CHECK-MVE-FP-NEXT:    vadd.f16 q0, q0, r0
+; CHECK-MVE-FP-NEXT:    bx lr
 ;
 ; CHECK-MVE-VMLA-LABEL: vfma16:
 ; CHECK-MVE-VMLA:       @ %bb.0: @ %entry
@@ -180,41 +210,46 @@ define arm_aapcs_vfpcc <8 x half> @vfma16(<8 x half> %src1, <8 x half> %src2, fl
 ; CHECK-MVE-NEXT:    vmovx.f16 s0, s4
 ; CHECK-MVE-NEXT:    vmovx.f16 s2, s12
 ; CHECK-MVE-NEXT:    vmov.f32 s8, s3
-; CHECK-MVE-NEXT:    vfma.f16 s8, s2, s0
+; CHECK-MVE-NEXT:    vmla.f16 s8, s2, s0
 ; CHECK-MVE-NEXT:    vmov.f32 s0, s3
-; CHECK-MVE-NEXT:    vfma.f16 s0, s12, s4
+; CHECK-MVE-NEXT:    vmla.f16 s0, s12, s4
 ; CHECK-MVE-NEXT:    vmov.f32 s1, s3
 ; CHECK-MVE-NEXT:    vins.f16 s0, s8
 ; CHECK-MVE-NEXT:    vmovx.f16 s2, s5
 ; CHECK-MVE-NEXT:    vmovx.f16 s4, s13
 ; CHECK-MVE-NEXT:    vmov.f32 s8, s3
-; CHECK-MVE-NEXT:    vfma.f16 s8, s4, s2
-; CHECK-MVE-NEXT:    vfma.f16 s1, s13, s5
+; CHECK-MVE-NEXT:    vmla.f16 s8, s4, s2
+; CHECK-MVE-NEXT:    vmla.f16 s1, s13, s5
 ; CHECK-MVE-NEXT:    vins.f16 s1, s8
 ; CHECK-MVE-NEXT:    vmovx.f16 s2, s6
 ; CHECK-MVE-NEXT:    vmovx.f16 s4, s14
 ; CHECK-MVE-NEXT:    vmov.f32 s8, s3
-; CHECK-MVE-NEXT:    vfma.f16 s8, s4, s2
+; CHECK-MVE-NEXT:    vmla.f16 s8, s4, s2
 ; CHECK-MVE-NEXT:    vmov.f32 s2, s3
-; CHECK-MVE-NEXT:    vfma.f16 s2, s14, s6
+; CHECK-MVE-NEXT:    vmla.f16 s2, s14, s6
 ; CHECK-MVE-NEXT:    vmovx.f16 s4, s7
 ; CHECK-MVE-NEXT:    vins.f16 s2, s8
 ; CHECK-MVE-NEXT:    vmov.f32 s8, s3
 ; CHECK-MVE-NEXT:    vmovx.f16 s6, s15
-; CHECK-MVE-NEXT:    vfma.f16 s3, s15, s7
-; CHECK-MVE-NEXT:    vfma.f16 s8, s6, s4
+; CHECK-MVE-NEXT:    vmla.f16 s3, s15, s7
+; CHECK-MVE-NEXT:    vmla.f16 s8, s6, s4
 ; CHECK-MVE-NEXT:    vins.f16 s3, s8
 ; CHECK-MVE-NEXT:    bx lr
 entry:
   %src3 = fptrunc float %src3o to half
   %i = insertelement <8 x half> undef, half %src3, i32 0
   %sp = shufflevector <8 x half> %i, <8 x half> undef, <8 x i32> zeroinitializer
-  %0 = fmul contract <8 x half> %src1, %src2
-  %1 = fadd contract <8 x half> %sp, %0
+  %0 = fmul <8 x half> %src1, %src2
+  %1 = fadd <8 x half> %sp, %0
   ret <8 x half> %1
 }
 
 define arm_aapcs_vfpcc <4 x float> @vfma32_v1(<4 x float> %src1, <4 x float> %src2, <4 x float> %src3) {
+; CHECK-MVE-FP-LABEL: vfma32_v1:
+; CHECK-MVE-FP:       @ %bb.0: @ %entry
+; CHECK-MVE-FP-NEXT:    vmul.f32 q1, q1, q2
+; CHECK-MVE-FP-NEXT:    vadd.f32 q0, q0, q1
+; CHECK-MVE-FP-NEXT:    bx lr
 ;
 ; CHECK-MVE-VMLA-LABEL: vfma32_v1:
 ; CHECK-MVE-VMLA:       @ %bb.0: @ %entry
@@ -223,18 +258,23 @@ define arm_aapcs_vfpcc <4 x float> @vfma32_v1(<4 x float> %src1, <4 x float> %sr
 ;
 ; CHECK-MVE-LABEL: vfma32_v1:
 ; CHECK-MVE:       @ %bb.0: @ %entry
-; CHECK-MVE-NEXT:    vfma.f32 s3, s7, s11
-; CHECK-MVE-NEXT:    vfma.f32 s2, s6, s10
-; CHECK-MVE-NEXT:    vfma.f32 s1, s5, s9
-; CHECK-MVE-NEXT:    vfma.f32 s0, s4, s8
+; CHECK-MVE-NEXT:    vmla.f32 s3, s7, s11
+; CHECK-MVE-NEXT:    vmla.f32 s2, s6, s10
+; CHECK-MVE-NEXT:    vmla.f32 s1, s5, s9
+; CHECK-MVE-NEXT:    vmla.f32 s0, s4, s8
 ; CHECK-MVE-NEXT:    bx lr
 entry:
-  %0 = fmul contract <4 x float> %src2, %src3
-  %1 = fadd contract <4 x float> %src1, %0
+  %0 = fmul <4 x float> %src2, %src3
+  %1 = fadd <4 x float> %src1, %0
   ret <4 x float> %1
 }
 
 define arm_aapcs_vfpcc <4 x float> @vfma32_v2(<4 x float> %src1, <4 x float> %src2, <4 x float> %src3) {
+; CHECK-MVE-FP-LABEL: vfma32_v2:
+; CHECK-MVE-FP:       @ %bb.0: @ %entry
+; CHECK-MVE-FP-NEXT:    vmul.f32 q1, q1, q2
+; CHECK-MVE-FP-NEXT:    vadd.f32 q0, q1, q0
+; CHECK-MVE-FP-NEXT:    bx lr
 ;
 ; CHECK-MVE-VMLA-LABEL: vfma32_v2:
 ; CHECK-MVE-VMLA:       @ %bb.0: @ %entry
@@ -243,18 +283,23 @@ define arm_aapcs_vfpcc <4 x float> @vfma32_v2(<4 x float> %src1, <4 x float> %sr
 ;
 ; CHECK-MVE-LABEL: vfma32_v2:
 ; CHECK-MVE:       @ %bb.0: @ %entry
-; CHECK-MVE-NEXT:    vfma.f32 s3, s7, s11
-; CHECK-MVE-NEXT:    vfma.f32 s2, s6, s10
-; CHECK-MVE-NEXT:    vfma.f32 s1, s5, s9
-; CHECK-MVE-NEXT:    vfma.f32 s0, s4, s8
+; CHECK-MVE-NEXT:    vmla.f32 s3, s7, s11
+; CHECK-MVE-NEXT:    vmla.f32 s2, s6, s10
+; CHECK-MVE-NEXT:    vmla.f32 s1, s5, s9
+; CHECK-MVE-NEXT:    vmla.f32 s0, s4, s8
 ; CHECK-MVE-NEXT:    bx lr
 entry:
-  %0 = fmul contract <4 x float> %src2, %src3
-  %1 = fadd contract <4 x float> %0, %src1
+  %0 = fmul <4 x float> %src2, %src3
+  %1 = fadd <4 x float> %0, %src1
   ret <4 x float> %1
 }
 
 define arm_aapcs_vfpcc <4 x float> @vfms32(<4 x float> %src1, <4 x float> %src2, <4 x float> %src3) {
+; CHECK-MVE-FP-LABEL: vfms32:
+; CHECK-MVE-FP:       @ %bb.0: @ %entry
+; CHECK-MVE-FP-NEXT:    vmul.f32 q1, q1, q2
+; CHECK-MVE-FP-NEXT:    vsub.f32 q0, q0, q1
+; CHECK-MVE-FP-NEXT:    bx lr
 ;
 ; CHECK-MVE-VMLA-LABEL: vfms32:
 ; CHECK-MVE-VMLA:       @ %bb.0: @ %entry
@@ -263,18 +308,24 @@ define arm_aapcs_vfpcc <4 x float> @vfms32(<4 x float> %src1, <4 x float> %src2,
 ;
 ; CHECK-MVE-LABEL: vfms32:
 ; CHECK-MVE:       @ %bb.0: @ %entry
-; CHECK-MVE-NEXT:    vfms.f32 s3, s7, s11
-; CHECK-MVE-NEXT:    vfms.f32 s2, s6, s10
-; CHECK-MVE-NEXT:    vfms.f32 s1, s5, s9
-; CHECK-MVE-NEXT:    vfms.f32 s0, s4, s8
+; CHECK-MVE-NEXT:    vmls.f32 s3, s7, s11
+; CHECK-MVE-NEXT:    vmls.f32 s2, s6, s10
+; CHECK-MVE-NEXT:    vmls.f32 s1, s5, s9
+; CHECK-MVE-NEXT:    vmls.f32 s0, s4, s8
 ; CHECK-MVE-NEXT:    bx lr
 entry:
-  %0 = fmul contract <4 x float> %src2, %src3
-  %1 = fsub contract <4 x float> %src1, %0
+  %0 = fmul <4 x float> %src2, %src3
+  %1 = fsub <4 x float> %src1, %0
   ret <4 x float> %1
 }
 
 define arm_aapcs_vfpcc <4 x float> @vfmar32(<4 x float> %src1, <4 x float> %src2, float %src3) {
+; CHECK-MVE-FP-LABEL: vfmar32:
+; CHECK-MVE-FP:       @ %bb.0: @ %entry
+; CHECK-MVE-FP-NEXT:    vmov r0, s8
+; CHECK-MVE-FP-NEXT:    vmul.f32 q1, q1, r0
+; CHECK-MVE-FP-NEXT:    vadd.f32 q0, q0, q1
+; CHECK-MVE-FP-NEXT:    bx lr
 ;
 ; CHECK-MVE-VMLA-LABEL: vfmar32:
 ; CHECK-MVE-VMLA:       @ %bb.0: @ %entry
@@ -284,20 +335,26 @@ define arm_aapcs_vfpcc <4 x float> @vfmar32(<4 x float> %src1, <4 x float> %src2
 ;
 ; CHECK-MVE-LABEL: vfmar32:
 ; CHECK-MVE:       @ %bb.0: @ %entry
-; CHECK-MVE-NEXT:    vfma.f32 s3, s7, s8
-; CHECK-MVE-NEXT:    vfma.f32 s2, s6, s8
-; CHECK-MVE-NEXT:    vfma.f32 s1, s5, s8
-; CHECK-MVE-NEXT:    vfma.f32 s0, s4, s8
+; CHECK-MVE-NEXT:    vmla.f32 s3, s7, s8
+; CHECK-MVE-NEXT:    vmla.f32 s2, s6, s8
+; CHECK-MVE-NEXT:    vmla.f32 s1, s5, s8
+; CHECK-MVE-NEXT:    vmla.f32 s0, s4, s8
 ; CHECK-MVE-NEXT:    bx lr
 entry:
   %i = insertelement <4 x float> undef, float %src3, i32 0
   %sp = shufflevector <4 x float> %i, <4 x float> undef, <4 x i32> zeroinitializer
-  %0 = fmul contract <4 x float> %src2, %sp
-  %1 = fadd contract <4 x float> %src1, %0
+  %0 = fmul <4 x float> %src2, %sp
+  %1 = fadd <4 x float> %src1, %0
   ret <4 x float> %1
 }
 
 define arm_aapcs_vfpcc <4 x float> @vfmas32(<4 x float> %src1, <4 x float> %src2, float %src3) {
+; CHECK-MVE-FP-LABEL: vfmas32:
+; CHECK-MVE-FP:       @ %bb.0: @ %entry
+; CHECK-MVE-FP-NEXT:    vmov r0, s8
+; CHECK-MVE-FP-NEXT:    vmul.f32 q0, q0, q1
+; CHECK-MVE-FP-NEXT:    vadd.f32 q0, q0, r0
+; CHECK-MVE-FP-NEXT:    bx lr
 ;
 ; CHECK-MVE-VMLA-LABEL: vfmas32:
 ; CHECK-MVE-VMLA:       @ %bb.0: @ %entry
@@ -310,17 +367,17 @@ define arm_aapcs_vfpcc <4 x float> @vfmas32(<4 x float> %src1, <4 x float> %src2
 ; CHECK-MVE-NEXT:    vmov.f32 s11, s8
 ; CHECK-MVE-NEXT:    vmov.f32 s10, s8
 ; CHECK-MVE-NEXT:    vmov.f32 s9, s8
-; CHECK-MVE-NEXT:    vfma.f32 s8, s0, s4
-; CHECK-MVE-NEXT:    vfma.f32 s11, s3, s7
-; CHECK-MVE-NEXT:    vfma.f32 s10, s2, s6
-; CHECK-MVE-NEXT:    vfma.f32 s9, s1, s5
+; CHECK-MVE-NEXT:    vmla.f32 s8, s0, s4
+; CHECK-MVE-NEXT:    vmla.f32 s11, s3, s7
+; CHECK-MVE-NEXT:    vmla.f32 s10, s2, s6
+; CHECK-MVE-NEXT:    vmla.f32 s9, s1, s5
 ; CHECK-MVE-NEXT:    vmov q0, q2
 ; CHECK-MVE-NEXT:    bx lr
 entry:
   %i = insertelement <4 x float> undef, float %src3, i32 0
   %sp = shufflevector <4 x float> %i, <4 x float> undef, <4 x i32> zeroinitializer
-  %0 = fmul contract <4 x float> %src1, %src2
-  %1 = fadd contract <4 x float> %sp, %0
+  %0 = fmul <4 x float> %src1, %src2
+  %1 = fadd <4 x float> %sp, %0
   ret <4 x float> %1
 }
 
@@ -328,6 +385,12 @@ entry:
 ; Predicated version of the same tests
 
 define arm_aapcs_vfpcc <8 x half> @vfma16_v1_pred(<8 x half> %src1, <8 x half> %src2, <8 x half> %src3) {
+; CHECK-MVE-FP-LABEL: vfma16_v1_pred:
+; CHECK-MVE-FP:       @ %bb.0: @ %entry
+; CHECK-MVE-FP-NEXT:    vmul.f16 q2, q1, q2
+; CHECK-MVE-FP-NEXT:    vpt.f16 lt, q1, zr
+; CHECK-MVE-FP-NEXT:    vaddt.f16 q0, q0, q2
+; CHECK-MVE-FP-NEXT:    bx lr
 ;
 ; CHECK-MVE-VMLA-LABEL: vfma16_v1_pred:
 ; CHECK-MVE-VMLA:       @ %bb.0: @ %entry
@@ -343,10 +406,10 @@ define arm_aapcs_vfpcc <8 x half> @vfma16_v1_pred(<8 x half> %src1, <8 x half> %
 ; CHECK-MVE-NEXT:    vmovx.f16 s12, s8
 ; CHECK-MVE-NEXT:    vmrs APSR_nzcv, fpscr
 ; CHECK-MVE-NEXT:    vmov.f32 s15, s13
-; CHECK-MVE-NEXT:    vfma.f16 s15, s14, s12
+; CHECK-MVE-NEXT:    vmla.f16 s15, s14, s12
 ; CHECK-MVE-NEXT:    vcmp.f16 s4, #0
 ; CHECK-MVE-NEXT:    vmov.f32 s14, s0
-; CHECK-MVE-NEXT:    vfma.f16 s14, s4, s8
+; CHECK-MVE-NEXT:    vmla.f16 s14, s4, s8
 ; CHECK-MVE-NEXT:    vmovx.f16 s8, s5
 ; CHECK-MVE-NEXT:    vmovx.f16 s4, s9
 ; CHECK-MVE-NEXT:    cset r0, mi
@@ -362,9 +425,9 @@ define arm_aapcs_vfpcc <8 x half> @vfma16_v1_pred(<8 x half> %src1, <8 x half> %
 ; CHECK-MVE-NEXT:    vmovx.f16 s12, s1
 ; CHECK-MVE-NEXT:    vmov.f32 s14, s12
 ; CHECK-MVE-NEXT:    vcmp.f16 s5, #0
-; CHECK-MVE-NEXT:    vfma.f16 s14, s8, s4
+; CHECK-MVE-NEXT:    vmla.f16 s14, s8, s4
 ; CHECK-MVE-NEXT:    vmov.f32 s8, s1
-; CHECK-MVE-NEXT:    vfma.f16 s8, s5, s9
+; CHECK-MVE-NEXT:    vmla.f16 s8, s5, s9
 ; CHECK-MVE-NEXT:    cset r0, mi
 ; CHECK-MVE-NEXT:    cmp r0, #0
 ; CHECK-MVE-NEXT:    vseleq.f16 s4, s12, s14
@@ -379,10 +442,10 @@ define arm_aapcs_vfpcc <8 x half> @vfma16_v1_pred(<8 x half> %src1, <8 x half> %
 ; CHECK-MVE-NEXT:    vins.f16 s1, s4
 ; CHECK-MVE-NEXT:    vmrs APSR_nzcv, fpscr
 ; CHECK-MVE-NEXT:    vmovx.f16 s4, s10
-; CHECK-MVE-NEXT:    vfma.f16 s14, s8, s4
+; CHECK-MVE-NEXT:    vmla.f16 s14, s8, s4
 ; CHECK-MVE-NEXT:    vcmp.f16 s6, #0
 ; CHECK-MVE-NEXT:    vmov.f32 s8, s2
-; CHECK-MVE-NEXT:    vfma.f16 s8, s6, s10
+; CHECK-MVE-NEXT:    vmla.f16 s8, s6, s10
 ; CHECK-MVE-NEXT:    vmovx.f16 s6, s7
 ; CHECK-MVE-NEXT:    cset r0, mi
 ; CHECK-MVE-NEXT:    cmp r0, #0
@@ -397,10 +460,10 @@ define arm_aapcs_vfpcc <8 x half> @vfma16_v1_pred(<8 x half> %src1, <8 x half> %
 ; CHECK-MVE-NEXT:    vins.f16 s2, s4
 ; CHECK-MVE-NEXT:    vmovx.f16 s4, s11
 ; CHECK-MVE-NEXT:    vmov.f32 s10, s8
-; CHECK-MVE-NEXT:    vfma.f16 s10, s6, s4
+; CHECK-MVE-NEXT:    vmla.f16 s10, s6, s4
 ; CHECK-MVE-NEXT:    vcmp.f16 s7, #0
 ; CHECK-MVE-NEXT:    vmov.f32 s6, s3
-; CHECK-MVE-NEXT:    vfma.f16 s6, s7, s11
+; CHECK-MVE-NEXT:    vmla.f16 s6, s7, s11
 ; CHECK-MVE-NEXT:    cset r0, mi
 ; CHECK-MVE-NEXT:    cmp r0, #0
 ; CHECK-MVE-NEXT:    vseleq.f16 s4, s8, s10
@@ -411,14 +474,20 @@ define arm_aapcs_vfpcc <8 x half> @vfma16_v1_pred(<8 x half> %src1, <8 x half> %
 ; CHECK-MVE-NEXT:    vins.f16 s3, s4
 ; CHECK-MVE-NEXT:    bx lr
 entry:
-  %0 = fmul contract <8 x half> %src2, %src3
-  %1 = fadd contract <8 x half> %src1, %0
+  %0 = fmul <8 x half> %src2, %src3
+  %1 = fadd <8 x half> %src1, %0
   %c = fcmp olt <8 x half> %src2, zeroinitializer
   %s = select <8 x i1> %c, <8 x half> %1, <8 x half> %src1
   ret <8 x half> %s
 }
 
 define arm_aapcs_vfpcc <8 x half> @vfma16_v2_pred(<8 x half> %src1, <8 x half> %src2, <8 x half> %src3) {
+; CHECK-MVE-FP-LABEL: vfma16_v2_pred:
+; CHECK-MVE-FP:       @ %bb.0: @ %entry
+; CHECK-MVE-FP-NEXT:    vmul.f16 q2, q1, q2
+; CHECK-MVE-FP-NEXT:    vpt.f16 lt, q1, zr
+; CHECK-MVE-FP-NEXT:    vaddt.f16 q0, q2, q0
+; CHECK-MVE-FP-NEXT:    bx lr
 ;
 ; CHECK-MVE-VMLA-LABEL: vfma16_v2_pred:
 ; CHECK-MVE-VMLA:       @ %bb.0: @ %entry
@@ -434,10 +503,10 @@ define arm_aapcs_vfpcc <8 x half> @vfma16_v2_pred(<8 x half> %src1, <8 x half> %
 ; CHECK-MVE-NEXT:    vmovx.f16 s12, s8
 ; CHECK-MVE-NEXT:    vmrs APSR_nzcv, fpscr
 ; CHECK-MVE-NEXT:    vmov.f32 s15, s13
-; CHECK-MVE-NEXT:    vfma.f16 s15, s14, s12
+; CHECK-MVE-NEXT:    vmla.f16 s15, s14, s12
 ; CHECK-MVE-NEXT:    vcmp.f16 s4, #0
 ; CHECK-MVE-NEXT:    vmov.f32 s14, s0
-; CHECK-MVE-NEXT:    vfma.f16 s14, s4, s8
+; CHECK-MVE-NEXT:    vmla.f16 s14, s4, s8
 ; CHECK-MVE-NEXT:    vmovx.f16 s8, s5
 ; CHECK-MVE-NEXT:    vmovx.f16 s4, s9
 ; CHECK-MVE-NEXT:    cset r0, mi
@@ -453,9 +522,9 @@ define arm_aapcs_vfpcc <8 x half> @vfma16_v2_pred(<8 x half> %src1, <8 x half> %
 ; CHECK-MVE-NEXT:    vmovx.f16 s12, s1
 ; CHECK-MVE-NEXT:    vmov.f32 s14, s12
 ; CHECK-MVE-NEXT:    vcmp.f16 s5, #0
-; CHECK-MVE-NEXT:    vfma.f16 s14, s8, s4
+; CHECK-MVE-NEXT:    vmla.f16 s14, s8, s4
 ; CHECK-MVE-NEXT:    vmov.f32 s8, s1
-; CHECK-MVE-NEXT:    vfma.f16 s8, s5, s9
+; CHECK-MVE-NEXT:    vmla.f16 s8, s5, s9
 ; CHECK-MVE-NEXT:    cset r0, mi
 ; CHECK-MVE-NEXT:    cmp r0, #0
 ; CHECK-MVE-NEXT:    vseleq.f16 s4, s12, s14
@@ -470,10 +539,10 @@ define arm_aapcs_vfpcc <8 x half> @vfma16_v2_pred(<8 x half> %src1, <8 x half> %
 ; CHECK-MVE-NEXT:    vins.f16 s1, s4
 ; CHECK-MVE-NEXT:    vmrs APSR_nzcv, fpscr
 ; CHECK-MVE-NEXT:    vmovx.f16 s4, s10
-; CHECK-MVE-NEXT:    vfma.f16 s14, s8, s4
+; CHECK-MVE-NEXT:    vmla.f16 s14, s8, s4
 ; CHECK-MVE-NEXT:    vcmp.f16 s6, #0
 ; CHECK-MVE-NEXT:    vmov.f32 s8, s2
-; CHECK-MVE-NEXT:    vfma.f16 s8, s6, s10
+; CHECK-MVE-NEXT:    vmla.f16 s8, s6, s10
 ; CHECK-MVE-NEXT:    vmovx.f16 s6, s7
 ; CHECK-MVE-NEXT:    cset r0, mi
 ; CHECK-MVE-NEXT:    cmp r0, #0
@@ -488,10 +557,10 @@ define arm_aapcs_vfpcc <8 x half> @vfma16_v2_pred(<8 x half> %src1, <8 x half> %
 ; CHECK-MVE-NEXT:    vins.f16 s2, s4
 ; CHECK-MVE-NEXT:    vmovx.f16 s4, s11
 ; CHECK-MVE-NEXT:    vmov.f32 s10, s8
-; CHECK-MVE-NEXT:    vfma.f16 s10, s6, s4
+; CHECK-MVE-NEXT:    vmla.f16 s10, s6, s4
 ; CHECK-MVE-NEXT:    vcmp.f16 s7, #0
 ; CHECK-MVE-NEXT:    vmov.f32 s6, s3
-; CHECK-MVE-NEXT:    vfma.f16 s6, s7, s11
+; CHECK-MVE-NEXT:    vmla.f16 s6, s7, s11
 ; CHECK-MVE-NEXT:    cset r0, mi
 ; CHECK-MVE-NEXT:    cmp r0, #0
 ; CHECK-MVE-NEXT:    vseleq.f16 s4, s8, s10
@@ -502,14 +571,20 @@ define arm_aapcs_vfpcc <8 x half> @vfma16_v2_pred(<8 x half> %src1, <8 x half> %
 ; CHECK-MVE-NEXT:    vins.f16 s3, s4
 ; CHECK-MVE-NEXT:    bx lr
 entry:
-  %0 = fmul contract <8 x half> %src2, %src3
-  %1 = fadd contract <8 x half> %0, %src1
+  %0 = fmul <8 x half> %src2, %src3
+  %1 = fadd <8 x half> %0, %src1
   %c = fcmp olt <8 x half> %src2, zeroinitializer
   %s = select <8 x i1> %c, <8 x half> %1, <8 x half> %src1
   ret <8 x half> %s
 }
 
 define arm_aapcs_vfpcc <8 x half> @vfms16_pred(<8 x half> %src1, <8 x half> %src2, <8 x half> %src3) {
+; CHECK-MVE-FP-LABEL: vfms16_pred:
+; CHECK-MVE-FP:       @ %bb.0: @ %entry
+; CHECK-MVE-FP-NEXT:    vmul.f16 q2, q1, q2
+; CHECK-MVE-FP-NEXT:    vpt.f16 lt, q1, zr
+; CHECK-MVE-FP-NEXT:    vsubt.f16 q0, q0, q2
+; CHECK-MVE-FP-NEXT:    bx lr
 ;
 ; CHECK-MVE-VMLA-LABEL: vfms16_pred:
 ; CHECK-MVE-VMLA:       @ %bb.0: @ %entry
@@ -525,10 +600,10 @@ define arm_aapcs_vfpcc <8 x half> @vfms16_pred(<8 x half> %src1, <8 x half> %src
 ; CHECK-MVE-NEXT:    vmovx.f16 s12, s8
 ; CHECK-MVE-NEXT:    vmrs APSR_nzcv, fpscr
 ; CHECK-MVE-NEXT:    vmov.f32 s15, s13
-; CHECK-MVE-NEXT:    vfms.f16 s15, s14, s12
+; CHECK-MVE-NEXT:    vmls.f16 s15, s14, s12
 ; CHECK-MVE-NEXT:    vcmp.f16 s4, #0
 ; CHECK-MVE-NEXT:    vmov.f32 s14, s0
-; CHECK-MVE-NEXT:    vfms.f16 s14, s4, s8
+; CHECK-MVE-NEXT:    vmls.f16 s14, s4, s8
 ; CHECK-MVE-NEXT:    vmovx.f16 s8, s5
 ; CHECK-MVE-NEXT:    vmovx.f16 s4, s9
 ; CHECK-MVE-NEXT:    cset r0, mi
@@ -544,9 +619,9 @@ define arm_aapcs_vfpcc <8 x half> @vfms16_pred(<8 x half> %src1, <8 x half> %src
 ; CHECK-MVE-NEXT:    vmovx.f16 s12, s1
 ; CHECK-MVE-NEXT:    vmov.f32 s14, s12
 ; CHECK-MVE-NEXT:    vcmp.f16 s5, #0
-; CHECK-MVE-NEXT:    vfms.f16 s14, s8, s4
+; CHECK-MVE-NEXT:    vmls.f16 s14, s8, s4
 ; CHECK-MVE-NEXT:    vmov.f32 s8, s1
-; CHECK-MVE-NEXT:    vfms.f16 s8, s5, s9
+; CHECK-MVE-NEXT:    vmls.f16 s8, s5, s9
 ; CHECK-MVE-NEXT:    cset r0, mi
 ; CHECK-MVE-NEXT:    cmp r0, #0
 ; CHECK-MVE-NEXT:    vseleq.f16 s4, s12, s14
@@ -561,10 +636,10 @@ define arm_aapcs_vfpcc <8 x half> @vfms16_pred(<8 x half> %src1, <8 x half> %src
 ; CHECK-MVE-NEXT:    vins.f16 s1, s4
 ; CHECK-MVE-NEXT:    vmrs APSR_nzcv, fpscr
 ; CHECK-MVE-NEXT:    vmovx.f16 s4, s10
-; CHECK-MVE-NEXT:    vfms.f16 s14, s8, s4
+; CHECK-MVE-NEXT:    vmls.f16 s14, s8, s4
 ; CHECK-MVE-NEXT:    vcmp.f16 s6, #0
 ; CHECK-MVE-NEXT:    vmov.f32 s8, s2
-; CHECK-MVE-NEXT:    vfms.f16 s8, s6, s10
+; CHECK-MVE-NEXT:    vmls.f16 s8, s6, s10
 ; CHECK-MVE-NEXT:    vmovx.f16 s6, s7
 ; CHECK-MVE-NEXT:    cset r0, mi
 ; CHECK-MVE-NEXT:    cmp r0, #0
@@ -579,10 +654,10 @@ define arm_aapcs_vfpcc <8 x half> @vfms16_pred(<8 x half> %src1, <8 x half> %src
 ; CHECK-MVE-NEXT:    vins.f16 s2, s4
 ; CHECK-MVE-NEXT:    vmovx.f16 s4, s11
 ; CHECK-MVE-NEXT:    vmov.f32 s10, s8
-; CHECK-MVE-NEXT:    vfms.f16 s10, s6, s4
+; CHECK-MVE-NEXT:    vmls.f16 s10, s6, s4
 ; CHECK-MVE-NEXT:    vcmp.f16 s7, #0
 ; CHECK-MVE-NEXT:    vmov.f32 s6, s3
-; CHECK-MVE-NEXT:    vfms.f16 s6, s7, s11
+; CHECK-MVE-NEXT:    vmls.f16 s6, s7, s11
 ; CHECK-MVE-NEXT:    cset r0, mi
 ; CHECK-MVE-NEXT:    cmp r0, #0
 ; CHECK-MVE-NEXT:    vseleq.f16 s4, s8, s10
@@ -593,14 +668,23 @@ define arm_aapcs_vfpcc <8 x half> @vfms16_pred(<8 x half> %src1, <8 x half> %src
 ; CHECK-MVE-NEXT:    vins.f16 s3, s4
 ; CHECK-MVE-NEXT:    bx lr
 entry:
-  %0 = fmul contract <8 x half> %src2, %src3
-  %1 = fsub contract <8 x half> %src1, %0
+  %0 = fmul <8 x half> %src2, %src3
+  %1 = fsub <8 x half> %src1, %0
   %c = fcmp olt <8 x half> %src2, zeroinitializer
   %s = select <8 x i1> %c, <8 x half> %1, <8 x half> %src1
   ret <8 x half> %s
 }
 
 define arm_aapcs_vfpcc <8 x half> @vfmar16_pred(<8 x half> %src1, <8 x half> %src2, float %src3o) {
+; CHECK-MVE-FP-LABEL: vfmar16_pred:
+; CHECK-MVE-FP:       @ %bb.0: @ %entry
+; CHECK-MVE-FP-NEXT:    vcvtb.f16.f32 s8, s8
+; CHECK-MVE-FP-NEXT:    vcmp.f16 lt, q1, zr
+; CHECK-MVE-FP-NEXT:    vmov.f16 r0, s8
+; CHECK-MVE-FP-NEXT:    vmul.f16 q1, q1, r0
+; CHECK-MVE-FP-NEXT:    vpst
+; CHECK-MVE-FP-NEXT:    vaddt.f16 q0, q0, q1
+; CHECK-MVE-FP-NEXT:    bx lr
 ;
 ; CHECK-MVE-VMLA-LABEL: vfmar16_pred:
 ; CHECK-MVE-VMLA:       @ %bb.0: @ %entry
@@ -618,14 +702,14 @@ define arm_aapcs_vfpcc <8 x half> @vfmar16_pred(<8 x half> %src1, <8 x half> %sr
 ; CHECK-MVE-NEXT:    vcvtb.f16.f32 s8, s8
 ; CHECK-MVE-NEXT:    vmrs APSR_nzcv, fpscr
 ; CHECK-MVE-NEXT:    vmov.f32 s14, s12
-; CHECK-MVE-NEXT:    vfma.f16 s14, s10, s8
+; CHECK-MVE-NEXT:    vmla.f16 s14, s10, s8
 ; CHECK-MVE-NEXT:    vcmp.f16 s4, #0
 ; CHECK-MVE-NEXT:    cset r0, mi
 ; CHECK-MVE-NEXT:    cmp r0, #0
 ; CHECK-MVE-NEXT:    vseleq.f16 s10, s12, s14
 ; CHECK-MVE-NEXT:    vmrs APSR_nzcv, fpscr
 ; CHECK-MVE-NEXT:    vmov.f32 s12, s0
-; CHECK-MVE-NEXT:    vfma.f16 s12, s4, s8
+; CHECK-MVE-NEXT:    vmla.f16 s12, s4, s8
 ; CHECK-MVE-NEXT:    vmovx.f16 s4, s5
 ; CHECK-MVE-NEXT:    vcmp.f16 s4, #0
 ; CHECK-MVE-NEXT:    cset r0, mi
@@ -636,13 +720,13 @@ define arm_aapcs_vfpcc <8 x half> @vfmar16_pred(<8 x half> %src1, <8 x half> %sr
 ; CHECK-MVE-NEXT:    vmovx.f16 s10, s1
 ; CHECK-MVE-NEXT:    vmov.f32 s12, s10
 ; CHECK-MVE-NEXT:    vcmp.f16 s5, #0
-; CHECK-MVE-NEXT:    vfma.f16 s12, s4, s8
+; CHECK-MVE-NEXT:    vmla.f16 s12, s4, s8
 ; CHECK-MVE-NEXT:    cset r0, mi
 ; CHECK-MVE-NEXT:    cmp r0, #0
 ; CHECK-MVE-NEXT:    vseleq.f16 s4, s10, s12
 ; CHECK-MVE-NEXT:    vmrs APSR_nzcv, fpscr
 ; CHECK-MVE-NEXT:    vmov.f32 s10, s1
-; CHECK-MVE-NEXT:    vfma.f16 s10, s5, s8
+; CHECK-MVE-NEXT:    vmla.f16 s10, s5, s8
 ; CHECK-MVE-NEXT:    cset r0, mi
 ; CHECK-MVE-NEXT:    cmp r0, #0
 ; CHECK-MVE-NEXT:    vseleq.f16 s1, s1, s10
@@ -652,14 +736,14 @@ define arm_aapcs_vfpcc <8 x half> @vfmar16_pred(<8 x half> %src1, <8 x half> %sr
 ; CHECK-MVE-NEXT:    vcmp.f16 s4, #0
 ; CHECK-MVE-NEXT:    vmov.f32 s12, s10
 ; CHECK-MVE-NEXT:    vmrs APSR_nzcv, fpscr
-; CHECK-MVE-NEXT:    vfma.f16 s12, s4, s8
+; CHECK-MVE-NEXT:    vmla.f16 s12, s4, s8
 ; CHECK-MVE-NEXT:    vcmp.f16 s6, #0
 ; CHECK-MVE-NEXT:    cset r0, mi
 ; CHECK-MVE-NEXT:    cmp r0, #0
 ; CHECK-MVE-NEXT:    vseleq.f16 s4, s10, s12
 ; CHECK-MVE-NEXT:    vmrs APSR_nzcv, fpscr
 ; CHECK-MVE-NEXT:    vmov.f32 s10, s2
-; CHECK-MVE-NEXT:    vfma.f16 s10, s6, s8
+; CHECK-MVE-NEXT:    vmla.f16 s10, s6, s8
 ; CHECK-MVE-NEXT:    vmovx.f16 s6, s3
 ; CHECK-MVE-NEXT:    cset r0, mi
 ; CHECK-MVE-NEXT:    cmp r0, #0
@@ -668,7 +752,7 @@ define arm_aapcs_vfpcc <8 x half> @vfmar16_pred(<8 x half> %src1, <8 x half> %sr
 ; CHECK-MVE-NEXT:    vins.f16 s2, s4
 ; CHECK-MVE-NEXT:    vmovx.f16 s4, s7
 ; CHECK-MVE-NEXT:    vcmp.f16 s4, #0
-; CHECK-MVE-NEXT:    vfma.f16 s10, s4, s8
+; CHECK-MVE-NEXT:    vmla.f16 s10, s4, s8
 ; CHECK-MVE-NEXT:    vmrs APSR_nzcv, fpscr
 ; CHECK-MVE-NEXT:    vcmp.f16 s7, #0
 ; CHECK-MVE-NEXT:    cset r0, mi
@@ -676,7 +760,7 @@ define arm_aapcs_vfpcc <8 x half> @vfmar16_pred(<8 x half> %src1, <8 x half> %sr
 ; CHECK-MVE-NEXT:    vseleq.f16 s4, s6, s10
 ; CHECK-MVE-NEXT:    vmrs APSR_nzcv, fpscr
 ; CHECK-MVE-NEXT:    vmov.f32 s6, s3
-; CHECK-MVE-NEXT:    vfma.f16 s6, s7, s8
+; CHECK-MVE-NEXT:    vmla.f16 s6, s7, s8
 ; CHECK-MVE-NEXT:    cset r0, mi
 ; CHECK-MVE-NEXT:    cmp r0, #0
 ; CHECK-MVE-NEXT:    vseleq.f16 s3, s3, s6
@@ -686,14 +770,22 @@ entry:
   %src3 = fptrunc float %src3o to half
   %i = insertelement <8 x half> undef, half %src3, i32 0
   %sp = shufflevector <8 x half> %i, <8 x half> undef, <8 x i32> zeroinitializer
-  %0 = fmul contract <8 x half> %src2, %sp
-  %1 = fadd contract <8 x half> %src1, %0
+  %0 = fmul <8 x half> %src2, %sp
+  %1 = fadd <8 x half> %src1, %0
   %c = fcmp olt <8 x half> %src2, zeroinitializer
   %s = select <8 x i1> %c, <8 x half> %1, <8 x half> %src1
   ret <8 x half> %s
 }
 
 define arm_aapcs_vfpcc <8 x half> @vfma16_pred(<8 x half> %src1, <8 x half> %src2, float %src3o) {
+; CHECK-MVE-FP-LABEL: vfma16_pred:
+; CHECK-MVE-FP:       @ %bb.0: @ %entry
+; CHECK-MVE-FP-NEXT:    vcvtb.f16.f32 s8, s8
+; CHECK-MVE-FP-NEXT:    vmov.f16 r0, s8
+; CHECK-MVE-FP-NEXT:    vmul.f16 q2, q0, q1
+; CHECK-MVE-FP-NEXT:    vpt.f16 lt, q1, zr
+; CHECK-MVE-FP-NEXT:    vaddt.f16 q0, q2, r0
+; CHECK-MVE-FP-NEXT:    bx lr
 ;
 ; CHECK-MVE-VMLA-LABEL: vfma16_pred:
 ; CHECK-MVE-VMLA:       @ %bb.0: @ %entry
@@ -711,14 +803,14 @@ define arm_aapcs_vfpcc <8 x half> @vfma16_pred(<8 x half> %src1, <8 x half> %src
 ; CHECK-MVE-NEXT:    vmovx.f16 s12, s0
 ; CHECK-MVE-NEXT:    vmrs APSR_nzcv, fpscr
 ; CHECK-MVE-NEXT:    vmov.f32 s14, s8
-; CHECK-MVE-NEXT:    vfma.f16 s14, s12, s10
+; CHECK-MVE-NEXT:    vmla.f16 s14, s12, s10
 ; CHECK-MVE-NEXT:    vcmp.f16 s4, #0
 ; CHECK-MVE-NEXT:    cset r0, mi
 ; CHECK-MVE-NEXT:    cmp r0, #0
 ; CHECK-MVE-NEXT:    vseleq.f16 s10, s12, s14
 ; CHECK-MVE-NEXT:    vmrs APSR_nzcv, fpscr
 ; CHECK-MVE-NEXT:    vmov.f32 s12, s8
-; CHECK-MVE-NEXT:    vfma.f16 s12, s0, s4
+; CHECK-MVE-NEXT:    vmla.f16 s12, s0, s4
 ; CHECK-MVE-NEXT:    vmovx.f16 s4, s5
 ; CHECK-MVE-NEXT:    vcmp.f16 s4, #0
 ; CHECK-MVE-NEXT:    cset r0, mi
@@ -729,13 +821,13 @@ define arm_aapcs_vfpcc <8 x half> @vfma16_pred(<8 x half> %src1, <8 x half> %src
 ; CHECK-MVE-NEXT:    vmovx.f16 s10, s1
 ; CHECK-MVE-NEXT:    vmov.f32 s12, s8
 ; CHECK-MVE-NEXT:    vcmp.f16 s5, #0
-; CHECK-MVE-NEXT:    vfma.f16 s12, s10, s4
+; CHECK-MVE-NEXT:    vmla.f16 s12, s10, s4
 ; CHECK-MVE-NEXT:    cset r0, mi
 ; CHECK-MVE-NEXT:    cmp r0, #0
 ; CHECK-MVE-NEXT:    vseleq.f16 s4, s10, s12
 ; CHECK-MVE-NEXT:    vmrs APSR_nzcv, fpscr
 ; CHECK-MVE-NEXT:    vmov.f32 s10, s8
-; CHECK-MVE-NEXT:    vfma.f16 s10, s1, s5
+; CHECK-MVE-NEXT:    vmla.f16 s10, s1, s5
 ; CHECK-MVE-NEXT:    vmov.f32 s12, s8
 ; CHECK-MVE-NEXT:    cset r0, mi
 ; CHECK-MVE-NEXT:    cmp r0, #0
@@ -744,7 +836,7 @@ define arm_aapcs_vfpcc <8 x half> @vfma16_pred(<8 x half> %src1, <8 x half> %src
 ; CHECK-MVE-NEXT:    vins.f16 s1, s4
 ; CHECK-MVE-NEXT:    vmovx.f16 s4, s6
 ; CHECK-MVE-NEXT:    vcmp.f16 s4, #0
-; CHECK-MVE-NEXT:    vfma.f16 s12, s10, s4
+; CHECK-MVE-NEXT:    vmla.f16 s12, s10, s4
 ; CHECK-MVE-NEXT:    vmrs APSR_nzcv, fpscr
 ; CHECK-MVE-NEXT:    vcmp.f16 s6, #0
 ; CHECK-MVE-NEXT:    cset r0, mi
@@ -752,7 +844,7 @@ define arm_aapcs_vfpcc <8 x half> @vfma16_pred(<8 x half> %src1, <8 x half> %src
 ; CHECK-MVE-NEXT:    vseleq.f16 s4, s10, s12
 ; CHECK-MVE-NEXT:    vmrs APSR_nzcv, fpscr
 ; CHECK-MVE-NEXT:    vmov.f32 s10, s8
-; CHECK-MVE-NEXT:    vfma.f16 s10, s2, s6
+; CHECK-MVE-NEXT:    vmla.f16 s10, s2, s6
 ; CHECK-MVE-NEXT:    vmovx.f16 s6, s3
 ; CHECK-MVE-NEXT:    cset r0, mi
 ; CHECK-MVE-NEXT:    cmp r0, #0
@@ -761,10 +853,10 @@ define arm_aapcs_vfpcc <8 x half> @vfma16_pred(<8 x half> %src1, <8 x half> %src
 ; CHECK-MVE-NEXT:    vins.f16 s2, s4
 ; CHECK-MVE-NEXT:    vmovx.f16 s4, s7
 ; CHECK-MVE-NEXT:    vcmp.f16 s4, #0
-; CHECK-MVE-NEXT:    vfma.f16 s10, s6, s4
+; CHECK-MVE-NEXT:    vmla.f16 s10, s6, s4
 ; CHECK-MVE-NEXT:    vmrs APSR_nzcv, fpscr
 ; CHECK-MVE-NEXT:    vcmp.f16 s7, #0
-; CHECK-MVE-NEXT:    vfma.f16 s8, s3, s7
+; CHECK-MVE-NEXT:    vmla.f16 s8, s3, s7
 ; CHECK-MVE-NEXT:    cset r0, mi
 ; CHECK-MVE-NEXT:    cmp r0, #0
 ; CHECK-MVE-NEXT:    vseleq.f16 s4, s6, s10
@@ -778,14 +870,20 @@ entry:
   %src3 = fptrunc float %src3o to half
   %i = insertelement <8 x half> undef, half %src3, i32 0
   %sp = shufflevector <8 x half> %i, <8 x half> undef, <8 x i32> zeroinitializer
-  %0 = fmul contract <8 x half> %src1, %src2
-  %1 = fadd contract <8 x half> %sp, %0
+  %0 = fmul <8 x half> %src1, %src2
+  %1 = fadd <8 x half> %sp, %0
   %c = fcmp olt <8 x half> %src2, zeroinitializer
   %s = select <8 x i1> %c, <8 x half> %1, <8 x half> %src1
   ret <8 x half> %s
 }
 
 define arm_aapcs_vfpcc <4 x float> @vfma32_v1_pred(<4 x float> %src1, <4 x float> %src2, <4 x float> %src3) {
+; CHECK-MVE-FP-LABEL: vfma32_v1_pred:
+; CHECK-MVE-FP:       @ %bb.0: @ %entry
+; CHECK-MVE-FP-NEXT:    vmul.f32 q2, q1, q2
+; CHECK-MVE-FP-NEXT:    vpt.f32 lt, q1, zr
+; CHECK-MVE-FP-NEXT:    vaddt.f32 q0, q0, q2
+; CHECK-MVE-FP-NEXT:    bx lr
 ;
 ; CHECK-MVE-VMLA-LABEL: vfma32_v1_pred:
 ; CHECK-MVE-VMLA:       @ %bb.0: @ %entry
@@ -800,15 +898,15 @@ define arm_aapcs_vfpcc <4 x float> @vfma32_v1_pred(<4 x float> %src1, <4 x float
 ; CHECK-MVE-NEXT:    vcmp.f32 s7, #0
 ; CHECK-MVE-NEXT:    vmov.f32 s12, s2
 ; CHECK-MVE-NEXT:    vmov.f32 s14, s3
-; CHECK-MVE-NEXT:    vfma.f32 s12, s6, s10
+; CHECK-MVE-NEXT:    vmla.f32 s12, s6, s10
 ; CHECK-MVE-NEXT:    vmov.f32 s10, s1
-; CHECK-MVE-NEXT:    vfma.f32 s14, s7, s11
-; CHECK-MVE-NEXT:    vfma.f32 s10, s5, s9
+; CHECK-MVE-NEXT:    vmla.f32 s14, s7, s11
+; CHECK-MVE-NEXT:    vmla.f32 s10, s5, s9
 ; CHECK-MVE-NEXT:    vmov.f32 s9, s0
 ; CHECK-MVE-NEXT:    cset r0, mi
 ; CHECK-MVE-NEXT:    vmrs APSR_nzcv, fpscr
 ; CHECK-MVE-NEXT:    vcmp.f32 s5, #0
-; CHECK-MVE-NEXT:    vfma.f32 s9, s4, s8
+; CHECK-MVE-NEXT:    vmla.f32 s9, s4, s8
 ; CHECK-MVE-NEXT:    cset r1, mi
 ; CHECK-MVE-NEXT:    vmrs APSR_nzcv, fpscr
 ; CHECK-MVE-NEXT:    vcmp.f32 s6, #0
@@ -825,14 +923,20 @@ define arm_aapcs_vfpcc <4 x float> @vfma32_v1_pred(<4 x float> %src1, <4 x float
 ; CHECK-MVE-NEXT:    vseleq.f32 s0, s0, s9
 ; CHECK-MVE-NEXT:    bx lr
 entry:
-  %0 = fmul contract <4 x float> %src2, %src3
-  %1 = fadd contract <4 x float> %src1, %0
+  %0 = fmul <4 x float> %src2, %src3
+  %1 = fadd <4 x float> %src1, %0
   %c = fcmp olt <4 x float> %src2, zeroinitializer
   %s = select <4 x i1> %c, <4 x float> %1, <4 x float> %src1
   ret <4 x float> %s
 }
 
 define arm_aapcs_vfpcc <4 x float> @vfma32_v2_pred(<4 x float> %src1, <4 x float> %src2, <4 x float> %src3) {
+; CHECK-MVE-FP-LABEL: vfma32_v2_pred:
+; CHECK-MVE-FP:       @ %bb.0: @ %entry
+; CHECK-MVE-FP-NEXT:    vmul.f32 q2, q1, q2
+; CHECK-MVE-FP-NEXT:    vpt.f32 lt, q1, zr
+; CHECK-MVE-FP-NEXT:    vaddt.f32 q0, q2, q0
+; CHECK-MVE-FP-NEXT:    bx lr
 ;
 ; CHECK-MVE-VMLA-LABEL: vfma32_v2_pred:
 ; CHECK-MVE-VMLA:       @ %bb.0: @ %entry
@@ -847,15 +951,15 @@ define arm_aapcs_vfpcc <4 x float> @vfma32_v2_pred(<4 x float> %src1, <4 x float
 ; CHECK-MVE-NEXT:    vcmp.f32 s7, #0
 ; CHECK-MVE-NEXT:    vmov.f32 s12, s2
 ; CHECK-MVE-NEXT:    vmov.f32 s14, s3
-; CHECK-MVE-NEXT:    vfma.f32 s12, s6, s10
+; CHECK-MVE-NEXT:    vmla.f32 s12, s6, s10
 ; CHECK-MVE-NEXT:    vmov.f32 s10, s1
-; CHECK-MVE-NEXT:    vfma.f32 s14, s7, s11
-; CHECK-MVE-NEXT:    vfma.f32 s10, s5, s9
+; CHECK-MVE-NEXT:    vmla.f32 s14, s7, s11
+; CHECK-MVE-NEXT:    vmla.f32 s10, s5, s9
 ; CHECK-MVE-NEXT:    vmov.f32 s9, s0
 ; CHECK-MVE-NEXT:    cset r0, mi
 ; CHECK-MVE-NEXT:    vmrs APSR_nzcv, fpscr
 ; CHECK-MVE-NEXT:    vcmp.f32 s5, #0
-; CHECK-MVE-NEXT:    vfma.f32 s9, s4, s8
+; CHECK-MVE-NEXT:    vmla.f32 s9, s4, s8
 ; CHECK-MVE-NEXT:    cset r1, mi
 ; CHECK-MVE-NEXT:    vmrs APSR_nzcv, fpscr
 ; CHECK-MVE-NEXT:    vcmp.f32 s6, #0
@@ -872,14 +976,20 @@ define arm_aapcs_vfpcc <4 x float> @vfma32_v2_pred(<4 x float> %src1, <4 x float
 ; CHECK-MVE-NEXT:    vseleq.f32 s0, s0, s9
 ; CHECK-MVE-NEXT:    bx lr
 entry:
-  %0 = fmul contract <4 x float> %src2, %src3
-  %1 = fadd contract <4 x float> %0, %src1
+  %0 = fmul <4 x float> %src2, %src3
+  %1 = fadd <4 x float> %0, %src1
   %c = fcmp olt <4 x float> %src2, zeroinitializer
   %s = select <4 x i1> %c, <4 x float> %1, <4 x float> %src1
   ret <4 x float> %s
 }
 
 define arm_aapcs_vfpcc <4 x float> @vfms32_pred(<4 x float> %src1, <4 x float> %src2, <4 x float> %src3) {
+; CHECK-MVE-FP-LABEL: vfms32_pred:
+; CHECK-MVE-FP:       @ %bb.0: @ %entry
+; CHECK-MVE-FP-NEXT:    vmul.f32 q2, q1, q2
+; CHECK-MVE-FP-NEXT:    vpt.f32 lt, q1, zr
+; CHECK-MVE-FP-NEXT:    vsubt.f32 q0, q0, q2
+; CHECK-MVE-FP-NEXT:    bx lr
 ;
 ; CHECK-MVE-VMLA-LABEL: vfms32_pred:
 ; CHECK-MVE-VMLA:       @ %bb.0: @ %entry
@@ -894,15 +1004,15 @@ define arm_aapcs_vfpcc <4 x float> @vfms32_pred(<4 x float> %src1, <4 x float> %
 ; CHECK-MVE-NEXT:    vcmp.f32 s7, #0
 ; CHECK-MVE-NEXT:    vmov.f32 s12, s2
 ; CHECK-MVE-NEXT:    vmov.f32 s14, s3
-; CHECK-MVE-NEXT:    vfms.f32 s12, s6, s10
+; CHECK-MVE-NEXT:    vmls.f32 s12, s6, s10
 ; CHECK-MVE-NEXT:    vmov.f32 s10, s1
-; CHECK-MVE-NEXT:    vfms.f32 s14, s7, s11
-; CHECK-MVE-NEXT:    vfms.f32 s10, s5, s9
+; CHECK-MVE-NEXT:    vmls.f32 s14, s7, s11
+; CHECK-MVE-NEXT:    vmls.f32 s10, s5, s9
 ; CHECK-MVE-NEXT:    vmov.f32 s9, s0
 ; CHECK-MVE-NEXT:    cset r0, mi
 ; CHECK-MVE-NEXT:    vmrs APSR_nzcv, fpscr
 ; CHECK-MVE-NEXT:    vcmp.f32 s5, #0
-; CHECK-MVE-NEXT:    vfms.f32 s9, s4, s8
+; CHECK-MVE-NEXT:    vmls.f32 s9, s4, s8
 ; CHECK-MVE-NEXT:    cset r1, mi
 ; CHECK-MVE-NEXT:    vmrs APSR_nzcv, fpscr
 ; CHECK-MVE-NEXT:    vcmp.f32 s6, #0
@@ -919,14 +1029,22 @@ define arm_aapcs_vfpcc <4 x float> @vfms32_pred(<4 x float> %src1, <4 x float> %
 ; CHECK-MVE-NEXT:    vseleq.f32 s0, s0, s9
 ; CHECK-MVE-NEXT:    bx lr
 entry:
-  %0 = fmul contract <4 x float> %src2, %src3
-  %1 = fsub contract <4 x float> %src1, %0
+  %0 = fmul <4 x float> %src2, %src3
+  %1 = fsub <4 x float> %src1, %0
   %c = fcmp olt <4 x float> %src2, zeroinitializer
   %s = select <4 x i1> %c, <4 x float> %1, <4 x float> %src1
   ret <4 x float> %s
 }
 
 define arm_aapcs_vfpcc <4 x float> @vfmar32_pred(<4 x float> %src1, <4 x float> %src2, float %src3) {
+; CHECK-MVE-FP-LABEL: vfmar32_pred:
+; CHECK-MVE-FP:       @ %bb.0: @ %entry
+; CHECK-MVE-FP-NEXT:    vmov r0, s8
+; CHECK-MVE-FP-NEXT:    vcmp.f32 lt, q1, zr
+; CHECK-MVE-FP-NEXT:    vmul.f32 q1, q1, r0
+; CHECK-MVE-FP-NEXT:    vpst
+; CHECK-MVE-FP-NEXT:    vaddt.f32 q0, q0, q1
+; CHECK-MVE-FP-NEXT:    bx lr
 ;
 ; CHECK-MVE-VMLA-LABEL: vfmar32_pred:
 ; CHECK-MVE-VMLA:       @ %bb.0: @ %entry
@@ -944,10 +1062,10 @@ define arm_aapcs_vfpcc <4 x float> @vfmar32_pred(<4 x float> %src1, <4 x float>
 ; CHECK-MVE-NEXT:    vmov.f32 s12, s1
 ; CHECK-MVE-NEXT:    vmov.f32 s14, s3
 ; CHECK-MVE-NEXT:    vmov.f32 s9, s0
-; CHECK-MVE-NEXT:    vfma.f32 s10, s6, s8
-; CHECK-MVE-NEXT:    vfma.f32 s12, s5, s8
-; CHECK-MVE-NEXT:    vfma.f32 s14, s7, s8
-; CHECK-MVE-NEXT:    vfma.f32 s9, s4, s8
+; CHECK-MVE-NEXT:    vmla.f32 s10, s6, s8
+; CHECK-MVE-NEXT:    vmla.f32 s12, s5, s8
+; CHECK-MVE-NEXT:    vmla.f32 s14, s7, s8
+; CHECK-MVE-NEXT:    vmla.f32 s9, s4, s8
 ; CHECK-MVE-NEXT:    cset r0, mi
 ; CHECK-MVE-NEXT:    vmrs APSR_nzcv, fpscr
 ; CHECK-MVE-NEXT:    vcmp.f32 s5, #0
@@ -969,14 +1087,21 @@ define arm_aapcs_vfpcc <4 x float> @vfmar32_pred(<4 x float> %src1, <4 x float>
 entry:
   %i = insertelement <4 x float> undef, float %src3, i32 0
   %sp = shufflevector <4 x float> %i, <4 x float> undef, <4 x i32> zeroinitializer
-  %0 = fmul contract <4 x float> %src2, %sp
-  %1 = fadd contract <4 x float> %src1, %0
+  %0 = fmul <4 x float> %src2, %sp
+  %1 = fadd <4 x float> %src1, %0
   %c = fcmp olt <4 x float> %src2, zeroinitializer
   %s = select <4 x i1> %c, <4 x float> %1, <4 x float> %src1
   ret <4 x float> %s
 }
 
 define arm_aapcs_vfpcc <4 x float> @vfmas32_pred(<4 x float> %src1, <4 x float> %src2, float %src3) {
+; CHECK-MVE-FP-LABEL: vfmas32_pred:
+; CHECK-MVE-FP:       @ %bb.0: @ %entry
+; CHECK-MVE-FP-NEXT:    vmov r0, s8
+; CHECK-MVE-FP-NEXT:    vmul.f32 q2, q0, q1
+; CHECK-MVE-FP-NEXT:    vpt.f32 lt, q1, zr
+; CHECK-MVE-FP-NEXT:    vaddt.f32 q0, q2, r0
+; CHECK-MVE-FP-NEXT:    bx lr
 ;
 ; CHECK-MVE-VMLA-LABEL: vfmas32_pred:
 ; CHECK-MVE-VMLA:       @ %bb.0: @ %entry
@@ -993,10 +1118,10 @@ define arm_aapcs_vfpcc <4 x float> @vfmas32_pred(<4 x float> %src1, <4 x float>
 ; CHECK-MVE-NEXT:    vmov.f32 s10, s8
 ; CHECK-MVE-NEXT:    vmov.f32 s12, s8
 ; CHECK-MVE-NEXT:    vmov.f32 s14, s8
-; CHECK-MVE-NEXT:    vfma.f32 s8, s0, s4
-; CHECK-MVE-NEXT:    vfma.f32 s10, s2, s6
-; CHECK-MVE-NEXT:    vfma.f32 s12, s1, s5
-; CHECK-MVE-NEXT:    vfma.f32 s14, s3, s7
+; CHECK-MVE-NEXT:    vmla.f32 s8, s0, s4
+; CHECK-MVE-NEXT:    vmla.f32 s10, s2, s6
+; CHECK-MVE-NEXT:    vmla.f32 s12, s1, s5
+; CHECK-MVE-NEXT:    vmla.f32 s14, s3, s7
 ; CHECK-MVE-NEXT:    cset r0, mi
 ; CHECK-MVE-NEXT:    vmrs APSR_nzcv, fpscr
 ; CHECK-MVE-NEXT:    vcmp.f32 s5, #0
@@ -1018,8 +1143,8 @@ define arm_aapcs_vfpcc <4 x float> @vfmas32_pred(<4 x float> %src1, <4 x float>
 entry:
   %i = insertelement <4 x float> undef, float %src3, i32 0
   %sp = shufflevector <4 x float> %i, <4 x float> undef, <4 x i32> zeroinitializer
-  %0 = fmul contract <4 x float> %src1, %src2
-  %1 = fadd contract <4 x float> %sp, %0
+  %0 = fmul <4 x float> %src1, %src2
+  %1 = fadd <4 x float> %sp, %0
   %c = fcmp olt <4 x float> %src2, zeroinitializer
   %s = select <4 x i1> %c, <4 x float> %1, <4 x float> %src1
   ret <4 x float> %s


        


More information about the llvm-branch-commits mailing list