[ARM GlobalISel] Legalize G_SITOFP and G_UITOFP

Legal if we have hardware support, libcall otherwise.

Also add supporting code to the legalizer helper for libcalls.

llvm-svn: 323730
diff --git a/llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp b/llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp
index 4fcb6a6..773e51c 100644
--- a/llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp
+++ b/llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp
@@ -154,6 +154,10 @@
     return RTLIB::getFPTOSINT(FromMVT, ToMVT);
   case TargetOpcode::G_FPTOUI:
     return RTLIB::getFPTOUINT(FromMVT, ToMVT);
+  case TargetOpcode::G_SITOFP:
+    return RTLIB::getSINTTOFP(FromMVT, ToMVT);
+  case TargetOpcode::G_UITOFP:
+    return RTLIB::getUINTTOFP(FromMVT, ToMVT);
   }
   llvm_unreachable("Unsupported libcall function");
 }
@@ -238,6 +242,21 @@
       return Status;
     break;
   }
+  case TargetOpcode::G_SITOFP:
+  case TargetOpcode::G_UITOFP: {
+    // FIXME: Support other types
+    unsigned FromSize = MRI.getType(MI.getOperand(1).getReg()).getSizeInBits();
+    unsigned ToSize = MRI.getType(MI.getOperand(0).getReg()).getSizeInBits();
+    if (FromSize != 32 || (ToSize != 32 && ToSize != 64))
+      return UnableToLegalize;
+    LegalizeResult Status = conversionLibcall(
+        MI, MIRBuilder,
+        ToSize == 64 ? Type::getDoubleTy(Ctx) : Type::getFloatTy(Ctx),
+        Type::getInt32Ty(Ctx));
+    if (Status != Legalized)
+      return Status;
+    break;
+  }
   }
 
   MI.eraseFromParent();
diff --git a/llvm/lib/Target/ARM/ARMLegalizerInfo.cpp b/llvm/lib/Target/ARM/ARMLegalizerInfo.cpp
index 4082d4e..2d09bca 100644
--- a/llvm/lib/Target/ARM/ARMLegalizerInfo.cpp
+++ b/llvm/lib/Target/ARM/ARMLegalizerInfo.cpp
@@ -192,6 +192,12 @@
       for (auto Ty : {s32, s64})
         setAction({Op, 1, Ty}, Legal);
     }
+
+    for (unsigned Op : {G_SITOFP, G_UITOFP}) {
+      setAction({Op, 1, s32}, Legal);
+      for (auto Ty : {s32, s64})
+        setAction({Op, Ty}, Legal);
+    }
   } else {
     for (unsigned BinOp : {G_FADD, G_FSUB, G_FMUL, G_FDIV})
       for (auto Ty : {s32, s64})
@@ -218,6 +224,11 @@
       setAction({Op, 1, s64}, Libcall);
     }
 
+    for (unsigned Op : {G_SITOFP, G_UITOFP}) {
+      for (auto Ty : {s32, s64})
+        setAction({Op, Ty}, Libcall);
+    }
+
     if (AEABI(ST))
       setFCmpLibcallsAEABI();
     else