Author: Richard Plangger <[email protected]>
Branch: s390x-backend
Changeset: r80239:d28ca84c9d6a
Date: 2015-10-15 16:55 +0200
http://bitbucket.org/pypy/pypy/changeset/d28ca84c9d6a/
Log: added base displacement parameters with length in various flavours
(instr category named ss_a, ss_b, ss_c)
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
@@ -27,6 +27,12 @@
class Operand(object):
pass
+def arguments(args_str):
+ def impl(func):
+ func._arguments_ = args_str.split(',')
+ return func
+ return impl
+
@always_inline
def encode_base_displace(mc, base_displace):
displace = base_displace.displace # & 0x3ff
@@ -106,6 +112,33 @@
self.writechar(opcode2)
return encode_siy
+def build_ssa(mnemonic, (opcode1,)):
+ def encode_ssa(self, len_base_disp, base_displace):
+ self.writechar(opcode1)
+ self.writechar(chr(len_base_disp.length & 0xff))
+ encode_base_displace(self, len_base_disp)
+ encode_base_displace(self, base_displace)
+ return encode_ssa
+
+def build_ssb(mnemonic, (opcode1,)):
+ def encode_ssb(self, len_base_disp1, len_base_disp2):
+ self.writechar(opcode1)
+ byte = (len_base_disp1.length & 0xf) << 4 | len_base_disp2.length & 0xf
+ self.writechar(chr(byte))
+ encode_base_displace(self, len_base_disp1)
+ encode_base_displace(self, len_base_disp2)
+ return encode_ssb
+
+def build_ssc(mnemonic, (opcode1,)):
+ @arguments('l,l,u4')
+ def encode_ssc(self, len_base_disp1, len_base_disp2, uimm4):
+ self.writechar(opcode1)
+ byte = (len_base_disp1.length & 0xf) << 4 | uimm4 & 0xf
+ self.writechar(chr(byte))
+ encode_base_displace(self, len_base_disp1)
+ encode_base_displace(self, len_base_disp2)
+ return encode_ssc
+
_mnemonic_codes = {
'AR': (build_rr, ['\x1A']),
'AGR': (build_rre, ['\xB9\x08']),
@@ -117,6 +150,9 @@
'AHI': (build_ri, ['\xA7','\x0A']),
'NI': (build_si, ['\x94']),
'NIY': (build_siy, ['\xEB','\x54']),
+ 'NC': (build_ssa, ['\xD4']),
+ 'AP': (build_ssb, ['\xFA']),
+ 'SRP': (build_ssc, ['\xF0']),
}
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
@@ -86,6 +86,18 @@
base = self.base
return "{disp}(%r{base})".format(**locals())
+class FakeLengthBaseDisplace(object):
+ def __init__(self, len, base, disp):
+ self.length = len
+ self.base = base
+ self.displace = disp
+
+ def __str__(self):
+ disp = self.displace
+ base = self.base
+ length = self.length + 1
+ return "{disp}({length},%r{base})".format(**locals())
+
def build_base_disp(base_bits, displace_bits):
possibilities = itertools.product(range(base_bits), range(displace_bits))
results = []
@@ -101,6 +113,14 @@
results.append(FakeIndexBaseDisplace(index,base,disp))
return results
+def build_len_base_disp(len_bits, base_bits, displace_bits):
+ possibilities = itertools.product(range(len_bits), range(base_bits),
+ range(displace_bits))
+ results = []
+ for (length,base,disp) in possibilities:
+ results.append(FakeLengthBaseDisplace(length,base,disp))
+ return results
+
class TestZARCH(object):
WORD = 8
TESTDIR = 'zarch'
@@ -112,6 +132,8 @@
BASE_DISPLACE_LONG = build_base_disp(8,20)
INDEX_BASE_DISPLACE = build_idx_base_disp(8,8,12)
INDEX_BASE_DISPLACE_LONG = build_idx_base_disp(8,8,20)
+ LENGTH4_BASE_DISPLACE = build_len_base_disp(4,8,12)
+ LENGTH8_BASE_DISPLACE = build_len_base_disp(8,8,12)
def reg_tests(self):
return self.REGS
@@ -143,8 +165,6 @@
def imm_tests(self, name, modes, index):
from rpython.jit.backend.zarch.codebuilder import AbstractZARCHBuilder
import inspect
- mode = modes[index]
- assert mode == 'i'
func = getattr(AbstractZARCHBuilder, name)
args = inspect.getargspec(func).args
# 1 off, self is first arg
@@ -169,6 +189,8 @@
v = ([0,1,255] +
[random.randrange(0,255) for i in range(COUNT1)])
return v
+ def uimm4_tests(self):
+ return list(range(0,16))
def imm32_tests(self):
v = ([-0x80000000, 0x7FFFFFFF, 128, 256, -129, -255] +
@@ -189,11 +211,24 @@
's': lambda x: str(x),
'x': lambda x: str(x),
'y': lambda x: str(x),
- 'i': lambda x: str(x)
+ 'i': lambda x: str(x),
+ 'l': lambda x: str(x),
+ 'L': lambda x: str(x),
}
def operand_combinations(self, modes, arguments):
+ remap = {
+ 'rxy': 'rx',
+ 'siy': 'si',
+ 'rre': 'rr',
+ 'ssa': 'Ls',
+ 'ssb': 'll',
+ 'ssc': 'lsi',
+ 'ssd': 'xsr',
+ 'sse': 'rrss',
+ }
mapping = self.get_mapping_asm_to_str()
+ modes = remap.get(modes, modes)
for mode, args in zip(modes, arguments):
yield mapping[mode](args)
@@ -257,11 +292,16 @@
'y': lambda i: self.INDEX_BASE_DISPLACE_LONG,
'i': lambda i: self.imm_tests(methname, modes, i),
's': lambda i: self.BASE_DISPLACE,
+ 'L': lambda i: self.LENGTH8_BASE_DISPLACE,
+ 'l': lambda i: self.LENGTH4_BASE_DISPLACE,
}
tests_all = {
'rxy': (tests['r'], tests['y']),
'siy': (lambda i: self.BASE_DISPLACE_LONG, tests['i']),
- 'rre': (tests['r'], tests['r'])
+ 'rre': (tests['r'], tests['r']),
+ 'ssa': (tests['L'], tests['s']),
+ 'ssb': (tests['l'], tests['l']),
+ 'ssc': (tests['l'], tests['s'], tests['i']),
}
if modes in tests_all:
combinations = [f(i) for i,f in enumerate(tests_all[modes])]
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit