c/4134: inline assembly - gcc fails to work around register pressure
J.D.
jodaman@cegt201.bradley.edu
Thu Apr 25 06:56:00 GMT 2002
The following reply was made to PR c/4134; it has been noted by GNATS.
From: "J.D." <jodaman@cegt201.bradley.edu>
To: rth@gcc.gnu.org, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org,
jodaman@cegt201.bradley.edu, nobody@gcc.gnu.org, gcc-gnats@gcc.gnu.org
Cc:
Subject: Re: c/4134: inline assembly - gcc fails to work around register pressure
Date: Thu, 25 Apr 2002 08:50:27 -0500
In retrospect, egcs failed to avoid using the clobbered
register, just as you suggested. Thus, what I initially
interpreted as a bug in the later gcc versions now seems
better classified as the lack of a feature.
A compiler could work around the register pressure by
copying the 32-bit integer in memory to the stack. Thus,
an offset to the stack pointer could serve for the memory
parameter, instead of a separate address register.
Given the ease of manually copying input memory parameters
from any memory location to the local stack in C, an
automatic feature may be primarily useful to less
experienced or sleep-deprived programmers under specific
conditions. Instead of implementing an automatic feature, a
satisfactory improvement might be realized by simply
adding to the documentation that gcc will not automatically
copy memory parameters to the stack in an effort to work
around scarce registers. An automatic copy-memory-to
stack-under-pressure feature may sometimes need to be
disabled anyway.
Most convenient would be an automatic feature that issues a
warning whenever utilized, but that works around the scarce
registers and still creates working code (for the usual
case). A programmer may then remove the warning by an
explicit copy to the loca
explicit attention will be required.
rth@gcc.gnu.org wrote:
>
> Synopsis: inline assembly - gcc fails to work around register pressure
>
> State-Changed-From-To: open->closed
> State-Changed-By: rth
> State-Changed-When: Tue Apr 23 01:18:11 2002
> State-Changed-Why:
> Not a bug. You really have run out of registers.
>
> Your ifdef BUG example requires 7 registers: 3 for
> each of the "r" inputs, 1 for the address of the
> input memory parameter, and 3 are clobbered and thus
> cannot be used.
>
> The i386 has 8 registers one is reserved for the stack pointer, and one is reserved for the frame pointer (at least
> without -fomit-frame-pointer), leaving only 6, one short
> of the required 7.
>
> As a guess, egcs failed to properly not use one of the
> registers marked clobbered.
>
More information about the Gcc-prs
mailing list