Softfloat support for FDIV. Patch by
authorDuncan Sands <baldrick@free.fr>
Fri, 18 Jul 2008 21:18:48 +0000 (21:18 +0000)
committerDuncan Sands <baldrick@free.fr>
Fri, 18 Jul 2008 21:18:48 +0000 (21:18 +0000)
Richard Pennington.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@53773 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/SelectionDAG/LegalizeFloatTypes.cpp
lib/CodeGen/SelectionDAG/LegalizeTypes.h
test/CodeGen/ARM/2008-07-17-Fdiv.ll [new file with mode: 0644]

index 888cec074dc0e8db929b50c93f7f9b7d1581484b..e50ff1c9912366e2aaf2592e30f384d09af57aca 100644 (file)
@@ -61,6 +61,7 @@ void DAGTypeLegalizer::SoftenFloatResult(SDNode *N, unsigned ResNo) {
       break;
     case ISD::FADD:        R = SoftenFloatRes_FADD(N); break;
     case ISD::FCOPYSIGN:   R = SoftenFloatRes_FCOPYSIGN(N); break;
+    case ISD::FDIV:        R = SoftenFloatRes_FDIV(N); break;
     case ISD::FMUL:        R = SoftenFloatRes_FMUL(N); break;
     case ISD::FP_EXTEND:   R = SoftenFloatRes_FP_EXTEND(N); break;
     case ISD::FP_ROUND:    R = SoftenFloatRes_FP_ROUND(N); break;
@@ -146,6 +147,18 @@ SDOperand DAGTypeLegalizer::SoftenFloatRes_FCOPYSIGN(SDNode *N) {
   return DAG.getNode(ISD::OR, LVT, LHS, SignBit);
 }
 
+SDOperand DAGTypeLegalizer::SoftenFloatRes_FDIV(SDNode *N) {
+  MVT NVT = TLI.getTypeToTransformTo(N->getValueType(0));
+  SDOperand Ops[2] = { GetSoftenedFloat(N->getOperand(0)),
+                       GetSoftenedFloat(N->getOperand(1)) };
+  return MakeLibCall(GetFPLibCall(N->getValueType(0),
+                                  RTLIB::DIV_F32,
+                                  RTLIB::DIV_F64,
+                                  RTLIB::DIV_F80,
+                                  RTLIB::DIV_PPCF128),
+                     NVT, Ops, 2, false);
+}
+
 SDOperand DAGTypeLegalizer::SoftenFloatRes_FMUL(SDNode *N) {
   MVT NVT = TLI.getTypeToTransformTo(N->getValueType(0));
   SDOperand Ops[2] = { GetSoftenedFloat(N->getOperand(0)),
index f6a5c6995a453720e828e5cfd3c041465ce79193..81224592a9bccfa449ca4ac7006331ef23bc080b 100644 (file)
@@ -336,6 +336,7 @@ private:
   SDOperand SoftenFloatRes_ConstantFP(ConstantFPSDNode *N);
   SDOperand SoftenFloatRes_FADD(SDNode *N);
   SDOperand SoftenFloatRes_FCOPYSIGN(SDNode *N);
+  SDOperand SoftenFloatRes_FDIV(SDNode *N);
   SDOperand SoftenFloatRes_FMUL(SDNode *N);
   SDOperand SoftenFloatRes_FP_EXTEND(SDNode *N);
   SDOperand SoftenFloatRes_FP_ROUND(SDNode *N);
diff --git a/test/CodeGen/ARM/2008-07-17-Fdiv.ll b/test/CodeGen/ARM/2008-07-17-Fdiv.ll
new file mode 100644 (file)
index 0000000..aa75970
--- /dev/null
@@ -0,0 +1,6 @@
+; RUN: llvm-as < %s | llc -march=arm
+
+define float @f(float %a, float %b) nounwind  {
+       %tmp = fdiv float %a, %b
+       ret float %tmp
+}