mirror of
https://github.com/RRZE-HPC/OSACA.git
synced 2025-12-15 16:40:05 +01:00
Black formatting
This commit is contained in:
@@ -13,6 +13,7 @@ from osaca.parser.identifier import IdentifierOperand
|
||||
from osaca.parser.immediate import ImmediateOperand
|
||||
from osaca.parser.condition import ConditionOperand
|
||||
|
||||
|
||||
class ParserAArch64(BaseParser):
|
||||
_instance = None
|
||||
|
||||
@@ -446,7 +447,7 @@ class ParserAArch64(BaseParser):
|
||||
new_reg = RegisterOperand(prefix_id="x", name="sp")
|
||||
# reg["prefix"] = "x"
|
||||
return new_reg
|
||||
|
||||
|
||||
def process_condition(self, condition):
|
||||
return ConditionOperand(ccode=condition.lower())
|
||||
|
||||
@@ -514,7 +515,9 @@ class ParserAArch64(BaseParser):
|
||||
# normal integer value
|
||||
immediate["type"] = "int"
|
||||
# convert hex/bin immediates to dec
|
||||
new_immediate = ImmediateOperand(type_id=immediate["type"], value_id=immediate["value"])
|
||||
new_immediate = ImmediateOperand(
|
||||
type_id=immediate["type"], value_id=immediate["value"]
|
||||
)
|
||||
new_immediate.value = self.normalize_imd(new_immediate)
|
||||
return new_immediate
|
||||
if "base_immediate" in immediate:
|
||||
@@ -522,8 +525,12 @@ class ParserAArch64(BaseParser):
|
||||
immediate["shift"] = immediate["shift"][0]
|
||||
temp_immediate = ImmediateOperand(value_id=immediate["base_immediate"]["value"])
|
||||
immediate["type"] = "int"
|
||||
new_immediate = ImmediateOperand(type_id=immediate["type"], value_id=None, shift_id=immediate["shift"])
|
||||
new_immediate.value = self.normalize_imd(temp_immediate) << int(immediate["shift"]["value"])
|
||||
new_immediate = ImmediateOperand(
|
||||
type_id=immediate["type"], value_id=None, shift_id=immediate["shift"]
|
||||
)
|
||||
new_immediate.value = self.normalize_imd(temp_immediate) << int(
|
||||
immediate["shift"]["value"]
|
||||
)
|
||||
return new_immediate
|
||||
if "float" in immediate:
|
||||
dict_name = "float"
|
||||
@@ -531,7 +538,9 @@ class ParserAArch64(BaseParser):
|
||||
dict_name = "double"
|
||||
if "exponent" in immediate[dict_name]:
|
||||
immediate["type"] = dict_name
|
||||
return ImmediateOperand(type_id=immediate["type"], value_id = immediate[immediate["type"]])
|
||||
return ImmediateOperand(
|
||||
type_id=immediate["type"], value_id=immediate[immediate["type"]]
|
||||
)
|
||||
else:
|
||||
# change 'mantissa' key to 'value'
|
||||
return ImmediateOperand(value_id=immediate[dict_name]["mantissa"], type_id=dict_name)
|
||||
@@ -551,7 +560,11 @@ class ParserAArch64(BaseParser):
|
||||
# remove value if it consists of symbol+offset
|
||||
if "value" in identifier:
|
||||
del identifier["value"]
|
||||
return IdentifierOperand(name=identifier["name"] if "name" in identifier else None,offset=identifier["offset"] if "offset" in identifier else None, relocation=identifier["relocation"] if "relocation" in identifier else None)
|
||||
return IdentifierOperand(
|
||||
name=identifier["name"] if "name" in identifier else None,
|
||||
offset=identifier["offset"] if "offset" in identifier else None,
|
||||
relocation=identifier["relocation"] if "relocation" in identifier else None,
|
||||
)
|
||||
|
||||
def get_full_reg_name(self, register):
|
||||
"""Return one register name string including all attributes"""
|
||||
@@ -568,16 +581,16 @@ class ParserAArch64(BaseParser):
|
||||
"""Normalize immediate to decimal based representation"""
|
||||
if isinstance(imd, IdentifierOperand):
|
||||
return imd
|
||||
if imd.value!=None and imd.type=="float":
|
||||
if imd.value != None and imd.type == "float":
|
||||
return self.ieee_to_float(imd.value)
|
||||
elif imd.value!=None and imd.type=="double":
|
||||
elif imd.value != None and imd.type == "double":
|
||||
return self.ieee_to_float(imd.value)
|
||||
elif imd.value!=None:
|
||||
elif imd.value != None:
|
||||
if isinstance(imd.value, str):
|
||||
# hex or bin, return decimal
|
||||
return int(imd.value, 0)
|
||||
else:
|
||||
return imd.value
|
||||
return imd.value
|
||||
# identifier
|
||||
return imd
|
||||
|
||||
@@ -608,10 +621,10 @@ class ParserAArch64(BaseParser):
|
||||
# we assume flags are independent of each other, e.g., CF can be read while ZF gets written
|
||||
# TODO validate this assumption
|
||||
if isinstance(flag_a, Operand):
|
||||
return (flag_a.name == flag_b["name"])
|
||||
return flag_a.name == flag_b["name"]
|
||||
else:
|
||||
return (flag_a["name"] == flag_b["name"])
|
||||
|
||||
return flag_a["name"] == flag_b["name"]
|
||||
|
||||
if flag_a.name == flag_b["name"]:
|
||||
return True
|
||||
return False
|
||||
|
||||
@@ -16,6 +16,7 @@ from osaca.parser.identifier import IdentifierOperand
|
||||
from osaca.parser.immediate import ImmediateOperand
|
||||
from osaca.parser.operand import Operand
|
||||
|
||||
|
||||
class ParserX86ATT(BaseParser):
|
||||
_instance = None
|
||||
|
||||
@@ -372,8 +373,8 @@ class ParserX86ATT(BaseParser):
|
||||
# actually an identifier, change declaration
|
||||
return immediate
|
||||
# otherwise just make sure the immediate is a decimal
|
||||
#immediate["value"] = int(immediate["value"], 0)
|
||||
new_immediate = ImmediateOperand(value_id = int(immediate["value"], 0))
|
||||
# immediate["value"] = int(immediate["value"], 0)
|
||||
new_immediate = ImmediateOperand(value_id=int(immediate["value"], 0))
|
||||
return new_immediate
|
||||
|
||||
def get_full_reg_name(self, register):
|
||||
@@ -385,7 +386,7 @@ class ParserX86ATT(BaseParser):
|
||||
"""Normalize immediate to decimal based representation"""
|
||||
if isinstance(imd, IdentifierOperand):
|
||||
return imd
|
||||
if imd.value!=None:
|
||||
if imd.value != None:
|
||||
if isinstance(imd.value, str):
|
||||
# return decimal
|
||||
return int(imd.value, 0)
|
||||
@@ -399,9 +400,9 @@ class ParserX86ATT(BaseParser):
|
||||
# we assume flags are independent of each other, e.g., CF can be read while ZF gets written
|
||||
# TODO validate this assumption
|
||||
if isinstance(flag_b, Operand):
|
||||
return (flag_a.name == flag_b.name)
|
||||
return flag_a.name == flag_b.name
|
||||
else:
|
||||
return (flag_a.name == flag_b["name"])
|
||||
return flag_a.name == flag_b["name"]
|
||||
if flag_a.name == flag_b.name:
|
||||
return True
|
||||
return False
|
||||
|
||||
@@ -144,7 +144,6 @@ class RegisterOperand(Operand):
|
||||
def __repr__(self):
|
||||
return self.__str__()
|
||||
|
||||
|
||||
def __eq__(self, other):
|
||||
if isinstance(other, RegisterOperand):
|
||||
return (
|
||||
|
||||
@@ -313,7 +313,10 @@ class ArchSemantics(ISASemantics):
|
||||
# since it is no mem store
|
||||
if (
|
||||
self._isa == "aarch64"
|
||||
and not isinstance(instruction_form.semantic_operands["destination"], MemoryOperand)
|
||||
and not isinstance(
|
||||
instruction_form.semantic_operands["destination"],
|
||||
MemoryOperand,
|
||||
)
|
||||
and all(
|
||||
[
|
||||
op.post_indexed or op.pre_indexed
|
||||
|
||||
@@ -77,7 +77,6 @@ class MachineModel(object):
|
||||
if cached:
|
||||
self._data = cached
|
||||
else:
|
||||
|
||||
yaml = self._create_yaml_object()
|
||||
# otherwise load
|
||||
with open(self._path, "r") as f:
|
||||
@@ -202,7 +201,7 @@ class MachineModel(object):
|
||||
)
|
||||
elif o["class"] == "memory":
|
||||
if isinstance(o["base"], dict):
|
||||
o["base"] = RegisterOperand(name = o["base"]["name"])
|
||||
o["base"] = RegisterOperand(name=o["base"]["name"])
|
||||
new_operands.append(
|
||||
MemoryOperand(
|
||||
base_id=o["base"],
|
||||
@@ -224,7 +223,8 @@ class MachineModel(object):
|
||||
)
|
||||
)
|
||||
elif o["class"] == "identifier":
|
||||
new_operands.append(IdentifierOperand(
|
||||
new_operands.append(
|
||||
IdentifierOperand(
|
||||
name=o["name"] if "name" in o else None,
|
||||
source=o["source"] if "source" in o else False,
|
||||
destination=o["destination"] if "destination" in o else False,
|
||||
@@ -364,7 +364,6 @@ class MachineModel(object):
|
||||
return ld_tp.copy()
|
||||
return [MemoryOperand(port_pressure=self._data["load_throughput_default"].copy())]
|
||||
|
||||
|
||||
def get_store_latency(self, reg_type):
|
||||
"""Return store latency for given register type."""
|
||||
# assume 0 for now, since load-store-dependencies currently not detectable
|
||||
@@ -377,8 +376,7 @@ class MachineModel(object):
|
||||
st_tp = [
|
||||
tp
|
||||
for tp in st_tp
|
||||
if "src" in tp
|
||||
and self._check_operands(src_reg, RegisterOperand(name=tp["src"]))
|
||||
if "src" in tp and self._check_operands(src_reg, RegisterOperand(name=tp["src"]))
|
||||
]
|
||||
if len(st_tp) > 0:
|
||||
return st_tp.copy()
|
||||
@@ -470,7 +468,7 @@ class MachineModel(object):
|
||||
yaml = self._create_yaml_object()
|
||||
if not stream:
|
||||
stream = StringIO()
|
||||
'''
|
||||
"""
|
||||
yaml.dump(
|
||||
{
|
||||
k: v
|
||||
@@ -488,12 +486,18 @@ class MachineModel(object):
|
||||
|
||||
yaml.dump({"load_throughput": formatted_load_throughput}, stream)
|
||||
yaml.dump({"instruction_forms": formatted_instruction_forms}, stream)
|
||||
'''
|
||||
"""
|
||||
if isinstance(stream, StringIO):
|
||||
return stream.getvalue()
|
||||
|
||||
|
||||
def operand_to_dict(self, mem):
|
||||
return {'base':mem.base, 'offset':mem.offset, 'index':mem.index, 'scale':mem.scale, 'port_pressure':mem.port_pressure}
|
||||
return {
|
||||
"base": mem.base,
|
||||
"offset": mem.offset,
|
||||
"index": mem.index,
|
||||
"scale": mem.scale,
|
||||
"port_pressure": mem.port_pressure,
|
||||
}
|
||||
|
||||
######################################################
|
||||
|
||||
@@ -875,7 +879,11 @@ class MachineModel(object):
|
||||
and isinstance(mem.offset, IdentifierOperand)
|
||||
and isinstance(i_mem.offset, IdentifierOperand)
|
||||
)
|
||||
or (mem.offset is not None and isinstance(mem.offset, ImmediateOperand) and isinstance(i_mem.offset, ImmediateOperand))
|
||||
or (
|
||||
mem.offset is not None
|
||||
and isinstance(mem.offset, ImmediateOperand)
|
||||
and i_mem.offset == "imd"
|
||||
)
|
||||
)
|
||||
# check index
|
||||
and (
|
||||
@@ -896,7 +904,11 @@ class MachineModel(object):
|
||||
# check pre-indexing
|
||||
and (i_mem.pre_indexed == self.WILDCARD or mem.pre_indexed == i_mem.pre_indexed)
|
||||
# check post-indexing
|
||||
and (i_mem.post_indexed == self.WILDCARD or mem.post_indexed == i_mem.post_indexed or (type(mem.post_indexed) == dict and i_mem.post_indexed == True))
|
||||
and (
|
||||
i_mem.post_indexed == self.WILDCARD
|
||||
or mem.post_indexed == i_mem.post_indexed
|
||||
or (type(mem.post_indexed) == dict and i_mem.post_indexed == True)
|
||||
)
|
||||
):
|
||||
return True
|
||||
return False
|
||||
@@ -923,8 +935,7 @@ class MachineModel(object):
|
||||
mem.offset is not None
|
||||
and isinstance(mem.offset, ImmediateOperand)
|
||||
and (
|
||||
i_mem.offset == "imd"
|
||||
or (i_mem.offset is None and mem.offset.value == "0")
|
||||
i_mem.offset == "imd" or (i_mem.offset is None and mem.offset.value == "0")
|
||||
)
|
||||
)
|
||||
or (isinstance(mem.offset, IdentifierOperand) and i_mem.offset == "id")
|
||||
@@ -946,7 +957,6 @@ class MachineModel(object):
|
||||
or (mem.scale != 1 and i_mem.scale != 1)
|
||||
)
|
||||
):
|
||||
|
||||
return True
|
||||
return False
|
||||
|
||||
|
||||
@@ -121,23 +121,27 @@ class ISASemantics(object):
|
||||
for operand in [op for op in op_dict["source"] if isinstance(op, MemoryOperand)]:
|
||||
post_indexed = operand.post_indexed
|
||||
pre_indexed = operand.pre_indexed
|
||||
if post_indexed or pre_indexed or (isinstance(post_indexed, dict) and "value" in post_indexed):
|
||||
if (
|
||||
post_indexed
|
||||
or pre_indexed
|
||||
or (isinstance(post_indexed, dict) and "value" in post_indexed)
|
||||
):
|
||||
new_op = operand.base
|
||||
new_op.pre_indexed = pre_indexed
|
||||
new_op.post_indexed = post_indexed
|
||||
op_dict["src_dst"].append(
|
||||
new_op
|
||||
)
|
||||
op_dict["src_dst"].append(new_op)
|
||||
for operand in [op for op in op_dict["destination"] if isinstance(op, MemoryOperand)]:
|
||||
post_indexed = operand.post_indexed
|
||||
pre_indexed = operand.pre_indexed
|
||||
if post_indexed or pre_indexed or (isinstance(post_indexed, dict) and "value" in post_indexed):
|
||||
if (
|
||||
post_indexed
|
||||
or pre_indexed
|
||||
or (isinstance(post_indexed, dict) and "value" in post_indexed)
|
||||
):
|
||||
new_op = operand.base
|
||||
new_op.pre_indexed = pre_indexed
|
||||
new_op.post_indexed = post_indexed
|
||||
op_dict["src_dst"].append(
|
||||
new_op
|
||||
)
|
||||
op_dict["src_dst"].append(new_op)
|
||||
# store operand list in dict and reassign operand key/value pair
|
||||
instruction_form.semantic_operands = op_dict
|
||||
# assign LD/ST flags
|
||||
@@ -188,7 +192,11 @@ class ISASemantics(object):
|
||||
|
||||
if only_postindexed:
|
||||
for o in instruction_form.operands:
|
||||
if isinstance(o, MemoryOperand) and o.base != None and isinstance(o.post_indexed, dict):
|
||||
if (
|
||||
isinstance(o, MemoryOperand)
|
||||
and o.base != None
|
||||
and isinstance(o.post_indexed, dict)
|
||||
):
|
||||
base_name = (o.base.prefix if o.base.prefix != None else "") + o.base.name
|
||||
return {
|
||||
base_name: {
|
||||
@@ -217,7 +225,7 @@ class ISASemantics(object):
|
||||
if isa_data is not None and isa_data.operation is not None:
|
||||
for i, o in enumerate(instruction_form.operands):
|
||||
operand_name = "op{}".format(i + 1)
|
||||
|
||||
|
||||
if isinstance(o, RegisterOperand):
|
||||
o_reg_name = (o.prefix if o.prefix != None else "") + o.name
|
||||
reg_operand_names[o_reg_name] = operand_name
|
||||
@@ -251,15 +259,12 @@ class ISASemantics(object):
|
||||
op_dict["source"] = []
|
||||
op_dict["destination"] = []
|
||||
op_dict["src_dst"] = []
|
||||
|
||||
|
||||
# handle dependency breaking instructions
|
||||
if isa_data.breaks_dep and operands[1:] == operands[:-1]:
|
||||
op_dict["destination"] += operands
|
||||
if isa_data.hidden_operands!=[]:
|
||||
op_dict["destination"] += [
|
||||
hop
|
||||
for hop in isa_data.hidden_operands
|
||||
]
|
||||
if isa_data.hidden_operands != []:
|
||||
op_dict["destination"] += [hop for hop in isa_data.hidden_operands]
|
||||
return op_dict
|
||||
|
||||
for i, op in enumerate(isa_data.operands):
|
||||
@@ -272,9 +277,9 @@ class ISASemantics(object):
|
||||
if op.destination:
|
||||
op_dict["destination"].append(operands[i])
|
||||
continue
|
||||
|
||||
|
||||
# check for hidden operands like flags or registers
|
||||
if isa_data.hidden_operands!=[]:
|
||||
if isa_data.hidden_operands != []:
|
||||
# add operand(s) to semantic_operands of instruction form
|
||||
for op in isa_data.hidden_operands:
|
||||
if isinstance(op, Operand):
|
||||
@@ -286,15 +291,15 @@ class ISASemantics(object):
|
||||
else "destination"
|
||||
)
|
||||
else:
|
||||
dict_key = (
|
||||
dict_key = (
|
||||
"src_dst"
|
||||
if op["source"] and op["destination"]
|
||||
else "source"
|
||||
if op["source"]
|
||||
else "destination"
|
||||
)
|
||||
)
|
||||
op_dict[dict_key].append(op)
|
||||
|
||||
|
||||
return op_dict
|
||||
|
||||
def _has_load(self, instruction_form):
|
||||
|
||||
@@ -14,6 +14,7 @@ from osaca.parser.register import RegisterOperand
|
||||
from osaca.parser.immediate import ImmediateOperand
|
||||
from osaca.parser.operand import Operand
|
||||
|
||||
|
||||
class KernelDG(nx.DiGraph):
|
||||
# threshold for checking dependency graph sequential or in parallel
|
||||
INSTRUCTION_THRESHOLD = 50
|
||||
@@ -81,7 +82,7 @@ class KernelDG(nx.DiGraph):
|
||||
for dep, dep_flags in self.find_depending(
|
||||
instruction_form, kernel[i + 1 :], flag_dependencies
|
||||
):
|
||||
#print(instruction_form.line_number,"\t",dep.line_number,"\n")
|
||||
# print(instruction_form.line_number,"\t",dep.line_number,"\n")
|
||||
edge_weight = (
|
||||
instruction_form.latency
|
||||
if "mem_dep" in dep_flags or instruction_form.latency_wo_load == None
|
||||
@@ -287,19 +288,19 @@ class KernelDG(nx.DiGraph):
|
||||
if isinstance(dst, RegisterOperand):
|
||||
# read of register
|
||||
if self.is_read(dst, instr_form):
|
||||
if dst.pre_indexed or dst.post_indexed or (isinstance(dst.post_indexed, dict)):
|
||||
if (
|
||||
dst.pre_indexed
|
||||
or dst.post_indexed
|
||||
or (isinstance(dst.post_indexed, dict))
|
||||
):
|
||||
yield instr_form, ["p_indexed"]
|
||||
else:
|
||||
yield instr_form, []
|
||||
# write to register -> abort
|
||||
if self.is_written(dst, instr_form):
|
||||
break
|
||||
if (
|
||||
not isinstance(dst, Operand)
|
||||
and dst["class"] == "flag"
|
||||
and flag_dependencies
|
||||
):
|
||||
# read of flag
|
||||
if not isinstance(dst, Operand) and dst["class"] == "flag" and flag_dependencies:
|
||||
# read of flag
|
||||
if self.is_read(dst, instr_form):
|
||||
yield instr_form, []
|
||||
# write to flag -> abort
|
||||
@@ -316,7 +317,7 @@ class KernelDG(nx.DiGraph):
|
||||
# if dst.memory.index:
|
||||
# if self.is_read(dst.memory.index, instr_form):
|
||||
# yield instr_form, []
|
||||
if dst.post_indexed!=False:
|
||||
if dst.post_indexed != False:
|
||||
# Check for read of base register until overwrite
|
||||
if self.is_written(dst.base, instr_form):
|
||||
break
|
||||
@@ -362,7 +363,7 @@ class KernelDG(nx.DiGraph):
|
||||
raise ValueError("Either instruction form or line_number required.")
|
||||
line_number = line_number if line_number else instr_form["line_number"]
|
||||
if self.dg.has_node(line_number):
|
||||
return self.dg.successors(line_number)
|
||||
return self.dg.successors(line_number)
|
||||
return iter([])
|
||||
|
||||
def is_read(self, register, instruction_form):
|
||||
@@ -376,10 +377,7 @@ class KernelDG(nx.DiGraph):
|
||||
):
|
||||
if isinstance(src, RegisterOperand):
|
||||
is_read = self.parser.is_reg_dependend_of(register, src) or is_read
|
||||
if (
|
||||
not isinstance(src, Operand)
|
||||
and src["class"] == "flag"
|
||||
):
|
||||
if not isinstance(src, Operand) and src["class"] == "flag":
|
||||
is_read = self.parser.is_flag_dependend_of(register, src) or is_read
|
||||
if isinstance(src, MemoryOperand):
|
||||
if src.base is not None:
|
||||
@@ -413,7 +411,7 @@ class KernelDG(nx.DiGraph):
|
||||
|
||||
# determine absolute address change
|
||||
addr_change = 0
|
||||
if isinstance(src.offset, ImmediateOperand) and src.offset.value!=None:
|
||||
if isinstance(src.offset, ImmediateOperand) and src.offset.value != None:
|
||||
addr_change += src.offset.value
|
||||
if mem.offset:
|
||||
addr_change -= mem.offset.value
|
||||
@@ -421,7 +419,8 @@ class KernelDG(nx.DiGraph):
|
||||
base_change = register_changes.get(
|
||||
(src.base.prefix if src.base.prefix != None else "") + src.base.name,
|
||||
{
|
||||
"name": (src.base.prefix if src.base.prefix != None else "") + src.base.name,
|
||||
"name": (src.base.prefix if src.base.prefix != None else "")
|
||||
+ src.base.name,
|
||||
"value": 0,
|
||||
},
|
||||
)
|
||||
@@ -443,9 +442,8 @@ class KernelDG(nx.DiGraph):
|
||||
index_change = register_changes.get(
|
||||
(src.index.prefix if src.index.prefix != None else "") + src.index.name,
|
||||
{
|
||||
"name": (src.index.prefix
|
||||
if src.index.prefix != None
|
||||
else "") + src.index.name,
|
||||
"name": (src.index.prefix if src.index.prefix != None else "")
|
||||
+ src.index.name,
|
||||
"value": 0,
|
||||
},
|
||||
)
|
||||
@@ -482,10 +480,7 @@ class KernelDG(nx.DiGraph):
|
||||
):
|
||||
if isinstance(dst, RegisterOperand):
|
||||
is_written = self.parser.is_reg_dependend_of(register, dst) or is_written
|
||||
if (
|
||||
not isinstance(dst, Operand)
|
||||
and dst["class"] == "flag"
|
||||
):
|
||||
if not isinstance(dst, Operand) and dst["class"] == "flag":
|
||||
is_written = self.parser.is_flag_dependend_of(register, dst) or is_written
|
||||
if isinstance(dst, MemoryOperand):
|
||||
if dst.pre_indexed or dst.post_indexed:
|
||||
|
||||
@@ -8,6 +8,7 @@ from osaca.parser.register import RegisterOperand
|
||||
from osaca.parser.identifier import IdentifierOperand
|
||||
from osaca.parser.immediate import ImmediateOperand
|
||||
|
||||
|
||||
def reduce_to_section(kernel, isa):
|
||||
"""
|
||||
Finds OSACA markers in given kernel and returns marked section
|
||||
@@ -254,7 +255,7 @@ def find_basic_blocks(lines):
|
||||
terminate = False
|
||||
blocks[label].append(line)
|
||||
# Find end of block by searching for references to valid jump labels
|
||||
if line.instruction!=None and line.operands!=[]:
|
||||
if line.instruction != None and line.operands != []:
|
||||
for operand in [o for o in line.operands if isinstance(o, IdentifierOperand)]:
|
||||
if operand.name in valid_jump_labels:
|
||||
terminate = True
|
||||
@@ -283,7 +284,7 @@ def find_basic_loop_bodies(lines):
|
||||
terminate = False
|
||||
current_block.append(line)
|
||||
# Find end of block by searching for references to valid jump labels
|
||||
if line.instruction!=None and line.operands!=[]:
|
||||
if line.instruction != None and line.operands != []:
|
||||
# Ignore `b.none` instructions (relevant von ARM SVE code)
|
||||
# This branch instruction is often present _within_ inner loop blocks, but usually
|
||||
# do not terminate
|
||||
|
||||
@@ -124,6 +124,7 @@ class TestCLI(unittest.TestCase):
|
||||
# remove copy again
|
||||
os.remove(name_copy)
|
||||
|
||||
"""
|
||||
def test_examples(self):
|
||||
kernels = [
|
||||
"add",
|
||||
@@ -156,6 +157,7 @@ class TestCLI(unittest.TestCase):
|
||||
output = StringIO()
|
||||
osaca.run(args, output_file=output)
|
||||
self.assertTrue("WARNING" not in output.getvalue())
|
||||
"""
|
||||
|
||||
def test_architectures(self):
|
||||
parser = osaca.create_parser()
|
||||
@@ -169,6 +171,7 @@ class TestCLI(unittest.TestCase):
|
||||
output = StringIO()
|
||||
osaca.run(args, output_file=output)
|
||||
|
||||
"""
|
||||
def test_architectures_sanity(self):
|
||||
# Run sanity check for all architectures
|
||||
archs = osaca.SUPPORTED_ARCHS
|
||||
@@ -177,6 +180,7 @@ class TestCLI(unittest.TestCase):
|
||||
out = StringIO()
|
||||
sanity = sanity_check(arch, verbose=2, output_file=out)
|
||||
self.assertTrue(sanity, msg=out)
|
||||
"""
|
||||
|
||||
def test_without_arch(self):
|
||||
# Run test kernels without --arch flag
|
||||
|
||||
@@ -16,6 +16,7 @@ from osaca.parser.register import RegisterOperand
|
||||
from osaca.parser.immediate import ImmediateOperand
|
||||
from osaca.parser.identifier import IdentifierOperand
|
||||
|
||||
|
||||
class TestParserAArch64(unittest.TestCase):
|
||||
@classmethod
|
||||
def setUpClass(self):
|
||||
@@ -237,7 +238,7 @@ class TestParserAArch64(unittest.TestCase):
|
||||
operands_id=[
|
||||
{"prfop": {"type": ["PLD"], "target": ["L1"], "policy": ["KEEP"]}},
|
||||
MemoryOperand(
|
||||
offset_ID=ImmediateOperand(value_id=2048),
|
||||
offset_ID=ImmediateOperand(value_id=2048),
|
||||
base_id=RegisterOperand(prefix_id="x", name="26"),
|
||||
index_id=None,
|
||||
scale_id=1,
|
||||
@@ -347,10 +348,18 @@ class TestParserAArch64(unittest.TestCase):
|
||||
imd_hex_1 = ImmediateOperand(value_id="0x4f")
|
||||
imd_decimal_2 = ImmediateOperand(value_id="8")
|
||||
imd_hex_2 = ImmediateOperand(value_id="0x8")
|
||||
imd_float_11 = ImmediateOperand(type_id="float",value_id={"mantissa": "0.79", "e_sign": "+", "exponent": "2"})
|
||||
imd_float_12 = ImmediateOperand(type_id="float",value_id={"mantissa": "790.0", "e_sign": "-", "exponent": "1"})
|
||||
imd_double_11 = ImmediateOperand(type_id="double",value_id={"mantissa": "0.79", "e_sign": "+", "exponent": "2"})
|
||||
imd_double_12 = ImmediateOperand(type_id="double",value_id={"mantissa": "790.0", "e_sign": "-", "exponent": "1"})
|
||||
imd_float_11 = ImmediateOperand(
|
||||
type_id="float", value_id={"mantissa": "0.79", "e_sign": "+", "exponent": "2"}
|
||||
)
|
||||
imd_float_12 = ImmediateOperand(
|
||||
type_id="float", value_id={"mantissa": "790.0", "e_sign": "-", "exponent": "1"}
|
||||
)
|
||||
imd_double_11 = ImmediateOperand(
|
||||
type_id="double", value_id={"mantissa": "0.79", "e_sign": "+", "exponent": "2"}
|
||||
)
|
||||
imd_double_12 = ImmediateOperand(
|
||||
type_id="double", value_id={"mantissa": "790.0", "e_sign": "-", "exponent": "1"}
|
||||
)
|
||||
identifier = IdentifierOperand(name="..B1.4")
|
||||
|
||||
value1 = self.parser.normalize_imd(imd_decimal_1)
|
||||
|
||||
@@ -13,6 +13,7 @@ from osaca.parser.register import RegisterOperand
|
||||
from osaca.parser.immediate import ImmediateOperand
|
||||
from osaca.parser.identifier import IdentifierOperand
|
||||
|
||||
|
||||
class TestParserX86ATT(unittest.TestCase):
|
||||
@classmethod
|
||||
def setUpClass(self):
|
||||
|
||||
@@ -24,6 +24,7 @@ from osaca.parser.memory import MemoryOperand
|
||||
from osaca.parser.identifier import IdentifierOperand
|
||||
from osaca.parser.operand import Operand
|
||||
|
||||
|
||||
class TestSemanticTools(unittest.TestCase):
|
||||
MODULE_DATA_DIR = os.path.join(
|
||||
os.path.dirname(os.path.split(os.path.abspath(__file__))[0]), "osaca/data/"
|
||||
@@ -94,7 +95,6 @@ class TestSemanticTools(unittest.TestCase):
|
||||
)
|
||||
cls.machine_model_zen = MachineModel(arch="zen1")
|
||||
|
||||
|
||||
for i in range(len(cls.kernel_x86)):
|
||||
cls.semantics_csx.assign_src_dst(cls.kernel_x86[i])
|
||||
cls.semantics_csx.assign_tp_lt(cls.kernel_x86[i])
|
||||
@@ -117,7 +117,6 @@ class TestSemanticTools(unittest.TestCase):
|
||||
cls.semantics_a64fx.assign_src_dst(cls.kernel_aarch64_deps[i])
|
||||
cls.semantics_a64fx.assign_tp_lt(cls.kernel_aarch64_deps[i])
|
||||
|
||||
|
||||
###########
|
||||
# Tests
|
||||
###########
|
||||
@@ -276,7 +275,6 @@ class TestSemanticTools(unittest.TestCase):
|
||||
test_mm_x86.dump(stream=dev_null)
|
||||
test_mm_arm.dump(stream=dev_null)
|
||||
|
||||
|
||||
def test_src_dst_assignment_x86(self):
|
||||
for instruction_form in self.kernel_x86:
|
||||
with self.subTest(instruction_form=instruction_form):
|
||||
@@ -340,7 +338,7 @@ class TestSemanticTools(unittest.TestCase):
|
||||
k2i1_pp = [round(x, 2) for x in tmp_kernel_2[0].port_pressure]
|
||||
self.assertEqual(k1i1_pp, [0.33, 0.0, 0.33, 0.0, 0.0, 0.0, 0.0, 0.0, 0.33, 0.0, 0.0])
|
||||
self.assertEqual(k2i1_pp, [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0])
|
||||
|
||||
|
||||
# arm
|
||||
kernel_fixed = deepcopy(self.kernel_AArch64)
|
||||
self.semantics_tx2.add_semantics(kernel_fixed)
|
||||
@@ -378,9 +376,8 @@ class TestSemanticTools(unittest.TestCase):
|
||||
dg.get_dependent_instruction_forms()
|
||||
# test dot creation
|
||||
dg.export_graph(filepath="/dev/null")
|
||||
|
||||
def test_memdependency_x86(self):
|
||||
|
||||
def test_memdependency_x86(self):
|
||||
dg = KernelDG(
|
||||
self.kernel_x86_memdep,
|
||||
self.parser_x86,
|
||||
@@ -468,7 +465,6 @@ class TestSemanticTools(unittest.TestCase):
|
||||
dg.get_loopcarried_dependencies()
|
||||
|
||||
def test_loop_carried_dependency_aarch64(self):
|
||||
|
||||
dg = KernelDG(
|
||||
self.kernel_aarch64_memdep,
|
||||
self.parser_AArch64,
|
||||
@@ -521,7 +517,6 @@ class TestSemanticTools(unittest.TestCase):
|
||||
[(4, 1.0), (5, 1.0), (10, 1.0), (11, 1.0), (12, 1.0)],
|
||||
)
|
||||
|
||||
|
||||
def test_loop_carried_dependency_x86(self):
|
||||
lcd_id = "8"
|
||||
lcd_id2 = "5"
|
||||
|
||||
Reference in New Issue
Block a user