From: verwaest@chromium.org Date: Fri, 9 May 2014 16:18:58 +0000 (+0000) Subject: Reland and fix r21225 and r21226 X-Git-Tag: upstream/4.7.83~9194 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=ed64101bc7fc3966180481a3754898b2415790dd;p=platform%2Fupstream%2Fv8.git Reland and fix r21225 and r21226 BUG= R=ishell@chromium.org Review URL: https://codereview.chromium.org/272203002 git-svn-id: https://v8.googlecode.com/svn/branches/bleeding_edge@21232 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- diff --git a/src/arm/full-codegen-arm.cc b/src/arm/full-codegen-arm.cc index c7afd09..221526b 100644 --- a/src/arm/full-codegen-arm.cc +++ b/src/arm/full-codegen-arm.cc @@ -3026,7 +3026,7 @@ void FullCodeGenerator::EmitIsStringWrapperSafeForDefaultValueOf( __ add(r4, r4, Operand(DescriptorArray::kFirstOffset - kHeapObjectTag)); // Calculate the end of the descriptor array. __ mov(r2, r4); - __ add(r2, r2, Operand::PointerOffsetFromSmiKey(r3)); + __ add(r2, r2, Operand(r3, LSL, kPointerSizeLog2)); // Loop through all the keys in the descriptor array. If one of these is the // string "valueOf" the result is false. diff --git a/src/arm/macro-assembler-arm.cc b/src/arm/macro-assembler-arm.cc index 9752622..ac8a7d3 100644 --- a/src/arm/macro-assembler-arm.cc +++ b/src/arm/macro-assembler-arm.cc @@ -3596,7 +3596,7 @@ void MacroAssembler::CheckMapDeprecated(Handle map, if (map->CanBeDeprecated()) { mov(scratch, Operand(map)); ldr(scratch, FieldMemOperand(scratch, Map::kBitField3Offset)); - tst(scratch, Operand(Smi::FromInt(Map::Deprecated::kMask))); + tst(scratch, Operand(Map::Deprecated::kMask)); b(ne, if_deprecated); } } @@ -3854,7 +3854,8 @@ void MacroAssembler::NumberOfOwnDescriptors(Register dst, Register map) { void MacroAssembler::EnumLength(Register dst, Register map) { STATIC_ASSERT(Map::EnumLengthBits::kShift == 0); ldr(dst, FieldMemOperand(map, Map::kBitField3Offset)); - and_(dst, dst, Operand(Smi::FromInt(Map::EnumLengthBits::kMask))); + and_(dst, dst, Operand(Map::EnumLengthBits::kMask)); + SmiTag(dst); } diff --git a/src/arm/macro-assembler-arm.h b/src/arm/macro-assembler-arm.h index ba6f825..de705ed 100644 --- a/src/arm/macro-assembler-arm.h +++ b/src/arm/macro-assembler-arm.h @@ -1357,7 +1357,7 @@ class MacroAssembler: public Assembler { template void DecodeField(Register reg) { static const int shift = Field::kShift; - static const int mask = (Field::kMask >> shift) << kSmiTagSize; + static const int mask = Field::kMask >> shift; mov(reg, Operand(reg, LSR, shift)); and_(reg, reg, Operand(mask)); } diff --git a/src/arm64/macro-assembler-arm64.cc b/src/arm64/macro-assembler-arm64.cc index 4e447c4..40b0782 100644 --- a/src/arm64/macro-assembler-arm64.cc +++ b/src/arm64/macro-assembler-arm64.cc @@ -1325,15 +1325,14 @@ void MacroAssembler::NumberOfOwnDescriptors(Register dst, Register map) { void MacroAssembler::EnumLengthUntagged(Register dst, Register map) { STATIC_ASSERT(Map::EnumLengthBits::kShift == 0); - Ldrsw(dst, UntagSmiFieldMemOperand(map, Map::kBitField3Offset)); + Ldrsw(dst, FieldMemOperand(map, Map::kBitField3Offset)); And(dst, dst, Map::EnumLengthBits::kMask); } void MacroAssembler::EnumLengthSmi(Register dst, Register map) { - STATIC_ASSERT(Map::EnumLengthBits::kShift == 0); - Ldr(dst, FieldMemOperand(map, Map::kBitField3Offset)); - And(dst, dst, Smi::FromInt(Map::EnumLengthBits::kMask)); + EnumLengthUntagged(dst, map); + SmiTag(dst, dst); } @@ -4515,7 +4514,7 @@ void MacroAssembler::CheckMapDeprecated(Handle map, Label* if_deprecated) { if (map->CanBeDeprecated()) { Mov(scratch, Operand(map)); - Ldrsw(scratch, UntagSmiFieldMemOperand(scratch, Map::kBitField3Offset)); + Ldrsw(scratch, FieldMemOperand(scratch, Map::kBitField3Offset)); TestAndBranchIfAnySet(scratch, Map::Deprecated::kMask, if_deprecated); } } diff --git a/src/arm64/macro-assembler-arm64.h b/src/arm64/macro-assembler-arm64.h index 3479170..5dc1953 100644 --- a/src/arm64/macro-assembler-arm64.h +++ b/src/arm64/macro-assembler-arm64.h @@ -843,7 +843,7 @@ class MacroAssembler : public Assembler { template void DecodeField(Register reg) { - static const uint64_t shift = Field::kShift + kSmiShift; + static const uint64_t shift = Field::kShift; static const uint64_t setbits = CountSetBits(Field::kMask, 32); Ubfx(reg, reg, shift, setbits); } diff --git a/src/ia32/full-codegen-ia32.cc b/src/ia32/full-codegen-ia32.cc index 49d213f..640f0a5 100644 --- a/src/ia32/full-codegen-ia32.cc +++ b/src/ia32/full-codegen-ia32.cc @@ -2955,7 +2955,7 @@ void FullCodeGenerator::EmitIsStringWrapperSafeForDefaultValueOf( STATIC_ASSERT(kSmiTagSize == 1); STATIC_ASSERT(kPointerSize == 4); __ imul(ecx, ecx, DescriptorArray::kDescriptorSize); - __ lea(ecx, Operand(ebx, ecx, times_2, DescriptorArray::kFirstOffset)); + __ lea(ecx, Operand(ebx, ecx, times_4, DescriptorArray::kFirstOffset)); // Calculate location of the first key name. __ add(ebx, Immediate(DescriptorArray::kFirstOffset)); // Loop through all the keys in the descriptor array. If one of these is the diff --git a/src/ia32/macro-assembler-ia32.cc b/src/ia32/macro-assembler-ia32.cc index 6c97226..f260026 100644 --- a/src/ia32/macro-assembler-ia32.cc +++ b/src/ia32/macro-assembler-ia32.cc @@ -3182,7 +3182,7 @@ void MacroAssembler::CheckMapDeprecated(Handle map, if (map->CanBeDeprecated()) { mov(scratch, map); mov(scratch, FieldOperand(scratch, Map::kBitField3Offset)); - and_(scratch, Immediate(Smi::FromInt(Map::Deprecated::kMask))); + and_(scratch, Immediate(Map::Deprecated::kMask)); j(not_zero, if_deprecated); } } @@ -3360,7 +3360,8 @@ void MacroAssembler::EnsureNotWhite( void MacroAssembler::EnumLength(Register dst, Register map) { STATIC_ASSERT(Map::EnumLengthBits::kShift == 0); mov(dst, FieldOperand(map, Map::kBitField3Offset)); - and_(dst, Immediate(Smi::FromInt(Map::EnumLengthBits::kMask))); + and_(dst, Immediate(Map::EnumLengthBits::kMask)); + SmiTag(dst); } diff --git a/src/ia32/macro-assembler-ia32.h b/src/ia32/macro-assembler-ia32.h index 6a1d7ef..d9c83b8 100644 --- a/src/ia32/macro-assembler-ia32.h +++ b/src/ia32/macro-assembler-ia32.h @@ -495,7 +495,7 @@ class MacroAssembler: public Assembler { template void DecodeField(Register reg) { static const int shift = Field::kShift; - static const int mask = (Field::kMask >> Field::kShift) << kSmiTagSize; + static const int mask = Field::kMask >> Field::kShift; sar(reg, shift); and_(reg, Immediate(mask)); } diff --git a/src/objects-inl.h b/src/objects-inl.h index 029e80d..00cd62e 100644 --- a/src/objects-inl.h +++ b/src/objects-inl.h @@ -4033,12 +4033,12 @@ bool Map::has_non_instance_prototype() { void Map::set_function_with_prototype(bool value) { - set_bit_field3(FunctionWithPrototype::update(bit_field3(), value)); + set_bit_field(FunctionWithPrototype::update(bit_field(), value)); } bool Map::function_with_prototype() { - return FunctionWithPrototype::decode(bit_field3()); + return FunctionWithPrototype::decode(bit_field()); } @@ -4753,16 +4753,15 @@ ACCESSORS(Map, instance_descriptors, DescriptorArray, kDescriptorsOffset) void Map::set_bit_field3(uint32_t bits) { - // Ensure the upper 2 bits have the same value by sign extending it. This is - // necessary to be able to use the 31st bit. - int value = bits << 1; - WRITE_FIELD(this, kBitField3Offset, Smi::FromInt(value >> 1)); + if (kInt32Size != kPointerSize) { + WRITE_UINT32_FIELD(this, kBitField3Offset + kInt32Size, 0); + } + WRITE_UINT32_FIELD(this, kBitField3Offset, bits); } uint32_t Map::bit_field3() { - Object* value = READ_FIELD(this, kBitField3Offset); - return Smi::cast(value)->value(); + return READ_UINT32_FIELD(this, kBitField3Offset); } diff --git a/src/objects.cc b/src/objects.cc index 956e46f..1b95d89 100644 --- a/src/objects.cc +++ b/src/objects.cc @@ -9918,8 +9918,8 @@ static bool CheckEquivalent(Map* first, Map* second) { first->instance_type() == second->instance_type() && first->bit_field() == second->bit_field() && first->bit_field2() == second->bit_field2() && - first->is_observed() == second->is_observed() && - first->function_with_prototype() == second->function_with_prototype(); + first->is_frozen() == second->is_frozen() && + first->has_instance_call_handler() == second->has_instance_call_handler(); } diff --git a/src/objects.h b/src/objects.h index 3a00f40..9e20652 100644 --- a/src/objects.h +++ b/src/objects.h @@ -5959,14 +5959,13 @@ class Map: public HeapObject { kDescriptorIndexBitCount, kDescriptorIndexBitCount> {}; // NOLINT STATIC_ASSERT(kDescriptorIndexBitCount + kDescriptorIndexBitCount == 20); class IsShared: public BitField {}; - class FunctionWithPrototype: public BitField {}; - class DictionaryMap: public BitField {}; - class OwnsDescriptors: public BitField {}; - class HasInstanceCallHandler: public BitField {}; - class Deprecated: public BitField {}; - class IsFrozen: public BitField {}; - class IsUnstable: public BitField {}; - class IsMigrationTarget: public BitField {}; + class DictionaryMap: public BitField {}; + class OwnsDescriptors: public BitField {}; + class HasInstanceCallHandler: public BitField {}; + class Deprecated: public BitField {}; + class IsFrozen: public BitField {}; + class IsUnstable: public BitField {}; + class IsMigrationTarget: public BitField {}; // Tells whether the object in the prototype property will be used // for instances created from this function. If the prototype @@ -6481,7 +6480,8 @@ class Map: public HeapObject { // Layout description. static const int kInstanceSizesOffset = HeapObject::kHeaderSize; static const int kInstanceAttributesOffset = kInstanceSizesOffset + kIntSize; - static const int kPrototypeOffset = kInstanceAttributesOffset + kIntSize; + static const int kBitField3Offset = kInstanceAttributesOffset + kIntSize; + static const int kPrototypeOffset = kBitField3Offset + kPointerSize; static const int kConstructorOffset = kPrototypeOffset + kPointerSize; // Storage for the transition array is overloaded to directly contain a back // pointer if unused. When the map has transitions, the back pointer is @@ -6493,13 +6493,12 @@ class Map: public HeapObject { kTransitionsOrBackPointerOffset + kPointerSize; static const int kCodeCacheOffset = kDescriptorsOffset + kPointerSize; static const int kDependentCodeOffset = kCodeCacheOffset + kPointerSize; - static const int kBitField3Offset = kDependentCodeOffset + kPointerSize; - static const int kSize = kBitField3Offset + kPointerSize; + static const int kSize = kDependentCodeOffset + kPointerSize; // Layout of pointer fields. Heap iteration code relies on them // being continuously allocated. static const int kPointerFieldsBeginOffset = Map::kPrototypeOffset; - static const int kPointerFieldsEndOffset = kBitField3Offset + kPointerSize; + static const int kPointerFieldsEndOffset = kSize; // Byte offsets within kInstanceSizesOffset. static const int kInstanceSizeOffset = kInstanceSizesOffset + 0; @@ -6521,14 +6520,14 @@ class Map: public HeapObject { STATIC_CHECK(kInstanceTypeOffset == Internals::kMapInstanceTypeOffset); // Bit positions for bit field. - static const int kUnused = 0; // To be used for marking recently used maps. - static const int kHasNonInstancePrototype = 1; - static const int kIsHiddenPrototype = 2; - static const int kHasNamedInterceptor = 3; - static const int kHasIndexedInterceptor = 4; - static const int kIsUndetectable = 5; - static const int kIsObserved = 6; - static const int kIsAccessCheckNeeded = 7; + static const int kHasNonInstancePrototype = 0; + static const int kIsHiddenPrototype = 1; + static const int kHasNamedInterceptor = 2; + static const int kHasIndexedInterceptor = 3; + static const int kIsUndetectable = 4; + static const int kIsObserved = 5; + static const int kIsAccessCheckNeeded = 6; + class FunctionWithPrototype: public BitField {}; // Bit positions for bit field 2 static const int kIsExtensible = 0; diff --git a/src/x64/full-codegen-x64.cc b/src/x64/full-codegen-x64.cc index 9759fce..1f03fbf 100644 --- a/src/x64/full-codegen-x64.cc +++ b/src/x64/full-codegen-x64.cc @@ -2947,10 +2947,7 @@ void FullCodeGenerator::EmitIsStringWrapperSafeForDefaultValueOf( // rcx: valid entries in the descriptor array. // Calculate the end of the descriptor array. __ imulp(rcx, rcx, Immediate(DescriptorArray::kDescriptorSize)); - SmiIndex index = masm_->SmiToIndex(rdx, rcx, kPointerSizeLog2); - __ leap(rcx, - Operand( - r8, index.reg, index.scale, DescriptorArray::kFirstOffset)); + __ leap(rcx, Operand(r8, rcx, times_8, DescriptorArray::kFirstOffset)); // Calculate location of the first key name. __ addp(r8, Immediate(DescriptorArray::kFirstOffset)); // Loop through all the keys in the descriptor array. If one of these is the diff --git a/src/x64/macro-assembler-x64.cc b/src/x64/macro-assembler-x64.cc index 17db9bf..e1ce8cb 100644 --- a/src/x64/macro-assembler-x64.cc +++ b/src/x64/macro-assembler-x64.cc @@ -3484,16 +3484,16 @@ void MacroAssembler::LoadInstanceDescriptors(Register map, void MacroAssembler::NumberOfOwnDescriptors(Register dst, Register map) { - movp(dst, FieldOperand(map, Map::kBitField3Offset)); + movl(dst, FieldOperand(map, Map::kBitField3Offset)); DecodeField(dst); } void MacroAssembler::EnumLength(Register dst, Register map) { STATIC_ASSERT(Map::EnumLengthBits::kShift == 0); - movp(dst, FieldOperand(map, Map::kBitField3Offset)); - Move(kScratchRegister, Smi::FromInt(Map::EnumLengthBits::kMask)); - andp(dst, kScratchRegister); + movl(dst, FieldOperand(map, Map::kBitField3Offset)); + andl(dst, Immediate(Map::EnumLengthBits::kMask)); + Integer32ToSmi(dst, dst); } @@ -4959,9 +4959,8 @@ void MacroAssembler::CheckMapDeprecated(Handle map, Label* if_deprecated) { if (map->CanBeDeprecated()) { Move(scratch, map); - movp(scratch, FieldOperand(scratch, Map::kBitField3Offset)); - SmiToInteger32(scratch, scratch); - andp(scratch, Immediate(Map::Deprecated::kMask)); + movl(scratch, FieldOperand(scratch, Map::kBitField3Offset)); + andl(scratch, Immediate(Map::Deprecated::kMask)); j(not_zero, if_deprecated); } } diff --git a/src/x64/macro-assembler-x64.h b/src/x64/macro-assembler-x64.h index d9893d6..ddbe297 100644 --- a/src/x64/macro-assembler-x64.h +++ b/src/x64/macro-assembler-x64.h @@ -1011,11 +1011,10 @@ class MacroAssembler: public Assembler { template void DecodeField(Register reg) { - static const int shift = Field::kShift + kSmiShift; + static const int shift = Field::kShift; static const int mask = Field::kMask >> Field::kShift; shrp(reg, Immediate(shift)); andp(reg, Immediate(mask)); - shlp(reg, Immediate(kSmiShift)); } // Abort execution if argument is not a number, enabled via --debug-code.