Consolidate SMI functions into one area for X64

R=jkummerow@chromium.org

Review URL: https://codereview.chromium.org/23665002

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@16418 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
haitao.feng@intel.com 2013-08-29 11:41:14 +00:00
parent 1083d1f817
commit 94621761b8
2 changed files with 28 additions and 25 deletions

View File

@ -958,7 +958,10 @@ void MacroAssembler::Set(const Operand& dst, int64_t x) {
}
bool MacroAssembler::IsUnsafeInt(const int x) {
// ----------------------------------------------------------------------------
// Smi tagging, untagging and tag detection.
bool MacroAssembler::IsUnsafeInt(const int32_t x) {
static const int kMaxBits = 17;
return !is_intn(x, kMaxBits);
}
@ -989,9 +992,6 @@ void MacroAssembler::SafePush(Smi* src) {
}
// ----------------------------------------------------------------------------
// Smi tagging, untagging and tag detection.
Register MacroAssembler::GetSmiConstant(Smi* source) {
int value = source->value();
if (value == 0) {
@ -2196,6 +2196,17 @@ void MacroAssembler::AddSmiField(Register dst, const Operand& src) {
}
void MacroAssembler::Push(Smi* source) {
intptr_t smi = reinterpret_cast<intptr_t>(source);
if (is_int32(smi)) {
push(Immediate(static_cast<int32_t>(smi)));
} else {
Register constant = GetSmiConstant(source);
push(constant);
}
}
void MacroAssembler::PushInt64AsTwoSmis(Register src, Register scratch) {
movq(scratch, src);
// High bits.
@ -2220,6 +2231,14 @@ void MacroAssembler::PopInt64AsTwoSmis(Register dst, Register scratch) {
}
void MacroAssembler::Test(const Operand& src, Smi* source) {
testl(Operand(src, kIntSize), Immediate(source->value()));
}
// ----------------------------------------------------------------------------
void MacroAssembler::JumpIfNotString(Register object,
Register object_map,
Label* not_string,
@ -2459,17 +2478,6 @@ void MacroAssembler::LoadGlobalCell(Register dst, Handle<Cell> cell) {
}
void MacroAssembler::Push(Smi* source) {
intptr_t smi = reinterpret_cast<intptr_t>(source);
if (is_int32(smi)) {
push(Immediate(static_cast<int32_t>(smi)));
} else {
Register constant = GetSmiConstant(source);
push(constant);
}
}
void MacroAssembler::Drop(int stack_elements) {
if (stack_elements > 0) {
addq(rsp, Immediate(stack_elements * kPointerSize));
@ -2477,11 +2485,6 @@ void MacroAssembler::Drop(int stack_elements) {
}
void MacroAssembler::Test(const Operand& src, Smi* source) {
testl(Operand(src, kIntSize), Immediate(source->value()));
}
void MacroAssembler::TestBit(const Operand& src, int bits) {
int byte_offset = bits / kBitsPerByte;
int bit_in_byte = bits & (kBitsPerByte - 1);

View File

@ -375,6 +375,11 @@ class MacroAssembler: public Assembler {
// ---------------------------------------------------------------------------
// Smi tagging, untagging and operations on tagged smis.
// Support for constant splitting.
bool IsUnsafeInt(const int32_t x);
void SafeMove(Register dst, Smi* src);
void SafePush(Smi* src);
void InitializeSmiConstantRegister() {
movq(kSmiConstantRegister,
reinterpret_cast<uint64_t>(Smi::FromInt(kSmiConstantRegisterValue)),
@ -782,11 +787,6 @@ class MacroAssembler: public Assembler {
// Move if the registers are not identical.
void Move(Register target, Register source);
// Support for constant splitting.
bool IsUnsafeInt(const int x);
void SafeMove(Register dst, Smi* src);
void SafePush(Smi* src);
// Bit-field support.
void TestBit(const Operand& dst, int bit_index);