11cb0ef41Sopenharmony_ci// Copyright 2017 the V8 project authors. All rights reserved. 21cb0ef41Sopenharmony_ci// Use of this source code is governed by a BSD-style license that can be 31cb0ef41Sopenharmony_ci// found in the LICENSE file. 41cb0ef41Sopenharmony_ci 51cb0ef41Sopenharmony_ci#include "src/builtins/builtins-utils-gen.h" 61cb0ef41Sopenharmony_ci#include "src/builtins/builtins.h" 71cb0ef41Sopenharmony_ci#include "src/codegen/code-stub-assembler.h" 81cb0ef41Sopenharmony_ci#include "src/ic/binary-op-assembler.h" 91cb0ef41Sopenharmony_ci#include "src/ic/unary-op-assembler.h" 101cb0ef41Sopenharmony_ci 111cb0ef41Sopenharmony_cinamespace v8 { 121cb0ef41Sopenharmony_cinamespace internal { 131cb0ef41Sopenharmony_ci 141cb0ef41Sopenharmony_ci// ----------------------------------------------------------------------------- 151cb0ef41Sopenharmony_ci// ES6 section 20.1 Number Objects 161cb0ef41Sopenharmony_ci 171cb0ef41Sopenharmony_ci#define DEF_BINOP(Name, Generator) \ 181cb0ef41Sopenharmony_ci TF_BUILTIN(Name, CodeStubAssembler) { \ 191cb0ef41Sopenharmony_ci auto lhs = Parameter<Object>(Descriptor::kLeft); \ 201cb0ef41Sopenharmony_ci auto rhs = Parameter<Object>(Descriptor::kRight); \ 211cb0ef41Sopenharmony_ci auto context = Parameter<Context>(Descriptor::kContext); \ 221cb0ef41Sopenharmony_ci auto feedback_vector = \ 231cb0ef41Sopenharmony_ci Parameter<FeedbackVector>(Descriptor::kFeedbackVector); \ 241cb0ef41Sopenharmony_ci auto slot = UncheckedParameter<UintPtrT>(Descriptor::kSlot); \ 251cb0ef41Sopenharmony_ci \ 261cb0ef41Sopenharmony_ci BinaryOpAssembler binop_asm(state()); \ 271cb0ef41Sopenharmony_ci TNode<Object> result = \ 281cb0ef41Sopenharmony_ci binop_asm.Generator([&]() { return context; }, lhs, rhs, slot, \ 291cb0ef41Sopenharmony_ci [&]() { return feedback_vector; }, \ 301cb0ef41Sopenharmony_ci UpdateFeedbackMode::kGuaranteedFeedback, false); \ 311cb0ef41Sopenharmony_ci \ 321cb0ef41Sopenharmony_ci Return(result); \ 331cb0ef41Sopenharmony_ci } 341cb0ef41Sopenharmony_ciDEF_BINOP(Add_WithFeedback, Generate_AddWithFeedback) 351cb0ef41Sopenharmony_ciDEF_BINOP(Subtract_WithFeedback, Generate_SubtractWithFeedback) 361cb0ef41Sopenharmony_ciDEF_BINOP(Multiply_WithFeedback, Generate_MultiplyWithFeedback) 371cb0ef41Sopenharmony_ciDEF_BINOP(Divide_WithFeedback, Generate_DivideWithFeedback) 381cb0ef41Sopenharmony_ciDEF_BINOP(Modulus_WithFeedback, Generate_ModulusWithFeedback) 391cb0ef41Sopenharmony_ciDEF_BINOP(Exponentiate_WithFeedback, Generate_ExponentiateWithFeedback) 401cb0ef41Sopenharmony_ciDEF_BINOP(BitwiseOr_WithFeedback, Generate_BitwiseOrWithFeedback) 411cb0ef41Sopenharmony_ciDEF_BINOP(BitwiseXor_WithFeedback, Generate_BitwiseXorWithFeedback) 421cb0ef41Sopenharmony_ciDEF_BINOP(BitwiseAnd_WithFeedback, Generate_BitwiseAndWithFeedback) 431cb0ef41Sopenharmony_ciDEF_BINOP(ShiftLeft_WithFeedback, Generate_ShiftLeftWithFeedback) 441cb0ef41Sopenharmony_ciDEF_BINOP(ShiftRight_WithFeedback, Generate_ShiftRightWithFeedback) 451cb0ef41Sopenharmony_ciDEF_BINOP(ShiftRightLogical_WithFeedback, 461cb0ef41Sopenharmony_ci Generate_ShiftRightLogicalWithFeedback) 471cb0ef41Sopenharmony_ci#undef DEF_BINOP 481cb0ef41Sopenharmony_ci 491cb0ef41Sopenharmony_ci#define DEF_BINOP(Name, Generator) \ 501cb0ef41Sopenharmony_ci TF_BUILTIN(Name, CodeStubAssembler) { \ 511cb0ef41Sopenharmony_ci auto lhs = Parameter<Object>(Descriptor::kLeft); \ 521cb0ef41Sopenharmony_ci auto rhs = Parameter<Object>(Descriptor::kRight); \ 531cb0ef41Sopenharmony_ci auto slot = UncheckedParameter<UintPtrT>(Descriptor::kSlot); \ 541cb0ef41Sopenharmony_ci \ 551cb0ef41Sopenharmony_ci BinaryOpAssembler binop_asm(state()); \ 561cb0ef41Sopenharmony_ci TNode<Object> result = binop_asm.Generator( \ 571cb0ef41Sopenharmony_ci [&]() { return LoadContextFromBaseline(); }, lhs, rhs, slot, \ 581cb0ef41Sopenharmony_ci [&]() { return LoadFeedbackVectorFromBaseline(); }, \ 591cb0ef41Sopenharmony_ci UpdateFeedbackMode::kGuaranteedFeedback, false); \ 601cb0ef41Sopenharmony_ci \ 611cb0ef41Sopenharmony_ci Return(result); \ 621cb0ef41Sopenharmony_ci } 631cb0ef41Sopenharmony_ciDEF_BINOP(Add_Baseline, Generate_AddWithFeedback) 641cb0ef41Sopenharmony_ciDEF_BINOP(Subtract_Baseline, Generate_SubtractWithFeedback) 651cb0ef41Sopenharmony_ciDEF_BINOP(Multiply_Baseline, Generate_MultiplyWithFeedback) 661cb0ef41Sopenharmony_ciDEF_BINOP(Divide_Baseline, Generate_DivideWithFeedback) 671cb0ef41Sopenharmony_ciDEF_BINOP(Modulus_Baseline, Generate_ModulusWithFeedback) 681cb0ef41Sopenharmony_ciDEF_BINOP(Exponentiate_Baseline, Generate_ExponentiateWithFeedback) 691cb0ef41Sopenharmony_ciDEF_BINOP(BitwiseOr_Baseline, Generate_BitwiseOrWithFeedback) 701cb0ef41Sopenharmony_ciDEF_BINOP(BitwiseXor_Baseline, Generate_BitwiseXorWithFeedback) 711cb0ef41Sopenharmony_ciDEF_BINOP(BitwiseAnd_Baseline, Generate_BitwiseAndWithFeedback) 721cb0ef41Sopenharmony_ciDEF_BINOP(ShiftLeft_Baseline, Generate_ShiftLeftWithFeedback) 731cb0ef41Sopenharmony_ciDEF_BINOP(ShiftRight_Baseline, Generate_ShiftRightWithFeedback) 741cb0ef41Sopenharmony_ciDEF_BINOP(ShiftRightLogical_Baseline, Generate_ShiftRightLogicalWithFeedback) 751cb0ef41Sopenharmony_ci#undef DEF_BINOP 761cb0ef41Sopenharmony_ci 771cb0ef41Sopenharmony_ci#define DEF_BINOP_RHS_SMI(Name, Generator) \ 781cb0ef41Sopenharmony_ci TF_BUILTIN(Name, CodeStubAssembler) { \ 791cb0ef41Sopenharmony_ci auto lhs = Parameter<Object>(Descriptor::kLeft); \ 801cb0ef41Sopenharmony_ci auto rhs = Parameter<Object>(Descriptor::kRight); \ 811cb0ef41Sopenharmony_ci auto slot = UncheckedParameter<UintPtrT>(Descriptor::kSlot); \ 821cb0ef41Sopenharmony_ci \ 831cb0ef41Sopenharmony_ci BinaryOpAssembler binop_asm(state()); \ 841cb0ef41Sopenharmony_ci TNode<Object> result = binop_asm.Generator( \ 851cb0ef41Sopenharmony_ci [&]() { return LoadContextFromBaseline(); }, lhs, rhs, slot, \ 861cb0ef41Sopenharmony_ci [&]() { return LoadFeedbackVectorFromBaseline(); }, \ 871cb0ef41Sopenharmony_ci UpdateFeedbackMode::kGuaranteedFeedback, true); \ 881cb0ef41Sopenharmony_ci \ 891cb0ef41Sopenharmony_ci Return(result); \ 901cb0ef41Sopenharmony_ci } 911cb0ef41Sopenharmony_ciDEF_BINOP_RHS_SMI(AddSmi_Baseline, Generate_AddWithFeedback) 921cb0ef41Sopenharmony_ciDEF_BINOP_RHS_SMI(SubtractSmi_Baseline, Generate_SubtractWithFeedback) 931cb0ef41Sopenharmony_ciDEF_BINOP_RHS_SMI(MultiplySmi_Baseline, Generate_MultiplyWithFeedback) 941cb0ef41Sopenharmony_ciDEF_BINOP_RHS_SMI(DivideSmi_Baseline, Generate_DivideWithFeedback) 951cb0ef41Sopenharmony_ciDEF_BINOP_RHS_SMI(ModulusSmi_Baseline, Generate_ModulusWithFeedback) 961cb0ef41Sopenharmony_ciDEF_BINOP_RHS_SMI(ExponentiateSmi_Baseline, Generate_ExponentiateWithFeedback) 971cb0ef41Sopenharmony_ciDEF_BINOP_RHS_SMI(BitwiseOrSmi_Baseline, Generate_BitwiseOrWithFeedback) 981cb0ef41Sopenharmony_ciDEF_BINOP_RHS_SMI(BitwiseXorSmi_Baseline, Generate_BitwiseXorWithFeedback) 991cb0ef41Sopenharmony_ciDEF_BINOP_RHS_SMI(BitwiseAndSmi_Baseline, Generate_BitwiseAndWithFeedback) 1001cb0ef41Sopenharmony_ciDEF_BINOP_RHS_SMI(ShiftLeftSmi_Baseline, Generate_ShiftLeftWithFeedback) 1011cb0ef41Sopenharmony_ciDEF_BINOP_RHS_SMI(ShiftRightSmi_Baseline, Generate_ShiftRightWithFeedback) 1021cb0ef41Sopenharmony_ciDEF_BINOP_RHS_SMI(ShiftRightLogicalSmi_Baseline, 1031cb0ef41Sopenharmony_ci Generate_ShiftRightLogicalWithFeedback) 1041cb0ef41Sopenharmony_ci#undef DEF_BINOP_RHS_SMI 1051cb0ef41Sopenharmony_ci 1061cb0ef41Sopenharmony_ci#define DEF_UNOP(Name, Generator) \ 1071cb0ef41Sopenharmony_ci TF_BUILTIN(Name, CodeStubAssembler) { \ 1081cb0ef41Sopenharmony_ci auto value = Parameter<Object>(Descriptor::kValue); \ 1091cb0ef41Sopenharmony_ci auto context = Parameter<Context>(Descriptor::kContext); \ 1101cb0ef41Sopenharmony_ci auto feedback_vector = \ 1111cb0ef41Sopenharmony_ci Parameter<FeedbackVector>(Descriptor::kFeedbackVector); \ 1121cb0ef41Sopenharmony_ci auto slot = UncheckedParameter<UintPtrT>(Descriptor::kSlot); \ 1131cb0ef41Sopenharmony_ci \ 1141cb0ef41Sopenharmony_ci UnaryOpAssembler a(state()); \ 1151cb0ef41Sopenharmony_ci TNode<Object> result = \ 1161cb0ef41Sopenharmony_ci a.Generator(context, value, slot, feedback_vector, \ 1171cb0ef41Sopenharmony_ci UpdateFeedbackMode::kGuaranteedFeedback); \ 1181cb0ef41Sopenharmony_ci \ 1191cb0ef41Sopenharmony_ci Return(result); \ 1201cb0ef41Sopenharmony_ci } 1211cb0ef41Sopenharmony_ciDEF_UNOP(BitwiseNot_WithFeedback, Generate_BitwiseNotWithFeedback) 1221cb0ef41Sopenharmony_ciDEF_UNOP(Decrement_WithFeedback, Generate_DecrementWithFeedback) 1231cb0ef41Sopenharmony_ciDEF_UNOP(Increment_WithFeedback, Generate_IncrementWithFeedback) 1241cb0ef41Sopenharmony_ciDEF_UNOP(Negate_WithFeedback, Generate_NegateWithFeedback) 1251cb0ef41Sopenharmony_ci#undef DEF_UNOP 1261cb0ef41Sopenharmony_ci 1271cb0ef41Sopenharmony_ci#define DEF_UNOP(Name, Generator) \ 1281cb0ef41Sopenharmony_ci TF_BUILTIN(Name, CodeStubAssembler) { \ 1291cb0ef41Sopenharmony_ci auto value = Parameter<Object>(Descriptor::kValue); \ 1301cb0ef41Sopenharmony_ci auto context = LoadContextFromBaseline(); \ 1311cb0ef41Sopenharmony_ci auto feedback_vector = LoadFeedbackVectorFromBaseline(); \ 1321cb0ef41Sopenharmony_ci auto slot = UncheckedParameter<UintPtrT>(Descriptor::kSlot); \ 1331cb0ef41Sopenharmony_ci \ 1341cb0ef41Sopenharmony_ci UnaryOpAssembler a(state()); \ 1351cb0ef41Sopenharmony_ci TNode<Object> result = \ 1361cb0ef41Sopenharmony_ci a.Generator(context, value, slot, feedback_vector, \ 1371cb0ef41Sopenharmony_ci UpdateFeedbackMode::kGuaranteedFeedback); \ 1381cb0ef41Sopenharmony_ci \ 1391cb0ef41Sopenharmony_ci Return(result); \ 1401cb0ef41Sopenharmony_ci } 1411cb0ef41Sopenharmony_ciDEF_UNOP(BitwiseNot_Baseline, Generate_BitwiseNotWithFeedback) 1421cb0ef41Sopenharmony_ciDEF_UNOP(Decrement_Baseline, Generate_DecrementWithFeedback) 1431cb0ef41Sopenharmony_ciDEF_UNOP(Increment_Baseline, Generate_IncrementWithFeedback) 1441cb0ef41Sopenharmony_ciDEF_UNOP(Negate_Baseline, Generate_NegateWithFeedback) 1451cb0ef41Sopenharmony_ci#undef DEF_UNOP 1461cb0ef41Sopenharmony_ci 1471cb0ef41Sopenharmony_ci#define DEF_COMPARE(Name) \ 1481cb0ef41Sopenharmony_ci TF_BUILTIN(Name##_WithFeedback, CodeStubAssembler) { \ 1491cb0ef41Sopenharmony_ci auto lhs = Parameter<Object>(Descriptor::kLeft); \ 1501cb0ef41Sopenharmony_ci auto rhs = Parameter<Object>(Descriptor::kRight); \ 1511cb0ef41Sopenharmony_ci auto context = Parameter<Context>(Descriptor::kContext); \ 1521cb0ef41Sopenharmony_ci auto feedback_vector = \ 1531cb0ef41Sopenharmony_ci Parameter<FeedbackVector>(Descriptor::kFeedbackVector); \ 1541cb0ef41Sopenharmony_ci auto slot = UncheckedParameter<UintPtrT>(Descriptor::kSlot); \ 1551cb0ef41Sopenharmony_ci \ 1561cb0ef41Sopenharmony_ci TVARIABLE(Smi, var_type_feedback); \ 1571cb0ef41Sopenharmony_ci TNode<Oddball> result = RelationalComparison(Operation::k##Name, lhs, rhs, \ 1581cb0ef41Sopenharmony_ci context, &var_type_feedback); \ 1591cb0ef41Sopenharmony_ci UpdateFeedback(var_type_feedback.value(), feedback_vector, slot); \ 1601cb0ef41Sopenharmony_ci \ 1611cb0ef41Sopenharmony_ci Return(result); \ 1621cb0ef41Sopenharmony_ci } 1631cb0ef41Sopenharmony_ciDEF_COMPARE(LessThan) 1641cb0ef41Sopenharmony_ciDEF_COMPARE(LessThanOrEqual) 1651cb0ef41Sopenharmony_ciDEF_COMPARE(GreaterThan) 1661cb0ef41Sopenharmony_ciDEF_COMPARE(GreaterThanOrEqual) 1671cb0ef41Sopenharmony_ci#undef DEF_COMPARE 1681cb0ef41Sopenharmony_ci 1691cb0ef41Sopenharmony_ci#define DEF_COMPARE(Name) \ 1701cb0ef41Sopenharmony_ci TF_BUILTIN(Name##_Baseline, CodeStubAssembler) { \ 1711cb0ef41Sopenharmony_ci auto lhs = Parameter<Object>(Descriptor::kLeft); \ 1721cb0ef41Sopenharmony_ci auto rhs = Parameter<Object>(Descriptor::kRight); \ 1731cb0ef41Sopenharmony_ci auto slot = UncheckedParameter<UintPtrT>(Descriptor::kSlot); \ 1741cb0ef41Sopenharmony_ci \ 1751cb0ef41Sopenharmony_ci TVARIABLE(Smi, var_type_feedback); \ 1761cb0ef41Sopenharmony_ci TNode<Oddball> result = RelationalComparison( \ 1771cb0ef41Sopenharmony_ci Operation::k##Name, lhs, rhs, \ 1781cb0ef41Sopenharmony_ci [&]() { return LoadContextFromBaseline(); }, &var_type_feedback); \ 1791cb0ef41Sopenharmony_ci auto feedback_vector = LoadFeedbackVectorFromBaseline(); \ 1801cb0ef41Sopenharmony_ci UpdateFeedback(var_type_feedback.value(), feedback_vector, slot); \ 1811cb0ef41Sopenharmony_ci \ 1821cb0ef41Sopenharmony_ci Return(result); \ 1831cb0ef41Sopenharmony_ci } 1841cb0ef41Sopenharmony_ciDEF_COMPARE(LessThan) 1851cb0ef41Sopenharmony_ciDEF_COMPARE(LessThanOrEqual) 1861cb0ef41Sopenharmony_ciDEF_COMPARE(GreaterThan) 1871cb0ef41Sopenharmony_ciDEF_COMPARE(GreaterThanOrEqual) 1881cb0ef41Sopenharmony_ci#undef DEF_COMPARE 1891cb0ef41Sopenharmony_ci 1901cb0ef41Sopenharmony_ciTF_BUILTIN(Equal_WithFeedback, CodeStubAssembler) { 1911cb0ef41Sopenharmony_ci auto lhs = Parameter<Object>(Descriptor::kLeft); 1921cb0ef41Sopenharmony_ci auto rhs = Parameter<Object>(Descriptor::kRight); 1931cb0ef41Sopenharmony_ci auto context = Parameter<Context>(Descriptor::kContext); 1941cb0ef41Sopenharmony_ci auto feedback_vector = Parameter<FeedbackVector>(Descriptor::kFeedbackVector); 1951cb0ef41Sopenharmony_ci auto slot = UncheckedParameter<UintPtrT>(Descriptor::kSlot); 1961cb0ef41Sopenharmony_ci 1971cb0ef41Sopenharmony_ci TVARIABLE(Smi, var_type_feedback); 1981cb0ef41Sopenharmony_ci TNode<Oddball> result = Equal( 1991cb0ef41Sopenharmony_ci lhs, rhs, [&]() { return context; }, &var_type_feedback); 2001cb0ef41Sopenharmony_ci UpdateFeedback(var_type_feedback.value(), feedback_vector, slot); 2011cb0ef41Sopenharmony_ci 2021cb0ef41Sopenharmony_ci Return(result); 2031cb0ef41Sopenharmony_ci} 2041cb0ef41Sopenharmony_ci 2051cb0ef41Sopenharmony_ciTF_BUILTIN(StrictEqual_WithFeedback, CodeStubAssembler) { 2061cb0ef41Sopenharmony_ci auto lhs = Parameter<Object>(Descriptor::kLeft); 2071cb0ef41Sopenharmony_ci auto rhs = Parameter<Object>(Descriptor::kRight); 2081cb0ef41Sopenharmony_ci auto feedback_vector = Parameter<FeedbackVector>(Descriptor::kFeedbackVector); 2091cb0ef41Sopenharmony_ci auto slot = UncheckedParameter<UintPtrT>(Descriptor::kSlot); 2101cb0ef41Sopenharmony_ci 2111cb0ef41Sopenharmony_ci TVARIABLE(Smi, var_type_feedback); 2121cb0ef41Sopenharmony_ci TNode<Oddball> result = StrictEqual(lhs, rhs, &var_type_feedback); 2131cb0ef41Sopenharmony_ci UpdateFeedback(var_type_feedback.value(), feedback_vector, slot); 2141cb0ef41Sopenharmony_ci 2151cb0ef41Sopenharmony_ci Return(result); 2161cb0ef41Sopenharmony_ci} 2171cb0ef41Sopenharmony_ci 2181cb0ef41Sopenharmony_ciTF_BUILTIN(Equal_Baseline, CodeStubAssembler) { 2191cb0ef41Sopenharmony_ci auto lhs = Parameter<Object>(Descriptor::kLeft); 2201cb0ef41Sopenharmony_ci auto rhs = Parameter<Object>(Descriptor::kRight); 2211cb0ef41Sopenharmony_ci auto slot = UncheckedParameter<UintPtrT>(Descriptor::kSlot); 2221cb0ef41Sopenharmony_ci 2231cb0ef41Sopenharmony_ci TVARIABLE(Smi, var_type_feedback); 2241cb0ef41Sopenharmony_ci TNode<Oddball> result = Equal( 2251cb0ef41Sopenharmony_ci lhs, rhs, [&]() { return LoadContextFromBaseline(); }, 2261cb0ef41Sopenharmony_ci &var_type_feedback); 2271cb0ef41Sopenharmony_ci auto feedback_vector = LoadFeedbackVectorFromBaseline(); 2281cb0ef41Sopenharmony_ci UpdateFeedback(var_type_feedback.value(), feedback_vector, slot); 2291cb0ef41Sopenharmony_ci 2301cb0ef41Sopenharmony_ci Return(result); 2311cb0ef41Sopenharmony_ci} 2321cb0ef41Sopenharmony_ci 2331cb0ef41Sopenharmony_ciTF_BUILTIN(StrictEqual_Baseline, CodeStubAssembler) { 2341cb0ef41Sopenharmony_ci auto lhs = Parameter<Object>(Descriptor::kLeft); 2351cb0ef41Sopenharmony_ci auto rhs = Parameter<Object>(Descriptor::kRight); 2361cb0ef41Sopenharmony_ci auto slot = UncheckedParameter<UintPtrT>(Descriptor::kSlot); 2371cb0ef41Sopenharmony_ci 2381cb0ef41Sopenharmony_ci TVARIABLE(Smi, var_type_feedback); 2391cb0ef41Sopenharmony_ci TNode<Oddball> result = StrictEqual(lhs, rhs, &var_type_feedback); 2401cb0ef41Sopenharmony_ci auto feedback_vector = LoadFeedbackVectorFromBaseline(); 2411cb0ef41Sopenharmony_ci UpdateFeedback(var_type_feedback.value(), feedback_vector, slot); 2421cb0ef41Sopenharmony_ci 2431cb0ef41Sopenharmony_ci Return(result); 2441cb0ef41Sopenharmony_ci} 2451cb0ef41Sopenharmony_ci 2461cb0ef41Sopenharmony_ci} // namespace internal 2471cb0ef41Sopenharmony_ci} // namespace v8 248