Make it easier to generate helpers for mterp opcodes.
Create a global variable where helper snippets can be
registered and will then be appended after the opcodes.
Also add entries to symbol table for the helpers.
Test: Manually compare the generated assembly
Change-Id: Icc5eb98590243969dc47c59a65e39a3a406660f2
diff --git a/runtime/interpreter/mterp/arm/floating_point.S b/runtime/interpreter/mterp/arm/floating_point.S
index 9f72464..b6ede54 100644
--- a/runtime/interpreter/mterp/arm/floating_point.S
+++ b/runtime/interpreter/mterp/arm/floating_point.S
@@ -326,6 +326,7 @@
%def op_double_to_long():
% unopWide(instr="bl d2l_doconv")
+% add_helper("helper_code", op_double_to_long_helper_code)
%def op_double_to_long_helper_code():
/*
@@ -367,6 +368,7 @@
%def op_float_to_long():
% unopWider(instr="bl f2l_doconv")
+% add_helper("helper_code", op_float_to_long_helper_code)
%def op_float_to_long_helper_code():
/*
diff --git a/runtime/interpreter/mterp/arm/main.S b/runtime/interpreter/mterp/arm/main.S
index 4951220..1d8d6c9 100644
--- a/runtime/interpreter/mterp/arm/main.S
+++ b/runtime/interpreter/mterp/arm/main.S
@@ -411,8 +411,6 @@
%def helpers():
ENTRY MterpHelpers
-% op_float_to_long_helper_code()
-% op_double_to_long_helper_code()
%def footer():
/*
@@ -747,3 +745,7 @@
ENTRY Mterp_${opcode}
%def opcode_end():
END Mterp_${opcode}
+%def helper_start(name):
+ ENTRY ${name}
+%def helper_end(name):
+ END ${name}
diff --git a/runtime/interpreter/mterp/arm64/main.S b/runtime/interpreter/mterp/arm64/main.S
index 4e49707..31356ff 100644
--- a/runtime/interpreter/mterp/arm64/main.S
+++ b/runtime/interpreter/mterp/arm64/main.S
@@ -786,3 +786,7 @@
ENTRY Mterp_${opcode}
%def opcode_end():
END Mterp_${opcode}
+%def helper_start(name):
+ ENTRY ${name}
+%def helper_end(name):
+ END ${name}
diff --git a/runtime/interpreter/mterp/common/gen_setup.py b/runtime/interpreter/mterp/common/gen_setup.py
index 5ddc073..a693383 100644
--- a/runtime/interpreter/mterp/common/gen_setup.py
+++ b/runtime/interpreter/mterp/common/gen_setup.py
@@ -50,6 +50,24 @@
write_line("")
opnum, opcode = None, None
+generated_helpers = list()
+
+# 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):
+ 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())
+ out = old_out
+ return name
+
def generate(output_filename):
out.seek(0)
out.truncate()
@@ -62,6 +80,8 @@
balign()
instruction_end()
+ for helper in generated_helpers:
+ out.write(helper)
helpers()
instruction_start_alt()
diff --git a/runtime/interpreter/mterp/x86/main.S b/runtime/interpreter/mterp/x86/main.S
index 4f35bec..b44f168 100644
--- a/runtime/interpreter/mterp/x86/main.S
+++ b/runtime/interpreter/mterp/x86/main.S
@@ -800,3 +800,7 @@
ENTRY Mterp_${opcode}
%def opcode_end():
END Mterp_${opcode}
+%def helper_start(name):
+ ENTRY ${name}
+%def helper_end(name):
+ END ${name}
diff --git a/runtime/interpreter/mterp/x86_64/main.S b/runtime/interpreter/mterp/x86_64/main.S
index 016ced1..900923d 100644
--- a/runtime/interpreter/mterp/x86_64/main.S
+++ b/runtime/interpreter/mterp/x86_64/main.S
@@ -753,3 +753,7 @@
ENTRY Mterp_${opcode}
%def opcode_end():
END Mterp_${opcode}
+%def helper_start(name):
+ ENTRY ${name}
+%def helper_end(name):
+ END ${name}