@@ -66,12 +66,15 @@ struct builtin { |
66 | 66 | // if necessary. |
67 | 67 | static constexpr std::size_t kMaxArgumentCount = 8; |
68 | 68 | using arguments_vector_t = base::SmallVector<OpIndex, kMaxArgumentCount>; |
69 | | - static constexpr inline detail::IndexTag<0> index_counter( |
70 | | - detail::IndexTag<0>); |
71 | | - static constexpr base::tmp::list<> make_args_type_list_n(detail::IndexTag<0>); |
| 69 | + // TODO(abmusse): use ArgumentsBase (until we can use GCC 13 or better) |
| 70 | + struct ArgumentsBase { |
| 71 | + static constexpr inline detail::IndexTag<0> index_counter( |
| 72 | + detail::IndexTag<0>); |
| 73 | + static constexpr base::tmp::list<> make_args_type_list_n( |
| 74 | + detail::IndexTag<0>); |
| 75 | + }; |
72 | 76 |
|
73 | 77 | static constexpr OpEffects base_effects = OpEffects().CanDependOnChecks(); |
74 | | - |
75 | 78 | template <typename A> |
76 | 79 | static arguments_vector_t ArgumentsToVector(const A& args) { |
77 | 80 | arguments_vector_t result; |
@@ -169,7 +172,7 @@ struct builtin { |
169 | 172 |
|
170 | 173 | struct BigIntAdd : public Descriptor<BigIntAdd> { |
171 | 174 | static constexpr auto kFunction = Builtin::kBigIntAdd; |
172 | | - struct Arguments { |
| 175 | + struct Arguments : ArgumentsBase { |
173 | 176 | ARG(V<Numeric>, left) |
174 | 177 | ARG(V<Numeric>, right) |
175 | 178 | }; |
@@ -183,7 +186,7 @@ struct builtin { |
183 | 186 |
|
184 | 187 | struct CheckTurbofanType : public Descriptor<CheckTurbofanType> { |
185 | 188 | static constexpr auto kFunction = Builtin::kCheckTurbofanType; |
186 | | - struct Arguments { |
| 189 | + struct Arguments : ArgumentsBase { |
187 | 190 | ARG(V<Object>, value) |
188 | 191 | ARG(V<TurbofanType>, expected_type) |
189 | 192 | ARG(V<Smi>, node_id) |
@@ -201,7 +204,7 @@ struct builtin { |
201 | 204 | #define DECL_GENERIC_BINOP(Name) \ |
202 | 205 | struct Name : public Descriptor<Name> { \ |
203 | 206 | static constexpr auto kFunction = Builtin::k##Name; \ |
204 | | - struct Arguments { \ |
| 207 | + struct Arguments : ArgumentsBase { \ |
205 | 208 | ARG(V<Object>, left) \ |
206 | 209 | ARG(V<Object>, right) \ |
207 | 210 | }; \ |
@@ -219,7 +222,7 @@ struct builtin { |
219 | 222 | #define DECL_GENERIC_UNOP(Name) \ |
220 | 223 | struct Name : public Descriptor<Name> { \ |
221 | 224 | static constexpr auto kFunction = Builtin::k##Name; \ |
222 | | - struct Arguments { \ |
| 225 | + struct Arguments : ArgumentsBase { \ |
223 | 226 | ARG(V<Object>, input) \ |
224 | 227 | }; \ |
225 | 228 | using returns_t = std::tuple<V<Object>>; \ |
@@ -235,7 +238,7 @@ struct builtin { |
235 | 238 |
|
236 | 239 | struct DetachContextCell : public Descriptor<DetachContextCell> { |
237 | 240 | static constexpr auto kFunction = Builtin::kDetachContextCell; |
238 | | - struct Arguments { |
| 241 | + struct Arguments : ArgumentsBase { |
239 | 242 | ARG(V<Context>, the_context) |
240 | 243 | ARG(V<Object>, new_value) |
241 | 244 | ARG(V<WordPtr>, i) |
@@ -251,7 +254,7 @@ struct builtin { |
251 | 254 |
|
252 | 255 | struct ToNumber : public Descriptor<ToNumber> { |
253 | 256 | static constexpr auto kFunction = Builtin::kToNumber; |
254 | | - struct Arguments { |
| 257 | + struct Arguments : ArgumentsBase { |
255 | 258 | ARG(V<Object>, input) |
256 | 259 | }; |
257 | 260 | using returns_t = std::tuple<V<Number>>; |
@@ -264,7 +267,7 @@ struct builtin { |
264 | 267 |
|
265 | 268 | struct NonNumberToNumber : public Descriptor<NonNumberToNumber> { |
266 | 269 | static constexpr auto kFunction = Builtin::kNonNumberToNumber; |
267 | | - struct Arguments { |
| 270 | + struct Arguments : ArgumentsBase { |
268 | 271 | ARG(V<JSAnyNotNumber>, input) |
269 | 272 | }; |
270 | 273 | using returns_t = std::tuple<V<Number>>; |
@@ -277,7 +280,7 @@ struct builtin { |
277 | 280 |
|
278 | 281 | struct ToNumeric : public Descriptor<ToNumeric> { |
279 | 282 | static constexpr auto kFunction = Builtin::kToNumeric; |
280 | | - struct Arguments { |
| 283 | + struct Arguments : ArgumentsBase { |
281 | 284 | ARG(V<Object>, input) |
282 | 285 | }; |
283 | 286 | using returns_t = std::tuple<V<Numeric>>; |
@@ -290,7 +293,7 @@ struct builtin { |
290 | 293 |
|
291 | 294 | struct NonNumberToNumeric : public Descriptor<NonNumberToNumeric> { |
292 | 295 | static constexpr auto kFunction = Builtin::kNonNumberToNumeric; |
293 | | - struct Arguments { |
| 296 | + struct Arguments : ArgumentsBase { |
294 | 297 | ARG(V<JSAnyNotNumber>, input) |
295 | 298 | }; |
296 | 299 | using returns_t = std::tuple<V<Numeric>>; |
@@ -304,7 +307,7 @@ struct builtin { |
304 | 307 | struct CopyFastSmiOrObjectElements |
305 | 308 | : public Descriptor<CopyFastSmiOrObjectElements> { |
306 | 309 | static constexpr auto kFunction = Builtin::kCopyFastSmiOrObjectElements; |
307 | | - struct Arguments { |
| 310 | + struct Arguments : ArgumentsBase { |
308 | 311 | ARG(V<Object>, object) |
309 | 312 | }; |
310 | 313 | using returns_t = std::tuple<V<Object>>; |
@@ -321,7 +324,7 @@ struct builtin { |
321 | 324 | static constexpr auto kFunction = B; |
322 | 325 | using StringOrSmi = Union<String, Smi>; |
323 | 326 | // We use smi:0 for an empty label. |
324 | | - struct Arguments { |
| 327 | + struct Arguments : ArgumentsBase { |
325 | 328 | ARG(V<StringOrSmi>, label_or_0) |
326 | 329 | ARG(V<Input>, value) |
327 | 330 | }; |
@@ -343,7 +346,7 @@ struct builtin { |
343 | 346 | template <Builtin B> |
344 | 347 | struct FindOrderedHashEntry : public Descriptor<FindOrderedHashEntry<B>> { |
345 | 348 | static constexpr auto kFunction = B; |
346 | | - struct Arguments { |
| 349 | + struct Arguments : ArgumentsBase { |
347 | 350 | ARG(V<Object>, table) |
348 | 351 | ARG(V<Smi>, key) |
349 | 352 | }; |
@@ -363,7 +366,7 @@ struct builtin { |
363 | 366 | template <Builtin B> |
364 | 367 | struct GrowFastElements : public Descriptor<GrowFastElements<B>> { |
365 | 368 | static constexpr auto kFunction = B; |
366 | | - struct Arguments { |
| 369 | + struct Arguments : ArgumentsBase { |
367 | 370 | ARG(V<Object>, object) |
368 | 371 | ARG(V<Smi>, size) |
369 | 372 | }; |
@@ -383,7 +386,7 @@ struct builtin { |
383 | 386 | template <Builtin B> |
384 | 387 | struct NewArgumentsElements : public Descriptor<NewArgumentsElements<B>> { |
385 | 388 | static constexpr auto kFunction = B; |
386 | | - struct Arguments { |
| 389 | + struct Arguments : ArgumentsBase { |
387 | 390 | // TODO(nicohartmann@): First argument should be replaced by a proper |
388 | 391 | // RawPtr. |
389 | 392 | ARG(V<WordPtr>, frame) |
@@ -406,7 +409,7 @@ struct builtin { |
406 | 409 |
|
407 | 410 | struct NumberToString : public Descriptor<NumberToString> { |
408 | 411 | static constexpr auto kFunction = Builtin::kNumberToString; |
409 | | - struct Arguments { |
| 412 | + struct Arguments : ArgumentsBase { |
410 | 413 | ARG(V<Number>, input) |
411 | 414 | }; |
412 | 415 | using returns_t = std::tuple<V<String>>; |
@@ -420,7 +423,7 @@ struct builtin { |
420 | 423 |
|
421 | 424 | struct ToString : public Descriptor<ToString> { |
422 | 425 | static constexpr auto kFunction = Builtin::kToString; |
423 | | - struct Arguments { |
| 426 | + struct Arguments : ArgumentsBase { |
424 | 427 | ARG(V<Object>, o) |
425 | 428 | }; |
426 | 429 | using returns_t = std::tuple<V<String>>; |
@@ -433,7 +436,7 @@ struct builtin { |
433 | 436 |
|
434 | 437 | struct PlainPrimitiveToNumber : public Descriptor<PlainPrimitiveToNumber> { |
435 | 438 | static constexpr auto kFunction = Builtin::kPlainPrimitiveToNumber; |
436 | | - struct Arguments { |
| 439 | + struct Arguments : ArgumentsBase { |
437 | 440 | ARG(V<PlainPrimitive>, input) |
438 | 441 | }; |
439 | 442 | using returns_t = std::tuple<V<Number>>; |
@@ -447,7 +450,7 @@ struct builtin { |
447 | 450 |
|
448 | 451 | struct SameValue : public Descriptor<SameValue> { |
449 | 452 | static constexpr auto kFunction = Builtin::kSameValue; |
450 | | - struct Arguments { |
| 453 | + struct Arguments : ArgumentsBase { |
451 | 454 | ARG(V<Object>, left) |
452 | 455 | ARG(V<Object>, right) |
453 | 456 | }; |
@@ -462,7 +465,7 @@ struct builtin { |
462 | 465 |
|
463 | 466 | struct SameValueNumbersOnly : public Descriptor<SameValueNumbersOnly> { |
464 | 467 | static constexpr auto kFunction = Builtin::kSameValueNumbersOnly; |
465 | | - struct Arguments { |
| 468 | + struct Arguments : ArgumentsBase { |
466 | 469 | ARG(V<Object>, left) |
467 | 470 | ARG(V<Object>, right) |
468 | 471 | }; |
@@ -476,7 +479,7 @@ struct builtin { |
476 | 479 |
|
477 | 480 | struct StringAdd_CheckNone : public Descriptor<StringAdd_CheckNone> { |
478 | 481 | static constexpr auto kFunction = Builtin::kStringAdd_CheckNone; |
479 | | - struct Arguments { |
| 482 | + struct Arguments : ArgumentsBase { |
480 | 483 | ARG(V<String>, left) |
481 | 484 | ARG(V<String>, right) |
482 | 485 | }; |
@@ -494,7 +497,7 @@ struct builtin { |
494 | 497 |
|
495 | 498 | struct StringEqual : public Descriptor<StringEqual> { |
496 | 499 | static constexpr auto kFunction = Builtin::kStringEqual; |
497 | | - struct Arguments { |
| 500 | + struct Arguments : ArgumentsBase { |
498 | 501 | ARG(V<String>, left) |
499 | 502 | ARG(V<String>, right) |
500 | 503 | ARG(V<WordPtr>, length) |
@@ -512,7 +515,7 @@ struct builtin { |
512 | 515 |
|
513 | 516 | struct StringFromCodePointAt : public Descriptor<StringFromCodePointAt> { |
514 | 517 | static constexpr auto kFunction = Builtin::kStringFromCodePointAt; |
515 | | - struct Arguments { |
| 518 | + struct Arguments : ArgumentsBase { |
516 | 519 | ARG(V<String>, receiver) |
517 | 520 | ARG(V<WordPtr>, position) |
518 | 521 | }; |
@@ -527,7 +530,7 @@ struct builtin { |
527 | 530 |
|
528 | 531 | struct StringIndexOf : public Descriptor<StringIndexOf> { |
529 | 532 | static constexpr auto kFunction = Builtin::kStringIndexOf; |
530 | | - struct Arguments { |
| 533 | + struct Arguments : ArgumentsBase { |
531 | 534 | ARG(V<String>, s) |
532 | 535 | ARG(V<String>, search_string) |
533 | 536 | ARG(V<Smi>, start) |
@@ -545,7 +548,7 @@ struct builtin { |
545 | 548 |
|
546 | 549 | struct StringCompare : public Descriptor<StringCompare> { |
547 | 550 | static constexpr auto kFunction = Builtin::kStringCompare; |
548 | | - struct Arguments { |
| 551 | + struct Arguments : ArgumentsBase { |
549 | 552 | ARG(V<String>, left) |
550 | 553 | ARG(V<String>, right) |
551 | 554 | }; |
@@ -561,7 +564,7 @@ struct builtin { |
561 | 564 | template <Builtin B> |
562 | 565 | struct StringComparison : public Descriptor<StringComparison<B>> { |
563 | 566 | static constexpr auto kFunction = B; |
564 | | - struct Arguments { |
| 567 | + struct Arguments : ArgumentsBase { |
565 | 568 | ARG(V<String>, left) |
566 | 569 | ARG(V<String>, right) |
567 | 570 | }; |
@@ -579,7 +582,7 @@ struct builtin { |
579 | 582 |
|
580 | 583 | struct StringSubstring : public Descriptor<StringSubstring> { |
581 | 584 | static constexpr auto kFunction = Builtin::kStringSubstring; |
582 | | - struct Arguments { |
| 585 | + struct Arguments : ArgumentsBase { |
583 | 586 | ARG(V<String>, string) |
584 | 587 | ARG(V<WordPtr>, from) |
585 | 588 | ARG(V<WordPtr>, to) |
@@ -596,7 +599,7 @@ struct builtin { |
596 | 599 | #ifdef V8_INTL_SUPPORT |
597 | 600 | struct StringToLowerCaseIntl : public Descriptor<StringToLowerCaseIntl> { |
598 | 601 | static constexpr auto kFunction = Builtin::kStringToLowerCaseIntl; |
599 | | - struct Arguments { |
| 602 | + struct Arguments : ArgumentsBase { |
600 | 603 | ARG(V<String>, string) |
601 | 604 | }; |
602 | 605 | using returns_t = std::tuple<V<String>>; |
@@ -612,7 +615,7 @@ struct builtin { |
612 | 615 |
|
613 | 616 | struct StringToNumber : public Descriptor<StringToNumber> { |
614 | 617 | static constexpr auto kFunction = Builtin::kStringToNumber; |
615 | | - struct Arguments { |
| 618 | + struct Arguments : ArgumentsBase { |
616 | 619 | ARG(V<String>, input) |
617 | 620 | }; |
618 | 621 | using returns_t = std::tuple<V<Number>>; |
@@ -626,7 +629,7 @@ struct builtin { |
626 | 629 |
|
627 | 630 | struct ToBoolean : public Descriptor<ToBoolean> { |
628 | 631 | static constexpr auto kFunction = Builtin::kToBoolean; |
629 | | - struct Arguments { |
| 632 | + struct Arguments : ArgumentsBase { |
630 | 633 | ARG(V<Object>, input) |
631 | 634 | }; |
632 | 635 | using returns_t = std::tuple<V<Boolean>>; |
@@ -639,7 +642,7 @@ struct builtin { |
639 | 642 |
|
640 | 643 | struct ToObject : public Descriptor<ToObject> { |
641 | 644 | static constexpr auto kFunction = Builtin::kToObject; |
642 | | - struct Arguments { |
| 645 | + struct Arguments : ArgumentsBase { |
643 | 646 | ARG(V<Object>, input) |
644 | 647 | }; |
645 | 648 | using returns_t = std::tuple<V<JSReceiver>>; |
@@ -654,7 +657,7 @@ struct builtin { |
654 | 657 | template <Builtin B> |
655 | 658 | struct CreateFunctionContext : public Descriptor<CreateFunctionContext<B>> { |
656 | 659 | static constexpr auto kFunction = B; |
657 | | - struct Arguments { |
| 660 | + struct Arguments : ArgumentsBase { |
658 | 661 | ARG(V<ScopeInfo>, scope_info) |
659 | 662 | ARG(V<Word32>, slots) |
660 | 663 | }; |
@@ -674,7 +677,7 @@ struct builtin { |
674 | 677 |
|
675 | 678 | struct FastNewClosure : public Descriptor<FastNewClosure> { |
676 | 679 | static constexpr auto kFunction = Builtin::kFastNewClosure; |
677 | | - struct Arguments { |
| 680 | + struct Arguments : ArgumentsBase { |
678 | 681 | ARG(V<SharedFunctionInfo>, shared_function_info) |
679 | 682 | ARG(V<FeedbackCell>, feedback_cell) |
680 | 683 | }; |
@@ -690,7 +693,7 @@ struct builtin { |
690 | 693 |
|
691 | 694 | struct Typeof : public Descriptor<Typeof> { |
692 | 695 | static constexpr auto kFunction = Builtin::kTypeof; |
693 | | - struct Arguments { |
| 696 | + struct Arguments : ArgumentsBase { |
694 | 697 | ARG(V<Object>, object) |
695 | 698 | }; |
696 | 699 | using returns_t = std::tuple<V<String>>; |
@@ -704,7 +707,7 @@ struct builtin { |
704 | 707 | struct CheckTurboshaftWord32Type |
705 | 708 | : public Descriptor<CheckTurboshaftWord32Type> { |
706 | 709 | static constexpr auto kFunction = Builtin::kCheckTurboshaftWord32Type; |
707 | | - struct Arguments { |
| 710 | + struct Arguments : ArgumentsBase { |
708 | 711 | ARG(V<Word32>, value) |
709 | 712 | ARG(V<TurboshaftWord32Type>, expected_type) |
710 | 713 | ARG(V<Smi>, node_id) |
@@ -720,7 +723,7 @@ struct builtin { |
720 | 723 | struct CheckTurboshaftWord64Type |
721 | 724 | : public Descriptor<CheckTurboshaftWord64Type> { |
722 | 725 | static constexpr auto kFunction = Builtin::kCheckTurboshaftWord64Type; |
723 | | - struct Arguments { |
| 726 | + struct Arguments : ArgumentsBase { |
724 | 727 | ARG(V<Word32>, value_high) |
725 | 728 | ARG(V<Word32>, value_low) |
726 | 729 | ARG(V<TurboshaftWord64Type>, expected_type) |
@@ -737,7 +740,7 @@ struct builtin { |
737 | 740 | struct CheckTurboshaftFloat32Type |
738 | 741 | : public Descriptor<CheckTurboshaftFloat32Type> { |
739 | 742 | static constexpr auto kFunction = Builtin::kCheckTurboshaftFloat32Type; |
740 | | - struct Arguments { |
| 743 | + struct Arguments : ArgumentsBase { |
741 | 744 | ARG(V<Float32>, value) |
742 | 745 | ARG(V<TurboshaftFloat64Type>, expected_type) |
743 | 746 | ARG(V<Smi>, node_id) |
@@ -753,7 +756,7 @@ struct builtin { |
753 | 756 | struct CheckTurboshaftFloat64Type |
754 | 757 | : public Descriptor<CheckTurboshaftFloat64Type> { |
755 | 758 | static constexpr auto kFunction = Builtin::kCheckTurboshaftFloat64Type; |
756 | | - struct Arguments { |
| 759 | + struct Arguments : ArgumentsBase { |
757 | 760 | ARG(V<Float64>, value) |
758 | 761 | ARG(V<TurboshaftFloat64Type>, expected_type) |
759 | 762 | ARG(V<Smi>, node_id) |
|