11cb0ef41Sopenharmony_ci// Copyright 2017 the V8 project authors. All rights reserved.
21cb0ef41Sopenharmony_ci// Use of this source code is governed by a BSD-style license that can be
31cb0ef41Sopenharmony_ci// found in the LICENSE file.
41cb0ef41Sopenharmony_ci
51cb0ef41Sopenharmony_ci#include "src/builtins/builtins-utils-gen.h"
61cb0ef41Sopenharmony_ci#include "src/builtins/builtins.h"
71cb0ef41Sopenharmony_ci#include "src/codegen/code-stub-assembler.h"
81cb0ef41Sopenharmony_ci#include "src/ic/binary-op-assembler.h"
91cb0ef41Sopenharmony_ci#include "src/ic/unary-op-assembler.h"
101cb0ef41Sopenharmony_ci
111cb0ef41Sopenharmony_cinamespace v8 {
121cb0ef41Sopenharmony_cinamespace internal {
131cb0ef41Sopenharmony_ci
141cb0ef41Sopenharmony_ci// -----------------------------------------------------------------------------
151cb0ef41Sopenharmony_ci// ES6 section 20.1 Number Objects
161cb0ef41Sopenharmony_ci
171cb0ef41Sopenharmony_ci#define DEF_BINOP(Name, Generator)                                           \
181cb0ef41Sopenharmony_ci  TF_BUILTIN(Name, CodeStubAssembler) {                                      \
191cb0ef41Sopenharmony_ci    auto lhs = Parameter<Object>(Descriptor::kLeft);                         \
201cb0ef41Sopenharmony_ci    auto rhs = Parameter<Object>(Descriptor::kRight);                        \
211cb0ef41Sopenharmony_ci    auto context = Parameter<Context>(Descriptor::kContext);                 \
221cb0ef41Sopenharmony_ci    auto feedback_vector =                                                   \
231cb0ef41Sopenharmony_ci        Parameter<FeedbackVector>(Descriptor::kFeedbackVector);              \
241cb0ef41Sopenharmony_ci    auto slot = UncheckedParameter<UintPtrT>(Descriptor::kSlot);             \
251cb0ef41Sopenharmony_ci                                                                             \
261cb0ef41Sopenharmony_ci    BinaryOpAssembler binop_asm(state());                                    \
271cb0ef41Sopenharmony_ci    TNode<Object> result =                                                   \
281cb0ef41Sopenharmony_ci        binop_asm.Generator([&]() { return context; }, lhs, rhs, slot,       \
291cb0ef41Sopenharmony_ci                            [&]() { return feedback_vector; },               \
301cb0ef41Sopenharmony_ci                            UpdateFeedbackMode::kGuaranteedFeedback, false); \
311cb0ef41Sopenharmony_ci                                                                             \
321cb0ef41Sopenharmony_ci    Return(result);                                                          \
331cb0ef41Sopenharmony_ci  }
341cb0ef41Sopenharmony_ciDEF_BINOP(Add_WithFeedback, Generate_AddWithFeedback)
351cb0ef41Sopenharmony_ciDEF_BINOP(Subtract_WithFeedback, Generate_SubtractWithFeedback)
361cb0ef41Sopenharmony_ciDEF_BINOP(Multiply_WithFeedback, Generate_MultiplyWithFeedback)
371cb0ef41Sopenharmony_ciDEF_BINOP(Divide_WithFeedback, Generate_DivideWithFeedback)
381cb0ef41Sopenharmony_ciDEF_BINOP(Modulus_WithFeedback, Generate_ModulusWithFeedback)
391cb0ef41Sopenharmony_ciDEF_BINOP(Exponentiate_WithFeedback, Generate_ExponentiateWithFeedback)
401cb0ef41Sopenharmony_ciDEF_BINOP(BitwiseOr_WithFeedback, Generate_BitwiseOrWithFeedback)
411cb0ef41Sopenharmony_ciDEF_BINOP(BitwiseXor_WithFeedback, Generate_BitwiseXorWithFeedback)
421cb0ef41Sopenharmony_ciDEF_BINOP(BitwiseAnd_WithFeedback, Generate_BitwiseAndWithFeedback)
431cb0ef41Sopenharmony_ciDEF_BINOP(ShiftLeft_WithFeedback, Generate_ShiftLeftWithFeedback)
441cb0ef41Sopenharmony_ciDEF_BINOP(ShiftRight_WithFeedback, Generate_ShiftRightWithFeedback)
451cb0ef41Sopenharmony_ciDEF_BINOP(ShiftRightLogical_WithFeedback,
461cb0ef41Sopenharmony_ci          Generate_ShiftRightLogicalWithFeedback)
471cb0ef41Sopenharmony_ci#undef DEF_BINOP
481cb0ef41Sopenharmony_ci
491cb0ef41Sopenharmony_ci#define DEF_BINOP(Name, Generator)                                   \
501cb0ef41Sopenharmony_ci  TF_BUILTIN(Name, CodeStubAssembler) {                              \
511cb0ef41Sopenharmony_ci    auto lhs = Parameter<Object>(Descriptor::kLeft);                 \
521cb0ef41Sopenharmony_ci    auto rhs = Parameter<Object>(Descriptor::kRight);                \
531cb0ef41Sopenharmony_ci    auto slot = UncheckedParameter<UintPtrT>(Descriptor::kSlot);     \
541cb0ef41Sopenharmony_ci                                                                     \
551cb0ef41Sopenharmony_ci    BinaryOpAssembler binop_asm(state());                            \
561cb0ef41Sopenharmony_ci    TNode<Object> result = binop_asm.Generator(                      \
571cb0ef41Sopenharmony_ci        [&]() { return LoadContextFromBaseline(); }, lhs, rhs, slot, \
581cb0ef41Sopenharmony_ci        [&]() { return LoadFeedbackVectorFromBaseline(); },          \
591cb0ef41Sopenharmony_ci        UpdateFeedbackMode::kGuaranteedFeedback, false);             \
601cb0ef41Sopenharmony_ci                                                                     \
611cb0ef41Sopenharmony_ci    Return(result);                                                  \
621cb0ef41Sopenharmony_ci  }
631cb0ef41Sopenharmony_ciDEF_BINOP(Add_Baseline, Generate_AddWithFeedback)
641cb0ef41Sopenharmony_ciDEF_BINOP(Subtract_Baseline, Generate_SubtractWithFeedback)
651cb0ef41Sopenharmony_ciDEF_BINOP(Multiply_Baseline, Generate_MultiplyWithFeedback)
661cb0ef41Sopenharmony_ciDEF_BINOP(Divide_Baseline, Generate_DivideWithFeedback)
671cb0ef41Sopenharmony_ciDEF_BINOP(Modulus_Baseline, Generate_ModulusWithFeedback)
681cb0ef41Sopenharmony_ciDEF_BINOP(Exponentiate_Baseline, Generate_ExponentiateWithFeedback)
691cb0ef41Sopenharmony_ciDEF_BINOP(BitwiseOr_Baseline, Generate_BitwiseOrWithFeedback)
701cb0ef41Sopenharmony_ciDEF_BINOP(BitwiseXor_Baseline, Generate_BitwiseXorWithFeedback)
711cb0ef41Sopenharmony_ciDEF_BINOP(BitwiseAnd_Baseline, Generate_BitwiseAndWithFeedback)
721cb0ef41Sopenharmony_ciDEF_BINOP(ShiftLeft_Baseline, Generate_ShiftLeftWithFeedback)
731cb0ef41Sopenharmony_ciDEF_BINOP(ShiftRight_Baseline, Generate_ShiftRightWithFeedback)
741cb0ef41Sopenharmony_ciDEF_BINOP(ShiftRightLogical_Baseline, Generate_ShiftRightLogicalWithFeedback)
751cb0ef41Sopenharmony_ci#undef DEF_BINOP
761cb0ef41Sopenharmony_ci
771cb0ef41Sopenharmony_ci#define DEF_BINOP_RHS_SMI(Name, Generator)                           \
781cb0ef41Sopenharmony_ci  TF_BUILTIN(Name, CodeStubAssembler) {                              \
791cb0ef41Sopenharmony_ci    auto lhs = Parameter<Object>(Descriptor::kLeft);                 \
801cb0ef41Sopenharmony_ci    auto rhs = Parameter<Object>(Descriptor::kRight);                \
811cb0ef41Sopenharmony_ci    auto slot = UncheckedParameter<UintPtrT>(Descriptor::kSlot);     \
821cb0ef41Sopenharmony_ci                                                                     \
831cb0ef41Sopenharmony_ci    BinaryOpAssembler binop_asm(state());                            \
841cb0ef41Sopenharmony_ci    TNode<Object> result = binop_asm.Generator(                      \
851cb0ef41Sopenharmony_ci        [&]() { return LoadContextFromBaseline(); }, lhs, rhs, slot, \
861cb0ef41Sopenharmony_ci        [&]() { return LoadFeedbackVectorFromBaseline(); },          \
871cb0ef41Sopenharmony_ci        UpdateFeedbackMode::kGuaranteedFeedback, true);              \
881cb0ef41Sopenharmony_ci                                                                     \
891cb0ef41Sopenharmony_ci    Return(result);                                                  \
901cb0ef41Sopenharmony_ci  }
911cb0ef41Sopenharmony_ciDEF_BINOP_RHS_SMI(AddSmi_Baseline, Generate_AddWithFeedback)
921cb0ef41Sopenharmony_ciDEF_BINOP_RHS_SMI(SubtractSmi_Baseline, Generate_SubtractWithFeedback)
931cb0ef41Sopenharmony_ciDEF_BINOP_RHS_SMI(MultiplySmi_Baseline, Generate_MultiplyWithFeedback)
941cb0ef41Sopenharmony_ciDEF_BINOP_RHS_SMI(DivideSmi_Baseline, Generate_DivideWithFeedback)
951cb0ef41Sopenharmony_ciDEF_BINOP_RHS_SMI(ModulusSmi_Baseline, Generate_ModulusWithFeedback)
961cb0ef41Sopenharmony_ciDEF_BINOP_RHS_SMI(ExponentiateSmi_Baseline, Generate_ExponentiateWithFeedback)
971cb0ef41Sopenharmony_ciDEF_BINOP_RHS_SMI(BitwiseOrSmi_Baseline, Generate_BitwiseOrWithFeedback)
981cb0ef41Sopenharmony_ciDEF_BINOP_RHS_SMI(BitwiseXorSmi_Baseline, Generate_BitwiseXorWithFeedback)
991cb0ef41Sopenharmony_ciDEF_BINOP_RHS_SMI(BitwiseAndSmi_Baseline, Generate_BitwiseAndWithFeedback)
1001cb0ef41Sopenharmony_ciDEF_BINOP_RHS_SMI(ShiftLeftSmi_Baseline, Generate_ShiftLeftWithFeedback)
1011cb0ef41Sopenharmony_ciDEF_BINOP_RHS_SMI(ShiftRightSmi_Baseline, Generate_ShiftRightWithFeedback)
1021cb0ef41Sopenharmony_ciDEF_BINOP_RHS_SMI(ShiftRightLogicalSmi_Baseline,
1031cb0ef41Sopenharmony_ci                  Generate_ShiftRightLogicalWithFeedback)
1041cb0ef41Sopenharmony_ci#undef DEF_BINOP_RHS_SMI
1051cb0ef41Sopenharmony_ci
1061cb0ef41Sopenharmony_ci#define DEF_UNOP(Name, Generator)                                \
1071cb0ef41Sopenharmony_ci  TF_BUILTIN(Name, CodeStubAssembler) {                          \
1081cb0ef41Sopenharmony_ci    auto value = Parameter<Object>(Descriptor::kValue);          \
1091cb0ef41Sopenharmony_ci    auto context = Parameter<Context>(Descriptor::kContext);     \
1101cb0ef41Sopenharmony_ci    auto feedback_vector =                                       \
1111cb0ef41Sopenharmony_ci        Parameter<FeedbackVector>(Descriptor::kFeedbackVector);  \
1121cb0ef41Sopenharmony_ci    auto slot = UncheckedParameter<UintPtrT>(Descriptor::kSlot); \
1131cb0ef41Sopenharmony_ci                                                                 \
1141cb0ef41Sopenharmony_ci    UnaryOpAssembler a(state());                                 \
1151cb0ef41Sopenharmony_ci    TNode<Object> result =                                       \
1161cb0ef41Sopenharmony_ci        a.Generator(context, value, slot, feedback_vector,       \
1171cb0ef41Sopenharmony_ci                    UpdateFeedbackMode::kGuaranteedFeedback);    \
1181cb0ef41Sopenharmony_ci                                                                 \
1191cb0ef41Sopenharmony_ci    Return(result);                                              \
1201cb0ef41Sopenharmony_ci  }
1211cb0ef41Sopenharmony_ciDEF_UNOP(BitwiseNot_WithFeedback, Generate_BitwiseNotWithFeedback)
1221cb0ef41Sopenharmony_ciDEF_UNOP(Decrement_WithFeedback, Generate_DecrementWithFeedback)
1231cb0ef41Sopenharmony_ciDEF_UNOP(Increment_WithFeedback, Generate_IncrementWithFeedback)
1241cb0ef41Sopenharmony_ciDEF_UNOP(Negate_WithFeedback, Generate_NegateWithFeedback)
1251cb0ef41Sopenharmony_ci#undef DEF_UNOP
1261cb0ef41Sopenharmony_ci
1271cb0ef41Sopenharmony_ci#define DEF_UNOP(Name, Generator)                                \
1281cb0ef41Sopenharmony_ci  TF_BUILTIN(Name, CodeStubAssembler) {                          \
1291cb0ef41Sopenharmony_ci    auto value = Parameter<Object>(Descriptor::kValue);          \
1301cb0ef41Sopenharmony_ci    auto context = LoadContextFromBaseline();                    \
1311cb0ef41Sopenharmony_ci    auto feedback_vector = LoadFeedbackVectorFromBaseline();     \
1321cb0ef41Sopenharmony_ci    auto slot = UncheckedParameter<UintPtrT>(Descriptor::kSlot); \
1331cb0ef41Sopenharmony_ci                                                                 \
1341cb0ef41Sopenharmony_ci    UnaryOpAssembler a(state());                                 \
1351cb0ef41Sopenharmony_ci    TNode<Object> result =                                       \
1361cb0ef41Sopenharmony_ci        a.Generator(context, value, slot, feedback_vector,       \
1371cb0ef41Sopenharmony_ci                    UpdateFeedbackMode::kGuaranteedFeedback);    \
1381cb0ef41Sopenharmony_ci                                                                 \
1391cb0ef41Sopenharmony_ci    Return(result);                                              \
1401cb0ef41Sopenharmony_ci  }
1411cb0ef41Sopenharmony_ciDEF_UNOP(BitwiseNot_Baseline, Generate_BitwiseNotWithFeedback)
1421cb0ef41Sopenharmony_ciDEF_UNOP(Decrement_Baseline, Generate_DecrementWithFeedback)
1431cb0ef41Sopenharmony_ciDEF_UNOP(Increment_Baseline, Generate_IncrementWithFeedback)
1441cb0ef41Sopenharmony_ciDEF_UNOP(Negate_Baseline, Generate_NegateWithFeedback)
1451cb0ef41Sopenharmony_ci#undef DEF_UNOP
1461cb0ef41Sopenharmony_ci
1471cb0ef41Sopenharmony_ci#define DEF_COMPARE(Name)                                                      \
1481cb0ef41Sopenharmony_ci  TF_BUILTIN(Name##_WithFeedback, CodeStubAssembler) {                         \
1491cb0ef41Sopenharmony_ci    auto lhs = Parameter<Object>(Descriptor::kLeft);                           \
1501cb0ef41Sopenharmony_ci    auto rhs = Parameter<Object>(Descriptor::kRight);                          \
1511cb0ef41Sopenharmony_ci    auto context = Parameter<Context>(Descriptor::kContext);                   \
1521cb0ef41Sopenharmony_ci    auto feedback_vector =                                                     \
1531cb0ef41Sopenharmony_ci        Parameter<FeedbackVector>(Descriptor::kFeedbackVector);                \
1541cb0ef41Sopenharmony_ci    auto slot = UncheckedParameter<UintPtrT>(Descriptor::kSlot);               \
1551cb0ef41Sopenharmony_ci                                                                               \
1561cb0ef41Sopenharmony_ci    TVARIABLE(Smi, var_type_feedback);                                         \
1571cb0ef41Sopenharmony_ci    TNode<Oddball> result = RelationalComparison(Operation::k##Name, lhs, rhs, \
1581cb0ef41Sopenharmony_ci                                                 context, &var_type_feedback); \
1591cb0ef41Sopenharmony_ci    UpdateFeedback(var_type_feedback.value(), feedback_vector, slot);          \
1601cb0ef41Sopenharmony_ci                                                                               \
1611cb0ef41Sopenharmony_ci    Return(result);                                                            \
1621cb0ef41Sopenharmony_ci  }
1631cb0ef41Sopenharmony_ciDEF_COMPARE(LessThan)
1641cb0ef41Sopenharmony_ciDEF_COMPARE(LessThanOrEqual)
1651cb0ef41Sopenharmony_ciDEF_COMPARE(GreaterThan)
1661cb0ef41Sopenharmony_ciDEF_COMPARE(GreaterThanOrEqual)
1671cb0ef41Sopenharmony_ci#undef DEF_COMPARE
1681cb0ef41Sopenharmony_ci
1691cb0ef41Sopenharmony_ci#define DEF_COMPARE(Name)                                                 \
1701cb0ef41Sopenharmony_ci  TF_BUILTIN(Name##_Baseline, CodeStubAssembler) {                        \
1711cb0ef41Sopenharmony_ci    auto lhs = Parameter<Object>(Descriptor::kLeft);                      \
1721cb0ef41Sopenharmony_ci    auto rhs = Parameter<Object>(Descriptor::kRight);                     \
1731cb0ef41Sopenharmony_ci    auto slot = UncheckedParameter<UintPtrT>(Descriptor::kSlot);          \
1741cb0ef41Sopenharmony_ci                                                                          \
1751cb0ef41Sopenharmony_ci    TVARIABLE(Smi, var_type_feedback);                                    \
1761cb0ef41Sopenharmony_ci    TNode<Oddball> result = RelationalComparison(                         \
1771cb0ef41Sopenharmony_ci        Operation::k##Name, lhs, rhs,                                     \
1781cb0ef41Sopenharmony_ci        [&]() { return LoadContextFromBaseline(); }, &var_type_feedback); \
1791cb0ef41Sopenharmony_ci    auto feedback_vector = LoadFeedbackVectorFromBaseline();              \
1801cb0ef41Sopenharmony_ci    UpdateFeedback(var_type_feedback.value(), feedback_vector, slot);     \
1811cb0ef41Sopenharmony_ci                                                                          \
1821cb0ef41Sopenharmony_ci    Return(result);                                                       \
1831cb0ef41Sopenharmony_ci  }
1841cb0ef41Sopenharmony_ciDEF_COMPARE(LessThan)
1851cb0ef41Sopenharmony_ciDEF_COMPARE(LessThanOrEqual)
1861cb0ef41Sopenharmony_ciDEF_COMPARE(GreaterThan)
1871cb0ef41Sopenharmony_ciDEF_COMPARE(GreaterThanOrEqual)
1881cb0ef41Sopenharmony_ci#undef DEF_COMPARE
1891cb0ef41Sopenharmony_ci
1901cb0ef41Sopenharmony_ciTF_BUILTIN(Equal_WithFeedback, CodeStubAssembler) {
1911cb0ef41Sopenharmony_ci  auto lhs = Parameter<Object>(Descriptor::kLeft);
1921cb0ef41Sopenharmony_ci  auto rhs = Parameter<Object>(Descriptor::kRight);
1931cb0ef41Sopenharmony_ci  auto context = Parameter<Context>(Descriptor::kContext);
1941cb0ef41Sopenharmony_ci  auto feedback_vector = Parameter<FeedbackVector>(Descriptor::kFeedbackVector);
1951cb0ef41Sopenharmony_ci  auto slot = UncheckedParameter<UintPtrT>(Descriptor::kSlot);
1961cb0ef41Sopenharmony_ci
1971cb0ef41Sopenharmony_ci  TVARIABLE(Smi, var_type_feedback);
1981cb0ef41Sopenharmony_ci  TNode<Oddball> result = Equal(
1991cb0ef41Sopenharmony_ci      lhs, rhs, [&]() { return context; }, &var_type_feedback);
2001cb0ef41Sopenharmony_ci  UpdateFeedback(var_type_feedback.value(), feedback_vector, slot);
2011cb0ef41Sopenharmony_ci
2021cb0ef41Sopenharmony_ci  Return(result);
2031cb0ef41Sopenharmony_ci}
2041cb0ef41Sopenharmony_ci
2051cb0ef41Sopenharmony_ciTF_BUILTIN(StrictEqual_WithFeedback, CodeStubAssembler) {
2061cb0ef41Sopenharmony_ci  auto lhs = Parameter<Object>(Descriptor::kLeft);
2071cb0ef41Sopenharmony_ci  auto rhs = Parameter<Object>(Descriptor::kRight);
2081cb0ef41Sopenharmony_ci  auto feedback_vector = Parameter<FeedbackVector>(Descriptor::kFeedbackVector);
2091cb0ef41Sopenharmony_ci  auto slot = UncheckedParameter<UintPtrT>(Descriptor::kSlot);
2101cb0ef41Sopenharmony_ci
2111cb0ef41Sopenharmony_ci  TVARIABLE(Smi, var_type_feedback);
2121cb0ef41Sopenharmony_ci  TNode<Oddball> result = StrictEqual(lhs, rhs, &var_type_feedback);
2131cb0ef41Sopenharmony_ci  UpdateFeedback(var_type_feedback.value(), feedback_vector, slot);
2141cb0ef41Sopenharmony_ci
2151cb0ef41Sopenharmony_ci  Return(result);
2161cb0ef41Sopenharmony_ci}
2171cb0ef41Sopenharmony_ci
2181cb0ef41Sopenharmony_ciTF_BUILTIN(Equal_Baseline, CodeStubAssembler) {
2191cb0ef41Sopenharmony_ci  auto lhs = Parameter<Object>(Descriptor::kLeft);
2201cb0ef41Sopenharmony_ci  auto rhs = Parameter<Object>(Descriptor::kRight);
2211cb0ef41Sopenharmony_ci  auto slot = UncheckedParameter<UintPtrT>(Descriptor::kSlot);
2221cb0ef41Sopenharmony_ci
2231cb0ef41Sopenharmony_ci  TVARIABLE(Smi, var_type_feedback);
2241cb0ef41Sopenharmony_ci  TNode<Oddball> result = Equal(
2251cb0ef41Sopenharmony_ci      lhs, rhs, [&]() { return LoadContextFromBaseline(); },
2261cb0ef41Sopenharmony_ci      &var_type_feedback);
2271cb0ef41Sopenharmony_ci  auto feedback_vector = LoadFeedbackVectorFromBaseline();
2281cb0ef41Sopenharmony_ci  UpdateFeedback(var_type_feedback.value(), feedback_vector, slot);
2291cb0ef41Sopenharmony_ci
2301cb0ef41Sopenharmony_ci  Return(result);
2311cb0ef41Sopenharmony_ci}
2321cb0ef41Sopenharmony_ci
2331cb0ef41Sopenharmony_ciTF_BUILTIN(StrictEqual_Baseline, CodeStubAssembler) {
2341cb0ef41Sopenharmony_ci  auto lhs = Parameter<Object>(Descriptor::kLeft);
2351cb0ef41Sopenharmony_ci  auto rhs = Parameter<Object>(Descriptor::kRight);
2361cb0ef41Sopenharmony_ci  auto slot = UncheckedParameter<UintPtrT>(Descriptor::kSlot);
2371cb0ef41Sopenharmony_ci
2381cb0ef41Sopenharmony_ci  TVARIABLE(Smi, var_type_feedback);
2391cb0ef41Sopenharmony_ci  TNode<Oddball> result = StrictEqual(lhs, rhs, &var_type_feedback);
2401cb0ef41Sopenharmony_ci  auto feedback_vector = LoadFeedbackVectorFromBaseline();
2411cb0ef41Sopenharmony_ci  UpdateFeedback(var_type_feedback.value(), feedback_vector, slot);
2421cb0ef41Sopenharmony_ci
2431cb0ef41Sopenharmony_ci  Return(result);
2441cb0ef41Sopenharmony_ci}
2451cb0ef41Sopenharmony_ci
2461cb0ef41Sopenharmony_ci}  // namespace internal
2471cb0ef41Sopenharmony_ci}  // namespace v8
248