Author: Richard Plangger <[email protected]>
Branch: s390x-backend
Changeset: r80791:e224f731963f
Date: 2015-11-20 12:48 +0100
http://bitbucket.org/pypy/pypy/changeset/e224f731963f/

Log:    pushing forward floating point arithmetic (work in progress), lunch
        needed

diff --git a/rpython/jit/backend/zarch/helper/regalloc.py 
b/rpython/jit/backend/zarch/helper/regalloc.py
--- a/rpython/jit/backend/zarch/helper/regalloc.py
+++ b/rpython/jit/backend/zarch/helper/regalloc.py
@@ -152,6 +152,25 @@
     self.free_op_vars()
     return [l0, l1]
 
+def generate_prepare_float_binary_op(allow_swap=False):
+    def prepare_float_binary_op(self, op):
+        a0 = op.getarg(0)
+        a1 = op.getarg(1)
+        if allow_swap:
+            if isinstance(a0, Const):
+                a0,a1 = a1,a0
+        l0 = self.ensure_reg(a0)
+        l1 = self.ensure_reg(a1)
+        if isinstance(a0, Const):
+            newloc = self.force_allocate_reg(op)
+            self.assembler.regalloc_mov(l0, newloc)
+            l0 = newloc
+        else:
+            self.force_result_in_reg(op, a0)
+        self.free_op_vars()
+        return [l0, l1]
+    return prepare_float_binary_op
+
 def prepare_unary_cmp(self, op):
     a0 = op.getarg(0)
     assert not isinstance(a0, ConstInt)
diff --git a/rpython/jit/backend/zarch/opassembler.py 
b/rpython/jit/backend/zarch/opassembler.py
--- a/rpython/jit/backend/zarch/opassembler.py
+++ b/rpython/jit/backend/zarch/opassembler.py
@@ -173,33 +173,10 @@
 class FloatOpAssembler(object):
     _mixin_ = True
 
-    def emit_float_add(self, op, arglocs, regalloc):
-        l0, l1 = arglocs
-        if l1.is_in_pool():
-            self.mc.ADB(l0, l1)
-        else:
-            self.mc.ADBR(l0, l1)
-
-    def emit_float_sub(self, op, arglocs, regalloc):
-        l0, l1 = arglocs
-        if l1.is_in_pool():
-            self.mc.SDB(l0, l1)
-        else:
-            self.mc.SDBR(l0, l1)
-
-    def emit_float_mul(self, op, arglocs, regalloc):
-        l0, l1 = arglocs
-        if l1.is_in_pool():
-            self.mc.MDB(l0, l1)
-        else:
-            self.mc.MDBR(l0, l1)
-
-    def emit_float_div(self, op, arglocs, regalloc):
-        l0, l1 = arglocs
-        if l1.is_in_pool():
-            self.mc.DDB(l0, l1)
-        else:
-            self.mc.DDBR(l0, l1)
+    emit_float_add = gen_emit_rr_or_rpool('ADBR','ADB')
+    emit_float_sub = gen_emit_rr_or_rpool('SDBR','SDB')
+    emit_float_mul = gen_emit_rr_or_rpool('MDBR','MDB')
+    emit_float_truediv = gen_emit_rr_or_rpool('DDBR','DDB')
 
     def emit_cast_float_to_int(self, op, arglocs, regalloc):
         f0, r0 = arglocs
diff --git a/rpython/jit/backend/zarch/regalloc.py 
b/rpython/jit/backend/zarch/regalloc.py
--- a/rpython/jit/backend/zarch/regalloc.py
+++ b/rpython/jit/backend/zarch/regalloc.py
@@ -55,6 +55,7 @@
     box_types             = [FLOAT]
     save_around_call_regs = r.VOLATILES_FLOAT
     assert set(save_around_call_regs).issubset(all_regs)
+    pool = None
 
     def convert_to_adr(self, c):
         assert isinstance(c, ConstFloat)
@@ -64,8 +65,8 @@
         return adr
 
     def convert_to_imm(self, c):
-        adr = self.convert_to_adr(c)
-        return l.ConstFloatLoc(adr)
+        off = self.pool.get_offset(c)
+        return l.pool(off)
 
     def __init__(self, longevity, frame_manager=None, assembler=None):
         RegisterManager.__init__(self, longevity, frame_manager, assembler)
@@ -330,6 +331,7 @@
                                      assembler = self.assembler)
         self.fprm = FPRegisterManager(self.longevity, frame_manager = self.fm,
                                       assembler = self.assembler)
+        self.fprm.pool = self.assembler.pool
         return operations
 
     def prepare_loop(self, inputargs, operations, looptoken, allgcrefs):
@@ -668,10 +670,11 @@
     prepare_int_force_ge_zero = helper.prepare_unary_op
 
 
-    prepare_float_add = helper.prepare_binary_op
-    prepare_float_sub = helper.prepare_binary_op
-    prepare_float_mul = helper.prepare_binary_op
-    prepare_float_truediv = helper.prepare_binary_op
+    prepare_float_add = 
helper.generate_prepare_float_binary_op(allow_swap=True)
+    prepare_float_sub = helper.generate_prepare_float_binary_op()
+    prepare_float_mul = 
helper.generate_prepare_float_binary_op(allow_swap=True)
+    prepare_float_truediv = helper.generate_prepare_float_binary_op()
+
 
     prepare_cast_ptr_to_int = helper.prepare_same_as
     prepare_cast_int_to_ptr = helper.prepare_same_as
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to