mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-02 07:13:54 -06:00
Hexagon (target/hexagon) Short-circuit packet register writes
In certain cases, we can avoid the overhead of writing to hex_new_value and write directly to hex_gpr. We add need_commit field to DisasContext indicating if the end-of-packet commit is needed. If it is not needed, get_result_gpr() and get_result_gpr_pair() can return hex_gpr. We pass the ctx->need_commit to helpers when needed. Finally, we can early-exit from gen_reg_writes during packet commit. There are a few instructions whose semantics write to the result before reading all the inputs. Therefore, the idef-parser generated code is incompatible with short-circuit. We tell idef-parser to skip them. For debugging purposes, we add a cpu property to turn off short-circuit. When the short-circuit property is false, we skip the analysis and force the end-of-packet commit. Here's a simple example of the TCG generated for 0x004000b4: 0x7800c020 { R0 = #0x1 } BEFORE: ---- 004000b4 movi_i32 new_r0,$0x1 mov_i32 r0,new_r0 AFTER: ---- 004000b4 movi_i32 r0,$0x1 This patch reintroduces a use of check_for_attrib, so we remove the G_GNUC_UNUSED added earlier in this series. Signed-off-by: Taylor Simpson <tsimpson@quicinc.com> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Reviewed-by: Brian Cain <bcain@quicinc.com> Message-Id: <20230427230012.3800327-12-tsimpson@quicinc.com>
This commit is contained in:
parent
b9f0326bf7
commit
d54c56156f
16 changed files with 128 additions and 30 deletions
|
@ -86,6 +86,8 @@ def gen_helper_prototype(f, tag, tagregs, tagimms):
|
|||
def_helper_size = len(regs) + len(imms) + numscalarreadwrite + 1
|
||||
if hex_common.need_pkt_has_multi_cof(tag):
|
||||
def_helper_size += 1
|
||||
if hex_common.need_pkt_need_commit(tag):
|
||||
def_helper_size += 1
|
||||
if hex_common.need_part1(tag):
|
||||
def_helper_size += 1
|
||||
if hex_common.need_slot(tag):
|
||||
|
@ -103,6 +105,8 @@ def gen_helper_prototype(f, tag, tagregs, tagimms):
|
|||
def_helper_size = len(regs) + len(imms) + numscalarreadwrite
|
||||
if hex_common.need_pkt_has_multi_cof(tag):
|
||||
def_helper_size += 1
|
||||
if hex_common.need_pkt_need_commit(tag):
|
||||
def_helper_size += 1
|
||||
if hex_common.need_part1(tag):
|
||||
def_helper_size += 1
|
||||
if hex_common.need_slot(tag):
|
||||
|
@ -156,10 +160,12 @@ def gen_helper_prototype(f, tag, tagregs, tagimms):
|
|||
for immlett, bits, immshift in imms:
|
||||
f.write(", s32")
|
||||
|
||||
## Add the arguments for the instruction pkt_has_multi_cof, slot and
|
||||
## part1 (if needed)
|
||||
## Add the arguments for the instruction pkt_has_multi_cof,
|
||||
## pkt_needs_commit, PC, next_PC, slot, and part1 (if needed)
|
||||
if hex_common.need_pkt_has_multi_cof(tag):
|
||||
f.write(", i32")
|
||||
if hex_common.need_pkt_need_commit(tag):
|
||||
f.write(', i32')
|
||||
if hex_common.need_PC(tag):
|
||||
f.write(", i32")
|
||||
if hex_common.helper_needs_next_PC(tag):
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue