Reviewers: fschneider,

Description:
Emit slightly more compact code in untag double.

Please review this at http://codereview.chromium.org/6677111/

Affected files:
  M src/assembler.h
  M src/assembler.cc
  M src/ia32/lithium-codegen-ia32.cc


Index: src/assembler.cc
diff --git a/src/assembler.cc b/src/assembler.cc
index b0b44fd980e0721bc7e32f7f4ec6bacccf7dc911..de3711b341b33ca098a347188126237ee7b9e129 100644
--- a/src/assembler.cc
+++ b/src/assembler.cc
@@ -67,6 +67,7 @@ namespace internal {
 const double DoubleConstant::min_int = kMinInt;
 const double DoubleConstant::one_half = 0.5;
 const double DoubleConstant::minus_zero = -0.0;
+const double DoubleConstant::nan = OS::nan_value();
 const double DoubleConstant::negative_infinity = -V8_INFINITY;
 const char* RelocInfo::kFillerCommentString = "DEOPTIMIZATION PADDING";

@@ -745,6 +746,12 @@ ExternalReference ExternalReference::address_of_negative_infinity() {
 }


+ExternalReference ExternalReference::address_of_nan() {
+  return ExternalReference(reinterpret_cast<void*>(
+      const_cast<double*>(&DoubleConstant::nan)));
+}
+
+
 #ifndef V8_INTERPRETED_REGEXP

 ExternalReference ExternalReference::re_check_stack_guard_state() {
Index: src/assembler.h
diff --git a/src/assembler.h b/src/assembler.h
index 8ebbfadf80f0c3bc88a991233434686986d086b4..b66421a2e72a1cb97137d45d66bbba441ac41fb0 100644
--- a/src/assembler.h
+++ b/src/assembler.h
@@ -53,6 +53,7 @@ class DoubleConstant: public AllStatic {
   static const double one_half;
   static const double minus_zero;
   static const double negative_infinity;
+  static const double nan;
 };


@@ -590,6 +591,7 @@ class ExternalReference BASE_EMBEDDED {
   static ExternalReference address_of_one_half();
   static ExternalReference address_of_minus_zero();
   static ExternalReference address_of_negative_infinity();
+  static ExternalReference address_of_nan();

   static ExternalReference math_sin_double_function();
   static ExternalReference math_cos_double_function();
Index: src/ia32/lithium-codegen-ia32.cc
diff --git a/src/ia32/lithium-codegen-ia32.cc b/src/ia32/lithium-codegen-ia32.cc index 78784b248f9e68857e25d7322b8aa49729e3b41e..d97c4fc6ee046f6bb5d671d9867144d39962d162 100644
--- a/src/ia32/lithium-codegen-ia32.cc
+++ b/src/ia32/lithium-codegen-ia32.cc
@@ -3289,10 +3289,8 @@ void LCodeGen::EmitNumberUntagD(Register input_reg,
   DeoptimizeIf(not_equal, env);

   // Convert undefined to NaN.
-  __ push(input_reg);
-  __ mov(input_reg, Factory::nan_value());
-  __ movdbl(result_reg, FieldOperand(input_reg, HeapNumber::kValueOffset));
-  __ pop(input_reg);
+  ExternalReference nan = ExternalReference::address_of_nan();
+  __ movdbl(result_reg, Operand::StaticVariable(nan));
   __ jmp(&done);

   // Heap number to XMM conversion.


--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev

Reply via email to