2f0a771ddc
Currently, we pass env to every generated helper. When the semantics of the instruction only depend on the arguments, this is unnecessary and adds extra overhead to the helper call. We add the TCG_CALL_NO_RWG_SE flag to any non-HVX helpers that don't get the ptr to env. The A2_nop and SA1_setin1 instructions end up with no arguments. This results in a "old-style function definition" error from the compiler, so we write overrides for them. With this change, the number of helpers with env argument is idef-parser enabled: 329 total, 23 with env idef-parser disabled: 1543 total, 550 with env Signed-off-by: Taylor Simpson <ltaylorsimpson@gmail.com> Reviewed-by: Anton Johansson <anjo@rev.ng> Tested-by: Anton Johansson <anjo@rev.ng> Message-Id: <20240214042726.19290-4-ltaylorsimpson@gmail.com> Signed-off-by: Brian Cain <bcain@quicinc.com>
103 lines
3.3 KiB
Python
Executable File
103 lines
3.3 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
|
|
##
|
|
## Copyright(c) 2019-2024 Qualcomm Innovation Center, Inc. All Rights Reserved.
|
|
##
|
|
## This program is free software; you can redistribute it and/or modify
|
|
## it under the terms of the GNU General Public License as published by
|
|
## the Free Software Foundation; either version 2 of the License, or
|
|
## (at your option) any later version.
|
|
##
|
|
## This program is distributed in the hope that it will be useful,
|
|
## but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
## GNU General Public License for more details.
|
|
##
|
|
## You should have received a copy of the GNU General Public License
|
|
## along with this program; if not, see <http://www.gnu.org/licenses/>.
|
|
##
|
|
|
|
import sys
|
|
import re
|
|
import string
|
|
import hex_common
|
|
|
|
##
|
|
## Generate the DEF_HELPER prototype for an instruction
|
|
## For A2_add: Rd32=add(Rs32,Rt32)
|
|
## We produce:
|
|
## DEF_HELPER_3(A2_add, s32, env, s32, s32)
|
|
##
|
|
def gen_helper_prototype(f, tag, tagregs, tagimms):
|
|
regs = tagregs[tag]
|
|
imms = tagimms[tag]
|
|
|
|
declared = []
|
|
ret_type = hex_common.helper_ret_type(tag, regs).proto_arg
|
|
declared.append(ret_type)
|
|
|
|
for arg in hex_common.helper_args(tag, regs, imms):
|
|
declared.append(arg.proto_arg)
|
|
|
|
arguments = ", ".join(declared)
|
|
|
|
## Add the TCG_CALL_NO_RWG_SE flag to helpers that don't take the env
|
|
## argument and aren't HVX instructions. Since HVX instructions take
|
|
## pointers to their arguments, they will have side effects.
|
|
if hex_common.need_env(tag) or hex_common.is_hvx_insn(tag):
|
|
f.write(f"DEF_HELPER_{len(declared) - 1}({tag}, {arguments})\n")
|
|
else:
|
|
f.write(f"DEF_HELPER_FLAGS_{len(declared) - 1}({tag}, "
|
|
f"TCG_CALL_NO_RWG_SE, {arguments})\n")
|
|
|
|
|
|
def main():
|
|
hex_common.read_semantics_file(sys.argv[1])
|
|
hex_common.read_attribs_file(sys.argv[2])
|
|
hex_common.read_overrides_file(sys.argv[3])
|
|
hex_common.read_overrides_file(sys.argv[4])
|
|
## Whether or not idef-parser is enabled is
|
|
## determined by the number of arguments to
|
|
## this script:
|
|
##
|
|
## 5 args. -> not enabled,
|
|
## 6 args. -> idef-parser enabled.
|
|
##
|
|
## The 6:th arg. then holds a list of the successfully
|
|
## parsed instructions.
|
|
is_idef_parser_enabled = len(sys.argv) > 6
|
|
if is_idef_parser_enabled:
|
|
hex_common.read_idef_parser_enabled_file(sys.argv[5])
|
|
hex_common.calculate_attribs()
|
|
hex_common.init_registers()
|
|
tagregs = hex_common.get_tagregs()
|
|
tagimms = hex_common.get_tagimms()
|
|
|
|
output_file = sys.argv[-1]
|
|
with open(output_file, "w") as f:
|
|
for tag in hex_common.tags:
|
|
## Skip the priv instructions
|
|
if "A_PRIV" in hex_common.attribdict[tag]:
|
|
continue
|
|
## Skip the guest instructions
|
|
if "A_GUEST" in hex_common.attribdict[tag]:
|
|
continue
|
|
## Skip the diag instructions
|
|
if tag == "Y6_diag":
|
|
continue
|
|
if tag == "Y6_diag0":
|
|
continue
|
|
if tag == "Y6_diag1":
|
|
continue
|
|
|
|
if hex_common.skip_qemu_helper(tag):
|
|
continue
|
|
if hex_common.is_idef_parser_enabled(tag):
|
|
continue
|
|
|
|
gen_helper_prototype(f, tag, tagregs, tagimms)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|