19#define DEF_BINOP(Name, Generator)                                           \ 
   20  TF_BUILTIN(Name, CodeStubAssembler) {                                      \ 
   21    auto lhs = Parameter<Object>(Descriptor::kLeft);                         \ 
   22    auto rhs = Parameter<Object>(Descriptor::kRight);                        \ 
   23    auto context = Parameter<Context>(Descriptor::kContext);                 \ 
   24    auto feedback_vector =                                                   \ 
   25        Parameter<FeedbackVector>(Descriptor::kFeedbackVector);              \ 
   26    auto slot = UncheckedParameter<UintPtrT>(Descriptor::kSlot);             \ 
   28    BinaryOpAssembler binop_asm(state());                                    \ 
   29    TNode<Object> result =                                                   \ 
   30        binop_asm.Generator([&]() { return context; }, lhs, rhs, slot,       \ 
   31                            [&]() { return feedback_vector; },               \ 
   32                            UpdateFeedbackMode::kGuaranteedFeedback, false); \ 
 
   36DEF_BINOP(Add_WithFeedback, Generate_AddWithFeedback)
 
   37DEF_BINOP(Subtract_WithFeedback, Generate_SubtractWithFeedback)
 
   38DEF_BINOP(Multiply_WithFeedback, Generate_MultiplyWithFeedback)
 
   39DEF_BINOP(Divide_WithFeedback, Generate_DivideWithFeedback)
 
   40DEF_BINOP(Modulus_WithFeedback, Generate_ModulusWithFeedback)
 
   41DEF_BINOP(Exponentiate_WithFeedback, Generate_ExponentiateWithFeedback)
 
   42DEF_BINOP(BitwiseOr_WithFeedback, Generate_BitwiseOrWithFeedback)
 
   43DEF_BINOP(BitwiseXor_WithFeedback, Generate_BitwiseXorWithFeedback)
 
   44DEF_BINOP(BitwiseAnd_WithFeedback, Generate_BitwiseAndWithFeedback)
 
   45DEF_BINOP(ShiftLeft_WithFeedback, Generate_ShiftLeftWithFeedback)
 
   46DEF_BINOP(ShiftRight_WithFeedback, Generate_ShiftRightWithFeedback)
 
   48          Generate_ShiftRightLogicalWithFeedback)
 
   51#define DEF_BINOP(Name, Generator)                                   \ 
   52  TF_BUILTIN(Name, CodeStubAssembler) {                              \ 
   53    auto lhs = Parameter<Object>(Descriptor::kLeft);                 \ 
   54    auto rhs = Parameter<Object>(Descriptor::kRight);                \ 
   55    auto slot = UncheckedParameter<UintPtrT>(Descriptor::kSlot);     \ 
   57    BinaryOpAssembler binop_asm(state());                            \ 
   58    TNode<Object> result = binop_asm.Generator(                      \ 
   59        [&]() { return LoadContextFromBaseline(); }, lhs, rhs, slot, \ 
   60        [&]() { return LoadFeedbackVectorFromBaseline(); },          \ 
   61        UpdateFeedbackMode::kGuaranteedFeedback, false);             \ 
   65DEF_BINOP(Add_Baseline, Generate_AddWithFeedback)
 
   66DEF_BINOP(Subtract_Baseline, Generate_SubtractWithFeedback)
 
   67DEF_BINOP(Multiply_Baseline, Generate_MultiplyWithFeedback)
 
   68DEF_BINOP(Divide_Baseline, Generate_DivideWithFeedback)
 
   69DEF_BINOP(Modulus_Baseline, Generate_ModulusWithFeedback)
 
   70DEF_BINOP(Exponentiate_Baseline, Generate_ExponentiateWithFeedback)
 
   71DEF_BINOP(BitwiseOr_Baseline, Generate_BitwiseOrWithFeedback)
 
   72DEF_BINOP(BitwiseXor_Baseline, Generate_BitwiseXorWithFeedback)
 
   73DEF_BINOP(BitwiseAnd_Baseline, Generate_BitwiseAndWithFeedback)
 
   74DEF_BINOP(ShiftLeft_Baseline, Generate_ShiftLeftWithFeedback)
 
   75DEF_BINOP(ShiftRight_Baseline, Generate_ShiftRightWithFeedback)
 
   76DEF_BINOP(ShiftRightLogical_Baseline, Generate_ShiftRightLogicalWithFeedback)
 
   79#define DEF_BINOP_RHS_SMI(Name, Generator)                           \ 
   80  TF_BUILTIN(Name, CodeStubAssembler) {                              \ 
   81    auto lhs = Parameter<Object>(Descriptor::kLeft);                 \ 
   82    auto rhs = Parameter<Object>(Descriptor::kRight);                \ 
   83    auto slot = UncheckedParameter<UintPtrT>(Descriptor::kSlot);     \ 
   85    BinaryOpAssembler binop_asm(state());                            \ 
   86    TNode<Object> result = binop_asm.Generator(                      \ 
   87        [&]() { return LoadContextFromBaseline(); }, lhs, rhs, slot, \ 
   88        [&]() { return LoadFeedbackVectorFromBaseline(); },          \ 
   89        UpdateFeedbackMode::kGuaranteedFeedback, true);              \ 
  105                  Generate_ShiftRightLogicalWithFeedback)
 
  106#undef DEF_BINOP_RHS_SMI 
  108#define DEF_UNOP(Name, Generator)                                \ 
  109  TF_BUILTIN(Name, CodeStubAssembler) {                          \ 
  110    auto value = Parameter<Object>(Descriptor::kValue);          \ 
  111    auto context = Parameter<Context>(Descriptor::kContext);     \ 
  112    auto feedback_vector =                                       \ 
  113        Parameter<FeedbackVector>(Descriptor::kFeedbackVector);  \ 
  114    auto slot = UncheckedParameter<UintPtrT>(Descriptor::kSlot); \ 
  116    UnaryOpAssembler a(state());                                 \ 
  117    TNode<Object> result =                                       \ 
  118        a.Generator(context, value, slot, feedback_vector,       \ 
  119                    UpdateFeedbackMode::kGuaranteedFeedback);    \ 
 
  123#ifndef V8_ENABLE_EXPERIMENTAL_TSA_BUILTINS 
  124DEF_UNOP(BitwiseNot_WithFeedback, Generate_BitwiseNotWithFeedback)
 
  126DEF_UNOP(Decrement_WithFeedback, Generate_DecrementWithFeedback)
 
  127DEF_UNOP(Increment_WithFeedback, Generate_IncrementWithFeedback)
 
  128DEF_UNOP(Negate_WithFeedback, Generate_NegateWithFeedback)
 
  131#define DEF_UNOP(Name, Generator)                                \ 
  132  TF_BUILTIN(Name, CodeStubAssembler) {                          \ 
  133    auto value = Parameter<Object>(Descriptor::kValue);          \ 
  134    auto context = LoadContextFromBaseline();                    \ 
  135    auto feedback_vector = LoadFeedbackVectorFromBaseline();     \ 
  136    auto slot = UncheckedParameter<UintPtrT>(Descriptor::kSlot); \ 
  138    UnaryOpAssembler a(state());                                 \ 
  139    TNode<Object> result =                                       \ 
  140        a.Generator(context, value, slot, feedback_vector,       \ 
  141                    UpdateFeedbackMode::kGuaranteedFeedback);    \ 
  145DEF_UNOP(BitwiseNot_Baseline, Generate_BitwiseNotWithFeedback)
 
  146DEF_UNOP(Decrement_Baseline, Generate_DecrementWithFeedback)
 
  147DEF_UNOP(Increment_Baseline, Generate_IncrementWithFeedback)
 
  148DEF_UNOP(Negate_Baseline, Generate_NegateWithFeedback)
 
  151#define DEF_COMPARE(Name)                                                  \ 
  152  TF_BUILTIN(Name##_WithFeedback, CodeStubAssembler) {                     \ 
  153    auto lhs = Parameter<Object>(Descriptor::kLeft);                       \ 
  154    auto rhs = Parameter<Object>(Descriptor::kRight);                      \ 
  155    auto context = Parameter<Context>(Descriptor::kContext);               \ 
  156    auto feedback_vector =                                                 \ 
  157        Parameter<FeedbackVector>(Descriptor::kFeedbackVector);            \ 
  158    auto slot = UncheckedParameter<UintPtrT>(Descriptor::kSlot);           \ 
  160    TVARIABLE(Smi, var_type_feedback);                                     \ 
  161    TVARIABLE(Object, var_exception);                                      \ 
  162    Label if_exception(this, Label::kDeferred);                            \ 
  163    TNode<Boolean> result;                                                 \ 
  165      ScopedExceptionHandler handler(this, &if_exception, &var_exception); \ 
  166      result = RelationalComparison(Operation::k##Name, lhs, rhs, context, \ 
  167                                    &var_type_feedback);                   \ 
  169    UpdateFeedback(var_type_feedback.value(), feedback_vector, slot);      \ 
  172    BIND(&if_exception);                                                   \ 
  174      UpdateFeedback(var_type_feedback.value(), feedback_vector, slot);    \ 
  175      CallRuntime(Runtime::kReThrow, context, var_exception.value());      \ 
 
  185#define DEF_COMPARE(Name)                                                   \ 
  186  TF_BUILTIN(Name##_Baseline, CodeStubAssembler) {                          \ 
  187    auto lhs = Parameter<Object>(Descriptor::kLeft);                        \ 
  188    auto rhs = Parameter<Object>(Descriptor::kRight);                       \ 
  189    auto slot = UncheckedParameter<UintPtrT>(Descriptor::kSlot);            \ 
  191    TVARIABLE(Smi, var_type_feedback);                                      \ 
  192    TVARIABLE(Object, var_exception);                                       \ 
  193    Label if_exception(this, Label::kDeferred);                             \ 
  194    TNode<Boolean> result;                                                  \ 
  196      ScopedExceptionHandler handler(this, &if_exception, &var_exception);  \ 
  197      result = RelationalComparison(                                        \ 
  198          Operation::k##Name, lhs, rhs,                                     \ 
  199          [&]() { return LoadContextFromBaseline(); }, &var_type_feedback); \ 
  201    auto feedback_vector = LoadFeedbackVectorFromBaseline();                \ 
  202    UpdateFeedback(var_type_feedback.value(), feedback_vector, slot);       \ 
  205    BIND(&if_exception);                                                    \ 
  207      feedback_vector = LoadFeedbackVectorFromBaseline();                   \ 
  208      UpdateFeedback(var_type_feedback.value(), feedback_vector, slot);     \ 
  209      CallRuntime(Runtime::kReThrow, LoadContextFromBaseline(),             \ 
  210                  var_exception.value());                                   \ 
  221  auto lhs = Parameter<Object>(Descriptor::kLeft);
 
  222  auto rhs = Parameter<Object>(Descriptor::kRight);
 
  223  auto context = Parameter<Context>(Descriptor::kContext);
 
  224  auto feedback_vector = Parameter<FeedbackVector>(Descriptor::kFeedbackVector);
 
  225  auto slot = UncheckedParameter<UintPtrT>(Descriptor::kSlot);
 
  229  Label if_exception(
this, Label::kDeferred);
 
  233    result = Equal(lhs, rhs, [&]() { 
return context; }, &var_type_feedback);
 
  235  UpdateFeedback(var_type_feedback.value(), feedback_vector, slot);
 
  239  UpdateFeedback(var_type_feedback.value(), feedback_vector, slot);
 
  240  CallRuntime(Runtime::kReThrow, LoadContextFromBaseline(),
 
  241              var_exception.value());
 
 
  246  auto lhs = Parameter<Object>(Descriptor::kLeft);
 
  247  auto rhs = Parameter<Object>(Descriptor::kRight);
 
  248  auto feedback_vector = Parameter<FeedbackVector>(Descriptor::kFeedbackVector);
 
  249  auto slot = UncheckedParameter<UintPtrT>(Descriptor::kSlot);
 
  253  UpdateFeedback(var_type_feedback.value(), feedback_vector, slot);
 
 
  259  auto lhs = Parameter<Object>(Descriptor::kLeft);
 
  260  auto rhs = Parameter<Object>(Descriptor::kRight);
 
  261  auto slot = UncheckedParameter<UintPtrT>(Descriptor::kSlot);
 
  265  Label if_exception(
this, Label::kDeferred);
 
  270        lhs, rhs, [&]() { 
return LoadContextFromBaseline(); },
 
  273  auto feedback_vector = LoadFeedbackVectorFromBaseline();
 
  274  UpdateFeedback(var_type_feedback.value(), feedback_vector, slot);
 
  279    feedback_vector = LoadFeedbackVectorFromBaseline();
 
  280    UpdateFeedback(var_type_feedback.value(), feedback_vector, slot);
 
  281    CallRuntime(Runtime::kReThrow, LoadContextFromBaseline(),
 
  282                var_exception.value());
 
 
  288  auto lhs = Parameter<Object>(Descriptor::kLeft);
 
  289  auto rhs = Parameter<Object>(Descriptor::kRight);
 
  290  auto slot = UncheckedParameter<UintPtrT>(Descriptor::kSlot);
 
  294  auto feedback_vector = LoadFeedbackVectorFromBaseline();
 
  295  UpdateFeedback(var_type_feedback.value(), feedback_vector, slot);
 
 
#define DEF_BINOP_RHS_SMI(Name, Generator)
#define DEF_UNOP(Name, Generator)
#define DEF_COMPARE(Name)
#define DEF_BINOP(Name, Generator)
#define TF_BUILTIN(Name, AssemblerBase)
ZoneVector< RpoNumber > & result