[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