summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--runtime/interpreter/mterp/arm/floating_point.S8
-rw-r--r--runtime/interpreter/mterp/arm/object.S2
-rw-r--r--runtime/interpreter/mterp/arm64/object.S2
-rw-r--r--runtime/interpreter/mterp/common/gen_setup.py16
-rw-r--r--runtime/interpreter/mterp/mterp.cc4
-rw-r--r--runtime/interpreter/mterp/mterp.h2
-rw-r--r--runtime/interpreter/mterp/x86/arithmetic.S7
-rw-r--r--tools/cpp-define-generator/globals.def5
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,