[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