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