Improve float to integral conversion.

Change-Id: I1597083cb2c04084ce825fe2e3c753fde8309cd8
diff --git a/runtime/interpreter/interpreter_goto_table_impl.cc b/runtime/interpreter/interpreter_goto_table_impl.cc
index b55c2c2..d70b80e 100644
--- a/runtime/interpreter/interpreter_goto_table_impl.cc
+++ b/runtime/interpreter/interpreter_goto_table_impl.cc
@@ -1460,16 +1460,7 @@
 
   HANDLE_INSTRUCTION_START(FLOAT_TO_INT) {
     float val = shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data));
-    int32_t result;
-    if (val != val) {
-      result = 0;
-    } else if (val > static_cast<float>(kMaxInt)) {
-      result = kMaxInt;
-    } else if (val < static_cast<float>(kMinInt)) {
-      result = kMinInt;
-    } else {
-      result = val;
-    }
+    int32_t result = art_float_to_integral<int32_t, float>(val);
     shadow_frame.SetVReg(inst->VRegA_12x(inst_data), result);
     ADVANCE(1);
   }
@@ -1477,16 +1468,7 @@
 
   HANDLE_INSTRUCTION_START(FLOAT_TO_LONG) {
     float val = shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data));
-    int64_t result;
-    if (val != val) {
-      result = 0;
-    } else if (val > static_cast<float>(kMaxLong)) {
-      result = kMaxLong;
-    } else if (val < static_cast<float>(kMinLong)) {
-      result = kMinLong;
-    } else {
-      result = val;
-    }
+    int64_t result = art_float_to_integral<int64_t, float>(val);
     shadow_frame.SetVRegLong(inst->VRegA_12x(inst_data), result);
     ADVANCE(1);
   }
@@ -1499,16 +1481,7 @@
 
   HANDLE_INSTRUCTION_START(DOUBLE_TO_INT) {
     double val = shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data));
-    int32_t result;
-    if (val != val) {
-      result = 0;
-    } else if (val > static_cast<double>(kMaxInt)) {
-      result = kMaxInt;
-    } else if (val < static_cast<double>(kMinInt)) {
-      result = kMinInt;
-    } else {
-      result = val;
-    }
+    int32_t result = art_float_to_integral<int32_t, double>(val);
     shadow_frame.SetVReg(inst->VRegA_12x(inst_data), result);
     ADVANCE(1);
   }
@@ -1516,16 +1489,7 @@
 
   HANDLE_INSTRUCTION_START(DOUBLE_TO_LONG) {
     double val = shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data));
-    int64_t result;
-    if (val != val) {
-      result = 0;
-    } else if (val > static_cast<double>(kMaxLong)) {
-      result = kMaxLong;
-    } else if (val < static_cast<double>(kMinLong)) {
-      result = kMinLong;
-    } else {
-      result = val;
-    }
+    int64_t result = art_float_to_integral<int64_t, double>(val);
     shadow_frame.SetVRegLong(inst->VRegA_12x(inst_data), result);
     ADVANCE(1);
   }
diff --git a/runtime/interpreter/interpreter_switch_impl.cc b/runtime/interpreter/interpreter_switch_impl.cc
index b2e480f..d49807c 100644
--- a/runtime/interpreter/interpreter_switch_impl.cc
+++ b/runtime/interpreter/interpreter_switch_impl.cc
@@ -1361,47 +1361,44 @@
         break;
       case Instruction::INT_TO_LONG:
         PREAMBLE();
-        shadow_frame.SetVRegLong(inst->VRegA_12x(inst_data), shadow_frame.GetVReg(inst->VRegB_12x(inst_data)));
+        shadow_frame.SetVRegLong(inst->VRegA_12x(inst_data),
+                                 shadow_frame.GetVReg(inst->VRegB_12x(inst_data)));
         inst = inst->Next_1xx();
         break;
       case Instruction::INT_TO_FLOAT:
         PREAMBLE();
-        shadow_frame.SetVRegFloat(inst->VRegA_12x(inst_data), shadow_frame.GetVReg(inst->VRegB_12x(inst_data)));
+        shadow_frame.SetVRegFloat(inst->VRegA_12x(inst_data),
+                                  shadow_frame.GetVReg(inst->VRegB_12x(inst_data)));
         inst = inst->Next_1xx();
         break;
       case Instruction::INT_TO_DOUBLE:
         PREAMBLE();
-        shadow_frame.SetVRegDouble(inst->VRegA_12x(inst_data), shadow_frame.GetVReg(inst->VRegB_12x(inst_data)));
+        shadow_frame.SetVRegDouble(inst->VRegA_12x(inst_data),
+                                   shadow_frame.GetVReg(inst->VRegB_12x(inst_data)));
         inst = inst->Next_1xx();
         break;
       case Instruction::LONG_TO_INT:
         PREAMBLE();
-        shadow_frame.SetVReg(inst->VRegA_12x(inst_data), shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data)));
+        shadow_frame.SetVReg(inst->VRegA_12x(inst_data),
+                             shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data)));
         inst = inst->Next_1xx();
         break;
       case Instruction::LONG_TO_FLOAT:
         PREAMBLE();
-        shadow_frame.SetVRegFloat(inst->VRegA_12x(inst_data), shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data)));
+        shadow_frame.SetVRegFloat(inst->VRegA_12x(inst_data),
+                                  shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data)));
         inst = inst->Next_1xx();
         break;
       case Instruction::LONG_TO_DOUBLE:
         PREAMBLE();
-        shadow_frame.SetVRegDouble(inst->VRegA_12x(inst_data), shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data)));
+        shadow_frame.SetVRegDouble(inst->VRegA_12x(inst_data),
+                                   shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data)));
         inst = inst->Next_1xx();
         break;
       case Instruction::FLOAT_TO_INT: {
         PREAMBLE();
         float val = shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data));
-        int32_t result;
-        if (val != val) {
-          result = 0;
-        } else if (val > static_cast<float>(kMaxInt)) {
-          result = kMaxInt;
-        } else if (val < static_cast<float>(kMinInt)) {
-          result = kMinInt;
-        } else {
-          result = val;
-        }
+        int32_t result = art_float_to_integral<int32_t, float>(val);
         shadow_frame.SetVReg(inst->VRegA_12x(inst_data), result);
         inst = inst->Next_1xx();
         break;
@@ -1409,38 +1406,21 @@
       case Instruction::FLOAT_TO_LONG: {
         PREAMBLE();
         float val = shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data));
-        int64_t result;
-        if (val != val) {
-          result = 0;
-        } else if (val > static_cast<float>(kMaxLong)) {
-          result = kMaxLong;
-        } else if (val < static_cast<float>(kMinLong)) {
-          result = kMinLong;
-        } else {
-          result = val;
-        }
+        int64_t result = art_float_to_integral<int64_t, float>(val);
         shadow_frame.SetVRegLong(inst->VRegA_12x(inst_data), result);
         inst = inst->Next_1xx();
         break;
       }
       case Instruction::FLOAT_TO_DOUBLE:
         PREAMBLE();
-        shadow_frame.SetVRegDouble(inst->VRegA_12x(inst_data), shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data)));
+        shadow_frame.SetVRegDouble(inst->VRegA_12x(inst_data),
+                                   shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data)));
         inst = inst->Next_1xx();
         break;
       case Instruction::DOUBLE_TO_INT: {
         PREAMBLE();
         double val = shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data));
-        int32_t result;
-        if (val != val) {
-          result = 0;
-        } else if (val > static_cast<double>(kMaxInt)) {
-          result = kMaxInt;
-        } else if (val < static_cast<double>(kMinInt)) {
-          result = kMinInt;
-        } else {
-          result = val;
-        }
+        int32_t result = art_float_to_integral<int32_t, double>(val);
         shadow_frame.SetVReg(inst->VRegA_12x(inst_data), result);
         inst = inst->Next_1xx();
         break;
@@ -1448,23 +1428,15 @@
       case Instruction::DOUBLE_TO_LONG: {
         PREAMBLE();
         double val = shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data));
-        int64_t result;
-        if (val != val) {
-          result = 0;
-        } else if (val > static_cast<double>(kMaxLong)) {
-          result = kMaxLong;
-        } else if (val < static_cast<double>(kMinLong)) {
-          result = kMinLong;
-        } else {
-          result = val;
-        }
+        int64_t result = art_float_to_integral<int64_t, double>(val);
         shadow_frame.SetVRegLong(inst->VRegA_12x(inst_data), result);
         inst = inst->Next_1xx();
         break;
       }
       case Instruction::DOUBLE_TO_FLOAT:
         PREAMBLE();
-        shadow_frame.SetVRegFloat(inst->VRegA_12x(inst_data), shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data)));
+        shadow_frame.SetVRegFloat(inst->VRegA_12x(inst_data),
+                                  shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data)));
         inst = inst->Next_1xx();
         break;
       case Instruction::INT_TO_BYTE: