Skip to content

Commit c8211b6

Browse files
verwaestCommit bot
authored andcommitted
Distinguish slow from fast sloppy arguments
BUG=v8:4137 LOG=n Review URL: https://codereview.chromium.org/1221713003 Cr-Commit-Position: refs/heads/master@{#29447}
1 parent 3f5d39a commit c8211b6

34 files changed

Lines changed: 467 additions & 450 deletions

include/v8.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6947,7 +6947,7 @@ class Internals {
69476947
static const int kJSObjectHeaderSize = 3 * kApiPointerSize;
69486948
static const int kFixedArrayHeaderSize = 2 * kApiPointerSize;
69496949
static const int kContextHeaderSize = 2 * kApiPointerSize;
6950-
static const int kContextEmbedderDataIndex = 80;
6950+
static const int kContextEmbedderDataIndex = 81;
69516951
static const int kFullStringRepresentationMask = 0x07;
69526952
static const int kStringEncodingMask = 0x4;
69536953
static const int kExternalTwoByteRepresentationTag = 0x02;

src/arm/code-stubs-arm.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1676,7 +1676,7 @@ void ArgumentsAccessStub::GenerateNewSloppyFast(MacroAssembler* masm) {
16761676
const int kNormalOffset =
16771677
Context::SlotOffset(Context::SLOPPY_ARGUMENTS_MAP_INDEX);
16781678
const int kAliasedOffset =
1679-
Context::SlotOffset(Context::ALIASED_ARGUMENTS_MAP_INDEX);
1679+
Context::SlotOffset(Context::FAST_ALIASED_ARGUMENTS_MAP_INDEX);
16801680

16811681
__ ldr(r4, MemOperand(cp, Context::SlotOffset(Context::GLOBAL_OBJECT_INDEX)));
16821682
__ ldr(r4, FieldMemOperand(r4, GlobalObject::kNativeContextOffset));

src/arm/lithium-codegen-arm.cc

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3225,7 +3225,8 @@ void LCodeGen::DoLoadKeyedExternalArray(LLoadKeyed* instr) {
32253225
case FAST_ELEMENTS:
32263226
case FAST_SMI_ELEMENTS:
32273227
case DICTIONARY_ELEMENTS:
3228-
case SLOPPY_ARGUMENTS_ELEMENTS:
3228+
case FAST_SLOPPY_ARGUMENTS_ELEMENTS:
3229+
case SLOW_SLOPPY_ARGUMENTS_ELEMENTS:
32293230
UNREACHABLE();
32303231
break;
32313232
}
@@ -4322,7 +4323,8 @@ void LCodeGen::DoStoreKeyedExternalArray(LStoreKeyed* instr) {
43224323
case FAST_HOLEY_ELEMENTS:
43234324
case FAST_HOLEY_SMI_ELEMENTS:
43244325
case DICTIONARY_ELEMENTS:
4325-
case SLOPPY_ARGUMENTS_ELEMENTS:
4326+
case FAST_SLOPPY_ARGUMENTS_ELEMENTS:
4327+
case SLOW_SLOPPY_ARGUMENTS_ELEMENTS:
43264328
UNREACHABLE();
43274329
break;
43284330
}

src/arm64/code-stubs-arm64.cc

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1880,8 +1880,9 @@ void ArgumentsAccessStub::GenerateNewSloppyFast(MacroAssembler* masm) {
18801880

18811881
__ Ldr(sloppy_args_map,
18821882
ContextMemOperand(global_ctx, Context::SLOPPY_ARGUMENTS_MAP_INDEX));
1883-
__ Ldr(aliased_args_map,
1884-
ContextMemOperand(global_ctx, Context::ALIASED_ARGUMENTS_MAP_INDEX));
1883+
__ Ldr(
1884+
aliased_args_map,
1885+
ContextMemOperand(global_ctx, Context::FAST_ALIASED_ARGUMENTS_MAP_INDEX));
18851886
__ Cmp(mapped_params, 0);
18861887
__ CmovX(sloppy_args_map, aliased_args_map, ne);
18871888

src/arm64/lithium-codegen-arm64.cc

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3481,7 +3481,8 @@ void LCodeGen::DoLoadKeyedExternal(LLoadKeyedExternal* instr) {
34813481
case FAST_ELEMENTS:
34823482
case FAST_SMI_ELEMENTS:
34833483
case DICTIONARY_ELEMENTS:
3484-
case SLOPPY_ARGUMENTS_ELEMENTS:
3484+
case FAST_SLOPPY_ARGUMENTS_ELEMENTS:
3485+
case SLOW_SLOPPY_ARGUMENTS_ELEMENTS:
34853486
UNREACHABLE();
34863487
break;
34873488
}
@@ -5192,7 +5193,8 @@ void LCodeGen::DoStoreKeyedExternal(LStoreKeyedExternal* instr) {
51925193
case FAST_HOLEY_ELEMENTS:
51935194
case FAST_HOLEY_SMI_ELEMENTS:
51945195
case DICTIONARY_ELEMENTS:
5195-
case SLOPPY_ARGUMENTS_ELEMENTS:
5196+
case FAST_SLOPPY_ARGUMENTS_ELEMENTS:
5197+
case SLOW_SLOPPY_ARGUMENTS_ELEMENTS:
51965198
UNREACHABLE();
51975199
break;
51985200
}

src/bootstrapper.cc

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1357,12 +1357,17 @@ void Genesis::InitializeGlobal(Handle<GlobalObject> global_object,
13571357
DCHECK(IsFastObjectElementsKind(map->elements_kind()));
13581358
}
13591359

1360-
{ // --- aliased arguments map
1361-
Handle<Map> map =
1362-
Map::Copy(isolate->sloppy_arguments_map(), "AliasedArguments");
1363-
map->set_elements_kind(SLOPPY_ARGUMENTS_ELEMENTS);
1360+
{ // --- fast and slow aliased arguments map
1361+
Handle<Map> map = isolate->sloppy_arguments_map();
1362+
map = Map::Copy(map, "FastAliasedArguments");
1363+
map->set_elements_kind(FAST_SLOPPY_ARGUMENTS_ELEMENTS);
1364+
DCHECK_EQ(2, map->pre_allocated_property_fields());
1365+
native_context()->set_fast_aliased_arguments_map(*map);
1366+
1367+
map = Map::Copy(map, "SlowAliasedArguments");
1368+
map->set_elements_kind(SLOW_SLOPPY_ARGUMENTS_ELEMENTS);
13641369
DCHECK_EQ(2, map->pre_allocated_property_fields());
1365-
native_context()->set_aliased_arguments_map(*map);
1370+
native_context()->set_slow_aliased_arguments_map(*map);
13661371
}
13671372

13681373
{ // --- strict mode arguments map
@@ -2438,7 +2443,14 @@ bool Genesis::InstallNatives() {
24382443
{
24392444
AccessorConstantDescriptor d(factory()->iterator_symbol(),
24402445
arguments_iterator, attribs);
2441-
Handle<Map> map(native_context()->aliased_arguments_map());
2446+
Handle<Map> map(native_context()->fast_aliased_arguments_map());
2447+
Map::EnsureDescriptorSlack(map, 1);
2448+
map->AppendDescriptor(&d);
2449+
}
2450+
{
2451+
AccessorConstantDescriptor d(factory()->iterator_symbol(),
2452+
arguments_iterator, attribs);
2453+
Handle<Map> map(native_context()->slow_aliased_arguments_map());
24422454
Map::EnsureDescriptorSlack(map, 1);
24432455
map->AppendDescriptor(&d);
24442456
}

src/code-stubs-hydrogen.cc

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2096,9 +2096,11 @@ HValue* CodeStubGraphBuilder<KeyedLoadGenericStub>::BuildCodeStub() {
20962096
}
20972097
kind_if.Else();
20982098

2099-
// The SLOPPY_ARGUMENTS_ELEMENTS check generates a "kind_if.Then"
2099+
// The SLOW_SLOPPY_ARGUMENTS_ELEMENTS check generates a "kind_if.Then"
2100+
STATIC_ASSERT(FAST_SLOPPY_ARGUMENTS_ELEMENTS <
2101+
SLOW_SLOPPY_ARGUMENTS_ELEMENTS);
21002102
BuildElementsKindLimitCheck(&kind_if, bit_field2,
2101-
SLOPPY_ARGUMENTS_ELEMENTS);
2103+
SLOW_SLOPPY_ARGUMENTS_ELEMENTS);
21022104
// Non-strict elements are not handled.
21032105
Add<HDeoptimize>(Deoptimizer::kNonStrictElementsInKeyedLoadGenericStub,
21042106
Deoptimizer::EAGER);

src/code-stubs.cc

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -810,7 +810,8 @@ void StoreElementStub::Generate(MacroAssembler* masm) {
810810
case DICTIONARY_ELEMENTS:
811811
ElementHandlerCompiler::GenerateStoreSlow(masm);
812812
break;
813-
case SLOPPY_ARGUMENTS_ELEMENTS:
813+
case FAST_SLOPPY_ARGUMENTS_ELEMENTS:
814+
case SLOW_SLOPPY_ARGUMENTS_ELEMENTS:
814815
UNREACHABLE();
815816
break;
816817
}

src/contexts.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,8 @@ enum BindingFlags {
138138
V(BOUND_FUNCTION_MAP_INDEX, Map, bound_function_map) \
139139
V(REGEXP_RESULT_MAP_INDEX, Map, regexp_result_map) \
140140
V(SLOPPY_ARGUMENTS_MAP_INDEX, Map, sloppy_arguments_map) \
141-
V(ALIASED_ARGUMENTS_MAP_INDEX, Map, aliased_arguments_map) \
141+
V(FAST_ALIASED_ARGUMENTS_MAP_INDEX, Map, fast_aliased_arguments_map) \
142+
V(SLOW_ALIASED_ARGUMENTS_MAP_INDEX, Map, slow_aliased_arguments_map) \
142143
V(STRICT_ARGUMENTS_MAP_INDEX, Map, strict_arguments_map) \
143144
V(MESSAGE_LISTENERS_INDEX, JSObject, message_listeners) \
144145
V(MAKE_MESSAGE_FUN_INDEX, JSFunction, make_message_fun) \
@@ -337,7 +338,8 @@ class Context: public FixedArray {
337338
GLOBAL_PROXY_INDEX = MIN_CONTEXT_SLOTS,
338339
SECURITY_TOKEN_INDEX,
339340
SLOPPY_ARGUMENTS_MAP_INDEX,
340-
ALIASED_ARGUMENTS_MAP_INDEX,
341+
FAST_ALIASED_ARGUMENTS_MAP_INDEX,
342+
SLOW_ALIASED_ARGUMENTS_MAP_INDEX,
341343
STRICT_ARGUMENTS_MAP_INDEX,
342344
REGEXP_RESULT_MAP_INDEX,
343345
SLOPPY_FUNCTION_MAP_INDEX,

src/elements-kind.cc

Lines changed: 2 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,8 @@ int ElementsKindToShiftSize(ElementsKind elements_kind) {
4444
case FAST_HOLEY_SMI_ELEMENTS:
4545
case FAST_HOLEY_ELEMENTS:
4646
case DICTIONARY_ELEMENTS:
47-
case SLOPPY_ARGUMENTS_ELEMENTS:
47+
case FAST_SLOPPY_ARGUMENTS_ELEMENTS:
48+
case SLOW_SLOPPY_ARGUMENTS_ELEMENTS:
4849
return kPointerSizeLog2;
4950
}
5051
UNREACHABLE();
@@ -134,21 +135,6 @@ ElementsKind GetNextTransitionElementsKind(ElementsKind kind) {
134135
}
135136

136137

137-
ElementsKind GetNextMoreGeneralFastElementsKind(ElementsKind elements_kind,
138-
bool allow_only_packed) {
139-
DCHECK(IsFastElementsKind(elements_kind));
140-
DCHECK(elements_kind != TERMINAL_FAST_ELEMENTS_KIND);
141-
while (true) {
142-
elements_kind = GetNextTransitionElementsKind(elements_kind);
143-
if (!IsFastHoleyElementsKind(elements_kind) || !allow_only_packed) {
144-
return elements_kind;
145-
}
146-
}
147-
UNREACHABLE();
148-
return TERMINAL_FAST_ELEMENTS_KIND;
149-
}
150-
151-
152138
static bool IsTypedArrayElementsKind(ElementsKind elements_kind) {
153139
return IsFixedTypedArrayElementsKind(elements_kind) ||
154140
IsExternalArrayElementsKind(elements_kind);

0 commit comments

Comments
 (0)