Author: hager <sven.ha...@uni-duesseldorf.de> Branch: ppc-jit-backend Changeset: r46757:fb5b36c4d073 Date: 2011-08-24 13:29 +0200 http://bitbucket.org/pypy/pypy/changeset/fb5b36c4d073/
Log: merge 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 @@ -484,6 +484,9 @@ srawi = Form("rA", "rS", "SH", "XO1", "Rc")(31, XO1=824, Rc=0) srawix = Form("rA", "rS", "SH", "XO1", "Rc")(31, XO1=824, Rc=1) + srd = XS(31, XO1=539, Rc=0) + srdx = XS(31, XO1=539, Rc=1) + srw = XS(31, XO1=536, Rc=0) srwx = XS(31, XO1=536, Rc=1) @@ -581,9 +584,13 @@ # F.3 Simplified Mnemonics for Compare Instructions + cmpdi = BA.cmpi(L=1) cmpwi = BA.cmpi(L=0) + cmpldi = BA.cmpli(L=1) cmplwi = BA.cmpli(L=0) + cmpd = BA.cmp(L=1) cmpw = BA.cmp(L=0) + cmpld = BA.cmpl(L=1) cmplw = BA.cmpl(L=0) # F.4 Simplified Mnemonics for Rotate and Shift Instructions @@ -618,6 +625,9 @@ def sldi(self, rA, rS, n): self.rldicr(rA, rS, n, 63-n) + def srdi(self, rA, rS, n): + self.rldicl(rA, rS, 64-n, n) + # F.5 Simplified Mnemonics for Branch Instructions # there's a lot of these! @@ -899,29 +909,31 @@ PPCAssembler.__init__(self) def load_word(self, rD, word): - self.addis(rD, 0, hi(word)) - self.ori(rD, rD, lo(word)) + if IS_PPC_32: + self.lis(rD, hi(word)) + self.ori(rD, rD, lo(word)) + else: + self.lis(rD, highest(word)) + self.ori(rD, rD, higher(word)) + self.sldi(rD, rD, 32) + self.oris(rD, rD, high(word)) + self.ori(rD, rD, lo(word)) def load_from(self, rD, addr): if IS_PPC_32: self.addis(rD, 0, ha(addr)) + self.lwz(rD, rD, la(addr)) else: - self.addis(rD, 0, highest(addr)) - self.ori(rD, rD, higher(addr)) - self.sldi(rD, rD, 32) - self.oris(rD, rD, high(addr)) - self.lwz(rD, rD, la(addr)) + self.load_word(rD, addr) + self.ld(rD, rD, 0) def store_reg(self, source_reg, addr): - self.load_word(10, addr) - self.stw(source_reg, 10, 0) - - def load_dword(self, rD, dword): - self.addis(rD, 0, highest(dword)) - self.ori(rD, rD, higher(dword)) - self.sldi(rD, rD, 32) - self.oris(rD, rD, high(dword)) - self.ori(rD, rD, lo(dword)) + if IS_PPC_32: + self.addis(10, 0, ha(addr)) + self.stw(source_reg, 10, la(addr)) + else: + self.load_word(10, addr) + self.std(source_reg, 10, 0) # translate a trace operation to corresponding machine code def build_op(self, trace_op, cpu): @@ -1028,17 +1040,31 @@ def emit_int_mul(self, op, cpu, reg0, reg1, free_reg): # XXX need to care about factors whose product needs 64 bit - self.mullw(free_reg, reg0, reg1) + if IS_PPC_32: + self.mullw(free_reg, reg0, reg1) + else: + self.mulld(free_reg, reg0, reg1) def emit_int_mul_ovf(self, op, cpu, reg0, reg1, free_reg): - self.mullwo(free_reg, reg0, reg1) + if IS_PPC_32: + self.mullwo(free_reg, reg0, reg1) + else: + self.mulldo(free_reg, reg0, reg1) def emit_int_floordiv(self, op, cpu, reg0, reg1, free_reg): - self.divw(free_reg, reg0, reg1) + if IS_PPC_32: + self.divw(free_reg, reg0, reg1) + else: + self.divd(free_reg, reg0, reg1) def emit_int_mod(self, op, cpu, reg0, reg1, free_reg): - self.divw(free_reg, reg0, reg1) - self.mullw(free_reg, free_reg, reg1) + if IS_PPC_32: + self.divw(free_reg, reg0, reg1) + # use shift left of log2 + self.mullw(free_reg, free_reg, reg1) + else: + self.divd(free_reg, reg0, reg1) + self.mulld(free_reg, free_reg, reg1) self.subf(free_reg, free_reg, reg0) def emit_int_and(self, op, cpu, reg0, reg1, free_reg): @@ -1051,46 +1077,72 @@ self.xor(free_reg, reg0, reg1) def emit_int_lshift(self, op, cpu, reg0, reg1, free_reg): - self.slw(free_reg, reg0, reg1) + if IS_PPC_32: + self.slw(free_reg, reg0, reg1) + else: + self.sld(free_reg, reg0, reg1) def emit_int_rshift(self, op, cpu, reg0, reg1, free_reg): - self.sraw(free_reg, reg0, reg1) + if IS_PPC_32: + self.sraw(free_reg, reg0, reg1) + else: + self.srad(free_reg, reg0, reg1) def emit_uint_rshift(self, op, cpu, reg0, reg1, free_reg): - self.srw(free_reg, reg0, reg1) + if IS_PPC_32: + self.srw(free_reg, reg0, reg1) + else: + self.srd(free_reg, reg0, reg1) def emit_uint_floordiv(self, op, cpu, reg0, reg1, free_reg): - self.divwu(free_reg, reg0, reg1) + if IS_PPC_32: + self.divwu(free_reg, reg0, reg1) + else: + self.divdu(free_reg, reg0, reg1) def emit_int_eq(self, op, cpu, reg0, reg1, free_reg): - self.cmpw(7, reg0, reg1) - self.mfcr(free_reg) - self.rlwinm(free_reg, free_reg, 31, 31, 31) + self.xor(free_reg, reg0, reg1) + if IS_PPC_32: + self.cntlzw(free_reg, free_reg) + self.srwi(free_reg, free_reg, 5) + else: + self.cntlzd(free_reg, free_reg) + self.srdi(free_reg, free_reg, 6) def emit_int_le(self, op, cpu, reg0, reg1, free_reg): - self.cmpw(7, reg0, reg1) + if IS_PPC_32: + self.cmpw(7, reg0, reg1) + else: + self.cmpd(7, reg0, reg1) self.cror(31, 30, 28) self.mfcr(free_reg) self.rlwinm(free_reg, free_reg, 0, 31, 31) def emit_int_lt(self, op, cpu, reg0, reg1, free_reg): - self.cmpw(7, reg0, reg1) + if IS_PPC_32: + self.cmpw(7, reg0, reg1) + else: + self.cmpd(7, reg0, reg1) self.mfcr(free_reg) self.rlwinm(free_reg, free_reg, 29, 31, 31) def emit_int_ne(self, op, cpu, reg0, reg1, free_reg): - self.cmpw(7, reg0, reg1) - self.crnot(30, 30) - self.mfcr(free_reg) - self.rlwinm(free_reg, free_reg, 31, 31, 31) + self.emit_int_eq(op, cpu, reg0, reg1, free_reg) + self.xori(free_reg, free_reg, 1) def emit_int_gt(self, op, cpu, reg0, reg1, free_reg): - self.cmpw(7, reg0, reg1) + if IS_PPC_32: + self.cmpw(7, reg0, reg1) + else: + self.cmpd(7, reg0, reg1) self.mfcr(free_reg) self.rlwinm(free_reg, free_reg, 30, 31, 31) def emit_int_ge(self, op, cpu, reg0, reg1, free_reg): - self.cmpw(7, reg0, reg1) + if IS_PPC_32: + self.cmpw(7, reg0, reg1) + else: + self.cmpd(7, reg0, reg1) self.cror(31, 30, 29) self.mfcr(free_reg) self.rlwinm(free_reg, free_reg, 0, 31, 31) @@ -1176,14 +1228,16 @@ self.sub(free_reg, free_reg, reg0) def emit_int_invert(self, op, cpu, reg0, free_reg): - self.load_word(free_reg, -1) + self.li(free_reg, -1) self.xor(free_reg, free_reg, reg0) def emit_int_is_zero(self, op, cpu, reg0, free_reg): - self.xor(free_reg, free_reg, free_reg) - self.cmp(7, free_reg, reg0) - self.mfcr(free_reg) - self.rlwinm(free_reg, free_reg, 31, 31, 31) + if IS_PPC_32: + self.cntlzw(free_reg, reg0) + self.srwi(free_reg, free_reg, 5) + else: + self.cntlzd(free_reg, reg0) + self.srdi(free_reg, free_reg, 6) def emit_guard_true(self, op, cpu): arg0 = op.getarg(0) diff --git a/pypy/jit/backend/ppc/ppcgen/test/test_ppc.py b/pypy/jit/backend/ppc/ppcgen/test/test_ppc.py --- a/pypy/jit/backend/ppc/ppcgen/test/test_ppc.py +++ b/pypy/jit/backend/ppc/ppcgen/test/test_ppc.py @@ -178,8 +178,6 @@ a.blr() def test_call_function(self): - if is_64_bit_arch(): - py.test.skip("call 64 bit") functype = lltype.Ptr(lltype.FuncType([lltype.Signed], lltype.Signed)) call_addr = rffi.cast(lltype.Signed, llhelper(functype, func)) a = PPCBuilder() @@ -192,7 +190,12 @@ # - Do jump a.li(3, 50) - a.load_word(10, call_addr) + if IS_PPC_32: + a.load_word(10, call_addr) + else: + a.load_from(10, call_addr) + a.load_from(2, call_addr+WORD) + a.load_from(11, call_addr+2*WORD) a.mtctr(10) a.bctr() a.blr() @@ -270,12 +273,8 @@ a.load_word(10, word1) a.load_word(11, word2) - if IS_PPC_64: - a.load_dword(8, rffi.cast(lltype.Signed, p)) - a.load_dword(9, rffi.cast(lltype.Signed, p) + WORD) - else: - a.load_word(8, rffi.cast(lltype.Signed, p)) - a.load_word(9, rffi.cast(lltype.Signed, p) + WORD) + a.load_word(8, rffi.cast(lltype.Signed, p)) + a.load_word(9, rffi.cast(lltype.Signed, p) + WORD) a.stw(10, 8, 0) a.stw(11, 9, 0) @@ -290,35 +289,18 @@ def test_load_from(self): a = PPCBuilder() - p = lltype.malloc(rffi.CArray(rffi.INT), 1, flavor="raw") + p = lltype.malloc(rffi.CArray(rffi.LONG), 1, flavor="raw") addr = rffi.cast(lltype.Signed, p) - p[0] = rffi.cast(rffi.INT, 200) + p[0] = rffi.cast(rffi.LONG, 200) a.load_from(3, addr) a.blr() f = a.assemble() assert f() == 200 - p[0] = rffi.cast(rffi.INT, 300) + p[0] = rffi.cast(rffi.LONG, 300) assert f() == 300 lltype.free(p, flavor="raw") - def test_ld(self): - if not is_64_bit_arch(): - py.test.skip("works on 64 bit") - a = PPCBuilder() - - p = lltype.malloc(rffi.CArray(rffi.LONG), 1, flavor="raw") - addr = rffi.cast(lltype.Signed, p) - p[0] = rffi.cast(rffi.LONG, 200) - - a.load_dword(3, addr) - a.ld(3, 3, 0) - a.blr() - - f = a.assemble() - assert f() == 200 - lltype.free(p, flavor="raw") - class AsmCode(object): def __init__(self, size): @@ -341,7 +323,7 @@ def is_64_bit_arch(): import sys return sys.maxint == 9223372036854775807 - + """ class TestAssemble(object): _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit