import struct
class Register:
class Wrapper:
def __init__ (self, buffer, format_str):
self.buffer = buffer
self.st = struct.Struct(format_str)
def __setitem__ (self, slot, value):
f = list(self.st.unpack(self.buffer))
f[slot] = value
self.st.pack_into(self.buffer, 0, *f)
def __getitem__ (self, slot):
return self.st.unpack(self.buffer)[slot]
def __string__ (self):
return str(self.st.unpack(self.buffer))
def __repr__ (self):
return repr(self.st.unpack(self.buffer))
def __init__ (self):
self.byte = bytearray(16)
self.float32 = Register.Wrapper(self.byte, "<ffff")
self.float64 = Register.Wrapper(self.byte, "<dd")
self.signed8 = Register.Wrapper(self.byte, "<bbbbbbbbbbbbbbbb")
self.signed16 = Register.Wrapper(self.byte, "<hhhhhhhh")
self.signed32 = Register.Wrapper(self.byte, "<iiii")
self.signed64 = Register.Wrapper(self.byte, "<qq")
self.unsigned8 = Register.Wrapper(self.byte, "<BBBBBBBBBBBBBBBB")
self.unsigned16 = Register.Wrapper(self.byte, "<HHHHHHHH")
self.unsigned32 = Register.Wrapper(self.byte, "<IIII")
self.unsigned64 = Register.Wrapper(self.byte, "<QQ")
class Memory:
class Wrapper:
def __init__ (self, buffer, format_str):
self.buffer = buffer
self.st = struct.Struct(format_str)
def __setitem__ (self, address, value):
self.st.pack_into(self.buffer, address, value)
def __getitem__ (self, address):
return self.st.unpack_from(self.buffer, address)[0]
def __init__ (self, size):
self.size = size
self.byte = bytearray(size)
self.float32 = Memory.Wrapper(self.byte, "<f")
self.float64 = Memory.Wrapper(self.byte, "<d")
self.signed8 = Memory.Wrapper(self.byte, "<b")
self.signed16 = Memory.Wrapper(self.byte, "<h")
self.signed32 = Memory.Wrapper(self.byte, "<i")
self.signed64 = Memory.Wrapper(self.byte, "<q")
self.unsigned8 = Memory.Wrapper(self.byte, "<B")
self.unsigned16 = Memory.Wrapper(self.byte, "<H")
self.unsigned32 = Memory.Wrapper(self.byte, "<I")
self.unsigned64 = Memory.Wrapper(self.byte, "<Q")
def __len__ (self):
return len(self.byte)
if __name__ == "__main__":
# 1000 bytes memory
memory = Memory(1000)
# 16x 128 bits SSE registers
xmm = []
for i in range(16):
xmm.append(Register())
#test register aliasing
xmm[0].unsigned32[:] = (4, 5, 6, 7) # fill the whole register (4 x 32 bits)
temp = xmm[0].float64[:] # copy as float64 (2 x 64 bits)
xmm[0].float64[:] = temp # write back
print("xmm[0]:", xmm[0].unsigned32) # (4, 5, 6, 7)
# memory aliasing
memory.unsigned32[100] = 0x882233FF
for i in range(103, 99, -1): #Little endian !
print(hex(memory.byte[i]), end=" ")
else:
print()
# register to register
xmm[1].unsigned32[:] = xmm[0].unsigned32[:]
xmm[1].float64[0] = xmm[0].float32[3]
# mem to register
xmm[0].unsigned32[0] = memory.unsigned32[100]
print(hex(xmm[0].unsigned32[0])) # 0x882233FF
aW1wb3J0IHN0cnVjdAoKY2xhc3MgUmVnaXN0ZXI6CiAgICBjbGFzcyBXcmFwcGVyOiAKICAgICAgICBkZWYgX19pbml0X18gKHNlbGYsIGJ1ZmZlciwgZm9ybWF0X3N0cik6CiAgICAgICAgICAgIHNlbGYuYnVmZmVyID0gYnVmZmVyCiAgICAgICAgICAgIHNlbGYuc3QgPSBzdHJ1Y3QuU3RydWN0KGZvcm1hdF9zdHIpCgogICAgICAgIGRlZiBfX3NldGl0ZW1fXyAoc2VsZiwgc2xvdCwgdmFsdWUpOgogICAgICAgICAgICBmID0gbGlzdChzZWxmLnN0LnVucGFjayhzZWxmLmJ1ZmZlcikpCiAgICAgICAgICAgIGZbc2xvdF0gPSB2YWx1ZQogICAgICAgICAgICBzZWxmLnN0LnBhY2tfaW50byhzZWxmLmJ1ZmZlciwgMCwgKmYpCgogICAgICAgIGRlZiBfX2dldGl0ZW1fXyAoc2VsZiwgc2xvdCk6CiAgICAgICAgICAgIHJldHVybiBzZWxmLnN0LnVucGFjayhzZWxmLmJ1ZmZlcilbc2xvdF0KCiAgICAgICAgZGVmIF9fc3RyaW5nX18gKHNlbGYpOgogICAgICAgICAgICByZXR1cm4gc3RyKHNlbGYuc3QudW5wYWNrKHNlbGYuYnVmZmVyKSkKCiAgICAgICAgZGVmIF9fcmVwcl9fIChzZWxmKToKICAgICAgICAgICAgcmV0dXJuIHJlcHIoc2VsZi5zdC51bnBhY2soc2VsZi5idWZmZXIpKQoKICAgIGRlZiBfX2luaXRfXyAoc2VsZik6CiAgICAgICAgc2VsZi5ieXRlID0gYnl0ZWFycmF5KDE2KQogICAgICAgIHNlbGYuZmxvYXQzMiA9IFJlZ2lzdGVyLldyYXBwZXIoc2VsZi5ieXRlLCAiPGZmZmYiKQogICAgICAgIHNlbGYuZmxvYXQ2NCA9IFJlZ2lzdGVyLldyYXBwZXIoc2VsZi5ieXRlLCAiPGRkIikKICAgICAgICBzZWxmLnNpZ25lZDggPSBSZWdpc3Rlci5XcmFwcGVyKHNlbGYuYnl0ZSwgIjxiYmJiYmJiYmJiYmJiYmJiIikKICAgICAgICBzZWxmLnNpZ25lZDE2ID0gUmVnaXN0ZXIuV3JhcHBlcihzZWxmLmJ5dGUsICI8aGhoaGhoaGgiKQogICAgICAgIHNlbGYuc2lnbmVkMzIgPSBSZWdpc3Rlci5XcmFwcGVyKHNlbGYuYnl0ZSwgIjxpaWlpIikKICAgICAgICBzZWxmLnNpZ25lZDY0ID0gUmVnaXN0ZXIuV3JhcHBlcihzZWxmLmJ5dGUsICI8cXEiKQogICAgICAgIHNlbGYudW5zaWduZWQ4ID0gUmVnaXN0ZXIuV3JhcHBlcihzZWxmLmJ5dGUsICI8QkJCQkJCQkJCQkJCQkJCQiIpCiAgICAgICAgc2VsZi51bnNpZ25lZDE2ID0gUmVnaXN0ZXIuV3JhcHBlcihzZWxmLmJ5dGUsICI8SEhISEhISEgiKQogICAgICAgIHNlbGYudW5zaWduZWQzMiA9IFJlZ2lzdGVyLldyYXBwZXIoc2VsZi5ieXRlLCAiPElJSUkiKQogICAgICAgIHNlbGYudW5zaWduZWQ2NCA9IFJlZ2lzdGVyLldyYXBwZXIoc2VsZi5ieXRlLCAiPFFRIikKCmNsYXNzIE1lbW9yeToKICAgIGNsYXNzIFdyYXBwZXI6CiAgICAgICAgZGVmIF9faW5pdF9fIChzZWxmLCBidWZmZXIsIGZvcm1hdF9zdHIpOgogICAgICAgICAgICBzZWxmLmJ1ZmZlciA9IGJ1ZmZlcgogICAgICAgICAgICBzZWxmLnN0ID0gc3RydWN0LlN0cnVjdChmb3JtYXRfc3RyKQoKICAgICAgICBkZWYgX19zZXRpdGVtX18gKHNlbGYsIGFkZHJlc3MsIHZhbHVlKToKICAgICAgICAgICAgc2VsZi5zdC5wYWNrX2ludG8oc2VsZi5idWZmZXIsIGFkZHJlc3MsIHZhbHVlKQoKICAgICAgICBkZWYgX19nZXRpdGVtX18gKHNlbGYsIGFkZHJlc3MpOgogICAgICAgICAgICByZXR1cm4gc2VsZi5zdC51bnBhY2tfZnJvbShzZWxmLmJ1ZmZlciwgYWRkcmVzcylbMF0KCiAgICBkZWYgX19pbml0X18gKHNlbGYsIHNpemUpOgogICAgICAgIHNlbGYuc2l6ZSA9IHNpemUKICAgICAgICBzZWxmLmJ5dGUgPSBieXRlYXJyYXkoc2l6ZSkKICAgICAgICBzZWxmLmZsb2F0MzIgPSBNZW1vcnkuV3JhcHBlcihzZWxmLmJ5dGUsICI8ZiIpCiAgICAgICAgc2VsZi5mbG9hdDY0ID0gTWVtb3J5LldyYXBwZXIoc2VsZi5ieXRlLCAiPGQiKQogICAgICAgIHNlbGYuc2lnbmVkOCA9IE1lbW9yeS5XcmFwcGVyKHNlbGYuYnl0ZSwgIjxiIikKICAgICAgICBzZWxmLnNpZ25lZDE2ID0gTWVtb3J5LldyYXBwZXIoc2VsZi5ieXRlLCAiPGgiKQogICAgICAgIHNlbGYuc2lnbmVkMzIgPSBNZW1vcnkuV3JhcHBlcihzZWxmLmJ5dGUsICI8aSIpCiAgICAgICAgc2VsZi5zaWduZWQ2NCA9IE1lbW9yeS5XcmFwcGVyKHNlbGYuYnl0ZSwgIjxxIikKICAgICAgICBzZWxmLnVuc2lnbmVkOCA9IE1lbW9yeS5XcmFwcGVyKHNlbGYuYnl0ZSwgIjxCIikKICAgICAgICBzZWxmLnVuc2lnbmVkMTYgPSBNZW1vcnkuV3JhcHBlcihzZWxmLmJ5dGUsICI8SCIpCiAgICAgICAgc2VsZi51bnNpZ25lZDMyID0gTWVtb3J5LldyYXBwZXIoc2VsZi5ieXRlLCAiPEkiKQogICAgICAgIHNlbGYudW5zaWduZWQ2NCA9IE1lbW9yeS5XcmFwcGVyKHNlbGYuYnl0ZSwgIjxRIikKCiAgICBkZWYgX19sZW5fXyAoc2VsZik6CiAgICAgICAgcmV0dXJuIGxlbihzZWxmLmJ5dGUpCgppZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgIyAxMDAwIGJ5dGVzIG1lbW9yeQogICAgbWVtb3J5ID0gTWVtb3J5KDEwMDApIAoKICAgICMgMTZ4IDEyOCBiaXRzIFNTRSByZWdpc3RlcnMKICAgIHhtbSA9IFtdCiAgICBmb3IgaSBpbiByYW5nZSgxNik6CiAgICAgICAgeG1tLmFwcGVuZChSZWdpc3RlcigpKQoKICAgICN0ZXN0IHJlZ2lzdGVyIGFsaWFzaW5nICAgIAogICAgeG1tWzBdLnVuc2lnbmVkMzJbOl0gPSAoNCwgNSwgNiwgNykgIyBmaWxsIHRoZSB3aG9sZSByZWdpc3RlciAoNCB4IDMyIGJpdHMpCiAgICB0ZW1wID0geG1tWzBdLmZsb2F0NjRbOl0gIyBjb3B5IGFzIGZsb2F0NjQgKDIgeCA2NCBiaXRzKQogICAgeG1tWzBdLmZsb2F0NjRbOl0gPSB0ZW1wICMgd3JpdGUgYmFjawogICAgcHJpbnQoInhtbVswXToiLCB4bW1bMF0udW5zaWduZWQzMikgIyAoNCwgNSwgNiwgNykKCiAgICAjIG1lbW9yeSBhbGlhc2luZwogICAgbWVtb3J5LnVuc2lnbmVkMzJbMTAwXSA9IDB4ODgyMjMzRkYKICAgIGZvciBpIGluIHJhbmdlKDEwMywgOTksIC0xKTogI0xpdHRsZSBlbmRpYW4gIQogICAgICAgIHByaW50KGhleChtZW1vcnkuYnl0ZVtpXSksIGVuZD0iICIpCiAgICBlbHNlOgogICAgICAgIHByaW50KCkKCiAgICAjIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyCiAgICB4bW1bMV0udW5zaWduZWQzMls6XSA9IHhtbVswXS51bnNpZ25lZDMyWzpdCiAgICB4bW1bMV0uZmxvYXQ2NFswXSA9IHhtbVswXS5mbG9hdDMyWzNdCgogICAgIyBtZW0gdG8gcmVnaXN0ZXIKICAgIHhtbVswXS51bnNpZ25lZDMyWzBdID0gbWVtb3J5LnVuc2lnbmVkMzJbMTAwXQogICAgcHJpbnQoaGV4KHhtbVswXS51bnNpZ25lZDMyWzBdKSkgIyAweDg4MjIzM0ZG