diff options
author | Ian Rogers <irogers@google.com> | 2013-09-20 17:36:02 -0700 |
---|---|---|
committer | Ian Rogers <irogers@google.com> | 2013-09-20 18:47:39 -0700 |
commit | 450dcb56ecbf6f729401e753f0a27e4170177ddd (patch) | |
tree | f596d57c5f6fbdc90b3dc68a2008e38ee48e2882 /runtime/interpreter/interpreter_switch_impl.cc | |
parent | 810b1d704f2db0d935bf5dddae3545f79cabd435 (diff) | |
download | art-450dcb56ecbf6f729401e753f0a27e4170177ddd.zip art-450dcb56ecbf6f729401e753f0a27e4170177ddd.tar.gz art-450dcb56ecbf6f729401e753f0a27e4170177ddd.tar.bz2 |
Improve float to integral conversion.
Change-Id: I1597083cb2c04084ce825fe2e3c753fde8309cd8
Diffstat (limited to 'runtime/interpreter/interpreter_switch_impl.cc')
-rw-r--r-- | runtime/interpreter/interpreter_switch_impl.cc | 68 |
1 files changed, 20 insertions, 48 deletions
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 @@ static JValue ExecuteSwitchImpl(Thread* self, MethodHelper& mh, const DexFile::C 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 @@ static JValue ExecuteSwitchImpl(Thread* self, MethodHelper& mh, const DexFile::C 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 @@ static JValue ExecuteSwitchImpl(Thread* self, MethodHelper& mh, const DexFile::C 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: |