mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-15 06:01:58 -06:00
Hexagon (target/hexagon) Make generators object oriented - gen_helper_protos
Signed-off-by: Taylor Simpson <ltaylorsimpson@gmail.com> Reviewed-by: Brian Cain <bcain@quicinc.com> Message-Id: <20231210220712.491494-4-ltaylorsimpson@gmail.com> Signed-off-by: Brian Cain <bcain@quicinc.com>
This commit is contained in:
parent
b44780740d
commit
c568919f98
2 changed files with 8 additions and 148 deletions
|
@ -22,39 +22,6 @@ import re
|
||||||
import string
|
import string
|
||||||
import hex_common
|
import hex_common
|
||||||
|
|
||||||
##
|
|
||||||
## Helpers for gen_helper_prototype
|
|
||||||
##
|
|
||||||
def_helper_types = {
|
|
||||||
"N": "s32",
|
|
||||||
"O": "s32",
|
|
||||||
"P": "s32",
|
|
||||||
"M": "s32",
|
|
||||||
"C": "s32",
|
|
||||||
"R": "s32",
|
|
||||||
"V": "ptr",
|
|
||||||
"Q": "ptr",
|
|
||||||
}
|
|
||||||
|
|
||||||
def_helper_types_pair = {
|
|
||||||
"R": "s64",
|
|
||||||
"C": "s64",
|
|
||||||
"S": "s64",
|
|
||||||
"G": "s64",
|
|
||||||
"V": "ptr",
|
|
||||||
"Q": "ptr",
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
def gen_def_helper_opn(f, tag, regtype, regid, i):
|
|
||||||
if hex_common.is_pair(regid):
|
|
||||||
f.write(f", {def_helper_types_pair[regtype]}")
|
|
||||||
elif hex_common.is_single(regid):
|
|
||||||
f.write(f", {def_helper_types[regtype]}")
|
|
||||||
else:
|
|
||||||
hex_common.bad_register(regtype, regid)
|
|
||||||
|
|
||||||
|
|
||||||
##
|
##
|
||||||
## Generate the DEF_HELPER prototype for an instruction
|
## Generate the DEF_HELPER prototype for an instruction
|
||||||
## For A2_add: Rd32=add(Rs32,Rt32)
|
## For A2_add: Rd32=add(Rs32,Rt32)
|
||||||
|
@ -65,116 +32,15 @@ def gen_helper_prototype(f, tag, tagregs, tagimms):
|
||||||
regs = tagregs[tag]
|
regs = tagregs[tag]
|
||||||
imms = tagimms[tag]
|
imms = tagimms[tag]
|
||||||
|
|
||||||
numresults = 0
|
declared = []
|
||||||
numscalarresults = 0
|
ret_type = hex_common.helper_ret_type(tag, regs).proto_arg
|
||||||
numscalarreadwrite = 0
|
declared.append(ret_type)
|
||||||
for regtype, regid in regs:
|
|
||||||
if hex_common.is_written(regid):
|
|
||||||
numresults += 1
|
|
||||||
if hex_common.is_scalar_reg(regtype):
|
|
||||||
numscalarresults += 1
|
|
||||||
if hex_common.is_readwrite(regid):
|
|
||||||
if hex_common.is_scalar_reg(regtype):
|
|
||||||
numscalarreadwrite += 1
|
|
||||||
|
|
||||||
if numscalarresults > 1:
|
for arg in hex_common.helper_args(tag, regs, imms):
|
||||||
## The helper is bogus when there is more than one result
|
declared.append(arg.proto_arg)
|
||||||
f.write(f"DEF_HELPER_1({tag}, void, env)\n")
|
|
||||||
else:
|
|
||||||
## Figure out how many arguments the helper will take
|
|
||||||
if numscalarresults == 0:
|
|
||||||
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):
|
|
||||||
def_helper_size += 1
|
|
||||||
if hex_common.need_PC(tag):
|
|
||||||
def_helper_size += 1
|
|
||||||
if hex_common.helper_needs_next_PC(tag):
|
|
||||||
def_helper_size += 1
|
|
||||||
if hex_common.need_condexec_reg(tag, regs):
|
|
||||||
def_helper_size += 1
|
|
||||||
f.write(f"DEF_HELPER_{def_helper_size}({tag}")
|
|
||||||
## The return type is void
|
|
||||||
f.write(", void")
|
|
||||||
else:
|
|
||||||
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):
|
|
||||||
def_helper_size += 1
|
|
||||||
if hex_common.need_PC(tag):
|
|
||||||
def_helper_size += 1
|
|
||||||
if hex_common.need_condexec_reg(tag, regs):
|
|
||||||
def_helper_size += 1
|
|
||||||
if hex_common.helper_needs_next_PC(tag):
|
|
||||||
def_helper_size += 1
|
|
||||||
f.write(f"DEF_HELPER_{def_helper_size}({tag}")
|
|
||||||
|
|
||||||
## Generate the qemu DEF_HELPER type for each result
|
arguments = ", ".join(declared)
|
||||||
## Iterate over this list twice
|
f.write(f"DEF_HELPER_{len(declared) - 1}({tag}, {arguments})\n")
|
||||||
## - Emit the scalar result
|
|
||||||
## - Emit the vector result
|
|
||||||
i = 0
|
|
||||||
for regtype, regid in regs:
|
|
||||||
if hex_common.is_written(regid):
|
|
||||||
if not hex_common.is_hvx_reg(regtype):
|
|
||||||
gen_def_helper_opn(f, tag, regtype, regid, i)
|
|
||||||
i += 1
|
|
||||||
|
|
||||||
## Put the env between the outputs and inputs
|
|
||||||
f.write(", env")
|
|
||||||
i += 1
|
|
||||||
|
|
||||||
# Second pass
|
|
||||||
for regtype, regid in regs:
|
|
||||||
if hex_common.is_written(regid):
|
|
||||||
if hex_common.is_hvx_reg(regtype):
|
|
||||||
gen_def_helper_opn(f, tag, regtype, regid, i)
|
|
||||||
i += 1
|
|
||||||
|
|
||||||
## For conditional instructions, we pass in the destination register
|
|
||||||
if "A_CONDEXEC" in hex_common.attribdict[tag]:
|
|
||||||
for regtype, regid in regs:
|
|
||||||
if hex_common.is_writeonly(regid) and not hex_common.is_hvx_reg(
|
|
||||||
regtype
|
|
||||||
):
|
|
||||||
gen_def_helper_opn(f, tag, regtype, regid, i)
|
|
||||||
i += 1
|
|
||||||
|
|
||||||
## Generate the qemu type for each input operand (regs and immediates)
|
|
||||||
for regtype, regid in regs:
|
|
||||||
if hex_common.is_read(regid):
|
|
||||||
if hex_common.is_hvx_reg(regtype) and hex_common.is_readwrite(regid):
|
|
||||||
continue
|
|
||||||
gen_def_helper_opn(f, tag, regtype, regid, i)
|
|
||||||
i += 1
|
|
||||||
for immlett, bits, immshift in imms:
|
|
||||||
f.write(", s32")
|
|
||||||
|
|
||||||
## 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):
|
|
||||||
f.write(", i32")
|
|
||||||
if hex_common.need_slot(tag):
|
|
||||||
f.write(", i32")
|
|
||||||
if hex_common.need_part1(tag):
|
|
||||||
f.write(" , i32")
|
|
||||||
f.write(")\n")
|
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
|
@ -195,6 +61,7 @@ def main():
|
||||||
if is_idef_parser_enabled:
|
if is_idef_parser_enabled:
|
||||||
hex_common.read_idef_parser_enabled_file(sys.argv[5])
|
hex_common.read_idef_parser_enabled_file(sys.argv[5])
|
||||||
hex_common.calculate_attribs()
|
hex_common.calculate_attribs()
|
||||||
|
hex_common.init_registers()
|
||||||
tagregs = hex_common.get_tagregs()
|
tagregs = hex_common.get_tagregs()
|
||||||
tagimms = hex_common.get_tagimms()
|
tagimms = hex_common.get_tagimms()
|
||||||
|
|
||||||
|
|
|
@ -290,13 +290,6 @@ def need_pkt_has_multi_cof(tag):
|
||||||
def need_pkt_need_commit(tag):
|
def need_pkt_need_commit(tag):
|
||||||
return 'A_IMPLICIT_WRITES_USR' in attribdict[tag]
|
return 'A_IMPLICIT_WRITES_USR' in attribdict[tag]
|
||||||
|
|
||||||
def need_condexec_reg(tag, regs):
|
|
||||||
if "A_CONDEXEC" in attribdict[tag]:
|
|
||||||
for regtype, regid in regs:
|
|
||||||
if is_writeonly(regid) and not is_hvx_reg(regtype):
|
|
||||||
return True
|
|
||||||
return False
|
|
||||||
|
|
||||||
|
|
||||||
def skip_qemu_helper(tag):
|
def skip_qemu_helper(tag):
|
||||||
return tag in overrides.keys()
|
return tag in overrides.keys()
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue