Reviewers: William Hesse,

Message:
Small review.


Description:
X64: Fix recently introduced bug in movq with 64-bit literal.

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

Affected files:
   M src/x64/assembler-x64.cc
   M src/x64/codegen-x64.cc


Index: src/x64/assembler-x64.cc
diff --git a/src/x64/assembler-x64.cc b/src/x64/assembler-x64.cc
index  
989a748933467c1bbbb7915ed57d2bedf78b899b..167334f39a6ad67aefd12f8a42e691235b3bb478
  
100644
--- a/src/x64/assembler-x64.cc
+++ b/src/x64/assembler-x64.cc
@@ -1084,18 +1084,19 @@ void Assembler::movq(Register dst, int64_t value,  
RelocInfo::Mode rmode) {
      // Sadly, there is no zero or sign extending move for 8-bit immediates.
      if (is_int32(value)) {
        movq(dst, Immediate(static_cast<int32_t>(value)));
+      return;
      } else if (is_uint32(value)) {
        movl(dst, Immediate(static_cast<int32_t>(value)));
+      return;
      }
      // Value cannot be represented by 32 bits, so do a full 64 bit  
immediate
      // value.
-  } else {
-    EnsureSpace ensure_space(this);
-    last_pc_ = pc_;
-    emit_rex_64(dst);
-    emit(0xB8 | dst.low_bits());
-    emitq(value, rmode);
    }
+  EnsureSpace ensure_space(this);
+  last_pc_ = pc_;
+  emit_rex_64(dst);
+  emit(0xB8 | dst.low_bits());
+  emitq(value, rmode);
  }


Index: src/x64/codegen-x64.cc
diff --git a/src/x64/codegen-x64.cc b/src/x64/codegen-x64.cc
index  
b4568237ae385645b5c1e22005d021e32400b9e7..b1f2b8fbceb137db45c6510ea347bcfce6393b04
  
100644
--- a/src/x64/codegen-x64.cc
+++ b/src/x64/codegen-x64.cc
@@ -5644,7 +5644,7 @@ void CompareStub::Generate(MacroAssembler* masm) {
        // The representation of NaN values has all exponent bits (52..62)  
set,
        // and not all mantissa bits (0..51) clear.
        // Read double representation into rax.
-      __ movq(rbx, 0x7ff0000000000000, RelocInfo::NONE);
+      __ movq(rbx, V8_UINT64_C(0x7ff0000000000000), RelocInfo::NONE);
        __ movq(rax, FieldOperand(rdx, HeapNumber::kValueOffset));
        // Test that exponent bits are all set.
        __ or_(rbx, rax);
@@ -5655,10 +5655,7 @@ void CompareStub::Generate(MacroAssembler* masm) {
        // If all bits in the mantissa are zero the number is Infinity, and
        // we return zero.  Otherwise it is a NaN, and we return non-zero.
        // We cannot just return rax because only eax is tested on return.
-      // TODO(X64): Solve this using movcc, when implemented.
-      __ movq(kScratchRegister, rax);
-      __ shr(kScratchRegister, Immediate(32));
-      __ or_(rax, kScratchRegister);
+      __ setcc(not_zero, rax);
        __ ret(0);

        __ bind(&not_identical);



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

Reply via email to