[pypy-svn] r40751 - pypy/dist/pypy/jit/codegen/ppc

mwh at codespeak.net mwh at codespeak.net
Mon Mar 19 11:25:28 CET 2007


Author: mwh
Date: Mon Mar 19 11:25:27 2007
New Revision: 40751

Modified:
   pypy/dist/pypy/jit/codegen/ppc/instruction.py
   pypy/dist/pypy/jit/codegen/ppc/rgenop.py
Log:
fixing the ppc jit tests step 2 of n: enough raising op support to pass the
relevant tests in rgenop_tests.


Modified: pypy/dist/pypy/jit/codegen/ppc/instruction.py
==============================================================================
--- pypy/dist/pypy/jit/codegen/ppc/instruction.py	(original)
+++ pypy/dist/pypy/jit/codegen/ppc/instruction.py	Mon Mar 19 11:25:27 2007
@@ -239,6 +239,30 @@
                      self.result_reg.number,
                      self.arg_reg.number)
 
+
+class Insn_GPR(Insn):
+    def __init__(self, methptr, result):
+        Insn.__init__(self)
+        self.methptr = methptr
+
+        self.result = result
+        self.result_regclass = GP_REGISTER
+        self.reg_args = []
+        self.reg_arg_regclasses = []
+        self.result_reg = None
+    def allocate(self, allocator):
+        self.result_reg = allocator.loc_of(self.result)
+    def __repr__(self):
+        if self.result_reg:
+            r = "%s@%s"%(self.result, self.result_reg)
+        else:
+            r = str(self.result)
+        return "<%s-%d %s %s>" % (self.__class__.__name__, self._magic_index,
+                                  self.methptr.im_func.func_name, r)
+    def emit(self, asm):
+        self.methptr(asm,
+                     self.result_reg.number)
+
 class Insn_GPR__IMM(Insn):
     def __init__(self, methptr, result, args):
         Insn.__init__(self)
@@ -327,6 +351,40 @@
                      self.reg2.number,
                      self.reg3.number)
 
+class Extrwi(Insn):
+    def __init__(self, result, source, size, bit):
+        Insn.__init__(self)
+
+        self.result = result
+        self.result_regclass = GP_REGISTER
+        self.reg_args = [source]
+        self.reg_arg_regclasses = [GP_REGISTER]
+        self.result_reg = None
+        self.arg_reg = None
+
+        self.size = size
+        self.bit = bit
+    def allocate(self, allocator):
+        self.result_reg = allocator.loc_of(self.result)
+        self.arg_reg = allocator.loc_of(self.reg_args[0])
+    def __repr__(self):
+        if self.result_reg:
+            r = "%s@%s"%(self.result, self.result_reg)
+        else:
+            r = str(self.result)
+        if self.arg_reg:
+            a = "%s@%s"%(self.reg_args[0], self.arg_reg)
+        else:
+            a = str(self.reg_args[0])
+        return "<%s-%d extrwi %s, %s, %s, %s>" % (self.__class__.__name__, self._magic_index,
+                                                  r, a, self.size, self.bit)
+
+    def emit(self, asm):
+        asm.extrwi(self.result_reg.number,
+                   self.arg_reg.number,
+                   self.size, self.bit)
+
+
 class CMPInsn(Insn):
     def __init__(self, info, result):
         Insn.__init__(self)

Modified: pypy/dist/pypy/jit/codegen/ppc/rgenop.py
==============================================================================
--- pypy/dist/pypy/jit/codegen/ppc/rgenop.py	(original)
+++ pypy/dist/pypy/jit/codegen/ppc/rgenop.py	Mon Mar 19 11:25:27 2007
@@ -270,6 +270,18 @@
         #print '->', id(r)
         return r
 
+    @specialize.arg(1)
+    def genraisingop2(self, opname, gv_arg1, gv_arg2):
+        genmethod = getattr(self, 'raisingop_' + opname)
+        r = genmethod(gv_arg1, gv_arg2)
+        return r
+
+    @specialize.arg(1)
+    def genraisingop1(self, opname, gv_arg):
+        genmethod = getattr(self, 'raisingop_' + opname)
+        r = genmethod(gv_arg)
+        return r
+
     def genop_ptr_iszero(self, kind, gv_ptr):
         return self.op_ptr_iszero(gv_ptr)
 
@@ -810,6 +822,16 @@
 
         return targetbuilder
 
+    def _ov(self):
+        # mfxer rFOO
+        # extrwi rBAR, rFOO, 1, 1
+        gv_xer = Var()
+        self.insns.append(
+            insn.Insn_GPR(_PPC.mfxer, gv_xer))
+        gv_ov = Var()
+        self.insns.append(insn.Extrwi(gv_ov, gv_xer, 1, 1))
+        return gv_ov
+
     def op_bool_not(self, gv_arg):
         return self._arg_uimm_op(gv_arg, self.rgenop.genconst(1), RPPCAssembler.xori)
 
@@ -819,14 +841,21 @@
     def op_int_neg(self, gv_arg):
         return self._arg_op(gv_arg, _PPC.neg)
 
-    ## op_int_neg_ovf(self, gv_arg) XXX
+    def raisingop_int_neg_ovf(self, gv_arg):
+        gv_result = self._arg_op(gv_arg, _PPC.nego)
+        gv_ov = self._ov()
+        return (gv_result, gv_ov)
 
     def op_int_abs(self, gv_arg):
         gv_sign = self._arg_uimm_op(gv_arg, self.rgenop.genconst(31), _PPC.srawi)
         gv_maybe_inverted = self._arg_arg_op(gv_arg, gv_sign, _PPC.xor)
         return self._arg_arg_op(gv_sign, gv_maybe_inverted, _PPC.subf)
 
-    ## op_int_abs_ovf(self, gv_arg):
+    def raisingop_int_abs_ovf(self, gv_arg):
+        gv_sign = self._arg_uimm_op(gv_arg, self.rgenop.genconst(31), _PPC.srawi)
+        gv_maybe_inverted = self._arg_arg_op(gv_arg, gv_sign, _PPC.xor)
+        gv_result = self._arg_arg_op(gv_sign, gv_maybe_inverted, _PPC.subfo)
+        return (gv_result, self._ov())
 
     def op_int_invert(self, gv_arg):
         return self._arg_op(gv_arg, _PPC.not_)
@@ -835,13 +864,28 @@
         return self._arg_arg_op_with_simm(gv_x, gv_y, _PPC.add, _PPC.addi,
                                           commutative=True)
 
+    def raisingop_int_add_ovf(self, gv_x, gv_y):
+        gv_result = self._arg_arg_op(gv_x, gv_y, _PPC.addo)
+        gv_ov = self._ov()
+        return (gv_result, gv_ov)
+
     def op_int_sub(self, gv_x, gv_y):
         return self._arg_arg_op_with_simm(gv_x, gv_y, _PPC.sub, _PPC.subi)
 
+    def raisingop_int_sub_ovf(self, gv_x, gv_y):
+        gv_result = self._arg_arg_op(gv_x, gv_y, _PPC.subo)
+        gv_ov = self._ov()
+        return (gv_result, gv_ov)
+
     def op_int_mul(self, gv_x, gv_y):
         return self._arg_arg_op_with_simm(gv_x, gv_y, _PPC.mullw, _PPC.mulli,
                                           commutative=True)
 
+    def raisingop_int_mul_ovf(self, gv_x, gv_y):
+        gv_result = self._arg_arg_op(gv_x, gv_y, _PPC.mullwo)
+        gv_ov = self._ov()
+        return (gv_result, gv_ov)
+
     def op_int_floordiv(self, gv_x, gv_y):
         return self._arg_arg_op(gv_x, gv_y, _PPC.divw)
 



More information about the Pypy-commit mailing list