[pypy-commit] pypy s390x-backend: rs encoding and rsy (extended version of rs)
plan_rich
noreply at buildbot.pypy.org
Fri Oct 16 11:18:16 EDT 2015
Author: Richard Plangger <planrichi at gmail.com>
Branch: s390x-backend
Changeset: r80279:bfd63406a3e9
Date: 2015-10-16 17:18 +0200
http://bitbucket.org/pypy/pypy/changeset/bfd63406a3e9/
Log: rs encoding and rsy (extended version of rs)
diff --git a/rpython/jit/backend/zarch/codebuilder.py b/rpython/jit/backend/zarch/codebuilder.py
--- a/rpython/jit/backend/zarch/codebuilder.py
+++ b/rpython/jit/backend/zarch/codebuilder.py
@@ -38,10 +38,13 @@
r/m - register or mask
iX - immediate X bits (signed)
uX - immediate X bits (unsigend)
- bd - base displacement
+ bd - base displacement (12 bit)
+ bdl - base displacement long (20 bit)
ibd - index base displacement
l4bd - length base displacement (4 bit)
l8bd - length base displacement (8 bit)
+
+ note that a suffix 'l' means long, and a prefix length
"""
def impl(func):
func._arguments_ = args_str.split(',')
@@ -55,12 +58,32 @@
@always_inline
def encode_base_displace(mc, base_displace):
- displace = base_displace.displace # & 0x3ff
+ """
+ +---------------------------------+
+ | ... | base | length[0:11] | ... |
+ +---------------------------------+
+ """
+ displace = base_displace.displace
base = base_displace.base & 0xf
byte = (displace >> 8 & 0xf) | base << 4
mc.writechar(chr(byte))
mc.writechar(chr(displace & 0xff))
+ at always_inline
+def encode_base_displace_long(mc, basedisp):
+ """
+ +-------------------------------------------------+
+ | ... | base | length[0:11] | length[12:20] | ... |
+ +-------------------------------------------------+
+ """
+ displace = basedisp.displace & 0xfffff
+ base = basedisp.base & 0xf
+ byte = displace >> 8 & 0xf | base << 4
+ mc.writechar(chr(byte))
+ mc.writechar(chr(displace & 0xff))
+ byte = displace >> 12 & 0xff
+ mc.writechar(chr(byte))
+
def build_rr(mnemonic, (opcode,)):
@builder.arguments('r,r')
def encode_rr(self, reg1, reg2):
@@ -101,13 +124,7 @@
index = idxbasedisp.index
byte = (reg_or_mask & 0x0f) << 4 | index & 0xf
self.writechar(chr(byte))
- displace = idxbasedisp.displace & 0xfffff
- base = idxbasedisp.base & 0xf
- byte = displace >> 8 & 0xf | base << 4
- self.writechar(chr(byte))
- self.writechar(chr(displace & 0xff))
- byte = displace >> 12 & 0xff
- self.writechar(chr(byte))
+ encode_base_displace_long(self, idxbasedisp)
self.writechar(opcode2)
return encode_rxy
@@ -122,7 +139,7 @@
return encode_ri
def build_ril(mnemonic, (opcode,halfopcode)):
- @builder.arguments('r/m,a32')
+ @builder.arguments('r/m,i32')
def encode_ri(self, reg_or_mask, imm32):
self.writechar(opcode)
byte = (reg_or_mask & 0xf) << 4 | (ord(halfopcode) & 0xf)
@@ -209,6 +226,23 @@
encode_base_displace(self, len_base_disp)
return encode_ssf
+def build_rs(mnemonic, (opcode,)):
+ @builder.arguments('r,r,bd')
+ def encode_rs(self, reg1, reg3, base_displace):
+ self.writechar(opcode)
+ self.writechar(chr((reg1 & BIT_MASK_4) << 4 | reg3 & BIT_MASK_4))
+ encode_base_displace(self, base_displace)
+ return encode_rs
+
+def build_rsy(mnemonic, (opcode1,opcode2)):
+ @builder.arguments('r,r,bdl')
+ def encode_ssa(self, reg1, reg3, base_displace):
+ self.writechar(opcode1)
+ self.writechar(chr((reg1 & BIT_MASK_4) << 4 | reg3 & BIT_MASK_4))
+ encode_base_displace_long(self, base_displace)
+ self.writechar(opcode2)
+ return encode_ssa
+
_mnemonic_codes = {
'AR': (build_rr, ['\x1A']),
'AGR': (build_rre, ['\xB9\x08']),
@@ -227,6 +261,8 @@
'LMD': (build_sse, ['\xEF']),
'PKA': (build_ssf, ['\xE9']),
'BRASL': (build_ril, ['\xC0','\x05']),
+ 'BXH': (build_rs, ['\x86']),
+ 'BXHG': (build_rsy, ['\xEB','\x44']),
}
def build_instr_codes(clazz):
diff --git a/rpython/jit/backend/zarch/test/test_auto_encoding.py b/rpython/jit/backend/zarch/test/test_auto_encoding.py
--- a/rpython/jit/backend/zarch/test/test_auto_encoding.py
+++ b/rpython/jit/backend/zarch/test/test_auto_encoding.py
@@ -102,7 +102,7 @@
__repr__ = __str__
-def test_range(bits, signed=False, count=24, alignment=0):
+def test_range(bits, signed=False, count=24):
if isinstance(bits, tuple):
bits, signed = bits
if signed:
@@ -132,7 +132,6 @@
'i8': test_range(8, signed=True),
'i16': test_range(16, signed=True),
'i32': test_range(32, signed=True),
- 'a32': test_range(32, signed=True, alignment=16),
'i64': test_range(64, signed=True),
'u4': test_range(4),
'u8': test_range(8),
@@ -140,6 +139,7 @@
'u32': test_range(32),
'u64': test_range(64),
'bd': build_fake(FakeBaseDisplace,4,12),
+ 'bdl': build_fake(FakeBaseDisplace,4,19),
'ibd': build_fake(FakeIndexBaseDisplace,4,4,12),
'ibdl': build_fake(FakeIndexBaseDisplace,4,4,(20,True)),
'l8bd': build_fake(FakeLengthBaseDisplace,8,4,12),
More information about the pypy-commit
mailing list