19#define DEF_BINOP(Name, Generator) \
20 TF_BUILTIN(Name, CodeStubAssembler) { \
21 auto lhs = Parameter<Object>(Descriptor::kLeft); \
22 auto rhs = Parameter<Object>(Descriptor::kRight); \
23 auto context = Parameter<Context>(Descriptor::kContext); \
24 auto feedback_vector = \
25 Parameter<FeedbackVector>(Descriptor::kFeedbackVector); \
26 auto slot = UncheckedParameter<UintPtrT>(Descriptor::kSlot); \
28 BinaryOpAssembler binop_asm(state()); \
29 TNode<Object> result = \
30 binop_asm.Generator([&]() { return context; }, lhs, rhs, slot, \
31 [&]() { return feedback_vector; }, \
32 UpdateFeedbackMode::kGuaranteedFeedback, false); \
36DEF_BINOP(Add_WithFeedback, Generate_AddWithFeedback)
37DEF_BINOP(Subtract_WithFeedback, Generate_SubtractWithFeedback)
38DEF_BINOP(Multiply_WithFeedback, Generate_MultiplyWithFeedback)
39DEF_BINOP(Divide_WithFeedback, Generate_DivideWithFeedback)
40DEF_BINOP(Modulus_WithFeedback, Generate_ModulusWithFeedback)
41DEF_BINOP(Exponentiate_WithFeedback, Generate_ExponentiateWithFeedback)
42DEF_BINOP(BitwiseOr_WithFeedback, Generate_BitwiseOrWithFeedback)
43DEF_BINOP(BitwiseXor_WithFeedback, Generate_BitwiseXorWithFeedback)
44DEF_BINOP(BitwiseAnd_WithFeedback, Generate_BitwiseAndWithFeedback)
45DEF_BINOP(ShiftLeft_WithFeedback, Generate_ShiftLeftWithFeedback)
46DEF_BINOP(ShiftRight_WithFeedback, Generate_ShiftRightWithFeedback)
48 Generate_ShiftRightLogicalWithFeedback)
51#define DEF_BINOP(Name, Generator) \
52 TF_BUILTIN(Name, CodeStubAssembler) { \
53 auto lhs = Parameter<Object>(Descriptor::kLeft); \
54 auto rhs = Parameter<Object>(Descriptor::kRight); \
55 auto slot = UncheckedParameter<UintPtrT>(Descriptor::kSlot); \
57 BinaryOpAssembler binop_asm(state()); \
58 TNode<Object> result = binop_asm.Generator( \
59 [&]() { return LoadContextFromBaseline(); }, lhs, rhs, slot, \
60 [&]() { return LoadFeedbackVectorFromBaseline(); }, \
61 UpdateFeedbackMode::kGuaranteedFeedback, false); \
65DEF_BINOP(Add_Baseline, Generate_AddWithFeedback)
66DEF_BINOP(Subtract_Baseline, Generate_SubtractWithFeedback)
67DEF_BINOP(Multiply_Baseline, Generate_MultiplyWithFeedback)
68DEF_BINOP(Divide_Baseline, Generate_DivideWithFeedback)
69DEF_BINOP(Modulus_Baseline, Generate_ModulusWithFeedback)
70DEF_BINOP(Exponentiate_Baseline, Generate_ExponentiateWithFeedback)
71DEF_BINOP(BitwiseOr_Baseline, Generate_BitwiseOrWithFeedback)
72DEF_BINOP(BitwiseXor_Baseline, Generate_BitwiseXorWithFeedback)
73DEF_BINOP(BitwiseAnd_Baseline, Generate_BitwiseAndWithFeedback)
74DEF_BINOP(ShiftLeft_Baseline, Generate_ShiftLeftWithFeedback)
75DEF_BINOP(ShiftRight_Baseline, Generate_ShiftRightWithFeedback)
76DEF_BINOP(ShiftRightLogical_Baseline, Generate_ShiftRightLogicalWithFeedback)
79#define DEF_BINOP_RHS_SMI(Name, Generator) \
80 TF_BUILTIN(Name, CodeStubAssembler) { \
81 auto lhs = Parameter<Object>(Descriptor::kLeft); \
82 auto rhs = Parameter<Object>(Descriptor::kRight); \
83 auto slot = UncheckedParameter<UintPtrT>(Descriptor::kSlot); \
85 BinaryOpAssembler binop_asm(state()); \
86 TNode<Object> result = binop_asm.Generator( \
87 [&]() { return LoadContextFromBaseline(); }, lhs, rhs, slot, \
88 [&]() { return LoadFeedbackVectorFromBaseline(); }, \
89 UpdateFeedbackMode::kGuaranteedFeedback, true); \
105 Generate_ShiftRightLogicalWithFeedback)
106#undef DEF_BINOP_RHS_SMI
108#define DEF_UNOP(Name, Generator) \
109 TF_BUILTIN(Name, CodeStubAssembler) { \
110 auto value = Parameter<Object>(Descriptor::kValue); \
111 auto context = Parameter<Context>(Descriptor::kContext); \
112 auto feedback_vector = \
113 Parameter<FeedbackVector>(Descriptor::kFeedbackVector); \
114 auto slot = UncheckedParameter<UintPtrT>(Descriptor::kSlot); \
116 UnaryOpAssembler a(state()); \
117 TNode<Object> result = \
118 a.Generator(context, value, slot, feedback_vector, \
119 UpdateFeedbackMode::kGuaranteedFeedback); \
123#ifndef V8_ENABLE_EXPERIMENTAL_TSA_BUILTINS
124DEF_UNOP(BitwiseNot_WithFeedback, Generate_BitwiseNotWithFeedback)
126DEF_UNOP(Decrement_WithFeedback, Generate_DecrementWithFeedback)
127DEF_UNOP(Increment_WithFeedback, Generate_IncrementWithFeedback)
128DEF_UNOP(Negate_WithFeedback, Generate_NegateWithFeedback)
131#define DEF_UNOP(Name, Generator) \
132 TF_BUILTIN(Name, CodeStubAssembler) { \
133 auto value = Parameter<Object>(Descriptor::kValue); \
134 auto context = LoadContextFromBaseline(); \
135 auto feedback_vector = LoadFeedbackVectorFromBaseline(); \
136 auto slot = UncheckedParameter<UintPtrT>(Descriptor::kSlot); \
138 UnaryOpAssembler a(state()); \
139 TNode<Object> result = \
140 a.Generator(context, value, slot, feedback_vector, \
141 UpdateFeedbackMode::kGuaranteedFeedback); \
145DEF_UNOP(BitwiseNot_Baseline, Generate_BitwiseNotWithFeedback)
146DEF_UNOP(Decrement_Baseline, Generate_DecrementWithFeedback)
147DEF_UNOP(Increment_Baseline, Generate_IncrementWithFeedback)
148DEF_UNOP(Negate_Baseline, Generate_NegateWithFeedback)
151#define DEF_COMPARE(Name) \
152 TF_BUILTIN(Name##_WithFeedback, CodeStubAssembler) { \
153 auto lhs = Parameter<Object>(Descriptor::kLeft); \
154 auto rhs = Parameter<Object>(Descriptor::kRight); \
155 auto context = Parameter<Context>(Descriptor::kContext); \
156 auto feedback_vector = \
157 Parameter<FeedbackVector>(Descriptor::kFeedbackVector); \
158 auto slot = UncheckedParameter<UintPtrT>(Descriptor::kSlot); \
160 TVARIABLE(Smi, var_type_feedback); \
161 TVARIABLE(Object, var_exception); \
162 Label if_exception(this, Label::kDeferred); \
163 TNode<Boolean> result; \
165 ScopedExceptionHandler handler(this, &if_exception, &var_exception); \
166 result = RelationalComparison(Operation::k##Name, lhs, rhs, context, \
167 &var_type_feedback); \
169 UpdateFeedback(var_type_feedback.value(), feedback_vector, slot); \
172 BIND(&if_exception); \
174 UpdateFeedback(var_type_feedback.value(), feedback_vector, slot); \
175 CallRuntime(Runtime::kReThrow, context, var_exception.value()); \
185#define DEF_COMPARE(Name) \
186 TF_BUILTIN(Name##_Baseline, CodeStubAssembler) { \
187 auto lhs = Parameter<Object>(Descriptor::kLeft); \
188 auto rhs = Parameter<Object>(Descriptor::kRight); \
189 auto slot = UncheckedParameter<UintPtrT>(Descriptor::kSlot); \
191 TVARIABLE(Smi, var_type_feedback); \
192 TVARIABLE(Object, var_exception); \
193 Label if_exception(this, Label::kDeferred); \
194 TNode<Boolean> result; \
196 ScopedExceptionHandler handler(this, &if_exception, &var_exception); \
197 result = RelationalComparison( \
198 Operation::k##Name, lhs, rhs, \
199 [&]() { return LoadContextFromBaseline(); }, &var_type_feedback); \
201 auto feedback_vector = LoadFeedbackVectorFromBaseline(); \
202 UpdateFeedback(var_type_feedback.value(), feedback_vector, slot); \
205 BIND(&if_exception); \
207 feedback_vector = LoadFeedbackVectorFromBaseline(); \
208 UpdateFeedback(var_type_feedback.value(), feedback_vector, slot); \
209 CallRuntime(Runtime::kReThrow, LoadContextFromBaseline(), \
210 var_exception.value()); \
221 auto lhs = Parameter<Object>(Descriptor::kLeft);
222 auto rhs = Parameter<Object>(Descriptor::kRight);
223 auto context = Parameter<Context>(Descriptor::kContext);
224 auto feedback_vector = Parameter<FeedbackVector>(Descriptor::kFeedbackVector);
225 auto slot = UncheckedParameter<UintPtrT>(Descriptor::kSlot);
229 Label if_exception(
this, Label::kDeferred);
233 result = Equal(lhs, rhs, [&]() {
return context; }, &var_type_feedback);
235 UpdateFeedback(var_type_feedback.value(), feedback_vector, slot);
239 UpdateFeedback(var_type_feedback.value(), feedback_vector, slot);
240 CallRuntime(Runtime::kReThrow, LoadContextFromBaseline(),
241 var_exception.value());
246 auto lhs = Parameter<Object>(Descriptor::kLeft);
247 auto rhs = Parameter<Object>(Descriptor::kRight);
248 auto feedback_vector = Parameter<FeedbackVector>(Descriptor::kFeedbackVector);
249 auto slot = UncheckedParameter<UintPtrT>(Descriptor::kSlot);
253 UpdateFeedback(var_type_feedback.value(), feedback_vector, slot);
259 auto lhs = Parameter<Object>(Descriptor::kLeft);
260 auto rhs = Parameter<Object>(Descriptor::kRight);
261 auto slot = UncheckedParameter<UintPtrT>(Descriptor::kSlot);
265 Label if_exception(
this, Label::kDeferred);
270 lhs, rhs, [&]() {
return LoadContextFromBaseline(); },
273 auto feedback_vector = LoadFeedbackVectorFromBaseline();
274 UpdateFeedback(var_type_feedback.value(), feedback_vector, slot);
279 feedback_vector = LoadFeedbackVectorFromBaseline();
280 UpdateFeedback(var_type_feedback.value(), feedback_vector, slot);
281 CallRuntime(Runtime::kReThrow, LoadContextFromBaseline(),
282 var_exception.value());
288 auto lhs = Parameter<Object>(Descriptor::kLeft);
289 auto rhs = Parameter<Object>(Descriptor::kRight);
290 auto slot = UncheckedParameter<UintPtrT>(Descriptor::kSlot);
294 auto feedback_vector = LoadFeedbackVectorFromBaseline();
295 UpdateFeedback(var_type_feedback.value(), feedback_vector, slot);
#define DEF_BINOP_RHS_SMI(Name, Generator)
#define DEF_UNOP(Name, Generator)
#define DEF_COMPARE(Name)
#define DEF_BINOP(Name, Generator)
#define TF_BUILTIN(Name, AssemblerBase)
ZoneVector< RpoNumber > & result