http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54673
--- Comment #2 from Oleg Endo <olegendo at gcc dot gnu.org> 2013-02-17 11:38:21
UTC ---
A related reduced example from CSiBE bzip2.c (compressStream):
typedef struct
{
int _r[3];
short _flags;
} FILE;
void BZ2_bzWriteOpen (int* e, FILE* f, int a, int b, int c);
FILE* outputHandleJustInCase;
void
compressStream (FILE *stream, unsigned char* ibuf)
{
int bzerr;
if ((stream->_flags & 0x0040) != 0)
return;
BZ2_bzWriteOpen (&bzerr, stream, 0, 0, 0);
while (fgetc (stream) != -1)
fread (ibuf, 1, 5000, stream);
if ((stream->_flags & 0x0040) != 0)
return;
outputHandleJustInCase = 0;
}
... compiled with -O2 -m4 it contains the following sequence twice:
mov.w @(12,r4),r0
and #64,r0
exts.w r0,r1
tst r1,r1
the exts.w can be replaced with a reg copy, which is better for SH2A and SH4*:
mov.w @(12,r4),r0
and #64,r0
mov r0,r1
tst r1,r1