diff options
Diffstat (limited to 'deps/v8/src/builtins/builtins-number-gen.cc')
-rw-r--r-- | deps/v8/src/builtins/builtins-number-gen.cc | 173 |
1 files changed, 136 insertions, 37 deletions
diff --git a/deps/v8/src/builtins/builtins-number-gen.cc b/deps/v8/src/builtins/builtins-number-gen.cc index 0e57959aad..390552836d 100644 --- a/deps/v8/src/builtins/builtins-number-gen.cc +++ b/deps/v8/src/builtins/builtins-number-gen.cc @@ -14,20 +14,22 @@ namespace internal { // ----------------------------------------------------------------------------- // ES6 section 20.1 Number Objects -#define DEF_BINOP(Name, Generator) \ - TF_BUILTIN(Name, CodeStubAssembler) { \ - auto lhs = Parameter<Object>(Descriptor::kLeft); \ - auto rhs = Parameter<Object>(Descriptor::kRight); \ - auto context = Parameter<Context>(Descriptor::kContext); \ - auto maybe_feedback_vector = \ - Parameter<HeapObject>(Descriptor::kMaybeFeedbackVector); \ - auto slot = UncheckedParameter<UintPtrT>(Descriptor::kSlot); \ - \ - BinaryOpAssembler binop_asm(state()); \ - TNode<Object> result = binop_asm.Generator(context, lhs, rhs, slot, \ - maybe_feedback_vector, false); \ - \ - Return(result); \ +#define DEF_BINOP(Name, Generator) \ + TF_BUILTIN(Name, CodeStubAssembler) { \ + auto lhs = Parameter<Object>(Descriptor::kLeft); \ + auto rhs = Parameter<Object>(Descriptor::kRight); \ + auto context = Parameter<Context>(Descriptor::kContext); \ + auto feedback_vector = \ + Parameter<FeedbackVector>(Descriptor::kFeedbackVector); \ + auto slot = UncheckedParameter<UintPtrT>(Descriptor::kSlot); \ + \ + BinaryOpAssembler binop_asm(state()); \ + TNode<Object> result = \ + binop_asm.Generator([&]() { return context; }, lhs, rhs, slot, \ + [&]() { return feedback_vector; }, \ + UpdateFeedbackMode::kGuaranteedFeedback, false); \ + \ + Return(result); \ } DEF_BINOP(Add_WithFeedback, Generate_AddWithFeedback) DEF_BINOP(Subtract_WithFeedback, Generate_SubtractWithFeedback) @@ -44,19 +46,48 @@ DEF_BINOP(ShiftRightLogical_WithFeedback, Generate_ShiftRightLogicalWithFeedback) #undef DEF_BINOP -#define DEF_UNOP(Name, Generator) \ - TF_BUILTIN(Name, CodeStubAssembler) { \ - auto value = Parameter<Object>(Descriptor::kValue); \ - auto context = Parameter<Context>(Descriptor::kContext); \ - auto maybe_feedback_vector = \ - Parameter<HeapObject>(Descriptor::kMaybeFeedbackVector); \ - auto slot = UncheckedParameter<UintPtrT>(Descriptor::kSlot); \ - \ - UnaryOpAssembler a(state()); \ - TNode<Object> result = \ - a.Generator(context, value, slot, maybe_feedback_vector); \ - \ - Return(result); \ +#define DEF_BINOP(Name, Generator) \ + TF_BUILTIN(Name, CodeStubAssembler) { \ + auto lhs = Parameter<Object>(Descriptor::kLeft); \ + auto rhs = Parameter<Object>(Descriptor::kRight); \ + auto slot = UncheckedParameter<UintPtrT>(Descriptor::kSlot); \ + \ + BinaryOpAssembler binop_asm(state()); \ + TNode<Object> result = binop_asm.Generator( \ + [&]() { return LoadContextFromBaseline(); }, lhs, rhs, slot, \ + [&]() { return LoadFeedbackVectorFromBaseline(); }, \ + UpdateFeedbackMode::kGuaranteedFeedback, false); \ + \ + Return(result); \ + } +DEF_BINOP(Add_Baseline, Generate_AddWithFeedback) +DEF_BINOP(Subtract_Baseline, Generate_SubtractWithFeedback) +DEF_BINOP(Multiply_Baseline, Generate_MultiplyWithFeedback) +DEF_BINOP(Divide_Baseline, Generate_DivideWithFeedback) +DEF_BINOP(Modulus_Baseline, Generate_ModulusWithFeedback) +DEF_BINOP(Exponentiate_Baseline, Generate_ExponentiateWithFeedback) +DEF_BINOP(BitwiseOr_Baseline, Generate_BitwiseOrWithFeedback) +DEF_BINOP(BitwiseXor_Baseline, Generate_BitwiseXorWithFeedback) +DEF_BINOP(BitwiseAnd_Baseline, Generate_BitwiseAndWithFeedback) +DEF_BINOP(ShiftLeft_Baseline, Generate_ShiftLeftWithFeedback) +DEF_BINOP(ShiftRight_Baseline, Generate_ShiftRightWithFeedback) +DEF_BINOP(ShiftRightLogical_Baseline, Generate_ShiftRightLogicalWithFeedback) +#undef DEF_BINOP + +#define DEF_UNOP(Name, Generator) \ + TF_BUILTIN(Name, CodeStubAssembler) { \ + auto value = Parameter<Object>(Descriptor::kValue); \ + auto context = Parameter<Context>(Descriptor::kContext); \ + auto feedback_vector = \ + Parameter<FeedbackVector>(Descriptor::kFeedbackVector); \ + auto slot = UncheckedParameter<UintPtrT>(Descriptor::kSlot); \ + \ + UnaryOpAssembler a(state()); \ + TNode<Object> result = \ + a.Generator(context, value, slot, feedback_vector, \ + UpdateFeedbackMode::kGuaranteedFeedback); \ + \ + Return(result); \ } DEF_UNOP(BitwiseNot_WithFeedback, Generate_BitwiseNotWithFeedback) DEF_UNOP(Decrement_WithFeedback, Generate_DecrementWithFeedback) @@ -64,19 +95,39 @@ DEF_UNOP(Increment_WithFeedback, Generate_IncrementWithFeedback) DEF_UNOP(Negate_WithFeedback, Generate_NegateWithFeedback) #undef DEF_UNOP +#define DEF_UNOP(Name, Generator) \ + TF_BUILTIN(Name, CodeStubAssembler) { \ + auto value = Parameter<Object>(Descriptor::kValue); \ + auto context = LoadContextFromBaseline(); \ + auto feedback_vector = LoadFeedbackVectorFromBaseline(); \ + auto slot = UncheckedParameter<UintPtrT>(Descriptor::kSlot); \ + \ + UnaryOpAssembler a(state()); \ + TNode<Object> result = \ + a.Generator(context, value, slot, feedback_vector, \ + UpdateFeedbackMode::kGuaranteedFeedback); \ + \ + Return(result); \ + } +DEF_UNOP(BitwiseNot_Baseline, Generate_BitwiseNotWithFeedback) +DEF_UNOP(Decrement_Baseline, Generate_DecrementWithFeedback) +DEF_UNOP(Increment_Baseline, Generate_IncrementWithFeedback) +DEF_UNOP(Negate_Baseline, Generate_NegateWithFeedback) +#undef DEF_UNOP + #define DEF_COMPARE(Name) \ TF_BUILTIN(Name##_WithFeedback, CodeStubAssembler) { \ auto lhs = Parameter<Object>(Descriptor::kLeft); \ auto rhs = Parameter<Object>(Descriptor::kRight); \ auto context = Parameter<Context>(Descriptor::kContext); \ - auto maybe_feedback_vector = \ - Parameter<HeapObject>(Descriptor::kMaybeFeedbackVector); \ + auto feedback_vector = \ + Parameter<FeedbackVector>(Descriptor::kFeedbackVector); \ auto slot = UncheckedParameter<UintPtrT>(Descriptor::kSlot); \ \ TVARIABLE(Smi, var_type_feedback); \ TNode<Oddball> result = RelationalComparison(Operation::k##Name, lhs, rhs, \ context, &var_type_feedback); \ - UpdateFeedback(var_type_feedback.value(), maybe_feedback_vector, slot); \ + UpdateFeedback(var_type_feedback.value(), feedback_vector, slot); \ \ Return(result); \ } @@ -86,17 +137,38 @@ DEF_COMPARE(GreaterThan) DEF_COMPARE(GreaterThanOrEqual) #undef DEF_COMPARE +#define DEF_COMPARE(Name) \ + TF_BUILTIN(Name##_Baseline, CodeStubAssembler) { \ + auto lhs = Parameter<Object>(Descriptor::kLeft); \ + auto rhs = Parameter<Object>(Descriptor::kRight); \ + auto slot = UncheckedParameter<UintPtrT>(Descriptor::kSlot); \ + \ + TVARIABLE(Smi, var_type_feedback); \ + TNode<Oddball> result = RelationalComparison( \ + Operation::k##Name, lhs, rhs, \ + [&]() { return LoadContextFromBaseline(); }, &var_type_feedback); \ + auto feedback_vector = LoadFeedbackVectorFromBaseline(); \ + UpdateFeedback(var_type_feedback.value(), feedback_vector, slot); \ + \ + Return(result); \ + } +DEF_COMPARE(LessThan) +DEF_COMPARE(LessThanOrEqual) +DEF_COMPARE(GreaterThan) +DEF_COMPARE(GreaterThanOrEqual) +#undef DEF_COMPARE + TF_BUILTIN(Equal_WithFeedback, CodeStubAssembler) { auto lhs = Parameter<Object>(Descriptor::kLeft); auto rhs = Parameter<Object>(Descriptor::kRight); auto context = Parameter<Context>(Descriptor::kContext); - auto maybe_feedback_vector = - Parameter<HeapObject>(Descriptor::kMaybeFeedbackVector); + auto feedback_vector = Parameter<FeedbackVector>(Descriptor::kFeedbackVector); auto slot = UncheckedParameter<UintPtrT>(Descriptor::kSlot); TVARIABLE(Smi, var_type_feedback); - TNode<Oddball> result = Equal(lhs, rhs, context, &var_type_feedback); - UpdateFeedback(var_type_feedback.value(), maybe_feedback_vector, slot); + TNode<Oddball> result = Equal( + lhs, rhs, [&]() { return context; }, &var_type_feedback); + UpdateFeedback(var_type_feedback.value(), feedback_vector, slot); Return(result); } @@ -104,13 +176,40 @@ TF_BUILTIN(Equal_WithFeedback, CodeStubAssembler) { TF_BUILTIN(StrictEqual_WithFeedback, CodeStubAssembler) { auto lhs = Parameter<Object>(Descriptor::kLeft); auto rhs = Parameter<Object>(Descriptor::kRight); - auto maybe_feedback_vector = - Parameter<HeapObject>(Descriptor::kMaybeFeedbackVector); + auto feedback_vector = Parameter<FeedbackVector>(Descriptor::kFeedbackVector); + auto slot = UncheckedParameter<UintPtrT>(Descriptor::kSlot); + + TVARIABLE(Smi, var_type_feedback); + TNode<Oddball> result = StrictEqual(lhs, rhs, &var_type_feedback); + UpdateFeedback(var_type_feedback.value(), feedback_vector, slot); + + Return(result); +} + +TF_BUILTIN(Equal_Baseline, CodeStubAssembler) { + auto lhs = Parameter<Object>(Descriptor::kLeft); + auto rhs = Parameter<Object>(Descriptor::kRight); + auto slot = UncheckedParameter<UintPtrT>(Descriptor::kSlot); + + TVARIABLE(Smi, var_type_feedback); + TNode<Oddball> result = Equal( + lhs, rhs, [&]() { return LoadContextFromBaseline(); }, + &var_type_feedback); + auto feedback_vector = LoadFeedbackVectorFromBaseline(); + UpdateFeedback(var_type_feedback.value(), feedback_vector, slot); + + Return(result); +} + +TF_BUILTIN(StrictEqual_Baseline, CodeStubAssembler) { + auto lhs = Parameter<Object>(Descriptor::kLeft); + auto rhs = Parameter<Object>(Descriptor::kRight); auto slot = UncheckedParameter<UintPtrT>(Descriptor::kSlot); TVARIABLE(Smi, var_type_feedback); TNode<Oddball> result = StrictEqual(lhs, rhs, &var_type_feedback); - UpdateFeedback(var_type_feedback.value(), maybe_feedback_vector, slot); + auto feedback_vector = LoadFeedbackVectorFromBaseline(); + UpdateFeedback(var_type_feedback.value(), feedback_vector, slot); Return(result); } |