diff --git a/irtoc_scripts/interpreter_handlers.irt b/irtoc_scripts/interpreter_handlers.irt index 64f7857966208b8187e5ca25f3ca737880cf8fff..f2fa1a3227c6395f5a79eabee81d3a0dee1ebe61 100644 --- a/irtoc_scripts/interpreter_handlers.irt +++ b/irtoc_scripts/interpreter_handlers.irt @@ -17,8 +17,7 @@ include_relative '../../plugins/ecmascript/irtoc_scripts/common.irt' ################## ecma fastpath ##################### macro(:ecma_intrinsic_setacc) do |sym, *args| - res := Call(*args).Method(sym).u64 - set_value(acc_ptr, res).u64 + acc := Call(*args).Method(sym).u64 end macro(:ecma_intrinsic_check_setacc) do |sym, size, *args| @@ -30,6 +29,8 @@ macro(:ecma_intrinsic_check_setacc) do |sym, size, *args| } frame := Phi(frame_eh, frame).ptr pc := Phi(pc_eh, pc_inc).ptr + acc := Phi(acc_eh, acc.u64).u64 + acc_tag := Phi(acc_tag_eh, acc_tag.u64).u64 end macro(:ecma_intrinsic_invoke) do |sym, *args| @@ -65,6 +66,14 @@ macro(:u32toany) do |arg| CastValueToAnyType(u32toi32(arg)).AnyType("AnyBaseType::ECMASCRIPT_INT_TYPE").any end +macro(:i32toany) do |arg| + CastValueToAnyType(arg).AnyType(Constants::DYN_INT_TYPE).any +end + +macro(:f64toany) do |arg| + CastValueToAnyType(arg).AnyType(Constants::DYN_DOUBLE_TYPE).any +end + macro(:anytoboolean) do |arg| CastAnyTypeValue(arg).AnyType("AnyBaseType::ECMASCRIPT_BOOLEAN_TYPE").b end @@ -162,14 +171,38 @@ macro(:any_extractBoolean) do |arg| Phi(arg_i32toboolean, arg_not_i32toboolean).b end +macro(:i8tou32) do |arg| + Cast(arg).SrcType("DataType::INT8").u32 +end + +macro(:i8tou16) do |arg| + Cast(arg).SrcType("DataType::INT8").u16 +end + +macro(:i16tou32) do |arg| + Cast(arg).SrcType("DataType::INT16").u32 +end + macro(:i32toi64) do |arg| Cast(arg).SrcType("DataType::INT32").i64 end +macro(:i32tou32) do |arg| + Cast(arg).SrcType("DataType::INT32").u32 +end + +macro(:u32toi32) do |arg| + Cast(arg).SrcType("DataType::UINT32").i32 +end + macro(:i64toi32) do |arg| Cast(arg).SrcType("DataType::INT64").i32 end +macro(:i64tou32) do |arg| + Cast(arg).SrcType("DataType::INT64").u32 +end + # 32-bit ovf handler # ovf := And(Not(Xor(anytoi32(l.any), anytoi32(r.any)).i32).i32, Xor(anytoi32(l.any), int_sum_i32).i32).i32 # IfImm(AndI(ovf.u32).Imm(1 << 31).u32).Imm(0).CC(:CC_NE) { # i32 ovf @@ -921,7 +954,7 @@ function(:EcmaLdnan, params: {}, mode: [:Interpreter, :DynamicMethod], enable_bu end macro(:handle_ecma_ldconst) do |const| - set_value(acc_ptr, const).any + acc := const end macro(:handle_ecma_getnextpropname) do |iter| @@ -986,7 +1019,7 @@ function(:EcmaGetnextpropname, params: {'a'=>'any'}, mode: [:Interpreter, :Dynam end macro(:handle_ecma_jcconst) do |const, pc, imm32, size| - If(acc_value.u64, const).CC(:CC_EQ).b { + If(acc.u64, const).CC(:CC_EQ).b { pc1 := advance_pc_var(pc, i32tou64(imm32)) } Else { pc2 := advance_pc_imm(pc, size) diff --git a/irtoc_scripts/interpreter_main_loop.irt b/irtoc_scripts/interpreter_main_loop.irt index 4269076778d842dc11895e5ff4a85536da226395..cf912ddacca9d10c9b53b49ab715534ee7ecedf4 100644 --- a/irtoc_scripts/interpreter_main_loop.irt +++ b/irtoc_scripts/interpreter_main_loop.irt @@ -15,97 +15,73 @@ # ecma basic when "ECMA_ADD2DYN_PREF_V8" - res := handle_ecma_add2dyn(vreg_value(op[0]), acc_value) - set_value(acc_ptr, res).any - #ecma_intrinsic_setacc("Add2Dyn", vreg_value(op[0]).u64, acc_value.u64) # slow version + acc := handle_ecma_add2dyn(vreg_value(op[0]), acc) + #ecma_intrinsic_setacc("Add2Dyn", vreg_value(op[0]).u64, acc.u64) # slow version when "ECMA_MOD2DYN_PREF_V8" - res := handle_ecma_mod2dyn(vreg_value(op[0]).any, acc_value.any) - set_value(acc_ptr, res).any + acc := handle_ecma_mod2dyn(vreg_value(op[0]).any, acc.any) when "ECMA_SUB2DYN_PREF_V8" - res := handle_ecma_sub2dyn(vreg_value(op[0]), acc_value) - set_value(acc_ptr, res).any - #ecma_intrinsic_setacc("Sub2Dyn", vreg_value(op[0]).u64, acc_value.u64) + acc := handle_ecma_sub2dyn(vreg_value(op[0]), acc) + #ecma_intrinsic_setacc("Sub2Dyn", vreg_value(op[0]).u64, acc.u64) when "ECMA_MUL2DYN_PREF_V8" - res := handle_ecma_mul2dyn(vreg_value(op[0]), acc_value) - set_value(acc_ptr, res).any - #ecma_intrinsic_setacc("Mul2Dyn", vreg_value(op[0]).u64, acc_value.u64) + acc := handle_ecma_mul2dyn(vreg_value(op[0]), acc) + #ecma_intrinsic_setacc("Mul2Dyn", vreg_value(op[0]).u64, acc.u64) when "ECMA_DIV2DYN_PREF_V8" - res := handle_ecma_div2dyn(vreg_value(op[0]), acc_value) - set_value(acc_ptr, res).any - #ecma_intrinsic_setacc("Mul2Dyn", vreg_value(op[0]).u64, acc_value.u64) + acc := handle_ecma_div2dyn(vreg_value(op[0]), acc) + #ecma_intrinsic_setacc("Mul2Dyn", vreg_value(op[0]).u64, acc.u64) when "ECMA_EXPDYN_PREF_V8" - ecma_intrinsic_setacc("ExpDynSlow", vreg_value(op[0]).u64, acc_value.u64) - #handle_ecma_expdyn(vreg_value(op[0]), acc_value) + ecma_intrinsic_setacc("ExpDynSlow", vreg_value(op[0]).u64, acc.u64) + #handle_ecma_expdyn(vreg_value(op[0]), acc) when "ECMA_AND2DYN_PREF_V8" - res := handle_ecma_and2dyn(vreg_value(op[0]).any, acc_value.any) - set_value(acc_ptr, res).any - #ecma_intrinsic_setacc("And2Dyn", vreg_value(op[0]).u64, acc_value.u64) + acc := handle_ecma_and2dyn(vreg_value(op[0]).any, acc.any) + #ecma_intrinsic_setacc("And2Dyn", vreg_value(op[0]).u64, acc.u64) when "ECMA_OR2DYN_PREF_V8" - res := handle_ecma_or2dyn(vreg_value(op[0]), acc_value) - set_value(acc_ptr, res).any + acc := handle_ecma_or2dyn(vreg_value(op[0]), acc) when "ECMA_XOR2DYN_PREF_V8" - res := handle_ecma_xor2dyn(vreg_value(op[0]), acc_value) - set_value(acc_ptr, res).any - #ecma_intrinsic_setacc("And2Dyn", vreg_value(op[0]).u64, acc_value.u64) + acc := handle_ecma_xor2dyn(vreg_value(op[0]), acc) + #ecma_intrinsic_setacc("And2Dyn", vreg_value(op[0]).u64, acc.u64) when "ECMA_NOTDYN_PREF_V8" - res := handle_ecma_notdyn(vreg_value(op[0]).any) - set_value(acc_ptr, res).any + acc := handle_ecma_notdyn(vreg_value(op[0]).any) when "ECMA_SHL2DYN_PREF_V8" - res := handle_ecma_shl2dyn(vreg_value(op[0]), acc_value) - set_value(acc_ptr, res).any - # ecma_intrinsic_setacc("Shl2Dyn", vreg_value(op[0]).u64, acc_value.u64) + acc := handle_ecma_shl2dyn(vreg_value(op[0]), acc) + # ecma_intrinsic_setacc("Shl2Dyn", vreg_value(op[0]).u64, acc.u64) when "ECMA_SHR2DYN_PREF_V8" - res := handle_ecma_shr2dyn(vreg_value(op[0]), acc_value) - set_value(acc_ptr, res).any - # ecma_intrinsic_setacc("Shr2Dyn", vreg_value(op[0]).u64, acc_value.u64) + acc := handle_ecma_shr2dyn(vreg_value(op[0]), acc) + # ecma_intrinsic_setacc("Shr2Dyn", vreg_value(op[0]).u64, acc.u64) when "ECMA_STRICTEQDYN_PREF_V8" - res := handle_ecma_stricteqdyn(vreg_value(op[0]), acc_value) - set_value(acc_ptr, res).any + acc := handle_ecma_stricteqdyn(vreg_value(op[0]), acc) when "ECMA_STRICTNOTEQDYN_PREF_V8" - res := handle_ecma_strictnoteqdyn(vreg_value(op[0]), acc_value) - set_value(acc_ptr, res).any + acc := handle_ecma_strictnoteqdyn(vreg_value(op[0]), acc) when "ECMA_EQDYN_PREF_V8" - res := handle_ecma_eqdyn(vreg_value(op[0]).any, acc_value.any) - set_value(acc_ptr, res).any - #ecma_intrinsic_setacc("EqDyn", vreg_value(op[0]).u64, acc_value.u64) + acc := handle_ecma_eqdyn(vreg_value(op[0]).any, acc.any) + #ecma_intrinsic_setacc("EqDyn", vreg_value(op[0]).u64, acc.u64) when "ECMA_NOTEQDYN_PREF_V8" - res := handle_ecma_noteqdyn(vreg_value(op[0]), acc_value) - set_value(acc_ptr, res).any - #ecma_intrinsic_setacc("NotEqDyn", vreg_value(op[0]).u64, acc_value.u64) + acc := handle_ecma_noteqdyn(vreg_value(op[0]), acc) + #ecma_intrinsic_setacc("NotEqDyn", vreg_value(op[0]).u64, acc.u64) when "ECMA_LESSDYN_PREF_V8" - res := handle_ecma_lessdyn(vreg_value(op[0]), acc_value) - set_value(acc_ptr, res).any - #ecma_intrinsic_setacc("LessDyn", vreg_value(op[0]).u64, acc_value.u64) + acc := handle_ecma_lessdyn(vreg_value(op[0]), acc) + #ecma_intrinsic_setacc("LessDyn", vreg_value(op[0]).u64, acc.u64) when "ECMA_LESSEQDYN_PREF_V8" - res := handle_ecma_lesseqdyn(vreg_value(op[0]), acc_value) - set_value(acc_ptr, res).any - #ecma_intrinsic_setacc("LessEqDyn", vreg_value(op[0]).u64, acc_value.u64) + acc := handle_ecma_lesseqdyn(vreg_value(op[0]), acc) + #ecma_intrinsic_setacc("LessEqDyn", vreg_value(op[0]).u64, acc.u64) when "ECMA_GREATERDYN_PREF_V8" - #ecma_intrinsic_setacc("GreaterDyn", vreg_value(op[0]).u64, acc_value.u64) - res := handle_ecma_greaterdyn(vreg_value(op[0]).any, acc_value.any) - set_value(acc_ptr, res).any + #ecma_intrinsic_setacc("GreaterDyn", vreg_value(op[0]).u64, acc.u64) + acc := handle_ecma_greaterdyn(vreg_value(op[0]).any, acc.any) when "ECMA_GREATEREQDYN_PREF_V8" - res := handle_ecma_greatereqdyn(vreg_value(op[0]), acc_value) - set_value(acc_ptr, res).any + acc := handle_ecma_greatereqdyn(vreg_value(op[0]), acc) when "ECMA_INCDYN_PREF_V8" - res := handle_ecma_incdyn(vreg_value(op[0])) - set_value(acc_ptr, res).any + acc := handle_ecma_incdyn(vreg_value(op[0])) #ecma_intrinsic_setacc("IncDyn", vreg_value(op[0]).u64) when "ECMA_DECDYN_PREF_V8" - res := handle_ecma_decdyn(vreg_value(op[0])) - set_value(acc_ptr, res).any + acc := handle_ecma_decdyn(vreg_value(op[0])) when "ECMA_NEGDYN_PREF_V8" - res := handle_ecma_negdyn(vreg_value(op[0]).any) - set_value(acc_ptr, res).any + acc := handle_ecma_negdyn(vreg_value(op[0]).any) #ecma_intrinsic_setacc("NegDyn", vreg_value(op[0]).u64) when "ECMA_TONUMBER_PREF_V8" - res := handle_ecma_tonumber(vreg_value(op[0])) - set_value(acc_ptr, res).any + acc := handle_ecma_tonumber(vreg_value(op[0])) #ecma_intrinsic_setacc("Tonumber", vreg_value(op[0]).u64) when "ECMA_TOBOOLEAN_PREF_NONE" - res := handle_ecma_toboolean(acc_value.any) - set_value(acc_ptr, res).any - #ecma_intrinsic_setacc("Toboolean", acc_value.u64) + acc := handle_ecma_toboolean(acc.any) + #ecma_intrinsic_setacc("Toboolean", acc.u64) when "ECMA_LDTRUE_PREF_NONE" handle_ecma_ldconst(Constants::VALUE_TRUE) when "ECMA_LDFALSE_PREF_NONE" @@ -131,20 +107,17 @@ when "ECMA_JFALSE_PREF_IMM32" pc := handle_ecma_jcconst(Constants::VALUE_FALSE, pc, as_imm(op[0]), i.format.size) when "ECMA_NEGATE_PREF_NONE" - res := handle_ecma_negate(acc_value.any) - set_value(acc_ptr, res).any + acc := handle_ecma_negate(acc.any) when "ECMA_LDNAN_PREF_NONE" ecma_intrinsic_setacc("Ldnan") when "ECMA_ISUNDEFINED_PREF_NONE" - res := handle_ecma_isundefined(acc_value.any) - set_value(acc_ptr, res).any + acc := handle_ecma_isundefined(acc.any) when "ECMA_CREATEOBJECTWITHBUFFER_PREF_IMM16" ecma_intrinsic_setacc("CreateObjectWithBuffer", as_imm(op[0])) when "ECMA_GETPROPITERATOR_PREF_NONE" - ecma_intrinsic_setacc("GetPropIterator", acc_value.u64) + ecma_intrinsic_setacc("GetPropIterator", acc.u64) when "ECMA_GETNEXTPROPNAME_PREF_V8" - res := handle_ecma_getnextpropname(vreg_value(op[0]).u64) - set_value(acc_ptr, res).u64 + acc := handle_ecma_getnextpropname(vreg_value(op[0]).u64) # ecma runtime when "ECMA_DEFINEFUNCDYN_PREF_ID16_V8" @@ -160,16 +133,15 @@ when "ECMA_CALL3DYN_PREF_V8_V8_V8_V8" ecma_intrinsic_check_setacc("Call3Dyn", i.format.size, vreg_value(op[0]).u64, vreg_value(op[1]).u64, vreg_value(op[2]).u64, vreg_value(op[3]).u64) when "ECMA_LDLEXENVDYN_PREF_NONE" - res := handle_ecma_ldlexenvdyn() - set_value(acc_ptr, res).any + acc := handle_ecma_ldlexenvdyn() when "ECMA_NEWLEXENVDYN_PREF_IMM16" ecma_intrinsic_setacc("NewlexenvDyn", as_imm(op[0])) when "ECMA_STLEXVARDYN_PREF_IMM4_IMM4" - ecma_intrinsic_setacc("StLexVarDyn", i8tou16(as_imm(op[0])), i8tou16(as_imm(op[1])), acc_value.u64) + ecma_intrinsic_setacc("StLexVarDyn", i8tou16(as_imm(op[0])), i8tou16(as_imm(op[1])), acc.u64) when "ECMA_STLEXVARDYN_PREF_IMM8_IMM8" - ecma_intrinsic_setacc("StLexVarDyn", i8tou16(as_imm(op[0])), i8tou16(as_imm(op[1])), acc_value.u64) + ecma_intrinsic_setacc("StLexVarDyn", i8tou16(as_imm(op[0])), i8tou16(as_imm(op[1])), acc.u64) when "ECMA_LEXVARDYN_PREF_IMM16_IMM16" - ecma_intrinsic_setacc("StLexVarDyn", as_imm(op[0]), as_imm(op[1]), acc_value.u64) + ecma_intrinsic_setacc("StLexVarDyn", as_imm(op[0]), as_imm(op[1]), acc.u64) when "ECMA_LDLEXVARDYN_PREF_IMM4_IMM4" ecma_intrinsic_setacc("LdLexVarDyn", i8tou16(as_imm(op[0])), i8tou16(as_imm(op[1]))) when "ECMA_LDLEXVARDYN_PREF_IMM8_IMM8" @@ -179,7 +151,7 @@ when "ECMA_CREATEEMPTYOBJECT_PREF_NONE" ecma_intrinsic_setacc("CreateEmptyObject") when "ECMA_RETURNUNDEFINED_PREF_NONE" - set_value(acc_ptr, 10).u64 + acc := 10 Intrinsic(:INTERPRETER_RETURN).ptr when "ECMA_RETURN_DYN_PREF_NONE" Intrinsic(:INTERPRETER_RETURN).ptr @@ -188,57 +160,52 @@ # ecma load/stores by index when "ECMA_STOBJBYINDEX_PREF_IMM8_V8" - handle_ecma_stobjbyindex(i8tou32(as_imm(op[0])), vreg_value(op[1]).any, acc_value.any) + handle_ecma_stobjbyindex(i8tou32(as_imm(op[0])), vreg_value(op[1]).any, acc.any) when "ECMA_STOBJBYINDEX_PREF_IMM16_V8" - handle_ecma_stobjbyindex(i16tou32(as_imm(op[0])), vreg_value(op[1]).any, acc_value.any) + handle_ecma_stobjbyindex(i16tou32(as_imm(op[0])), vreg_value(op[1]).any, acc.any) when "ECMA_STOBJBYINDEX_PREF_IMM32_V8" - handle_ecma_stobjbyindex(i32tou32(as_imm(op[0])), vreg_value(op[1]).any, acc_value.any) + handle_ecma_stobjbyindex(i32tou32(as_imm(op[0])), vreg_value(op[1]).any, acc.any) when "ECMA_STOWNBYINDEX_PREF_IMM8_V8" - handle_ecma_stownbyindex(i8tou32(as_imm(op[0])), vreg_value(op[1]).any, acc_value.any) + handle_ecma_stownbyindex(i8tou32(as_imm(op[0])), vreg_value(op[1]).any, acc.any) when "ECMA_STOWNBYINDEX_PREF_IMM16_V8" - handle_ecma_stownbyindex(i16tou32(as_imm(op[0])), vreg_value(op[1]).any, acc_value.any) + handle_ecma_stownbyindex(i16tou32(as_imm(op[0])), vreg_value(op[1]).any, acc.any) when "ECMA_STOWNBYINDEX_PREF_IMM32_V8" - handle_ecma_stownbyindex(i32tou32(as_imm(op[0])), vreg_value(op[1]).any, acc_value.any) + handle_ecma_stownbyindex(i32tou32(as_imm(op[0])), vreg_value(op[1]).any, acc.any) when "ECMA_LDOBJBYINDEX_PREF_IMM8_V8" - res := handle_ecma_ldobjbyindex(i8tou32(as_imm(op[0])), vreg_value(op[1]).any) - set_value(acc_ptr, res).any + acc := handle_ecma_ldobjbyindex(i8tou32(as_imm(op[0])), vreg_value(op[1]).any) when "ECMA_LDOBJBYINDEX_PREF_IMM16_V8" - res := handle_ecma_ldobjbyindex(i16tou32(as_imm(op[0])), vreg_value(op[1]).any) - set_value(acc_ptr, res).any + acc := handle_ecma_ldobjbyindex(i16tou32(as_imm(op[0])), vreg_value(op[1]).any) when "ECMA_LDOBJBYINDEX_PREF_IMM32_V8" - res := handle_ecma_ldobjbyindex(i32tou32(as_imm(op[0])), vreg_value(op[1]).any) - set_value(acc_ptr, res).any + acc := handle_ecma_ldobjbyindex(i32tou32(as_imm(op[0])), vreg_value(op[1]).any) # ecma load/stores by value when "ECMA_STOBJBYVALUE_PREF_V8_V8" - handle_ecma_stobjbyvalue(vreg_value(op[0]).any, vreg_value(op[1]).any, acc_value.any, ins_offset) + handle_ecma_stobjbyvalue(vreg_value(op[0]).any, vreg_value(op[1]).any, acc.any, ins_offset) when "ECMA_LDOBJBYVALUE_PREF_V8_V8" - res := handle_ecma_ldobjbyvalue(vreg_value(op[0]).any, vreg_value(op[1]).any, ins_offset) - set_value(acc_ptr, res).any + acc := handle_ecma_ldobjbyvalue(vreg_value(op[0]).any, vreg_value(op[1]).any, ins_offset) # ecma load/stores by name when "ECMA_STOBJBYNAME_PREF_ID32_V8" - handle_ecma_stobjbyname(vreg_value(op[1]).any, as_id(op[0]), acc_value.any, ins_offset) + handle_ecma_stobjbyname(vreg_value(op[1]).any, as_id(op[0]), acc.any, ins_offset) when "ECMA_LDOBJBYNAME_PREF_ID32_V8" - res := handle_ecma_ldobjbyname(vreg_value(op[1]).any, as_id(op[0]), ins_offset) - set_value(acc_ptr, res).any + acc := handle_ecma_ldobjbyname(vreg_value(op[1]).any, as_id(op[0]), ins_offset) # load/stores from global object when "ECMA_TRYLDGLOBALBYNAME_PREF_ID32" - res := handle_ecma_tryldglobalbyname(as_id(op[0]), ins_offset) - set_value(acc_ptr, res).any + acc := handle_ecma_tryldglobalbyname(as_id(op[0]), ins_offset) when "ECMA_LDGLOBALVAR_PREF_ID32" - res := handle_ecma_ldglobalvar(as_id(op[0]), ins_offset) - set_value(acc_ptr, res).any + acc := handle_ecma_ldglobalvar(as_id(op[0]), ins_offset) when "ECMA_STGLOBALVAR_PREF_ID32" - handle_ecma_stglobalvar(as_id(op[0]), acc_value.any, ins_offset) + handle_ecma_stglobalvar(as_id(op[0]), acc.any, ins_offset) # ecma exceptions when "ECMA_THROWDYN_PREF_NONE" - ecma_intrinsic_setacc("ThrowDyn", acc_value.u64) + ecma_intrinsic_setacc("ThrowDyn", acc.u64) pc := find_catch_block() frame := frame_eh + acc := acc_eh + acc_tag := acc_tag_eh when "ECMA_THROWUNDEFINEDIFHOLE_PREF_ID32" - ecma_intrinsic_setacc("ThrowUndefinedIfHole", as_id(op[0]), acc_value.any) + ecma_intrinsic_setacc("ThrowUndefinedIfHole", as_id(op[0]), acc.any)