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#ifndef V8_IC_BINARY_OP_ASSEMBLER_H_
61cb0ef41Sopenharmony_ci#define V8_IC_BINARY_OP_ASSEMBLER_H_
71cb0ef41Sopenharmony_ci
81cb0ef41Sopenharmony_ci#include <functional>
91cb0ef41Sopenharmony_ci
101cb0ef41Sopenharmony_ci#include "src/codegen/code-stub-assembler.h"
111cb0ef41Sopenharmony_ci
121cb0ef41Sopenharmony_cinamespace v8 {
131cb0ef41Sopenharmony_cinamespace internal {
141cb0ef41Sopenharmony_ci
151cb0ef41Sopenharmony_cinamespace compiler {
161cb0ef41Sopenharmony_ciclass CodeAssemblerState;
171cb0ef41Sopenharmony_ci}  // namespace compiler
181cb0ef41Sopenharmony_ci
191cb0ef41Sopenharmony_ciclass BinaryOpAssembler : public CodeStubAssembler {
201cb0ef41Sopenharmony_ci public:
211cb0ef41Sopenharmony_ci  explicit BinaryOpAssembler(compiler::CodeAssemblerState* state)
221cb0ef41Sopenharmony_ci      : CodeStubAssembler(state) {}
231cb0ef41Sopenharmony_ci
241cb0ef41Sopenharmony_ci  TNode<Object> Generate_AddWithFeedback(
251cb0ef41Sopenharmony_ci      const LazyNode<Context>& context, TNode<Object> left, TNode<Object> right,
261cb0ef41Sopenharmony_ci      TNode<UintPtrT> slot, const LazyNode<HeapObject>& maybe_feedback_vector,
271cb0ef41Sopenharmony_ci      UpdateFeedbackMode update_feedback_mode, bool rhs_known_smi);
281cb0ef41Sopenharmony_ci
291cb0ef41Sopenharmony_ci  TNode<Object> Generate_SubtractWithFeedback(
301cb0ef41Sopenharmony_ci      const LazyNode<Context>& context, TNode<Object> left, TNode<Object> right,
311cb0ef41Sopenharmony_ci      TNode<UintPtrT> slot, const LazyNode<HeapObject>& maybe_feedback_vector,
321cb0ef41Sopenharmony_ci      UpdateFeedbackMode update_feedback_mode, bool rhs_known_smi);
331cb0ef41Sopenharmony_ci
341cb0ef41Sopenharmony_ci  TNode<Object> Generate_MultiplyWithFeedback(
351cb0ef41Sopenharmony_ci      const LazyNode<Context>& context, TNode<Object> left, TNode<Object> right,
361cb0ef41Sopenharmony_ci      TNode<UintPtrT> slot, const LazyNode<HeapObject>& maybe_feedback_vector,
371cb0ef41Sopenharmony_ci      UpdateFeedbackMode update_feedback_mode, bool rhs_known_smi);
381cb0ef41Sopenharmony_ci
391cb0ef41Sopenharmony_ci  TNode<Object> Generate_DivideWithFeedback(
401cb0ef41Sopenharmony_ci      const LazyNode<Context>& context, TNode<Object> dividend,
411cb0ef41Sopenharmony_ci      TNode<Object> divisor, TNode<UintPtrT> slot,
421cb0ef41Sopenharmony_ci      const LazyNode<HeapObject>& maybe_feedback_vector,
431cb0ef41Sopenharmony_ci      UpdateFeedbackMode update_feedback_mode, bool rhs_known_smi);
441cb0ef41Sopenharmony_ci
451cb0ef41Sopenharmony_ci  TNode<Object> Generate_ModulusWithFeedback(
461cb0ef41Sopenharmony_ci      const LazyNode<Context>& context, TNode<Object> dividend,
471cb0ef41Sopenharmony_ci      TNode<Object> divisor, TNode<UintPtrT> slot,
481cb0ef41Sopenharmony_ci      const LazyNode<HeapObject>& maybe_feedback_vector,
491cb0ef41Sopenharmony_ci      UpdateFeedbackMode update_feedback_mode, bool rhs_known_smi);
501cb0ef41Sopenharmony_ci
511cb0ef41Sopenharmony_ci  TNode<Object> Generate_ExponentiateWithFeedback(
521cb0ef41Sopenharmony_ci      const LazyNode<Context>& context, TNode<Object> base,
531cb0ef41Sopenharmony_ci      TNode<Object> exponent, TNode<UintPtrT> slot,
541cb0ef41Sopenharmony_ci      const LazyNode<HeapObject>& maybe_feedback_vector,
551cb0ef41Sopenharmony_ci      UpdateFeedbackMode update_feedback_mode, bool rhs_known_smi);
561cb0ef41Sopenharmony_ci
571cb0ef41Sopenharmony_ci  TNode<Object> Generate_BitwiseOrWithFeedback(
581cb0ef41Sopenharmony_ci      const LazyNode<Context>& context, TNode<Object> left, TNode<Object> right,
591cb0ef41Sopenharmony_ci      TNode<UintPtrT> slot, const LazyNode<HeapObject>& maybe_feedback_vector,
601cb0ef41Sopenharmony_ci      UpdateFeedbackMode update_feedback_mode, bool rhs_known_smi) {
611cb0ef41Sopenharmony_ci    TNode<Object> result = Generate_BitwiseBinaryOpWithFeedback(
621cb0ef41Sopenharmony_ci        Operation::kBitwiseOr, left, right, context, slot,
631cb0ef41Sopenharmony_ci        maybe_feedback_vector, update_feedback_mode, rhs_known_smi);
641cb0ef41Sopenharmony_ci    return result;
651cb0ef41Sopenharmony_ci  }
661cb0ef41Sopenharmony_ci
671cb0ef41Sopenharmony_ci  TNode<Object> Generate_BitwiseXorWithFeedback(
681cb0ef41Sopenharmony_ci      const LazyNode<Context>& context, TNode<Object> left, TNode<Object> right,
691cb0ef41Sopenharmony_ci      TNode<UintPtrT> slot, const LazyNode<HeapObject>& maybe_feedback_vector,
701cb0ef41Sopenharmony_ci      UpdateFeedbackMode update_feedback_mode, bool rhs_known_smi) {
711cb0ef41Sopenharmony_ci    TNode<Object> result = Generate_BitwiseBinaryOpWithFeedback(
721cb0ef41Sopenharmony_ci        Operation::kBitwiseXor, left, right, context, slot,
731cb0ef41Sopenharmony_ci        maybe_feedback_vector, update_feedback_mode, rhs_known_smi);
741cb0ef41Sopenharmony_ci
751cb0ef41Sopenharmony_ci    return result;
761cb0ef41Sopenharmony_ci  }
771cb0ef41Sopenharmony_ci
781cb0ef41Sopenharmony_ci  TNode<Object> Generate_BitwiseAndWithFeedback(
791cb0ef41Sopenharmony_ci      const LazyNode<Context>& context, TNode<Object> left, TNode<Object> right,
801cb0ef41Sopenharmony_ci      TNode<UintPtrT> slot, const LazyNode<HeapObject>& maybe_feedback_vector,
811cb0ef41Sopenharmony_ci      UpdateFeedbackMode update_feedback_mode, bool rhs_known_smi) {
821cb0ef41Sopenharmony_ci    TNode<Object> result = Generate_BitwiseBinaryOpWithFeedback(
831cb0ef41Sopenharmony_ci        Operation::kBitwiseAnd, left, right, context, slot,
841cb0ef41Sopenharmony_ci        maybe_feedback_vector, update_feedback_mode, rhs_known_smi);
851cb0ef41Sopenharmony_ci
861cb0ef41Sopenharmony_ci    return result;
871cb0ef41Sopenharmony_ci  }
881cb0ef41Sopenharmony_ci
891cb0ef41Sopenharmony_ci  TNode<Object> Generate_ShiftLeftWithFeedback(
901cb0ef41Sopenharmony_ci      const LazyNode<Context>& context, TNode<Object> left, TNode<Object> right,
911cb0ef41Sopenharmony_ci      TNode<UintPtrT> slot, const LazyNode<HeapObject>& maybe_feedback_vector,
921cb0ef41Sopenharmony_ci      UpdateFeedbackMode update_feedback_mode, bool rhs_known_smi) {
931cb0ef41Sopenharmony_ci    TNode<Object> result = Generate_BitwiseBinaryOpWithFeedback(
941cb0ef41Sopenharmony_ci        Operation::kShiftLeft, left, right, context, slot,
951cb0ef41Sopenharmony_ci        maybe_feedback_vector, update_feedback_mode, rhs_known_smi);
961cb0ef41Sopenharmony_ci
971cb0ef41Sopenharmony_ci    return result;
981cb0ef41Sopenharmony_ci  }
991cb0ef41Sopenharmony_ci
1001cb0ef41Sopenharmony_ci  TNode<Object> Generate_ShiftRightWithFeedback(
1011cb0ef41Sopenharmony_ci      const LazyNode<Context>& context, TNode<Object> left, TNode<Object> right,
1021cb0ef41Sopenharmony_ci      TNode<UintPtrT> slot, const LazyNode<HeapObject>& maybe_feedback_vector,
1031cb0ef41Sopenharmony_ci      UpdateFeedbackMode update_feedback_mode, bool rhs_known_smi) {
1041cb0ef41Sopenharmony_ci    TNode<Object> result = Generate_BitwiseBinaryOpWithFeedback(
1051cb0ef41Sopenharmony_ci        Operation::kShiftRight, left, right, context, slot,
1061cb0ef41Sopenharmony_ci        maybe_feedback_vector, update_feedback_mode, rhs_known_smi);
1071cb0ef41Sopenharmony_ci
1081cb0ef41Sopenharmony_ci    return result;
1091cb0ef41Sopenharmony_ci  }
1101cb0ef41Sopenharmony_ci
1111cb0ef41Sopenharmony_ci  TNode<Object> Generate_ShiftRightLogicalWithFeedback(
1121cb0ef41Sopenharmony_ci      const LazyNode<Context>& context, TNode<Object> left, TNode<Object> right,
1131cb0ef41Sopenharmony_ci      TNode<UintPtrT> slot, const LazyNode<HeapObject>& maybe_feedback_vector,
1141cb0ef41Sopenharmony_ci      UpdateFeedbackMode update_feedback_mode, bool rhs_known_smi) {
1151cb0ef41Sopenharmony_ci    TNode<Object> result = Generate_BitwiseBinaryOpWithFeedback(
1161cb0ef41Sopenharmony_ci        Operation::kShiftRightLogical, left, right, context, slot,
1171cb0ef41Sopenharmony_ci        maybe_feedback_vector, update_feedback_mode, rhs_known_smi);
1181cb0ef41Sopenharmony_ci
1191cb0ef41Sopenharmony_ci    return result;
1201cb0ef41Sopenharmony_ci  }
1211cb0ef41Sopenharmony_ci
1221cb0ef41Sopenharmony_ci  TNode<Object> Generate_BitwiseBinaryOpWithFeedback(
1231cb0ef41Sopenharmony_ci      Operation bitwise_op, TNode<Object> left, TNode<Object> right,
1241cb0ef41Sopenharmony_ci      const LazyNode<Context>& context, TNode<UintPtrT> slot,
1251cb0ef41Sopenharmony_ci      const LazyNode<HeapObject>& maybe_feedback_vector,
1261cb0ef41Sopenharmony_ci      UpdateFeedbackMode update_feedback_mode, bool rhs_known_smi) {
1271cb0ef41Sopenharmony_ci    return rhs_known_smi
1281cb0ef41Sopenharmony_ci               ? Generate_BitwiseBinaryOpWithSmiOperandAndOptionalFeedback(
1291cb0ef41Sopenharmony_ci                     bitwise_op, left, right, context, &slot,
1301cb0ef41Sopenharmony_ci                     &maybe_feedback_vector, update_feedback_mode)
1311cb0ef41Sopenharmony_ci               : Generate_BitwiseBinaryOpWithOptionalFeedback(
1321cb0ef41Sopenharmony_ci                     bitwise_op, left, right, context, &slot,
1331cb0ef41Sopenharmony_ci                     &maybe_feedback_vector, update_feedback_mode);
1341cb0ef41Sopenharmony_ci  }
1351cb0ef41Sopenharmony_ci
1361cb0ef41Sopenharmony_ci  TNode<Object> Generate_BitwiseBinaryOp(Operation bitwise_op,
1371cb0ef41Sopenharmony_ci                                         TNode<Object> left,
1381cb0ef41Sopenharmony_ci                                         TNode<Object> right,
1391cb0ef41Sopenharmony_ci                                         TNode<Context> context) {
1401cb0ef41Sopenharmony_ci    return Generate_BitwiseBinaryOpWithOptionalFeedback(
1411cb0ef41Sopenharmony_ci        bitwise_op, left, right, [&] { return context; }, nullptr, nullptr,
1421cb0ef41Sopenharmony_ci        UpdateFeedbackMode::kOptionalFeedback);
1431cb0ef41Sopenharmony_ci  }
1441cb0ef41Sopenharmony_ci
1451cb0ef41Sopenharmony_ci private:
1461cb0ef41Sopenharmony_ci  using SmiOperation =
1471cb0ef41Sopenharmony_ci      std::function<TNode<Object>(TNode<Smi>, TNode<Smi>, TVariable<Smi>*)>;
1481cb0ef41Sopenharmony_ci  using FloatOperation =
1491cb0ef41Sopenharmony_ci      std::function<TNode<Float64T>(TNode<Float64T>, TNode<Float64T>)>;
1501cb0ef41Sopenharmony_ci
1511cb0ef41Sopenharmony_ci  TNode<Object> Generate_BinaryOperationWithFeedback(
1521cb0ef41Sopenharmony_ci      const LazyNode<Context>& context, TNode<Object> left, TNode<Object> right,
1531cb0ef41Sopenharmony_ci      TNode<UintPtrT> slot, const LazyNode<HeapObject>& maybe_feedback_vector,
1541cb0ef41Sopenharmony_ci      const SmiOperation& smiOperation, const FloatOperation& floatOperation,
1551cb0ef41Sopenharmony_ci      Operation op, UpdateFeedbackMode update_feedback_mode,
1561cb0ef41Sopenharmony_ci      bool rhs_known_smi);
1571cb0ef41Sopenharmony_ci
1581cb0ef41Sopenharmony_ci  TNode<Object> Generate_BitwiseBinaryOpWithOptionalFeedback(
1591cb0ef41Sopenharmony_ci      Operation bitwise_op, TNode<Object> left, TNode<Object> right,
1601cb0ef41Sopenharmony_ci      const LazyNode<Context>& context, TNode<UintPtrT>* slot,
1611cb0ef41Sopenharmony_ci      const LazyNode<HeapObject>* maybe_feedback_vector,
1621cb0ef41Sopenharmony_ci      UpdateFeedbackMode update_feedback_mode);
1631cb0ef41Sopenharmony_ci
1641cb0ef41Sopenharmony_ci  TNode<Object> Generate_BitwiseBinaryOpWithSmiOperandAndOptionalFeedback(
1651cb0ef41Sopenharmony_ci      Operation bitwise_op, TNode<Object> left, TNode<Object> right,
1661cb0ef41Sopenharmony_ci      const LazyNode<Context>& context, TNode<UintPtrT>* slot,
1671cb0ef41Sopenharmony_ci      const LazyNode<HeapObject>* maybe_feedback_vector,
1681cb0ef41Sopenharmony_ci      UpdateFeedbackMode update_feedback_mode);
1691cb0ef41Sopenharmony_ci
1701cb0ef41Sopenharmony_ci  // Check if output is known to be Smi when both operands of bitwise operation
1711cb0ef41Sopenharmony_ci  // are Smi.
1721cb0ef41Sopenharmony_ci  bool IsBitwiseOutputKnownSmi(Operation bitwise_op) {
1731cb0ef41Sopenharmony_ci    switch (bitwise_op) {
1741cb0ef41Sopenharmony_ci      case Operation::kBitwiseAnd:
1751cb0ef41Sopenharmony_ci      case Operation::kBitwiseOr:
1761cb0ef41Sopenharmony_ci      case Operation::kBitwiseXor:
1771cb0ef41Sopenharmony_ci      case Operation::kShiftRight:
1781cb0ef41Sopenharmony_ci        return true;
1791cb0ef41Sopenharmony_ci      default:
1801cb0ef41Sopenharmony_ci        return false;
1811cb0ef41Sopenharmony_ci    }
1821cb0ef41Sopenharmony_ci  }
1831cb0ef41Sopenharmony_ci};
1841cb0ef41Sopenharmony_ci
1851cb0ef41Sopenharmony_ci}  // namespace internal
1861cb0ef41Sopenharmony_ci}  // namespace v8
1871cb0ef41Sopenharmony_ci
1881cb0ef41Sopenharmony_ci#endif  // V8_IC_BINARY_OP_ASSEMBLER_H_
189