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

Reply via email to