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 = |