Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(119)

Unified Diff: src/compiler/interpreter-assembler.cc

Issue 1645763003: [Interpreter] TurboFan implementation of intrinsics. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 4 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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, &not_smi);
+ raw_assembler_->Bind(&not_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, &not_smi);
+
+ raw_assembler_->Bind(&not_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 =

Powered by Google App Engine
This is Rietveld 408576698