mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-02 15:23:53 -06:00
Hexagon (target/hexagon) Analyze reads before writes
We divide gen_analyze_funcs.py into 3 phases Declare the operands Analyze the register reads Analyze the register writes We also create special versions of ctx_log_*_read for new operands Check that the operand is written before the read This is a precursor to improving the analysis for short-circuiting the packet semantics in a subsequent commit Signed-off-by: Taylor Simpson <ltaylorsimpson@gmail.com> Reviewed-by: Brian Cain <bcain@quicinc.com> Message-Id: <20240201103340.119081-2-ltaylorsimpson@gmail.com> Signed-off-by: Brian Cain <bcain@quicinc.com>
This commit is contained in:
parent
248f6f62df
commit
76eaa97157
4 changed files with 83 additions and 49 deletions
|
@ -1,7 +1,7 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
##
|
||||
## Copyright(c) 2022-2023 Qualcomm Innovation Center, Inc. All Rights Reserved.
|
||||
## Copyright(c) 2022-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
|
||||
|
@ -44,15 +44,25 @@ def gen_analyze_func(f, tag, regs, imms):
|
|||
|
||||
f.write(" Insn *insn G_GNUC_UNUSED = ctx->insn;\n")
|
||||
|
||||
i = 0
|
||||
## Analyze all the registers
|
||||
for regtype, regid in regs:
|
||||
reg = hex_common.get_register(tag, regtype, regid)
|
||||
## Declare all the registers
|
||||
for regno, register in enumerate(regs):
|
||||
reg_type, reg_id = register
|
||||
reg = hex_common.get_register(tag, reg_type, reg_id)
|
||||
reg.decl_reg_num(f, regno)
|
||||
|
||||
## Analyze the register reads
|
||||
for regno, register in enumerate(regs):
|
||||
reg_type, reg_id = register
|
||||
reg = hex_common.get_register(tag, reg_type, reg_id)
|
||||
if reg.is_read():
|
||||
reg.analyze_read(f, regno)
|
||||
|
||||
## Analyze the register writes
|
||||
for regno, register in enumerate(regs):
|
||||
reg_type, reg_id = register
|
||||
reg = hex_common.get_register(tag, reg_type, reg_id)
|
||||
if reg.is_written():
|
||||
reg.analyze_write(f, tag, i)
|
||||
else:
|
||||
reg.analyze_read(f, i)
|
||||
i += 1
|
||||
reg.analyze_write(f, tag, regno)
|
||||
|
||||
has_generated_helper = not hex_common.skip_qemu_helper(
|
||||
tag
|
||||
|
@ -89,13 +99,13 @@ def main():
|
|||
tagimms = hex_common.get_tagimms()
|
||||
|
||||
with open(sys.argv[-1], "w") as f:
|
||||
f.write("#ifndef HEXAGON_TCG_FUNCS_H\n")
|
||||
f.write("#define HEXAGON_TCG_FUNCS_H\n\n")
|
||||
f.write("#ifndef HEXAGON_ANALYZE_FUNCS_C_INC\n")
|
||||
f.write("#define HEXAGON_ANALYZE_FUNCS_C_INC\n\n")
|
||||
|
||||
for tag in hex_common.tags:
|
||||
gen_analyze_func(f, tag, tagregs[tag], tagimms[tag])
|
||||
|
||||
f.write("#endif /* HEXAGON_TCG_FUNCS_H */\n")
|
||||
f.write("#endif /* HEXAGON_ANALYZE_FUNCS_C_INC */\n")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue