diff --git a/compiler/intrinsics_inline_ecmascript.inl b/compiler/intrinsics_inline_ecmascript.inl index fe3be255bd32c7de82a3442b2659251b429f7f5d..aedac4ab5590b41c3429a5918ff1bdfb871fa7c0 100644 --- a/compiler/intrinsics_inline_ecmascript.inl +++ b/compiler/intrinsics_inline_ecmascript.inl @@ -37,6 +37,14 @@ case RuntimeInterface::IntrinsicId::INTRINSIC_NOT_EQ_DYN: { ASSERT(types_.size() == 2); return panda::compiler::IrtocInlineCompareNeDyn(intrinsic, types_[0], types_[1]); } +case RuntimeInterface::IntrinsicId::INTRINSIC_STRICT_EQ_DYN: { + ASSERT(types_.size() == 2); + return panda::compiler::IrtocInlineCompareStrictEqDyn(intrinsic, types_[0], types_[1]); +} +case RuntimeInterface::IntrinsicId::INTRINSIC_STRICT_NOT_EQ_DYN: { + ASSERT(types_.size() == 2); + return panda::compiler::IrtocInlineCompareStrictNeDyn(intrinsic, types_[0], types_[1]); +} case RuntimeInterface::IntrinsicId::INTRINSIC_LESS_DYN: { ASSERT(types_.size() == 2); return panda::compiler::IrtocInlineCompareLtDyn(intrinsic, types_[0], types_[1]); diff --git a/compiler/optimizer/ecma_pipeline.cpp b/compiler/optimizer/ecma_pipeline.cpp index 0601a6ad39221771af0928d83ee5eefd7ba05880..e2f9ae6c09ec182a0efb67d04bd0803169d0b23c 100644 --- a/compiler/optimizer/ecma_pipeline.cpp +++ b/compiler/optimizer/ecma_pipeline.cpp @@ -67,6 +67,9 @@ bool EcmaPipeline::RunOptimizations() graph->RunPass(); } graph->RunPass(); + graph->RunPass(); + graph->RunPass(); + graph->RunPass(); graph->RunPass(false); graph->RunPass(OPTIONS.GetCompilerLicmHoistLimit()); graph->RunPass(); diff --git a/irtoc_scripts/interpreter_handlers.irt b/irtoc_scripts/interpreter_handlers.irt index f6e3d50beb0068363a104dc8349247c31ac2fc17..e8b9e6bcf224ab06ae4b3f673e4e117a4dc62765 100644 --- a/irtoc_scripts/interpreter_handlers.irt +++ b/irtoc_scripts/interpreter_handlers.irt @@ -790,6 +790,39 @@ end end end +[:eq, :ne].each do |op| + i_i_macro = :"#{op}2dyn_smi_smi" + i_f_macro = :"#{op}2dyn_smi_double" + f_i_macro = :"#{op}2dyn_double_smi" + f_f_macro = :"#{op}2dyn_double_double" + + i_i_macro_strict = :"#{op}2dyn_smi_smi_strict" + i_f_macro_strict = :"#{op}2dyn_smi_double_strict" + f_i_macro_strict = :"#{op}2dyn_double_smi_strict" + f_f_macro_strict = :"#{op}2dyn_double_double_strict" + + cpp_function(:"IrtocInlineCompareStrict#{op.capitalize}Dyn") do + params type1: 'any', type2: 'any' + return_type 'bool' + variant(i_i_macro_strict) { + condition "type1 == AnyBaseType::ECMASCRIPT_INT_TYPE && type2 == AnyBaseType::ECMASCRIPT_INT_TYPE" + code { Return(send(i_i_macro, type1, type2)) } + } + variant(i_f_macro_strict) { + condition "type1 == AnyBaseType::ECMASCRIPT_INT_TYPE && type2 == AnyBaseType::ECMASCRIPT_DOUBLE_TYPE" + code { Return(send(i_f_macro, type1, type2)) } + } + variant(f_i_macro_strict) { + condition "type1 == AnyBaseType::ECMASCRIPT_DOUBLE_TYPE && type2 == AnyBaseType::ECMASCRIPT_INT_TYPE" + code { Return(send(f_i_macro, type1, type2)) } + } + variant(f_f_macro_strict) { + condition "type1 == AnyBaseType::ECMASCRIPT_DOUBLE_TYPE && type2 == AnyBaseType::ECMASCRIPT_DOUBLE_TYPE" + code { Return(send(f_f_macro, type1, type2)) } + } + end +end + # overlaps with slowpath macro(:handle_ecma_toboolean) do |v| booltoany(any_extractBoolean(v)) diff --git a/tests/compiler/peepholes_ecma_test.cpp b/tests/compiler/peepholes_ecma_test.cpp index 956f754c6c47c66bee4728de9bfd241cb0890650..a49f6a88b5f439b345d23c06f0cf8787296979f7 100644 --- a/tests/compiler/peepholes_ecma_test.cpp +++ b/tests/compiler/peepholes_ecma_test.cpp @@ -277,15 +277,13 @@ TEST_F(PeepholesTest, CompareCastToAnyAndConstTrue) { PARAMETER(0, 0).any(); PARAMETER(1, 1).any(); - CONSTANT(19, 1); BASIC_BLOCK(2, -1) { INST(2, Opcode::CastAnyTypeValue).i32().AnyType(AnyBaseType::ECMASCRIPT_INT_TYPE).Inputs(0); INST(3, Opcode::CastAnyTypeValue).i32().AnyType(AnyBaseType::ECMASCRIPT_INT_TYPE).Inputs(1); INST(4, Opcode::Compare).b().CC(CC_LT).Inputs(2, 3).SrcType(DataType::INT32); - INST(6, Opcode::Compare).b().CC(CC_EQ).Inputs(4, 19).SrcType(DataType::BOOL); - INST(7, Opcode::CastValueToAnyType).any().AnyType(AnyBaseType::ECMASCRIPT_BOOLEAN_TYPE).Inputs(6); + INST(7, Opcode::CastValueToAnyType).any().AnyType(AnyBaseType::ECMASCRIPT_BOOLEAN_TYPE).Inputs(4); INST(8, Opcode::Return).any().Inputs(7); } }