On Thu, 24 May 2001, Daniel Jacobowitz wrote:
> They aren't the same for MIPS, though. I exhibit as evidence the fact
> that my patch fixed the problem I was seeing. I didn't know about 'R';
> I suppose that it is more correct. 'm' at least is closer than 'o',
> though.
The following program cannot be compiled with gcc 2.95.3, because the
offset is out of range (I consider it a bug in gcc -- it should allocate
and load a temporary register itself and pass it appropriately as %0,
matching the "R" constraint; still it's better than generating bad code):
int main(void)
{
int *p;
asm volatile(".set push\n\t"
".set noat\n\t"
"lw $0,%0\n\t"
".set pop"
:
: "R" (p[0x10000]));
return 0;
}
After changing "R" to "m" or "o", bad assembly is generated if optimizing
as follows:
#APP
.set push
.set noat
lw $0,262144($2)
.set pop
#NO_APP
Note that it's an expected behaviour -- there are no non-offsettable
address modes for MIPS.
> If 'R' will behave correctly, could that be applied to CVS, then?
I suppose so -- I'm not in a position to apply changes.
--
+ Maciej W. Rozycki, Technical University of Gdansk, Poland +
+--------------------------------------------------------------+
+ e-mail: macro@ds2.pg.gda.pl, PGP key available +
|