[pypy-commit] pypy default: Fix
arigo
noreply at buildbot.pypy.org
Wed Apr 10 18:36:58 CEST 2013
Author: Armin Rigo <arigo at tunes.org>
Branch:
Changeset: r63202:4943ac67b80c
Date: 2013-04-10 18:36 +0200
http://bitbucket.org/pypy/pypy/changeset/4943ac67b80c/
Log: Fix
diff --git a/rpython/translator/c/gcc/instruction.py b/rpython/translator/c/gcc/instruction.py
--- a/rpython/translator/c/gcc/instruction.py
+++ b/rpython/translator/c/gcc/instruction.py
@@ -57,11 +57,11 @@
def getlocation(self, framesize, uses_frame_pointer, wordsize):
if (self.hint == 'esp' or not uses_frame_pointer
- or self.ofs_from_frame_end % 2 != 0):
+ or self.ofs_from_frame_end % 1 != 0):
# try to use esp-relative addressing
ofs_from_esp = framesize + self.ofs_from_frame_end
- if ofs_from_esp % 2 == 0:
- return frameloc_esp(ofs_from_esp, wordsize)
+ if ofs_from_esp % 1 == 0:
+ return frameloc_esp(int(ofs_from_esp), wordsize)
# we can get an odd value if the framesize is marked as bogus
# by visit_andl()
assert uses_frame_pointer
@@ -177,12 +177,12 @@
class InsnStackAdjust(Insn):
_args_ = ['delta']
def __init__(self, delta):
- assert delta % 2 == 0 # should be "% 4", but there is the special
- self.delta = delta # case of 'pushw' to handle
+ #assert delta % 4 == 0 --- but not really, gcc generates strange code
+ self.delta = delta
class InsnCannotFollowEsp(InsnStackAdjust):
def __init__(self):
- self.delta = -7 # use an odd value as marker
+ self.delta = -7.25 # use this non-integer value as a marker
class InsnStop(Insn):
_args_ = ['reason']
diff --git a/rpython/translator/c/gcc/test/elf/track_odd_esp.s b/rpython/translator/c/gcc/test/elf/track_odd_esp.s
new file mode 100644
--- /dev/null
+++ b/rpython/translator/c/gcc/test/elf/track_odd_esp.s
@@ -0,0 +1,97 @@
+ .type pypy_g_copy_flags_from_bases, @function
+pypy_g_copy_flags_from_bases:
+.LFB188:
+ .cfi_startproc
+ pushl %ebp
+ .cfi_def_cfa_offset 8
+ .cfi_offset 5, -8
+ xorl %edx, %edx
+ pushl %edi
+ .cfi_def_cfa_offset 12
+ .cfi_offset 7, -12
+ pushl %esi
+ .cfi_def_cfa_offset 16
+ .cfi_offset 6, -16
+ pushl %ebx
+ .cfi_def_cfa_offset 20
+ .cfi_offset 3, -20
+ subl $1, %esp
+ .cfi_def_cfa_offset 21
+ movl 21(%esp), %ebx
+ movb $0, (%esp)
+ movl 16(%ebx), %ebp
+ movl 4(%ebp), %edi
+ .p2align 4,,7
+ .p2align 3
+.L572:
+ cmpl %edi, %edx
+ jge .L573
+.L590:
+.L574:
+ addl $1, %edx
+ movl 4(%ebp,%edx,4), %ecx
+ testl %ecx, %ecx
+ je .L585
+.L576:
+ movl 4(%ecx), %esi
+ movl (%esi), %esi
+ subl $404, %esi
+ cmpl $10, %esi
+ ja .L585
+.L577:
+ cmpb $0, 443(%ebx)
+ movl $1, %esi
+ jne .L578
+.L579:
+ movzbl 443(%ecx), %esi
+.L578:
+ cmpb $0, 444(%ebx)
+ movl %esi, %eax
+ movb %al, 443(%ebx)
+ movl $1, %esi
+ jne .L580
+.L581:
+ movzbl 444(%ecx), %esi
+.L580:
+ cmpb $0, 446(%ebx)
+ movl %esi, %eax
+ movb %al, 444(%ebx)
+ movl $1, %esi
+ jne .L582
+.L583:
+ movzbl 446(%ecx), %esi
+.L582:
+ movl %esi, %eax
+ cmpl %edi, %edx
+ movb %al, 446(%ebx)
+ jl .L590
+.L573:
+ movl 25(%esp), %edx
+ movzbl (%esp), %eax
+ movl 420(%edx), %edx
+ movl %edx, 420(%ebx)
+ addl $1, %esp
+ .cfi_remember_state
+ .cfi_def_cfa_offset 20
+ popl %ebx
+ .cfi_restore 3
+ .cfi_def_cfa_offset 16
+ popl %esi
+ .cfi_restore 6
+ .cfi_def_cfa_offset 12
+ popl %edi
+ .cfi_restore 7
+ .cfi_def_cfa_offset 8
+ popl %ebp
+ .cfi_restore 5
+ .cfi_def_cfa_offset 4
+ ret
+ .p2align 4,,7
+ .p2align 3
+.L585:
+ .cfi_restore_state
+ movb $1, (%esp)
+ jmp .L572
+ .cfi_endproc
+.LFE188:
+ .size pypy_g_copy_flags_from_bases, .-pypy_g_copy_flags_from_bases
More information about the pypy-commit
mailing list