/* ICE: call insn does not satisfy its constraints, MMIX port.
   Origin: ghostscript-6.52, reduction from hp@bitrange.com.  */

/* { dg-require-effective-target indirect_calls } */

struct s0
{
  void (*init_color)(void *, void *);
};
struct s1
{
  void (*map_cmyk)(short, void *, void **, void *);
  void (*map_rgb_alpha)(short, void *, void **, void *);
};
struct s5
{
  long fill1; int fill2;
  long fill3; unsigned int fill4, fill5;
};
struct s2
{
  struct s5 x, y;
};
struct s3
{
  long dev_color;
  unsigned int key;
};
struct s4
{
  unsigned char spp;
  int alpha;
  struct mc_
  {
    unsigned int values[14];
    unsigned int mask, test;
    int exact;
  } mask_color;
  void **pis;
  struct s0 *pcs;
  struct dd_
  {
    struct s2 row[2];
    struct s2 pixel0;
  } dda;
  struct s3 clues[256];
};
extern struct s1 *get_cmap_procs (void **, void *);
int image_render_color (struct s4 *, unsigned char *, int, void *);
int
image_render_color (struct s4 *penum, unsigned char *buffer,
		    int data_x, void *dev) 
{
  struct s3 *clues = penum->clues;
  void **pis = penum->pis;
  struct s2 pnext;
  struct s0 *pcs = penum->pcs;
  struct s1 *cmap_procs = get_cmap_procs(pis, dev);
  void (*map_4)(short, void *, void **, void *) =
    (penum->alpha ? cmap_procs->map_rgb_alpha : cmap_procs->map_cmyk);
  unsigned int mask = penum->mask_color.mask;
  unsigned int test = penum->mask_color.test;
  struct s3 *pic_next = &clues[1];
  int spp = penum->spp;
  unsigned char *psrc = buffer + data_x * spp;
  unsigned char v[6];

  pnext = penum->dda.pixel0;
  __builtin_memset (&v, 0, sizeof(v));
  (*(pcs)->init_color) (0, 0);

  if (spp == 4)
    {
      v[0] = psrc[0];
      v[1] = psrc[1];
      if ((buffer[0] & mask) == test && penum->mask_color.exact)
	pic_next->dev_color = 0;
      (*map_4)(v[0], &pic_next->dev_color, pis, dev);
    }
  return 0;
}
