/* PR rtl-optimization/91347 */
/* Reported by John David Anglin <danglin@gcc.gnu.org> */

typedef unsigned short __u16;
typedef __signed__ int __s32;
typedef unsigned int __u32;
typedef __signed__ long long __s64;
typedef unsigned long long __u64;
typedef __u16 u16;
typedef __s32 s32;
typedef __u32 u32;
typedef __u64 u64;
typedef _Bool bool;
typedef s32 int32_t;
typedef u32 uint32_t;
typedef u64 uint64_t;

char hex_asc_upper[16];
u16 decpair[100];

static __attribute__ ((noipa)) void
put_dec_full4 (char *buf, unsigned r)
{
 unsigned q;
 q = (r * 0x147b) >> 19;
 *((u16 *)buf) = decpair[r - 100*q];
 buf += 2;
 *((u16 *)buf) = decpair[q];
}

static __attribute__ ((noipa)) unsigned
put_dec_helper4 (char *buf, unsigned x)
{
  uint32_t q = (x * (uint64_t)0x346DC5D7) >> 43;
  put_dec_full4(buf, x - q * 10000);
  return q;
}

static __attribute__ ((noipa)) char *
put_dec (char *buf, unsigned long long n)
{
 uint32_t d3, d2, d1, q, h;
 d1 = ((uint32_t)n >> 16);
 h = (n >> 32);
 d2 = (h ) & 0xffff;
 d3 = (h >> 16);
 q = 656 * d3 + 7296 * d2 + 5536 * d1 + ((uint32_t)n & 0xffff);
 q = put_dec_helper4(buf, q);
 q += 7671 * d3 + 9496 * d2 + 6 * d1;
 q = put_dec_helper4(buf+4, q);
 q += 4749 * d3 + 42 * d2;
 q = put_dec_helper4(buf+8, q);
 return buf;
}

struct printf_spec {
 unsigned int type:8;
 signed int field_width:24;
 unsigned int flags:8;
 unsigned int base:8;
 signed int precision:16;
} __attribute__((__packed__));

static __attribute__ ((noipa)) char *
number (char *buf, char *end, unsigned long long num, struct printf_spec spec)
{

 char tmp[3 * sizeof(num)] __attribute__((__aligned__(2)));
 char sign;
 char locase;
 int need_pfx = ((spec.flags & 64) && spec.base != 10);
 int i;
 bool is_zero = num == 0LL;
 int field_width = spec.field_width;
 int precision = spec.precision;

 i = 0;
 if (num < spec.base)
  tmp[i++] = hex_asc_upper[num] | locase;
 else if (spec.base != 10) {
  int mask = spec.base - 1;
  int shift = 3;
  if (spec.base == 16)
   shift = 4;
  else
    __builtin_abort ();
  do {
   tmp[i++] = (hex_asc_upper[((unsigned char)num) & mask] | locase);
   num >>= shift;
  } while (num);
 } else {
  i = put_dec(tmp, num) - tmp;
 }
 return buf;
}

static __attribute__ ((noipa)) char *
pointer_string (char *buf, char *end, const void *ptr, struct printf_spec spec)
{
 spec.base = 16;
 spec.flags = 0;
 return number(buf, end, 100, spec);
}

int
main (void)
{
  struct printf_spec spec;
  char *s = pointer_string (0, 0, 0, spec);
  return 0;
}
