diff options
author | Taylor Simpson <ltaylorsimpson@gmail.com> | 2024-03-06 20:23:22 -0700 |
---|---|---|
committer | Brian Cain <bcain@quicinc.com> | 2024-05-05 16:22:07 -0700 |
commit | 4614b8f36a319ca77c004b8c5002e68d9ae25061 (patch) | |
tree | 0e03241dba99cbe2570fb56af5bbcf7314078ed1 | |
parent | 325a64af065d855a022696f5e4180f2813b439c8 (diff) | |
download | qemu-4614b8f36a319ca77c004b8c5002e68d9ae25061.zip qemu-4614b8f36a319ca77c004b8c5002e68d9ae25061.tar.gz qemu-4614b8f36a319ca77c004b8c5002e68d9ae25061.tar.bz2 |
Hexagon (target/hexagon) Mark has_pred_dest in trans functions
Check that the value matches opcode_wregs
Signed-off-by: Taylor Simpson <ltaylorsimpson@gmail.com>
Reviewed-by: Brian Cain <bcain@quicinc.com>
Message-Id: <20240307032327.4799-5-ltaylorsimpson@gmail.com>
Signed-off-by: Brian Cain <bcain@quicinc.com>
-rw-r--r-- | target/hexagon/decode.c | 3 | ||||
-rwxr-xr-x | target/hexagon/gen_trans_funcs.py | 5 | ||||
-rw-r--r-- | target/hexagon/insn.h | 1 |
3 files changed, 9 insertions, 0 deletions
diff --git a/target/hexagon/decode.c b/target/hexagon/decode.c index a4d8500..84a3899 100644 --- a/target/hexagon/decode.c +++ b/target/hexagon/decode.c @@ -366,6 +366,9 @@ static void decode_shuffle_for_execution(Packet *packet) for (flag = false, i = 0; i < last_insn + 1; i++) { int opcode = packet->insn[i].opcode; + g_assert(packet->insn[i].has_pred_dest == + (strstr(opcode_wregs[opcode], "Pd4") || + strstr(opcode_wregs[opcode], "Pe4"))); if ((strstr(opcode_wregs[opcode], "Pd4") || strstr(opcode_wregs[opcode], "Pe4")) && GET_ATTRIB(opcode, A_STORE) == 0) { diff --git a/target/hexagon/gen_trans_funcs.py b/target/hexagon/gen_trans_funcs.py index 1201172..9f86b4e 100755 --- a/target/hexagon/gen_trans_funcs.py +++ b/target/hexagon/gen_trans_funcs.py @@ -70,6 +70,7 @@ def mark_which_imm_extended(f, tag): ## insn->regno[2] = args->Rt; ## insn->new_read_idx = -1; ## insn->dest_idx = 0; +## insn->has_pred_dest = false; ## return true; ## } ## @@ -88,6 +89,7 @@ def gen_trans_funcs(f): new_read_idx = -1 dest_idx = -1 + has_pred_dest = "false" for regno, (reg_type, reg_id, *_) in enumerate(regs): reg = hex_common.get_register(tag, reg_type, reg_id) f.write(code_fmt(f"""\ @@ -98,6 +100,8 @@ def gen_trans_funcs(f): # dest_idx should be the first destination, so check for -1 if reg.is_written() and dest_idx == -1: dest_idx = regno + if reg_type == "P" and reg.is_written() and not reg.is_read(): + has_pred_dest = "true" if len(imms) != 0: mark_which_imm_extended(f, tag) @@ -121,6 +125,7 @@ def gen_trans_funcs(f): f.write(code_fmt(f"""\ insn->new_read_idx = {new_read_idx}; insn->dest_idx = {dest_idx}; + insn->has_pred_dest = {has_pred_dest}; """)) f.write(textwrap.dedent(f"""\ return true; diff --git a/target/hexagon/insn.h b/target/hexagon/insn.h index a770379..24dcf7f 100644 --- a/target/hexagon/insn.h +++ b/target/hexagon/insn.h @@ -41,6 +41,7 @@ struct Instruction { uint32_t new_value_producer_slot:4; int32_t new_read_idx; int32_t dest_idx; + bool has_pred_dest; bool part1; /* * cmp-jumps are split into two insns. |