blob: a693383a78a25576bcf0c8e0b09bd00f7c36b697 [file] [log] [blame]
#
# Copyright (C) 2016 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# Common global variables and helper methods for the in-memory python script.
# The script starts with this file and is followed by the code generated form
# the templated snippets. Those define all the helper functions used below.
import sys, re
from cStringIO import StringIO
out = StringIO() # File-like in-memory buffer.
handler_size_bytes = "128"
handler_size_bits = "7"
opcode = ""
opnum = ""
def write_line(line):
out.write(line + "\n")
def balign():
write_line(" .balign {}".format(handler_size_bytes))
def write_opcode(num, name, write_method, is_alt):
global opnum, opcode
opnum, opcode = str(num), name
if is_alt:
name = "ALT_" + name
write_line("/* ------------------------------ */")
balign()
write_line(".L_{1}: /* {0:#04x} */".format(num, name))
if is_alt:
alt_stub()
else:
opcode_start()
write_method()
opcode_end()
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()
write_line("/* DO NOT EDIT: This file was generated by gen-mterp.py. */")
header()
entry()
instruction_start()
opcodes(is_alt = False)
balign()
instruction_end()
for helper in generated_helpers:
out.write(helper)
helpers()
instruction_start_alt()
opcodes(is_alt = True)
balign()
instruction_end_alt()
footer()
out.seek(0)
# Squash consequtive empty lines.
text = re.sub(r"(\n\n)(\n)+", r"\1", out.read())
with open(output_filename, 'w') as output_file:
output_file.write(text)