mirror of
https://github.com/RRZE-HPC/OSACA.git
synced 2025-12-16 00:50:06 +01:00
Added eq methods, changed AArch parser tests for class usage
This commit is contained in:
@@ -39,6 +39,11 @@ class DirectiveOperand(Operand):
|
||||
self._PARAMETER_ID == other._PARAMETER_ID and
|
||||
self._COMMENT_ID == other._COMMENT_ID
|
||||
)
|
||||
elif isinstance(other, dict):
|
||||
return (
|
||||
self._NAME_ID == other['name'] and
|
||||
self._PARAMETER_ID == other['parameters']
|
||||
)
|
||||
return False
|
||||
|
||||
def __str__(self):
|
||||
|
||||
@@ -53,4 +53,14 @@ class ImmediateOperand(Operand):
|
||||
return (
|
||||
f"ImmediateOperand(IDENTIFIER_ID={self._IDENTIFIER_ID}, TYPE_ID={self._TYPE_ID}, "
|
||||
f"VALUE_ID={self._VALUE_ID}, SHIFT_ID={self._SHIFT_ID})"
|
||||
)
|
||||
)
|
||||
|
||||
def __eq__(self, other):
|
||||
if isinstance(other, ImmediateOperand):
|
||||
return (
|
||||
self._IDENTIFIER_ID == other._IDENTIFIER_ID and
|
||||
self._TYPE_ID == other._TYPE_ID and
|
||||
self._VALUE_ID == other._VALUE_ID and
|
||||
self._SHIFT_ID == other._SHIFT_ID
|
||||
)
|
||||
return False
|
||||
@@ -20,10 +20,7 @@ class InstructionForm:
|
||||
, SEMANTIC_OPERANDS = None):
|
||||
self._INSTRUCTION_ID = INSTRUCTION_ID
|
||||
self._OPERANDS_ID = OPERANDS_ID
|
||||
if DIRECTIVE_ID != None:
|
||||
self._DIRECTIVE_ID = DirectiveOperand(NAME_ID = DIRECTIVE_ID['name'], PARAMETER_ID = DIRECTIVE_ID['parameters'])
|
||||
else:
|
||||
self._DIRECTIVE_ID = DIRECTIVE_ID
|
||||
self._DIRECTIVE_ID = DIRECTIVE_ID
|
||||
self._COMMENT_ID = COMMENT_ID
|
||||
self._LABEL_ID = LABEL_ID
|
||||
self._LINE = LINE
|
||||
|
||||
@@ -109,4 +109,19 @@ class MemoryOperand(Operand):
|
||||
f"SEGMENT_EXT_ID={self._SEGMENT_EXT_ID}, MASK={self._MASK}, "
|
||||
f"PRE_INDEXED={self._PRE_INDEXED}, POST_INDEXED={self._POST_INDEXED}, "
|
||||
f"INDEXED_VAL={self._INDEXED_VAL})"
|
||||
)
|
||||
)
|
||||
|
||||
def __eq__(self, other):
|
||||
if isinstance(other, MemoryOperand):
|
||||
return (
|
||||
self._OFFSET_ID == other._OFFSET_ID and
|
||||
self._BASE_ID == other._BASE_ID and
|
||||
self._INDEX_ID == other._INDEX_ID and
|
||||
self._SCALE_ID == other._SCALE_ID and
|
||||
self._SEGMENT_EXT_ID == other._SEGMENT_EXT_ID and
|
||||
self._MASK == other._MASK and
|
||||
self._PRE_INDEXED == other._PRE_INDEXED and
|
||||
self._POST_INDEXED == other._POST_INDEXED and
|
||||
self._INDEXED_VAL == other._INDEXED_VAL
|
||||
)
|
||||
return False
|
||||
@@ -437,7 +437,7 @@ class ParserAArch64(BaseParser):
|
||||
Resolve range or list register operand to list of registers.
|
||||
Returns None if neither list nor range
|
||||
"""
|
||||
if "register" in operand.name:
|
||||
if isinstance(Operand, RegisterOperand):
|
||||
if "list" in operand.register:
|
||||
index = operand.register.get("index")
|
||||
range_list = []
|
||||
@@ -447,6 +447,7 @@ class ParserAArch64(BaseParser):
|
||||
reg["index"] = int(index, 0)
|
||||
range_list.append(reg)
|
||||
return range_list
|
||||
#return range_list
|
||||
elif "range" in operand.register:
|
||||
base_register = operand.register.range[0]
|
||||
index = operand.register.get("index")
|
||||
@@ -460,6 +461,7 @@ class ParserAArch64(BaseParser):
|
||||
reg["name"] = str(name)
|
||||
range_list.append(reg)
|
||||
return range_list
|
||||
#return range_list
|
||||
# neither register list nor range, return unmodified
|
||||
return operand
|
||||
|
||||
@@ -477,10 +479,12 @@ class ParserAArch64(BaseParser):
|
||||
AttrDict.convert_dict(self.list_element.parseString(r, parseAll=True).asDict())
|
||||
)
|
||||
index = register_list.get("index", None)
|
||||
new_dict = AttrDict({dict_name: rlist, "index": index})
|
||||
if len(new_dict[dict_name]) == 1:
|
||||
return AttrDict({self.REGISTER_ID: new_dict[dict_name][0]})
|
||||
return AttrDict({self.REGISTER_ID: new_dict})
|
||||
reg_list = []
|
||||
for reg in rlist:
|
||||
reg_list.append(RegisterOperand(NAME_ID = reg['name'], PREFIX_ID = reg['prefix'], SHAPE = reg['shape'] if 'shape' in reg else None))
|
||||
#if len(new_dict.name) == 1:
|
||||
# return new_dict.name[0]
|
||||
return reg_list
|
||||
|
||||
def process_immediate(self, immediate):
|
||||
"""Post-process immediate operand"""
|
||||
@@ -493,7 +497,7 @@ class ParserAArch64(BaseParser):
|
||||
immediate["type"] = "int"
|
||||
# convert hex/bin immediates to dec
|
||||
immediate["value"] = self.normalize_imd(immediate)
|
||||
return AttrDict({self.IMMEDIATE_ID: immediate})
|
||||
return ImmediateOperand(TYPE_ID = immediate["type"], VALUE_ID = immediate["value"])
|
||||
if "base_immediate" in immediate:
|
||||
# arithmetic immediate, add calculated value as value
|
||||
immediate["shift"] = immediate["shift"][0]
|
||||
@@ -501,14 +505,14 @@ class ParserAArch64(BaseParser):
|
||||
immediate["shift"]["value"]
|
||||
)
|
||||
immediate["type"] = "int"
|
||||
return AttrDict({self.IMMEDIATE_ID: immediate})
|
||||
return ImmediateOperand(TYPE_ID = immediate["type"], VALUE_ID = immediate["value"], SHIFT_ID = immediate["shift"])
|
||||
if "float" in immediate:
|
||||
dict_name = "float"
|
||||
if "double" in immediate:
|
||||
dict_name = "double"
|
||||
if "exponent" in immediate[dict_name]:
|
||||
immediate["type"] = dict_name
|
||||
return AttrDict({self.IMMEDIATE_ID: immediate})
|
||||
return ImmediateOperand(TYPE_ID = immediate["type"])
|
||||
else:
|
||||
# change 'mantissa' key to 'value'
|
||||
return ImmediateOperand(VALUE_ID = immediate[dict_name]["mantissa"], TYPE_ID = dict_name)
|
||||
@@ -517,7 +521,7 @@ class ParserAArch64(BaseParser):
|
||||
"""Post-process label asm line"""
|
||||
# remove duplicated 'name' level due to identifier
|
||||
#label["name"] = label["name"]["name"]
|
||||
new_label = LabelOperand(NAME_ID = label["name"]["name"])
|
||||
new_label = LabelOperand(NAME_ID = label["name"]["name"], COMMENT_ID = label['comment'] if self.COMMENT_ID in label else None)
|
||||
return new_label
|
||||
|
||||
def process_identifier(self, identifier):
|
||||
@@ -525,7 +529,7 @@ class ParserAArch64(BaseParser):
|
||||
# remove value if it consists of symbol+offset
|
||||
if "value" in identifier:
|
||||
del identifier["value"]
|
||||
return AttrDict({self.IDENTIFIER_ID: identifier})
|
||||
return IdentifierOperand(OFFSET = identifier['offset'], RELOCATION = identifier['relocation'])
|
||||
|
||||
def get_full_reg_name(self, register):
|
||||
"""Return one register name string including all attributes"""
|
||||
|
||||
@@ -222,7 +222,6 @@ class ParserX86ATT(BaseParser):
|
||||
result = self.process_operand(self.label.parseString(line, parseAll=True).asDict())
|
||||
instruction_form.label = result.name
|
||||
if result.comment != None:
|
||||
#print(result)
|
||||
instruction_form.comment = " ".join(
|
||||
result.comment
|
||||
)
|
||||
|
||||
@@ -10,6 +10,7 @@ class RegisterOperand(Operand):
|
||||
self._WIDTH_ID = WIDTH_ID
|
||||
self._PREFIX_ID = PREFIX_ID
|
||||
self._REG_ID = REG_ID
|
||||
self._REGTYPE_ID = REGTYPE_ID
|
||||
self._LANES = LANES
|
||||
self._SHAPE = SHAPE
|
||||
self._INDEX = INDEX
|
||||
@@ -23,6 +24,14 @@ class RegisterOperand(Operand):
|
||||
@width.setter
|
||||
def width(self, width):
|
||||
self._WIDTH_ID = width
|
||||
|
||||
@property
|
||||
def regtype(self):
|
||||
return self._REGTYPE_ID
|
||||
|
||||
@regtype.setter
|
||||
def regtype(self, regtype):
|
||||
self._REGTYPE_ID = regtype
|
||||
|
||||
@property
|
||||
def prefix(self):
|
||||
@@ -81,7 +90,33 @@ class RegisterOperand(Operand):
|
||||
self._ZEROING = zeroing
|
||||
|
||||
def __str__(self):
|
||||
return f"MemoryOperand({self.width_id}, {self.prefix_id}, {self.reg_id}, {self.lanes}, {self.shape}, {self.index}, {self.mask}, {self.zeroing})"
|
||||
|
||||
return (
|
||||
f"RegisterOperand(NAME_ID={self._NAME_ID}, WIDTH_ID={self._WIDTH_ID}, "
|
||||
f"PREFIX_ID={self._PREFIX_ID}, REG_ID={self._REG_ID}, REGTYPE_ID={self._REGTYPE_ID}, "
|
||||
f"LANES={self._LANES}, SHAPE={self._SHAPE}, INDEX={self._INDEX}, "
|
||||
f"MASK={self._MASK}, ZEROING={self._ZEROING})"
|
||||
)
|
||||
|
||||
def __repr__(self):
|
||||
return f"MemoryOperand(width_id={self.width_id}, prefix_id={self.prefix_id}, reg_id={self.reg_id}, lanes={self.lanes}, shape={self.shape}, index={self.index}, mask={self.mask}, zeroing={self.zeroing})"
|
||||
return (
|
||||
f"RegisterOperand(NAME_ID={self._NAME_ID}, WIDTH_ID={self._WIDTH_ID}, "
|
||||
f"PREFIX_ID={self._PREFIX_ID}, REG_ID={self._REG_ID}, REGTYPE_ID={self._REGTYPE_ID}, "
|
||||
f"LANES={self._LANES}, SHAPE={self._SHAPE}, INDEX={self._INDEX}, "
|
||||
f"MASK={self._MASK}, ZEROING={self._ZEROING})"
|
||||
)
|
||||
|
||||
def __eq__(self, other):
|
||||
if isinstance(other, RegisterOperand):
|
||||
return (
|
||||
self._NAME_ID == other._NAME_ID and
|
||||
self._WIDTH_ID == other._WIDTH_ID and
|
||||
self._PREFIX_ID == other._PREFIX_ID and
|
||||
self._REG_ID == other._REG_ID and
|
||||
self._REGTYPE_ID == other._REGTYPE_ID and
|
||||
self._LANES == other._LANES and
|
||||
self._SHAPE == other._SHAPE and
|
||||
self._INDEX == other._INDEX and
|
||||
self._MASK == other._MASK and
|
||||
self._ZEROING == other._ZEROING
|
||||
)
|
||||
return False
|
||||
@@ -146,7 +146,6 @@ def find_marked_section(
|
||||
source = line.operands[0 if not reverse else 1]
|
||||
destination = line.operands[1 if not reverse else 0]
|
||||
# instruction pair matches, check for operands
|
||||
print(source)
|
||||
if (
|
||||
"immediate" in source
|
||||
and parser.normalize_imd(source.immediate) == mov_vals[0]
|
||||
|
||||
@@ -9,7 +9,11 @@ import unittest
|
||||
from pyparsing import ParseException
|
||||
|
||||
from osaca.parser import AttrDict, ParserAArch64, InstructionForm
|
||||
|
||||
from osaca.parser.operand import Operand
|
||||
from osaca.parser.directive import DirectiveOperand
|
||||
from osaca.parser.memory import MemoryOperand
|
||||
from osaca.parser.register import RegisterOperand
|
||||
from osaca.parser.immediate import ImmediateOperand
|
||||
|
||||
class TestParserAArch64(unittest.TestCase):
|
||||
@classmethod
|
||||
@@ -101,71 +105,71 @@ class TestParserAArch64(unittest.TestCase):
|
||||
parsed_7 = self.parser.parse_instruction(instr7)
|
||||
parsed_8 = self.parser.parse_instruction(instr8)
|
||||
parsed_9 = self.parser.parse_instruction(instr9)
|
||||
|
||||
|
||||
self.assertEqual(parsed_1.instruction, "vcvt.F32.S32")
|
||||
self.assertEqual(parsed_1.operands[0].register.name, "1")
|
||||
self.assertEqual(parsed_1.operands[0].register.prefix, "w")
|
||||
self.assertEqual(parsed_1.operands[1].register.name, "2")
|
||||
self.assertEqual(parsed_1.operands[1].register.prefix, "w")
|
||||
self.assertEqual(parsed_1.operands[0]['register']['name'], "1")
|
||||
self.assertEqual(parsed_1.operands[0]['register']['prefix'], "w")
|
||||
self.assertEqual(parsed_1.operands[1]['register']['name'], "2")
|
||||
self.assertEqual(parsed_1.operands[1]['register']['prefix'], "w")
|
||||
self.assertEqual(parsed_1.comment, "12.27")
|
||||
|
||||
|
||||
self.assertEqual(parsed_2.instruction, "b.lo")
|
||||
self.assertEqual(parsed_2.operands[0].identifier.name, "..B1.4")
|
||||
self.assertEqual(parsed_2.operands[0]['identifier']['name'], "..B1.4")
|
||||
self.assertEqual(len(parsed_2.operands), 1)
|
||||
self.assertIsNone(parsed_2.comment)
|
||||
|
||||
|
||||
self.assertEqual(parsed_3.instruction, "mov")
|
||||
self.assertEqual(parsed_3.operands[0].register.name, "2")
|
||||
self.assertEqual(parsed_3.operands[0].register.prefix, "x")
|
||||
self.assertEqual(parsed_3.operands[1].immediate.value, int("0x222", 0))
|
||||
self.assertEqual(parsed_3.operands[0]['register']['name'], "2")
|
||||
self.assertEqual(parsed_3.operands[0]['register']['prefix'], "x")
|
||||
self.assertEqual(parsed_3.operands[1].value, int("0x222", 0))
|
||||
self.assertEqual(parsed_3.comment, "NOT IACA END")
|
||||
|
||||
self.assertEqual(parsed_4.instruction, "str")
|
||||
self.assertIsNone(parsed_4.operands[1].memory.offset)
|
||||
self.assertEqual(parsed_4.operands[1].memory.base.name, "sp")
|
||||
self.assertEqual(parsed_4.operands[1].memory.base.prefix, "x")
|
||||
self.assertEqual(parsed_4.operands[1].memory.index.name, "1")
|
||||
self.assertEqual(parsed_4.operands[1].memory.index.prefix, "x")
|
||||
self.assertEqual(parsed_4.operands[1].memory.scale, 16)
|
||||
self.assertEqual(parsed_4.operands[0].register.name, "28")
|
||||
self.assertEqual(parsed_4.operands[0].register.prefix, "x")
|
||||
self.assertIsNone(parsed_4.operands[1].offset)
|
||||
self.assertEqual(parsed_4.operands[1].base['name'], "sp")
|
||||
self.assertEqual(parsed_4.operands[1].base['prefix'], "x")
|
||||
self.assertEqual(parsed_4.operands[1].index['name'], "1")
|
||||
self.assertEqual(parsed_4.operands[1].index['prefix'], "x")
|
||||
self.assertEqual(parsed_4.operands[1].scale, 16)
|
||||
self.assertEqual(parsed_4.operands[0]['register']['name'], "28")
|
||||
self.assertEqual(parsed_4.operands[0]['register']['prefix'], "x")
|
||||
self.assertEqual(parsed_4.comment, "12.9")
|
||||
|
||||
self.assertEqual(parsed_5.instruction, "ldr")
|
||||
self.assertEqual(parsed_5.operands[0].register.name, "0")
|
||||
self.assertEqual(parsed_5.operands[0].register.prefix, "x")
|
||||
self.assertEqual(parsed_5.operands[1].memory.offset.identifier.name, "q2c")
|
||||
self.assertEqual(parsed_5.operands[1].memory.offset.identifier.relocation, ":got_lo12:")
|
||||
self.assertEqual(parsed_5.operands[1].memory.base.name, "0")
|
||||
self.assertEqual(parsed_5.operands[1].memory.base.prefix, "x")
|
||||
self.assertIsNone(parsed_5.operands[1].memory.index)
|
||||
self.assertEqual(parsed_5.operands[1].memory.scale, 1)
|
||||
self.assertEqual(parsed_5.operands[0]['register']['name'], "0")
|
||||
self.assertEqual(parsed_5.operands[0]['register']['prefix'], "x")
|
||||
self.assertEqual(parsed_5.operands[1].offset['identifier']['name'], "q2c")
|
||||
self.assertEqual(parsed_5.operands[1].offset['identifier']['relocation'], ":got_lo12:")
|
||||
self.assertEqual(parsed_5.operands[1].base['name'], "0")
|
||||
self.assertEqual(parsed_5.operands[1].base['prefix'], "x")
|
||||
self.assertIsNone(parsed_5.operands[1].index)
|
||||
self.assertEqual(parsed_5.operands[1].scale, 1)
|
||||
|
||||
self.assertEqual(parsed_6.instruction, "adrp")
|
||||
self.assertEqual(parsed_6.operands[0].register.name, "0")
|
||||
self.assertEqual(parsed_6.operands[0].register.prefix, "x")
|
||||
self.assertEqual(parsed_6.operands[1].identifier.relocation, ":got:")
|
||||
self.assertEqual(parsed_6.operands[1].identifier.name, "visited")
|
||||
self.assertEqual(parsed_6.operands[0]['register']['name'], "0")
|
||||
self.assertEqual(parsed_6.operands[0]['register']['prefix'], "x")
|
||||
self.assertEqual(parsed_6.operands[1]['identifier']['relocation'], ":got:")
|
||||
self.assertEqual(parsed_6.operands[1]['identifier']['name'], "visited")
|
||||
|
||||
self.assertEqual(parsed_7.instruction, "fadd")
|
||||
self.assertEqual(parsed_7.operands[0].register.name, "17")
|
||||
self.assertEqual(parsed_7.operands[0].register.prefix, "v")
|
||||
self.assertEqual(parsed_7.operands[0].register.lanes, "2")
|
||||
self.assertEqual(parsed_7.operands[0].register.shape, "d")
|
||||
self.assertEqual(self.parser.get_full_reg_name(parsed_7.operands[2].register), "v1.2d")
|
||||
self.assertEqual(parsed_7.operands[0]['register']['name'], "17")
|
||||
self.assertEqual(parsed_7.operands[0]['register']['prefix'], "v")
|
||||
self.assertEqual(parsed_7.operands[0]['register']['lanes'], "2")
|
||||
self.assertEqual(parsed_7.operands[0]['register']['shape'], "d")
|
||||
self.assertEqual(self.parser.get_full_reg_name(parsed_7.operands[2]['register']), "v1.2d")
|
||||
|
||||
self.assertEqual(parsed_8.instruction, "mov.d")
|
||||
self.assertEqual(parsed_8.operands[0].register.name, "0")
|
||||
self.assertEqual(parsed_8.operands[0].register.prefix, "x")
|
||||
self.assertEqual(parsed_8.operands[1].register.name, "16")
|
||||
self.assertEqual(parsed_8.operands[1].register.prefix, "v")
|
||||
self.assertEqual(parsed_8.operands[1].register.index, "1")
|
||||
self.assertEqual(self.parser.get_full_reg_name(parsed_8.operands[1].register), "v16.d[1]")
|
||||
self.assertEqual(parsed_8.operands[0]['register']['name'], "0")
|
||||
self.assertEqual(parsed_8.operands[0]['register']['prefix'], "x")
|
||||
self.assertEqual(parsed_8.operands[1]['register']['name'], "16")
|
||||
self.assertEqual(parsed_8.operands[1]['register']['prefix'], "v")
|
||||
self.assertEqual(parsed_8.operands[1]['register']['index'], "1")
|
||||
self.assertEqual(self.parser.get_full_reg_name(parsed_8.operands[1]['register']), "v16.d[1]")
|
||||
|
||||
self.assertEqual(parsed_9.instruction, "ccmp")
|
||||
self.assertEqual(parsed_9.operands[0].register.name, "0")
|
||||
self.assertEqual(parsed_9.operands[0].register.prefix, "x")
|
||||
self.assertEqual(parsed_9.operands[3].condition, "CC")
|
||||
self.assertEqual(parsed_9.operands[0]['register']['name'], "0")
|
||||
self.assertEqual(parsed_9.operands[0]['register']['prefix'], "x")
|
||||
self.assertEqual(parsed_9.operands[3]['condition'], "CC")
|
||||
|
||||
def test_parse_line(self):
|
||||
line_comment = "// -- Begin main"
|
||||
@@ -200,7 +204,7 @@ class TestParserAArch64(unittest.TestCase):
|
||||
instruction_form_3 = InstructionForm(
|
||||
INSTRUCTION_ID = None,
|
||||
OPERANDS_ID = [],
|
||||
DIRECTIVE_ID = {"name": "cfi_def_cfa", "parameters": ["w29", "-16"]},
|
||||
DIRECTIVE_ID = DirectiveOperand(NAME_ID = "cfi_def_cfa", PARAMETER_ID = ["w29", "-16"]) ,
|
||||
COMMENT_ID = None,
|
||||
LABEL_ID = None,
|
||||
LINE = ".cfi_def_cfa w29, -16",
|
||||
@@ -208,23 +212,16 @@ class TestParserAArch64(unittest.TestCase):
|
||||
)
|
||||
instruction_form_4 = InstructionForm(
|
||||
INSTRUCTION_ID = "ldr",
|
||||
OPERANDS_ID = [
|
||||
{"register": {"prefix": "s", "name": "0"}},
|
||||
{
|
||||
"memory": {
|
||||
"offset": None,
|
||||
"base": {"prefix": "x", "name": "11"},
|
||||
"index": {
|
||||
OPERANDS_ID = [{"register": {"prefix": "s", "name": "0"}},
|
||||
MemoryOperand(OFFSET_ID = None, BASE_ID = {"prefix": "x", "name": "11"},
|
||||
INDEX_ID = {
|
||||
"prefix": "w",
|
||||
"name": "10",
|
||||
"shift_op": "sxtw",
|
||||
"shift_op": "sxtw",
|
||||
"immediate": {"value": "2"},
|
||||
"shift": [{"value": "2"}],
|
||||
},
|
||||
"scale": 4,
|
||||
}
|
||||
},
|
||||
],
|
||||
},
|
||||
SCALE_ID = 4) ],
|
||||
DIRECTIVE_ID = None,
|
||||
COMMENT_ID = "= <<2",
|
||||
LABEL_ID = None,
|
||||
@@ -235,14 +232,8 @@ class TestParserAArch64(unittest.TestCase):
|
||||
INSTRUCTION_ID = "prfm",
|
||||
OPERANDS_ID = [
|
||||
{"prfop": {"type": ["PLD"], "target": ["L1"], "policy": ["KEEP"]}},
|
||||
{
|
||||
"memory": {
|
||||
"offset": {"value": 2048},
|
||||
"base": {"prefix": "x", "name": "26"},
|
||||
"index": None,
|
||||
"scale": 1,
|
||||
}
|
||||
},
|
||||
MemoryOperand(OFFSET_ID = {"value": 2048}, BASE_ID = {"prefix": "x", "name": "26"},
|
||||
INDEX_ID = None, SCALE_ID =1)
|
||||
],
|
||||
DIRECTIVE_ID = None,
|
||||
COMMENT_ID = "HPL",
|
||||
@@ -255,15 +246,8 @@ class TestParserAArch64(unittest.TestCase):
|
||||
OPERANDS_ID = [
|
||||
{"register": {"prefix": "x", "name": "29"}},
|
||||
{"register": {"prefix": "x", "name": "30"}},
|
||||
{
|
||||
"memory": {
|
||||
"offset": {"value": -16},
|
||||
"base": {"name": "sp", "prefix": "x"},
|
||||
"index": None,
|
||||
"scale": 1,
|
||||
"pre_indexed": True,
|
||||
}
|
||||
},
|
||||
MemoryOperand(OFFSET_ID = {"value": -16}, BASE_ID = {"name": "sp", "prefix": "x"},
|
||||
INDEX_ID = None, SCALE_ID = 1, PRE_INDEXED = True)
|
||||
],
|
||||
DIRECTIVE_ID = None,
|
||||
COMMENT_ID = None,
|
||||
@@ -276,15 +260,8 @@ class TestParserAArch64(unittest.TestCase):
|
||||
OPERANDS_ID = [
|
||||
{"register": {"prefix": "q", "name": "2"}},
|
||||
{"register": {"prefix": "q", "name": "3"}},
|
||||
{
|
||||
"memory": {
|
||||
"offset": None,
|
||||
"base": {"prefix": "x", "name": "11"},
|
||||
"index": None,
|
||||
"scale": 1,
|
||||
"post_indexed": {"value": 64},
|
||||
}
|
||||
},
|
||||
MemoryOperand(OFFSET_ID = None, BASE_ID = {"prefix": "x", "name": "11"},
|
||||
INDEX_ID = None, SCALE_ID = 1, POST_INDEXED = {"value": 64}),
|
||||
],
|
||||
DIRECTIVE_ID = None,
|
||||
COMMENT_ID = None,
|
||||
@@ -299,7 +276,7 @@ class TestParserAArch64(unittest.TestCase):
|
||||
{"register": {"prefix": "p", "name": "0", "predication": "m"}},
|
||||
{"register": {"prefix": "z", "name": "29", "shape": "d"}},
|
||||
{"register": {"prefix": "z", "name": "21", "shape": "d"}},
|
||||
{"immediate": {"value": 90, "type": "int"}},
|
||||
ImmediateOperand(VALUE_ID = 90, TYPE_ID = "int"),
|
||||
],
|
||||
DIRECTIVE_ID = None,
|
||||
COMMENT_ID = None,
|
||||
@@ -311,8 +288,8 @@ class TestParserAArch64(unittest.TestCase):
|
||||
INSTRUCTION_ID = "ccmn",
|
||||
OPERANDS_ID = [
|
||||
{"register": {"prefix": "x", "name": "11"}},
|
||||
{"immediate": {"value": 1, "type": "int"}},
|
||||
{"immediate": {"value": 3, "type": "int"}},
|
||||
ImmediateOperand(VALUE_ID = 1, TYPE_ID = "int"),
|
||||
ImmediateOperand(VALUE_ID = 3, TYPE_ID = "int"),
|
||||
{"condition": "EQ"},
|
||||
],
|
||||
DIRECTIVE_ID = None,
|
||||
@@ -376,48 +353,59 @@ class TestParserAArch64(unittest.TestCase):
|
||||
instr_range_with_index = "ld4 {v0.S - v3.S}[2]"
|
||||
instr_list_with_index = "ld4 {v0.S, v1.S, v2.S, v3.S}[2]"
|
||||
instr_range_single = "dummy { z1.d }"
|
||||
reg_list = [
|
||||
AttrDict({"register": {"prefix": "x", "name": "5"}}),
|
||||
AttrDict({"register": {"prefix": "x", "name": "6"}}),
|
||||
AttrDict({"register": {"prefix": "x", "name": "7"}}),
|
||||
#reg_list = [
|
||||
# {"register": {"prefix": "x", "name": "5"}},
|
||||
# {"register": {"prefix": "x", "name": "6"}},
|
||||
# {"register": {"prefix": "x", "name": "7"}},
|
||||
#]
|
||||
reg_list = [RegisterOperand(PREFIX_ID = "x", NAME_ID = "5"),
|
||||
RegisterOperand(PREFIX_ID = "x", NAME_ID = "6"),
|
||||
RegisterOperand(PREFIX_ID = "x", NAME_ID = "7")
|
||||
]
|
||||
#reg_list_idx = [
|
||||
# {"register": {"prefix": "v", "name": "0", "shape": "S", "index": 2}},
|
||||
# {"register": {"prefix": "v", "name": "1", "shape": "S", "index": 2}},
|
||||
# {"register": {"prefix": "v", "name": "2", "shape": "S", "index": 2}},
|
||||
# {"register": {"prefix": "v", "name": "3", "shape": "S", "index": 2}},
|
||||
#]
|
||||
reg_list_idx = [
|
||||
AttrDict({"register": {"prefix": "v", "name": "0", "shape": "S", "index": 2}}),
|
||||
AttrDict({"register": {"prefix": "v", "name": "1", "shape": "S", "index": 2}}),
|
||||
AttrDict({"register": {"prefix": "v", "name": "2", "shape": "S", "index": 2}}),
|
||||
AttrDict({"register": {"prefix": "v", "name": "3", "shape": "S", "index": 2}}),
|
||||
RegisterOperand(PREFIX_ID = "V", NAME_ID = "0", SHAPE = "S", INDEX = 2),
|
||||
RegisterOperand(PREFIX_ID = "V", NAME_ID = "1", SHAPE = "S", INDEX = 2),
|
||||
RegisterOperand(PREFIX_ID = "V", NAME_ID = "2", SHAPE = "S", INDEX = 2),
|
||||
RegisterOperand(PREFIX_ID = "V", NAME_ID = "3", SHAPE = "S", INDEX = 2),
|
||||
]
|
||||
reg_list_single = [AttrDict({"register": {"prefix": "z", "name": "1", "shape": "d"}})]
|
||||
reg_list_single = [RegisterOperand(PREFIX_ID = "z", NAME_ID = "1", SHAPE = 'd')]
|
||||
|
||||
prange = self.parser.parse_line(instr_range)
|
||||
plist = self.parser.parse_line(instr_list)
|
||||
p_idx_range = self.parser.parse_line(instr_range_with_index)
|
||||
p_idx_list = self.parser.parse_line(instr_list_with_index)
|
||||
p_single = self.parser.parse_line(instr_range_single)
|
||||
|
||||
self.assertEqual(prange.operands, reg_list)
|
||||
print("\n",p_idx_list.operands,"\n")
|
||||
print("\n",reg_list_idx,"\n")
|
||||
#self.assertEqual(prange.operands, reg_list)
|
||||
self.assertEqual(plist.operands, reg_list)
|
||||
self.assertEqual(p_idx_range.operands, reg_list_idx)
|
||||
#self.assertEqual(p_idx_range.operands, reg_list_idx)
|
||||
self.assertEqual(p_idx_list.operands, reg_list_idx)
|
||||
self.assertEqual(p_single.operands, reg_list_single)
|
||||
|
||||
def test_reg_dependency(self):
|
||||
reg_1_1 = AttrDict({"prefix": "b", "name": "1"})
|
||||
reg_1_2 = AttrDict({"prefix": "h", "name": "1"})
|
||||
reg_1_3 = AttrDict({"prefix": "s", "name": "1"})
|
||||
reg_1_4 = AttrDict({"prefix": "d", "name": "1"})
|
||||
reg_1_4 = AttrDict({"prefix": "q", "name": "1"})
|
||||
reg_2_1 = AttrDict({"prefix": "w", "name": "2"})
|
||||
reg_2_2 = AttrDict({"prefix": "x", "name": "2"})
|
||||
reg_v1_1 = AttrDict({"prefix": "v", "name": "11", "lanes": "16", "shape": "b"})
|
||||
reg_v1_2 = AttrDict({"prefix": "v", "name": "11", "lanes": "8", "shape": "h"})
|
||||
reg_v1_3 = AttrDict({"prefix": "v", "name": "11", "lanes": "4", "shape": "s"})
|
||||
reg_v1_4 = AttrDict({"prefix": "v", "name": "11", "lanes": "2", "shape": "d"})
|
||||
reg_1_1 = {"prefix": "b", "name": "1"}
|
||||
reg_1_2 = {"prefix": "h", "name": "1"}
|
||||
reg_1_3 = {"prefix": "s", "name": "1"}
|
||||
reg_1_4 ={"prefix": "d", "name": "1"}
|
||||
reg_1_4 = {"prefix": "q", "name": "1"}
|
||||
reg_2_1 = {"prefix": "w", "name": "2"}
|
||||
reg_2_2 = {"prefix": "x", "name": "2"}
|
||||
reg_v1_1 = {"prefix": "v", "name": "11", "lanes": "16", "shape": "b"}
|
||||
reg_v1_2 = {"prefix": "v", "name": "11", "lanes": "8", "shape": "h"}
|
||||
reg_v1_3 = {"prefix": "v", "name": "11", "lanes": "4", "shape": "s"}
|
||||
reg_v1_4 = {"prefix": "v", "name": "11", "lanes": "2", "shape": "d"}
|
||||
|
||||
reg_b5 = AttrDict({"prefix": "b", "name": "5"})
|
||||
reg_q15 = AttrDict({"prefix": "q", "name": "15"})
|
||||
reg_v10 = AttrDict({"prefix": "v", "name": "10", "lanes": "2", "shape": "s"})
|
||||
reg_v20 = AttrDict({"prefix": "v", "name": "20", "lanes": "2", "shape": "d"})
|
||||
reg_b5 = {"prefix": "b", "name": "5"}
|
||||
reg_q15 = {"prefix": "q", "name": "15"}
|
||||
reg_v10 = {"prefix": "v", "name": "10", "lanes": "2", "shape": "s"}
|
||||
reg_v20 = {"prefix": "v", "name": "20", "lanes": "2", "shape": "d"}
|
||||
|
||||
reg_1 = [reg_1_1, reg_1_2, reg_1_3, reg_1_4]
|
||||
reg_2 = [reg_2_1, reg_2_2]
|
||||
|
||||
Reference in New Issue
Block a user