Merge pull request #101 from RRZE-HPC/feat/m1

Feat/m1
This commit is contained in:
Jan
2023-12-12 10:57:31 -07:00
committed by GitHub
6 changed files with 3956 additions and 8 deletions

View File

@@ -101,7 +101,7 @@ The usage of OSACA can be listed as:
--arch ARCH --arch ARCH
needs to be replaced with the target architecture abbreviation. needs to be replaced with the target architecture abbreviation.
Possible options are ``SNB``, ``IVB``, ``HSW``, ``BDW``, ``SKX``, ``CSX``, ``ICL`` (Client), ``ICX`` (Server) for the latest Intel micro architectures starting from Intel Sandy Bridge and ``ZEN1``, ``ZEN2``, and ``ZEN3`` for AMD Zen architectures. Possible options are ``SNB``, ``IVB``, ``HSW``, ``BDW``, ``SKX``, ``CSX``, ``ICL`` (Client), ``ICX`` (Server) for the latest Intel micro architectures starting from Intel Sandy Bridge and ``ZEN1``, ``ZEN2``, and ``ZEN3`` for AMD Zen architectures.
Furthermore, ``TX2`` for Marvell`s ARM-based ThunderX2 , ``N1`` for ARM's Neoverse, ``A72`` for ARM Cortex-A72, ``TSV110`` for the HiSilicon TaiShan v110, and ``A64FX`` for Fujitsu's HPC ARM architecture are available. Furthermore, ``TX2`` for Marvell`s ARM-based ThunderX2 , ``N1`` for ARM's Neoverse, ``A72`` for ARM Cortex-A72, ``TSV110`` for the HiSilicon TaiShan v110, ``A64FX`` for Fujitsu's HPC ARM architecture, and ``M1`` for the Apple M1-Firestorm performance core are available.
If no micro-architecture is given, OSACA assumes a default architecture for x86/AArch64. If no micro-architecture is given, OSACA assumes a default architecture for x86/AArch64.
--fixed --fixed
Run the throughput analysis with fixed port utilization for all suitable ports per instruction. Run the throughput analysis with fixed port utilization for all suitable ports per instruction.

View File

@@ -850,7 +850,7 @@ instruction_forms:
shape: "*" shape: "*"
source: true source: true
destination: false destination: false
- name: ldp - name: [ldp, ldnp]
operands: operands:
- class: register - class: register
prefix: "*" prefix: "*"
@@ -895,7 +895,7 @@ instruction_forms:
source: true source: true
destination: false destination: false
operation: "op1['name'] = op2['name']; op1['value'] = op2['value']" operation: "op1['name'] = op2['name']; op1['value'] = op2['value']"
- name: stp - name: [stp, stnp]
operands: operands:
- class: register - class: register
prefix: "*" prefix: "*"

3942
osaca/data/m1.yml Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -38,6 +38,7 @@ SUPPORTED_ARCHS = [
"A64FX", "A64FX",
"TSV110", "TSV110",
"A72", "A72",
"M1",
] ]
DEFAULT_ARCHS = { DEFAULT_ARCHS = {
"aarch64": "A64FX", "aarch64": "A64FX",
@@ -101,7 +102,7 @@ def create_parser(parser=None):
"--arch", "--arch",
type=str, type=str,
help="Define architecture (SNB, IVB, HSW, BDW, SKX, CSX, ICL, ICX, ZEN1, ZEN2, ZEN3, TX2, N1, " help="Define architecture (SNB, IVB, HSW, BDW, SKX, CSX, ICL, ICX, ZEN1, ZEN2, ZEN3, TX2, N1, "
"A64FX, TSV110, A72). If no architecture is given, OSACA assumes a default uarch for x86/AArch64.", "A64FX, TSV110, A72, M1). If no architecture is given, OSACA assumes a default uarch for x86/AArch64.",
) )
parser.add_argument( parser.add_argument(
"--fixed", "--fixed",

View File

@@ -382,7 +382,7 @@ class ParserAArch64(BaseParser):
): ):
# resolve ranges and lists # resolve ranges and lists
return self.resolve_range_list(self.process_register_list(operand[self.REGISTER_ID])) return self.resolve_range_list(self.process_register_list(operand[self.REGISTER_ID]))
if self.REGISTER_ID in operand and operand[self.REGISTER_ID]["name"] == "sp": if self.REGISTER_ID in operand and operand[self.REGISTER_ID]["name"].lower() == "sp":
return self.process_sp_register(operand[self.REGISTER_ID]) return self.process_sp_register(operand[self.REGISTER_ID])
# add value attribute to floating point immediates without exponent # add value attribute to floating point immediates without exponent
if self.IMMEDIATE_ID in operand: if self.IMMEDIATE_ID in operand:
@@ -404,9 +404,13 @@ class ParserAArch64(BaseParser):
base = memory_address.get("base", None) base = memory_address.get("base", None)
index = memory_address.get("index", None) index = memory_address.get("index", None)
scale = 1 scale = 1
if base is not None and "name" in base and base["name"] == "sp": if base is not None and "name" in base and base["name"].lower() == "sp":
base["prefix"] = "x" base["prefix"] = "x"
if index is not None and "name" in index and index["name"] == "sp": if index is not None and "name" in index and index["name"].lower() == "sp":
index["prefix"] = "x"
if base is not None and "name" in base and base["name"].lower() == "zr":
base["prefix"] = "x"
if index is not None and "name" in index and index["name"].lower() == "zr":
index["prefix"] = "x" index["prefix"] = "x"
valid_shift_ops = ["lsl", "uxtw", "uxtb", "sxtw"] valid_shift_ops = ["lsl", "uxtw", "uxtb", "sxtw"]
if "index" in memory_address: if "index" in memory_address:

View File

@@ -281,6 +281,7 @@ class MachineModel(object):
"a72": "aarch64", "a72": "aarch64",
"tx2": "aarch64", "tx2": "aarch64",
"n1": "aarch64", "n1": "aarch64",
"m1": "aarch64",
"zen1": "x86", "zen1": "x86",
"zen+": "x86", "zen+": "x86",
"zen2": "x86", "zen2": "x86",
@@ -589,7 +590,7 @@ class MachineModel(object):
return i_operand["class"] == "prfop" return i_operand["class"] == "prfop"
# condition # condition
if "condition" in operand: if "condition" in operand:
if i_operand["ccode"] == self.WILDCARD: if i_operand["class"] == "condition" and i_operand["ccode"] == self.WILDCARD:
return True return True
return i_operand["class"] == "condition" and ( return i_operand["class"] == "condition" and (
operand.get("condition", None) == i_operand.get("ccode", None).upper() operand.get("condition", None) == i_operand.get("ccode", None).upper()