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

Reply via email to