Author: edelsohn Branch: ppc-backend-2 Changeset: r54695:a98d6daa8fec Date: 2012-04-23 15:19 -0400 http://bitbucket.org/pypy/pypy/changeset/a98d6daa8fec/
Log: Add float support to emit_finish. 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 @@ -346,12 +346,20 @@ with scratch_reg(self.mc): self.mc.load_imm(r.SCRATCH, adr) self.mc.storex(loc.value, 0, r.SCRATCH.value) - elif loc.is_vfp_reg(): + elif loc.is_fp_reg(): assert box.type == FLOAT - assert 0, "not implemented yet" + adr = self.fail_boxes_float.get_addr_for_num(i) + with scratch_reg(self.mc): + self.mc.load_imm(r.SCRATCH, adr) + self.mc.stfdx(loc.value, 0, r.SCRATCH.value) elif loc.is_stack() or loc.is_imm() or loc.is_imm_float(): if box.type == FLOAT: - assert 0, "not implemented yet" + adr = self.fail_boxes_float.get_addr_for_num(i) + self.mc.stfd(r.f0.value, r.SPP.value, 0) + self.mov_loc_loc(loc, r.f0.value) + self.mc.load_imm(r.SCRATCH, adr) + self.mc.stfdx(r.f0.value, 0, r.SCRATCH.value) + self.mc.lfd(r.f0.value, r.SPP.value, 0) elif box.type == REF or box.type == INT: if box.type == REF: adr = self.fail_boxes_ptr.get_addr_for_num(i) @@ -459,7 +467,8 @@ for i in range(reg_args, n_args): arg = arglocs[i] if arg.type == FLOAT: - assert 0, "not implemented yet" + count += 1 + n += WORD else: count += 1 n += WORD 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 @@ -20,6 +20,7 @@ from pypy.jit.backend.model import CompiledLoopToken from pypy.rpython.lltypesystem import lltype, rffi, llmemory from pypy.jit.metainterp.resoperation import rop, ResOperation +from pypy.jit.codewriter import longlong from pypy.jit.metainterp.history import (INT, REF, FLOAT) from pypy.jit.backend.x86.support import values_array from pypy.rlib.debug import (debug_print, debug_start, debug_stop, @@ -83,6 +84,8 @@ def __init__(self, cpu, failargs_limit=1000): self.cpu = cpu self.fail_boxes_int = values_array(lltype.Signed, failargs_limit) + self.fail_boxes_float = values_array(longlong.FLOATSTORAGE, + failargs_limit) self.fail_boxes_ptr = values_array(llmemory.GCREF, failargs_limit) self.mc = None self.datablockwrapper = None @@ -1371,11 +1374,14 @@ self.mc.store(r.SCRATCH.value, r.SPP.value, self.FORCE_INDEX_AREA) def load(self, loc, value): - assert loc.is_reg() and value.is_imm() + assert (loc.is_reg() and value.is_imm() + or loc.is_fp_reg() and value.is_imm_float()) if value.is_imm(): self.mc.load_imm(loc, value.getint()) elif value.is_imm_float(): - assert 0, "not implemented yet" + with scratch_reg(self.mc): + self.mc.load_imm(r.SCRATCH, value.getint()) + self.mc.lfdx(loc.value, 0, r.SCRATCH.value) def notimplemented_op(self, op, arglocs, regalloc): print "[PPC/asm] %s not implemented" % op.getopname() _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit