// Copyright 2017 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "src/builtins/builtins-utils-gen.h"
#include "src/builtins/builtins.h"
#include "src/codegen/code-stub-assembler.h"
#include "src/ic/binary-op-assembler.h"
#include "src/ic/unary-op-assembler.h"

namespace v8 {
namespace internal {

// -----------------------------------------------------------------------------
// ES6 section 20.1 Number Objects

#define DEF_BINOP(Name, Generator)                                            \
  TF_BUILTIN(Name, CodeStubAssembler) {                                       \
    auto lhs = Parameter<Object>(Descriptor::kLeft);                          \
    auto rhs = Parameter<Object>(Descriptor::kRight);                         \
    auto context = Parameter<Context>(Descriptor::kContext);                  \
    auto maybe_feedback_vector =                                              \
        Parameter<HeapObject>(Descriptor::kMaybeFeedbackVector);              \
    auto slot = UncheckedParameter<UintPtrT>(Descriptor::kSlot);              \
                                                                              \
    BinaryOpAssembler binop_asm(state());                                     \
    TNode<Object> result = binop_asm.Generator(context, lhs, rhs, slot,       \
                                               maybe_feedback_vector, false); \
                                                                              \
    Return(result);                                                           \
  }
DEF_BINOP(Add_WithFeedback, Generate_AddWithFeedback)
DEF_BINOP(Subtract_WithFeedback, Generate_SubtractWithFeedback)
DEF_BINOP(Multiply_WithFeedback, Generate_MultiplyWithFeedback)
DEF_BINOP(Divide_WithFeedback, Generate_DivideWithFeedback)
DEF_BINOP(Modulus_WithFeedback, Generate_ModulusWithFeedback)
DEF_BINOP(Exponentiate_WithFeedback, Generate_ExponentiateWithFeedback)
DEF_BINOP(BitwiseOr_WithFeedback, Generate_BitwiseOrWithFeedback)
DEF_BINOP(BitwiseXor_WithFeedback, Generate_BitwiseXorWithFeedback)
DEF_BINOP(BitwiseAnd_WithFeedback, Generate_BitwiseAndWithFeedback)
DEF_BINOP(ShiftLeft_WithFeedback, Generate_ShiftLeftWithFeedback)
DEF_BINOP(ShiftRight_WithFeedback, Generate_ShiftRightWithFeedback)
DEF_BINOP(ShiftRightLogical_WithFeedback,
          Generate_ShiftRightLogicalWithFeedback)
#undef DEF_BINOP

#define DEF_UNOP(Name, Generator)                                 \
  TF_BUILTIN(Name, CodeStubAssembler) {                           \
    auto value = Parameter<Object>(Descriptor::kValue);           \
    auto context = Parameter<Context>(Descriptor::kContext);      \
    auto maybe_feedback_vector =                                  \
        Parameter<HeapObject>(Descriptor::kMaybeFeedbackVector);  \
    auto slot = UncheckedParameter<UintPtrT>(Descriptor::kSlot);  \
                                                                  \
    UnaryOpAssembler a(state());                                  \
    TNode<Object> result =                                        \
        a.Generator(context, value, slot, maybe_feedback_vector); \
                                                                  \
    Return(result);                                               \
  }
DEF_UNOP(BitwiseNot_WithFeedback, Generate_BitwiseNotWithFeedback)
DEF_UNOP(Decrement_WithFeedback, Generate_DecrementWithFeedback)
DEF_UNOP(Increment_WithFeedback, Generate_IncrementWithFeedback)
DEF_UNOP(Negate_WithFeedback, Generate_NegateWithFeedback)
#undef DEF_UNOP

#define DEF_COMPARE(Name)                                                      \
  TF_BUILTIN(Name##_WithFeedback, CodeStubAssembler) {                         \
    auto lhs = Parameter<Object>(Descriptor::kLeft);                           \
    auto rhs = Parameter<Object>(Descriptor::kRight);                          \
    auto context = Parameter<Context>(Descriptor::kContext);                   \
    auto maybe_feedback_vector =                                               \
        Parameter<HeapObject>(Descriptor::kMaybeFeedbackVector);               \
    auto slot = UncheckedParameter<UintPtrT>(Descriptor::kSlot);               \
                                                                               \
    TVARIABLE(Smi, var_type_feedback);                                         \
    TNode<Oddball> result = RelationalComparison(Operation::k##Name, lhs, rhs, \
                                                 context, &var_type_feedback); \
    UpdateFeedback(var_type_feedback.value(), maybe_feedback_vector, slot);    \
                                                                               \
    Return(result);                                                            \
  }
DEF_COMPARE(LessThan)
DEF_COMPARE(LessThanOrEqual)
DEF_COMPARE(GreaterThan)
DEF_COMPARE(GreaterThanOrEqual)
#undef DEF_COMPARE

TF_BUILTIN(Equal_WithFeedback, CodeStubAssembler) {
  auto lhs = Parameter<Object>(Descriptor::kLeft);
  auto rhs = Parameter<Object>(Descriptor::kRight);
  auto context = Parameter<Context>(Descriptor::kContext);
  auto maybe_feedback_vector =
      Parameter<HeapObject>(Descriptor::kMaybeFeedbackVector);
  auto slot = UncheckedParameter<UintPtrT>(Descriptor::kSlot);

  TVARIABLE(Smi, var_type_feedback);
  TNode<Oddball> result = Equal(lhs, rhs, context, &var_type_feedback);
  UpdateFeedback(var_type_feedback.value(), maybe_feedback_vector, slot);

  Return(result);
}

TF_BUILTIN(StrictEqual_WithFeedback, CodeStubAssembler) {
  auto lhs = Parameter<Object>(Descriptor::kLeft);
  auto rhs = Parameter<Object>(Descriptor::kRight);
  auto maybe_feedback_vector =
      Parameter<HeapObject>(Descriptor::kMaybeFeedbackVector);
  auto slot = UncheckedParameter<UintPtrT>(Descriptor::kSlot);

  TVARIABLE(Smi, var_type_feedback);
  TNode<Oddball> result = StrictEqual(lhs, rhs, &var_type_feedback);
  UpdateFeedback(var_type_feedback.value(), maybe_feedback_vector, slot);

  Return(result);
}

}  // namespace internal
}  // namespace v8
