Author: hager <sven.ha...@uni-duesseldorf.de> Branch: ppc-jit-backend Changeset: r47721:72bc90d0a73b Date: 2011-09-30 18:44 +0200 http://bitbucket.org/pypy/pypy/changeset/72bc90d0a73b/
Log: Adopted gen_descr_encoding from ARM backend and applied fix to a problem that occured when allocating memory for guard encodings. 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 @@ -282,6 +282,60 @@ looptoken.ppc_code = loop_start + start_pos self._teardown() + # For an explanation of the encoding, see + # backend/arm/assembler.py + def gen_descr_encoding(self, descr, args, arglocs): + minsize = (len(arglocs) - 1) * 6 + 5 + memsize = self.align(minsize) + memaddr = self.datablockwrapper.malloc_aligned(memsize, alignment=1) + mem = rffi.cast(rffi.CArrayPtr(lltype.Char), memaddr) + i = 0 + j = 0 + while i < len(args): + if arglocs[i+1]: + arg = args[i] + loc = arglocs[i+1] + if arg.type == INT: + mem[j] = self.INT_TYPE + j += 1 + elif arg.type == REF: + mem[j] = self.REF_TYPE + j += 1 + elif arg.type == FLOAT: + mem[j] = self.FLOAT_TYPE + j += 1 + else: + assert 0, 'unknown type' + + if loc.is_reg() or loc.is_vfp_reg(): + mem[j] = chr(loc.value) + j += 1 + elif loc.is_imm() or loc.is_imm_float(): + assert (arg.type == INT or arg.type == REF + or arg.type == FLOAT) + mem[j] = self.IMM_LOC + encode32(mem, j+1, loc.getint()) + j += 5 + else: + mem[j] = self.STACK_LOC + encode32(mem, j+1, loc.position) + j += 5 + else: + mem[j] = self.EMPTY_LOC + j += 1 + i += 1 + + mem[j] = chr(0xFF) + + n = self.cpu.get_fail_descr_number(descr) + encode32(mem, j+1, n) + return memaddr + + def align(self, size): + while size % 8 != 0: + size += 1 + return size + def _teardown(self): self.patch_list = None self.pending_guards = None _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit