[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PULL 06/15] Hexagon (target/hexagon) Only pass env to generated helper
From: |
Brian Cain |
Subject: |
[PULL 06/15] Hexagon (target/hexagon) Only pass env to generated helper when needed |
Date: |
Sun, 5 May 2024 19:42:18 -0700 |
From: Taylor Simpson <ltaylorsimpson@gmail.com>
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>
---
target/hexagon/gen_helper_protos.py | 12 ++++++++++--
target/hexagon/gen_tcg.h | 5 ++++-
target/hexagon/hex_common.py | 23 ++++++++++++++++++-----
3 files changed, 32 insertions(+), 8 deletions(-)
diff --git a/target/hexagon/gen_helper_protos.py
b/target/hexagon/gen_helper_protos.py
index c82b0f54e4..f8578d5033 100755
--- a/target/hexagon/gen_helper_protos.py
+++ b/target/hexagon/gen_helper_protos.py
@@ -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():
diff --git a/target/hexagon/gen_tcg.h b/target/hexagon/gen_tcg.h
index 1c4391b415..3fc1f4e281 100644
--- a/target/hexagon/gen_tcg.h
+++ b/target/hexagon/gen_tcg.h
@@ -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)
diff --git a/target/hexagon/hex_common.py b/target/hexagon/hex_common.py
index 03c9ce1d8a..c09b48bb36 100755
--- a/target/hexagon/hex_common.py
+++ b/target/hexagon/hex_common.py
@@ -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):
--
2.25.1
- [PULL 00/15] Hexagon: simplify gen for packets w/o read-after-write, Brian Cain, 2024/05/05
- [PULL 04/15] Hexagon (target/hexagon) Pass P0 explicitly to helpers that need it, Brian Cain, 2024/05/05
- [PULL 01/15] Hexagon (target/hexagon) Analyze reads before writes, Brian Cain, 2024/05/05
- [PULL 06/15] Hexagon (target/hexagon) Only pass env to generated helper when needed,
Brian Cain <=
- [PULL 02/15] Hexagon (target/hexagon) Enable more short-circuit packets (scalar core), Brian Cain, 2024/05/05
- [PULL 05/15] Hexagon (target/hexagon) Pass SP explicitly to helpers that need it, Brian Cain, 2024/05/05
- [PULL 07/15] Hexagon (target/hexagon) Add is_old/is_new to Register class, Brian Cain, 2024/05/05
- [PULL 03/15] Hexagon (target/hexagon) Enable more short-circuit packets (HVX), Brian Cain, 2024/05/05
- [PULL 08/15] Hexagon (target/hexagon) Mark new_read_idx in trans functions, Brian Cain, 2024/05/05
- [PULL 10/15] Hexagon (target/hexagon) Mark has_pred_dest in trans functions, Brian Cain, 2024/05/05
- [PULL 11/15] Hexagon (tests/tcg/hexagon) Test HVX .new read from high half of pair, Brian Cain, 2024/05/05
- [PULL 09/15] Hexagon (target/hexagon) Mark dest_idx in trans functions, Brian Cain, 2024/05/05
- [PULL 13/15] Hexagon (target/hexagon) Remove gen_op_regs.py, Brian Cain, 2024/05/05
- [PULL 14/15] Hexagon (target/hexagon) Remove gen_shortcode.py, Brian Cain, 2024/05/05