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