From 389d57af638b49ffb9bb017c2e656e7d6a62e152 Mon Sep 17 00:00:00 2001 From: "haitao.feng@intel.com" Date: Tue, 10 Jun 2014 09:52:44 +0000 Subject: [PATCH] Update DecodeFieldToSmi to support x32 port. R=verwaest@chromium.org Review URL: https://codereview.chromium.org/310803003 git-svn-id: https://v8.googlecode.com/svn/branches/bleeding_edge@21738 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/x64/macro-assembler-x64.h | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/src/x64/macro-assembler-x64.h b/src/x64/macro-assembler-x64.h index e6d5191..8a0ffa6 100644 --- a/src/x64/macro-assembler-x64.h +++ b/src/x64/macro-assembler-x64.h @@ -1053,8 +1053,22 @@ class MacroAssembler: public Assembler { template void DecodeFieldToSmi(Register reg) { - andp(reg, Immediate(Field::kMask)); - shlp(reg, Immediate(kSmiShift - Field::kShift)); + if (SmiValuesAre32Bits()) { + andp(reg, Immediate(Field::kMask)); + shlp(reg, Immediate(kSmiShift - Field::kShift)); + } else { + static const int shift = Field::kShift; + static const int mask = (Field::kMask >> Field::kShift) << kSmiTagSize; + ASSERT(SmiValuesAre31Bits()); + ASSERT(kSmiShift == kSmiTagSize); + ASSERT((mask & 0x80000000u) == 0); + if (shift < kSmiShift) { + shlp(reg, Immediate(kSmiShift - shift)); + } else if (shift > kSmiShift) { + sarp(reg, Immediate(shift - kSmiShift)); + } + andp(reg, Immediate(mask)); + } } // Abort execution if argument is not a number, enabled via --debug-code. -- 2.7.4