[Bug target/59828] New: Broken assembly on ppc* with two -mcpu= options

jakub at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Wed Jan 15 14:13:00 GMT 2014


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=59828

            Bug ID: 59828
           Summary: Broken assembly on ppc* with two -mcpu= options
           Product: gcc
           Version: 4.8.2
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: target
          Assignee: unassigned at gcc dot gnu.org
          Reporter: jakub at gcc dot gnu.org

gcc -m32 -O2 -mcpu=750 -mcpu=power7 -c test.c
results in assembler complaining:
Error: junk at end of line: `1'

While the last -mcpu= option wins for compilation flags, when determining gas
options to be passed to the assembler rs6000.h uses a sequence matching each
-mcpu= individually, and -mcpu=750 is handled there after -mcpu=power7 and thus
overrides the power7 ISA in as flags with 750 ISA flags.
Don't know the *.opt stuff enough if there is a way even for the -mcpu= etc.
options to cancel all previous occurences with different strings from matching,
if not, perhaps at least the list in rs6000.h should be sorted such that at
least in most cases assembler flags that are superset of others are before
flags for the subsets.

typedef struct
{
  int channels;
  void *codec_setup;
} vorbis_info;
typedef struct vorbis_dsp_state
{
  vorbis_info *vi;
  float **pcm;
  long W;
  void *backend_state;
} vorbis_dsp_state;
typedef struct vorbis_block
{
  float **pcm;
} vorbis_block;
typedef struct private_state
{
  int window[2];
} private_state;
typedef struct highlevel_byblocktype
{
  long blocksizes[2];
  int halfrate_flag;
} codec_setup_info;
extern float *_vorbis_window_get (int n);
void
vorbis_synthesis_blockin (vorbis_dsp_state * v, vorbis_block * vb)
{
  vorbis_info *vi = v->vi;
  codec_setup_info *ci = vi->codec_setup;
  private_state *b = v->backend_state;
  int hs = ci->halfrate_flag;
  int i, j;
  int n = ci->blocksizes[v->W] >> (hs + 1);
  int n0 = ci->blocksizes[0] >> (hs + 1);
  int n1 = ci->blocksizes[1] >> (hs + 1);
  int thisCenter = 0, prevCenter = 0;
  for (j = 0; j < vi->channels; j++)
    {
      float *w = _vorbis_window_get (b->window[1] - hs);
      float *pcm = v->pcm[j] + prevCenter;
      float *p = vb->pcm[j];
      for (i = 0; i < n1; i++)
    pcm[i] = pcm[i] * w[n1 - i - 1] + p[i] * w[i];
      float *w2 = _vorbis_window_get (b->window[0] - hs);
      float *pcm2 = v->pcm[j] + prevCenter;
      float *p2 = vb->pcm[j] + n1 / 2 - n0 / 2;
      for (i = 0; i < n0; i++)
    pcm2[i] = pcm2[i] * w2[n0 - i - 1] + p2[i] * w2[i];
      for (; i < n1 / 2 + n0 / 2; i++)
    pcm2[i] = p2[i];
      float *pcm3 = v->pcm[j] + thisCenter;
      float *p3 = vb->pcm[j] + n;
      for (i = 0; i < n; i++)
    pcm3[i] = p3[i];
    }
}



More information about the Gcc-bugs mailing list