[pypy-commit] pypy ppc-jit-backend: Implemented NEW_WITH_VTABLE

hager noreply at buildbot.pypy.org
Wed Nov 16 17:55:09 CET 2011


Author: hager <sven.hager at uni-duesseldorf.de>
Branch: ppc-jit-backend
Changeset: r49476:7ad615ae7faf
Date: 2011-11-16 17:54 +0100
http://bitbucket.org/pypy/pypy/changeset/7ad615ae7faf/

Log:	Implemented NEW_WITH_VTABLE

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
@@ -610,6 +610,19 @@
         # XXX do exception handling here!
         pass
 
+    def emit_new_with_vtable(self, op, arglocs, regalloc):
+        classint = arglocs[0].value
+        self.set_vtable(op.result, classint)
+
+    def set_vtable(self, box, vtable):
+        if self.cpu.vtable_offset is not None:
+            adr = rffi.cast(lltype.Signed, vtable)
+            self.mc.load_imm(r.r0, adr)
+            if IS_PPC_32:
+                self.mc.stw(r.r0.value, r.r3.value, self.cpu.vtable_offset)
+            else:
+                self.mc.std(r.r0.value, r.r3.value, self.cpu.vtable_offset)
+
     def emit_new_array(self, op, arglocs, regalloc):
         # XXX handle memory errors
         if len(arglocs) > 0:
diff --git a/pypy/jit/backend/ppc/ppcgen/regalloc.py b/pypy/jit/backend/ppc/ppcgen/regalloc.py
--- a/pypy/jit/backend/ppc/ppcgen/regalloc.py
+++ b/pypy/jit/backend/ppc/ppcgen/regalloc.py
@@ -639,6 +639,18 @@
         self.possibly_free_var(op.result)
         return []
 
+    def prepare_new_with_vtable(self, op):
+        classint = op.getarg(0).getint()
+        descrsize = heaptracker.vtable2descr(self.cpu, classint)
+        # XXX add fastpath for allocation
+        callargs = self._prepare_args_for_new_op(descrsize)
+        force_index = self.assembler.write_new_force_index()
+        self.assembler._emit_call(force_index, self.assembler.malloc_func_addr,
+                                    callargs, self, result=op.result)
+        self.possibly_free_vars(callargs)
+        self.possibly_free_var(op.result)
+        return [imm(classint)]
+
     def prepare_new_array(self, op):
         gc_ll_descr = self.cpu.gc_ll_descr
         if gc_ll_descr.get_funcptr_for_newarray is not None:


More information about the pypy-commit mailing list