Commit 913da29e authored by jkummerow's avatar jkummerow Committed by Commit bot

[refactoring] Split CodeAssemblerState out of CodeAssembler

This is in preparation for introducing more specialized
CodeStubAssembler subclasses. The state object can be handed
around, while the Assembler instances are temporary-scoped.

BUG=v8:5628

Review-Url: https://codereview.chromium.org/2498073002
Cr-Commit-Position: refs/heads/master@{#41015}
parent 879f6599
This diff is collapsed.
...@@ -34,28 +34,32 @@ BUILTIN(BooleanConstructor_ConstructStub) { ...@@ -34,28 +34,32 @@ BUILTIN(BooleanConstructor_ConstructStub) {
} }
// ES6 section 19.3.3.2 Boolean.prototype.toString ( ) // ES6 section 19.3.3.2 Boolean.prototype.toString ( )
void Builtins::Generate_BooleanPrototypeToString(CodeStubAssembler* assembler) { void Builtins::Generate_BooleanPrototypeToString(
compiler::CodeAssemblerState* state) {
typedef compiler::Node Node; typedef compiler::Node Node;
CodeStubAssembler assembler(state);
Node* receiver = assembler->Parameter(0); Node* receiver = assembler.Parameter(0);
Node* context = assembler->Parameter(3); Node* context = assembler.Parameter(3);
Node* value = assembler->ToThisValue( Node* value = assembler.ToThisValue(
context, receiver, PrimitiveType::kBoolean, "Boolean.prototype.toString"); context, receiver, PrimitiveType::kBoolean, "Boolean.prototype.toString");
Node* result = assembler->LoadObjectField(value, Oddball::kToStringOffset); Node* result = assembler.LoadObjectField(value, Oddball::kToStringOffset);
assembler->Return(result); assembler.Return(result);
} }
// ES6 section 19.3.3.3 Boolean.prototype.valueOf ( ) // ES6 section 19.3.3.3 Boolean.prototype.valueOf ( )
void Builtins::Generate_BooleanPrototypeValueOf(CodeStubAssembler* assembler) { void Builtins::Generate_BooleanPrototypeValueOf(
compiler::CodeAssemblerState* state) {
typedef compiler::Node Node; typedef compiler::Node Node;
CodeStubAssembler assembler(state);
Node* receiver = assembler->Parameter(0); Node* receiver = assembler.Parameter(0);
Node* context = assembler->Parameter(3); Node* context = assembler.Parameter(3);
Node* result = assembler->ToThisValue( Node* result = assembler.ToThisValue(
context, receiver, PrimitiveType::kBoolean, "Boolean.prototype.valueOf"); context, receiver, PrimitiveType::kBoolean, "Boolean.prototype.valueOf");
assembler->Return(result); assembler.Return(result);
} }
} // namespace internal } // namespace internal
......
This diff is collapsed.
...@@ -908,8 +908,9 @@ BUILTIN(DatePrototypeToJson) { ...@@ -908,8 +908,9 @@ BUILTIN(DatePrototypeToJson) {
} }
} }
// static namespace {
void Builtins::Generate_DatePrototype_GetField(CodeStubAssembler* assembler,
void Generate_DatePrototype_GetField(CodeStubAssembler* assembler,
int field_index) { int field_index) {
typedef CodeStubAssembler::Label Label; typedef CodeStubAssembler::Label Label;
typedef compiler::Node Node; typedef compiler::Node Node;
...@@ -965,100 +966,132 @@ void Builtins::Generate_DatePrototype_GetField(CodeStubAssembler* assembler, ...@@ -965,100 +966,132 @@ void Builtins::Generate_DatePrototype_GetField(CodeStubAssembler* assembler,
} }
} }
} // namespace
// static // static
void Builtins::Generate_DatePrototypeGetDate(CodeStubAssembler* assembler) { void Builtins::Generate_DatePrototypeGetDate(
Generate_DatePrototype_GetField(assembler, JSDate::kDay); compiler::CodeAssemblerState* state) {
CodeStubAssembler assembler(state);
Generate_DatePrototype_GetField(&assembler, JSDate::kDay);
} }
// static // static
void Builtins::Generate_DatePrototypeGetDay(CodeStubAssembler* assembler) { void Builtins::Generate_DatePrototypeGetDay(
Generate_DatePrototype_GetField(assembler, JSDate::kWeekday); compiler::CodeAssemblerState* state) {
CodeStubAssembler assembler(state);
Generate_DatePrototype_GetField(&assembler, JSDate::kWeekday);
} }
// static // static
void Builtins::Generate_DatePrototypeGetFullYear(CodeStubAssembler* assembler) { void Builtins::Generate_DatePrototypeGetFullYear(
Generate_DatePrototype_GetField(assembler, JSDate::kYear); compiler::CodeAssemblerState* state) {
CodeStubAssembler assembler(state);
Generate_DatePrototype_GetField(&assembler, JSDate::kYear);
} }
// static // static
void Builtins::Generate_DatePrototypeGetHours(CodeStubAssembler* assembler) { void Builtins::Generate_DatePrototypeGetHours(
Generate_DatePrototype_GetField(assembler, JSDate::kHour); compiler::CodeAssemblerState* state) {
CodeStubAssembler assembler(state);
Generate_DatePrototype_GetField(&assembler, JSDate::kHour);
} }
// static // static
void Builtins::Generate_DatePrototypeGetMilliseconds( void Builtins::Generate_DatePrototypeGetMilliseconds(
CodeStubAssembler* assembler) { compiler::CodeAssemblerState* state) {
Generate_DatePrototype_GetField(assembler, JSDate::kMillisecond); CodeStubAssembler assembler(state);
Generate_DatePrototype_GetField(&assembler, JSDate::kMillisecond);
} }
// static // static
void Builtins::Generate_DatePrototypeGetMinutes(CodeStubAssembler* assembler) { void Builtins::Generate_DatePrototypeGetMinutes(
Generate_DatePrototype_GetField(assembler, JSDate::kMinute); compiler::CodeAssemblerState* state) {
CodeStubAssembler assembler(state);
Generate_DatePrototype_GetField(&assembler, JSDate::kMinute);
} }
// static // static
void Builtins::Generate_DatePrototypeGetMonth(CodeStubAssembler* assembler) { void Builtins::Generate_DatePrototypeGetMonth(
Generate_DatePrototype_GetField(assembler, JSDate::kMonth); compiler::CodeAssemblerState* state) {
CodeStubAssembler assembler(state);
Generate_DatePrototype_GetField(&assembler, JSDate::kMonth);
} }
// static // static
void Builtins::Generate_DatePrototypeGetSeconds(CodeStubAssembler* assembler) { void Builtins::Generate_DatePrototypeGetSeconds(
Generate_DatePrototype_GetField(assembler, JSDate::kSecond); compiler::CodeAssemblerState* state) {
CodeStubAssembler assembler(state);
Generate_DatePrototype_GetField(&assembler, JSDate::kSecond);
} }
// static // static
void Builtins::Generate_DatePrototypeGetTime(CodeStubAssembler* assembler) { void Builtins::Generate_DatePrototypeGetTime(
Generate_DatePrototype_GetField(assembler, JSDate::kDateValue); compiler::CodeAssemblerState* state) {
CodeStubAssembler assembler(state);
Generate_DatePrototype_GetField(&assembler, JSDate::kDateValue);
} }
// static // static
void Builtins::Generate_DatePrototypeGetTimezoneOffset( void Builtins::Generate_DatePrototypeGetTimezoneOffset(
CodeStubAssembler* assembler) { compiler::CodeAssemblerState* state) {
Generate_DatePrototype_GetField(assembler, JSDate::kTimezoneOffset); CodeStubAssembler assembler(state);
Generate_DatePrototype_GetField(&assembler, JSDate::kTimezoneOffset);
} }
// static // static
void Builtins::Generate_DatePrototypeGetUTCDate(CodeStubAssembler* assembler) { void Builtins::Generate_DatePrototypeGetUTCDate(
Generate_DatePrototype_GetField(assembler, JSDate::kDayUTC); compiler::CodeAssemblerState* state) {
CodeStubAssembler assembler(state);
Generate_DatePrototype_GetField(&assembler, JSDate::kDayUTC);
} }
// static // static
void Builtins::Generate_DatePrototypeGetUTCDay(CodeStubAssembler* assembler) { void Builtins::Generate_DatePrototypeGetUTCDay(
Generate_DatePrototype_GetField(assembler, JSDate::kWeekdayUTC); compiler::CodeAssemblerState* state) {
CodeStubAssembler assembler(state);
Generate_DatePrototype_GetField(&assembler, JSDate::kWeekdayUTC);
} }
// static // static
void Builtins::Generate_DatePrototypeGetUTCFullYear( void Builtins::Generate_DatePrototypeGetUTCFullYear(
CodeStubAssembler* assembler) { compiler::CodeAssemblerState* state) {
Generate_DatePrototype_GetField(assembler, JSDate::kYearUTC); CodeStubAssembler assembler(state);
Generate_DatePrototype_GetField(&assembler, JSDate::kYearUTC);
} }
// static // static
void Builtins::Generate_DatePrototypeGetUTCHours(CodeStubAssembler* assembler) { void Builtins::Generate_DatePrototypeGetUTCHours(
Generate_DatePrototype_GetField(assembler, JSDate::kHourUTC); compiler::CodeAssemblerState* state) {
CodeStubAssembler assembler(state);
Generate_DatePrototype_GetField(&assembler, JSDate::kHourUTC);
} }
// static // static
void Builtins::Generate_DatePrototypeGetUTCMilliseconds( void Builtins::Generate_DatePrototypeGetUTCMilliseconds(
CodeStubAssembler* assembler) { compiler::CodeAssemblerState* state) {
Generate_DatePrototype_GetField(assembler, JSDate::kMillisecondUTC); CodeStubAssembler assembler(state);
Generate_DatePrototype_GetField(&assembler, JSDate::kMillisecondUTC);
} }
// static // static
void Builtins::Generate_DatePrototypeGetUTCMinutes( void Builtins::Generate_DatePrototypeGetUTCMinutes(
CodeStubAssembler* assembler) { compiler::CodeAssemblerState* state) {
Generate_DatePrototype_GetField(assembler, JSDate::kMinuteUTC); CodeStubAssembler assembler(state);
Generate_DatePrototype_GetField(&assembler, JSDate::kMinuteUTC);
} }
// static // static
void Builtins::Generate_DatePrototypeGetUTCMonth(CodeStubAssembler* assembler) { void Builtins::Generate_DatePrototypeGetUTCMonth(
Generate_DatePrototype_GetField(assembler, JSDate::kMonthUTC); compiler::CodeAssemblerState* state) {
CodeStubAssembler assembler(state);
Generate_DatePrototype_GetField(&assembler, JSDate::kMonthUTC);
} }
// static // static
void Builtins::Generate_DatePrototypeGetUTCSeconds( void Builtins::Generate_DatePrototypeGetUTCSeconds(
CodeStubAssembler* assembler) { compiler::CodeAssemblerState* state) {
Generate_DatePrototype_GetField(assembler, JSDate::kSecondUTC); CodeStubAssembler assembler(state);
Generate_DatePrototype_GetField(&assembler, JSDate::kSecondUTC);
} }
} // namespace internal } // namespace internal
......
...@@ -283,14 +283,15 @@ BUILTIN(FunctionPrototypeToString) { ...@@ -283,14 +283,15 @@ BUILTIN(FunctionPrototypeToString) {
// ES6 section 19.2.3.6 Function.prototype [ @@hasInstance ] ( V ) // ES6 section 19.2.3.6 Function.prototype [ @@hasInstance ] ( V )
void Builtins::Generate_FunctionPrototypeHasInstance( void Builtins::Generate_FunctionPrototypeHasInstance(
CodeStubAssembler* assembler) { compiler::CodeAssemblerState* state) {
using compiler::Node; using compiler::Node;
CodeStubAssembler assembler(state);
Node* f = assembler->Parameter(0); Node* f = assembler.Parameter(0);
Node* v = assembler->Parameter(1); Node* v = assembler.Parameter(1);
Node* context = assembler->Parameter(4); Node* context = assembler.Parameter(4);
Node* result = assembler->OrdinaryHasInstance(context, f, v); Node* result = assembler.OrdinaryHasInstance(context, f, v);
assembler->Return(result); assembler.Return(result);
} }
} // namespace internal } // namespace internal
......
...@@ -96,20 +96,26 @@ void Generate_GeneratorPrototypeResume( ...@@ -96,20 +96,26 @@ void Generate_GeneratorPrototypeResume(
} // anonymous namespace } // anonymous namespace
// ES6 section 25.3.1.2 Generator.prototype.next ( value ) // ES6 section 25.3.1.2 Generator.prototype.next ( value )
void Builtins::Generate_GeneratorPrototypeNext(CodeStubAssembler* assembler) { void Builtins::Generate_GeneratorPrototypeNext(
Generate_GeneratorPrototypeResume(assembler, JSGeneratorObject::kNext, compiler::CodeAssemblerState* state) {
CodeStubAssembler assembler(state);
Generate_GeneratorPrototypeResume(&assembler, JSGeneratorObject::kNext,
"[Generator].prototype.next"); "[Generator].prototype.next");
} }
// ES6 section 25.3.1.3 Generator.prototype.return ( value ) // ES6 section 25.3.1.3 Generator.prototype.return ( value )
void Builtins::Generate_GeneratorPrototypeReturn(CodeStubAssembler* assembler) { void Builtins::Generate_GeneratorPrototypeReturn(
Generate_GeneratorPrototypeResume(assembler, JSGeneratorObject::kReturn, compiler::CodeAssemblerState* state) {
CodeStubAssembler assembler(state);
Generate_GeneratorPrototypeResume(&assembler, JSGeneratorObject::kReturn,
"[Generator].prototype.return"); "[Generator].prototype.return");
} }
// ES6 section 25.3.1.4 Generator.prototype.throw ( exception ) // ES6 section 25.3.1.4 Generator.prototype.throw ( exception )
void Builtins::Generate_GeneratorPrototypeThrow(CodeStubAssembler* assembler) { void Builtins::Generate_GeneratorPrototypeThrow(
Generate_GeneratorPrototypeResume(assembler, JSGeneratorObject::kThrow, compiler::CodeAssemblerState* state) {
CodeStubAssembler assembler(state);
Generate_GeneratorPrototypeResume(&assembler, JSGeneratorObject::kThrow,
"[Generator].prototype.throw"); "[Generator].prototype.throw");
} }
......
...@@ -101,111 +101,112 @@ BUILTIN(GlobalEval) { ...@@ -101,111 +101,112 @@ BUILTIN(GlobalEval) {
} }
// ES6 section 18.2.2 isFinite ( number ) // ES6 section 18.2.2 isFinite ( number )
void Builtins::Generate_GlobalIsFinite(CodeStubAssembler* assembler) { void Builtins::Generate_GlobalIsFinite(compiler::CodeAssemblerState* state) {
typedef CodeStubAssembler::Label Label; typedef CodeStubAssembler::Label Label;
typedef compiler::Node Node; typedef compiler::Node Node;
typedef CodeStubAssembler::Variable Variable; typedef CodeStubAssembler::Variable Variable;
CodeStubAssembler assembler(state);
Node* context = assembler->Parameter(4); Node* context = assembler.Parameter(4);
Label return_true(assembler), return_false(assembler); Label return_true(&assembler), return_false(&assembler);
// We might need to loop once for ToNumber conversion. // We might need to loop once for ToNumber conversion.
Variable var_num(assembler, MachineRepresentation::kTagged); Variable var_num(&assembler, MachineRepresentation::kTagged);
Label loop(assembler, &var_num); Label loop(&assembler, &var_num);
var_num.Bind(assembler->Parameter(1)); var_num.Bind(assembler.Parameter(1));
assembler->Goto(&loop); assembler.Goto(&loop);
assembler->Bind(&loop); assembler.Bind(&loop);
{ {
// Load the current {num} value. // Load the current {num} value.
Node* num = var_num.value(); Node* num = var_num.value();
// Check if {num} is a Smi or a HeapObject. // Check if {num} is a Smi or a HeapObject.
assembler->GotoIf(assembler->TaggedIsSmi(num), &return_true); assembler.GotoIf(assembler.TaggedIsSmi(num), &return_true);
// Check if {num} is a HeapNumber. // Check if {num} is a HeapNumber.
Label if_numisheapnumber(assembler), Label if_numisheapnumber(&assembler),
if_numisnotheapnumber(assembler, Label::kDeferred); if_numisnotheapnumber(&assembler, Label::kDeferred);
assembler->Branch(assembler->WordEqual(assembler->LoadMap(num), assembler.Branch(assembler.WordEqual(assembler.LoadMap(num),
assembler->HeapNumberMapConstant()), assembler.HeapNumberMapConstant()),
&if_numisheapnumber, &if_numisnotheapnumber); &if_numisheapnumber, &if_numisnotheapnumber);
assembler->Bind(&if_numisheapnumber); assembler.Bind(&if_numisheapnumber);
{ {
// Check if {num} contains a finite, non-NaN value. // Check if {num} contains a finite, non-NaN value.
Node* num_value = assembler->LoadHeapNumberValue(num); Node* num_value = assembler.LoadHeapNumberValue(num);
assembler->BranchIfFloat64IsNaN( assembler.BranchIfFloat64IsNaN(assembler.Float64Sub(num_value, num_value),
assembler->Float64Sub(num_value, num_value), &return_false, &return_false, &return_true);
&return_true);
} }
assembler->Bind(&if_numisnotheapnumber); assembler.Bind(&if_numisnotheapnumber);
{ {
// Need to convert {num} to a Number first. // Need to convert {num} to a Number first.
Callable callable = CodeFactory::NonNumberToNumber(assembler->isolate()); Callable callable = CodeFactory::NonNumberToNumber(assembler.isolate());
var_num.Bind(assembler->CallStub(callable, context, num)); var_num.Bind(assembler.CallStub(callable, context, num));
assembler->Goto(&loop); assembler.Goto(&loop);
} }
} }
assembler->Bind(&return_true); assembler.Bind(&return_true);
assembler->Return(assembler->BooleanConstant(true)); assembler.Return(assembler.BooleanConstant(true));
assembler->Bind(&return_false); assembler.Bind(&return_false);
assembler->Return(assembler->BooleanConstant(false)); assembler.Return(assembler.BooleanConstant(false));
} }
// ES6 section 18.2.3 isNaN ( number ) // ES6 section 18.2.3 isNaN ( number )
void Builtins::Generate_GlobalIsNaN(CodeStubAssembler* assembler) { void Builtins::Generate_GlobalIsNaN(compiler::CodeAssemblerState* state) {
typedef CodeStubAssembler::Label Label; typedef CodeStubAssembler::Label Label;
typedef compiler::Node Node; typedef compiler::Node Node;
typedef CodeStubAssembler::Variable Variable; typedef CodeStubAssembler::Variable Variable;
CodeStubAssembler assembler(state);
Node* context = assembler->Parameter(4); Node* context = assembler.Parameter(4);
Label return_true(assembler), return_false(assembler); Label return_true(&assembler), return_false(&assembler);
// We might need to loop once for ToNumber conversion. // We might need to loop once for ToNumber conversion.
Variable var_num(assembler, MachineRepresentation::kTagged); Variable var_num(&assembler, MachineRepresentation::kTagged);
Label loop(assembler, &var_num); Label loop(&assembler, &var_num);
var_num.Bind(assembler->Parameter(1)); var_num.Bind(assembler.Parameter(1));
assembler->Goto(&loop); assembler.Goto(&loop);
assembler->Bind(&loop); assembler.Bind(&loop);
{ {
// Load the current {num} value. // Load the current {num} value.
Node* num = var_num.value(); Node* num = var_num.value();
// Check if {num} is a Smi or a HeapObject. // Check if {num} is a Smi or a HeapObject.
assembler->GotoIf(assembler->TaggedIsSmi(num), &return_false); assembler.GotoIf(assembler.TaggedIsSmi(num), &return_false);
// Check if {num} is a HeapNumber. // Check if {num} is a HeapNumber.
Label if_numisheapnumber(assembler), Label if_numisheapnumber(&assembler),
if_numisnotheapnumber(assembler, Label::kDeferred); if_numisnotheapnumber(&assembler, Label::kDeferred);
assembler->Branch(assembler->WordEqual(assembler->LoadMap(num), assembler.Branch(assembler.WordEqual(assembler.LoadMap(num),
assembler->HeapNumberMapConstant()), assembler.HeapNumberMapConstant()),
&if_numisheapnumber, &if_numisnotheapnumber); &if_numisheapnumber, &if_numisnotheapnumber);
assembler->Bind(&if_numisheapnumber); assembler.Bind(&if_numisheapnumber);
{ {
// Check if {num} contains a NaN. // Check if {num} contains a NaN.
Node* num_value = assembler->LoadHeapNumberValue(num); Node* num_value = assembler.LoadHeapNumberValue(num);
assembler->BranchIfFloat64IsNaN(num_value, &return_true, &return_false); assembler.BranchIfFloat64IsNaN(num_value, &return_true, &return_false);
} }
assembler->Bind(&if_numisnotheapnumber); assembler.Bind(&if_numisnotheapnumber);
{ {
// Need to convert {num} to a Number first. // Need to convert {num} to a Number first.
Callable callable = CodeFactory::NonNumberToNumber(assembler->isolate()); Callable callable = CodeFactory::NonNumberToNumber(assembler.isolate());
var_num.Bind(assembler->CallStub(callable, context, num)); var_num.Bind(assembler.CallStub(callable, context, num));
assembler->Goto(&loop); assembler.Goto(&loop);
} }
} }
assembler->Bind(&return_true); assembler.Bind(&return_true);
assembler->Return(assembler->BooleanConstant(true)); assembler.Return(assembler.BooleanConstant(true));
assembler->Bind(&return_false); assembler.Bind(&return_false);
assembler->Return(assembler->BooleanConstant(false)); assembler.Return(assembler.BooleanConstant(false));
} }
} // namespace internal } // namespace internal
......
...@@ -12,18 +12,19 @@ namespace v8 { ...@@ -12,18 +12,19 @@ namespace v8 {
namespace internal { namespace internal {
void Builtins::Generate_KeyedLoadIC_Megamorphic_TF( void Builtins::Generate_KeyedLoadIC_Megamorphic_TF(
CodeStubAssembler* assembler) { compiler::CodeAssemblerState* state) {
typedef compiler::Node Node; typedef compiler::Node Node;
typedef LoadWithVectorDescriptor Descriptor; typedef LoadWithVectorDescriptor Descriptor;
CodeStubAssembler assembler(state);
Node* receiver = assembler->Parameter(Descriptor::kReceiver); Node* receiver = assembler.Parameter(Descriptor::kReceiver);
Node* name = assembler->Parameter(Descriptor::kName); Node* name = assembler.Parameter(Descriptor::kName);
Node* slot = assembler->Parameter(Descriptor::kSlot); Node* slot = assembler.Parameter(Descriptor::kSlot);
Node* vector = assembler->Parameter(Descriptor::kVector); Node* vector = assembler.Parameter(Descriptor::kVector);
Node* context = assembler->Parameter(Descriptor::kContext); Node* context = assembler.Parameter(Descriptor::kContext);
CodeStubAssembler::LoadICParameters p(context, receiver, name, slot, vector); CodeStubAssembler::LoadICParameters p(context, receiver, name, slot, vector);
assembler->KeyedLoadICGeneric(&p); assembler.KeyedLoadICGeneric(&p);
} }
void Builtins::Generate_KeyedLoadIC_Miss(MacroAssembler* masm) { void Builtins::Generate_KeyedLoadIC_Miss(MacroAssembler* masm) {
...@@ -41,30 +42,14 @@ void Builtins::Generate_KeyedStoreIC_Megamorphic_Strict(MacroAssembler* masm) { ...@@ -41,30 +42,14 @@ void Builtins::Generate_KeyedStoreIC_Megamorphic_Strict(MacroAssembler* masm) {
KeyedStoreIC::GenerateMegamorphic(masm, STRICT); KeyedStoreIC::GenerateMegamorphic(masm, STRICT);
} }
void KeyedStoreICMegamorphic(CodeStubAssembler* assembler, LanguageMode mode) {
typedef compiler::Node Node;
typedef StoreWithVectorDescriptor Descriptor;
Node* receiver = assembler->Parameter(Descriptor::kReceiver);
Node* name = assembler->Parameter(Descriptor::kName);
Node* value = assembler->Parameter(Descriptor::kValue);
Node* slot = assembler->Parameter(Descriptor::kSlot);
Node* vector = assembler->Parameter(Descriptor::kVector);
Node* context = assembler->Parameter(Descriptor::kContext);
CodeStubAssembler::StoreICParameters p(context, receiver, name, value, slot,
vector);
KeyedStoreGenericGenerator::Generate(assembler, &p, mode);
}
void Builtins::Generate_KeyedStoreIC_Megamorphic_TF( void Builtins::Generate_KeyedStoreIC_Megamorphic_TF(
CodeStubAssembler* assembler) { compiler::CodeAssemblerState* state) {
KeyedStoreICMegamorphic(assembler, SLOPPY); KeyedStoreGenericGenerator::Generate(state, SLOPPY);
} }
void Builtins::Generate_KeyedStoreIC_Megamorphic_Strict_TF( void Builtins::Generate_KeyedStoreIC_Megamorphic_Strict_TF(
CodeStubAssembler* assembler) { compiler::CodeAssemblerState* state) {
KeyedStoreICMegamorphic(assembler, STRICT); KeyedStoreGenericGenerator::Generate(state, STRICT);
} }
void Builtins::Generate_KeyedStoreIC_Miss(MacroAssembler* masm) { void Builtins::Generate_KeyedStoreIC_Miss(MacroAssembler* masm) {
...@@ -75,45 +60,46 @@ void Builtins::Generate_KeyedStoreIC_Slow(MacroAssembler* masm) { ...@@ -75,45 +60,46 @@ void Builtins::Generate_KeyedStoreIC_Slow(MacroAssembler* masm) {
KeyedStoreIC::GenerateSlow(masm); KeyedStoreIC::GenerateSlow(masm);
} }
void Builtins::Generate_LoadGlobalIC_Miss(CodeStubAssembler* assembler) { void Builtins::Generate_LoadGlobalIC_Miss(compiler::CodeAssemblerState* state) {
typedef compiler::Node Node; typedef compiler::Node Node;
typedef LoadGlobalWithVectorDescriptor Descriptor; typedef LoadGlobalWithVectorDescriptor Descriptor;
CodeStubAssembler assembler(state);
Node* slot = assembler->Parameter(Descriptor::kSlot); Node* slot = assembler.Parameter(Descriptor::kSlot);
Node* vector = assembler->Parameter(Descriptor::kVector); Node* vector = assembler.Parameter(Descriptor::kVector);
Node* context = assembler->Parameter(Descriptor::kContext); Node* context = assembler.Parameter(Descriptor::kContext);
assembler->TailCallRuntime(Runtime::kLoadGlobalIC_Miss, context, slot, assembler.TailCallRuntime(Runtime::kLoadGlobalIC_Miss, context, slot, vector);
vector);
} }
void Builtins::Generate_LoadGlobalIC_Slow(CodeStubAssembler* assembler) { void Builtins::Generate_LoadGlobalIC_Slow(compiler::CodeAssemblerState* state) {
typedef compiler::Node Node; typedef compiler::Node Node;
typedef LoadGlobalWithVectorDescriptor Descriptor; typedef LoadGlobalWithVectorDescriptor Descriptor;
CodeStubAssembler assembler(state);
Node* slot = assembler->Parameter(Descriptor::kSlot); Node* slot = assembler.Parameter(Descriptor::kSlot);
Node* vector = assembler->Parameter(Descriptor::kVector); Node* vector = assembler.Parameter(Descriptor::kVector);
Node* context = assembler->Parameter(Descriptor::kContext); Node* context = assembler.Parameter(Descriptor::kContext);
assembler->TailCallRuntime(Runtime::kLoadGlobalIC_Slow, context, slot, assembler.TailCallRuntime(Runtime::kLoadGlobalIC_Slow, context, slot, vector);
vector);
} }
void Builtins::Generate_LoadIC_Getter_ForDeopt(MacroAssembler* masm) { void Builtins::Generate_LoadIC_Getter_ForDeopt(MacroAssembler* masm) {
NamedLoadHandlerCompiler::GenerateLoadViaGetterForDeopt(masm); NamedLoadHandlerCompiler::GenerateLoadViaGetterForDeopt(masm);
} }
void Builtins::Generate_LoadIC_Miss(CodeStubAssembler* assembler) { void Builtins::Generate_LoadIC_Miss(compiler::CodeAssemblerState* state) {
typedef compiler::Node Node; typedef compiler::Node Node;
typedef LoadWithVectorDescriptor Descriptor; typedef LoadWithVectorDescriptor Descriptor;
CodeStubAssembler assembler(state);
Node* receiver = assembler->Parameter(Descriptor::kReceiver); Node* receiver = assembler.Parameter(Descriptor::kReceiver);
Node* name = assembler->Parameter(Descriptor::kName); Node* name = assembler.Parameter(Descriptor::kName);
Node* slot = assembler->Parameter(Descriptor::kSlot); Node* slot = assembler.Parameter(Descriptor::kSlot);
Node* vector = assembler->Parameter(Descriptor::kVector); Node* vector = assembler.Parameter(Descriptor::kVector);
Node* context = assembler->Parameter(Descriptor::kContext); Node* context = assembler.Parameter(Descriptor::kContext);
assembler->TailCallRuntime(Runtime::kLoadIC_Miss, context, receiver, name, assembler.TailCallRuntime(Runtime::kLoadIC_Miss, context, receiver, name,
slot, vector); slot, vector);
} }
...@@ -121,29 +107,31 @@ void Builtins::Generate_LoadIC_Normal(MacroAssembler* masm) { ...@@ -121,29 +107,31 @@ void Builtins::Generate_LoadIC_Normal(MacroAssembler* masm) {
LoadIC::GenerateNormal(masm); LoadIC::GenerateNormal(masm);
} }
void Builtins::Generate_LoadIC_Slow(CodeStubAssembler* assembler) { void Builtins::Generate_LoadIC_Slow(compiler::CodeAssemblerState* state) {
typedef compiler::Node Node; typedef compiler::Node Node;
typedef LoadWithVectorDescriptor Descriptor; typedef LoadWithVectorDescriptor Descriptor;
CodeStubAssembler assembler(state);
Node* receiver = assembler->Parameter(Descriptor::kReceiver); Node* receiver = assembler.Parameter(Descriptor::kReceiver);
Node* name = assembler->Parameter(Descriptor::kName); Node* name = assembler.Parameter(Descriptor::kName);
Node* context = assembler->Parameter(Descriptor::kContext); Node* context = assembler.Parameter(Descriptor::kContext);
assembler->TailCallRuntime(Runtime::kGetProperty, context, receiver, name); assembler.TailCallRuntime(Runtime::kGetProperty, context, receiver, name);
} }
void Builtins::Generate_StoreIC_Miss(CodeStubAssembler* assembler) { void Builtins::Generate_StoreIC_Miss(compiler::CodeAssemblerState* state) {
typedef compiler::Node Node; typedef compiler::Node Node;
typedef StoreWithVectorDescriptor Descriptor; typedef StoreWithVectorDescriptor Descriptor;
CodeStubAssembler assembler(state);
Node* receiver = assembler->Parameter(Descriptor::kReceiver); Node* receiver = assembler.Parameter(Descriptor::kReceiver);
Node* name = assembler->Parameter(Descriptor::kName); Node* name = assembler.Parameter(Descriptor::kName);
Node* value = assembler->Parameter(Descriptor::kValue); Node* value = assembler.Parameter(Descriptor::kValue);
Node* slot = assembler->Parameter(Descriptor::kSlot); Node* slot = assembler.Parameter(Descriptor::kSlot);
Node* vector = assembler->Parameter(Descriptor::kVector); Node* vector = assembler.Parameter(Descriptor::kVector);
Node* context = assembler->Parameter(Descriptor::kContext); Node* context = assembler.Parameter(Descriptor::kContext);
assembler->TailCallRuntime(Runtime::kStoreIC_Miss, context, value, slot, assembler.TailCallRuntime(Runtime::kStoreIC_Miss, context, value, slot,
vector, receiver, name); vector, receiver, name);
} }
...@@ -156,30 +144,33 @@ void Builtins::Generate_StoreIC_Setter_ForDeopt(MacroAssembler* masm) { ...@@ -156,30 +144,33 @@ void Builtins::Generate_StoreIC_Setter_ForDeopt(MacroAssembler* masm) {
} }
namespace { namespace {
void Generate_StoreIC_Slow(CodeStubAssembler* assembler, void Generate_StoreIC_Slow(compiler::CodeAssemblerState* state,
LanguageMode language_mode) { LanguageMode language_mode) {
typedef compiler::Node Node; typedef compiler::Node Node;
typedef StoreWithVectorDescriptor Descriptor; typedef StoreWithVectorDescriptor Descriptor;
CodeStubAssembler assembler(state);
Node* receiver = assembler->Parameter(Descriptor::kReceiver); Node* receiver = assembler.Parameter(Descriptor::kReceiver);
Node* name = assembler->Parameter(Descriptor::kName); Node* name = assembler.Parameter(Descriptor::kName);
Node* value = assembler->Parameter(Descriptor::kValue); Node* value = assembler.Parameter(Descriptor::kValue);
Node* context = assembler->Parameter(Descriptor::kContext); Node* context = assembler.Parameter(Descriptor::kContext);
Node* lang_mode = assembler->SmiConstant(Smi::FromInt(language_mode)); Node* lang_mode = assembler.SmiConstant(Smi::FromInt(language_mode));
// The slow case calls into the runtime to complete the store without causing // The slow case calls into the runtime to complete the store without causing
// an IC miss that would otherwise cause a transition to the generic stub. // an IC miss that would otherwise cause a transition to the generic stub.
assembler->TailCallRuntime(Runtime::kSetProperty, context, receiver, name, assembler.TailCallRuntime(Runtime::kSetProperty, context, receiver, name,
value, lang_mode); value, lang_mode);
} }
} // anonymous namespace } // anonymous namespace
void Builtins::Generate_StoreIC_SlowSloppy(CodeStubAssembler* assembler) { void Builtins::Generate_StoreIC_SlowSloppy(
Generate_StoreIC_Slow(assembler, SLOPPY); compiler::CodeAssemblerState* state) {
Generate_StoreIC_Slow(state, SLOPPY);
} }
void Builtins::Generate_StoreIC_SlowStrict(CodeStubAssembler* assembler) { void Builtins::Generate_StoreIC_SlowStrict(
Generate_StoreIC_Slow(assembler, STRICT); compiler::CodeAssemblerState* state) {
Generate_StoreIC_Slow(state, STRICT);
} }
} // namespace internal } // namespace internal
......
...@@ -54,86 +54,90 @@ void Builtins::Generate_StackCheck(MacroAssembler* masm) { ...@@ -54,86 +54,90 @@ void Builtins::Generate_StackCheck(MacroAssembler* masm) {
// TurboFan support builtins. // TurboFan support builtins.
void Builtins::Generate_CopyFastSmiOrObjectElements( void Builtins::Generate_CopyFastSmiOrObjectElements(
CodeStubAssembler* assembler) { compiler::CodeAssemblerState* state) {
typedef CodeStubAssembler::Label Label; typedef CodeStubAssembler::Label Label;
typedef compiler::Node Node; typedef compiler::Node Node;
typedef CopyFastSmiOrObjectElementsDescriptor Descriptor; typedef CopyFastSmiOrObjectElementsDescriptor Descriptor;
CodeStubAssembler assembler(state);
Node* object = assembler->Parameter(Descriptor::kObject); Node* object = assembler.Parameter(Descriptor::kObject);
// Load the {object}s elements. // Load the {object}s elements.
Node* source = assembler->LoadObjectField(object, JSObject::kElementsOffset); Node* source = assembler.LoadObjectField(object, JSObject::kElementsOffset);
CodeStubAssembler::ParameterMode mode = assembler->OptimalParameterMode(); CodeStubAssembler::ParameterMode mode = assembler.OptimalParameterMode();
Node* length = assembler->UntagParameter( Node* length = assembler.UntagParameter(
assembler->LoadFixedArrayBaseLength(source), mode); assembler.LoadFixedArrayBaseLength(source), mode);
// Check if we can allocate in new space. // Check if we can allocate in new space.
ElementsKind kind = FAST_ELEMENTS; ElementsKind kind = FAST_ELEMENTS;
int max_elements = FixedArrayBase::GetMaxLengthForNewSpaceAllocation(kind); int max_elements = FixedArrayBase::GetMaxLengthForNewSpaceAllocation(kind);
Label if_newspace(assembler), if_oldspace(assembler); Label if_newspace(&assembler), if_oldspace(&assembler);
assembler->Branch( assembler.Branch(
assembler->UintPtrLessThan( assembler.UintPtrLessThan(
length, assembler->IntPtrOrSmiConstant(max_elements, mode)), length, assembler.IntPtrOrSmiConstant(max_elements, mode)),
&if_newspace, &if_oldspace); &if_newspace, &if_oldspace);
assembler->Bind(&if_newspace); assembler.Bind(&if_newspace);
{ {
Node* target = assembler->AllocateFixedArray(kind, length, mode); Node* target = assembler.AllocateFixedArray(kind, length, mode);
assembler->CopyFixedArrayElements(kind, source, target, length, assembler.CopyFixedArrayElements(kind, source, target, length,
SKIP_WRITE_BARRIER, mode); SKIP_WRITE_BARRIER, mode);
assembler->StoreObjectField(object, JSObject::kElementsOffset, target); assembler.StoreObjectField(object, JSObject::kElementsOffset, target);
assembler->Return(target); assembler.Return(target);
} }
assembler->Bind(&if_oldspace); assembler.Bind(&if_oldspace);
{ {
Node* target = assembler->AllocateFixedArray( Node* target = assembler.AllocateFixedArray(kind, length, mode,
kind, length, mode, CodeStubAssembler::kPretenured); CodeStubAssembler::kPretenured);
assembler->CopyFixedArrayElements(kind, source, target, length, assembler.CopyFixedArrayElements(kind, source, target, length,
UPDATE_WRITE_BARRIER, mode); UPDATE_WRITE_BARRIER, mode);
assembler->StoreObjectField(object, JSObject::kElementsOffset, target); assembler.StoreObjectField(object, JSObject::kElementsOffset, target);
assembler->Return(target); assembler.Return(target);
} }
} }
void Builtins::Generate_GrowFastDoubleElements(CodeStubAssembler* assembler) { void Builtins::Generate_GrowFastDoubleElements(
compiler::CodeAssemblerState* state) {
typedef CodeStubAssembler::Label Label; typedef CodeStubAssembler::Label Label;
typedef compiler::Node Node; typedef compiler::Node Node;
typedef GrowArrayElementsDescriptor Descriptor; typedef GrowArrayElementsDescriptor Descriptor;
CodeStubAssembler assembler(state);
Node* object = assembler->Parameter(Descriptor::kObject); Node* object = assembler.Parameter(Descriptor::kObject);
Node* key = assembler->Parameter(Descriptor::kKey); Node* key = assembler.Parameter(Descriptor::kKey);
Node* context = assembler->Parameter(Descriptor::kContext); Node* context = assembler.Parameter(Descriptor::kContext);
Label runtime(assembler, CodeStubAssembler::Label::kDeferred); Label runtime(&assembler, CodeStubAssembler::Label::kDeferred);
Node* elements = assembler->LoadElements(object); Node* elements = assembler.LoadElements(object);
elements = assembler->TryGrowElementsCapacity( elements = assembler.TryGrowElementsCapacity(
object, elements, FAST_DOUBLE_ELEMENTS, key, &runtime); object, elements, FAST_DOUBLE_ELEMENTS, key, &runtime);
assembler->Return(elements); assembler.Return(elements);
assembler->Bind(&runtime); assembler.Bind(&runtime);
assembler->TailCallRuntime(Runtime::kGrowArrayElements, context, object, key); assembler.TailCallRuntime(Runtime::kGrowArrayElements, context, object, key);
} }
void Builtins::Generate_GrowFastSmiOrObjectElements( void Builtins::Generate_GrowFastSmiOrObjectElements(
CodeStubAssembler* assembler) { compiler::CodeAssemblerState* state) {
typedef CodeStubAssembler::Label Label; typedef CodeStubAssembler::Label Label;
typedef compiler::Node Node; typedef compiler::Node Node;
typedef GrowArrayElementsDescriptor Descriptor; typedef GrowArrayElementsDescriptor Descriptor;
CodeStubAssembler assembler(state);
Node* object = assembler->Parameter(Descriptor::kObject); Node* object = assembler.Parameter(Descriptor::kObject);
Node* key = assembler->Parameter(Descriptor::kKey); Node* key = assembler.Parameter(Descriptor::kKey);
Node* context = assembler->Parameter(Descriptor::kContext); Node* context = assembler.Parameter(Descriptor::kContext);
Label runtime(assembler, CodeStubAssembler::Label::kDeferred); Label runtime(&assembler, CodeStubAssembler::Label::kDeferred);
Node* elements = assembler->LoadElements(object); Node* elements = assembler.LoadElements(object);
elements = assembler->TryGrowElementsCapacity(object, elements, FAST_ELEMENTS, elements = assembler.TryGrowElementsCapacity(object, elements, FAST_ELEMENTS,
key, &runtime); key, &runtime);
assembler->Return(elements); assembler.Return(elements);
assembler->Bind(&runtime); assembler.Bind(&runtime);
assembler->TailCallRuntime(Runtime::kGrowArrayElements, context, object, key); assembler.TailCallRuntime(Runtime::kGrowArrayElements, context, object, key);
} }
} // namespace internal } // namespace internal
......
...@@ -10,8 +10,9 @@ namespace v8 { ...@@ -10,8 +10,9 @@ namespace v8 {
namespace internal { namespace internal {
void Builtins::Generate_IteratorPrototypeIterator( void Builtins::Generate_IteratorPrototypeIterator(
CodeStubAssembler* assembler) { compiler::CodeAssemblerState* state) {
assembler->Return(assembler->Parameter(0)); CodeStubAssembler assembler(state);
assembler.Return(assembler.Parameter(0));
} }
BUILTIN(ModuleNamespaceIterator) { BUILTIN(ModuleNamespaceIterator) {
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
...@@ -31,7 +31,7 @@ void ValidateSharedTypedArray(CodeStubAssembler* a, compiler::Node* tagged, ...@@ -31,7 +31,7 @@ void ValidateSharedTypedArray(CodeStubAssembler* a, compiler::Node* tagged,
compiler::Node* context, compiler::Node* context,
compiler::Node** out_instance_type, compiler::Node** out_instance_type,
compiler::Node** out_backing_store) { compiler::Node** out_backing_store) {
using namespace compiler; using compiler::Node;
CodeStubAssembler::Label is_smi(a), not_smi(a), is_typed_array(a), CodeStubAssembler::Label is_smi(a), not_smi(a), is_typed_array(a),
not_typed_array(a), is_shared(a), not_shared(a), is_float_or_clamped(a), not_typed_array(a), is_shared(a), not_shared(a), is_float_or_clamped(a),
not_float_or_clamped(a), invalid(a); not_float_or_clamped(a), invalid(a);
...@@ -95,7 +95,7 @@ void ValidateSharedTypedArray(CodeStubAssembler* a, compiler::Node* tagged, ...@@ -95,7 +95,7 @@ void ValidateSharedTypedArray(CodeStubAssembler* a, compiler::Node* tagged,
compiler::Node* ConvertTaggedAtomicIndexToWord32(CodeStubAssembler* a, compiler::Node* ConvertTaggedAtomicIndexToWord32(CodeStubAssembler* a,
compiler::Node* tagged, compiler::Node* tagged,
compiler::Node* context) { compiler::Node* context) {
using namespace compiler; using compiler::Node;
CodeStubAssembler::Variable var_result(a, MachineRepresentation::kWord32); CodeStubAssembler::Variable var_result(a, MachineRepresentation::kWord32);
Callable to_number = CodeFactory::ToNumber(a->isolate()); Callable to_number = CodeFactory::ToNumber(a->isolate());
...@@ -139,7 +139,7 @@ compiler::Node* ConvertTaggedAtomicIndexToWord32(CodeStubAssembler* a, ...@@ -139,7 +139,7 @@ compiler::Node* ConvertTaggedAtomicIndexToWord32(CodeStubAssembler* a,
void ValidateAtomicIndex(CodeStubAssembler* a, compiler::Node* index_word, void ValidateAtomicIndex(CodeStubAssembler* a, compiler::Node* index_word,
compiler::Node* array_length_word, compiler::Node* array_length_word,
compiler::Node* context) { compiler::Node* context) {
using namespace compiler; using compiler::Node;
// Check if the index is in bounds. If not, throw RangeError. // Check if the index is in bounds. If not, throw RangeError.
CodeStubAssembler::Label if_inbounds(a), if_notinbounds(a); CodeStubAssembler::Label if_inbounds(a), if_notinbounds(a);
// TODO(jkummerow): Use unsigned comparison instead of "i<0 || i>length". // TODO(jkummerow): Use unsigned comparison instead of "i<0 || i>length".
...@@ -155,24 +155,25 @@ void ValidateAtomicIndex(CodeStubAssembler* a, compiler::Node* index_word, ...@@ -155,24 +155,25 @@ void ValidateAtomicIndex(CodeStubAssembler* a, compiler::Node* index_word,
} // anonymous namespace } // anonymous namespace
void Builtins::Generate_AtomicsLoad(CodeStubAssembler* a) { void Builtins::Generate_AtomicsLoad(compiler::CodeAssemblerState* state) {
using namespace compiler; using compiler::Node;
Node* array = a->Parameter(1); CodeStubAssembler a(state);
Node* index = a->Parameter(2); Node* array = a.Parameter(1);
Node* context = a->Parameter(3 + 2); Node* index = a.Parameter(2);
Node* context = a.Parameter(3 + 2);
Node* instance_type; Node* instance_type;
Node* backing_store; Node* backing_store;
ValidateSharedTypedArray(a, array, context, &instance_type, &backing_store); ValidateSharedTypedArray(&a, array, context, &instance_type, &backing_store);
Node* index_word32 = ConvertTaggedAtomicIndexToWord32(a, index, context); Node* index_word32 = ConvertTaggedAtomicIndexToWord32(&a, index, context);
Node* array_length_word32 = a->TruncateTaggedToWord32( Node* array_length_word32 = a.TruncateTaggedToWord32(
context, a->LoadObjectField(array, JSTypedArray::kLengthOffset)); context, a.LoadObjectField(array, JSTypedArray::kLengthOffset));
ValidateAtomicIndex(a, index_word32, array_length_word32, context); ValidateAtomicIndex(&a, index_word32, array_length_word32, context);
Node* index_word = a->ChangeUint32ToWord(index_word32); Node* index_word = a.ChangeUint32ToWord(index_word32);
CodeStubAssembler::Label i8(a), u8(a), i16(a), u16(a), i32(a), u32(a), CodeStubAssembler::Label i8(&a), u8(&a), i16(&a), u16(&a), i32(&a), u32(&a),
other(a); other(&a);
int32_t case_values[] = { int32_t case_values[] = {
FIXED_INT8_ARRAY_TYPE, FIXED_UINT8_ARRAY_TYPE, FIXED_INT16_ARRAY_TYPE, FIXED_INT8_ARRAY_TYPE, FIXED_UINT8_ARRAY_TYPE, FIXED_INT16_ARRAY_TYPE,
FIXED_UINT16_ARRAY_TYPE, FIXED_INT32_ARRAY_TYPE, FIXED_UINT32_ARRAY_TYPE, FIXED_UINT16_ARRAY_TYPE, FIXED_INT32_ARRAY_TYPE, FIXED_UINT32_ARRAY_TYPE,
...@@ -180,59 +181,60 @@ void Builtins::Generate_AtomicsLoad(CodeStubAssembler* a) { ...@@ -180,59 +181,60 @@ void Builtins::Generate_AtomicsLoad(CodeStubAssembler* a) {
CodeStubAssembler::Label* case_labels[] = { CodeStubAssembler::Label* case_labels[] = {
&i8, &u8, &i16, &u16, &i32, &u32, &i8, &u8, &i16, &u16, &i32, &u32,
}; };
a->Switch(instance_type, &other, case_values, case_labels, a.Switch(instance_type, &other, case_values, case_labels,
arraysize(case_labels)); arraysize(case_labels));
a->Bind(&i8); a.Bind(&i8);
a->Return( a.Return(
a->SmiTag(a->AtomicLoad(MachineType::Int8(), backing_store, index_word))); a.SmiTag(a.AtomicLoad(MachineType::Int8(), backing_store, index_word)));
a->Bind(&u8); a.Bind(&u8);
a->Return(a->SmiTag( a.Return(
a->AtomicLoad(MachineType::Uint8(), backing_store, index_word))); a.SmiTag(a.AtomicLoad(MachineType::Uint8(), backing_store, index_word)));
a->Bind(&i16); a.Bind(&i16);
a->Return(a->SmiTag(a->AtomicLoad(MachineType::Int16(), backing_store, a.Return(a.SmiTag(a.AtomicLoad(MachineType::Int16(), backing_store,
a->WordShl(index_word, 1)))); a.WordShl(index_word, 1))));
a->Bind(&u16); a.Bind(&u16);
a->Return(a->SmiTag(a->AtomicLoad(MachineType::Uint16(), backing_store, a.Return(a.SmiTag(a.AtomicLoad(MachineType::Uint16(), backing_store,
a->WordShl(index_word, 1)))); a.WordShl(index_word, 1))));
a->Bind(&i32); a.Bind(&i32);
a->Return(a->ChangeInt32ToTagged(a->AtomicLoad( a.Return(a.ChangeInt32ToTagged(a.AtomicLoad(
MachineType::Int32(), backing_store, a->WordShl(index_word, 2)))); MachineType::Int32(), backing_store, a.WordShl(index_word, 2))));
a->Bind(&u32); a.Bind(&u32);
a->Return(a->ChangeUint32ToTagged(a->AtomicLoad( a.Return(a.ChangeUint32ToTagged(a.AtomicLoad(
MachineType::Uint32(), backing_store, a->WordShl(index_word, 2)))); MachineType::Uint32(), backing_store, a.WordShl(index_word, 2))));
// This shouldn't happen, we've already validated the type. // This shouldn't happen, we've already validated the type.
a->Bind(&other); a.Bind(&other);
a->Return(a->Int32Constant(0)); a.Return(a.Int32Constant(0));
} }
void Builtins::Generate_AtomicsStore(CodeStubAssembler* a) { void Builtins::Generate_AtomicsStore(compiler::CodeAssemblerState* state) {
using namespace compiler; using compiler::Node;
Node* array = a->Parameter(1); CodeStubAssembler a(state);
Node* index = a->Parameter(2); Node* array = a.Parameter(1);
Node* value = a->Parameter(3); Node* index = a.Parameter(2);
Node* context = a->Parameter(4 + 2); Node* value = a.Parameter(3);
Node* context = a.Parameter(4 + 2);
Node* instance_type; Node* instance_type;
Node* backing_store; Node* backing_store;
ValidateSharedTypedArray(a, array, context, &instance_type, &backing_store); ValidateSharedTypedArray(&a, array, context, &instance_type, &backing_store);
Node* index_word32 = ConvertTaggedAtomicIndexToWord32(a, index, context); Node* index_word32 = ConvertTaggedAtomicIndexToWord32(&a, index, context);
Node* array_length_word32 = a->TruncateTaggedToWord32( Node* array_length_word32 = a.TruncateTaggedToWord32(
context, a->LoadObjectField(array, JSTypedArray::kLengthOffset)); context, a.LoadObjectField(array, JSTypedArray::kLengthOffset));
ValidateAtomicIndex(a, index_word32, array_length_word32, context); ValidateAtomicIndex(&a, index_word32, array_length_word32, context);
Node* index_word = a->ChangeUint32ToWord(index_word32); Node* index_word = a.ChangeUint32ToWord(index_word32);
Node* value_integer = a->ToInteger(context, value); Node* value_integer = a.ToInteger(context, value);
Node* value_word32 = a->TruncateTaggedToWord32(context, value_integer); Node* value_word32 = a.TruncateTaggedToWord32(context, value_integer);
CodeStubAssembler::Label u8(a), u16(a), u32(a), other(a); CodeStubAssembler::Label u8(&a), u16(&a), u32(&a), other(&a);
int32_t case_values[] = { int32_t case_values[] = {
FIXED_INT8_ARRAY_TYPE, FIXED_UINT8_ARRAY_TYPE, FIXED_INT16_ARRAY_TYPE, FIXED_INT8_ARRAY_TYPE, FIXED_UINT8_ARRAY_TYPE, FIXED_INT16_ARRAY_TYPE,
FIXED_UINT16_ARRAY_TYPE, FIXED_INT32_ARRAY_TYPE, FIXED_UINT32_ARRAY_TYPE, FIXED_UINT16_ARRAY_TYPE, FIXED_INT32_ARRAY_TYPE, FIXED_UINT32_ARRAY_TYPE,
...@@ -240,27 +242,27 @@ void Builtins::Generate_AtomicsStore(CodeStubAssembler* a) { ...@@ -240,27 +242,27 @@ void Builtins::Generate_AtomicsStore(CodeStubAssembler* a) {
CodeStubAssembler::Label* case_labels[] = { CodeStubAssembler::Label* case_labels[] = {
&u8, &u8, &u16, &u16, &u32, &u32, &u8, &u8, &u16, &u16, &u32, &u32,
}; };
a->Switch(instance_type, &other, case_values, case_labels, a.Switch(instance_type, &other, case_values, case_labels,
arraysize(case_labels)); arraysize(case_labels));
a->Bind(&u8); a.Bind(&u8);
a->AtomicStore(MachineRepresentation::kWord8, backing_store, index_word, a.AtomicStore(MachineRepresentation::kWord8, backing_store, index_word,
value_word32); value_word32);
a->Return(value_integer); a.Return(value_integer);
a->Bind(&u16); a.Bind(&u16);
a->AtomicStore(MachineRepresentation::kWord16, backing_store, a.AtomicStore(MachineRepresentation::kWord16, backing_store,
a->WordShl(index_word, 1), value_word32); a.WordShl(index_word, 1), value_word32);
a->Return(value_integer); a.Return(value_integer);
a->Bind(&u32); a.Bind(&u32);
a->AtomicStore(MachineRepresentation::kWord32, backing_store, a.AtomicStore(MachineRepresentation::kWord32, backing_store,
a->WordShl(index_word, 2), value_word32); a.WordShl(index_word, 2), value_word32);
a->Return(value_integer); a.Return(value_integer);
// This shouldn't happen, we've already validated the type. // This shouldn't happen, we've already validated the type.
a->Bind(&other); a.Bind(&other);
a->Return(a->Int32Constant(0)); a.Return(a.Int32Constant(0));
} }
} // namespace internal } // namespace internal
......
This diff is collapsed.
...@@ -34,42 +34,47 @@ BUILTIN(SymbolConstructor_ConstructStub) { ...@@ -34,42 +34,47 @@ BUILTIN(SymbolConstructor_ConstructStub) {
// ES6 section 19.4.3.4 Symbol.prototype [ @@toPrimitive ] ( hint ) // ES6 section 19.4.3.4 Symbol.prototype [ @@toPrimitive ] ( hint )
void Builtins::Generate_SymbolPrototypeToPrimitive( void Builtins::Generate_SymbolPrototypeToPrimitive(
CodeStubAssembler* assembler) { compiler::CodeAssemblerState* state) {
typedef compiler::Node Node; typedef compiler::Node Node;
CodeStubAssembler assembler(state);
Node* receiver = assembler->Parameter(0); Node* receiver = assembler.Parameter(0);
Node* context = assembler->Parameter(4); Node* context = assembler.Parameter(4);
Node* result = Node* result =
assembler->ToThisValue(context, receiver, PrimitiveType::kSymbol, assembler.ToThisValue(context, receiver, PrimitiveType::kSymbol,
"Symbol.prototype [ @@toPrimitive ]"); "Symbol.prototype [ @@toPrimitive ]");
assembler->Return(result); assembler.Return(result);
} }
// ES6 section 19.4.3.2 Symbol.prototype.toString ( ) // ES6 section 19.4.3.2 Symbol.prototype.toString ( )
void Builtins::Generate_SymbolPrototypeToString(CodeStubAssembler* assembler) { void Builtins::Generate_SymbolPrototypeToString(
compiler::CodeAssemblerState* state) {
typedef compiler::Node Node; typedef compiler::Node Node;
CodeStubAssembler assembler(state);
Node* receiver = assembler->Parameter(0); Node* receiver = assembler.Parameter(0);
Node* context = assembler->Parameter(3); Node* context = assembler.Parameter(3);
Node* value = assembler->ToThisValue( Node* value = assembler.ToThisValue(context, receiver, PrimitiveType::kSymbol,
context, receiver, PrimitiveType::kSymbol, "Symbol.prototype.toString"); "Symbol.prototype.toString");
Node* result = Node* result =
assembler->CallRuntime(Runtime::kSymbolDescriptiveString, context, value); assembler.CallRuntime(Runtime::kSymbolDescriptiveString, context, value);
assembler->Return(result); assembler.Return(result);
} }
// ES6 section 19.4.3.3 Symbol.prototype.valueOf ( ) // ES6 section 19.4.3.3 Symbol.prototype.valueOf ( )
void Builtins::Generate_SymbolPrototypeValueOf(CodeStubAssembler* assembler) { void Builtins::Generate_SymbolPrototypeValueOf(
compiler::CodeAssemblerState* state) {
typedef compiler::Node Node; typedef compiler::Node Node;
CodeStubAssembler assembler(state);
Node* receiver = assembler->Parameter(0); Node* receiver = assembler.Parameter(0);
Node* context = assembler->Parameter(3); Node* context = assembler.Parameter(3);
Node* result = assembler->ToThisValue( Node* result = assembler.ToThisValue(
context, receiver, PrimitiveType::kSymbol, "Symbol.prototype.valueOf"); context, receiver, PrimitiveType::kSymbol, "Symbol.prototype.valueOf");
assembler->Return(result); assembler.Return(result);
} }
} // namespace internal } // namespace internal
......
...@@ -20,48 +20,48 @@ BUILTIN(TypedArrayPrototypeBuffer) { ...@@ -20,48 +20,48 @@ BUILTIN(TypedArrayPrototypeBuffer) {
namespace { namespace {
void Generate_TypedArrayProtoypeGetter(CodeStubAssembler* assembler, void Generate_TypedArrayProtoypeGetter(compiler::CodeAssemblerState* state,
const char* method_name, const char* method_name,
int object_offset) { int object_offset) {
typedef CodeStubAssembler::Label Label; typedef CodeStubAssembler::Label Label;
typedef compiler::Node Node; typedef compiler::Node Node;
CodeStubAssembler assembler(state);
Node* receiver = assembler->Parameter(0); Node* receiver = assembler.Parameter(0);
Node* context = assembler->Parameter(3); Node* context = assembler.Parameter(3);
// Check if the {receiver} is actually a JSTypedArray. // Check if the {receiver} is actually a JSTypedArray.
Label if_receiverisincompatible(assembler, Label::kDeferred); Label if_receiverisincompatible(&assembler, Label::kDeferred);
assembler->GotoIf(assembler->TaggedIsSmi(receiver), assembler.GotoIf(assembler.TaggedIsSmi(receiver), &if_receiverisincompatible);
&if_receiverisincompatible); Node* receiver_instance_type = assembler.LoadInstanceType(receiver);
Node* receiver_instance_type = assembler->LoadInstanceType(receiver); assembler.GotoUnless(
assembler->GotoUnless( assembler.Word32Equal(receiver_instance_type,
assembler->Word32Equal(receiver_instance_type, assembler.Int32Constant(JS_TYPED_ARRAY_TYPE)),
assembler->Int32Constant(JS_TYPED_ARRAY_TYPE)),
&if_receiverisincompatible); &if_receiverisincompatible);
// Check if the {receiver}'s JSArrayBuffer was neutered. // Check if the {receiver}'s JSArrayBuffer was neutered.
Node* receiver_buffer = Node* receiver_buffer =
assembler->LoadObjectField(receiver, JSTypedArray::kBufferOffset); assembler.LoadObjectField(receiver, JSTypedArray::kBufferOffset);
Label if_receiverisneutered(assembler, Label::kDeferred); Label if_receiverisneutered(&assembler, Label::kDeferred);
assembler->GotoIf(assembler->IsDetachedBuffer(receiver_buffer), assembler.GotoIf(assembler.IsDetachedBuffer(receiver_buffer),
&if_receiverisneutered); &if_receiverisneutered);
assembler->Return(assembler->LoadObjectField(receiver, object_offset)); assembler.Return(assembler.LoadObjectField(receiver, object_offset));
assembler->Bind(&if_receiverisneutered); assembler.Bind(&if_receiverisneutered);
{ {
// The {receiver}s buffer was neutered, default to zero. // The {receiver}s buffer was neutered, default to zero.
assembler->Return(assembler->SmiConstant(0)); assembler.Return(assembler.SmiConstant(0));
} }
assembler->Bind(&if_receiverisincompatible); assembler.Bind(&if_receiverisincompatible);
{ {
// The {receiver} is not a valid JSGeneratorObject. // The {receiver} is not a valid JSGeneratorObject.
Node* result = assembler->CallRuntime( Node* result = assembler.CallRuntime(
Runtime::kThrowIncompatibleMethodReceiver, context, Runtime::kThrowIncompatibleMethodReceiver, context,
assembler->HeapConstant(assembler->factory()->NewStringFromAsciiChecked( assembler.HeapConstant(assembler.factory()->NewStringFromAsciiChecked(
method_name, TENURED)), method_name, TENURED)),
receiver); receiver);
assembler->Return(result); // Never reached. assembler.Return(result); // Never reached.
} }
} }
...@@ -69,100 +69,101 @@ void Generate_TypedArrayProtoypeGetter(CodeStubAssembler* assembler, ...@@ -69,100 +69,101 @@ void Generate_TypedArrayProtoypeGetter(CodeStubAssembler* assembler,
// ES6 section 22.2.3.2 get %TypedArray%.prototype.byteLength // ES6 section 22.2.3.2 get %TypedArray%.prototype.byteLength
void Builtins::Generate_TypedArrayPrototypeByteLength( void Builtins::Generate_TypedArrayPrototypeByteLength(
CodeStubAssembler* assembler) { compiler::CodeAssemblerState* state) {
Generate_TypedArrayProtoypeGetter(assembler, Generate_TypedArrayProtoypeGetter(state,
"get TypedArray.prototype.byteLength", "get TypedArray.prototype.byteLength",
JSTypedArray::kByteLengthOffset); JSTypedArray::kByteLengthOffset);
} }
// ES6 section 22.2.3.3 get %TypedArray%.prototype.byteOffset // ES6 section 22.2.3.3 get %TypedArray%.prototype.byteOffset
void Builtins::Generate_TypedArrayPrototypeByteOffset( void Builtins::Generate_TypedArrayPrototypeByteOffset(
CodeStubAssembler* assembler) { compiler::CodeAssemblerState* state) {
Generate_TypedArrayProtoypeGetter(assembler, Generate_TypedArrayProtoypeGetter(state,
"get TypedArray.prototype.byteOffset", "get TypedArray.prototype.byteOffset",
JSTypedArray::kByteOffsetOffset); JSTypedArray::kByteOffsetOffset);
} }
// ES6 section 22.2.3.18 get %TypedArray%.prototype.length // ES6 section 22.2.3.18 get %TypedArray%.prototype.length
void Builtins::Generate_TypedArrayPrototypeLength( void Builtins::Generate_TypedArrayPrototypeLength(
CodeStubAssembler* assembler) { compiler::CodeAssemblerState* state) {
Generate_TypedArrayProtoypeGetter(assembler, Generate_TypedArrayProtoypeGetter(state, "get TypedArray.prototype.length",
"get TypedArray.prototype.length",
JSTypedArray::kLengthOffset); JSTypedArray::kLengthOffset);
} }
namespace { namespace {
template <IterationKind kIterationKind> template <IterationKind kIterationKind>
void Generate_TypedArrayPrototypeIterationMethod(CodeStubAssembler* assembler, void Generate_TypedArrayPrototypeIterationMethod(
const char* method_name) { compiler::CodeAssemblerState* state, const char* method_name) {
typedef compiler::Node Node; typedef compiler::Node Node;
typedef CodeStubAssembler::Label Label; typedef CodeStubAssembler::Label Label;
typedef CodeStubAssembler::Variable Variable; typedef CodeStubAssembler::Variable Variable;
CodeStubAssembler assembler(state);
Node* receiver = assembler->Parameter(0); Node* receiver = assembler.Parameter(0);
Node* context = assembler->Parameter(3); Node* context = assembler.Parameter(3);
Label throw_bad_receiver(assembler, Label::kDeferred); Label throw_bad_receiver(&assembler, Label::kDeferred);
Label throw_typeerror(assembler, Label::kDeferred); Label throw_typeerror(&assembler, Label::kDeferred);
assembler->GotoIf(assembler->TaggedIsSmi(receiver), &throw_bad_receiver); assembler.GotoIf(assembler.TaggedIsSmi(receiver), &throw_bad_receiver);
Node* map = assembler->LoadMap(receiver); Node* map = assembler.LoadMap(receiver);
Node* instance_type = assembler->LoadMapInstanceType(map); Node* instance_type = assembler.LoadMapInstanceType(map);
assembler->GotoIf( assembler.GotoIf(
assembler->Word32NotEqual(instance_type, assembler.Word32NotEqual(instance_type,
assembler->Int32Constant(JS_TYPED_ARRAY_TYPE)), assembler.Int32Constant(JS_TYPED_ARRAY_TYPE)),
&throw_bad_receiver); &throw_bad_receiver);
// Check if the {receiver}'s JSArrayBuffer was neutered. // Check if the {receiver}'s JSArrayBuffer was neutered.
Node* receiver_buffer = Node* receiver_buffer =
assembler->LoadObjectField(receiver, JSTypedArray::kBufferOffset); assembler.LoadObjectField(receiver, JSTypedArray::kBufferOffset);
Label if_receiverisneutered(assembler, Label::kDeferred); Label if_receiverisneutered(&assembler, Label::kDeferred);
assembler->GotoIf(assembler->IsDetachedBuffer(receiver_buffer), assembler.GotoIf(assembler.IsDetachedBuffer(receiver_buffer),
&if_receiverisneutered); &if_receiverisneutered);
assembler->Return(assembler->CreateArrayIterator(receiver, map, instance_type, assembler.Return(assembler.CreateArrayIterator(receiver, map, instance_type,
context, kIterationKind)); context, kIterationKind));
Variable var_message(assembler, MachineRepresentation::kTagged); Variable var_message(&assembler, MachineRepresentation::kTagged);
assembler->Bind(&throw_bad_receiver); assembler.Bind(&throw_bad_receiver);
var_message.Bind( var_message.Bind(
assembler->SmiConstant(Smi::FromInt(MessageTemplate::kNotTypedArray))); assembler.SmiConstant(Smi::FromInt(MessageTemplate::kNotTypedArray)));
assembler->Goto(&throw_typeerror); assembler.Goto(&throw_typeerror);
assembler->Bind(&if_receiverisneutered); assembler.Bind(&if_receiverisneutered);
var_message.Bind(assembler->SmiConstant( var_message.Bind(
Smi::FromInt(MessageTemplate::kDetachedOperation))); assembler.SmiConstant(Smi::FromInt(MessageTemplate::kDetachedOperation)));
assembler->Goto(&throw_typeerror); assembler.Goto(&throw_typeerror);
assembler->Bind(&throw_typeerror); assembler.Bind(&throw_typeerror);
{ {
Node* arg1 = assembler->HeapConstant( Node* arg1 = assembler.HeapConstant(
assembler->isolate()->factory()->NewStringFromAsciiChecked(method_name, assembler.isolate()->factory()->NewStringFromAsciiChecked(method_name,
TENURED)); TENURED));
Node* result = assembler->CallRuntime(Runtime::kThrowTypeError, context, Node* result = assembler.CallRuntime(Runtime::kThrowTypeError, context,
var_message.value(), arg1); var_message.value(), arg1);
assembler->Return(result); assembler.Return(result);
} }
} }
} // namespace } // namespace
void Builtins::Generate_TypedArrayPrototypeValues( void Builtins::Generate_TypedArrayPrototypeValues(
CodeStubAssembler* assembler) { compiler::CodeAssemblerState* state) {
Generate_TypedArrayPrototypeIterationMethod<IterationKind::kValues>( Generate_TypedArrayPrototypeIterationMethod<IterationKind::kValues>(
assembler, "%TypedArray%.prototype.values()"); state, "%TypedArray%.prototype.values()");
} }
void Builtins::Generate_TypedArrayPrototypeEntries( void Builtins::Generate_TypedArrayPrototypeEntries(
CodeStubAssembler* assembler) { compiler::CodeAssemblerState* state) {
Generate_TypedArrayPrototypeIterationMethod<IterationKind::kEntries>( Generate_TypedArrayPrototypeIterationMethod<IterationKind::kEntries>(
assembler, "%TypedArray%.prototype.entries()"); state, "%TypedArray%.prototype.entries()");
} }
void Builtins::Generate_TypedArrayPrototypeKeys(CodeStubAssembler* assembler) { void Builtins::Generate_TypedArrayPrototypeKeys(
compiler::CodeAssemblerState* state) {
Generate_TypedArrayPrototypeIterationMethod<IterationKind::kKeys>( Generate_TypedArrayPrototypeIterationMethod<IterationKind::kKeys>(
assembler, "%TypedArray%.prototype.keys()"); state, "%TypedArray%.prototype.keys()");
} }
} // namespace internal } // namespace internal
......
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
#include "src/builtins/builtins.h" #include "src/builtins/builtins.h"
#include "src/code-events.h" #include "src/code-events.h"
#include "src/code-stub-assembler.h" #include "src/compiler/code-assembler.h"
#include "src/ic/ic-state.h" #include "src/ic/ic-state.h"
#include "src/interface-descriptors.h" #include "src/interface-descriptors.h"
#include "src/isolate.h" #include "src/isolate.h"
...@@ -42,7 +42,7 @@ void PostBuildProfileAndTracing(Isolate* isolate, Code* code, ...@@ -42,7 +42,7 @@ void PostBuildProfileAndTracing(Isolate* isolate, Code* code,
} }
typedef void (*MacroAssemblerGenerator)(MacroAssembler*); typedef void (*MacroAssemblerGenerator)(MacroAssembler*);
typedef void (*CodeAssemblerGenerator)(CodeStubAssembler*); typedef void (*CodeAssemblerGenerator)(compiler::CodeAssemblerState*);
Code* BuildWithMacroAssembler(Isolate* isolate, Code* BuildWithMacroAssembler(Isolate* isolate,
MacroAssemblerGenerator generator, MacroAssemblerGenerator generator,
...@@ -86,9 +86,10 @@ Code* BuildWithCodeStubAssemblerJS(Isolate* isolate, ...@@ -86,9 +86,10 @@ Code* BuildWithCodeStubAssemblerJS(Isolate* isolate,
Zone zone(isolate->allocator(), ZONE_NAME); Zone zone(isolate->allocator(), ZONE_NAME);
const int argc_with_recv = const int argc_with_recv =
(argc == SharedFunctionInfo::kDontAdaptArgumentsSentinel) ? 0 : argc + 1; (argc == SharedFunctionInfo::kDontAdaptArgumentsSentinel) ? 0 : argc + 1;
CodeStubAssembler assembler(isolate, &zone, argc_with_recv, flags, name); compiler::CodeAssemblerState state(isolate, &zone, argc_with_recv, flags,
generator(&assembler); name);
Handle<Code> code = assembler.GenerateCode(); generator(&state);
Handle<Code> code = compiler::CodeAssembler::GenerateCode(&state);
PostBuildProfileAndTracing(isolate, *code, name); PostBuildProfileAndTracing(isolate, *code, name);
return *code; return *code;
} }
...@@ -105,9 +106,9 @@ Code* BuildWithCodeStubAssemblerCS(Isolate* isolate, ...@@ -105,9 +106,9 @@ Code* BuildWithCodeStubAssemblerCS(Isolate* isolate,
CallInterfaceDescriptor descriptor(isolate, interface_descriptor); CallInterfaceDescriptor descriptor(isolate, interface_descriptor);
// Ensure descriptor is already initialized. // Ensure descriptor is already initialized.
DCHECK_LE(0, descriptor.GetRegisterParameterCount()); DCHECK_LE(0, descriptor.GetRegisterParameterCount());
CodeStubAssembler assembler(isolate, &zone, descriptor, flags, name); compiler::CodeAssemblerState state(isolate, &zone, descriptor, flags, name);
generator(&assembler); generator(&state);
Handle<Code> code = assembler.GenerateCode(); Handle<Code> code = compiler::CodeAssembler::GenerateCode(&state);
PostBuildProfileAndTracing(isolate, *code, name); PostBuildProfileAndTracing(isolate, *code, name);
return *code; return *code;
} }
......
This diff is collapsed.
...@@ -13,18 +13,6 @@ namespace internal { ...@@ -13,18 +13,6 @@ namespace internal {
using compiler::Node; using compiler::Node;
CodeStubAssembler::CodeStubAssembler(Isolate* isolate, Zone* zone,
const CallInterfaceDescriptor& descriptor,
Code::Flags flags, const char* name,
size_t result_size)
: compiler::CodeAssembler(isolate, zone, descriptor, flags, name,
result_size) {}
CodeStubAssembler::CodeStubAssembler(Isolate* isolate, Zone* zone,
int parameter_count, Code::Flags flags,
const char* name)
: compiler::CodeAssembler(isolate, zone, parameter_count, flags, name) {}
void CodeStubAssembler::Assert(ConditionBody codition_body, const char* message, void CodeStubAssembler::Assert(ConditionBody codition_body, const char* message,
const char* file, int line) { const char* file, int line) {
#if defined(DEBUG) #if defined(DEBUG)
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment