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

Unified Diff: src/builtins/builtins-array-gen.cc

Issue 2796343002: [builtins] Implement %TypedArray%.prototype.{reduce,reduceRight} in the CSA (Closed)
Patch Set: Rebased. Created 3 years, 8 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
« no previous file with comments | « src/bootstrapper.cc ('k') | src/builtins/builtins-definitions.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/builtins/builtins-array-gen.cc
diff --git a/src/builtins/builtins-array-gen.cc b/src/builtins/builtins-array-gen.cc
index 0651030455674766227a4f3632dccf1cb46594f4..aad31db8a17d8bbb65347533377e61299e455279 100644
--- a/src/builtins/builtins-array-gen.cc
+++ b/src/builtins/builtins-array-gen.cc
@@ -13,8 +13,8 @@ class ArrayBuiltinCodeStubAssembler : public CodeStubAssembler {
public:
explicit ArrayBuiltinCodeStubAssembler(compiler::CodeAssemblerState* state)
: CodeStubAssembler(state),
- k_(this, MachineRepresentation::kTagged, SmiConstant(0)),
- a_(this, MachineRepresentation::kTagged, SmiConstant(0)),
+ k_(this, MachineRepresentation::kTagged),
+ a_(this, MachineRepresentation::kTagged),
to_(this, MachineRepresentation::kTagged, SmiConstant(0)) {}
typedef std::function<Node*(ArrayBuiltinCodeStubAssembler* masm)>
@@ -186,9 +186,6 @@ class ArrayBuiltinCodeStubAssembler : public CodeStubAssembler {
new_target_ = new_target;
callbackfn_ = callbackfn;
this_arg_ = this_arg;
-
- k_.Bind(SmiConstant(0));
- a_.Bind(UndefinedConstant());
}
void GenerateIteratingArrayBuiltinBody(
@@ -261,8 +258,7 @@ class ArrayBuiltinCodeStubAssembler : public CodeStubAssembler {
// 7. Let k be 0.
k_.Bind(SmiConstant(0));
} else {
- k_.Bind(len());
- k_.Bind(NumberDec(k_.value()));
+ k_.Bind(NumberDec(len()));
}
a_.Bind(generator(this));
@@ -297,7 +293,8 @@ class ArrayBuiltinCodeStubAssembler : public CodeStubAssembler {
void GenerateIteratingTypedArrayBuiltinBody(
const char* name, const BuiltinResultGenerator& generator,
- const CallResultProcessor& processor, const PostLoopAction& action) {
+ const CallResultProcessor& processor, const PostLoopAction& action,
+ ForEachDirection direction = ForEachDirection::kForward) {
Node* name_string =
HeapConstant(isolate()->factory()->NewStringFromAsciiChecked(name));
@@ -364,6 +361,12 @@ class ArrayBuiltinCodeStubAssembler : public CodeStubAssembler {
}
BIND(&distinguish_types);
+
+ if (direction == ForEachDirection::kForward) {
+ k_.Bind(SmiConstant(0));
+ } else {
+ k_.Bind(NumberDec(len()));
+ }
a_.Bind(generator(this));
Node* elements_type = LoadInstanceType(LoadElements(o_));
Switch(elements_type, &unexpected_instance_type, instance_types.data(),
@@ -377,11 +380,11 @@ class ArrayBuiltinCodeStubAssembler : public CodeStubAssembler {
VisitAllTypedArrayElements(
ElementsKindForInstanceType(
static_cast<InstanceType>(instance_types[i])),
- array_buffer, processor, &done);
+ array_buffer, processor, &done, direction);
Goto(&done);
- action(this);
// No exception, return success
BIND(&done);
+ action(this);
Return(a_.value());
}
}
@@ -458,7 +461,7 @@ class ArrayBuiltinCodeStubAssembler : public CodeStubAssembler {
void VisitAllTypedArrayElements(ElementsKind kind, Node* array_buffer,
const CallResultProcessor& processor,
- Label* detached) {
+ Label* detached, ForEachDirection direction) {
VariableList list({&a_, &k_, &to_}, zone());
FastLoopBody body = [&](Node* index) {
@@ -475,8 +478,17 @@ class ArrayBuiltinCodeStubAssembler : public CodeStubAssembler {
k_.Bind(index);
a_.Bind(processor(this, value, index));
};
- BuildFastLoop(list, SmiConstant(0), len_, body, 1,
- ParameterMode::SMI_PARAMETERS, IndexAdvanceMode::kPost);
+ Node* start = SmiConstant(0);
+ Node* end = len_;
+ IndexAdvanceMode advance_mode = IndexAdvanceMode::kPost;
+ int incr = 1;
+ if (direction == ForEachDirection::kReverse) {
+ std::swap(start, end);
+ advance_mode = IndexAdvanceMode::kPre;
+ incr = -1;
+ }
+ BuildFastLoop(list, start, end, body, incr, ParameterMode::SMI_PARAMETERS,
+ advance_mode);
}
void VisitAllFastElementsOneKind(ElementsKind kind,
@@ -948,6 +960,23 @@ TF_BUILTIN(ArrayReduce, ArrayBuiltinCodeStubAssembler) {
CodeFactory::ArrayReduceLoopContinuation(isolate()));
}
+TF_BUILTIN(TypedArrayPrototypeReduce, ArrayBuiltinCodeStubAssembler) {
+ Node* context = Parameter(Descriptor::kContext);
+ Node* receiver = Parameter(Descriptor::kReceiver);
+ Node* callbackfn = Parameter(Descriptor::kCallbackFn);
+ Node* initial_value = Parameter(Descriptor::kInitialValue);
+ Node* new_target = Parameter(Descriptor::kNewTarget);
+
+ InitIteratingArrayBuiltinBody(context, receiver, callbackfn, initial_value,
+ new_target);
+
+ GenerateIteratingTypedArrayBuiltinBody(
+ "%TypedArray%.prototype.reduce",
+ &ArrayBuiltinCodeStubAssembler::ReduceResultGenerator,
+ &ArrayBuiltinCodeStubAssembler::ReduceProcessor,
+ &ArrayBuiltinCodeStubAssembler::ReducePostLoopAction);
+}
+
TF_BUILTIN(ArrayReduceRightLoopContinuation, ArrayBuiltinCodeStubAssembler) {
Node* context = Parameter(Descriptor::kContext);
Node* receiver = Parameter(Descriptor::kReceiver);
@@ -988,6 +1017,24 @@ TF_BUILTIN(ArrayReduceRight, ArrayBuiltinCodeStubAssembler) {
ForEachDirection::kReverse);
}
+TF_BUILTIN(TypedArrayPrototypeReduceRight, ArrayBuiltinCodeStubAssembler) {
+ Node* context = Parameter(Descriptor::kContext);
+ Node* receiver = Parameter(Descriptor::kReceiver);
+ Node* callbackfn = Parameter(Descriptor::kCallbackFn);
+ Node* initial_value = Parameter(Descriptor::kInitialValue);
+ Node* new_target = Parameter(Descriptor::kNewTarget);
+
+ InitIteratingArrayBuiltinBody(context, receiver, callbackfn, initial_value,
+ new_target);
+
+ GenerateIteratingTypedArrayBuiltinBody(
+ "%TypedArray%.prototype.reduceRight",
+ &ArrayBuiltinCodeStubAssembler::ReduceResultGenerator,
+ &ArrayBuiltinCodeStubAssembler::ReduceProcessor,
+ &ArrayBuiltinCodeStubAssembler::ReducePostLoopAction,
+ ForEachDirection::kReverse);
+}
+
TF_BUILTIN(ArrayFilterLoopContinuation, ArrayBuiltinCodeStubAssembler) {
Node* context = Parameter(Descriptor::kContext);
Node* receiver = Parameter(Descriptor::kReceiver);
« no previous file with comments | « src/bootstrapper.cc ('k') | src/builtins/builtins-definitions.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698