summaryrefslogtreecommitdiffstats
path: root/llvm/lib
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2007-05-03 00:32:00 +0000
committerChris Lattner <sabre@nondot.org>2007-05-03 00:32:00 +0000
commit1c1082133c4c6459935df55f03e4a67d46c3f0fe (patch)
treef42b930c460e6725ce4aa90f70203353448edd20 /llvm/lib
parent483dc2bf089337d21248eb16eccd2ac613b4637b (diff)
downloadbcm5719-llvm-1c1082133c4c6459935df55f03e4a67d46c3f0fe.tar.gz
bcm5719-llvm-1c1082133c4c6459935df55f03e4a67d46c3f0fe.zip
match a reassociated form of fnmul. This implements CodeGen/ARM/fnmul.ll
llvm-svn: 36660
Diffstat (limited to 'llvm/lib')
-rw-r--r--llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp1
-rw-r--r--llvm/lib/Target/ARM/ARMInstrVFP.td10
2 files changed, 9 insertions, 2 deletions
diff --git a/llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp b/llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp
index 8108ee4993b..79d58692e9f 100644
--- a/llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp
+++ b/llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp
@@ -27,6 +27,7 @@
#include "llvm/CodeGen/SelectionDAGISel.h"
#include "llvm/CodeGen/SSARegMap.h"
#include "llvm/Target/TargetLowering.h"
+#include "llvm/Target/TargetOptions.h"
#include "llvm/Support/Debug.h"
using namespace llvm;
diff --git a/llvm/lib/Target/ARM/ARMInstrVFP.td b/llvm/lib/Target/ARM/ARMInstrVFP.td
index cac8e4465c9..671e1a48c18 100644
--- a/llvm/lib/Target/ARM/ARMInstrVFP.td
+++ b/llvm/lib/Target/ARM/ARMInstrVFP.td
@@ -139,8 +139,7 @@ def FMULD : ADI<(ops DPR:$dst, DPR:$a, DPR:$b),
def FMULS : ASI<(ops SPR:$dst, SPR:$a, SPR:$b),
"fmuls $dst, $a, $b",
[(set SPR:$dst, (fmul SPR:$a, SPR:$b))]>;
-
-
+
def FNMULD : ADI<(ops DPR:$dst, DPR:$a, DPR:$b),
"fnmuld $dst, $a, $b",
[(set DPR:$dst, (fneg (fmul DPR:$a, DPR:$b)))]>;
@@ -149,6 +148,13 @@ def FNMULS : ASI<(ops SPR:$dst, SPR:$a, SPR:$b),
"fnmuls $dst, $a, $b",
[(set SPR:$dst, (fneg (fmul SPR:$a, SPR:$b)))]>;
+// Match reassociated forms only if not sign dependent rounding.
+def : Pat<(fmul (fneg DPR:$a), DPR:$b),
+ (FNMULD DPR:$a, DPR:$b)>, Requires<[NoHonorSignDependentRounding]>;
+def : Pat<(fmul (fneg SPR:$a), SPR:$b),
+ (FNMULS SPR:$a, SPR:$b)>, Requires<[NoHonorSignDependentRounding]>;
+
+
def FSUBD : ADI<(ops DPR:$dst, DPR:$a, DPR:$b),
"fsubd $dst, $a, $b",
[(set DPR:$dst, (fsub DPR:$a, DPR:$b))]>;
OpenPOWER on IntegriCloud