mirror of
https://github.com/RRZE-HPC/OSACA.git
synced 2025-12-15 16:40:05 +01:00
166 lines
3.8 KiB
Python
166 lines
3.8 KiB
Python
#!/usr/bin/env python3
|
|
|
|
from osaca.parser.operand import Operand
|
|
|
|
|
|
class MemoryOperand(Operand):
|
|
def __init__(
|
|
self,
|
|
offset=None,
|
|
base=None,
|
|
index=None,
|
|
scale=1,
|
|
segment_ext=None,
|
|
mask=None,
|
|
pre_indexed=False,
|
|
post_indexed=False,
|
|
indexed_val=None,
|
|
data_type=None,
|
|
src=None,
|
|
dst=None,
|
|
source=False,
|
|
destination=False,
|
|
):
|
|
super().__init__(source, destination)
|
|
self._offset = offset
|
|
self._base = base
|
|
self._index = index
|
|
self._scale = scale
|
|
self._segment_ext = segment_ext
|
|
self._mask = mask
|
|
self._pre_indexed = pre_indexed
|
|
self._post_indexed = post_indexed
|
|
self._indexed_val = indexed_val
|
|
self._data_type = data_type
|
|
# type of register we store from (`src`) or load to (`dst`)
|
|
self._src = src
|
|
self._dst = dst
|
|
|
|
@property
|
|
def offset(self):
|
|
return self._offset
|
|
|
|
@property
|
|
def immediate(self):
|
|
return self._immediate_id
|
|
|
|
@property
|
|
def base(self):
|
|
return self._base
|
|
|
|
@property
|
|
def index(self):
|
|
return self._index
|
|
|
|
@property
|
|
def scale(self):
|
|
return self._scale
|
|
|
|
@property
|
|
def segment_ext(self):
|
|
return self._segment_ext
|
|
|
|
@property
|
|
def mask(self):
|
|
return self._mask
|
|
|
|
@property
|
|
def pre_indexed(self):
|
|
return self._pre_indexed
|
|
|
|
@property
|
|
def post_indexed(self):
|
|
return self._post_indexed
|
|
|
|
@property
|
|
def indexed_val(self):
|
|
return self._indexed_val
|
|
|
|
@property
|
|
def data_type(self):
|
|
return self._data_type
|
|
|
|
@data_type.setter
|
|
def data_type(self, data_type):
|
|
self._data_type = data_type
|
|
|
|
@property
|
|
def src(self):
|
|
return self._src
|
|
|
|
@src.setter
|
|
def src(self, src):
|
|
self._src = src
|
|
|
|
@property
|
|
def dst(self):
|
|
return self._dst
|
|
|
|
@dst.setter
|
|
def dst(self, dst):
|
|
self._dst = dst
|
|
|
|
@segment_ext.setter
|
|
def segment_ext(self, segment):
|
|
self._segment_ext = segment
|
|
|
|
@offset.setter
|
|
def offset(self, offset):
|
|
self._offset = offset
|
|
|
|
@base.setter
|
|
def base(self, base):
|
|
self._base = base
|
|
|
|
@index.setter
|
|
def index(self, index):
|
|
self._index = index
|
|
|
|
@scale.setter
|
|
def scale(self, scale):
|
|
self._scale = scale
|
|
|
|
@mask.setter
|
|
def mask(self, mask):
|
|
self._mask = mask
|
|
|
|
@pre_indexed.setter
|
|
def pre_indexed(self, pre_indexed):
|
|
self._pre_indexed = pre_indexed
|
|
|
|
@post_indexed.setter
|
|
def post_indexed(self, post_indexed):
|
|
self._post_indexed = post_indexed
|
|
|
|
@indexed_val.setter
|
|
def indexed_val(self, value):
|
|
self._indexed_val = value
|
|
|
|
def __str__(self):
|
|
return (
|
|
f"MemoryOperand(offset={self._offset}, "
|
|
f"base={self._base}, index={self._index}, scale={self._scale}, "
|
|
f"segment_ext={self._segment_ext}, mask={self._mask}, "
|
|
f"pre_indexed={self._pre_indexed}, post_indexed={self._post_indexed}, "
|
|
f"indexed_val={self._indexed_val},"
|
|
f"source={self._source}, destination={self._destination})"
|
|
)
|
|
|
|
def __repr__(self):
|
|
return self.__str__()
|
|
|
|
def __eq__(self, other):
|
|
if isinstance(other, MemoryOperand):
|
|
return (
|
|
self._offset == other._offset
|
|
and self._base == other._base
|
|
and self._index == other._index
|
|
and self._scale == other._scale
|
|
and self._segment_ext == other._segment_ext
|
|
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
|