summaryrefslogtreecommitdiff
path: root/deps/v8/src/builtins/builtins-internal-gen.cc
diff options
context:
space:
mode:
authorMichaël Zasso <targos@protonmail.com>2021-06-08 14:04:59 +0200
committerMichaël Zasso <targos@protonmail.com>2021-06-10 11:10:13 +0200
commita7cbf19a82c75e9a65e90fb8ba4947e2fc52ef39 (patch)
treedadfaa9c63c5d8db997b7c7aacc313b04131157c /deps/v8/src/builtins/builtins-internal-gen.cc
parent8834ec9f5c522f7d800d85b245a9806418515b7c (diff)
downloadnode-new-a7cbf19a82c75e9a65e90fb8ba4947e2fc52ef39.tar.gz
deps: update V8 to 9.1.269.36
PR-URL: https://github.com/nodejs/node/pull/38273 Reviewed-By: Jiawen Geng <technicalcute@gmail.com> Reviewed-By: Colin Ihrig <cjihrig@gmail.com> Reviewed-By: Antoine du Hamel <duhamelantoine1995@gmail.com> Reviewed-By: Michael Dawson <midawson@redhat.com> Reviewed-By: Mary Marchini <oss@mmarchini.me>
Diffstat (limited to 'deps/v8/src/builtins/builtins-internal-gen.cc')
-rw-r--r--deps/v8/src/builtins/builtins-internal-gen.cc108
1 files changed, 64 insertions, 44 deletions
diff --git a/deps/v8/src/builtins/builtins-internal-gen.cc b/deps/v8/src/builtins/builtins-internal-gen.cc
index 29cca9d93a..0c4131dba9 100644
--- a/deps/v8/src/builtins/builtins-internal-gen.cc
+++ b/deps/v8/src/builtins/builtins-internal-gen.cc
@@ -312,6 +312,9 @@ TF_BUILTIN(RecordWrite, RecordWriteCodeStubAssembler) {
Label incremental_wb(this);
Label exit(this);
+ // In this method we limit the allocatable registers so we have to use
+ // UncheckedParameter. Parameter does not work because the checked cast needs
+ // more registers.
auto remembered_set = UncheckedParameter<Smi>(Descriptor::kRememberedSet);
Branch(ShouldEmitRememberSet(remembered_set), &generational_wb,
&incremental_wb);
@@ -333,8 +336,7 @@ TF_BUILTIN(RecordWrite, RecordWriteCodeStubAssembler) {
BIND(&test_old_to_young_flags);
{
// TODO(ishell): do a new-space range check instead.
- TNode<IntPtrT> value =
- BitcastTaggedToWord(Load(MachineType::TaggedPointer(), slot));
+ TNode<IntPtrT> value = BitcastTaggedToWord(Load<HeapObject>(slot));
// TODO(albertnetymk): Try to cache the page flag for value and object,
// instead of calling IsPageFlagSet each time.
@@ -343,7 +345,7 @@ TF_BUILTIN(RecordWrite, RecordWriteCodeStubAssembler) {
GotoIfNot(value_is_young, &incremental_wb);
TNode<IntPtrT> object =
- BitcastTaggedToWord(UntypedParameter(Descriptor::kObject));
+ BitcastTaggedToWord(UncheckedParameter<Object>(Descriptor::kObject));
TNode<BoolT> object_is_young =
IsPageFlagSet(object, MemoryChunk::kIsInYoungGenerationMask);
Branch(object_is_young, &incremental_wb, &store_buffer_incremental_wb);
@@ -353,7 +355,7 @@ TF_BUILTIN(RecordWrite, RecordWriteCodeStubAssembler) {
{
auto fp_mode = UncheckedParameter<Smi>(Descriptor::kFPMode);
TNode<IntPtrT> object =
- BitcastTaggedToWord(UntypedParameter(Descriptor::kObject));
+ BitcastTaggedToWord(UncheckedParameter<Object>(Descriptor::kObject));
InsertIntoRememberedSetAndGoto(object, slot, fp_mode, &exit);
}
@@ -361,7 +363,7 @@ TF_BUILTIN(RecordWrite, RecordWriteCodeStubAssembler) {
{
auto fp_mode = UncheckedParameter<Smi>(Descriptor::kFPMode);
TNode<IntPtrT> object =
- BitcastTaggedToWord(UntypedParameter(Descriptor::kObject));
+ BitcastTaggedToWord(UncheckedParameter<Object>(Descriptor::kObject));
InsertIntoRememberedSetAndGoto(object, slot, fp_mode, &incremental_wb);
}
}
@@ -371,8 +373,7 @@ TF_BUILTIN(RecordWrite, RecordWriteCodeStubAssembler) {
Label call_incremental_wb(this);
auto slot = UncheckedParameter<IntPtrT>(Descriptor::kSlot);
- TNode<IntPtrT> value =
- BitcastTaggedToWord(Load(MachineType::TaggedPointer(), slot));
+ TNode<IntPtrT> value = BitcastTaggedToWord(Load<HeapObject>(slot));
// There are two cases we need to call incremental write barrier.
// 1) value_is_white
@@ -384,7 +385,7 @@ TF_BUILTIN(RecordWrite, RecordWriteCodeStubAssembler) {
&exit);
TNode<IntPtrT> object =
- BitcastTaggedToWord(UntypedParameter(Descriptor::kObject));
+ BitcastTaggedToWord(UncheckedParameter<Object>(Descriptor::kObject));
Branch(
IsPageFlagSet(object, MemoryChunk::kSkipEvacuationSlotsRecordingMask),
&exit, &call_incremental_wb);
@@ -395,7 +396,7 @@ TF_BUILTIN(RecordWrite, RecordWriteCodeStubAssembler) {
ExternalReference::write_barrier_marking_from_code_function());
auto fp_mode = UncheckedParameter<Smi>(Descriptor::kFPMode);
TNode<IntPtrT> object =
- BitcastTaggedToWord(UntypedParameter(Descriptor::kObject));
+ BitcastTaggedToWord(UncheckedParameter<Object>(Descriptor::kObject));
CallCFunction2WithCallerSavedRegistersMode<Int32T, IntPtrT, IntPtrT>(
function, object, slot, fp_mode, &exit);
}
@@ -413,9 +414,12 @@ TF_BUILTIN(EphemeronKeyBarrier, RecordWriteCodeStubAssembler) {
ExternalReference::ephemeron_key_write_barrier_function());
TNode<ExternalReference> isolate_constant =
ExternalConstant(ExternalReference::isolate_address(isolate()));
+ // In this method we limit the allocatable registers so we have to use
+ // UncheckedParameter. Parameter does not work because the checked cast needs
+ // more registers.
auto address = UncheckedParameter<IntPtrT>(Descriptor::kSlotAddress);
TNode<IntPtrT> object =
- BitcastTaggedToWord(UntypedParameter(Descriptor::kObject));
+ BitcastTaggedToWord(UncheckedParameter<Object>(Descriptor::kObject));
TNode<Smi> fp_mode = UncheckedParameter<Smi>(Descriptor::kFPMode);
CallCFunction3WithCallerSavedRegistersMode<Int32T, IntPtrT, IntPtrT,
ExternalReference>(
@@ -431,20 +435,10 @@ class DeletePropertyBaseAssembler : public AccessorAssembler {
explicit DeletePropertyBaseAssembler(compiler::CodeAssemblerState* state)
: AccessorAssembler(state) {}
- void DeleteDictionaryProperty(TNode<Object> receiver,
+ void DictionarySpecificDelete(TNode<JSReceiver> receiver,
TNode<NameDictionary> properties,
- TNode<Name> name, TNode<Context> context,
- Label* dont_delete, Label* notfound) {
- TVARIABLE(IntPtrT, var_name_index);
- Label dictionary_found(this, &var_name_index);
- NameDictionaryLookup<NameDictionary>(properties, name, &dictionary_found,
- &var_name_index, notfound);
-
- BIND(&dictionary_found);
- TNode<IntPtrT> key_index = var_name_index.value();
- TNode<Uint32T> details = LoadDetailsByKeyIndex(properties, key_index);
- GotoIf(IsSetWord32(details, PropertyDetails::kAttributesDontDeleteMask),
- dont_delete);
+ TNode<IntPtrT> key_index,
+ TNode<Context> context) {
// Overwrite the entry itself (see NameDictionary::SetEntry).
TNode<Oddball> filler = TheHoleConstant();
DCHECK(RootsTable::IsImmortalImmovable(RootIndex::kTheHoleValue));
@@ -468,9 +462,49 @@ class DeletePropertyBaseAssembler : public AccessorAssembler {
TNode<Smi> capacity = GetCapacity<NameDictionary>(properties);
GotoIf(SmiGreaterThan(new_nof, SmiShr(capacity, 2)), &shrinking_done);
GotoIf(SmiLessThan(new_nof, SmiConstant(16)), &shrinking_done);
- CallRuntime(Runtime::kShrinkPropertyDictionary, context, receiver);
+
+ TNode<NameDictionary> new_properties =
+ CAST(CallRuntime(Runtime::kShrinkNameDictionary, context, properties));
+
+ StoreJSReceiverPropertiesOrHash(receiver, new_properties);
+
Goto(&shrinking_done);
BIND(&shrinking_done);
+ }
+
+ void DictionarySpecificDelete(TNode<JSReceiver> receiver,
+ TNode<SwissNameDictionary> properties,
+ TNode<IntPtrT> key_index,
+ TNode<Context> context) {
+ Label shrunk(this), done(this);
+ TVARIABLE(SwissNameDictionary, shrunk_table);
+
+ SwissNameDictionaryDelete(properties, key_index, &shrunk, &shrunk_table);
+ Goto(&done);
+ BIND(&shrunk);
+ StoreJSReceiverPropertiesOrHash(receiver, shrunk_table.value());
+ Goto(&done);
+
+ BIND(&done);
+ }
+
+ template <typename Dictionary>
+ void DeleteDictionaryProperty(TNode<JSReceiver> receiver,
+ TNode<Dictionary> properties, TNode<Name> name,
+ TNode<Context> context, Label* dont_delete,
+ Label* notfound) {
+ TVARIABLE(IntPtrT, var_name_index);
+ Label dictionary_found(this, &var_name_index);
+ NameDictionaryLookup<Dictionary>(properties, name, &dictionary_found,
+ &var_name_index, notfound);
+
+ BIND(&dictionary_found);
+ TNode<IntPtrT> key_index = var_name_index.value();
+ TNode<Uint32T> details = LoadDetailsByKeyIndex(properties, key_index);
+ GotoIf(IsSetWord32(details, PropertyDetails::kAttributesDontDeleteMask),
+ dont_delete);
+
+ DictionarySpecificDelete(receiver, properties, key_index, context);
Return(TrueConstant());
}
@@ -487,11 +521,6 @@ TF_BUILTIN(DeleteProperty, DeletePropertyBaseAssembler) {
Label if_index(this, &var_index), if_unique_name(this), if_notunique(this),
if_notfound(this), slow(this), if_proxy(this);
- if (V8_DICT_MODE_PROTOTYPES_BOOL) {
- // TODO(v8:11167) remove once OrderedNameDictionary supported.
- GotoIf(Int32TrueConstant(), &slow);
- }
-
GotoIf(TaggedIsSmi(receiver), &slow);
TNode<Map> receiver_map = LoadMap(CAST(receiver));
TNode<Uint16T> instance_type = LoadMapInstanceType(receiver_map);
@@ -514,17 +543,17 @@ TF_BUILTIN(DeleteProperty, DeletePropertyBaseAssembler) {
Label dictionary(this), dont_delete(this);
GotoIf(IsDictionaryMap(receiver_map), &dictionary);
- // Fast properties need to clear recorded slots, which can only be done
- // in C++.
+ // Fast properties need to clear recorded slots and mark the deleted
+ // property as mutable, which can only be done in C++.
Goto(&slow);
BIND(&dictionary);
{
InvalidateValidityCellIfPrototype(receiver_map);
- TNode<NameDictionary> properties =
+ TNode<PropertyDictionary> properties =
CAST(LoadSlowProperties(CAST(receiver)));
- DeleteDictionaryProperty(receiver, properties, var_unique.value(),
+ DeleteDictionaryProperty(CAST(receiver), properties, var_unique.value(),
context, &dont_delete, &if_notfound);
}
@@ -926,7 +955,8 @@ void Builtins::Generate_MemMove(MacroAssembler* masm) {
// TODO(v8:11421): Remove #if once baseline compiler is ported to other
// architectures.
-#if V8_TARGET_ARCH_X64 || V8_TARGET_ARCH_ARM64
+#if V8_TARGET_ARCH_IA32 || V8_TARGET_ARCH_X64 || V8_TARGET_ARCH_ARM64 || \
+ V8_TARGET_ARCH_ARM
void Builtins::Generate_BaselineLeaveFrame(MacroAssembler* masm) {
EmitReturnBaseline(masm);
}
@@ -956,11 +986,6 @@ TF_BUILTIN(GetProperty, CodeStubAssembler) {
Label if_notfound(this), if_proxy(this, Label::kDeferred),
if_slow(this, Label::kDeferred);
- if (V8_DICT_MODE_PROTOTYPES_BOOL) {
- // TODO(v8:11167) remove once OrderedNameDictionary supported.
- GotoIf(Int32TrueConstant(), &if_slow);
- }
-
CodeStubAssembler::LookupPropertyInHolder lookup_property_in_holder =
[=](TNode<HeapObject> receiver, TNode<HeapObject> holder,
TNode<Map> holder_map, TNode<Int32T> holder_instance_type,
@@ -1016,11 +1041,6 @@ TF_BUILTIN(GetPropertyWithReceiver, CodeStubAssembler) {
Label if_notfound(this), if_proxy(this, Label::kDeferred),
if_slow(this, Label::kDeferred);
- if (V8_DICT_MODE_PROTOTYPES_BOOL) {
- // TODO(v8:11167) remove once OrderedNameDictionary supported.
- GotoIf(Int32TrueConstant(), &if_slow);
- }
-
CodeStubAssembler::LookupPropertyInHolder lookup_property_in_holder =
[=](TNode<HeapObject> receiver, TNode<HeapObject> holder,
TNode<Map> holder_map, TNode<Int32T> holder_instance_type,