Commit f7795cbf authored by franzih's avatar franzih Committed by Commit bot

[interpreter] Bytecode for StaDataPropertyInLiteral.

Add bytecode for defining data properties, which initially just calls the runtime function.

BUG=v8:5624

Review-Url: https://codereview.chromium.org/2510743002
Cr-Commit-Position: refs/heads/master@{#41101}
parent 572b643b
...@@ -792,6 +792,23 @@ void BytecodeGraphBuilder::VisitStaGlobalStrict() { ...@@ -792,6 +792,23 @@ void BytecodeGraphBuilder::VisitStaGlobalStrict() {
BuildStoreGlobal(LanguageMode::STRICT); BuildStoreGlobal(LanguageMode::STRICT);
} }
void BytecodeGraphBuilder::VisitStaDataPropertyInLiteral() {
Node* object =
environment()->LookupRegister(bytecode_iterator().GetRegisterOperand(0));
Node* name =
environment()->LookupRegister(bytecode_iterator().GetRegisterOperand(1));
Node* value =
environment()->LookupRegister(bytecode_iterator().GetRegisterOperand(2));
Node* attrs =
environment()->LookupRegister(bytecode_iterator().GetRegisterOperand(3));
Node* set_function_name = environment()->LookupAccumulator();
const Operator* op =
javascript()->CallRuntime(Runtime::kDefineDataPropertyInLiteral);
Node* store = NewNode(op, object, name, value, attrs, set_function_name);
environment()->RecordAfterState(store, Environment::kAttachFrameState);
}
void BytecodeGraphBuilder::VisitLdaContextSlot() { void BytecodeGraphBuilder::VisitLdaContextSlot() {
// TODO(mythria): immutable flag is also set to false. This information is not // TODO(mythria): immutable flag is also set to false. This information is not
// available in bytecode array. update this code when the implementation // available in bytecode array. update this code when the implementation
......
...@@ -87,6 +87,12 @@ class BytecodeGraphBuilder { ...@@ -87,6 +87,12 @@ class BytecodeGraphBuilder {
return MakeNode(op, arraysize(buffer), buffer, false); return MakeNode(op, arraysize(buffer), buffer, false);
} }
Node* NewNode(const Operator* op, Node* n1, Node* n2, Node* n3, Node* n4,
Node* n5) {
Node* buffer[] = {n1, n2, n3, n4, n5};
return MakeNode(op, arraysize(buffer), buffer, false);
}
// Helpers to create new control nodes. // Helpers to create new control nodes.
Node* NewIfTrue() { return NewNode(common()->IfTrue()); } Node* NewIfTrue() { return NewNode(common()->IfTrue()); }
Node* NewIfFalse() { return NewNode(common()->IfFalse()); } Node* NewIfFalse() { return NewNode(common()->IfFalse()); }
......
...@@ -542,6 +542,12 @@ BytecodeArrayBuilder& BytecodeArrayBuilder::LoadKeyedProperty( ...@@ -542,6 +542,12 @@ BytecodeArrayBuilder& BytecodeArrayBuilder::LoadKeyedProperty(
return *this; return *this;
} }
BytecodeArrayBuilder& BytecodeArrayBuilder::StoreDataPropertyInLiteral(
Register object, Register name, Register value, Register attrs) {
OutputStaDataPropertyInLiteral(object, name, value, attrs);
return *this;
}
BytecodeArrayBuilder& BytecodeArrayBuilder::StoreNamedProperty( BytecodeArrayBuilder& BytecodeArrayBuilder::StoreNamedProperty(
Register object, const Handle<Name> name, int feedback_slot, Register object, const Handle<Name> name, int feedback_slot,
LanguageMode language_mode) { LanguageMode language_mode) {
......
...@@ -122,6 +122,13 @@ class V8_EXPORT_PRIVATE BytecodeArrayBuilder final ...@@ -122,6 +122,13 @@ class V8_EXPORT_PRIVATE BytecodeArrayBuilder final
// Keyed load property. The key should be in the accumulator. // Keyed load property. The key should be in the accumulator.
BytecodeArrayBuilder& LoadKeyedProperty(Register object, int feedback_slot); BytecodeArrayBuilder& LoadKeyedProperty(Register object, int feedback_slot);
// Store properties. Flag for NeedsSetFunctionName() should
// be in the accumulator.
BytecodeArrayBuilder& StoreDataPropertyInLiteral(Register object,
Register name,
Register value,
Register attrs);
// Store properties. The value to be stored should be in the accumulator. // Store properties. The value to be stored should be in the accumulator.
BytecodeArrayBuilder& StoreNamedProperty(Register object, BytecodeArrayBuilder& StoreNamedProperty(Register object,
const Handle<Name> name, const Handle<Name> name,
......
...@@ -1431,9 +1431,8 @@ void BytecodeGenerator::VisitClassLiteralProperties(ClassLiteral* expr, ...@@ -1431,9 +1431,8 @@ void BytecodeGenerator::VisitClassLiteralProperties(ClassLiteral* expr,
Register literal, Register literal,
Register prototype) { Register prototype) {
RegisterAllocationScope register_scope(this); RegisterAllocationScope register_scope(this);
RegisterList args = register_allocator()->NewRegisterList(5); RegisterList args = register_allocator()->NewRegisterList(4);
Register receiver = args[0], key = args[1], value = args[2], attr = args[3], Register receiver = args[0], key = args[1], value = args[2], attr = args[3];
set_function_name = args[4];
bool attr_assigned = false; bool attr_assigned = false;
Register old_receiver = Register::invalid_value(); Register old_receiver = Register::invalid_value();
...@@ -1480,18 +1479,15 @@ void BytecodeGenerator::VisitClassLiteralProperties(ClassLiteral* expr, ...@@ -1480,18 +1479,15 @@ void BytecodeGenerator::VisitClassLiteralProperties(ClassLiteral* expr,
case ClassLiteral::Property::METHOD: { case ClassLiteral::Property::METHOD: {
builder() builder()
->LoadLiteral(Smi::FromInt(property->NeedsSetFunctionName())) ->LoadLiteral(Smi::FromInt(property->NeedsSetFunctionName()))
.StoreAccumulatorInRegister(set_function_name) .StoreDataPropertyInLiteral(receiver, key, value, attr);
.CallRuntime(Runtime::kDefineDataPropertyInLiteral, args);
break; break;
} }
case ClassLiteral::Property::GETTER: { case ClassLiteral::Property::GETTER: {
builder()->CallRuntime(Runtime::kDefineGetterPropertyUnchecked, builder()->CallRuntime(Runtime::kDefineGetterPropertyUnchecked, args);
args.Truncate(4));
break; break;
} }
case ClassLiteral::Property::SETTER: { case ClassLiteral::Property::SETTER: {
builder()->CallRuntime(Runtime::kDefineSetterPropertyUnchecked, builder()->CallRuntime(Runtime::kDefineSetterPropertyUnchecked, args);
args.Truncate(4));
break; break;
} }
case ClassLiteral::Property::FIELD: { case ClassLiteral::Property::FIELD: {
...@@ -1699,18 +1695,20 @@ void BytecodeGenerator::VisitObjectLiteral(ObjectLiteral* expr) { ...@@ -1699,18 +1695,20 @@ void BytecodeGenerator::VisitObjectLiteral(ObjectLiteral* expr) {
case ObjectLiteral::Property::CONSTANT: case ObjectLiteral::Property::CONSTANT:
case ObjectLiteral::Property::COMPUTED: case ObjectLiteral::Property::COMPUTED:
case ObjectLiteral::Property::MATERIALIZED_LITERAL: { case ObjectLiteral::Property::MATERIALIZED_LITERAL: {
RegisterList args = register_allocator()->NewRegisterList(5); Register key = register_allocator()->NewRegister();
builder()->MoveRegister(literal, args[0]);
VisitForAccumulatorValue(property->key()); VisitForAccumulatorValue(property->key());
builder()->ConvertAccumulatorToName(args[1]); builder()->ConvertAccumulatorToName(key);
VisitForRegisterValue(property->value(), args[2]);
VisitSetHomeObject(args[2], literal, property); Register value = VisitForRegisterValue(property->value());
VisitSetHomeObject(value, literal, property);
Register attr = register_allocator()->NewRegister();
builder() builder()
->LoadLiteral(Smi::FromInt(NONE)) ->LoadLiteral(Smi::FromInt(NONE))
.StoreAccumulatorInRegister(args[3]) .StoreAccumulatorInRegister(attr)
.LoadLiteral(Smi::FromInt(property->NeedsSetFunctionName())) .LoadLiteral(Smi::FromInt(property->NeedsSetFunctionName()))
.StoreAccumulatorInRegister(args[4]); .StoreDataPropertyInLiteral(literal, key, value, attr);
builder()->CallRuntime(Runtime::kDefineDataPropertyInLiteral, args);
break; break;
} }
case ObjectLiteral::Property::GETTER: case ObjectLiteral::Property::GETTER:
......
...@@ -98,6 +98,8 @@ namespace interpreter { ...@@ -98,6 +98,8 @@ namespace interpreter {
OperandType::kReg, OperandType::kIdx) \ OperandType::kReg, OperandType::kIdx) \
V(StaKeyedPropertyStrict, AccumulatorUse::kRead, OperandType::kReg, \ V(StaKeyedPropertyStrict, AccumulatorUse::kRead, OperandType::kReg, \
OperandType::kReg, OperandType::kIdx) \ OperandType::kReg, OperandType::kIdx) \
V(StaDataPropertyInLiteral, AccumulatorUse::kRead, OperandType::kReg, \
OperandType::kReg, OperandType::kReg, OperandType::kReg) \
\ \
/* Binary Operators */ \ /* Binary Operators */ \
V(Add, AccumulatorUse::kReadWrite, OperandType::kReg, OperandType::kIdx) \ V(Add, AccumulatorUse::kReadWrite, OperandType::kReg, OperandType::kIdx) \
......
...@@ -846,6 +846,33 @@ void Interpreter::DoStaKeyedPropertyStrict(InterpreterAssembler* assembler) { ...@@ -846,6 +846,33 @@ void Interpreter::DoStaKeyedPropertyStrict(InterpreterAssembler* assembler) {
DoKeyedStoreIC(ic, assembler); DoKeyedStoreIC(ic, assembler);
} }
// StaDataPropertyInLiteral <object> <name> <value> <attrs>
//
// Define a property <name> with value <value> in <object>. Use property
// attributes <attrs> in the definition and set the name property of <value>
// according to the flag in the accumulator.
//
// This definition is not observable and is used only for definitions
// in object or class literals.
void Interpreter::DoStaDataPropertyInLiteral(InterpreterAssembler* assembler) {
Node* object_reg_index = __ BytecodeOperandReg(0);
Node* object = __ LoadRegister(object_reg_index);
Node* name_reg_index = __ BytecodeOperandReg(1);
Node* name = __ LoadRegister(name_reg_index);
Node* value_reg_index = __ BytecodeOperandReg(2);
Node* value = __ LoadRegister(value_reg_index);
Node* attrs_reg_index = __ BytecodeOperandReg(3);
Node* attrs = __ LoadRegister(attrs_reg_index);
Node* set_function_name = __ GetAccumulator();
Node* context = __ GetContext();
__ CallRuntime(Runtime::kDefineDataPropertyInLiteral, context, object, name,
value, attrs, set_function_name);
__ Dispatch();
}
// LdaModuleVariable <cell_index> <depth> // LdaModuleVariable <cell_index> <depth>
// //
// Load the contents of a module variable into the accumulator. The variable is // Load the contents of a module variable into the accumulator. The variable is
......
...@@ -12,9 +12,9 @@ snippet: " ...@@ -12,9 +12,9 @@ snippet: "
speak() { console.log(this.name + ' is speaking.'); } speak() { console.log(this.name + ' is speaking.'); }
} }
" "
frame size: 10 frame size: 9
parameter count: 1 parameter count: 1
bytecode array length: 75 bytecode array length: 70
bytecodes: [ bytecodes: [
B(LdaTheHole), B(LdaTheHole),
B(Star), R(2), B(Star), R(2),
...@@ -40,9 +40,7 @@ bytecodes: [ ...@@ -40,9 +40,7 @@ bytecodes: [
B(LdaSmi), U8(2), B(LdaSmi), U8(2),
B(Star), R(8), B(Star), R(8),
B(LdaZero), B(LdaZero),
B(Star), R(9), B(StaDataPropertyInLiteral), R(4), R(6), R(7), R(8),
B(Mov), R(4), R(5),
B(CallRuntime), U16(Runtime::kDefineDataPropertyInLiteral), R(5), U8(5),
B(CallRuntime), U16(Runtime::kToFastProperties), R(3), U8(1), B(CallRuntime), U16(Runtime::kToFastProperties), R(3), U8(1),
B(Star), R(0), B(Star), R(0),
B(Star), R(1), B(Star), R(1),
...@@ -66,9 +64,9 @@ snippet: " ...@@ -66,9 +64,9 @@ snippet: "
speak() { console.log(this.name + ' is speaking.'); } speak() { console.log(this.name + ' is speaking.'); }
} }
" "
frame size: 10 frame size: 9
parameter count: 1 parameter count: 1
bytecode array length: 75 bytecode array length: 70
bytecodes: [ bytecodes: [
B(LdaTheHole), B(LdaTheHole),
B(Star), R(2), B(Star), R(2),
...@@ -94,9 +92,7 @@ bytecodes: [ ...@@ -94,9 +92,7 @@ bytecodes: [
B(LdaSmi), U8(2), B(LdaSmi), U8(2),
B(Star), R(8), B(Star), R(8),
B(LdaZero), B(LdaZero),
B(Star), R(9), B(StaDataPropertyInLiteral), R(4), R(6), R(7), R(8),
B(Mov), R(4), R(5),
B(CallRuntime), U16(Runtime::kDefineDataPropertyInLiteral), R(5), U8(5),
B(CallRuntime), U16(Runtime::kToFastProperties), R(3), U8(1), B(CallRuntime), U16(Runtime::kToFastProperties), R(3), U8(1),
B(Star), R(0), B(Star), R(0),
B(Star), R(1), B(Star), R(1),
...@@ -122,9 +118,9 @@ snippet: " ...@@ -122,9 +118,9 @@ snippet: "
static [n1]() { return n1; } static [n1]() { return n1; }
} }
" "
frame size: 11 frame size: 10
parameter count: 1 parameter count: 1
bytecode array length: 121 bytecode array length: 114
bytecodes: [ bytecodes: [
B(CreateFunctionContext), U8(2), B(CreateFunctionContext), U8(2),
B(PushContext), R(3), B(PushContext), R(3),
...@@ -156,9 +152,7 @@ bytecodes: [ ...@@ -156,9 +152,7 @@ bytecodes: [
B(LdaSmi), U8(2), B(LdaSmi), U8(2),
B(Star), R(9), B(Star), R(9),
B(LdaSmi), U8(1), B(LdaSmi), U8(1),
B(Star), R(10), B(StaDataPropertyInLiteral), R(5), R(7), R(8), R(9),
B(Mov), R(5), R(6),
B(CallRuntime), U16(Runtime::kDefineDataPropertyInLiteral), R(6), U8(5),
B(LdaCurrentContextSlot), U8(5), B(LdaCurrentContextSlot), U8(5),
/* 106 E> */ B(ToName), R(7), /* 106 E> */ B(ToName), R(7),
B(LdaConstant), U8(3), B(LdaConstant), U8(3),
...@@ -169,8 +163,7 @@ bytecodes: [ ...@@ -169,8 +163,7 @@ bytecodes: [
B(CreateClosure), U8(5), U8(2), B(CreateClosure), U8(5), U8(2),
B(Star), R(8), B(Star), R(8),
B(LdaSmi), U8(1), B(LdaSmi), U8(1),
B(Star), R(10), B(StaDataPropertyInLiteral), R(6), R(7), R(8), R(9),
B(CallRuntime), U16(Runtime::kDefineDataPropertyInLiteral), R(6), U8(5),
B(CallRuntime), U16(Runtime::kToFastProperties), R(4), U8(1), B(CallRuntime), U16(Runtime::kToFastProperties), R(4), U8(1),
B(Star), R(0), B(Star), R(0),
B(Star), R(1), B(Star), R(1),
......
...@@ -285,24 +285,22 @@ handlers: [ ...@@ -285,24 +285,22 @@ handlers: [
snippet: " snippet: "
var a = 'test'; return { [a]: 1 }; var a = 'test'; return { [a]: 1 };
" "
frame size: 7 frame size: 5
parameter count: 1 parameter count: 1
bytecode array length: 33 bytecode array length: 28
bytecodes: [ bytecodes: [
/* 30 E> */ B(StackCheck), /* 30 E> */ B(StackCheck),
/* 42 S> */ B(LdaConstant), U8(0), /* 42 S> */ B(LdaConstant), U8(0),
B(Star), R(0), B(Star), R(0),
/* 50 S> */ B(CreateObjectLiteral), U8(1), U8(0), U8(35), R(1), /* 50 S> */ B(CreateObjectLiteral), U8(1), U8(0), U8(35), R(1),
/* 60 E> */ B(ToName), R(3), /* 60 E> */ B(ToName), R(2),
B(LdaSmi), U8(1), B(LdaSmi), U8(1),
B(Star), R(4), B(Star), R(3),
B(LdaZero), B(LdaZero),
B(Star), R(5), B(Star), R(4),
B(LdaZero), B(LdaZero),
B(Star), R(6), B(StaDataPropertyInLiteral), R(1), R(2), R(3), R(4),
B(Mov), R(1), R(2), B(Ldar), R(1),
B(CallRuntime), U16(Runtime::kDefineDataPropertyInLiteral), R(2), U8(5),
B(Ldar), R(2),
/* 69 S> */ B(Return), /* 69 S> */ B(Return),
] ]
constant pool: [ constant pool: [
...@@ -316,25 +314,23 @@ handlers: [ ...@@ -316,25 +314,23 @@ handlers: [
snippet: " snippet: "
var a = 'test'; return { val: a, [a]: 1 }; var a = 'test'; return { val: a, [a]: 1 };
" "
frame size: 7 frame size: 5
parameter count: 1 parameter count: 1
bytecode array length: 37 bytecode array length: 32
bytecodes: [ bytecodes: [
/* 30 E> */ B(StackCheck), /* 30 E> */ B(StackCheck),
/* 42 S> */ B(LdaConstant), U8(0), /* 42 S> */ B(LdaConstant), U8(0),
B(Star), R(0), B(Star), R(0),
/* 50 S> */ B(CreateObjectLiteral), U8(1), U8(0), U8(1), R(1), /* 50 S> */ B(CreateObjectLiteral), U8(1), U8(0), U8(1), R(1),
/* 64 E> */ B(StaNamedPropertySloppy), R(1), U8(2), U8(2), /* 64 E> */ B(StaNamedPropertySloppy), R(1), U8(2), U8(2),
/* 68 E> */ B(ToName), R(3), /* 68 E> */ B(ToName), R(2),
B(LdaSmi), U8(1), B(LdaSmi), U8(1),
B(Star), R(4), B(Star), R(3),
B(LdaZero), B(LdaZero),
B(Star), R(5), B(Star), R(4),
B(LdaZero), B(LdaZero),
B(Star), R(6), B(StaDataPropertyInLiteral), R(1), R(2), R(3), R(4),
B(Mov), R(1), R(2), B(Ldar), R(1),
B(CallRuntime), U16(Runtime::kDefineDataPropertyInLiteral), R(2), U8(5),
B(Ldar), R(2),
/* 77 S> */ B(Return), /* 77 S> */ B(Return),
] ]
constant pool: [ constant pool: [
...@@ -349,24 +345,23 @@ handlers: [ ...@@ -349,24 +345,23 @@ handlers: [
snippet: " snippet: "
var a = 'test'; return { [a]: 1, __proto__: {} }; var a = 'test'; return { [a]: 1, __proto__: {} };
" "
frame size: 7 frame size: 5
parameter count: 1 parameter count: 1
bytecode array length: 46 bytecode array length: 44
bytecodes: [ bytecodes: [
/* 30 E> */ B(StackCheck), /* 30 E> */ B(StackCheck),
/* 42 S> */ B(LdaConstant), U8(0), /* 42 S> */ B(LdaConstant), U8(0),
B(Star), R(0), B(Star), R(0),
/* 50 S> */ B(CreateObjectLiteral), U8(1), U8(1), U8(35), R(1), /* 50 S> */ B(CreateObjectLiteral), U8(1), U8(1), U8(35), R(1),
/* 60 E> */ B(ToName), R(3), /* 60 E> */ B(ToName), R(2),
B(LdaSmi), U8(1), B(LdaSmi), U8(1),
B(Star), R(4), B(Star), R(3),
B(LdaZero), B(LdaZero),
B(Star), R(5), B(Star), R(4),
B(LdaZero), B(LdaZero),
B(Star), R(6), B(StaDataPropertyInLiteral), R(1), R(2), R(3), R(4),
B(Mov), R(1), R(2),
B(CallRuntime), U16(Runtime::kDefineDataPropertyInLiteral), R(2), U8(5),
B(CreateObjectLiteral), U8(1), U8(0), U8(35), R(4), B(CreateObjectLiteral), U8(1), U8(0), U8(35), R(4),
B(Mov), R(1), R(2),
B(Mov), R(4), R(3), B(Mov), R(4), R(3),
B(CallRuntime), U16(Runtime::kInternalSetPrototype), R(2), U8(2), B(CallRuntime), U16(Runtime::kInternalSetPrototype), R(2), U8(2),
B(Ldar), R(2), B(Ldar), R(2),
...@@ -383,29 +378,28 @@ handlers: [ ...@@ -383,29 +378,28 @@ handlers: [
snippet: " snippet: "
var n = 'name'; return { [n]: 'val', get a() { }, set a(b) {} }; var n = 'name'; return { [n]: 'val', get a() { }, set a(b) {} };
" "
frame size: 7 frame size: 6
parameter count: 1 parameter count: 1
bytecode array length: 67 bytecode array length: 65
bytecodes: [ bytecodes: [
/* 30 E> */ B(StackCheck), /* 30 E> */ B(StackCheck),
/* 42 S> */ B(LdaConstant), U8(0), /* 42 S> */ B(LdaConstant), U8(0),
B(Star), R(0), B(Star), R(0),
/* 50 S> */ B(CreateObjectLiteral), U8(1), U8(0), U8(35), R(1), /* 50 S> */ B(CreateObjectLiteral), U8(1), U8(0), U8(35), R(1),
/* 60 E> */ B(ToName), R(3), /* 60 E> */ B(ToName), R(2),
B(LdaConstant), U8(2), B(LdaConstant), U8(2),
B(Star), R(4), B(Star), R(3),
B(LdaZero), B(LdaZero),
B(Star), R(5), B(Star), R(4),
B(LdaZero), B(LdaZero),
B(Star), R(6), B(StaDataPropertyInLiteral), R(1), R(2), R(3), R(4),
B(Mov), R(1), R(2),
B(CallRuntime), U16(Runtime::kDefineDataPropertyInLiteral), R(2), U8(5),
B(LdaConstant), U8(3), B(LdaConstant), U8(3),
B(ToName), R(3), B(ToName), R(3),
B(CreateClosure), U8(4), U8(2), B(CreateClosure), U8(4), U8(2),
B(Star), R(4), B(Star), R(4),
B(LdaZero), B(LdaZero),
B(Star), R(5), B(Star), R(5),
B(Mov), R(1), R(2),
B(CallRuntime), U16(Runtime::kDefineGetterPropertyUnchecked), R(2), U8(4), B(CallRuntime), U16(Runtime::kDefineGetterPropertyUnchecked), R(2), U8(4),
B(LdaConstant), U8(3), B(LdaConstant), U8(3),
B(ToName), R(3), B(ToName), R(3),
......
...@@ -261,7 +261,6 @@ TestNumericNamesSetter(['1.2', '1.3'], { ...@@ -261,7 +261,6 @@ TestNumericNamesSetter(['1.2', '1.3'], {
set 1.30(_) {; } set 1.30(_) {; }
}); });
(function TestPrototypeInObjectLiteral() { (function TestPrototypeInObjectLiteral() {
// The prototype chain should not be used if the definition // The prototype chain should not be used if the definition
// happens in the object literal. // happens in the object literal.
......
...@@ -302,6 +302,8 @@ TEST_F(BytecodeArrayBuilderTest, AllBytecodesGenerated) { ...@@ -302,6 +302,8 @@ TEST_F(BytecodeArrayBuilderTest, AllBytecodesGenerated) {
.StoreNamedProperty(reg, wide_name, 0, LanguageMode::STRICT) .StoreNamedProperty(reg, wide_name, 0, LanguageMode::STRICT)
.StoreKeyedProperty(reg, reg, 2056, LanguageMode::STRICT); .StoreKeyedProperty(reg, reg, 2056, LanguageMode::STRICT);
builder.StoreDataPropertyInLiteral(reg, reg, reg, reg);
// Emit wide context operations. // Emit wide context operations.
builder.LoadContextSlot(reg, 1024, 0).StoreContextSlot(reg, 1024, 0); builder.LoadContextSlot(reg, 1024, 0).StoreContextSlot(reg, 1024, 0);
......
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