From ec195cd9298dbd9785be4769df043d85fce21a16 Mon Sep 17 00:00:00 2001 From: "verwaest@chromium.org" Date: Fri, 9 May 2014 13:18:25 +0000 Subject: [PATCH] Make BitField3 a raw uint32 field, and move to the start of the map. BUG= R=bmeurer@chromium.org Review URL: https://codereview.chromium.org/272163002 git-svn-id: https://v8.googlecode.com/svn/branches/bleeding_edge@21225 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/arm/full-codegen-arm.cc | 2 +- src/arm/macro-assembler-arm.cc | 5 +++-- src/arm/macro-assembler-arm.h | 2 +- src/arm64/macro-assembler-arm64.cc | 9 ++++----- src/arm64/macro-assembler-arm64.h | 2 +- src/ia32/full-codegen-ia32.cc | 2 +- src/ia32/macro-assembler-ia32.cc | 5 +++-- src/ia32/macro-assembler-ia32.h | 2 +- src/objects-inl.h | 11 +++++------ src/objects.h | 8 ++++---- src/x64/full-codegen-x64.cc | 7 ++----- src/x64/macro-assembler-x64.cc | 13 ++++++------- src/x64/macro-assembler-x64.h | 7 +++---- 13 files changed, 35 insertions(+), 40 deletions(-) diff --git a/src/arm/full-codegen-arm.cc b/src/arm/full-codegen-arm.cc index c22caa4a81..baea557eec 100644 --- a/src/arm/full-codegen-arm.cc +++ b/src/arm/full-codegen-arm.cc @@ -3047,7 +3047,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 9752622447..ac8a7d3193 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 ba6f82571d..de705edaa3 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 4e447c4962..40b0782ac7 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 3479170c07..5dc1953638 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 f43b81d7e1..65abb46374 100644 --- a/src/ia32/full-codegen-ia32.cc +++ b/src/ia32/full-codegen-ia32.cc @@ -2986,7 +2986,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 6c97226e3f..f260026e03 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 6a1d7ef683..d9c83b8be7 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 029e80d9bb..6550e219ed 100644 --- a/src/objects-inl.h +++ b/src/objects-inl.h @@ -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.h b/src/objects.h index 3a00f40cdf..3777fb8b76 100644 --- a/src/objects.h +++ b/src/objects.h @@ -6481,7 +6481,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 +6494,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; diff --git a/src/x64/full-codegen-x64.cc b/src/x64/full-codegen-x64.cc index 475080553a..7bb185076c 100644 --- a/src/x64/full-codegen-x64.cc +++ b/src/x64/full-codegen-x64.cc @@ -2976,11 +2976,8 @@ void FullCodeGenerator::EmitIsStringWrapperSafeForDefaultValueOf( // rbx: descriptor array. // 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)); + __ imull(rcx, rcx, Immediate(DescriptorArray::kDescriptorSize)); + __ leal(rcx, Operand(r8, rcx, times_4, 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 17db9bf1a5..e1ce8cbf79 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 d9893d6210..8f0d6724e0 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)); + shrl(reg, Immediate(shift)); + andl(reg, Immediate(mask)); } // Abort execution if argument is not a number, enabled via --debug-code.