• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 }  // namespace compiler
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_BitwiseOrWithFeedback(TNode<Context> context,TNode<Object> left,TNode<Object> right,TNode<UintPtrT> slot,TNode<HeapObject> maybe_feedback_vector,bool)53   TNode<Object> Generate_BitwiseOrWithFeedback(
54       TNode<Context> context, TNode<Object> left, TNode<Object> right,
55       TNode<UintPtrT> slot, TNode<HeapObject> maybe_feedback_vector,
56       bool /* unused */) {
57     TVARIABLE(Smi, feedback);
58     TNode<Object> result = Generate_BitwiseBinaryOpWithFeedback(
59         Operation::kBitwiseOr, left, right, context, &feedback);
60     UpdateFeedback(feedback.value(), maybe_feedback_vector, slot);
61     return result;
62   }
63 
Generate_BitwiseXorWithFeedback(TNode<Context> context,TNode<Object> left,TNode<Object> right,TNode<UintPtrT> slot,TNode<HeapObject> maybe_feedback_vector,bool)64   TNode<Object> Generate_BitwiseXorWithFeedback(
65       TNode<Context> context, TNode<Object> left, TNode<Object> right,
66       TNode<UintPtrT> slot, TNode<HeapObject> maybe_feedback_vector,
67       bool /* unused */) {
68     TVARIABLE(Smi, feedback);
69     TNode<Object> result = Generate_BitwiseBinaryOpWithFeedback(
70         Operation::kBitwiseXor, left, right, context, &feedback);
71     UpdateFeedback(feedback.value(), maybe_feedback_vector, slot);
72     return result;
73   }
74 
Generate_BitwiseAndWithFeedback(TNode<Context> context,TNode<Object> left,TNode<Object> right,TNode<UintPtrT> slot,TNode<HeapObject> maybe_feedback_vector,bool)75   TNode<Object> Generate_BitwiseAndWithFeedback(
76       TNode<Context> context, TNode<Object> left, TNode<Object> right,
77       TNode<UintPtrT> slot, TNode<HeapObject> maybe_feedback_vector,
78       bool /* unused */) {
79     TVARIABLE(Smi, feedback);
80     TNode<Object> result = Generate_BitwiseBinaryOpWithFeedback(
81         Operation::kBitwiseAnd, left, right, context, &feedback);
82     UpdateFeedback(feedback.value(), maybe_feedback_vector, slot);
83     return result;
84   }
85 
Generate_ShiftLeftWithFeedback(TNode<Context> context,TNode<Object> left,TNode<Object> right,TNode<UintPtrT> slot,TNode<HeapObject> maybe_feedback_vector,bool)86   TNode<Object> Generate_ShiftLeftWithFeedback(
87       TNode<Context> context, TNode<Object> left, TNode<Object> right,
88       TNode<UintPtrT> slot, TNode<HeapObject> maybe_feedback_vector,
89       bool /* unused */) {
90     TVARIABLE(Smi, feedback);
91     TNode<Object> result = Generate_BitwiseBinaryOpWithFeedback(
92         Operation::kShiftLeft, left, right, context, &feedback);
93     UpdateFeedback(feedback.value(), maybe_feedback_vector, slot);
94     return result;
95   }
96 
Generate_ShiftRightWithFeedback(TNode<Context> context,TNode<Object> left,TNode<Object> right,TNode<UintPtrT> slot,TNode<HeapObject> maybe_feedback_vector,bool)97   TNode<Object> Generate_ShiftRightWithFeedback(
98       TNode<Context> context, TNode<Object> left, TNode<Object> right,
99       TNode<UintPtrT> slot, TNode<HeapObject> maybe_feedback_vector,
100       bool /* unused */) {
101     TVARIABLE(Smi, feedback);
102     TNode<Object> result = Generate_BitwiseBinaryOpWithFeedback(
103         Operation::kShiftRight, left, right, context, &feedback);
104     UpdateFeedback(feedback.value(), maybe_feedback_vector, slot);
105     return result;
106   }
107 
Generate_ShiftRightLogicalWithFeedback(TNode<Context> context,TNode<Object> left,TNode<Object> right,TNode<UintPtrT> slot,TNode<HeapObject> maybe_feedback_vector,bool)108   TNode<Object> Generate_ShiftRightLogicalWithFeedback(
109       TNode<Context> context, TNode<Object> left, TNode<Object> right,
110       TNode<UintPtrT> slot, TNode<HeapObject> maybe_feedback_vector,
111       bool /* unused */) {
112     TVARIABLE(Smi, feedback);
113     TNode<Object> result = Generate_BitwiseBinaryOpWithFeedback(
114         Operation::kShiftRightLogical, left, right, context, &feedback);
115     UpdateFeedback(feedback.value(), maybe_feedback_vector, slot);
116     return result;
117   }
118 
Generate_BitwiseBinaryOpWithFeedback(Operation bitwise_op,TNode<Object> left,TNode<Object> right,TNode<Context> context,TVariable<Smi> * feedback)119   TNode<Object> Generate_BitwiseBinaryOpWithFeedback(Operation bitwise_op,
120                                                      TNode<Object> left,
121                                                      TNode<Object> right,
122                                                      TNode<Context> context,
123                                                      TVariable<Smi>* feedback) {
124     return Generate_BitwiseBinaryOpWithOptionalFeedback(bitwise_op, left, right,
125                                                         context, feedback);
126   }
127 
Generate_BitwiseBinaryOp(Operation bitwise_op,TNode<Object> left,TNode<Object> right,TNode<Context> context)128   TNode<Object> Generate_BitwiseBinaryOp(Operation bitwise_op,
129                                          TNode<Object> left,
130                                          TNode<Object> right,
131                                          TNode<Context> context) {
132     return Generate_BitwiseBinaryOpWithOptionalFeedback(bitwise_op, left, right,
133                                                         context, nullptr);
134   }
135 
136  private:
137   using SmiOperation =
138       std::function<TNode<Object>(TNode<Smi>, TNode<Smi>, TVariable<Smi>*)>;
139   using FloatOperation =
140       std::function<TNode<Float64T>(TNode<Float64T>, TNode<Float64T>)>;
141 
142   TNode<Object> Generate_BinaryOperationWithFeedback(
143       TNode<Context> context, TNode<Object> left, TNode<Object> right,
144       TNode<UintPtrT> slot, TNode<HeapObject> maybe_feedback_vector,
145       const SmiOperation& smiOperation, const FloatOperation& floatOperation,
146       Operation op, bool rhs_known_smi);
147 
148   TNode<Object> Generate_BitwiseBinaryOpWithOptionalFeedback(
149       Operation bitwise_op, TNode<Object> left, TNode<Object> right,
150       TNode<Context> context, TVariable<Smi>* feedback);
151 };
152 
153 }  // namespace internal
154 }  // namespace v8
155 
156 #endif  // V8_IC_BINARY_OP_ASSEMBLER_H_
157