From 4d4485e440945f3a778b357b679954346c2e28e2 Mon Sep 17 00:00:00 2001 From: "haitao.feng@intel.com" Date: Thu, 12 Jun 2014 12:00:14 +0000 Subject: [PATCH] Sign extend the dehoisted key at the definition point for x64 port only; for x32 port, we need to sign extend the dehoisted key at the use points. R=verwaest@chromium.org Review URL: https://codereview.chromium.org/328553005 git-svn-id: https://v8.googlecode.com/svn/branches/bleeding_edge@21806 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/x64/lithium-codegen-x64.cc | 5 +++++ src/x64/lithium-x64.cc | 9 +++++++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/x64/lithium-codegen-x64.cc b/src/x64/lithium-codegen-x64.cc index 809df5d..642f962 100644 --- a/src/x64/lithium-codegen-x64.cc +++ b/src/x64/lithium-codegen-x64.cc @@ -275,6 +275,11 @@ void LCodeGen::GenerateBodyInstructionPost(LInstruction* instr) { } if (instr->HasResult() && instr->MustSignExtendResult(chunk())) { + // We sign extend the dehoisted key at the definition point when the pointer + // size is 64-bit. For x32 port, we sign extend the dehoisted key at the use + // points and MustSignExtendResult is always false. We can't use + // STATIC_ASSERT here as the pointer size is 32-bit for x32. + ASSERT(kPointerSize == kInt64Size); if (instr->result()->IsRegister()) { Register result_reg = ToRegister(instr->result()); __ movsxlq(result_reg, result_reg); diff --git a/src/x64/lithium-x64.cc b/src/x64/lithium-x64.cc index bb2ecc0..e3b85be 100644 --- a/src/x64/lithium-x64.cc +++ b/src/x64/lithium-x64.cc @@ -2110,6 +2110,11 @@ LInstruction* LChunkBuilder::DoLoadRoot(HLoadRoot* instr) { void LChunkBuilder::FindDehoistedKeyDefinitions(HValue* candidate) { + // We sign extend the dehoisted key at the definition point when the pointer + // size is 64-bit. For x32 port, we sign extend the dehoisted key at the use + // points and should not invoke this function. We can't use STATIC_ASSERT + // here as the pointer size is 32-bit for x32. + ASSERT(kPointerSize == kInt64Size); BitVector* dehoisted_key_ids = chunk_->GetDehoistedKeyIds(); if (dehoisted_key_ids->Contains(candidate->id())) return; dehoisted_key_ids->Add(candidate->id()); @@ -2126,7 +2131,7 @@ LInstruction* LChunkBuilder::DoLoadKeyed(HLoadKeyed* instr) { LOperand* key = UseRegisterOrConstantAtStart(instr->key()); LInstruction* result = NULL; - if (instr->IsDehoisted()) { + if ((kPointerSize == kInt64Size) && instr->IsDehoisted()) { FindDehoistedKeyDefinitions(instr->key()); } @@ -2171,7 +2176,7 @@ LInstruction* LChunkBuilder::DoLoadKeyedGeneric(HLoadKeyedGeneric* instr) { LInstruction* LChunkBuilder::DoStoreKeyed(HStoreKeyed* instr) { ElementsKind elements_kind = instr->elements_kind(); - if (instr->IsDehoisted()) { + if ((kPointerSize == kInt64Size) && instr->IsDehoisted()) { FindDehoistedKeyDefinitions(instr->key()); } -- 2.7.4