Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(14)

Unified Diff: src/arm/macro-assembler-arm.cc

Issue 11412272: [v8-dev] ARM: Improve double to integer truncation on ARM. (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: Created 8 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: src/arm/macro-assembler-arm.cc
===================================================================
--- src/arm/macro-assembler-arm.cc (revision 13104)
+++ src/arm/macro-assembler-arm.cc (working copy)
@@ -2489,6 +2489,20 @@
}
+void MacroAssembler::TryFastDoubleToInt32(Register result,
+ DwVfpRegister double_input,
+ DwVfpRegister double_scratch,
+ Label* done) {
+ ASSERT(!double_input.is(double_scratch));
+
+ vcvt_s32_f64(double_scratch.low(), double_input);
+ vmov(result, double_scratch.low());
+ vcvt_f64_s32(double_scratch, double_scratch.low());
+ VFPCompareAndSetFlags(double_input, double_scratch);
+ b(eq, done);
+}
+
+
void MacroAssembler::EmitVFPTruncate(VFPRoundingMode rounding_mode,
Register result,
DwVfpRegister double_input,
@@ -2504,11 +2518,7 @@
Label done;
// Test for values that can be exactly represented as a signed 32-bit integer.
- vcvt_s32_f64(double_scratch.low(), double_input);
- vmov(result, double_scratch.low());
- vcvt_f64_s32(double_scratch, double_scratch.low());
- VFPCompareAndSetFlags(double_input, double_scratch);
- b(eq, &done);
+ TryFastDoubleToInt32(result, double_input, double_scratch, &done);
// Convert to integer, respecting rounding mode.
int32_t check_inexact_conversion =
@@ -2625,7 +2635,7 @@
void MacroAssembler::EmitECMATruncate(Register result,
DwVfpRegister double_input,
- SwVfpRegister single_scratch,
+ DwVfpRegister double_scratch,
Register scratch,
Register input_high,
Register input_low) {
@@ -2636,16 +2646,18 @@
ASSERT(!scratch.is(result) &&
!scratch.is(input_high) &&
!scratch.is(input_low));
- ASSERT(!single_scratch.is(double_input.low()) &&
- !single_scratch.is(double_input.high()));
+ ASSERT(!double_input.is(double_scratch));
Label done;
+ // Test for values that can be exactly represented as a signed 32-bit integer.
+ TryFastDoubleToInt32(result, double_input, double_scratch, &done);
+
// Clear cumulative exception flags.
ClearFPSCRBits(kVFPExceptionMask, scratch);
// Try a conversion to a signed integer.
- vcvt_s32_f64(single_scratch, double_input);
- vmov(result, single_scratch);
+ vcvt_s32_f64(double_scratch.low(), double_input);
+ vmov(result, double_scratch.low());
// Retrieve he FPSCR.
vmrs(scratch);
// Check for overflow and NaNs.

Powered by Google App Engine
This is Rietveld 408576698