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

Side by Side Diff: src/builtins/builtins-array-gen.cc

Issue 2829093004: [turbofan] Avoid going through ArgumentsAdaptorTrampoline for CSA/C++ builtins (Closed)
Patch Set: Merge with ToT 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 unified diff | Download patch
OLDNEW
1 // Copyright 2017 the V8 project authors. All rights reserved. 1 // Copyright 2017 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "src/builtins/builtins-utils-gen.h" 5 #include "src/builtins/builtins-utils-gen.h"
6 #include "src/builtins/builtins.h" 6 #include "src/builtins/builtins.h"
7 #include "src/code-stub-assembler.h" 7 #include "src/code-stub-assembler.h"
8 8
9 namespace v8 { 9 namespace v8 {
10 namespace internal { 10 namespace internal {
(...skipping 28 matching lines...) Expand all
39 } 39 }
40 40
41 Node* SomeResultGenerator() { return FalseConstant(); } 41 Node* SomeResultGenerator() { return FalseConstant(); }
42 42
43 Node* SomeProcessor(Node* k_value, Node* k) { 43 Node* SomeProcessor(Node* k_value, Node* k) {
44 Node* value = CallJS(CodeFactory::Call(isolate()), context(), callbackfn(), 44 Node* value = CallJS(CodeFactory::Call(isolate()), context(), callbackfn(),
45 this_arg(), k_value, k, o()); 45 this_arg(), k_value, k, o());
46 Label false_continue(this), return_true(this); 46 Label false_continue(this), return_true(this);
47 BranchIfToBooleanIsTrue(value, &return_true, &false_continue); 47 BranchIfToBooleanIsTrue(value, &return_true, &false_continue);
48 BIND(&return_true); 48 BIND(&return_true);
49 Return(TrueConstant()); 49 ReturnFromBuiltin(TrueConstant());
50 BIND(&false_continue); 50 BIND(&false_continue);
51 return a(); 51 return a();
52 } 52 }
53 53
54 Node* EveryResultGenerator() { return TrueConstant(); } 54 Node* EveryResultGenerator() { return TrueConstant(); }
55 55
56 Node* EveryProcessor(Node* k_value, Node* k) { 56 Node* EveryProcessor(Node* k_value, Node* k) {
57 Node* value = CallJS(CodeFactory::Call(isolate()), context(), callbackfn(), 57 Node* value = CallJS(CodeFactory::Call(isolate()), context(), callbackfn(),
58 this_arg(), k_value, k, o()); 58 this_arg(), k_value, k, o());
59 Label true_continue(this), return_false(this); 59 Label true_continue(this), return_false(this);
60 BranchIfToBooleanIsTrue(value, &true_continue, &return_false); 60 BranchIfToBooleanIsTrue(value, &true_continue, &return_false);
61 BIND(&return_false); 61 BIND(&return_false);
62 Return(FalseConstant()); 62 ReturnFromBuiltin(FalseConstant());
63 BIND(&true_continue); 63 BIND(&true_continue);
64 return a(); 64 return a();
65 } 65 }
66 66
67 Node* ReduceResultGenerator() { 67 Node* ReduceResultGenerator() { return this_arg(); }
68 VARIABLE(a, MachineRepresentation::kTagged, UndefinedConstant());
69 Label no_initial_value(this), has_initial_value(this), done(this, {&a});
70
71 // 8. If initialValue is present, then
72 Node* parent_frame_ptr = LoadParentFramePointer();
73 Node* marker_or_function = LoadBufferObject(
74 parent_frame_ptr, CommonFrameConstants::kContextOrFrameTypeOffset);
75 GotoIf(
76 MarkerIsNotFrameType(marker_or_function, StackFrame::ARGUMENTS_ADAPTOR),
77 &has_initial_value);
78
79 // Has arguments adapter, check count.
80 Node* adapted_parameter_count = LoadBufferObject(
81 parent_frame_ptr, ArgumentsAdaptorFrameConstants::kLengthOffset);
82 Branch(SmiLessThan(adapted_parameter_count,
83 SmiConstant(IteratingArrayBuiltinDescriptor::kThisArg)),
84 &no_initial_value, &has_initial_value);
85
86 // a. Set accumulator to initialValue.
87 BIND(&has_initial_value);
88 a.Bind(this_arg());
89 Goto(&done);
90
91 // 9. Else initialValue is not present,
92 BIND(&no_initial_value);
93
94 // a. Let kPresent be false.
95 a.Bind(TheHoleConstant());
96 Goto(&done);
97 BIND(&done);
98 return a.value();
99 }
100 68
101 Node* ReduceProcessor(Node* k_value, Node* k) { 69 Node* ReduceProcessor(Node* k_value, Node* k) {
102 VARIABLE(result, MachineRepresentation::kTagged); 70 VARIABLE(result, MachineRepresentation::kTagged);
103 Label done(this, {&result}), initial(this); 71 Label done(this, {&result}), initial(this);
104 GotoIf(WordEqual(a(), TheHoleConstant()), &initial); 72 GotoIf(WordEqual(a(), TheHoleConstant()), &initial);
105 result.Bind(CallJS(CodeFactory::Call(isolate()), context(), callbackfn(), 73 result.Bind(CallJS(CodeFactory::Call(isolate()), context(), callbackfn(),
106 UndefinedConstant(), a(), k_value, k, o())); 74 UndefinedConstant(), a(), k_value, k, o()));
107 Goto(&done); 75 Goto(&done);
108 76
109 BIND(&initial); 77 BIND(&initial);
(...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after
259 BIND(&finished); 227 BIND(&finished);
260 return a(); 228 return a();
261 } 229 }
262 230
263 void NullPostLoopAction() {} 231 void NullPostLoopAction() {}
264 232
265 protected: 233 protected:
266 Node* context() { return context_; } 234 Node* context() { return context_; }
267 Node* receiver() { return receiver_; } 235 Node* receiver() { return receiver_; }
268 Node* new_target() { return new_target_; } 236 Node* new_target() { return new_target_; }
237 Node* argc() { return argc_; }
269 Node* o() { return o_; } 238 Node* o() { return o_; }
270 Node* len() { return len_; } 239 Node* len() { return len_; }
271 Node* callbackfn() { return callbackfn_; } 240 Node* callbackfn() { return callbackfn_; }
272 Node* this_arg() { return this_arg_; } 241 Node* this_arg() { return this_arg_; }
273 Node* k() { return k_.value(); } 242 Node* k() { return k_.value(); }
274 Node* a() { return a_.value(); } 243 Node* a() { return a_.value(); }
275 244
245 void ReturnFromBuiltin(Node* value) {
246 if (argc_ == nullptr) {
247 Return(value);
248 } else {
249 PopAndReturn(IntPtrAdd(argc_, IntPtrConstant(1)), value);
Igor Sheludko 2017/04/27 10:38:05 It would be nice to have a comment that +1 is here
danno 2017/04/28 06:58:10 Done.
250 }
251 }
252
276 void InitIteratingArrayBuiltinBody(Node* context, Node* receiver, 253 void InitIteratingArrayBuiltinBody(Node* context, Node* receiver,
277 Node* callbackfn, Node* this_arg, 254 Node* callbackfn, Node* this_arg,
278 Node* new_target) { 255 Node* new_target, Node* argc) {
279 context_ = context; 256 context_ = context;
280 receiver_ = receiver; 257 receiver_ = receiver;
281 new_target_ = new_target; 258 new_target_ = new_target;
282 callbackfn_ = callbackfn; 259 callbackfn_ = callbackfn;
283 this_arg_ = this_arg; 260 this_arg_ = this_arg;
261 argc_ = argc;
284 } 262 }
285 263
286 void GenerateIteratingArrayBuiltinBody( 264 void GenerateIteratingArrayBuiltinBody(
287 const char* name, const BuiltinResultGenerator& generator, 265 const char* name, const BuiltinResultGenerator& generator,
288 const CallResultProcessor& processor, const PostLoopAction& action, 266 const CallResultProcessor& processor, const PostLoopAction& action,
289 const Callable& slow_case_continuation, 267 const Callable& slow_case_continuation,
290 ForEachDirection direction = ForEachDirection::kForward) { 268 ForEachDirection direction = ForEachDirection::kForward) {
291 Label non_array(this), slow(this, {&k_, &a_, &to_}), 269 Label non_array(this), slow(this, {&k_, &a_, &to_}),
292 array_changes(this, {&k_, &a_, &to_}); 270 array_changes(this, {&k_, &a_, &to_});
293 271
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
355 } else { 333 } else {
356 k_.Bind(NumberDec(len())); 334 k_.Bind(NumberDec(len()));
357 } 335 }
358 336
359 a_.Bind(generator(this)); 337 a_.Bind(generator(this));
360 338
361 HandleFastElements(processor, action, &slow, direction); 339 HandleFastElements(processor, action, &slow, direction);
362 340
363 BIND(&slow); 341 BIND(&slow);
364 342
365 Node* target = LoadFromFrame(StandardFrameConstants::kFunctionOffset, 343 Node* result =
366 MachineType::TaggedPointer()); 344 CallStub(slow_case_continuation, context(), receiver(), callbackfn(),
367 TailCallStub( 345 this_arg(), a_.value(), o(), k_.value(), len(), to_.value());
368 slow_case_continuation, context(), target, new_target(), 346 ReturnFromBuiltin(result);
369 Int32Constant(IteratingArrayBuiltinLoopContinuationDescriptor::kArity),
370 receiver(), callbackfn(), this_arg(), a_.value(), o(), k_.value(),
371 len(), to_.value());
372 } 347 }
373 348
374 void InitIteratingArrayBuiltinLoopContinuation(Node* context, Node* receiver, 349 void InitIteratingArrayBuiltinLoopContinuation(Node* context, Node* receiver,
375 Node* callbackfn, 350 Node* callbackfn,
376 Node* this_arg, Node* a, 351 Node* this_arg, Node* a,
377 Node* o, Node* initial_k, 352 Node* o, Node* initial_k,
378 Node* len, Node* to) { 353 Node* len, Node* to) {
379 context_ = context; 354 context_ = context;
380 this_arg_ = this_arg; 355 this_arg_ = this_arg;
381 callbackfn_ = callbackfn; 356 callbackfn_ = callbackfn;
357 argc_ = nullptr;
382 a_.Bind(a); 358 a_.Bind(a);
383 k_.Bind(initial_k); 359 k_.Bind(initial_k);
384 o_ = o; 360 o_ = o;
385 len_ = len; 361 len_ = len;
386 to_.Bind(to); 362 to_.Bind(to);
387 } 363 }
388 364
389 void GenerateIteratingTypedArrayBuiltinBody( 365 void GenerateIteratingTypedArrayBuiltinBody(
390 const char* name, const BuiltinResultGenerator& generator, 366 const char* name, const BuiltinResultGenerator& generator,
391 const CallResultProcessor& processor, const PostLoopAction& action, 367 const CallResultProcessor& processor, const PostLoopAction& action,
(...skipping 283 matching lines...) Expand 10 before | Expand all | Expand 10 after
675 651
676 ParameterMode mode = OptimalParameterMode(); 652 ParameterMode mode = OptimalParameterMode();
677 BIND(&fast_elements); 653 BIND(&fast_elements);
678 { 654 {
679 VisitAllFastElementsOneKind(FAST_ELEMENTS, processor, slow, mode, 655 VisitAllFastElementsOneKind(FAST_ELEMENTS, processor, slow, mode,
680 direction); 656 direction);
681 657
682 action(this); 658 action(this);
683 659
684 // No exception, return success 660 // No exception, return success
685 Return(a_.value()); 661 ReturnFromBuiltin(a_.value());
686 } 662 }
687 663
688 BIND(&maybe_double_elements); 664 BIND(&maybe_double_elements);
689 Branch(IsElementsKindGreaterThan(kind, FAST_HOLEY_DOUBLE_ELEMENTS), slow, 665 Branch(IsElementsKindGreaterThan(kind, FAST_HOLEY_DOUBLE_ELEMENTS), slow,
690 &fast_double_elements); 666 &fast_double_elements);
691 667
692 BIND(&fast_double_elements); 668 BIND(&fast_double_elements);
693 { 669 {
694 VisitAllFastElementsOneKind(FAST_DOUBLE_ELEMENTS, processor, slow, mode, 670 VisitAllFastElementsOneKind(FAST_DOUBLE_ELEMENTS, processor, slow, mode,
695 direction); 671 direction);
696 672
697 action(this); 673 action(this);
698 674
699 // No exception, return success 675 // No exception, return success
700 Return(a_.value()); 676 ReturnFromBuiltin(a_.value());
701 } 677 }
702 } 678 }
703 679
704 Node* callbackfn_ = nullptr; 680 Node* callbackfn_ = nullptr;
705 Node* o_ = nullptr; 681 Node* o_ = nullptr;
706 Node* this_arg_ = nullptr; 682 Node* this_arg_ = nullptr;
707 Node* len_ = nullptr; 683 Node* len_ = nullptr;
708 Node* context_ = nullptr; 684 Node* context_ = nullptr;
709 Node* receiver_ = nullptr; 685 Node* receiver_ = nullptr;
710 Node* new_target_ = nullptr; 686 Node* new_target_ = nullptr;
687 Node* argc_ = nullptr;
711 Variable k_; 688 Variable k_;
712 Variable a_; 689 Variable a_;
713 Variable to_; 690 Variable to_;
714 }; 691 };
715 692
716 TF_BUILTIN(FastArrayPush, CodeStubAssembler) { 693 TF_BUILTIN(FastArrayPush, CodeStubAssembler) {
717 VARIABLE(arg_index, MachineType::PointerRepresentation()); 694 VARIABLE(arg_index, MachineType::PointerRepresentation());
718 Label default_label(this, &arg_index); 695 Label default_label(this, &arg_index);
719 Label smi_transition(this); 696 Label smi_transition(this);
720 Label object_push_pre(this); 697 Label object_push_pre(this);
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after
856 InitIteratingArrayBuiltinLoopContinuation(context, receiver, callbackfn, 833 InitIteratingArrayBuiltinLoopContinuation(context, receiver, callbackfn,
857 this_arg, array, object, initial_k, 834 this_arg, array, object, initial_k,
858 len, to); 835 len, to);
859 836
860 GenerateIteratingArrayBuiltinLoopContinuation( 837 GenerateIteratingArrayBuiltinLoopContinuation(
861 &ArrayBuiltinCodeStubAssembler::ForEachProcessor, 838 &ArrayBuiltinCodeStubAssembler::ForEachProcessor,
862 &ArrayBuiltinCodeStubAssembler::NullPostLoopAction); 839 &ArrayBuiltinCodeStubAssembler::NullPostLoopAction);
863 } 840 }
864 841
865 TF_BUILTIN(ArrayForEach, ArrayBuiltinCodeStubAssembler) { 842 TF_BUILTIN(ArrayForEach, ArrayBuiltinCodeStubAssembler) {
866 Node* context = Parameter(Descriptor::kContext); 843 Node* argc =
867 Node* receiver = Parameter(Descriptor::kReceiver); 844 ChangeInt32ToIntPtr(Parameter(BuiltinDescriptor::kArgumentsCount));
868 Node* callbackfn = Parameter(Descriptor::kCallbackFn); 845 CodeStubArguments args(this, argc);
869 Node* this_arg = Parameter(Descriptor::kThisArg); 846 Node* context = Parameter(BuiltinDescriptor::kContext);
870 Node* new_target = Parameter(Descriptor::kNewTarget); 847 Node* new_target = Parameter(BuiltinDescriptor::kNewTarget);
848 Node* receiver = args.GetReceiver();
849 Node* callbackfn = args.GetOptionalArgumentValue(0, UndefinedConstant());
850 Node* this_arg = args.GetOptionalArgumentValue(1, UndefinedConstant());
871 851
872 InitIteratingArrayBuiltinBody(context, receiver, callbackfn, this_arg, 852 InitIteratingArrayBuiltinBody(context, receiver, callbackfn, this_arg,
873 new_target); 853 new_target, argc);
874 854
875 GenerateIteratingArrayBuiltinBody( 855 GenerateIteratingArrayBuiltinBody(
876 "Array.prototype.forEach", 856 "Array.prototype.forEach",
877 &ArrayBuiltinCodeStubAssembler::ForEachResultGenerator, 857 &ArrayBuiltinCodeStubAssembler::ForEachResultGenerator,
878 &ArrayBuiltinCodeStubAssembler::ForEachProcessor, 858 &ArrayBuiltinCodeStubAssembler::ForEachProcessor,
879 &ArrayBuiltinCodeStubAssembler::NullPostLoopAction, 859 &ArrayBuiltinCodeStubAssembler::NullPostLoopAction,
880 CodeFactory::ArrayForEachLoopContinuation(isolate())); 860 CodeFactory::ArrayForEachLoopContinuation(isolate()));
881 } 861 }
882 862
883 TF_BUILTIN(ArraySomeLoopContinuation, ArrayBuiltinCodeStubAssembler) { 863 TF_BUILTIN(ArraySomeLoopContinuation, ArrayBuiltinCodeStubAssembler) {
(...skipping 10 matching lines...) Expand all
894 InitIteratingArrayBuiltinLoopContinuation(context, receiver, callbackfn, 874 InitIteratingArrayBuiltinLoopContinuation(context, receiver, callbackfn,
895 this_arg, array, object, initial_k, 875 this_arg, array, object, initial_k,
896 len, to); 876 len, to);
897 877
898 GenerateIteratingArrayBuiltinLoopContinuation( 878 GenerateIteratingArrayBuiltinLoopContinuation(
899 &ArrayBuiltinCodeStubAssembler::SomeProcessor, 879 &ArrayBuiltinCodeStubAssembler::SomeProcessor,
900 &ArrayBuiltinCodeStubAssembler::NullPostLoopAction); 880 &ArrayBuiltinCodeStubAssembler::NullPostLoopAction);
901 } 881 }
902 882
903 TF_BUILTIN(ArraySome, ArrayBuiltinCodeStubAssembler) { 883 TF_BUILTIN(ArraySome, ArrayBuiltinCodeStubAssembler) {
904 Node* context = Parameter(Descriptor::kContext); 884 Node* argc =
905 Node* receiver = Parameter(Descriptor::kReceiver); 885 ChangeInt32ToIntPtr(Parameter(BuiltinDescriptor::kArgumentsCount));
906 Node* callbackfn = Parameter(Descriptor::kCallbackFn); 886 CodeStubArguments args(this, argc);
907 Node* this_arg = Parameter(Descriptor::kThisArg); 887 Node* context = Parameter(BuiltinDescriptor::kContext);
908 Node* new_target = Parameter(Descriptor::kNewTarget); 888 Node* new_target = Parameter(BuiltinDescriptor::kNewTarget);
889 Node* receiver = args.GetReceiver();
890 Node* callbackfn = args.GetOptionalArgumentValue(0, UndefinedConstant());
891 Node* this_arg = args.GetOptionalArgumentValue(1, UndefinedConstant());
909 892
910 InitIteratingArrayBuiltinBody(context, receiver, callbackfn, this_arg, 893 InitIteratingArrayBuiltinBody(context, receiver, callbackfn, this_arg,
911 new_target); 894 new_target, argc);
912 895
913 GenerateIteratingArrayBuiltinBody( 896 GenerateIteratingArrayBuiltinBody(
914 "Array.prototype.some", 897 "Array.prototype.some",
915 &ArrayBuiltinCodeStubAssembler::SomeResultGenerator, 898 &ArrayBuiltinCodeStubAssembler::SomeResultGenerator,
916 &ArrayBuiltinCodeStubAssembler::SomeProcessor, 899 &ArrayBuiltinCodeStubAssembler::SomeProcessor,
917 &ArrayBuiltinCodeStubAssembler::NullPostLoopAction, 900 &ArrayBuiltinCodeStubAssembler::NullPostLoopAction,
918 CodeFactory::ArraySomeLoopContinuation(isolate())); 901 CodeFactory::ArraySomeLoopContinuation(isolate()));
919 } 902 }
920 903
921 TF_BUILTIN(TypedArrayPrototypeSome, ArrayBuiltinCodeStubAssembler) { 904 TF_BUILTIN(TypedArrayPrototypeSome, ArrayBuiltinCodeStubAssembler) {
922 Node* context = Parameter(Descriptor::kContext); 905 Node* context = Parameter(Descriptor::kContext);
923 Node* receiver = Parameter(Descriptor::kReceiver); 906 Node* receiver = Parameter(Descriptor::kReceiver);
924 Node* callbackfn = Parameter(Descriptor::kCallbackFn); 907 Node* callbackfn = Parameter(Descriptor::kCallbackFn);
925 Node* this_arg = Parameter(Descriptor::kThisArg); 908 Node* this_arg = Parameter(Descriptor::kThisArg);
926 Node* new_target = Parameter(Descriptor::kNewTarget); 909 Node* new_target = Parameter(Descriptor::kNewTarget);
927 910
928 InitIteratingArrayBuiltinBody(context, receiver, callbackfn, this_arg, 911 InitIteratingArrayBuiltinBody(context, receiver, callbackfn, this_arg,
929 new_target); 912 new_target, nullptr);
930 913
931 GenerateIteratingTypedArrayBuiltinBody( 914 GenerateIteratingTypedArrayBuiltinBody(
932 "%TypedArray%.prototype.some", 915 "%TypedArray%.prototype.some",
933 &ArrayBuiltinCodeStubAssembler::SomeResultGenerator, 916 &ArrayBuiltinCodeStubAssembler::SomeResultGenerator,
934 &ArrayBuiltinCodeStubAssembler::SomeProcessor, 917 &ArrayBuiltinCodeStubAssembler::SomeProcessor,
935 &ArrayBuiltinCodeStubAssembler::NullPostLoopAction); 918 &ArrayBuiltinCodeStubAssembler::NullPostLoopAction);
936 } 919 }
937 920
938 TF_BUILTIN(ArrayEveryLoopContinuation, ArrayBuiltinCodeStubAssembler) { 921 TF_BUILTIN(ArrayEveryLoopContinuation, ArrayBuiltinCodeStubAssembler) {
939 Node* context = Parameter(Descriptor::kContext); 922 Node* context = Parameter(Descriptor::kContext);
940 Node* receiver = Parameter(Descriptor::kReceiver); 923 Node* receiver = Parameter(Descriptor::kReceiver);
941 Node* callbackfn = Parameter(Descriptor::kCallbackFn); 924 Node* callbackfn = Parameter(Descriptor::kCallbackFn);
942 Node* this_arg = Parameter(Descriptor::kThisArg); 925 Node* this_arg = Parameter(Descriptor::kThisArg);
943 Node* array = Parameter(Descriptor::kArray); 926 Node* array = Parameter(Descriptor::kArray);
944 Node* object = Parameter(Descriptor::kObject); 927 Node* object = Parameter(Descriptor::kObject);
945 Node* initial_k = Parameter(Descriptor::kInitialK); 928 Node* initial_k = Parameter(Descriptor::kInitialK);
946 Node* len = Parameter(Descriptor::kLength); 929 Node* len = Parameter(Descriptor::kLength);
947 Node* to = Parameter(Descriptor::kTo); 930 Node* to = Parameter(Descriptor::kTo);
948 931
949 InitIteratingArrayBuiltinLoopContinuation(context, receiver, callbackfn, 932 InitIteratingArrayBuiltinLoopContinuation(context, receiver, callbackfn,
950 this_arg, array, object, initial_k, 933 this_arg, array, object, initial_k,
951 len, to); 934 len, to);
952 935
953 GenerateIteratingArrayBuiltinLoopContinuation( 936 GenerateIteratingArrayBuiltinLoopContinuation(
954 &ArrayBuiltinCodeStubAssembler::EveryProcessor, 937 &ArrayBuiltinCodeStubAssembler::EveryProcessor,
955 &ArrayBuiltinCodeStubAssembler::NullPostLoopAction); 938 &ArrayBuiltinCodeStubAssembler::NullPostLoopAction);
956 } 939 }
957 940
958 TF_BUILTIN(ArrayEvery, ArrayBuiltinCodeStubAssembler) { 941 TF_BUILTIN(ArrayEvery, ArrayBuiltinCodeStubAssembler) {
959 Node* context = Parameter(Descriptor::kContext); 942 Node* argc =
960 Node* receiver = Parameter(Descriptor::kReceiver); 943 ChangeInt32ToIntPtr(Parameter(BuiltinDescriptor::kArgumentsCount));
961 Node* callbackfn = Parameter(Descriptor::kCallbackFn); 944 CodeStubArguments args(this, argc);
962 Node* this_arg = Parameter(Descriptor::kThisArg); 945 Node* context = Parameter(BuiltinDescriptor::kContext);
963 Node* new_target = Parameter(Descriptor::kNewTarget); 946 Node* new_target = Parameter(BuiltinDescriptor::kNewTarget);
947 Node* receiver = args.GetReceiver();
948 Node* callbackfn = args.GetOptionalArgumentValue(0, UndefinedConstant());
949 Node* this_arg = args.GetOptionalArgumentValue(1, UndefinedConstant());
964 950
965 InitIteratingArrayBuiltinBody(context, receiver, callbackfn, this_arg, 951 InitIteratingArrayBuiltinBody(context, receiver, callbackfn, this_arg,
966 new_target); 952 new_target, argc);
967 953
968 GenerateIteratingArrayBuiltinBody( 954 GenerateIteratingArrayBuiltinBody(
969 "Array.prototype.every", 955 "Array.prototype.every",
970 &ArrayBuiltinCodeStubAssembler::EveryResultGenerator, 956 &ArrayBuiltinCodeStubAssembler::EveryResultGenerator,
971 &ArrayBuiltinCodeStubAssembler::EveryProcessor, 957 &ArrayBuiltinCodeStubAssembler::EveryProcessor,
972 &ArrayBuiltinCodeStubAssembler::NullPostLoopAction, 958 &ArrayBuiltinCodeStubAssembler::NullPostLoopAction,
973 CodeFactory::ArrayEveryLoopContinuation(isolate())); 959 CodeFactory::ArrayEveryLoopContinuation(isolate()));
974 } 960 }
975 961
976 TF_BUILTIN(TypedArrayPrototypeEvery, ArrayBuiltinCodeStubAssembler) { 962 TF_BUILTIN(TypedArrayPrototypeEvery, ArrayBuiltinCodeStubAssembler) {
977 Node* context = Parameter(Descriptor::kContext); 963 Node* context = Parameter(Descriptor::kContext);
978 Node* receiver = Parameter(Descriptor::kReceiver); 964 Node* receiver = Parameter(Descriptor::kReceiver);
979 Node* callbackfn = Parameter(Descriptor::kCallbackFn); 965 Node* callbackfn = Parameter(Descriptor::kCallbackFn);
980 Node* this_arg = Parameter(Descriptor::kThisArg); 966 Node* this_arg = Parameter(Descriptor::kThisArg);
981 Node* new_target = Parameter(Descriptor::kNewTarget); 967 Node* new_target = Parameter(Descriptor::kNewTarget);
982 968
983 InitIteratingArrayBuiltinBody(context, receiver, callbackfn, this_arg, 969 InitIteratingArrayBuiltinBody(context, receiver, callbackfn, this_arg,
984 new_target); 970 new_target, nullptr);
985 971
986 GenerateIteratingTypedArrayBuiltinBody( 972 GenerateIteratingTypedArrayBuiltinBody(
987 "%TypedArray%.prototype.every", 973 "%TypedArray%.prototype.every",
988 &ArrayBuiltinCodeStubAssembler::EveryResultGenerator, 974 &ArrayBuiltinCodeStubAssembler::EveryResultGenerator,
989 &ArrayBuiltinCodeStubAssembler::EveryProcessor, 975 &ArrayBuiltinCodeStubAssembler::EveryProcessor,
990 &ArrayBuiltinCodeStubAssembler::NullPostLoopAction); 976 &ArrayBuiltinCodeStubAssembler::NullPostLoopAction);
991 } 977 }
992 978
993 TF_BUILTIN(ArrayReduceLoopContinuation, ArrayBuiltinCodeStubAssembler) { 979 TF_BUILTIN(ArrayReduceLoopContinuation, ArrayBuiltinCodeStubAssembler) {
994 Node* context = Parameter(Descriptor::kContext); 980 Node* context = Parameter(Descriptor::kContext);
995 Node* receiver = Parameter(Descriptor::kReceiver); 981 Node* receiver = Parameter(Descriptor::kReceiver);
996 Node* callbackfn = Parameter(Descriptor::kCallbackFn); 982 Node* callbackfn = Parameter(Descriptor::kCallbackFn);
997 Node* this_arg = Parameter(Descriptor::kThisArg); 983 Node* this_arg = Parameter(Descriptor::kThisArg);
998 Node* accumulator = Parameter(Descriptor::kAccumulator); 984 Node* accumulator = Parameter(Descriptor::kAccumulator);
999 Node* object = Parameter(Descriptor::kObject); 985 Node* object = Parameter(Descriptor::kObject);
1000 Node* initial_k = Parameter(Descriptor::kInitialK); 986 Node* initial_k = Parameter(Descriptor::kInitialK);
1001 Node* len = Parameter(Descriptor::kLength); 987 Node* len = Parameter(Descriptor::kLength);
1002 Node* to = Parameter(Descriptor::kTo); 988 Node* to = Parameter(Descriptor::kTo);
1003 989
1004 InitIteratingArrayBuiltinLoopContinuation(context, receiver, callbackfn, 990 InitIteratingArrayBuiltinLoopContinuation(context, receiver, callbackfn,
1005 this_arg, accumulator, object, 991 this_arg, accumulator, object,
1006 initial_k, len, to); 992 initial_k, len, to);
1007 993
1008 GenerateIteratingArrayBuiltinLoopContinuation( 994 GenerateIteratingArrayBuiltinLoopContinuation(
1009 &ArrayBuiltinCodeStubAssembler::ReduceProcessor, 995 &ArrayBuiltinCodeStubAssembler::ReduceProcessor,
1010 &ArrayBuiltinCodeStubAssembler::ReducePostLoopAction); 996 &ArrayBuiltinCodeStubAssembler::ReducePostLoopAction);
1011 } 997 }
1012 998
1013 TF_BUILTIN(ArrayReduce, ArrayBuiltinCodeStubAssembler) { 999 TF_BUILTIN(ArrayReduce, ArrayBuiltinCodeStubAssembler) {
1014 Node* context = Parameter(Descriptor::kContext); 1000 Node* argc =
1015 Node* receiver = Parameter(Descriptor::kReceiver); 1001 ChangeInt32ToIntPtr(Parameter(BuiltinDescriptor::kArgumentsCount));
1016 Node* callbackfn = Parameter(Descriptor::kCallbackFn); 1002 CodeStubArguments args(this, argc);
1017 Node* initial_value = Parameter(Descriptor::kInitialValue); 1003 Node* context = Parameter(BuiltinDescriptor::kContext);
1018 Node* new_target = Parameter(Descriptor::kNewTarget); 1004 Node* new_target = Parameter(BuiltinDescriptor::kNewTarget);
1005 Node* receiver = args.GetReceiver();
1006 Node* callbackfn = args.GetOptionalArgumentValue(0, UndefinedConstant());
1007 Node* initial_value = args.GetOptionalArgumentValue(1, TheHoleConstant());
1019 1008
1020 InitIteratingArrayBuiltinBody(context, receiver, callbackfn, initial_value, 1009 InitIteratingArrayBuiltinBody(context, receiver, callbackfn, initial_value,
1021 new_target); 1010 new_target, argc);
1022 1011
1023 GenerateIteratingArrayBuiltinBody( 1012 GenerateIteratingArrayBuiltinBody(
1024 "Array.prototype.reduce", 1013 "Array.prototype.reduce",
1025 &ArrayBuiltinCodeStubAssembler::ReduceResultGenerator, 1014 &ArrayBuiltinCodeStubAssembler::ReduceResultGenerator,
1026 &ArrayBuiltinCodeStubAssembler::ReduceProcessor, 1015 &ArrayBuiltinCodeStubAssembler::ReduceProcessor,
1027 &ArrayBuiltinCodeStubAssembler::ReducePostLoopAction, 1016 &ArrayBuiltinCodeStubAssembler::ReducePostLoopAction,
1028 CodeFactory::ArrayReduceLoopContinuation(isolate())); 1017 CodeFactory::ArrayReduceLoopContinuation(isolate()));
1029 } 1018 }
1030 1019
1031 TF_BUILTIN(TypedArrayPrototypeReduce, ArrayBuiltinCodeStubAssembler) { 1020 TF_BUILTIN(TypedArrayPrototypeReduce, ArrayBuiltinCodeStubAssembler) {
1032 Node* context = Parameter(Descriptor::kContext); 1021 Node* context = Parameter(Descriptor::kContext);
1033 Node* receiver = Parameter(Descriptor::kReceiver); 1022 Node* receiver = Parameter(Descriptor::kReceiver);
1034 Node* callbackfn = Parameter(Descriptor::kCallbackFn); 1023 Node* callbackfn = Parameter(Descriptor::kCallbackFn);
1035 Node* initial_value = Parameter(Descriptor::kInitialValue); 1024 Node* initial_value = Parameter(Descriptor::kInitialValue);
1036 Node* new_target = Parameter(Descriptor::kNewTarget); 1025 Node* new_target = Parameter(Descriptor::kNewTarget);
1037 1026
1038 InitIteratingArrayBuiltinBody(context, receiver, callbackfn, initial_value, 1027 InitIteratingArrayBuiltinBody(context, receiver, callbackfn, initial_value,
1039 new_target); 1028 new_target, nullptr);
1040 1029
1041 GenerateIteratingTypedArrayBuiltinBody( 1030 GenerateIteratingTypedArrayBuiltinBody(
1042 "%TypedArray%.prototype.reduce", 1031 "%TypedArray%.prototype.reduce",
1043 &ArrayBuiltinCodeStubAssembler::ReduceResultGenerator, 1032 &ArrayBuiltinCodeStubAssembler::ReduceResultGenerator,
Igor Sheludko 2017/04/27 10:38:05 TypedArrayPrototype* builtins are not adapted to t
danno 2017/04/28 06:58:10 Done.
1044 &ArrayBuiltinCodeStubAssembler::ReduceProcessor, 1033 &ArrayBuiltinCodeStubAssembler::ReduceProcessor,
1045 &ArrayBuiltinCodeStubAssembler::ReducePostLoopAction); 1034 &ArrayBuiltinCodeStubAssembler::ReducePostLoopAction);
1046 } 1035 }
1047 1036
1048 TF_BUILTIN(ArrayReduceRightLoopContinuation, ArrayBuiltinCodeStubAssembler) { 1037 TF_BUILTIN(ArrayReduceRightLoopContinuation, ArrayBuiltinCodeStubAssembler) {
1049 Node* context = Parameter(Descriptor::kContext); 1038 Node* context = Parameter(Descriptor::kContext);
1050 Node* receiver = Parameter(Descriptor::kReceiver); 1039 Node* receiver = Parameter(Descriptor::kReceiver);
1051 Node* callbackfn = Parameter(Descriptor::kCallbackFn); 1040 Node* callbackfn = Parameter(Descriptor::kCallbackFn);
1052 Node* this_arg = Parameter(Descriptor::kThisArg); 1041 Node* this_arg = Parameter(Descriptor::kThisArg);
1053 Node* accumulator = Parameter(Descriptor::kAccumulator); 1042 Node* accumulator = Parameter(Descriptor::kAccumulator);
1054 Node* object = Parameter(Descriptor::kObject); 1043 Node* object = Parameter(Descriptor::kObject);
1055 Node* initial_k = Parameter(Descriptor::kInitialK); 1044 Node* initial_k = Parameter(Descriptor::kInitialK);
1056 Node* len = Parameter(Descriptor::kLength); 1045 Node* len = Parameter(Descriptor::kLength);
1057 Node* to = Parameter(Descriptor::kTo); 1046 Node* to = Parameter(Descriptor::kTo);
1058 1047
1059 InitIteratingArrayBuiltinLoopContinuation(context, receiver, callbackfn, 1048 InitIteratingArrayBuiltinLoopContinuation(context, receiver, callbackfn,
1060 this_arg, accumulator, object, 1049 this_arg, accumulator, object,
1061 initial_k, len, to); 1050 initial_k, len, to);
1062 1051
1063 GenerateIteratingArrayBuiltinLoopContinuation( 1052 GenerateIteratingArrayBuiltinLoopContinuation(
1064 &ArrayBuiltinCodeStubAssembler::ReduceProcessor, 1053 &ArrayBuiltinCodeStubAssembler::ReduceProcessor,
1065 &ArrayBuiltinCodeStubAssembler::ReducePostLoopAction, 1054 &ArrayBuiltinCodeStubAssembler::ReducePostLoopAction,
1066 ForEachDirection::kReverse); 1055 ForEachDirection::kReverse);
1067 } 1056 }
1068 1057
1069 TF_BUILTIN(ArrayReduceRight, ArrayBuiltinCodeStubAssembler) { 1058 TF_BUILTIN(ArrayReduceRight, ArrayBuiltinCodeStubAssembler) {
1070 Node* context = Parameter(Descriptor::kContext); 1059 Node* argc =
1071 Node* receiver = Parameter(Descriptor::kReceiver); 1060 ChangeInt32ToIntPtr(Parameter(BuiltinDescriptor::kArgumentsCount));
1072 Node* callbackfn = Parameter(Descriptor::kCallbackFn); 1061 CodeStubArguments args(this, argc);
1073 Node* initial_value = Parameter(Descriptor::kInitialValue); 1062 Node* context = Parameter(BuiltinDescriptor::kContext);
1074 Node* new_target = Parameter(Descriptor::kNewTarget); 1063 Node* new_target = Parameter(BuiltinDescriptor::kNewTarget);
1064 Node* receiver = args.GetReceiver();
1065 Node* callbackfn = args.GetOptionalArgumentValue(0, UndefinedConstant());
1066 Node* initial_value = args.GetOptionalArgumentValue(1, TheHoleConstant());
1075 1067
1076 InitIteratingArrayBuiltinBody(context, receiver, callbackfn, initial_value, 1068 InitIteratingArrayBuiltinBody(context, receiver, callbackfn, initial_value,
1077 new_target); 1069 new_target, argc);
1078 1070
1079 GenerateIteratingArrayBuiltinBody( 1071 GenerateIteratingArrayBuiltinBody(
1080 "Array.prototype.reduceRight", 1072 "Array.prototype.reduceRight",
1081 &ArrayBuiltinCodeStubAssembler::ReduceResultGenerator, 1073 &ArrayBuiltinCodeStubAssembler::ReduceResultGenerator,
1082 &ArrayBuiltinCodeStubAssembler::ReduceProcessor, 1074 &ArrayBuiltinCodeStubAssembler::ReduceProcessor,
1083 &ArrayBuiltinCodeStubAssembler::ReducePostLoopAction, 1075 &ArrayBuiltinCodeStubAssembler::ReducePostLoopAction,
1084 CodeFactory::ArrayReduceRightLoopContinuation(isolate()), 1076 CodeFactory::ArrayReduceRightLoopContinuation(isolate()),
1085 ForEachDirection::kReverse); 1077 ForEachDirection::kReverse);
1086 } 1078 }
1087 1079
1088 TF_BUILTIN(TypedArrayPrototypeReduceRight, ArrayBuiltinCodeStubAssembler) { 1080 TF_BUILTIN(TypedArrayPrototypeReduceRight, ArrayBuiltinCodeStubAssembler) {
1089 Node* context = Parameter(Descriptor::kContext); 1081 Node* context = Parameter(Descriptor::kContext);
1090 Node* receiver = Parameter(Descriptor::kReceiver); 1082 Node* receiver = Parameter(Descriptor::kReceiver);
1091 Node* callbackfn = Parameter(Descriptor::kCallbackFn); 1083 Node* callbackfn = Parameter(Descriptor::kCallbackFn);
1092 Node* initial_value = Parameter(Descriptor::kInitialValue); 1084 Node* initial_value = Parameter(Descriptor::kInitialValue);
1093 Node* new_target = Parameter(Descriptor::kNewTarget); 1085 Node* new_target = Parameter(Descriptor::kNewTarget);
1094 1086
1095 InitIteratingArrayBuiltinBody(context, receiver, callbackfn, initial_value, 1087 InitIteratingArrayBuiltinBody(context, receiver, callbackfn, initial_value,
1096 new_target); 1088 new_target, nullptr);
1097 1089
1098 GenerateIteratingTypedArrayBuiltinBody( 1090 GenerateIteratingTypedArrayBuiltinBody(
1099 "%TypedArray%.prototype.reduceRight", 1091 "%TypedArray%.prototype.reduceRight",
1100 &ArrayBuiltinCodeStubAssembler::ReduceResultGenerator, 1092 &ArrayBuiltinCodeStubAssembler::ReduceResultGenerator,
1101 &ArrayBuiltinCodeStubAssembler::ReduceProcessor, 1093 &ArrayBuiltinCodeStubAssembler::ReduceProcessor,
1102 &ArrayBuiltinCodeStubAssembler::ReducePostLoopAction, 1094 &ArrayBuiltinCodeStubAssembler::ReducePostLoopAction,
1103 ForEachDirection::kReverse); 1095 ForEachDirection::kReverse);
1104 } 1096 }
1105 1097
1106 TF_BUILTIN(ArrayFilterLoopContinuation, ArrayBuiltinCodeStubAssembler) { 1098 TF_BUILTIN(ArrayFilterLoopContinuation, ArrayBuiltinCodeStubAssembler) {
(...skipping 10 matching lines...) Expand all
1117 InitIteratingArrayBuiltinLoopContinuation(context, receiver, callbackfn, 1109 InitIteratingArrayBuiltinLoopContinuation(context, receiver, callbackfn,
1118 this_arg, array, object, initial_k, 1110 this_arg, array, object, initial_k,
1119 len, to); 1111 len, to);
1120 1112
1121 GenerateIteratingArrayBuiltinLoopContinuation( 1113 GenerateIteratingArrayBuiltinLoopContinuation(
1122 &ArrayBuiltinCodeStubAssembler::FilterProcessor, 1114 &ArrayBuiltinCodeStubAssembler::FilterProcessor,
1123 &ArrayBuiltinCodeStubAssembler::NullPostLoopAction); 1115 &ArrayBuiltinCodeStubAssembler::NullPostLoopAction);
1124 } 1116 }
1125 1117
1126 TF_BUILTIN(ArrayFilter, ArrayBuiltinCodeStubAssembler) { 1118 TF_BUILTIN(ArrayFilter, ArrayBuiltinCodeStubAssembler) {
1127 Node* context = Parameter(Descriptor::kContext); 1119 Node* argc =
1128 Node* receiver = Parameter(Descriptor::kReceiver); 1120 ChangeInt32ToIntPtr(Parameter(BuiltinDescriptor::kArgumentsCount));
1129 Node* callbackfn = Parameter(Descriptor::kCallbackFn); 1121 CodeStubArguments args(this, argc);
1130 Node* this_arg = Parameter(Descriptor::kThisArg); 1122 Node* context = Parameter(BuiltinDescriptor::kContext);
1131 Node* new_target = Parameter(Descriptor::kNewTarget); 1123 Node* new_target = Parameter(BuiltinDescriptor::kNewTarget);
1124 Node* receiver = args.GetReceiver();
1125 Node* callbackfn = args.GetOptionalArgumentValue(0, UndefinedConstant());
1126 Node* this_arg = args.GetOptionalArgumentValue(1, UndefinedConstant());
1132 1127
1133 InitIteratingArrayBuiltinBody(context, receiver, callbackfn, this_arg, 1128 InitIteratingArrayBuiltinBody(context, receiver, callbackfn, this_arg,
1134 new_target); 1129 new_target, argc);
1135 1130
1136 GenerateIteratingArrayBuiltinBody( 1131 GenerateIteratingArrayBuiltinBody(
1137 "Array.prototype.filter", 1132 "Array.prototype.filter",
1138 &ArrayBuiltinCodeStubAssembler::FilterResultGenerator, 1133 &ArrayBuiltinCodeStubAssembler::FilterResultGenerator,
1139 &ArrayBuiltinCodeStubAssembler::FilterProcessor, 1134 &ArrayBuiltinCodeStubAssembler::FilterProcessor,
1140 &ArrayBuiltinCodeStubAssembler::NullPostLoopAction, 1135 &ArrayBuiltinCodeStubAssembler::NullPostLoopAction,
1141 CodeFactory::ArrayFilterLoopContinuation(isolate())); 1136 CodeFactory::ArrayFilterLoopContinuation(isolate()));
1142 } 1137 }
1143 1138
1144 TF_BUILTIN(ArrayMapLoopContinuation, ArrayBuiltinCodeStubAssembler) { 1139 TF_BUILTIN(ArrayMapLoopContinuation, ArrayBuiltinCodeStubAssembler) {
(...skipping 10 matching lines...) Expand all
1155 InitIteratingArrayBuiltinLoopContinuation(context, receiver, callbackfn, 1150 InitIteratingArrayBuiltinLoopContinuation(context, receiver, callbackfn,
1156 this_arg, array, object, initial_k, 1151 this_arg, array, object, initial_k,
1157 len, to); 1152 len, to);
1158 1153
1159 GenerateIteratingArrayBuiltinLoopContinuation( 1154 GenerateIteratingArrayBuiltinLoopContinuation(
1160 &ArrayBuiltinCodeStubAssembler::MapProcessor, 1155 &ArrayBuiltinCodeStubAssembler::MapProcessor,
1161 &ArrayBuiltinCodeStubAssembler::NullPostLoopAction); 1156 &ArrayBuiltinCodeStubAssembler::NullPostLoopAction);
1162 } 1157 }
1163 1158
1164 TF_BUILTIN(ArrayMap, ArrayBuiltinCodeStubAssembler) { 1159 TF_BUILTIN(ArrayMap, ArrayBuiltinCodeStubAssembler) {
1165 Node* context = Parameter(Descriptor::kContext); 1160 Node* argc =
1166 Node* receiver = Parameter(Descriptor::kReceiver); 1161 ChangeInt32ToIntPtr(Parameter(BuiltinDescriptor::kArgumentsCount));
1167 Node* callbackfn = Parameter(Descriptor::kCallbackFn); 1162 CodeStubArguments args(this, argc);
1168 Node* this_arg = Parameter(Descriptor::kThisArg); 1163 Node* context = Parameter(BuiltinDescriptor::kContext);
1169 Node* new_target = Parameter(Descriptor::kNewTarget); 1164 Node* new_target = Parameter(BuiltinDescriptor::kNewTarget);
1165 Node* receiver = args.GetReceiver();
1166 Node* callbackfn = args.GetOptionalArgumentValue(0, UndefinedConstant());
1167 Node* this_arg = args.GetOptionalArgumentValue(1, UndefinedConstant());
1170 1168
1171 InitIteratingArrayBuiltinBody(context, receiver, callbackfn, this_arg, 1169 InitIteratingArrayBuiltinBody(context, receiver, callbackfn, this_arg,
1172 new_target); 1170 new_target, argc);
1173 1171
1174 GenerateIteratingArrayBuiltinBody( 1172 GenerateIteratingArrayBuiltinBody(
1175 "Array.prototype.map", &ArrayBuiltinCodeStubAssembler::MapResultGenerator, 1173 "Array.prototype.map", &ArrayBuiltinCodeStubAssembler::MapResultGenerator,
1176 &ArrayBuiltinCodeStubAssembler::MapProcessor, 1174 &ArrayBuiltinCodeStubAssembler::MapProcessor,
1177 &ArrayBuiltinCodeStubAssembler::NullPostLoopAction, 1175 &ArrayBuiltinCodeStubAssembler::NullPostLoopAction,
1178 CodeFactory::ArrayMapLoopContinuation(isolate())); 1176 CodeFactory::ArrayMapLoopContinuation(isolate()));
1179 } 1177 }
1180 1178
1181 TF_BUILTIN(ArrayIsArray, CodeStubAssembler) { 1179 TF_BUILTIN(ArrayIsArray, CodeStubAssembler) {
1182 Node* object = Parameter(Descriptor::kArg); 1180 Node* object = Parameter(Descriptor::kArg);
(...skipping 1049 matching lines...) Expand 10 before | Expand all | Expand 10 after
2232 { 2230 {
2233 Node* message = SmiConstant(MessageTemplate::kDetachedOperation); 2231 Node* message = SmiConstant(MessageTemplate::kDetachedOperation);
2234 CallRuntime(Runtime::kThrowTypeError, context, message, 2232 CallRuntime(Runtime::kThrowTypeError, context, message,
2235 HeapConstant(operation)); 2233 HeapConstant(operation));
2236 Unreachable(); 2234 Unreachable();
2237 } 2235 }
2238 } 2236 }
2239 2237
2240 } // namespace internal 2238 } // namespace internal
2241 } // namespace v8 2239 } // namespace v8
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698