OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-dev/] [or1k-gcc/] [gcc/] [testsuite/] [c-c++-common/] [pr44832.c] - Rev 749

Go to most recent revision | Compare with Previous | Blame | View Log

/* PR debug/44832 */
/* { dg-do compile } */
/* { dg-options "-O2 -fcompare-debug" } */
/* { dg-options "-O2 -fcompare-debug -fno-short-enums" {target short_enums} } */
/* { dg-require-effective-target int32plus } */
 
struct rtx_def;
typedef struct rtx_def *rtx;
typedef const struct rtx_def *const_rtx;
struct rtvec_def;
typedef struct rtvec_def *rtvec;
extern int ix86_isa_flags;
 
enum machine_mode
{
  VOIDmode,
  V8HImode,
  V16QImode,
  V4SImode,
  V2DImode,
  V32QImode,
  MAX_MACHINE_MODE,
 
  NUM_MACHINE_MODES = MAX_MACHINE_MODE
};
extern unsigned char mode_size[NUM_MACHINE_MODES];
extern const unsigned char mode_inner[NUM_MACHINE_MODES];
extern const unsigned char mode_nunits[NUM_MACHINE_MODES];
enum rtx_code {
 
CONST_INT ,
 
CONST_FIXED ,
 
CONST_DOUBLE
 
  };
union rtunion_def
{
  rtvec rt_rtvec;
};
typedef union rtunion_def rtunion;
struct rtx_def {
 
  __extension__ enum rtx_code code: 16;
 
  __extension__ enum machine_mode mode : 8;
 
  union u {
    rtunion fld[1];
  } u;
};
struct rtvec_def {
  rtx elem[1];
};
extern int rtx_equal_p (const_rtx, const_rtx);
extern rtx gen_reg_rtx (enum machine_mode);
 
extern void
ix86_expand_vector_init_concat (enum machine_mode mode,
				rtx target, rtx *ops, int n);
 
static void
ix86_expand_vector_init_general (unsigned char mmx_ok, enum machine_mode mode,
     rtx target, rtx vals)
{
  rtx ops[32], op0, op1;
  enum machine_mode half_mode = VOIDmode;
  int n, i;
 
  switch (mode)
    {
    case V4SImode:
    case V2DImode:
      n = mode_nunits[mode];
      ix86_expand_vector_init_concat (mode, target, ops, n);
      return;
 
    case V32QImode:
      goto half;
half:
{
  typedef int eger;
  if (mode != V4SImode)
 ops[0] = 0;
}
      n = mode_nunits[mode];
      for (i = 0; i < n; i++)
 ops[i] = (((((vals)->u.fld[0]).rt_rtvec))->elem[i]);
      op0 = gen_reg_rtx (VOIDmode);
      return;
 
    case V16QImode:
      if (!((ix86_isa_flags & (1 << 19)) != 0))
 break;
 
    case V8HImode:
      if (!((ix86_isa_flags & (1 << 17)) != 0))
 break;
 
      n = mode_nunits[mode];
      for (i = 0; i < n; i++)
 ops[i] = (((((vals)->u.fld[0]).rt_rtvec))->elem[i]);
      return;
 
    default:
      ;
    }
 
    {
      int n_words;
 
      n_words = ((unsigned short) mode_size[mode]) / 4;
 
      if (n_words == 4)
   ix86_expand_vector_init_general (0, V4SImode, 0, 0);
    }
}
 
 
void
ix86_expand_vector_init (unsigned char mmx_ok, rtx target, rtx vals)
{
  enum machine_mode mode = ((enum machine_mode) (target)->mode);
  enum machine_mode inner_mode = ((enum machine_mode) mode_inner[mode]);
  int n_elts = mode_nunits[mode];
  int n_var = 0, one_var = -1;
  unsigned char all_same = 1, all_const_zero = 1;
  int i;
  rtx x;
 
  for (i = 0; i < n_elts; ++i)
    {
      x = (((((vals)->u.fld[0]).rt_rtvec))->elem[i]);
      if (!((((enum rtx_code) (x)->code) == CONST_INT)
     || ((enum rtx_code) (x)->code) == CONST_DOUBLE
     || ((enum rtx_code) (x)->code) == CONST_FIXED))
 n_var++, one_var = i;
      else 
 all_const_zero = 0;
      if (i > 0 && !rtx_equal_p (x, (((((vals)->u.fld[0]).rt_rtvec))->elem[0])))
 all_same = 0;
    }
 
 
  if (n_var == 0)
    {
      return;
    }
 
  if (all_same)
    return;
 
  if (n_var == 1)
    {
      if (all_const_zero)
 return;
 
    }
 
  ix86_expand_vector_init_general (mmx_ok, mode, target, vals);
}
 

Go to most recent revision | Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.