Author: edelsohn
Branch: ppc-jit-backend
Changeset: r46759:b332f1b4f971
Date: 2011-08-24 18:55 -0400
http://bitbucket.org/pypy/pypy/changeset/b332f1b4f971/
Log: load_word: optimize upper or lower half of 32 bit constants
emit_setfield_gc: Add 8 byte width for PPC64 emit_getfield_gc: Add 8
byte width for PPC64; sign-extend properly emit_guard_value: Add
PPC64 compare
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
@@ -909,9 +909,12 @@
PPCAssembler.__init__(self)
def load_word(self, rD, word):
- if IS_PPC_32:
+ if word < 32768 and word > -32769:
+ self.li(rD, word)
+ elif IS_PPC_32 or (word < 2147483648 and word > -2147483649):
self.lis(rD, hi(word))
- self.ori(rD, rD, lo(word))
+ if word & 0xFFFF != 0:
+ self.ori(rD, rD, lo(word))
else:
self.lis(rD, highest(word))
self.ori(rD, rD, higher(word))
@@ -1189,7 +1192,9 @@
else:
assert 0, "%s not supported" % value
- if width == 4:
+ if width == 8:
+ self.std(value_reg, addr_reg, offset)
+ elif width == 4:
self.stw(value_reg, addr_reg, offset)
elif width == 2:
self.sth(value_reg, addr_reg, offset)
@@ -1202,14 +1207,25 @@
fdescr = op.getdescr()
offset = fdescr.offset
width = fdescr.get_field_size(0)
+ sign = fdescr.is_field_signed()
free_reg = cpu.next_free_register
field_addr_reg = cpu.reg_map[fptr]
+ if width == 8:
+ self.ld(free_reg, field_addr_reg, offset)
if width == 4:
- self.lwz(free_reg, field_addr_reg, offset)
+ if IS_PPC_32 or not sign:
+ self.lwz(free_reg, field_addr_reg, offset)
+ else:
+ self.lwa(free_reg, field_addr_reg, offset)
elif width == 2:
- self.lhz(free_reg, field_addr_reg, offset)
+ if sign:
+ self.lha(free_reg, field_addr_reg, offset)
+ else:
+ self.lhz(free_reg, field_addr_reg, offset)
elif width == 1:
self.lbz(free_reg, field_addr_reg, offset)
+ if sign:
+ self.extsb(free_reg, free_reg)
result = op.result
cpu.reg_map[result] = cpu.next_free_register
cpu.next_free_register += 1
@@ -1267,7 +1283,10 @@
reg0 = cpu.reg_map[args[0]]
const = args[1]
self.load_word(free_reg, const.value)
- self.cmpw(0, free_reg, reg0)
+ if IS_PPC_32:
+ self.cmpw(0, free_reg, reg0)
+ else:
+ self.cmpd(0, free_reg, reg0)
self.cror(3, 0, 1)
self.mfcr(free_reg)
self.rlwinm(free_reg, free_reg, 4, 31, 31)
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit