Author: Richard Plangger <planri...@gmail.com>
Branch: s390x-backend
Changeset: r80395:20f482e7b1ef
Date: 2015-10-22 16:01 +0200
http://bitbucket.org/pypy/pypy/changeset/20f482e7b1ef/

Log:    testing single float to float cast, testing int64 to float cast,
        added div (with remainer) instr

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
@@ -5,11 +5,7 @@
 
 def dummy_argument(arg):
     """ NOT_RPYTHON """
-    if arg == 'r' or arg == 'r/m':
-        return 0
-    if arg == 'f':
-        return 0
-    if arg == '-':
+    if arg in ('r', 'r/m', 'm', 'f', '-'):
         return 0
     if arg.startswith('i') or arg.startswith('u'):
         return 0
@@ -25,6 +21,7 @@
         -      - unused
         f      - floating point register
         r      - register
+        m      - mask
         r/m    - register or mask
         iX     - immediate X bits (signed)
         uX     - immediate X bits (unsigend)
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
@@ -102,15 +102,23 @@
 
     'LNEBR':   ('rre',   ['\xB3','\x01']),
     'LNDBR':   ('rre',   ['\xB3','\x11']),
+
+    # load lengthended
+    'LDEBR':   ('rre',   ['\xB3','\x04']),
 }
 
 floatingpoint_mnemonic_codes = {
     'FIEBR':   ('rrf',   ['\xB3','\x57'], 'r,u4,r,-'),
     'FIDBR':   ('rrf',   ['\xB3','\x5F'], 'r,u4,r,-'),
 
+    # convert to fixed
     'CGEBR':   ('rrf',   ['\xB3','\xA8'], 'r,u4,r,-'),
     'CGDBR':   ('rrf',   ['\xB3','\xA9'], 'r,u4,r,-'),
 
+    # convert from fixed
+    'CEGBR':   ('rre',   ['\xB3','\xA4']),
+    'CDGBR':   ('rre',   ['\xB3','\xA5']),
+
     # arithmetic
     # ADDITION
     'AEBR':    ('rre',   ['\xB3','\x0A']),
@@ -133,6 +141,11 @@
     'DDBR':    ('rre',   ['\xB3','\x1D']),
     'DEB':     ('rxe',   ['\xED','\x0D'], 'r,bidl,-'),
     'DDB':     ('rxe',   ['\xED','\x1D'], 'r,bidl,-'),
+    
+    # DIVIDE (+mod)
+    'DIEBR':     ('rrf',   ['\xB3','\x53'], 'r,r,r,m'),
+    'DIDBR':     ('rrf',   ['\xB3','\x5B'], 'r,r,r,m'),
+
 }
 
 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
@@ -20,7 +20,7 @@
 from rpython.rlib.objectmodel import specialize
 from rpython.rlib.debug import ll_assert
 from rpython.rlib.longlong2float import (float2longlong,
-        DOUBLE_ARRAY_PTR)
+        DOUBLE_ARRAY_PTR, singlefloat2uint_emulator)
 import ctypes
 
 CPU = getcpuclass()
@@ -28,13 +28,14 @@
 def byte_count(func):
     return func._byte_count
 
-def BFL(value):
+def BFL(value, short=False):
+    if short:
+        return struct.pack('f', value)
     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)
 
 def isclose(a,b, rel_tol=1e-9, abs_tol=0.0):
@@ -65,6 +66,12 @@
     def float(self, val):
         self.asm.mc.write(BFL(val))
 
+    def single_float(self, val):
+        self.asm.mc.write(BFL(val, short=True))
+
+    def int64(self, val):
+        self.asm.mc.write(struct.pack('>q', val))
+
 class LabelCtx(object):
     def __init__(self, asm, name):
         self.asm = asm
@@ -315,3 +322,32 @@
                 self.mc.STD(reg.f0, loc.addr(0, reg.r11))
             run_asm(self.a)
             assert isclose(mem[0], 0.0)
+
+    def test_cast_single_float_to_float(self):
+        with lltype.scoped_alloc(DOUBLE_ARRAY_PTR.TO, 16) as mem:
+            with ActivationRecordCtx(self):
+                with LiteralPoolCtx(self) as pool:
+                    pool.single_float(6.66)
+                    pool.addr(mem)
+                self.mc.LEY(reg.f1, loc.addr(0, reg.r13))
+                ## cast short to long!
+                self.mc.LDEBR(reg.f0, reg.f1) 
+                self.mc.LG(reg.r11, loc.addr(4, reg.r13))
+                self.mc.STD(reg.f0, loc.addr(0, reg.r11))
+            run_asm(self.a)
+            assert isclose(mem[0], 6.66, abs_tol=0.05)
+
+    def test_cast_int64_to_float(self):
+        with lltype.scoped_alloc(DOUBLE_ARRAY_PTR.TO, 16) as mem:
+            with ActivationRecordCtx(self):
+                with LiteralPoolCtx(self) as pool:
+                    pool.int64(12345)
+                    pool.addr(mem)
+                self.mc.LG(reg.r12, loc.addr(0, reg.r13))
+                # cast int to float!
+                self.mc.CDGBR(reg.f0, reg.r12) 
+                self.mc.LG(reg.r11, loc.addr(8, reg.r13))
+                self.mc.STD(reg.f0, loc.addr(0, reg.r11))
+            run_asm(self.a)
+            assert isclose(mem[0], 12345.0)
+
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
@@ -132,6 +132,7 @@
     'r':    REGS,
     'f':    FP_REGS,
     'r/m':  REGS,
+    'm':    range_of_bits(4),
     'i4':   range_of_bits(4, signed=True),
     'i8':   range_of_bits(8, signed=True),
     'i16':  range_of_bits(16, signed=True),
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to