Chromium Code Reviews| Index: src/compiler/interpreter-assembler.cc |
| diff --git a/src/compiler/interpreter-assembler.cc b/src/compiler/interpreter-assembler.cc |
| index 6d10b150a47622d0130b5b3bec6723365b25282a..4ae1311bcc78b35bc15373e9332cc219b8f6ed82 100644 |
| --- a/src/compiler/interpreter-assembler.cc |
| +++ b/src/compiler/interpreter-assembler.cc |
| @@ -10,6 +10,7 @@ |
| #include "src/compiler/graph.h" |
| #include "src/compiler/instruction-selector.h" |
| #include "src/compiler/linkage.h" |
| +#include "src/compiler/node-properties.h" |
| #include "src/compiler/pipeline.h" |
| #include "src/compiler/raw-machine-assembler.h" |
| #include "src/compiler/schedule.h" |
| @@ -619,6 +620,111 @@ Node* InterpreterAssembler::CallRuntime(Runtime::FunctionId function_id, |
| return return_val; |
| } |
| +Node* InterpreterAssembler::ToBoolean(Node* value) { |
| + RawMachineLabel true_val, false_val, merge; |
| + raw_assembler_->Branch( |
| + raw_assembler_->WordNotEqual(value, raw_assembler_->IntPtrConstant(0)), |
| + &true_val, &false_val); |
| + raw_assembler_->Bind(&true_val); |
| + Node* true_result = raw_assembler_->BooleanConstant(true); |
| + raw_assembler_->Goto(&merge); |
| + raw_assembler_->Bind(&false_val); |
| + Node* false_result = raw_assembler_->BooleanConstant(false); |
| + raw_assembler_->Goto(&merge); |
| + raw_assembler_->Bind(&merge); |
| + return raw_assembler_->Phi(MachineRepresentation::kTagged, true_result, |
| + false_result); |
| +} |
| + |
| +Node* InterpreterAssembler::IsJSReceiver(Node* arg) { |
| + RawMachineLabel is_smi, not_smi, merge; |
| + |
| + Node* check = raw_assembler_->WordEqual( |
| + raw_assembler_->WordAnd(arg, raw_assembler_->IntPtrConstant(kSmiTagMask)), |
| + raw_assembler_->IntPtrConstant(kSmiTag)); |
| + raw_assembler_->Branch(check, &is_smi, ¬_smi); |
| + raw_assembler_->Bind(¬_smi); |
| + STATIC_ASSERT(LAST_TYPE == LAST_JS_RECEIVER_TYPE); |
| + |
| + Node* map = raw_assembler_->Load( |
| + MachineType::AnyTagged(), |
| + raw_assembler_->IntPtrAdd( |
| + arg, raw_assembler_->IntPtrConstant(HeapObject::kMapOffset - |
| + kHeapObjectTag))); |
| + Node* result = ToBoolean(raw_assembler_->Uint32LessThanOrEqual( |
| + raw_assembler_->Int32Constant(FIRST_JS_RECEIVER_TYPE), |
| + raw_assembler_->Load( |
| + MachineType::Uint32(), |
| + raw_assembler_->IntPtrAdd( |
| + map, raw_assembler_->IntPtrConstant(Map::kInstanceTypeOffset - |
| + kHeapObjectTag))))); |
| + raw_assembler_->Goto(&merge); |
| + |
| + raw_assembler_->Bind(&is_smi); |
| + Node* fail_value = raw_assembler_->BooleanConstant(false); |
| + raw_assembler_->Goto(&merge); |
| + |
| + raw_assembler_->Bind(&merge); |
| + return raw_assembler_->Phi(MachineRepresentation::kTagged, result, |
| + fail_value); |
| +} |
| + |
| +Node* InterpreterAssembler::IsJSArray(Node* arg) { |
| + RawMachineLabel is_smi, not_smi, merge; |
| + Node* check = raw_assembler_->WordEqual( |
| + raw_assembler_->WordAnd(arg, raw_assembler_->IntPtrConstant(kSmiTagMask)), |
| + raw_assembler_->IntPtrConstant(kSmiTag)); |
| + raw_assembler_->Branch(check, &is_smi, ¬_smi); |
| + |
| + raw_assembler_->Bind(¬_smi); |
| + Node* map = raw_assembler_->Load( |
| + MachineType::AnyTagged(), arg, |
| + raw_assembler_->IntPtrConstant(HeapObject::kMapOffset - kHeapObjectTag)); |
| + Node* result = raw_assembler_->Word32Equal( |
| + raw_assembler_->Int32Constant(JS_ARRAY_TYPE), |
| + raw_assembler_->Load(MachineType::Uint8(), map, |
| + raw_assembler_->IntPtrConstant( |
| + Map::kInstanceTypeOffset - kHeapObjectTag))); |
| + result = ToBoolean(result); |
| + raw_assembler_->Goto(&merge); |
| + |
| + raw_assembler_->Bind(&is_smi); |
| + Node* fail_value = raw_assembler_->BooleanConstant(false); |
| + raw_assembler_->Goto(&merge); |
| + |
| + raw_assembler_->Bind(&merge); |
| + return raw_assembler_->Phi(MachineRepresentation::kTagged, result, |
| + fail_value); |
| +} |
| + |
| +Node* InterpreterAssembler::IntrinsicOneArg(Node* function_id, Node* arg) { |
| + RawMachineLabel default_label, is_js_receiver, is_array, end; |
| + |
| + int32_t cases[] = {static_cast<int32_t>(Runtime::kInlineIsJSReceiver), |
| + static_cast<int32_t>(Runtime::kInlineIsArray)}; |
| + RawMachineLabel* labels[] = {&is_js_receiver, &is_array}; |
| + Node* return_values[arraysize(cases) + 1]; |
| + arg = raw_assembler_->Load(MachineType::AnyTagged(), arg); |
| + raw_assembler_->Switch(function_id, &default_label, cases, labels, 2); |
| + raw_assembler_->Bind(&is_js_receiver); |
| + return_values[0] = IsJSReceiver(arg); |
| + raw_assembler_->Goto(&end); |
| + // IsArray |
| + raw_assembler_->Bind(&is_array); |
| + return_values[1] = IsJSArray(arg); |
| + raw_assembler_->Goto(&end); |
| + // Default |
| + raw_assembler_->Bind(&default_label); |
| + return_values[2] = raw_assembler_->BooleanConstant(false); |
| + /* return_values[2] = |
|
oth
2016/02/01 09:52:33
Dead code.
epertoso
2016/03/03 11:20:39
Removed.
|
| + CallRuntime(function_id, arg, raw_assembler_->Int32Constant(1), 1);*/ |
| + raw_assembler_->Goto(&end); |
| + |
| + raw_assembler_->Bind(&end); |
| + return raw_assembler_->AddNode( |
| + raw_assembler_->common()->Phi(MachineRepresentation::kBit, 3), 3, |
| + return_values); |
| +} |
| void InterpreterAssembler::Return() { |
| Node* exit_trampoline_code_object = |