Index: src/fast-accessor-assembler.cc |
diff --git a/src/fast-accessor-assembler.cc b/src/fast-accessor-assembler.cc |
index dd4fe01520a623852bf82f9e69b03d14a545fb3b..fbec6d6fc33e69b47b217dbc4780d7b93b2e20e7 100644 |
--- a/src/fast-accessor-assembler.cc |
+++ b/src/fast-accessor-assembler.cc |
@@ -10,17 +10,20 @@ |
#include "src/handles-inl.h" |
#include "src/objects.h" // For FAA::LoadInternalField impl. |
-using v8::internal::compiler::Node; |
- |
namespace v8 { |
namespace internal { |
+using compiler::Node; |
+using compiler::CodeAssemblerLabel; |
+using compiler::CodeAssemblerVariable; |
+ |
FastAccessorAssembler::FastAccessorAssembler(Isolate* isolate) |
: zone_(isolate->allocator(), ZONE_NAME), |
isolate_(isolate), |
- assembler_state_(isolate, zone(), 1, Code::ComputeFlags(Code::STUB), |
- "FastAccessorAssembler"), |
- assembler_(new CodeStubAssembler(&assembler_state_)), |
+ assembler_state_(new compiler::CodeAssemblerState( |
+ isolate, zone(), 1, Code::ComputeFlags(Code::STUB), |
+ "FastAccessorAssembler")), |
+ assembler_(new CodeStubAssembler(assembler_state_.get())), |
state_(kBuilding) {} |
FastAccessorAssembler::~FastAccessorAssembler() { Clear(); } |
@@ -39,19 +42,18 @@ FastAccessorAssembler::ValueId FastAccessorAssembler::GetReceiver() { |
} |
FastAccessorAssembler::ValueId FastAccessorAssembler::LoadInternalField( |
- ValueId value, int field_no) { |
+ ValueId value_id, int field_no) { |
CHECK_EQ(kBuilding, state_); |
- CodeStubAssembler::Variable result(assembler_.get(), |
- MachineRepresentation::kTagged); |
+ CodeAssemblerVariable result(assembler_.get(), |
+ MachineRepresentation::kTagged); |
LabelId is_not_jsobject = MakeLabel(); |
- CodeStubAssembler::Label merge(assembler_.get(), &result); |
+ CodeAssemblerLabel merge(assembler_.get(), &result); |
- CheckIsJSObjectOrJump(value, is_not_jsobject); |
+ CheckIsJSObjectOrJump(value_id, is_not_jsobject); |
Node* internal_field = assembler_->LoadObjectField( |
- FromId(value), JSObject::kHeaderSize + kPointerSize * field_no, |
- MachineType::Pointer()); |
+ FromId(value_id), JSObject::kHeaderSize + kPointerSize * field_no); |
result.Bind(internal_field); |
assembler_->Goto(&merge); |
@@ -67,14 +69,15 @@ FastAccessorAssembler::ValueId FastAccessorAssembler::LoadInternalField( |
} |
FastAccessorAssembler::ValueId |
-FastAccessorAssembler::LoadInternalFieldUnchecked(ValueId value, int field_no) { |
+FastAccessorAssembler::LoadInternalFieldUnchecked(ValueId value_id, |
+ int field_no) { |
CHECK_EQ(kBuilding, state_); |
// Defensive debug checks. |
if (FLAG_debug_code) { |
LabelId is_jsobject = MakeLabel(); |
LabelId is_not_jsobject = MakeLabel(); |
- CheckIsJSObjectOrJump(value, is_not_jsobject); |
+ CheckIsJSObjectOrJump(value_id, is_not_jsobject); |
assembler_->Goto(FromId(is_jsobject)); |
SetLabel(is_not_jsobject); |
@@ -85,58 +88,56 @@ FastAccessorAssembler::LoadInternalFieldUnchecked(ValueId value, int field_no) { |
} |
Node* result = assembler_->LoadObjectField( |
- FromId(value), JSObject::kHeaderSize + kPointerSize * field_no, |
- MachineType::Pointer()); |
+ FromId(value_id), JSObject::kHeaderSize + kPointerSize * field_no); |
return FromRaw(result); |
} |
-FastAccessorAssembler::ValueId FastAccessorAssembler::LoadValue(ValueId value, |
- int offset) { |
+FastAccessorAssembler::ValueId FastAccessorAssembler::LoadValue( |
+ ValueId value_id, int offset) { |
CHECK_EQ(kBuilding, state_); |
- return FromRaw(assembler_->LoadBufferObject(FromId(value), offset, |
+ return FromRaw(assembler_->LoadBufferObject(FromId(value_id), offset, |
MachineType::IntPtr())); |
} |
-FastAccessorAssembler::ValueId FastAccessorAssembler::LoadObject(ValueId value, |
- int offset) { |
+FastAccessorAssembler::ValueId FastAccessorAssembler::LoadObject( |
+ ValueId value_id, int offset) { |
CHECK_EQ(kBuilding, state_); |
return FromRaw(assembler_->LoadBufferObject( |
- assembler_->LoadBufferObject(FromId(value), offset, |
- MachineType::Pointer()), |
- 0, MachineType::AnyTagged())); |
+ assembler_->LoadBufferObject(FromId(value_id), offset), 0, |
+ MachineType::AnyTagged())); |
} |
-FastAccessorAssembler::ValueId FastAccessorAssembler::ToSmi(ValueId value) { |
+FastAccessorAssembler::ValueId FastAccessorAssembler::ToSmi(ValueId value_id) { |
CHECK_EQ(kBuilding, state_); |
- return FromRaw(assembler_->SmiTag(FromId(value))); |
+ return FromRaw(assembler_->SmiTag(FromId(value_id))); |
} |
-void FastAccessorAssembler::ReturnValue(ValueId value) { |
+void FastAccessorAssembler::ReturnValue(ValueId value_id) { |
CHECK_EQ(kBuilding, state_); |
- assembler_->Return(FromId(value)); |
+ assembler_->Return(FromId(value_id)); |
} |
-void FastAccessorAssembler::CheckFlagSetOrReturnNull(ValueId value, int mask) { |
+void FastAccessorAssembler::CheckFlagSetOrReturnNull(ValueId value_id, |
+ int mask) { |
CHECK_EQ(kBuilding, state_); |
- CodeStubAssembler::Label pass(assembler_.get()); |
- CodeStubAssembler::Label fail(assembler_.get()); |
+ CodeAssemblerLabel pass(assembler_.get()); |
+ CodeAssemblerLabel fail(assembler_.get()); |
+ Node* value = FromId(value_id); |
assembler_->Branch( |
- assembler_->Word32Equal( |
- assembler_->Word32And(FromId(value), assembler_->Int32Constant(mask)), |
- assembler_->Int32Constant(0)), |
- &fail, &pass); |
+ assembler_->IsSetWord(assembler_->BitcastTaggedToWord(value), mask), |
+ &pass, &fail); |
assembler_->Bind(&fail); |
assembler_->Return(assembler_->NullConstant()); |
assembler_->Bind(&pass); |
} |
-void FastAccessorAssembler::CheckNotZeroOrReturnNull(ValueId value) { |
+void FastAccessorAssembler::CheckNotZeroOrReturnNull(ValueId value_id) { |
CHECK_EQ(kBuilding, state_); |
- CodeStubAssembler::Label is_null(assembler_.get()); |
- CodeStubAssembler::Label not_null(assembler_.get()); |
+ CodeAssemblerLabel is_null(assembler_.get()); |
+ CodeAssemblerLabel not_null(assembler_.get()); |
assembler_->Branch( |
- assembler_->WordEqual(FromId(value), assembler_->IntPtrConstant(0)), |
+ assembler_->WordEqual(FromId(value_id), assembler_->SmiConstant(0)), |
&is_null, ¬_null); |
assembler_->Bind(&is_null); |
assembler_->Return(assembler_->NullConstant()); |
@@ -145,7 +146,7 @@ void FastAccessorAssembler::CheckNotZeroOrReturnNull(ValueId value) { |
FastAccessorAssembler::LabelId FastAccessorAssembler::MakeLabel() { |
CHECK_EQ(kBuilding, state_); |
- return FromRaw(new CodeStubAssembler::Label(assembler_.get())); |
+ return FromRaw(new CodeAssemblerLabel(assembler_.get())); |
} |
void FastAccessorAssembler::SetLabel(LabelId label_id) { |
@@ -161,9 +162,9 @@ void FastAccessorAssembler::Goto(LabelId label_id) { |
void FastAccessorAssembler::CheckNotZeroOrJump(ValueId value_id, |
LabelId label_id) { |
CHECK_EQ(kBuilding, state_); |
- CodeStubAssembler::Label pass(assembler_.get()); |
+ CodeAssemblerLabel pass(assembler_.get()); |
assembler_->Branch( |
- assembler_->WordEqual(FromId(value_id), assembler_->IntPtrConstant(0)), |
+ assembler_->WordEqual(FromId(value_id), assembler_->SmiConstant(0)), |
FromId(label_id), &pass); |
assembler_->Bind(&pass); |
} |
@@ -216,28 +217,20 @@ void FastAccessorAssembler::CheckIsJSObjectOrJump(ValueId value_id, |
CHECK_EQ(kBuilding, state_); |
// Determine the 'value' object's instance type. |
- Node* object_map = assembler_->LoadObjectField( |
- FromId(value_id), Internals::kHeapObjectMapOffset, |
- MachineType::Pointer()); |
+ Node* instance_type = assembler_->LoadInstanceType(FromId(value_id)); |
- Node* instance_type = assembler_->WordAnd( |
- assembler_->LoadObjectField(object_map, |
- Internals::kMapInstanceTypeAndBitFieldOffset, |
- MachineType::Uint16()), |
- assembler_->IntPtrConstant(0xff)); |
- |
- CodeStubAssembler::Label is_jsobject(assembler_.get()); |
+ CodeAssemblerLabel is_jsobject(assembler_.get()); |
// Check whether we have a proper JSObject. |
assembler_->GotoIf( |
- assembler_->WordEqual( |
- instance_type, assembler_->IntPtrConstant(Internals::kJSObjectType)), |
+ assembler_->Word32Equal( |
+ instance_type, assembler_->Int32Constant(Internals::kJSObjectType)), |
&is_jsobject); |
// JSApiObject?. |
assembler_->GotoUnless( |
- assembler_->WordEqual(instance_type, assembler_->IntPtrConstant( |
- Internals::kJSApiObjectType)), |
+ assembler_->Word32Equal(instance_type, assembler_->Int32Constant( |
+ Internals::kJSApiObjectType)), |
FromId(label_id)); |
// Continue. |
@@ -247,7 +240,8 @@ void FastAccessorAssembler::CheckIsJSObjectOrJump(ValueId value_id, |
MaybeHandle<Code> FastAccessorAssembler::Build() { |
CHECK_EQ(kBuilding, state_); |
- Handle<Code> code = compiler::CodeAssembler::GenerateCode(&assembler_state_); |
+ Handle<Code> code = compiler::CodeAssembler::GenerateCode( |
+ assembler_state_.get(), FLAG_csa_verify); |
state_ = !code.is_null() ? kBuilt : kError; |
Clear(); |
return code; |
@@ -255,12 +249,12 @@ MaybeHandle<Code> FastAccessorAssembler::Build() { |
FastAccessorAssembler::ValueId FastAccessorAssembler::FromRaw(Node* node) { |
nodes_.push_back(node); |
- ValueId value = {nodes_.size() - 1}; |
- return value; |
+ ValueId value_id = {nodes_.size() - 1}; |
+ return value_id; |
} |
FastAccessorAssembler::LabelId FastAccessorAssembler::FromRaw( |
- CodeStubAssembler::Label* label) { |
+ CodeAssemblerLabel* label) { |
labels_.push_back(label); |
LabelId label_id = {labels_.size() - 1}; |
return label_id; |
@@ -272,7 +266,7 @@ Node* FastAccessorAssembler::FromId(ValueId value) const { |
return nodes_.at(value.value_id); |
} |
-CodeStubAssembler::Label* FastAccessorAssembler::FromId(LabelId label) const { |
+CodeAssemblerLabel* FastAccessorAssembler::FromId(LabelId label) const { |
CHECK_LT(label.label_id, labels_.size()); |
CHECK_NOT_NULL(labels_.at(label.label_id)); |
return labels_.at(label.label_id); |