Hexagon (target/hexagon) Only pass env to generated helper when needed
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>
This commit is contained in:
parent
f7be65fbbf
commit
2f0a771ddc
@ -1,7 +1,7 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
##
|
||||
## Copyright(c) 2019-2023 Qualcomm Innovation Center, Inc. All Rights Reserved.
|
||||
## 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
|
||||
@ -40,7 +40,15 @@ def gen_helper_prototype(f, tag, tagregs, tagimms):
|
||||
declared.append(arg.proto_arg)
|
||||
|
||||
arguments = ", ".join(declared)
|
||||
f.write(f"DEF_HELPER_{len(declared) - 1}({tag}, {arguments})\n")
|
||||
|
||||
## 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():
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright(c) 2019-2023 Qualcomm Innovation Center, Inc. All Rights Reserved.
|
||||
* 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
|
||||
@ -1369,3 +1369,6 @@
|
||||
gen_helper_raise_exception(tcg_env, excp); \
|
||||
} while (0)
|
||||
#endif
|
||||
|
||||
#define fGEN_TCG_A2_nop(SHORTCODE) do { } while (0)
|
||||
#define fGEN_TCG_SA1_setin1(SHORTCODE) tcg_gen_movi_tl(RdV, -1)
|
||||
|
@ -206,6 +206,18 @@ def need_sp(tag):
|
||||
return "A_IMPLICIT_READS_SP" in attribdict[tag]
|
||||
|
||||
|
||||
def is_hvx_insn(tag):
|
||||
return "A_CVI" in attribdict[tag]
|
||||
|
||||
|
||||
def need_env(tag):
|
||||
return ("A_STORE" in attribdict[tag] or
|
||||
"A_LOAD" in attribdict[tag] or
|
||||
"A_CVI_GATHER" in attribdict[tag] or
|
||||
"A_CVI_SCATTER" in attribdict[tag] or
|
||||
"A_IMPLICIT_WRITES_USR" in attribdict[tag])
|
||||
|
||||
|
||||
def need_slot(tag):
|
||||
if (
|
||||
"A_CVI_SCATTER" not in attribdict[tag]
|
||||
@ -1085,11 +1097,12 @@ def helper_args(tag, regs, imms):
|
||||
args = []
|
||||
|
||||
## First argument is the CPU state
|
||||
args.append(HelperArg(
|
||||
"env",
|
||||
"tcg_env",
|
||||
"CPUHexagonState *env"
|
||||
))
|
||||
if need_env(tag):
|
||||
args.append(HelperArg(
|
||||
"env",
|
||||
"tcg_env",
|
||||
"CPUHexagonState *env"
|
||||
))
|
||||
|
||||
## For predicated instructions, we pass in the destination register
|
||||
if is_predicated(tag):
|
||||
|
Loading…
Reference in New Issue
Block a user