[pypy-svn] r36757 - pypy/dist/pypy/jit/codegen/i386
arigo at codespeak.net
arigo at codespeak.net
Sun Jan 14 18:59:05 CET 2007
Author: arigo
Date: Sun Jan 14 18:59:02 2007
New Revision: 36757
Modified:
pypy/dist/pypy/jit/codegen/i386/rgenop.py
Log:
Bug fixes; getarraysize; getarraysubstruct.
Modified: pypy/dist/pypy/jit/codegen/i386/rgenop.py
==============================================================================
--- pypy/dist/pypy/jit/codegen/i386/rgenop.py (original)
+++ pypy/dist/pypy/jit/codegen/i386/rgenop.py Sun Jan 14 18:59:02 2007
@@ -566,7 +566,7 @@
try:
mc.MOV(opdst, opmemsource)
except FailedToImplement: # opdst is a MODRM
- if opmemtarget.involves_ecx():
+ if opmemsource.involves_ecx():
mc.PUSH(opmemsource)
mc.POP(opdst)
else:
@@ -576,7 +576,7 @@
try:
mc.MOVZX(opdst, opmemsource)
except FailedToImplement: # opdst is a MODRM
- if opmemtarget.involves_ecx():
+ if opmemsource.involves_ecx():
mc.PUSH(eax)
mc.MOVZX(eax, opmemsource)
mc.MOV(opdst, eax)
@@ -659,6 +659,29 @@
_, _, itemsize = self.arraytoken
hard_store(mc, optarget, opvalue, itemsize)
+class OpGetArraySubstruct(Operation):
+ def __init__(self, arraytoken, gv_array, gv_index):
+ self.arraytoken = arraytoken
+ self.gv_array = gv_array
+ self.gv_index = gv_index
+ def allocate(self, allocator):
+ allocator.using(self.gv_array)
+ allocator.using(self.gv_index)
+ def generate(self, allocator):
+ try:
+ dstop = allocator.get_operand(self)
+ except KeyError:
+ return # result not used
+ oparray = allocator.get_operand(self.gv_array)
+ opindex = allocator.get_operand(self.gv_index)
+ mc = allocator.mc
+ opsource = array_item_operand(mc, oparray, self.arraytoken, opindex)
+ try:
+ mc.LEA(dstop, opsource)
+ except FailedToImplement:
+ mc.LEA(ecx, opsource)
+ mc.MOV(dstop, ecx)
+
# ____________________________________________________________
class IntConst(GenConst):
@@ -1280,6 +1303,11 @@
def genop_setfield(self, fieldtoken, gv_ptr, gv_value):
self.operations.append(OpSetField(fieldtoken, gv_ptr, gv_value))
+ def genop_getsubstruct(self, (offset, fieldsize), gv_ptr):
+ op = OpIntAdd(gv_ptr, IntConst(offset))
+ self.operations.append(op)
+ return op
+
def genop_getarrayitem(self, arraytoken, gv_array, gv_index):
op = OpGetArrayItem(arraytoken, gv_array, gv_index)
self.operations.append(op)
@@ -1289,6 +1317,17 @@
self.operations.append(OpSetArrayItem(arraytoken, gv_array,
gv_index, gv_value))
+ def genop_getarraysubstruct(self, arraytoken, gv_array, gv_index):
+ op = OpGetArraySubstruct(arraytoken, gv_array, gv_index)
+ self.operations.append(op)
+ return op
+
+ def genop_getarraysize(self, arraytoken, gv_array):
+ lengthtoken, _, _ = arraytoken
+ op = OpGetField(lengthtoken, gv_array)
+ self.operations.append(op)
+ return op
+
def flexswitch(self, gv_exitswitch, args_gv):
reg = FlexSwitch.REG
mc = self.generate_block_code(args_gv, [gv_exitswitch], [reg],
More information about the Pypy-commit
mailing list