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}