mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-03 15:53:54 -06:00
Hexagon (target/hexagon) Only use branch_taken when packet has multi cof
When a packet has more than one change-of-flow instruction, only the first one to branch is considered. We use the branch_taken variable to keep track of this. However, when there is a single cof instruction, we don't need the same amount of bookkeeping. We add the pkt_has_multi_cof member to the Packet structure, and pass this information to the needed functions. When there is a generated helper function with cof, the generator will pass this pkt_has_multi_cof as a runtime value. Acked-by: Richard Henderson <richard.henderson@linaro.org> Signed-off-by: Taylor Simpson <tsimpson@quicinc.com> Message-Id: <20221108162906.3166-5-tsimpson@quicinc.com>
This commit is contained in:
parent
8e8a85c14e
commit
fb67c2bf24
9 changed files with 51 additions and 16 deletions
|
@ -388,6 +388,7 @@ static void decode_set_insn_attr_fields(Packet *pkt)
|
|||
uint16_t opcode;
|
||||
|
||||
pkt->pkt_has_cof = false;
|
||||
pkt->pkt_has_multi_cof = false;
|
||||
pkt->pkt_has_endloop = false;
|
||||
pkt->pkt_has_dczeroa = false;
|
||||
|
||||
|
@ -412,13 +413,23 @@ static void decode_set_insn_attr_fields(Packet *pkt)
|
|||
}
|
||||
}
|
||||
|
||||
pkt->pkt_has_cof |= decode_opcode_can_jump(opcode);
|
||||
if (decode_opcode_can_jump(opcode)) {
|
||||
if (pkt->pkt_has_cof) {
|
||||
pkt->pkt_has_multi_cof = true;
|
||||
}
|
||||
pkt->pkt_has_cof = true;
|
||||
}
|
||||
|
||||
pkt->insn[i].is_endloop = decode_opcode_ends_loop(opcode);
|
||||
|
||||
pkt->pkt_has_endloop |= pkt->insn[i].is_endloop;
|
||||
|
||||
pkt->pkt_has_cof |= pkt->pkt_has_endloop;
|
||||
if (pkt->pkt_has_endloop) {
|
||||
if (pkt->pkt_has_cof) {
|
||||
pkt->pkt_has_multi_cof = true;
|
||||
}
|
||||
pkt->pkt_has_cof = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue