static inline void ctx_log_greg_write_pair(DisasContext *ctx, int rnum)
diff --git a/target/hexagon/hex_common.py b/target/hexagon/hex_common.py
index e33d43e3ce0..c180c19b092 100755
--- a/target/hexagon/hex_common.py
+++ b/target/hexagon/hex_common.py
@@ -1097,11 +1097,24 @@ def analyze_write(self, f, tag, regno):
"""))
class GuestRegister(Register):
- pass
+ 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()});
+ """))
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_i32 {self.reg_tcg()} = tcg_temp_new_i32();
"""))
@@ -1121,6 +1134,7 @@ def decl_reg_num(self, f, regno):
"""))
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_i32 {self.reg_tcg()} = tcg_temp_new_i32();
gen_read_greg({self.reg_tcg()}, {self.reg_num});
@@ -1131,6 +1145,7 @@ def analyze_read(self, f, regno):
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();
"""))
@@ -1150,6 +1165,7 @@ def decl_reg_num(self, f, regno):
"""))
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});