Properly handle sdiv / udiv / srem / urem libcalls
authorAnton Korobeynikov <asl@math.spbu.ru>
Sun, 3 May 2009 13:18:16 +0000 (13:18 +0000)
committerAnton Korobeynikov <asl@math.spbu.ru>
Sun, 3 May 2009 13:18:16 +0000 (13:18 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@70764 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/CodeGen/RuntimeLibcalls.h
lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
lib/CodeGen/SelectionDAG/TargetLowering.cpp

index 417f8d3f74962e5b7a737bcd15fddbb2e1031db9..f7a8c7eecdca83aca681ce1813192fd86f00b8d8 100644 (file)
@@ -45,15 +45,19 @@ namespace RTLIB {
     MUL_I32,
     MUL_I64,
     MUL_I128,
+    SDIV_I16,
     SDIV_I32,
     SDIV_I64,
     SDIV_I128,
+    UDIV_I16,
     UDIV_I32,
     UDIV_I64,
     UDIV_I128,
+    SREM_I16,
     SREM_I32,
     SREM_I64,
     SREM_I128,
+    UREM_I16,
     UREM_I32,
     UREM_I64,
     UREM_I128,
index 98908765b73968379e2807bba471a0c94374cd16..bdcad0a3b5eaf6b49c54a1771088c7df07d968c7 100644 (file)
@@ -3308,16 +3308,20 @@ SDValue SelectionDAGLegalize::LegalizeOp(SDValue Op) {
       switch (Node->getOpcode()) {
       case ISD::UDIV:
       case ISD::SDIV:
-        if (VT == MVT::i32) {
-          LC = Node->getOpcode() == ISD::UDIV
-               ? RTLIB::UDIV_I32 : RTLIB::SDIV_I32;
-          isSigned = Node->getOpcode() == ISD::SDIV;
-        }
-        break;
+       isSigned = Node->getOpcode() == ISD::SDIV;
+       if (VT == MVT::i16)
+         LC = (isSigned ? RTLIB::SDIV_I16  : RTLIB::UDIV_I16);
+       else if (VT == MVT::i32)
+         LC = (isSigned ? RTLIB::SDIV_I32  : RTLIB::UDIV_I32);
+       else if (VT == MVT::i64)
+         LC = (isSigned ? RTLIB::SDIV_I64  : RTLIB::UDIV_I64);
+       else if (VT == MVT::i128)
+         LC = (isSigned ? RTLIB::SDIV_I128 : RTLIB::UDIV_I128);
+       break;
       case ISD::MUL:
         if (VT == MVT::i16)
           LC = RTLIB::MUL_I16;
-        if (VT == MVT::i32)
+        else if (VT == MVT::i32)
           LC = RTLIB::MUL_I32;
         else if (VT == MVT::i64)
           LC = RTLIB::MUL_I64;
index 959274789c789204bc3cb05b164d784bdde1eae0..8eb4de4655aa8d4ff249d9d7eb46b9a8e2edb147 100644 (file)
@@ -67,15 +67,19 @@ static void InitLibcallNames(const char **Names) {
   Names[RTLIB::MUL_I32] = "__mulsi3";
   Names[RTLIB::MUL_I64] = "__muldi3";
   Names[RTLIB::MUL_I128] = "__multi3";
+  Names[RTLIB::SDIV_I16] = "__divhi3";
   Names[RTLIB::SDIV_I32] = "__divsi3";
   Names[RTLIB::SDIV_I64] = "__divdi3";
   Names[RTLIB::SDIV_I128] = "__divti3";
+  Names[RTLIB::UDIV_I32] = "__udivhi3";
   Names[RTLIB::UDIV_I32] = "__udivsi3";
   Names[RTLIB::UDIV_I64] = "__udivdi3";
   Names[RTLIB::UDIV_I128] = "__udivti3";
+  Names[RTLIB::SREM_I16] = "__modhi3";
   Names[RTLIB::SREM_I32] = "__modsi3";
   Names[RTLIB::SREM_I64] = "__moddi3";
   Names[RTLIB::SREM_I128] = "__modti3";
+  Names[RTLIB::UREM_I16] = "__umodsi3";
   Names[RTLIB::UREM_I32] = "__umodsi3";
   Names[RTLIB::UREM_I64] = "__umoddi3";
   Names[RTLIB::UREM_I128] = "__umodti3";