Author: Richard Plangger <planri...@gmail.com>
Branch: s390x-backend
Changeset: r80385:05b9b0babd4d
Date: 2015-10-22 11:40 +0200
http://bitbucket.org/pypy/pypy/changeset/05b9b0babd4d/

Log:    testing floating point operations, load float and round it to
        integer

diff --git a/rpython/jit/backend/detect_cpu.py 
b/rpython/jit/backend/detect_cpu.py
--- a/rpython/jit/backend/detect_cpu.py
+++ b/rpython/jit/backend/detect_cpu.py
@@ -13,6 +13,7 @@
 MODEL_X86         = 'x86'
 MODEL_X86_NO_SSE2 = 'x86-without-sse2'
 MODEL_X86_64      = 'x86-64'
+MODEL_X86_64_SSE4 = 'x86-64-sse4'
 MODEL_ARM         = 'arm'
 MODEL_PPC_64      = 'ppc-64'
 MODEL_S390_64     = 's390x'
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
@@ -7,6 +7,8 @@
     """ NOT_RPYTHON """
     if arg == 'r' or arg == 'r/m':
         return 0
+    if arg == 'f':
+        return 0
     if arg.startswith('i') or arg.startswith('u'):
         return 0
     return loc.addr(0)
@@ -18,6 +20,7 @@
         """ NOT_RPYTHON """
         """
         Available names:
+        f      - floating point register
         r      - register
         r/m    - register or mask
         iX     - immediate X bits (signed)
@@ -287,11 +290,22 @@
         self.writechar(opcode2)
     return encode_ri
 
+def build_rrf(mnemonic, (opcode1,opcode2)):
+    @builder.arguments('r,r/m,r,r/m')
+    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
+
 def build_unpack_func(mnemonic, func):
     def function(self, *args):
         newargs = [None] * len(args)
         for i,arg in enumerate(unrolling_iterable(func._arguments_)):
-            if arg == 'r' or arg == 'r/m':
+            if arg == 'r' or arg == 'r/m' or arg == 'f':
                 newargs[i] = args[i].value
             elif arg.startswith('i') or arg.startswith('u'):
                 newargs[i] = args[i].value
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
@@ -20,6 +20,8 @@
     'AG':      ('rxy',   ['\xE3','\x08']),
     'AGF':     ('rxy',   ['\xE3','\x18']),
     'AHI':     ('ri',    ['\xA7','\x0A']),
+
+    # floating point
 }
 
 logic_mnemonic_codes = {
@@ -64,6 +66,39 @@
     'OILL':       ('ri_u',     ['\xA5', '\x0B']),
 }
 
+memory_mnemonic_codes = {
+    # load address
+    'LA':      ('rx',    ['\x41']),
+    'LAY':     ('rxy',   ['\xE3','\x71']),
+
+    # load memory
+    'LMD':     ('sse',   ['\xEF']),
+    'LMG':     ('rsy',   ['\xEB','\x04']),
+    'LGHI':    ('ri',    ['\xA7','\x09']),
+    'LR':      ('rr',    ['\x18']),
+    'LGR':     ('rre',   ['\xB9','\x04']),
+    'LG':      ('rxy',   ['\xE3','\x04']),
+
+    # load binary float
+    # E -> short (32bit),
+    # D -> long (64bit),
+    # X -> extended (128bit)
+    'LER':     ('rr',    ['\x38']),
+    'LDR':     ('rr',    ['\x28']),
+    'LE':      ('rx',    ['\x78']),
+    'LD':      ('rx',    ['\x68']),
+    'LEY':     ('rxy',   ['\xED', '\x64']),
+    'LDY':     ('rxy',   ['\xED', '\x65']),
+}
+
+floatingpoint_mnemonic_codes = {
+    'FIEBR':   ('rrf',   ['\xB3','\x57']),
+    'FIDBR':   ('rrf',   ['\xB3','\x5F']),
+
+    'CGEBR':   ('rrf',   ['\xB3','\xA8']),
+    'CGDBR':   ('rrf',   ['\xB3','\xA9']),
+}
+
 all_mnemonic_codes = {
     #
     'BXH':     ('rs',    ['\x86']),
@@ -77,15 +112,6 @@
     'SRP':     ('ssc',   ['\xF0']),
     'MVCK':    ('ssd',   ['\xD9']),
 
-    'LA':      ('rx',    ['\x41']),
-    'LAY':     ('rxy',   ['\xE3','\x71']),
-    'LMD':     ('sse',   ['\xEF']),
-    'LMG':     ('rsy',   ['\xEB','\x04']),
-    'LGHI':    ('ri',    ['\xA7','\x09']),
-    'LR':      ('rr',    ['\x18']),
-    'LGR':     ('rre',   ['\xB9','\x04']),
-    'LG':      ('rxy',   ['\xE3','\x04']),
-
     'PKA':     ('ssf',   ['\xE9']),
     'STMG':    ('rsy',   ['\xEB','\x24']),
 
@@ -93,6 +119,8 @@
 }
 all_mnemonic_codes.update(arith_mnemonic_codes)
 all_mnemonic_codes.update(logic_mnemonic_codes)
+all_mnemonic_codes.update(memory_mnemonic_codes)
+all_mnemonic_codes.update(floatingpoint_mnemonic_codes)
 all_mnemonic_codes.update(branch_mnemonic_codes)
 
 
diff --git a/rpython/jit/backend/zarch/test/support.py 
b/rpython/jit/backend/zarch/test/support.py
--- a/rpython/jit/backend/zarch/test/support.py
+++ b/rpython/jit/backend/zarch/test/support.py
@@ -1,9 +1,11 @@
 from rpython.rtyper.lltypesystem import lltype, rffi
 
-def run_asm(asm):
+def run_asm(asm, return_float=False):
     BOOTSTRAP_TP = lltype.FuncType([], lltype.Signed)
     addr = asm.mc.materialize(asm.cpu, [], None)
     assert addr % 8 == 0
     func = rffi.cast(lltype.Ptr(BOOTSTRAP_TP), addr)
     asm.mc._dump_trace(addr, 'test.asm')
+    if return_float:
+        pass
     return func()
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
@@ -1,4 +1,6 @@
+import struct
 from rpython.jit.backend.zarch import conditions as con
+from rpython.jit.backend.zarch import masks as msk
 from rpython.jit.backend.zarch import registers as reg
 from rpython.jit.backend.zarch.assembler import AssemblerZARCH
 from rpython.jit.backend.zarch import locations as loc
@@ -15,12 +17,19 @@
 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
 
 CPU = getcpuclass()
 
 def byte_count(func):
     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))
+
 class TestRunningAssembler(object):
     def setup_method(self, method):
         cpu = CPU(None, None)
@@ -184,3 +193,15 @@
             self.mc.SVC(loc.imm(4))
         self.a.jmpto(reg.r14)
         assert run_asm(self.a) == 14
+
+    def test_float(self):
+        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.jump_here(self.mc.BRAS, 'lit')
+            self.mc.LD(reg.f0, loc.addr(0, reg.r13))
+            self.mc.FIDBR(reg.f1, msk.RND_CURMODE, reg.f0, loc.imm(0))
+            self.mc.CGDBR(reg.r2, msk.RND_CURMODE, reg.f1, loc.imm(0))
+        self.a.jmpto(reg.r14)
+        assert run_asm(self.a) == -15
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
@@ -123,10 +123,13 @@
             break
     return results
 
-REGS = range(15+1)
+REGS = range(16)
 REGNAMES = ['%%r%d' % i for i in REGS]
+FP_REGS = range(16)
+FP_REGNAMES = ['%%f%d' % i for i in FP_REGS]
 TEST_CASE_GENERATE = {
     'r':    REGS,
+    'f':    FP_REGS,
     'r/m':  REGS,
     'i4':   range_of_bits(4, signed=True),
     'i8':   range_of_bits(8, signed=True),
@@ -157,13 +160,11 @@
         func = getattr(AbstractZARCHBuilder, methodname)
         return func._arguments_
 
-    def assembler_operand_reg(self, regnum):
-        return REGNAMES[regnum]
-
     def operand_combinations(self, methodname, modes, arguments):
         mapping = {
-            'r': self.assembler_operand_reg,
-            'r/m': self.assembler_operand_reg,
+            'r': (lambda num: REGNAMES[num]),
+            'r/m': (lambda num: REGNAMES[num]),
+            'f': (lambda num: FP_REGNAMES[num]),
         }
         arg_types = self.get_func_arg_types(methodname)
         for mode, args in zip(arg_types, arguments):
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to