OSDN Git Service

Dalvik fast interpreter support and JIT implementation
[android-x86/dalvik.git] / vm / mterp / gen-mterp.py
index f8043bb..ec7acaf 100755 (executable)
@@ -25,6 +25,7 @@ from string import Template
 interp_defs_file = "../../libdex/DexOpcodes.h" # need opcode list
 kNumPackedOpcodes = 512 # TODO: Derive this from DexOpcodes.h.
 
+splitops = False
 verbose = False
 handler_size_bits = -1000
 handler_size_bytes = -1000
@@ -98,12 +99,12 @@ def importFile(tokens):
     if len(tokens) != 2:
         raise DataParseError("import requires one argument")
     source = tokens[1]
-    if source.endswith(".c"):
+    if source.endswith(".cpp"):
         appendSourceFile(tokens[1], getGlobalSubDict(), c_fp, None)
     elif source.endswith(".S"):
         appendSourceFile(tokens[1], getGlobalSubDict(), asm_fp, None)
     else:
-        raise DataParseError("don't know how to import %s (expecting .c/.S)"
+        raise DataParseError("don't know how to import %s (expecting .cpp/.S)"
                 % source)
 
 #
@@ -166,7 +167,7 @@ def altEntry(tokens):
     except ValueError:
         raise DataParseError("unknown opcode %s" % tokens[1])
     if alt_opcode_locations.has_key(tokens[1]):
-        print "Warning: alt overrides earlier %s (%s -> %s)" \
+        print "Note: alt overrides earlier %s (%s -> %s)" \
                 % (tokens[1], alt_opcode_locations[tokens[1]], tokens[2])
     alt_opcode_locations[tokens[1]] = tokens[2]
     generate_alt_table = True
@@ -186,7 +187,7 @@ def opEntry(tokens):
     except ValueError:
         raise DataParseError("unknown opcode %s" % tokens[1])
     if opcode_locations.has_key(tokens[1]):
-        print "Warning: op overrides earlier %s (%s -> %s)" \
+        print "Note: op overrides earlier %s (%s -> %s)" \
                 % (tokens[1], opcode_locations[tokens[1]], tokens[2])
     opcode_locations[tokens[1]] = tokens[2]
 
@@ -217,7 +218,18 @@ def opEnd(tokens):
     in_op_start = 2
 
     loadAndEmitOpcodes()
-
+    if splitops == False:
+        if generate_alt_table:
+            loadAndEmitAltOpcodes()
+            if style == "jump-table":
+                emitJmpTable("dvmAsmInstructionStart", label_prefix);
+                emitJmpTable("dvmAsmAltInstructionStart", alt_label_prefix);
+
+def genaltop(tokens):
+    if in_op_start != 2:
+       raise DataParseError("alt-op can be specified only after op-end")
+    if len(tokens) != 1:
+        raise DataParseError("opEnd takes no arguments")
     if generate_alt_table:
         loadAndEmitAltOpcodes()
         if style == "jump-table":
@@ -307,7 +319,6 @@ def loadAndEmitOpcodes():
         asm_fp.write("    .balign 4\n")
         asm_fp.write("dvmAsmSisterStart:\n")
         asm_fp.writelines(sister_list)
-
         asm_fp.write("\n    .size   dvmAsmSisterStart, .-dvmAsmSisterStart\n")
         asm_fp.write("    .global dvmAsmSisterEnd\n")
         asm_fp.write("dvmAsmSisterEnd:\n\n")
@@ -340,8 +351,8 @@ def loadAndEmitAltOpcodes():
     # point dvmAsmInstructionStart at the first handler or stub
     asm_fp.write("\n    .global %s\n" % start_label)
     asm_fp.write("    .type   %s, %%function\n" % start_label)
-    asm_fp.write("%s:\n" % start_label)
     asm_fp.write("    .text\n\n")
+    asm_fp.write("%s = " % start_label + label_prefix + "_ALT_OP_NOP\n")
 
     for i in xrange(kNumPackedOpcodes):
         op = opcodes[i]
@@ -361,9 +372,9 @@ def loadAndEmitAltOpcodes():
 #
 def loadAndEmitC(location, opindex):
     op = opcodes[opindex]
-    source = "%s/%s.c" % (location, op)
+    source = "%s/%s.cpp" % (location, op)
     if verbose:
-        print " emit %s --> C" % source
+        print " emit %s --> C++" % source
     dict = getGlobalSubDict()
     dict.update({ "opcode":op, "opnum":opindex })
 
@@ -536,7 +547,7 @@ except:
 # Open and prepare output files.
 #
 try:
-    c_fp = open("%s/InterpC-%s.c" % (output_dir, target_arch), "w")
+    c_fp = open("%s/InterpC-%s.cpp" % (output_dir, target_arch), "w")
     asm_fp = open("%s/InterpAsm-%s.S" % (output_dir, target_arch), "w")
 except:
     print "Unable to open output files"
@@ -593,6 +604,10 @@ try:
                 opEntry(tokens)
             elif tokens[0] == "handler-style":
                 setHandlerStyle(tokens)
+            elif tokens[0] == "alt-ops":
+                genaltop(tokens)
+            elif tokens[0] == "split-ops":
+                splitops = True
             else:
                 raise DataParseError, "unrecognized command '%s'" % tokens[0]
             if style == None: