> -----Original Message-----
> From: Brian Cain <brian.c...@oss.qualcomm.com>
> Sent: Friday, February 28, 2025 11:26 PM
> To: qemu-devel@nongnu.org
> Cc: brian.c...@oss.qualcomm.com; richard.hender...@linaro.org;
> phi...@linaro.org; quic_mathb...@quicinc.com; a...@rev.ng; a...@rev.ng;
> quic_mlie...@quicinc.com; ltaylorsimp...@gmail.com;
> alex.ben...@linaro.org; quic_mbur...@quicinc.com;
> sidn...@quicinc.com; Brian Cain <bc...@quicinc.com>
> Subject: [PATCH 03/38] target/hexagon: Add System/Guest register
> definitions
> 

Based on the subject, I was expecting to see the register definitions in 
CPUHexagonState.  A better description would be
target/hexagon: Handle system/guest registers in gen_analyze_funcs.py and 
hex_common.py


> From: Brian Cain <bc...@quicinc.com>
> 
> Signed-off-by: Brian Cain <brian.c...@oss.qualcomm.com>
> ---
>  target/hexagon/gen_analyze_funcs.py |  21 +++-
>  target/hexagon/hex_common.py        | 163
> ++++++++++++++++++++++++++++
>  2 files changed, 181 insertions(+), 3 deletions(-)
> 
> diff --git a/target/hexagon/hex_common.py
> b/target/hexagon/hex_common.py index 758e5fd12d..db50defeb6 100755
> --- a/target/hexagon/hex_common.py
> +++ b/target/hexagon/hex_common.py
> @@ -33,6 +33,41 @@
>  overrides = {}  # tags with helper overrides  idef_parser_enabled = {}  # 
> tags
> enabled for idef-parser
> 
> +class GuestRegister(Register):
> +    def gen_check_impl(self, f, regno):
> +        if self.is_written():
> +            f.write(code_fmt(f"""\
> +                if (!greg_writable(insn->regno[{regno}],
> +                    {str(self.is_pair()).lower()})) {{
> +                    return;
> +                }}
> +            """))
> +        else:
> +            f.write(code_fmt(f"""\
> +check_greg_impl(insn->regno[{regno}], {str(self.is_pair()).lower()});

You can indent this, the code_fmt function will handle it properly in the 
output.  Are you worried about making the line too long for checkpatch?

> +            """))
> +
> +class GuestDest(GuestRegister, Single, Dest):
> +    def decl_tcg(self, f, tag, regno):
> +        self.decl_reg_num(f, regno)
> +        self.gen_check_impl(f, regno)
> +        f.write(code_fmt(f"""\
> +            TCGv {self.reg_tcg()} = tcg_temp_new();
> +            gen_read_greg({self.reg_tcg()}, {self.reg_num});

Do you need this read if it's a destination register?

> +        """))
> +    def log_write(self, f, tag):
> +        f.write(code_fmt(f"""\
> +            gen_log_greg_write(ctx, {self.reg_num}, {self.reg_tcg()});
> +        """))
> +    def analyze_write(self, f, tag, regno):
> +        f.write(code_fmt(f"""\
> +            ctx_log_greg_write(ctx, {self.reg_num});
> +        """))
> +
> +class GuestSource(GuestRegister, Single, OldSource):
> +    def decl_tcg(self, f, tag, regno):
> +        self.decl_reg_num(f, regno);
> +        self.gen_check_impl(f, regno)
> +        f.write(code_fmt(f"""\
> +            TCGv {self.reg_tcg()} = tcg_temp_new();
> +            gen_read_greg({self.reg_tcg()}, {self.reg_num});
> +        """))
> +
> +class GuestPairDest(GuestRegister, Pair, Dest):
> +    def decl_tcg(self, f, tag, regno):
> +        self.decl_reg_num(f, regno)
> +        self.gen_check_impl(f, regno)
> +        f.write(code_fmt(f"""\
> +            TCGv_i64 {self.reg_tcg()} = tcg_temp_new_i64();
> +            gen_read_greg_pair({self.reg_tcg()}, {self.reg_num});

Read needed?

> +        """))
> +    def log_write(self, f, tag):
> +        f.write(code_fmt(f"""\
> +            gen_log_greg_write_pair(ctx, {self.reg_num}, {self.reg_tcg()});
> +        """))
> +    def analyze_write(self, f, tag, regno):
> +        f.write(code_fmt(f"""\
> +            ctx_log_greg_write_pair(ctx, {self.reg_num});
> +        """))
> +
> +class GuestPairSource(GuestRegister, Pair, OldSource):
> +    def decl_tcg(self, f, tag, regno):
> +        self.decl_reg_num(f, regno)
> +        self.gen_check_impl(f, regno)
> +        f.write(code_fmt(f"""\
> +            TCGv_i64 {self.reg_tcg()} = tcg_temp_new_i64();
> +            gen_read_greg_pair({self.reg_tcg()}, {self.reg_num});
> +        """))
> +
> +class SystemDest(Register, Single, Dest):
> +    def decl_tcg(self, f, tag, regno):
> +        self.decl_reg_num(f, regno)
> +        f.write(code_fmt(f"""\
> +            TCGv {self.reg_tcg()} = tcg_temp_new();
> +            gen_read_sreg({self.reg_tcg()}, {self.reg_num});

Read needed?

> +        """))
> +    def log_write(self, f, tag):
> +        f.write(code_fmt(f"""\
> +            gen_log_sreg_write(ctx, {self.reg_num}, {self.reg_tcg()});
> +        """))
> +    def analyze_write(self, f, tag, regno):
> +        f.write(code_fmt(f"""\
> +            ctx_log_sreg_write(ctx, {self.reg_num});
> +        """))
> +
> +class SystemSource(Register, Single, OldSource):
> +    def decl_tcg(self, f, tag, regno):
> +        self.decl_reg_num(f, regno);
> +        f.write(code_fmt(f"""\
> +            TCGv {self.reg_tcg()} = tcg_temp_new();
> +            gen_read_sreg({self.reg_tcg()}, {self.reg_num});
> +        """))
> +
> +class SystemPairDest(Register, Pair, Dest):
> +    def decl_tcg(self, f, tag, regno):
> +        self.decl_reg_num(f, regno)
> +        f.write(code_fmt(f"""\
> +            TCGv_i64 {self.reg_tcg()} = tcg_temp_new_i64();
> +            gen_read_sreg_pair({self.reg_tcg()}, {self.reg_num});

Read needed?

> +        """))
> +    def log_write(self, f, tag):
> +        f.write(code_fmt(f"""\
> +            gen_log_sreg_write_pair(ctx, {self.reg_num}, {self.reg_tcg()});
> +        """))
> +    def analyze_write(self, f, tag, regno):
> +        f.write(code_fmt(f"""\
> +            ctx_log_sreg_write_pair(ctx, {self.reg_num});
> +        """))
> +
> +class SystemPairSource(Register, Pair, OldSource):
> +    def decl_tcg(self, f, tag, regno):
> +        self.decl_reg_num(f, regno)
> +        f.write(code_fmt(f"""\
> +            TCGv_i64 {self.reg_tcg()} = tcg_temp_new_i64();
> +            gen_read_sreg_pair({self.reg_tcg()}, {self.reg_num});
> +        """))
> +


Reply via email to