[pypy-commit] pypy s390x-backend: register immediate encoding

plan_rich noreply at buildbot.pypy.org
Thu Oct 15 06:16:24 EDT 2015


Author: Richard Plangger <planrichi at gmail.com>
Branch: s390x-backend
Changeset: r80232:066bb29ef362
Date: 2015-10-15 12:16 +0200
http://bitbucket.org/pypy/pypy/changeset/066bb29ef362/

Log:	register immediate encoding

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
@@ -39,7 +39,6 @@
         self.writechar(opcode1)
         self.writechar(opcode2)
         self.writechar('\x00')
-        #self.writechar('\x00')
         operands = ((reg1 & 0x0f) << 4) | (reg2 & 0xf)
         self.writechar(chr(operands))
     return encode_rr
@@ -55,7 +54,6 @@
         byte = displace >> 8 & 0xf | base << 4
         self.writechar(chr(byte))
         self.writechar(chr(displace & 0xff))
-
     return encode_rx
 
 def build_rxy(mnemonic, (opcode1,opcode2)):
@@ -71,8 +69,16 @@
         self.writechar(chr(displace & 0xff))
         self.writechar(chr(displace >> 12 & 0xff))
         self.writechar(opcode2)
+    return encode_rxy
 
-    return encode_rxy
+def build_ri(mnemonic, (opcode,halfopcode)):
+    def encode_ri(self, reg_or_mask, imm):
+        self.writechar(opcode)
+        byte = (reg_or_mask & 0xf) << 4 | (ord(halfopcode) & 0xf)
+        self.writechar(chr(byte))
+        self.writechar(chr(imm >> 8 & 0xff))
+        self.writechar(chr(imm & 0xff))
+    return encode_ri
 
 def build_instr_codes(clazz):
     _mnemonic_codes = {
@@ -82,6 +88,8 @@
         'A':       (build_rx,    ['\x5A']),
         'AY':      (build_rxy,   ['\xE3','\x5A']),
         'AG':      (build_rxy,   ['\xE3','\x08']),
+        'AGF':     (build_rxy,   ['\xE3','\x18']),
+        'AHI':     (build_ri,    ['\xA7','\x0A']),
     }
 
     for mnemonic, (builder, args) in _mnemonic_codes.items():
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
@@ -27,9 +27,10 @@
                 and self.index == self.instrindex):
                 return    # ignore the extra character '\x40'
             print self.op
-            generated = "\x09from codebuilder.py: " + hexdump(self.expected[self.instrindex:self.index] + char)+"..."
+            post = self.expected[self.index+1:self.index+1+15]
+            generated = "\x09from codebuilder.py: " + hexdump(self.expected[self.instrindex:self.index] + "!" + char + "!" + post)+"..."
             print generated
-            expected = "\x09from          gnu as: " + hexdump(self.expected[self.instrindex:self.index+15])+"..."
+            expected = "\x09from         gnu as: " + hexdump(self.expected[self.instrindex:self.index+15])+"..."
             print expected
             raise Exception("Differs:\n" + generated + "\n" + expected)
         self.index += 1
@@ -120,6 +121,11 @@
                     for ofs in self.stack_bp_tests(1)
                 ]
 
+    def imm16_tests(self):
+        v = ([-128,-1,0,1,127] +
+             [random.randrange(-32768, 32767) for i in range(COUNT1)])
+        return v
+
     def imm8_tests(self):
         v = ([-128,-1,0,1,127] +
              [random.randrange(-127, 127) for i in range(COUNT1)])
@@ -143,6 +149,7 @@
             'r': self.assembler_operand_reg,
             'x': lambda x: str(x),
             'y': lambda x: str(x),
+            'i': lambda x: str(x)
         }
 
     def operand_combinations(self, modes, arguments):
@@ -203,14 +210,16 @@
     def modes(self, mode):
         if mode == "rxy":
             return "ry"
+        if mode == "rre":
+            return "rr"
         return mode
 
     def make_all_tests(self, methname, modes, args=[]):
         tests = {
             'r': self.REGS,
-            'e': None,
             'x': self.INDEX_BASE_DISPLACE,
             'y': self.INDEX_BASE_DISPLACE_LONG,
+            'i': self.imm16_tests(),
         }
         combinations = []
         for m in modes:


More information about the pypy-commit mailing list