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