Author: edelsohn
Branch: ppc-backend-2
Changeset: r54690:215a02bf68e1
Date: 2012-04-23 14:31 -0400
http://bitbucket.org/pypy/pypy/changeset/215a02bf68e1/
Log: Add float support to count_reg_args. Add float support to
regalloc_mov. Fix arglocs typo.
diff --git a/pypy/jit/backend/ppc/helper/assembler.py
b/pypy/jit/backend/ppc/helper/assembler.py
--- a/pypy/jit/backend/ppc/helper/assembler.py
+++ b/pypy/jit/backend/ppc/helper/assembler.py
@@ -61,7 +61,8 @@
count = 0
for x in range(min(len(args), MAX_REG_PARAMS)):
if args[x].type == FLOAT:
- assert 0, "not implemented yet"
+ count += 1
+ words += 1
else:
count += 1
words += 1
diff --git a/pypy/jit/backend/ppc/opassembler.py
b/pypy/jit/backend/ppc/opassembler.py
--- a/pypy/jit/backend/ppc/opassembler.py
+++ b/pypy/jit/backend/ppc/opassembler.py
@@ -177,31 +177,31 @@
class FloatOpAssembler(object):
_mixin_ = True
- def emit_float_add(self, op, argsloc, regalloc):
+ def emit_float_add(self, op, arglocs, regalloc):
l0, l1, res = arglocs
self.mc.fadd(res.value, l0.value, l1.value)
- def emit_float_sub(self, op, argsloc, regalloc):
+ def emit_float_sub(self, op, arglocs, regalloc):
l0, l1, res = arglocs
self.mc.fsub(res.value, l0.value, l1.value)
- def emit_float_mul(self, op, argsloc, regalloc):
+ def emit_float_mul(self, op, arglocs, regalloc):
l0, l1, res = arglocs
self.mc.fmul(res.value, l0.value, l1.value)
- def emit_float_truediv(self, op, argsloc, regalloc):
+ def emit_float_truediv(self, op, arglocs, regalloc):
l0, l1, res = arglocs
self.mc.fdiv(res.value, l0.value, l1.value)
- def emit_float_neg(self, op, argsloc, regalloc):
+ def emit_float_neg(self, op, arglocs, regalloc):
l0, res = arglocs
self.mc.fneg(res.value, l0.value)
- def emit_float_abs(self, op, argsloc, regalloc):
+ def emit_float_abs(self, op, arglocs, regalloc):
l0, res = arglocs
self.mc.fabs(res.value, l0.value)
- def emit_float_sqrt(self, op, argsloc, regalloc):
+ def emit_float_sqrt(self, op, arglocs, regalloc):
l0, res = arglocs
self.mc.fsqrt(res.value, l0.value)
diff --git a/pypy/jit/backend/ppc/ppc_assembler.py
b/pypy/jit/backend/ppc/ppc_assembler.py
--- a/pypy/jit/backend/ppc/ppc_assembler.py
+++ b/pypy/jit/backend/ppc/ppc_assembler.py
@@ -1168,6 +1168,17 @@
self.mc.load(r.SCRATCH.value, r.SPP.value, offset)
self.mc.store(r.SCRATCH.value, r.SPP.value, target_offset)
return
+ elif loc.is_fp_reg():
+ assert prev_loc.type == FLOAT, 'source not float location'
+ with scratch_reg(self.mc):
+ offset = prev_loc.value
+ if not _check_imm_arg(offset):
+ self.mc.load_imm(r.SCRATCH, offset)
+ self.mc.sub(r.SCRATCH.value, r.SPP.value,
r.SCRATCH.value)
+ else:
+ self.mc.sub(r.SCRATCH.value, r.SPP.value,
r.SCRARTCH.value)
+ self.mc.lfdx(loc.value, 0, r.SCRATCH.value)
+ return
assert 0, "not supported location"
elif prev_loc.is_reg():
reg = prev_loc.as_key()
@@ -1182,6 +1193,35 @@
self.mc.store(reg, r.SPP.value, offset)
return
assert 0, "not supported location"
+ elif prev_loc.is_imm_float():
+ if loc.is_fp_reg():
+ with scratch_reg(self.mc):
+ self.mc.load_imm(r.SCRATCH, value)
+ self.mc.lfdx(loc, 0, r.SCRATCH)
+ return
+ elif loc.is_stack():
+ with scratch_reg(self.mc):
+ offset = loc.value
+ self.mc.load_imm(r.SCRATCH, value)
+ self.mc.store(r.SCRATCH.value, r.SPP.value, offset)
+ return
+ assert 0, "not supported location"
+ elif prev_loc.is_fp_reg():
+ if loc.is_fp_reg():
+ self.mc.fmr(loc.value, prev_loc.value)
+ return
+ elif loc.is_stack():
+ assert loc.type == FLOAT, "target not float location"
+ with scratch_reg(self.mc):
+ offset = loc.value
+ if not _check_imm_arg(offset):
+ self.mc.load_imm(r.SCRATCH, offset)
+ self.mc.sub(r.SCRATCH.value, r.SPP.value, offset)
+ else:
+ self.mc.sub(r.SCRATCH.value, r.SPP.value,
r.SCRATCH.value)
+ self.mc.stfdx(prev_loc.value, 0, r.SCRATCH.value)
+ return
+ assert 0, "not supported location"
assert 0, "not supported location"
mov_loc_loc = regalloc_mov
diff --git a/pypy/jit/backend/ppc/regalloc.py b/pypy/jit/backend/ppc/regalloc.py
--- a/pypy/jit/backend/ppc/regalloc.py
+++ b/pypy/jit/backend/ppc/regalloc.py
@@ -1,6 +1,7 @@
from pypy.jit.backend.llsupport.regalloc import (RegisterManager, FrameManager,
TempBox,
compute_vars_longevity)
from pypy.jit.backend.ppc.arch import (WORD, MY_COPY_OF_REGS, IS_PPC_32)
+from pypy.jit.codewriter import longlong
from pypy.jit.backend.ppc.jump import remap_frame_layout
from pypy.jit.backend.ppc.locations import imm
from pypy.jit.backend.ppc.helper.regalloc import (_check_imm_arg,
@@ -10,7 +11,7 @@
prepare_binary_int_op_with_imm,
prepare_unary_cmp,
prepare_float_op)
-from pypy.jit.metainterp.history import (Const, ConstInt, ConstPtr,
+from pypy.jit.metainterp.history import (Const, ConstInt, ConstFloat, ConstPtr,
Box, BoxPtr,
INT, REF, FLOAT)
from pypy.jit.metainterp.history import JitCellToken, TargetToken
@@ -57,7 +58,7 @@
def convert_to_imm(self, c):
adr = self.assembler.datablockwrapper.malloc_aligned(8, 8)
x = c.getfloatstorage()
- rffi.cast(rffi.CArrayPtr(long.FLOATSTORAGE), adr)[0] = x
+ rffi.cast(rffi.CArrayPtr(longlong.FLOATSTORAGE), adr)[0] = x
return locations.ConstFloatLoc(adr)
def __init__(self, longevity, frame_manager=None, assembler=None):
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit