Reviewers: Yang,
Description:
Convert ElementsKind into a BitField
Please review this at https://codereview.chromium.org/306513002/
SVN Base: https://v8.googlecode.com/svn/branches/bleeding_edge
Affected files (+31, -34 lines):
M src/arm/code-stubs-arm.cc
M src/arm/macro-assembler-arm.cc
M src/arm64/code-stubs-arm64.cc
M src/arm64/macro-assembler-arm64.cc
M src/ia32/code-stubs-ia32.cc
M src/ia32/macro-assembler-ia32.cc
M src/mips/code-stubs-mips.cc
M src/mips/macro-assembler-mips.cc
M src/objects.h
M src/x64/code-stubs-x64.cc
M src/x64/macro-assembler-x64.cc
M src/x87/code-stubs-x87.cc
M src/x87/macro-assembler-x87.cc
Index: src/arm/code-stubs-arm.cc
diff --git a/src/arm/code-stubs-arm.cc b/src/arm/code-stubs-arm.cc
index
585108b2bddf9bf60d3662d0627e642f57dd4545..d7281dcd903f27fed6cee14bfb07840e33ecab86
100644
--- a/src/arm/code-stubs-arm.cc
+++ b/src/arm/code-stubs-arm.cc
@@ -5134,7 +5134,7 @@ void
InternalArrayConstructorStub::Generate(MacroAssembler* masm) {
// but the following bit field extraction takes care of that anyway.
__ ldr(r3, FieldMemOperand(r3, Map::kBitField2Offset));
// Retrieve elements_kind from bit field 2.
- __ Ubfx(r3, r3, Map::kElementsKindShift, Map::kElementsKindBitCount);
+ __ Ubfx(r3, r3, Map::ElementsKindBits::kShift,
Map::ElementsKindBits::kSize);
if (FLAG_debug_code) {
Label done;
Index: src/arm/macro-assembler-arm.cc
diff --git a/src/arm/macro-assembler-arm.cc b/src/arm/macro-assembler-arm.cc
index
7b3028fbe6586694e36747058cee2cd48aeeb697..37f1e95b229d0f96f84f5b73d17ca020b9099253
100644
--- a/src/arm/macro-assembler-arm.cc
+++ b/src/arm/macro-assembler-arm.cc
@@ -3946,7 +3946,8 @@ void MacroAssembler::JumpIfDictionaryInPrototypeChain(
bind(&loop_again);
ldr(current, FieldMemOperand(current, HeapObject::kMapOffset));
ldr(scratch1, FieldMemOperand(current, Map::kBitField2Offset));
- Ubfx(scratch1, scratch1, Map::kElementsKindShift,
Map::kElementsKindBitCount);
+ Ubfx(scratch1, scratch1, Map::ElementsKindBits::kShift,
+ Map::ElementsKindBits::kSize);
cmp(scratch1, Operand(DICTIONARY_ELEMENTS));
b(eq, found);
ldr(current, FieldMemOperand(current, Map::kPrototypeOffset));
Index: src/arm64/code-stubs-arm64.cc
diff --git a/src/arm64/code-stubs-arm64.cc b/src/arm64/code-stubs-arm64.cc
index
d1185b23e131e0a1ed6565f4530a37d3750dff8b..7ab05f13dfb31172c23def58860ba8f1f13e9115
100644
--- a/src/arm64/code-stubs-arm64.cc
+++ b/src/arm64/code-stubs-arm64.cc
@@ -4687,7 +4687,7 @@ void
StoreArrayLiteralElementStub::Generate(MacroAssembler* masm) {
__ JumpIfSmi(value, &smi_element);
// Jump if array's ElementsKind is not FAST_ELEMENTS or
FAST_HOLEY_ELEMENTS.
- __ Tbnz(bitfield2, MaskToBit(FAST_ELEMENTS << Map::kElementsKindShift),
+ __ Tbnz(bitfield2, MaskToBit(FAST_ELEMENTS <<
Map::ElementsKindBits::kShift),
&fast_elements);
// Store into the array literal requires an elements transition. Call
into
Index: src/arm64/macro-assembler-arm64.cc
diff --git a/src/arm64/macro-assembler-arm64.cc
b/src/arm64/macro-assembler-arm64.cc
index
75fd2b62be2641cfcc875f9c068c3d7d691b7758..9b941420b3a58b12522c47468c23d72f2caf1c44
100644
--- a/src/arm64/macro-assembler-arm64.cc
+++ b/src/arm64/macro-assembler-arm64.cc
@@ -3764,7 +3764,8 @@ void MacroAssembler::LoadElementsKindFromMap(Register
result, Register map) {
// Load the map's "bit field 2".
__ Ldrb(result, FieldMemOperand(map, Map::kBitField2Offset));
// Retrieve elements_kind from bit field 2.
- __ Ubfx(result, result, Map::kElementsKindShift,
Map::kElementsKindBitCount);
+ __ Ubfx(result, result, Map::ElementsKindBits::kShift,
+ Map::ElementsKindBits::kSize);
}
@@ -4539,7 +4540,8 @@ void MacroAssembler::JumpIfDictionaryInPrototypeChain(
Bind(&loop_again);
Ldr(current, FieldMemOperand(current, HeapObject::kMapOffset));
Ldrb(scratch1, FieldMemOperand(current, Map::kBitField2Offset));
- Ubfx(scratch1, scratch1, Map::kElementsKindShift,
Map::kElementsKindBitCount);
+ Ubfx(scratch1, scratch1, Map::ElementsKindBits::kShift,
+ Map::ElementsKindBits::kSize);
CompareAndBranch(scratch1, DICTIONARY_ELEMENTS, eq, found);
Ldr(current, FieldMemOperand(current, Map::kPrototypeOffset));
CompareAndBranch(current, Operand(factory->null_value()), ne,
&loop_again);
Index: src/ia32/code-stubs-ia32.cc
diff --git a/src/ia32/code-stubs-ia32.cc b/src/ia32/code-stubs-ia32.cc
index
5547ba25e86294c7838a7885f0374535f4afb76c..b0a3d28acc298b9ec5a87875905d2246e6d3d7c2
100644
--- a/src/ia32/code-stubs-ia32.cc
+++ b/src/ia32/code-stubs-ia32.cc
@@ -4952,8 +4952,8 @@ void
InternalArrayConstructorStub::Generate(MacroAssembler* masm) {
// but the following masking takes care of that anyway.
__ mov(ecx, FieldOperand(ecx, Map::kBitField2Offset));
// Retrieve elements_kind from bit field 2.
- __ and_(ecx, Map::kElementsKindMask);
- __ shr(ecx, Map::kElementsKindShift);
+ __ and_(ecx, Map::ElementsKindBits::kMask);
+ __ shr(ecx, Map::ElementsKindBits::kShift);
if (FLAG_debug_code) {
Label done;
Index: src/ia32/macro-assembler-ia32.cc
diff --git a/src/ia32/macro-assembler-ia32.cc
b/src/ia32/macro-assembler-ia32.cc
index
a2d2280d2cc3e28823676ed0a638fae9f7957f69..2c57c189faa447e3016e84e9c0de8a0c24c9d632
100644
--- a/src/ia32/macro-assembler-ia32.cc
+++ b/src/ia32/macro-assembler-ia32.cc
@@ -3417,8 +3417,8 @@ void MacroAssembler::JumpIfDictionaryInPrototypeChain(
bind(&loop_again);
mov(current, FieldOperand(current, HeapObject::kMapOffset));
mov(scratch1, FieldOperand(current, Map::kBitField2Offset));
- and_(scratch1, Map::kElementsKindMask);
- shr(scratch1, Map::kElementsKindShift);
+ and_(scratch1, Map::ElementsKindBits::kMask);
+ shr(scratch1, Map::ElementsKindBits::kShift);
cmp(scratch1, Immediate(DICTIONARY_ELEMENTS));
j(equal, found);
mov(current, FieldOperand(current, Map::kPrototypeOffset));
Index: src/mips/code-stubs-mips.cc
diff --git a/src/mips/code-stubs-mips.cc b/src/mips/code-stubs-mips.cc
index
f47ab381fd7222363dd0fb71671e8663be1bbf9e..36a56f473dbea495149433135e104438de30a62a
100644
--- a/src/mips/code-stubs-mips.cc
+++ b/src/mips/code-stubs-mips.cc
@@ -5349,7 +5349,7 @@ void
InternalArrayConstructorStub::Generate(MacroAssembler* masm) {
// but the following bit field extraction takes care of that anyway.
__ lbu(a3, FieldMemOperand(a3, Map::kBitField2Offset));
// Retrieve elements_kind from bit field 2.
- __ Ext(a3, a3, Map::kElementsKindShift, Map::kElementsKindBitCount);
+ __ Ext(a3, a3, Map::ElementsKindBits::kShift,
Map::ElementsKindBits::kSize);
if (FLAG_debug_code) {
Label done;
Index: src/mips/macro-assembler-mips.cc
diff --git a/src/mips/macro-assembler-mips.cc
b/src/mips/macro-assembler-mips.cc
index
13e67a3f966f6ff788b1bd9039a7d58d17fa8d3f..b41efa92fe0dc68dcb2615ea6ebf8506fdda30b2
100644
--- a/src/mips/macro-assembler-mips.cc
+++ b/src/mips/macro-assembler-mips.cc
@@ -5627,7 +5627,8 @@ void MacroAssembler::JumpIfDictionaryInPrototypeChain(
bind(&loop_again);
lw(current, FieldMemOperand(current, HeapObject::kMapOffset));
lb(scratch1, FieldMemOperand(current, Map::kBitField2Offset));
- Ext(scratch1, scratch1, Map::kElementsKindShift,
Map::kElementsKindBitCount);
+ Ext(scratch1, scratch1, Map::ElementsKindBits::kShift,
+ Map::ElementsKindBits::kSize);
Branch(found, eq, scratch1, Operand(DICTIONARY_ELEMENTS));
lw(current, FieldMemOperand(current, Map::kPrototypeOffset));
Branch(&loop_again, ne, current, Operand(factory->null_value()));
Index: src/objects.h
diff --git a/src/objects.h b/src/objects.h
index
8ef7f20231f5e5a0d77bae8321462db95affe69e..e89efdf471a5d624595e45acf7c074a824bc66a2
100644
--- a/src/objects.h
+++ b/src/objects.h
@@ -6084,15 +6084,13 @@ class Map: public HeapObject {
inline void set_elements_kind(ElementsKind elements_kind) {
ASSERT(elements_kind < kElementsKindCount);
- ASSERT(kElementsKindCount <= (1 << kElementsKindBitCount));
- set_bit_field2((bit_field2() & ~kElementsKindMask) |
- (elements_kind << kElementsKindShift));
+ ASSERT(kElementsKindCount <= (1 << Map::ElementsKindBits::kSize));
+ set_bit_field2(Map::ElementsKindBits::update(bit_field2(),
elements_kind));
ASSERT(this->elements_kind() == elements_kind);
}
inline ElementsKind elements_kind() {
- return static_cast<ElementsKind>(
- (bit_field2() & kElementsKindMask) >> kElementsKindShift);
+ return Map::ElementsKindBits::decode(bit_field2());
}
// Tells whether the instance has fast elements that are only Smis.
@@ -6573,25 +6571,20 @@ class Map: public HeapObject {
static const int kIsExtensible = 0;
static const int kStringWrapperSafeForDefaultValueOf = 1;
// Currently bit 2 is not used.
- // No bits can be used after kElementsKindFirstBit, they are all
reserved for
- // storing ElementKind.
- static const int kElementsKindShift = 3;
- static const int kElementsKindBitCount = 5;
+ class ElementsKindBits: public BitField<ElementsKind, 3, 5> {};
// Derived values from bit field 2
- static const int kElementsKindMask = (-1 << kElementsKindShift) &
- ((1 << (kElementsKindShift + kElementsKindBitCount)) - 1);
static const int8_t kMaximumBitField2FastElementValue =
static_cast<int8_t>(
- (FAST_ELEMENTS + 1) << Map::kElementsKindShift) - 1;
+ (FAST_ELEMENTS + 1) << Map::ElementsKindBits::kShift) - 1;
static const int8_t kMaximumBitField2FastSmiElementValue =
static_cast<int8_t>((FAST_SMI_ELEMENTS + 1) <<
- Map::kElementsKindShift) - 1;
+ Map::ElementsKindBits::kShift) - 1;
static const int8_t kMaximumBitField2FastHoleyElementValue =
static_cast<int8_t>((FAST_HOLEY_ELEMENTS + 1) <<
- Map::kElementsKindShift) - 1;
+ Map::ElementsKindBits::kShift) - 1;
static const int8_t kMaximumBitField2FastHoleySmiElementValue =
static_cast<int8_t>((FAST_HOLEY_SMI_ELEMENTS + 1) <<
- Map::kElementsKindShift) - 1;
+ Map::ElementsKindBits::kShift) - 1;
typedef FixedBodyDescriptor<kPointerFieldsBeginOffset,
kPointerFieldsEndOffset,
Index: src/x64/code-stubs-x64.cc
diff --git a/src/x64/code-stubs-x64.cc b/src/x64/code-stubs-x64.cc
index
a63288f2cb59ee4df39109fff6e69e3384ebbfb2..a46a8311a070ddc025a9baad5d49e059b53e0268
100644
--- a/src/x64/code-stubs-x64.cc
+++ b/src/x64/code-stubs-x64.cc
@@ -4895,8 +4895,8 @@ void
InternalArrayConstructorStub::Generate(MacroAssembler* masm) {
// but the following masking takes care of that anyway.
__ movzxbp(rcx, FieldOperand(rcx, Map::kBitField2Offset));
// Retrieve elements_kind from bit field 2.
- __ andp(rcx, Immediate(Map::kElementsKindMask));
- __ shrp(rcx, Immediate(Map::kElementsKindShift));
+ __ andp(rcx, Immediate(Map::ElementsKindBits::kMask));
+ __ shrp(rcx, Immediate(Map::ElementsKindBits::kShift));
if (FLAG_debug_code) {
Label done;
Index: src/x64/macro-assembler-x64.cc
diff --git a/src/x64/macro-assembler-x64.cc b/src/x64/macro-assembler-x64.cc
index
6873efff67d39f7a948b634b24c4f9c768a79c30..c6245d6d63cc570e1344c0da40499a173d02c369
100644
--- a/src/x64/macro-assembler-x64.cc
+++ b/src/x64/macro-assembler-x64.cc
@@ -5192,8 +5192,8 @@ void MacroAssembler::JumpIfDictionaryInPrototypeChain(
bind(&loop_again);
movp(current, FieldOperand(current, HeapObject::kMapOffset));
movp(scratch1, FieldOperand(current, Map::kBitField2Offset));
- andp(scratch1, Immediate(Map::kElementsKindMask));
- shrp(scratch1, Immediate(Map::kElementsKindShift));
+ andp(scratch1, Immediate(Map::ElementsKindBits::kMask));
+ shrp(scratch1, Immediate(Map::ElementsKindBits::kShift));
cmpp(scratch1, Immediate(DICTIONARY_ELEMENTS));
j(equal, found);
movp(current, FieldOperand(current, Map::kPrototypeOffset));
Index: src/x87/code-stubs-x87.cc
diff --git a/src/x87/code-stubs-x87.cc b/src/x87/code-stubs-x87.cc
index
2c95ad1a4837115c8e46b81f129961a424a21563..3891b7535f5dde2f524643288d8600915a614782
100644
--- a/src/x87/code-stubs-x87.cc
+++ b/src/x87/code-stubs-x87.cc
@@ -4592,8 +4592,8 @@ void
InternalArrayConstructorStub::Generate(MacroAssembler* masm) {
// but the following masking takes care of that anyway.
__ mov(ecx, FieldOperand(ecx, Map::kBitField2Offset));
// Retrieve elements_kind from bit field 2.
- __ and_(ecx, Map::kElementsKindMask);
- __ shr(ecx, Map::kElementsKindShift);
+ __ and_(ecx, Map::ElementsKindBits::kMask);
+ __ shr(ecx, Map::ElementsKindBits::kShift);
if (FLAG_debug_code) {
Label done;
Index: src/x87/macro-assembler-x87.cc
diff --git a/src/x87/macro-assembler-x87.cc b/src/x87/macro-assembler-x87.cc
index
57fb53a3200716319542effea1cae1b667908c23..f2fc77ac990c55dcbb0357622046723350d9eb0e
100644
--- a/src/x87/macro-assembler-x87.cc
+++ b/src/x87/macro-assembler-x87.cc
@@ -3304,8 +3304,8 @@ void MacroAssembler::JumpIfDictionaryInPrototypeChain(
bind(&loop_again);
mov(current, FieldOperand(current, HeapObject::kMapOffset));
mov(scratch1, FieldOperand(current, Map::kBitField2Offset));
- and_(scratch1, Map::kElementsKindMask);
- shr(scratch1, Map::kElementsKindShift);
+ and_(scratch1, Map::ElementsKindBits::kMask);
+ shr(scratch1, Map::ElementsKindBits::kShift);
cmp(scratch1, Immediate(DICTIONARY_ELEMENTS));
j(equal, found);
mov(current, FieldOperand(current, Map::kPrototypeOffset));
--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
---
You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.