1 // Copyright 2017 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef V8_IC_BINARY_OP_ASSEMBLER_H_
6 #define V8_IC_BINARY_OP_ASSEMBLER_H_
7 
8 #include <functional>
9 #include "src/codegen/code-stub-assembler.h"
10 
11 namespace v8 {
12 namespace internal {
13 
14 namespace compiler {
15 class CodeAssemblerState;
16 }
17 
18 class BinaryOpAssembler : public CodeStubAssembler {
19  public:
BinaryOpAssembler(compiler::CodeAssemblerState * state)20   explicit BinaryOpAssembler(compiler::CodeAssemblerState* state)
21       : CodeStubAssembler(state) {}
22 
23   TNode<Object> Generate_AddWithFeedback(
24       TNode<Context> context, TNode<Object> left, TNode<Object> right,
25       TNode<UintPtrT> slot, TNode<HeapObject> maybe_feedback_vector,
26       bool rhs_known_smi);
27 
28   TNode<Object> Generate_SubtractWithFeedback(
29       TNode<Context> context, TNode<Object> left, TNode<Object> right,
30       TNode<UintPtrT> slot, TNode<HeapObject> maybe_feedback_vector,
31       bool rhs_known_smi);
32 
33   TNode<Object> Generate_MultiplyWithFeedback(
34       TNode<Context> context, TNode<Object> left, TNode<Object> right,
35       TNode<UintPtrT> slot, TNode<HeapObject> maybe_feedback_vector,
36       bool rhs_known_smi);
37 
38   TNode<Object> Generate_DivideWithFeedback(
39       TNode<Context> context, TNode<Object> dividend, TNode<Object> divisor,
40       TNode<UintPtrT> slot, TNode<HeapObject> maybe_feedback_vector,
41       bool rhs_known_smi);
42 
43   TNode<Object> Generate_ModulusWithFeedback(
44       TNode<Context> context, TNode<Object> dividend, TNode<Object> divisor,
45       TNode<UintPtrT> slot, TNode<HeapObject> maybe_feedback_vector,
46       bool rhs_known_smi);
47 
48   TNode<Object> Generate_ExponentiateWithFeedback(
49       TNode<Context> context, TNode<Object> base, TNode<Object> exponent,
50       TNode<UintPtrT> slot, TNode<HeapObject> maybe_feedback_vector,
51       bool rhs_known_smi);
52 
Generate_BitwiseBinaryOpWithFeedback(Operation bitwise_op,TNode<Object> left,TNode<Object> right,TNode<Context> context,TVariable<Smi> * feedback)53   TNode<Object> Generate_BitwiseBinaryOpWithFeedback(Operation bitwise_op,
54                                                      TNode<Object> left,
55                                                      TNode<Object> right,
56                                                      TNode<Context> context,
57                                                      TVariable<Smi>* feedback) {
58     return Generate_BitwiseBinaryOpWithOptionalFeedback(bitwise_op, left, right,
59                                                         context, feedback);
60   }
61 
Generate_BitwiseBinaryOp(Operation bitwise_op,TNode<Object> left,TNode<Object> right,TNode<Context> context)62   TNode<Object> Generate_BitwiseBinaryOp(Operation bitwise_op,
63                                          TNode<Object> left,
64                                          TNode<Object> right,
65                                          TNode<Context> context) {
66     return Generate_BitwiseBinaryOpWithOptionalFeedback(bitwise_op, left, right,
67                                                         context, nullptr);
68   }
69 
70  private:
71   using SmiOperation =
72       std::function<TNode<Object>(TNode<Smi>, TNode<Smi>, TVariable<Smi>*)>;
73   using FloatOperation =
74       std::function<TNode<Float64T>(TNode<Float64T>, TNode<Float64T>)>;
75 
76   TNode<Object> Generate_BinaryOperationWithFeedback(
77       TNode<Context> context, TNode<Object> left, TNode<Object> right,
78       TNode<UintPtrT> slot, TNode<HeapObject> maybe_feedback_vector,
79       const SmiOperation& smiOperation, const FloatOperation& floatOperation,
80       Operation op, bool rhs_known_smi);
81 
82   TNode<Object> Generate_BitwiseBinaryOpWithOptionalFeedback(
83       Operation bitwise_op, TNode<Object> left, TNode<Object> right,
84       TNode<Context> context, TVariable<Smi>* feedback);
85 };
86 
87 }  // namespace internal
88 }  // namespace v8
89 
90 #endif  // V8_IC_BINARY_OP_ASSEMBLER_H_
91