diff options
| -rw-r--r-- | runtime/interpreter/mterp/arm/floating_point.S | 8 | ||||
| -rw-r--r-- | runtime/interpreter/mterp/arm/object.S | 2 | ||||
| -rw-r--r-- | runtime/interpreter/mterp/arm64/object.S | 2 | ||||
| -rw-r--r-- | runtime/interpreter/mterp/common/gen_setup.py | 16 | ||||
| -rw-r--r-- | runtime/interpreter/mterp/mterp.cc | 4 | ||||
| -rw-r--r-- | runtime/interpreter/mterp/mterp.h | 2 | ||||
| -rw-r--r-- | runtime/interpreter/mterp/x86/arithmetic.S | 7 | ||||
| -rw-r--r-- | tools/cpp-define-generator/globals.def | 5 |
8 files changed, 30 insertions, 16 deletions
diff --git a/runtime/interpreter/mterp/arm/floating_point.S b/runtime/interpreter/mterp/arm/floating_point.S index b6ede54f86..6bf54e8de0 100644 --- a/runtime/interpreter/mterp/arm/floating_point.S +++ b/runtime/interpreter/mterp/arm/floating_point.S @@ -326,9 +326,9 @@ %def op_double_to_long(): % unopWide(instr="bl d2l_doconv") -% add_helper("helper_code", op_double_to_long_helper_code) +% add_helper(op_double_to_long_helper) -%def op_double_to_long_helper_code(): +%def op_double_to_long_helper(): /* * Convert the double in r0/r1 to a long in r0/r1. * @@ -368,9 +368,9 @@ d2l_maybeNaN: %def op_float_to_long(): % unopWider(instr="bl f2l_doconv") -% add_helper("helper_code", op_float_to_long_helper_code) +% add_helper(op_float_to_long_helper) -%def op_float_to_long_helper_code(): +%def op_float_to_long_helper(): /* * Convert the float in r0 to a long in r0/r1. * diff --git a/runtime/interpreter/mterp/arm/object.S b/runtime/interpreter/mterp/arm/object.S index 13009eaefc..092aa9ef4e 100644 --- a/runtime/interpreter/mterp/arm/object.S +++ b/runtime/interpreter/mterp/arm/object.S @@ -43,7 +43,7 @@ mov r2, rINST, lsr #12 @ B GET_VREG r2, r2 @ object we're operating on cmp r0, rPC -% slow_path_label = add_helper("slow_path", lambda: field(helper)) +% slow_path_label = add_helper(lambda: field(helper)) bne ${slow_path_label} @ cache miss cmp r2, #0 beq common_errNullObject @ null object diff --git a/runtime/interpreter/mterp/arm64/object.S b/runtime/interpreter/mterp/arm64/object.S index 3d44731cce..3cc688e5e2 100644 --- a/runtime/interpreter/mterp/arm64/object.S +++ b/runtime/interpreter/mterp/arm64/object.S @@ -41,7 +41,7 @@ lsr w2, wINST, #12 // B GET_VREG w2, w2 // object we're operating on cmp x0, xPC -% slow_path_label = add_helper("slow_path", lambda: field(helper)) +% slow_path_label = add_helper(lambda: field(helper)) b.ne ${slow_path_label} // cache miss cbz w2, common_errNullObject // null object % if is_wide: diff --git a/runtime/interpreter/mterp/common/gen_setup.py b/runtime/interpreter/mterp/common/gen_setup.py index a693383a78..d2a6376255 100644 --- a/runtime/interpreter/mterp/common/gen_setup.py +++ b/runtime/interpreter/mterp/common/gen_setup.py @@ -22,8 +22,8 @@ import sys, re from cStringIO import StringIO out = StringIO() # File-like in-memory buffer. -handler_size_bytes = "128" -handler_size_bits = "7" +handler_size_bytes = "MTERP_HANDLER_SIZE" +handler_size_bits = "MTERP_HANDLER_SIZE_LOG2" opcode = "" opnum = "" @@ -50,21 +50,21 @@ def write_opcode(num, name, write_method, is_alt): write_line("") opnum, opcode = None, None -generated_helpers = list() +generated_helpers = {} # This method generates a helper using the provided writer method. # The output is temporarily redirected to in-memory buffer. -# It returns the symbol which can be used to jump to the helper. -def add_helper(name_suffix, write_helper): +def add_helper(write_helper, name = None): + if name == None: + name = "Mterp_" + opcode + "_helper" global out old_out = out out = StringIO() - name = "Mterp_" + opcode + "_" + name_suffix helper_start(name) write_helper() helper_end(name) out.seek(0) - generated_helpers.append(out.read()) + generated_helpers[name] = out.read() out = old_out return name @@ -80,7 +80,7 @@ def generate(output_filename): balign() instruction_end() - for helper in generated_helpers: + for name, helper in sorted(generated_helpers.items()): out.write(helper) helpers() diff --git a/runtime/interpreter/mterp/mterp.cc b/runtime/interpreter/mterp/mterp.cc index c385fb9417..5cd9e5d851 100644 --- a/runtime/interpreter/mterp/mterp.cc +++ b/runtime/interpreter/mterp/mterp.cc @@ -34,11 +34,11 @@ namespace interpreter { void CheckMterpAsmConstants() { /* * If we're using computed goto instruction transitions, make sure - * none of the handlers overflows the 128-byte limit. This won't tell + * none of the handlers overflows the byte limit. This won't tell * which one did, but if any one is too big the total size will * overflow. */ - const int width = 128; + const int width = kMterpHandlerSize; int interp_size = (uintptr_t) artMterpAsmInstructionEnd - (uintptr_t) artMterpAsmInstructionStart; if ((interp_size == 0) || (interp_size != (art::kNumPackedOpcodes * width))) { diff --git a/runtime/interpreter/mterp/mterp.h b/runtime/interpreter/mterp/mterp.h index 1a56d26813..adde7c652a 100644 --- a/runtime/interpreter/mterp/mterp.h +++ b/runtime/interpreter/mterp/mterp.h @@ -50,6 +50,8 @@ constexpr uintptr_t kExportPCPoison = 0xdead00ff; // Set true to enable poison testing of ExportPC. Uses Alt interpreter. constexpr bool kTestExportPC = false; +constexpr size_t kMterpHandlerSize = 128; + } // namespace interpreter } // namespace art diff --git a/runtime/interpreter/mterp/x86/arithmetic.S b/runtime/interpreter/mterp/x86/arithmetic.S index a9fa0fc68f..43ca4c8f5d 100644 --- a/runtime/interpreter/mterp/x86/arithmetic.S +++ b/runtime/interpreter/mterp/x86/arithmetic.S @@ -25,6 +25,9 @@ jne .L${opcode}_32 movl $special, $result jmp .L${opcode}_finish +% add_helper(lambda: bindiv_helper(result, rem)) + +%def bindiv_helper(result, rem): .L${opcode}_32: cltd idivl %ecx @@ -69,7 +72,9 @@ SET_VREG $result, rINST mov LOCAL0(%esp), rIBASE ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 +% add_helper(lambda: bindiv2addr_helper(result)) +%def bindiv2addr_helper(result): .L${opcode}_continue_div2addr: cltd idivl %ecx @@ -302,7 +307,9 @@ mov %eax, VREG_REF_HIGH_ADDRESS(%ecx) .endif ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 +% add_helper(lambda: cvtfp_int_helper(tgtlong)) +%def cvtfp_int_helper(tgtlong): .L${opcode}_special_case: fnstsw %ax sahf diff --git a/tools/cpp-define-generator/globals.def b/tools/cpp-define-generator/globals.def index 2324f5168e..6443a0c517 100644 --- a/tools/cpp-define-generator/globals.def +++ b/tools/cpp-define-generator/globals.def @@ -22,6 +22,7 @@ #include "dex/modifiers.h" #include "gc/accounting/card_table.h" #include "gc/heap.h" +#include "interpreter/mterp/mterp.h" #include "jit/jit.h" #include "mirror/object.h" #include "mirror/object_reference.h" @@ -50,6 +51,10 @@ ASM_DEFINE(JIT_HOTNESS_DISABLE, art::jit::kJitHotnessDisabled) ASM_DEFINE(MIN_LARGE_OBJECT_THRESHOLD, art::gc::Heap::kMinLargeObjectThreshold) +ASM_DEFINE(MTERP_HANDLER_SIZE, + art::interpreter::kMterpHandlerSize) +ASM_DEFINE(MTERP_HANDLER_SIZE_LOG2, + art::WhichPowerOf2(art::interpreter::kMterpHandlerSize)) ASM_DEFINE(OBJECT_ALIGNMENT_MASK, art::kObjectAlignment - 1) ASM_DEFINE(OBJECT_ALIGNMENT_MASK_TOGGLED, |