Author: hager <sven.ha...@uni-duesseldorf.de> Branch: ppc-jit-backend Changeset: r50470:eb94afc2c1cd Date: 2011-12-13 21:01 +0100 http://bitbucket.org/pypy/pypy/changeset/eb94afc2c1cd/
Log: (bivab, hager): Implementation of CALL_ASSEMBLER seems to work diff --git a/pypy/jit/backend/ppc/ppcgen/opassembler.py b/pypy/jit/backend/ppc/ppcgen/opassembler.py --- a/pypy/jit/backend/ppc/ppcgen/opassembler.py +++ b/pypy/jit/backend/ppc/ppcgen/opassembler.py @@ -362,11 +362,12 @@ for i, arg in enumerate(stack_args): offset = param_offset + i * WORD if arg is not None: - self.mc.load_imm(r.r0, arg.value) + #self.mc.load_imm(r.SCRATCH, arg.value) + self.regalloc_mov(regalloc.loc(arg), r.SCRATCH) if IS_PPC_32: - self.mc.stw(r.r0.value, r.SP.value, offset) + self.mc.stw(r.SCRATCH.value, r.SP.value, offset) else: - self.mc.std(r.r0.value, r.SP.value, offset) + self.mc.std(r.SCRATCH.value, r.SP.value, offset) self.mc.free_scratch_reg() # collect variables that need to go in registers @@ -397,16 +398,16 @@ regalloc.before_call(save_all_regs=2) # remap values stored in core registers - remap_frame_layout(self, non_float_locs, non_float_regs, r.r0) + remap_frame_layout(self, non_float_locs, non_float_regs, r.SCRATCH) # the actual call if IS_PPC_32: self.mc.bl_abs(adr) else: - self.mc.load_from_addr(r.r0, adr) - self.mc.load_from_addr(r.r2, adr + WORD) + self.mc.load_from_addr(r.SCRATCH, adr) + self.mc.load_from_addr(r.TOC, adr + WORD) self.mc.load_from_addr(r.r11, adr + 2 * WORD) - self.mc.mtctr(r.r0.value) + self.mc.mtctr(r.SCRATCH.value) self.mc.bctrl() @@ -855,12 +856,12 @@ raise AssertionError(kind) # check value resloc = regalloc.try_allocate_reg(resbox) - assert resloc is r.r3 + assert resloc is r.RES self.mc.alloc_scratch_reg(value) if IS_PPC_32: - self.mc.cmpw(0, resloc.value, r.r0.value) + self.mc.cmpw(0, resloc.value, r.SCRATCH.value) else: - self.mc.cmpd(0, resloc.value, r.r0.value) + self.mc.cmpd(0, resloc.value, r.SCRATCH.value) self.mc.free_scratch_reg() regalloc.possibly_free_var(resbox) @@ -874,21 +875,22 @@ jd = descr.outermost_jitdriver_sd assert jd is not None asm_helper_adr = self.cpu.cast_adr_to_int(jd.assembler_helper_adr) - with saved_registers(self.mc, r.NONVOLATILES + [r.r3]): - # resbox is already in r3 - self.mov_loc_loc(arglocs[1], r.r4) - if IS_PPC_32: - self.mc.bl_abs(asm_helper_adr) - else: - self.mc.load_from_addr(r.r0, asm_helper_adr) - self.mc.load_from_addr(r.r2, asm_helper_adr + WORD) - self.mc.load_from_addr(r.r11, asm_helper_adr + 2 * WORD) - self.mc.mtctr(r.r0.value) - self.mc.bctrl() - if op.result: - resloc = regalloc.after_call(op.result) - if resloc.is_vfp_reg(): - assert 0, "not implemented yet" + + # do call to helper function + self.mov_loc_loc(arglocs[1], r.r4) + if IS_PPC_32: + self.mc.bl_abs(asm_helper_adr) + else: + self.mc.load_from_addr(r.SCRATCH, asm_helper_adr) + self.mc.load_from_addr(r.TOC, asm_helper_adr + WORD) + self.mc.load_from_addr(r.r11, asm_helper_adr + 2 * WORD) + self.mc.mtctr(r.r0.value) + self.mc.bctrl() + + if op.result: + resloc = regalloc.after_call(op.result) + if resloc.is_vfp_reg(): + assert 0, "not implemented yet" # jump to merge point jmp_pos = self.mc.currpos() @@ -898,8 +900,10 @@ # Fast Path using result boxes # patch the jump to the fast path offset = self.mc.currpos() - fast_jmp_pos - pmc = OverwritingBuilder(self.mc, fast_jmp_pos, WORD) - pmc.b(offset) + pmc = OverwritingBuilder(self.mc, fast_jmp_pos, 1) + # 12 and 2 mean: jump if the 3rd bit in CR is set + pmc.bc(12, 2, offset) + pmc.overwrite() # Reset the vable token --- XXX really too much special logic here:-( if jd.index_of_virtualizable >= 0: @@ -909,12 +913,12 @@ ofs = fielddescr.offset resloc = regalloc.force_allocate_reg(resbox) self.alloc_scratch_reg() - self.mov_loc_loc(arglocs[1], r.r0) + self.mov_loc_loc(arglocs[1], r.SCRATCH) self.mc.li(resloc.value, 0) if IS_PPC_32: - self.mc.stwx(resloc.value, 0, r.r0.value) + self.mc.stwx(resloc.value, 0, r.SCRATCH.value) else: - self.mc.stdx(resloc.value, 0, r.r0.value) + self.mc.stdx(resloc.value, 0, r.SCRATCH.value) self.free_scratch_reg() regalloc.possibly_free_var(resbox) @@ -936,21 +940,25 @@ assert 0, "not implemented yet" else: if IS_PPC_32: - self.mc.lwzx(resloc.value, 0, r.r0.value) + self.mc.lwzx(resloc.value, 0, r.SCRATCH.value) else: - self.mc.ldx(resloc.value, 0, r.r0.value) + self.mc.ldx(resloc.value, 0, r.SCRATCH.value) self.mc.free_scratch_reg() # merge point offset = self.mc.currpos() - jmp_pos + if offset >= 0: + pmc = OverwritingBuilder(self.mc, jmp_pos, 1) + pmc.b(offset) + pmc.overwrite() self.mc.alloc_scratch_reg() if IS_PPC_32: - self.mc.cmpwi(0, r.r0.value, 0) - self.mc.lwz(r.r0.value, r.SPP.value, 0) + self.mc.cmpwi(0, r.SCRATCH.value, 0) + self.mc.lwz(r.SCRATCH.value, r.SPP.value, 0) else: - self.mc.cmpdi(0, r.r0.value, 0) - self.mc.ld(r.r0.value, r.SPP.value, 0) + self.mc.cmpdi(0, r.SCRATCH.value, 0) + self.mc.ld(r.SCRATCH.value, r.SPP.value, 0) self.mc.cror(2, 1, 2) self.mc.free_scratch_reg() diff --git a/pypy/jit/backend/ppc/ppcgen/ppc_assembler.py b/pypy/jit/backend/ppc/ppcgen/ppc_assembler.py --- a/pypy/jit/backend/ppc/ppcgen/ppc_assembler.py +++ b/pypy/jit/backend/ppc/ppcgen/ppc_assembler.py @@ -145,15 +145,15 @@ if IS_PPC_32: # save it in previous frame (Backchain) self.mc.stwu(r.SP.value, r.SP.value, -frame_depth) - self.mc.mflr(r.r0.value) # move old link register + self.mc.mflr(r.SCRATCH.value) # move old link register # save old link register in previous frame - self.mc.stw(r.r0.value, r.SP.value, frame_depth + WORD) + self.mc.stw(r.SCRATCH.value, r.SP.value, frame_depth + WORD) # save r31 at the bottom of the stack frame self.mc.stw(r.SPP.value, r.SP.value, WORD) else: self.mc.stdu(r.SP.value, r.SP.value, -frame_depth) - self.mc.mflr(r.r0.value) - self.mc.std(r.r0.value, r.SP.value, frame_depth + 2 * WORD) + self.mc.mflr(r.SCRATCH.value) + self.mc.std(r.SCRATCH.value, r.SP.value, frame_depth + 2 * WORD) self.mc.std(r.SPP.value, r.SP.value, WORD) # compute spilling pointer (SPP) @@ -328,7 +328,7 @@ mc.mr(r.r4.value, r.SP.value) # load stack pointer mc.mr(r.r5.value, r.SPP.value) # load spilling pointer # - # load address of decoding function into r0 + # load address of decoding function into SCRATCH mc.alloc_scratch_reg(addr) if IS_PPC_64: mc.std(r.r2.value, r.SP.value, 3 * WORD) @@ -336,7 +336,7 @@ mc.load_imm(r.r2, r2_value) mc.load_imm(r.r11, r11_value) # ... and branch there - mc.mtctr(r.r0.value) + mc.mtctr(r.SCRATCH.value) mc.free_scratch_reg() mc.bctrl() if IS_PPC_64: @@ -386,10 +386,10 @@ if loc.is_reg(): reg = loc else: - reg = r.r0 + reg = r.SCRATCH self.mc.load_from_addr(reg, addr) if loc.is_stack(): - self.regalloc_mov(r.r0, loc) + self.regalloc_mov(r.SCRATCH, loc) def gen_direct_bootstrap_code(self, loophead, looptoken, inputargs, frame_depth): self._make_frame(frame_depth) @@ -424,7 +424,7 @@ # remap values stored in core registers self.mc.alloc_scratch_reg() - remap_frame_layout(self, nonfloat_args, nonfloat_regs, r.r0) + remap_frame_layout(self, nonfloat_args, nonfloat_regs, r.SCRATCH) self.mc.free_scratch_reg() # load values passed on the stack to the corresponding locations @@ -453,10 +453,10 @@ count += 1 self.mc.alloc_scratch_reg() if IS_PPC_32: - self.mc.lwz(r.r0.value, r.SPP.value, stack_position) + self.mc.lwz(r.SCRATCH.value, r.SPP.value, stack_position) else: - self.mc.ld(r.r0.value, r.SPP.value, stack_position) - self.mov_loc_loc(r.r0, loc) + self.mc.ld(r.SCRATCH.value, r.SPP.value, stack_position) + self.mov_loc_loc(r.SCRATCH, loc) self.mc.free_scratch_reg() else: assert 0, 'invalid location' @@ -767,9 +767,9 @@ # store addr in force index field self.mc.alloc_scratch_reg(memaddr) if IS_PPC_32: - self.mc.stw(r.r0.value, r.SPP.value, self.ENCODING_AREA) + self.mc.stw(r.SCRATCH.value, r.SPP.value, self.ENCODING_AREA) else: - self.mc.std(r.r0.value, r.SPP.value, self.ENCODING_AREA) + self.mc.std(r.SCRATCH.value, r.SPP.value, self.ENCODING_AREA) self.mc.free_scratch_reg() if save_exc: @@ -819,12 +819,14 @@ return # move immediate value to memory elif loc.is_stack(): + self.mc.alloc_scratch_reg() offset = loc.as_key() * WORD - WORD - self.mc.load_imm(r.r0.value, value) + self.mc.load_imm(r.SCRATCH.value, value) if IS_PPC_32: - self.mc.stw(r.r0.value, r.SPP.value, offset) + self.mc.stw(r.SCRATCH.value, r.SPP.value, offset) else: - self.mc.std(r.r0.value, r.SPP.value, offset) + self.mc.std(r.SCRATCH.value, r.SPP.value, offset) + self.mc.free_scratch_reg() return assert 0, "not supported location" elif prev_loc.is_stack(): @@ -840,12 +842,14 @@ # move in memory elif loc.is_stack(): target_offset = loc.as_key() * WORD - WORD + self.mc.alloc_scratch_reg() if IS_PPC_32: - self.mc.lwz(r.r0.value, r.SPP.value, offset) - self.mc.stw(r.r0.value, r.SPP.value, target_offset) + self.mc.lwz(r.SCRATCH.value, r.SPP.value, offset) + self.mc.stw(r.SCRATCH.value, r.SPP.value, target_offset) else: - self.mc.ld(r.r0.value, r.SPP.value, offset) - self.mc.std(r.r0.value, r.SPP.value, target_offset) + self.mc.ld(r.SCRATCH.value, r.SPP.value, offset) + self.mc.std(r.SCRATCH.value, r.SPP.value, target_offset) + self.mc.free_scratch_reg() return assert 0, "not supported location" elif prev_loc.is_reg(): @@ -869,7 +873,7 @@ def regalloc_push(self, loc): """Pushes the value stored in loc to the stack - Can trash the current value of r0 when pushing a stack + Can trash the current value of SCRATCH when pushing a stack loc""" if loc.is_stack(): @@ -896,7 +900,7 @@ def regalloc_pop(self, loc): """Pops the value on top of the stack to loc. Can trash the current - value of r0 when popping to a stack loc""" + value of SCRATCH when popping to a stack loc""" if loc.is_stack(): if loc.type == FLOAT: assert 0, "not implemented yet" @@ -962,11 +966,11 @@ return 0 def _write_fail_index(self, fail_index): - self.mc.load_imm(r.r0, fail_index) + self.mc.load_imm(r.SCRATCH, fail_index) if IS_PPC_32: - self.mc.stw(r.r0.value, r.SPP.value, self.ENCODING_AREA) + self.mc.stw(r.SCRATCH.value, r.SPP.value, self.ENCODING_AREA) else: - self.mc.std(r.r0.value, r.SPP.value, self.ENCODING_AREA) + self.mc.std(r.SCRATCH.value, r.SPP.value, self.ENCODING_AREA) def load(self, loc, value): assert loc.is_reg() and value.is_imm() _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit