Intrinsics for float/int and double/long conversions.

Bug: 2935622
Change-Id: I0f9e564f1f94ccf6596a37a6f1c10253481d5062
diff --git a/vm/compiler/codegen/arm/CodegenDriver.c b/vm/compiler/codegen/arm/CodegenDriver.c
index 1ff9409..2cfa8fb 100644
--- a/vm/compiler/codegen/arm/CodegenDriver.c
+++ b/vm/compiler/codegen/arm/CodegenDriver.c
@@ -3309,7 +3309,7 @@
 {
     RegLocation rlSrc = dvmCompilerGetSrc(cUnit, mir, 0);
     rlSrc = loadValue(cUnit, rlSrc, kCoreReg);
-    RegLocation rlDest = inlinedTarget(cUnit, mir, false);;
+    RegLocation rlDest = inlinedTarget(cUnit, mir, false);
     RegLocation rlResult = dvmCompilerEvalLoc(cUnit, rlDest, kCoreReg, true);
     int signReg = dvmCompilerAllocTemp(cUnit);
     /*
@@ -3346,6 +3346,24 @@
     return false;
 }
 
+static bool genInlinedIntFloatConversion(CompilationUnit *cUnit, MIR *mir)
+{
+    // Just move from source to destination...
+    RegLocation rlSrc = dvmCompilerGetSrc(cUnit, mir, 0);
+    RegLocation rlDest = inlinedTarget(cUnit, mir, false);
+    storeValue(cUnit, rlDest, rlSrc);
+    return false;
+}
+
+static bool genInlinedLongDoubleConversion(CompilationUnit *cUnit, MIR *mir)
+{
+    // Just move from source to destination...
+    RegLocation rlSrc = dvmCompilerGetSrcWide(cUnit, mir, 0, 1);
+    RegLocation rlDest = inlinedTargetWide(cUnit, mir, false);
+    storeValueWide(cUnit, rlDest, rlSrc);
+    return false;
+}
+
 /*
  * NOTE: Handles both range and non-range versions (arguments
  * have already been normalized by this point).
@@ -3402,9 +3420,17 @@
                         return false;
                     else
                         break;
+                case INLINE_FLOAT_TO_RAW_INT_BITS:
+                case INLINE_INT_BITS_TO_FLOAT:
+                    return genInlinedIntFloatConversion(cUnit, mir);
+                case INLINE_DOUBLE_TO_RAW_LONG_BITS:
+                case INLINE_LONG_BITS_TO_DOUBLE:
+                    return genInlinedLongDoubleConversion(cUnit, mir);
                 case INLINE_STRING_EQUALS:
                 case INLINE_MATH_COS:
                 case INLINE_MATH_SIN:
+                case INLINE_FLOAT_TO_INT_BITS:
+                case INLINE_DOUBLE_TO_LONG_BITS:
                     break;   /* Handle with C routine */
                 default:
                     dvmCompilerAbort(cUnit);