summaryrefslogtreecommitdiff
path: root/deps/v8/src/builtins/builtins-internal-gen.cc
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/src/builtins/builtins-internal-gen.cc')
-rw-r--r--deps/v8/src/builtins/builtins-internal-gen.cc176
1 files changed, 110 insertions, 66 deletions
diff --git a/deps/v8/src/builtins/builtins-internal-gen.cc b/deps/v8/src/builtins/builtins-internal-gen.cc
index 445c8c9517..0625b8affc 100644
--- a/deps/v8/src/builtins/builtins-internal-gen.cc
+++ b/deps/v8/src/builtins/builtins-internal-gen.cc
@@ -18,9 +18,6 @@
namespace v8 {
namespace internal {
-template <typename T>
-using TNode = compiler::TNode<T>;
-
// -----------------------------------------------------------------------------
// Stack checks.
@@ -32,12 +29,14 @@ void Builtins::Generate_StackCheck(MacroAssembler* masm) {
// TurboFan support builtins.
TF_BUILTIN(CopyFastSmiOrObjectElements, CodeStubAssembler) {
- Node* object = Parameter(Descriptor::kObject);
+ TNode<JSObject> js_object = CAST(Parameter(Descriptor::kObject));
// Load the {object}s elements.
- TNode<Object> source = LoadObjectField(object, JSObject::kElementsOffset);
- Node* target = CloneFixedArray(source, ExtractFixedArrayFlag::kFixedArrays);
- StoreObjectField(object, JSObject::kElementsOffset, target);
+ TNode<FixedArrayBase> source =
+ CAST(LoadObjectField(js_object, JSObject::kElementsOffset));
+ TNode<FixedArrayBase> target =
+ CloneFixedArray(source, ExtractFixedArrayFlag::kFixedArrays);
+ StoreObjectField(js_object, JSObject::kElementsOffset, target);
Return(target);
}
@@ -47,7 +46,7 @@ TF_BUILTIN(GrowFastDoubleElements, CodeStubAssembler) {
Node* context = Parameter(Descriptor::kContext);
Label runtime(this, Label::kDeferred);
- Node* elements = LoadElements(object);
+ TNode<FixedArrayBase> elements = LoadElements(object);
elements = TryGrowElementsCapacity(object, elements, PACKED_DOUBLE_ELEMENTS,
key, &runtime);
Return(elements);
@@ -62,7 +61,7 @@ TF_BUILTIN(GrowFastSmiOrObjectElements, CodeStubAssembler) {
Node* context = Parameter(Descriptor::kContext);
Label runtime(this, Label::kDeferred);
- Node* elements = LoadElements(object);
+ TNode<FixedArrayBase> elements = LoadElements(object);
elements =
TryGrowElementsCapacity(object, elements, PACKED_ELEMENTS, key, &runtime);
Return(elements);
@@ -274,25 +273,24 @@ class RecordWriteCodeStubAssembler : public CodeStubAssembler {
return TaggedEqual(remembered_set, SmiConstant(EMIT_REMEMBERED_SET));
}
- void CallCFunction1WithCallerSavedRegistersMode(MachineType return_type,
- MachineType arg0_type,
- Node* function, Node* arg0,
- Node* mode, Label* next) {
+ void CallCFunction2WithCallerSavedRegistersMode(
+ MachineType return_type, MachineType arg0_type, MachineType arg1_type,
+ Node* function, Node* arg0, Node* arg1, Node* mode, Label* next) {
Label dont_save_fp(this), save_fp(this);
Branch(ShouldSkipFPRegs(mode), &dont_save_fp, &save_fp);
BIND(&dont_save_fp);
{
- CallCFunctionWithCallerSavedRegisters(function, return_type,
- kDontSaveFPRegs,
- std::make_pair(arg0_type, arg0));
+ CallCFunctionWithCallerSavedRegisters(
+ function, return_type, kDontSaveFPRegs,
+ std::make_pair(arg0_type, arg0), std::make_pair(arg1_type, arg1));
Goto(next);
}
BIND(&save_fp);
{
- CallCFunctionWithCallerSavedRegisters(function, return_type,
- kSaveFPRegs,
- std::make_pair(arg0_type, arg0));
+ CallCFunctionWithCallerSavedRegisters(function, return_type, kSaveFPRegs,
+ std::make_pair(arg0_type, arg0),
+ std::make_pair(arg1_type, arg1));
Goto(next);
}
}
@@ -321,34 +319,82 @@ class RecordWriteCodeStubAssembler : public CodeStubAssembler {
}
}
- void InsertToStoreBufferAndGoto(Node* isolate, Node* slot, Node* mode,
- Label* next) {
- TNode<ExternalReference> store_buffer_top_addr =
- ExternalConstant(ExternalReference::store_buffer_top(this->isolate()));
- Node* store_buffer_top =
- Load(MachineType::Pointer(), store_buffer_top_addr);
- StoreNoWriteBarrier(MachineType::PointerRepresentation(), store_buffer_top,
- slot);
- TNode<WordT> new_store_buffer_top =
- IntPtrAdd(store_buffer_top, IntPtrConstant(kSystemPointerSize));
- StoreNoWriteBarrier(MachineType::PointerRepresentation(),
- store_buffer_top_addr, new_store_buffer_top);
-
- TNode<WordT> test =
- WordAnd(new_store_buffer_top,
- IntPtrConstant(Heap::store_buffer_mask_constant()));
-
- Label overflow(this);
- Branch(IntPtrEqual(test, IntPtrConstant(0)), &overflow, next);
-
- BIND(&overflow);
- {
- TNode<ExternalReference> function =
- ExternalConstant(ExternalReference::store_buffer_overflow_function());
- CallCFunction1WithCallerSavedRegistersMode(MachineType::Int32(),
- MachineType::Pointer(),
- function, isolate, mode, next);
- }
+ void InsertIntoRememberedSetAndGotoSlow(Node* isolate, TNode<IntPtrT> object,
+ TNode<IntPtrT> slot, Node* mode,
+ Label* next) {
+ TNode<IntPtrT> page = PageFromAddress(object);
+ TNode<ExternalReference> function =
+ ExternalConstant(ExternalReference::insert_remembered_set_function());
+ CallCFunction2WithCallerSavedRegistersMode(
+ MachineType::Int32(), MachineType::Pointer(), MachineType::Pointer(),
+ function, page, slot, mode, next);
+ }
+
+ void InsertIntoRememberedSetAndGoto(Node* isolate, TNode<IntPtrT> object,
+ TNode<IntPtrT> slot, Node* mode,
+ Label* next) {
+ Label slow_path(this);
+ TNode<IntPtrT> page = PageFromAddress(object);
+
+ // Load address of SlotSet
+ TNode<IntPtrT> slot_set_array = LoadSlotSetArray(page, &slow_path);
+ TNode<IntPtrT> slot_offset = IntPtrSub(slot, page);
+
+ // Load bucket
+ TNode<IntPtrT> bucket = LoadBucket(slot_set_array, slot_offset, &slow_path);
+
+ // Update cell
+ SetBitInCell(bucket, slot_offset);
+
+ Goto(next);
+
+ BIND(&slow_path);
+ InsertIntoRememberedSetAndGotoSlow(isolate, object, slot, mode, next);
+ }
+
+ TNode<IntPtrT> LoadSlotSetArray(TNode<IntPtrT> page, Label* slow_path) {
+ TNode<IntPtrT> slot_set_array = UncheckedCast<IntPtrT>(
+ Load(MachineType::Pointer(), page,
+ IntPtrConstant(MemoryChunk::kOldToNewSlotSetOffset)));
+ GotoIf(WordEqual(slot_set_array, IntPtrConstant(0)), slow_path);
+
+ return slot_set_array;
+ }
+
+ TNode<IntPtrT> LoadBucket(TNode<IntPtrT> slot_set_array,
+ TNode<WordT> slot_offset, Label* slow_path) {
+ // Assume here that SlotSet only contains of buckets
+ DCHECK_EQ(SlotSet::kSize, SlotSet::kBuckets * sizeof(SlotSet::Bucket));
+ TNode<WordT> bucket_index =
+ WordShr(slot_offset, SlotSet::kBitsPerBucketLog2 + kTaggedSizeLog2);
+ TNode<IntPtrT> bucket = UncheckedCast<IntPtrT>(
+ Load(MachineType::Pointer(), slot_set_array,
+ WordShl(bucket_index, kSystemPointerSizeLog2)));
+ GotoIf(WordEqual(bucket, IntPtrConstant(0)), slow_path);
+ return bucket;
+ }
+
+ void SetBitInCell(TNode<IntPtrT> bucket, TNode<WordT> slot_offset) {
+ // Load cell value
+ TNode<WordT> cell_offset = WordAnd(
+ WordShr(slot_offset, SlotSet::kBitsPerCellLog2 + kTaggedSizeLog2 -
+ SlotSet::kCellSizeBytesLog2),
+ IntPtrConstant((SlotSet::kCellsPerBucket - 1)
+ << SlotSet::kCellSizeBytesLog2));
+ TNode<IntPtrT> cell_address =
+ UncheckedCast<IntPtrT>(IntPtrAdd(bucket, cell_offset));
+ TNode<IntPtrT> old_cell_value =
+ ChangeInt32ToIntPtr(Load<Int32T>(cell_address));
+
+ // Calculate new cell value
+ TNode<WordT> bit_index = WordAnd(WordShr(slot_offset, kTaggedSizeLog2),
+ IntPtrConstant(SlotSet::kBitsPerCell - 1));
+ TNode<IntPtrT> new_cell_value = UncheckedCast<IntPtrT>(
+ WordOr(old_cell_value, WordShl(IntPtrConstant(1), bit_index)));
+
+ // Update cell value
+ StoreNoWriteBarrier(MachineRepresentation::kWord32, cell_address,
+ TruncateIntPtrToInt32(new_cell_value));
}
};
@@ -399,7 +445,10 @@ TF_BUILTIN(RecordWrite, RecordWriteCodeStubAssembler) {
TNode<ExternalReference> isolate_constant =
ExternalConstant(ExternalReference::isolate_address(isolate()));
Node* fp_mode = Parameter(Descriptor::kFPMode);
- InsertToStoreBufferAndGoto(isolate_constant, slot, fp_mode, &exit);
+ TNode<IntPtrT> object =
+ BitcastTaggedToWord(Parameter(Descriptor::kObject));
+ InsertIntoRememberedSetAndGoto(isolate_constant, object, slot, fp_mode,
+ &exit);
}
BIND(&store_buffer_incremental_wb);
@@ -407,8 +456,10 @@ TF_BUILTIN(RecordWrite, RecordWriteCodeStubAssembler) {
TNode<ExternalReference> isolate_constant =
ExternalConstant(ExternalReference::isolate_address(isolate()));
Node* fp_mode = Parameter(Descriptor::kFPMode);
- InsertToStoreBufferAndGoto(isolate_constant, slot, fp_mode,
- &incremental_wb);
+ TNode<IntPtrT> object =
+ BitcastTaggedToWord(Parameter(Descriptor::kObject));
+ InsertIntoRememberedSetAndGoto(isolate_constant, object, slot, fp_mode,
+ &incremental_wb);
}
}
@@ -532,8 +583,8 @@ TF_BUILTIN(DeleteProperty, DeletePropertyBaseAssembler) {
TNode<Smi> language_mode = CAST(Parameter(Descriptor::kLanguageMode));
TNode<Context> context = CAST(Parameter(Descriptor::kContext));
- VARIABLE(var_index, MachineType::PointerRepresentation());
- VARIABLE(var_unique, MachineRepresentation::kTagged, key);
+ TVARIABLE(IntPtrT, var_index);
+ TVARIABLE(Name, var_unique);
Label if_index(this), if_unique_name(this), if_notunique(this),
if_notfound(this), slow(this), if_proxy(this);
@@ -554,8 +605,7 @@ TF_BUILTIN(DeleteProperty, DeletePropertyBaseAssembler) {
BIND(&if_unique_name);
{
Comment("key is unique name");
- TNode<Name> unique = CAST(var_unique.value());
- CheckForAssociatedProtector(unique, &slow);
+ CheckForAssociatedProtector(var_unique.value(), &slow);
Label dictionary(this), dont_delete(this);
GotoIf(IsDictionaryMap(receiver_map), &dictionary);
@@ -570,8 +620,8 @@ TF_BUILTIN(DeleteProperty, DeletePropertyBaseAssembler) {
TNode<NameDictionary> properties =
CAST(LoadSlowProperties(CAST(receiver)));
- DeleteDictionaryProperty(receiver, properties, unique, context,
- &dont_delete, &if_notfound);
+ DeleteDictionaryProperty(receiver, properties, var_unique.value(),
+ context, &dont_delete, &if_notfound);
}
BIND(&dont_delete);
@@ -587,7 +637,7 @@ TF_BUILTIN(DeleteProperty, DeletePropertyBaseAssembler) {
{
// If the string was not found in the string table, then no object can
// have a property with that name.
- TryInternalizeString(key, &if_index, &var_index, &if_unique_name,
+ TryInternalizeString(CAST(key), &if_index, &var_index, &if_unique_name,
&var_unique, &if_notfound, &slow);
}
@@ -719,11 +769,11 @@ TF_BUILTIN(SetDataProperties, SetOrCopyDataPropertiesAssembler) {
}
TF_BUILTIN(ForInEnumerate, CodeStubAssembler) {
- Node* receiver = Parameter(Descriptor::kReceiver);
- Node* context = Parameter(Descriptor::kContext);
+ TNode<HeapObject> receiver = CAST(Parameter(Descriptor::kReceiver));
+ TNode<Context> context = CAST(Parameter(Descriptor::kContext));
Label if_empty(this), if_runtime(this, Label::kDeferred);
- Node* receiver_map = CheckEnumCache(receiver, &if_empty, &if_runtime);
+ TNode<Map> receiver_map = CheckEnumCache(receiver, &if_empty, &if_runtime);
Return(receiver_map);
BIND(&if_empty);
@@ -934,12 +984,6 @@ void Builtins::Generate_MemCopyUint8Uint8(MacroAssembler* masm) {
}
#endif // !defined(V8_TARGET_ARCH_ARM) && !defined(V8_TARGET_ARCH_MIPS)
-#ifndef V8_TARGET_ARCH_ARM
-void Builtins::Generate_MemCopyUint16Uint8(MacroAssembler* masm) {
- masm->Call(BUILTIN_CODE(masm->isolate(), Illegal), RelocInfo::CODE_TARGET);
-}
-#endif // V8_TARGET_ARCH_ARM
-
#ifndef V8_TARGET_ARCH_IA32
void Builtins::Generate_MemMove(MacroAssembler* masm) {
masm->Call(BUILTIN_CODE(masm->isolate(), Illegal), RelocInfo::CODE_TARGET);