[pypy-commit] pypy s390x-backend: allocated memory, and stored float result into it, correctly read it afterwards

plan_rich noreply at buildbot.pypy.org
Thu Oct 22 07:19:47 EDT 2015


Author: Richard Plangger <planrichi at gmail.com>
Branch: s390x-backend
Changeset: r80387:ec9e69c4ffde
Date: 2015-10-22 13:20 +0200
http://bitbucket.org/pypy/pypy/changeset/ec9e69c4ffde/

Log:	allocated memory, and stored float result into it, correctly read it
	afterwards

diff --git a/rpython/jit/backend/zarch/instruction_builder.py b/rpython/jit/backend/zarch/instruction_builder.py
--- a/rpython/jit/backend/zarch/instruction_builder.py
+++ b/rpython/jit/backend/zarch/instruction_builder.py
@@ -90,6 +90,22 @@
     byte = displace >> 12 & 0xff
     mc.writechar(chr(byte))
 
+ at always_inline
+def encode_index_base_displace(mc, reg, idxbasedisp):
+    """
+        +----------------------------------------------------+
+        | opcode | reg & index | base & displace[0:11] | ... |
+        +----------------------------------------------------+
+    """
+    index = idxbasedisp.index
+    byte = (reg & 0x0f) << 4 | index & 0xf
+    mc.writechar(chr(byte))
+    displace = idxbasedisp.displace & BIT_MASK_12
+    base = idxbasedisp.base & 0xf
+    byte = displace >> 8 & 0xf | base << 4
+    mc.writechar(chr(byte))
+    mc.writechar(chr(displace & 0xff))
+
 def build_i(mnemonic, (opcode,)):
     @builder.arguments('u8')
     def encode_i(self, imm):
@@ -119,14 +135,7 @@
     @builder.arguments('r/m,bid')
     def encode_rx(self, reg_or_mask, idxbasedisp):
         self.writechar(opcode)
-        index = idxbasedisp.index
-        byte = (reg_or_mask & 0x0f) << 4 | index & 0xf
-        self.writechar(chr(byte))
-        displace = idxbasedisp.displace & BIT_MASK_12
-        base = idxbasedisp.base & 0xf
-        byte = displace >> 8 & 0xf | base << 4
-        self.writechar(chr(byte))
-        self.writechar(chr(displace & 0xff))
+        encode_index_base_displace(self, reg_or_mask, idxbasedisp)
     return encode_rx
 
 def build_rxy(mnemonic, (opcode1,opcode2)):
@@ -293,20 +302,37 @@
         self.writechar(opcode2)
     return encode_ri
 
-def _build_rrf(args):
-    def build_rff(mnemonic, (opcode1,opcode2)):
-        @builder.arguments(args)
-        def encode_rrf(self, r1, rm3, r2, rm4):
-            self.writechar(opcode1)
-            self.writechar(opcode2)
-            byte = (rm3 & BIT_MASK_4) << 4 | (rm4 & BIT_MASK_4)
-            self.writechar(chr(byte))
-            byte = (r1 & BIT_MASK_4) << 4 | (r2 & BIT_MASK_4)
-            self.writechar(chr(byte))
-        return encode_rrf
-    return build_rff
+def build_rrf(mnemonic, (opcode1,opcode2,argtypes)):
+    @builder.arguments(argtypes)
+    def encode_rrf(self, r1, rm3, r2, rm4):
+        self.writechar(opcode1)
+        self.writechar(opcode2)
+        byte = (rm3 & BIT_MASK_4) << 4 | (rm4 & BIT_MASK_4)
+        self.writechar(chr(byte))
+        byte = (r1 & BIT_MASK_4) << 4 | (r2 & BIT_MASK_4)
+        self.writechar(chr(byte))
+    return encode_rrf
 
-build_rrf = _build_rrf('r,u4,r,-')
+def build_rxe(mnemonic, (opcode1,opcode2,argtypes)):
+    @builder.arguments(argtypes)
+    def encode_rxe(self, reg, idxbasedisp, mask):
+        self.writechar(opcode1)
+        encode_index_base_displace(self, reg, idxbasedisp)
+        self.writechar(chr((mask & 0xf) << 4))
+        self.writechar(opcode2)
+    return encode_rxe
+
+def build_rxf(mnemonic, (opcode1,opcode2)):
+    @builder.arguments('r,bidl,r/m')
+    def encode_rxe(self, reg1, idxbasedisp, reg3):
+        self.writechar(opcode1)
+        index = idxbasedisp.index
+        byte = (reg3 & 0x0f) << 4 | index & 0xf
+        self.writechar(chr(byte))
+        encode_base_displace_long(self, reg, idxbasedisp)
+        self.writechar(chr((reg1 & 0xf) << 4))
+        self.writechar(opcode2)
+    return encode_rxe
 
 def build_unpack_func(mnemonic, func):
     def function(self, *args):
@@ -330,7 +356,12 @@
 
 def build_instr_codes(clazz):
     for mnemonic, params in all_mnemonic_codes.items():
-        (instrtype, args) = params
+        argtypes = None
+        if len(params) == 2:
+            (instrtype, args) = params
+        else:
+            (instrtype, args, argtypes) = params
+            args = tuple(list(args) + [argtypes])
         builder = globals()['build_' + instrtype]
         func = builder(mnemonic, args)
         name = mnemonic + "_" + instrtype
diff --git a/rpython/jit/backend/zarch/instructions.py b/rpython/jit/backend/zarch/instructions.py
--- a/rpython/jit/backend/zarch/instructions.py
+++ b/rpython/jit/backend/zarch/instructions.py
@@ -79,6 +79,9 @@
     'LGR':     ('rre',   ['\xB9','\x04']),
     'LG':      ('rxy',   ['\xE3','\x04']),
 
+    'STE':     ('rx',    ['\x70']),
+    'STD':     ('rx',    ['\x60']),
+
     # load binary float
     # E -> short (32bit),
     # D -> long (64bit),
@@ -92,11 +95,17 @@
 }
 
 floatingpoint_mnemonic_codes = {
-    'FIEBR':   ('rrf',   ['\xB3','\x57']),
-    'FIDBR':   ('rrf',   ['\xB3','\x5F']),
+    'FIEBR':   ('rrf',   ['\xB3','\x57'], 'r,u4,r,-'),
+    'FIDBR':   ('rrf',   ['\xB3','\x5F'], 'r,u4,r,-'),
 
-    'CGEBR':   ('rrf',   ['\xB3','\xA8']),
-    'CGDBR':   ('rrf',   ['\xB3','\xA9']),
+    'CGEBR':   ('rrf',   ['\xB3','\xA8'], 'r,u4,r,-'),
+    'CGDBR':   ('rrf',   ['\xB3','\xA9'], 'r,u4,r,-'),
+
+    # arithmetic
+    'AEBR':    ('rre',   ['\xB3','\x0A']),
+    'ADBR':    ('rre',   ['\xB3','\x1A']),
+    'AEB':     ('rxe',   ['\xED','\x0A'], 'r,bidl,-'),
+    'ADB':     ('rxe',   ['\xED','\x1A'], 'r,bidl,-'),
 }
 
 all_mnemonic_codes = {
diff --git a/rpython/jit/backend/zarch/test/test_assembler.py b/rpython/jit/backend/zarch/test/test_assembler.py
--- a/rpython/jit/backend/zarch/test/test_assembler.py
+++ b/rpython/jit/backend/zarch/test/test_assembler.py
@@ -10,14 +10,16 @@
 from rpython.jit.codewriter import longlong
 
 from rpython.rtyper.annlowlevel import llhelper
-from rpython.rtyper.lltypesystem import lltype, rffi
+from rpython.rtyper.lltypesystem import lltype, rffi, ll2ctypes
 from rpython.jit.metainterp.history import JitCellToken
 from rpython.jit.backend.model import CompiledLoopToken
 from rpython.rtyper.lltypesystem import lltype, llmemory, rffi
 from rpython.rtyper.annlowlevel import llhelper
 from rpython.rlib.objectmodel import specialize
 from rpython.rlib.debug import ll_assert
-from rpython.rlib.longlong2float import float2longlong
+from rpython.rlib.longlong2float import (float2longlong,
+        DOUBLE_ARRAY_PTR)
+import ctypes
 
 CPU = getcpuclass()
 
@@ -25,11 +27,14 @@
     return func._byte_count
 
 def BFL(value):
-    #assert 0x0000000000000000 == float2longlong(0.0)
-    #assert 0x8000000000000000 == abs(float2longlong(-0.0))
-    #assert hex(0xc02e000000000000) == hex(abs(float2longlong(-15.0)))
     return struct.pack('>q', float2longlong(value))
 
+def ADDR(value):
+    ptr = ll2ctypes.lltype2ctypes(value)
+    addr = ctypes.addressof(ptr.contents.items)
+    print hex(addr)
+    return struct.pack('>Q', addr)
+
 class TestRunningAssembler(object):
     def setup_method(self, method):
         cpu = CPU(None, None)
@@ -204,3 +209,21 @@
             self.mc.CGDBR(reg.r2, msk.RND_CURMODE, reg.f0)
         self.a.jmpto(reg.r14)
         assert run_asm(self.a) == -15
+
+    def test_float_to_memory(self):
+        with lltype.scoped_alloc(DOUBLE_ARRAY_PTR.TO, 16) as mem:
+            with self.label('func', func=True):
+                with self.label('lit'):
+                    self.mc.BRAS(reg.r13, loc.imm(0))
+                self.mc.write(BFL(-15.0))
+                self.mc.write(ADDR(mem))
+                self.jump_here(self.mc.BRAS, 'lit')
+                self.mc.LD(reg.f0, loc.addr(0, reg.r13))
+                self.mc.LDR(reg.f1, reg.f0)
+                self.mc.ADBR(reg.f0, reg.f1)
+                self.mc.LG(reg.r11, loc.addr(8, reg.r13))
+                self.mc.STD(reg.f0, loc.addr(0, reg.r11))
+            self.a.jmpto(reg.r14)
+            run_asm(self.a)
+            assert mem[0] == -30.0
+


More information about the pypy-commit mailing list