GC_invalidate_map (struct hdr * hhdr)
{
  map_entry_type * GC_invalid_map.0;
  char * GC_invalid_map.1;
  sizetype displ.2;
  map_entry_type * D.4460;
  long unsigned int displ.3;
  register int displ;

  GC_invalid_map.0 = GC_invalid_map;
  if (GC_invalid_map.0 == 0B) goto <D.4454>; else goto <D.4455>;
  <D.4454>:
  GC_invalid_map.1 = GC_scratch_alloc (4096);
  GC_invalid_map = GC_invalid_map.1;
  GC_invalid_map.0 = GC_invalid_map;
  if (GC_invalid_map.0 == 0B) goto <D.4457>; else goto <D.4458>;
  <D.4457>:
  GC_err_puts ("Cant initialize GC_invalid_map: insufficient memory\n");
  exit (1);
  <D.4458>:
  displ = 0;
  goto <D.4418>;
  <D.4417>:
  GC_invalid_map.0 = GC_invalid_map;
  displ.2 = (sizetype) displ;
  D.4460 = GC_invalid_map.0 + displ.2;
  *D.4460 = 255;
  displ = displ + 1;
  <D.4418>:
  displ.3 = (long unsigned int) displ;
  if (displ.3 <= 4095) goto <D.4417>; else goto <D.4419>;
  <D.4419>:
  <D.4455>:
  GC_invalid_map.0 = GC_invalid_map;
  hhdr->hb_map = GC_invalid_map.0;
}


GC_register_displacement (GC_word offset)
{
  int D.4462;

  D.4462 = _test_and_set (&GC_allocate_lock, 1);
  if (D.4462 != 0) goto <D.4463>; else goto <D.4464>;
  <D.4463>:
  GC_lock ();
  <D.4464>:
  GC_register_displacement_inner (offset);
  GC_clear (&GC_allocate_lock);
}


_test_and_set (int * __p, int __v)
{
  int D.4465;
  int __r;
  int __t;

  __asm__ __volatile__("/* Inline test and set */
.set	push
	.set	mips2
	sync
	1:
	ll	%0,%3
	move	%1,%4
	beq	%0,%4,2f
	sc	%1,%2
	beqz	%1,1b
sync
	.set	pop
	2:
	/* End test and set */" : "=&r" __r, "=&r" __t, "=m" *__p : "m" *__p, "r" __v : "memory");
  D.4465 = __r;
  return D.4465;
}


GC_clear (volatile unsigned int * addr)
{
  __asm__ __volatile__(" " :  :  : "memory");
  *addr = 0;
}


GC_register_displacement_inner (word offset)
{
  char D.4471;
  long unsigned int D.4474;
  long unsigned int max_valid_offset.4;
  int GC_all_interior_pointers.5;
  map_entry_type * D.4481;
  map_entry_type * D.4486;
  unsigned char D.4487;
  map_entry_type * D.4491;
  register unsigned int i;
  word map_entry;

  map_entry = offset >> 2;
  if (offset > 2048) goto <D.4467>; else goto <D.4468>;
  <D.4467>:
  GC_abort ("Bad argument to GC_register_displacement");
  <D.4468>:
  if (map_entry > 253) goto <D.4469>; else goto <D.4470>;
  <D.4469>:
  map_entry = 254;
  <D.4470>:
  D.4471 = GC_arrays._valid_offsets[offset];
  if (D.4471 == 0) goto <D.4472>; else goto <D.4473>;
  <D.4472>:
  GC_arrays._valid_offsets[offset] = 1;
  D.4474 = offset & 3;
  GC_arrays._modws_valid_offsets[D.4474] = 1;
  max_valid_offset.4 = max_valid_offset;
  if (offset > max_valid_offset.4) goto <D.4476>; else goto <D.4477>;
  <D.4476>:
  max_valid_offset = offset;
  <D.4477>:
  GC_all_interior_pointers.5 = GC_all_interior_pointers;
  if (GC_all_interior_pointers.5 == 0) goto <D.4479>; else goto <D.4480>;
  <D.4479>:
  i = 0;
  goto <D.4434>;
  <D.4433>:
  D.4481 = GC_arrays._obj_map[i];
  if (D.4481 != 0B) goto <D.4482>; else goto <D.4483>;
  <D.4482>:
  if (i == 0) goto <D.4484>; else goto <D.4485>;
  <D.4484>:
  D.4481 = GC_arrays._obj_map[i];
  D.4486 = D.4481 + offset;
  D.4487 = (unsigned char) map_entry;
  *D.4486 = D.4487;
  goto <D.4488>;
  <D.4485>:
  {
    register unsigned int j;
    register unsigned int lb;

    lb = i << 2;
    if (offset < lb) goto <D.4489>; else goto <D.4490>;
    <D.4489>:
    j = offset;
    goto <D.4431>;
    <D.4430>:
    D.4481 = GC_arrays._obj_map[i];
    D.4491 = D.4481 + j;
    D.4487 = (unsigned char) map_entry;
    *D.4491 = D.4487;
    j = j + lb;
    <D.4431>:
    if (j <= 4095) goto <D.4430>; else goto <D.4432>;
    <D.4432>:
    <D.4490>:
  }
  <D.4488>:
  <D.4483>:
  i = i + 1;
  <D.4434>:
  if (i <= 512) goto <D.4433>; else goto <D.4435>;
  <D.4435>:
  <D.4480>:
  <D.4473>:
}


GC_add_map_entry (word sz)
{
  map_entry_type * D.4494;
  GC_bool D.4497;
  int GC_all_interior_pointers.6;
  char D.4506;
  map_entry_type * D.4509;
  unsigned char D.4510;
  long unsigned int max_valid_offset.7;
  unsigned int D.4518;
  map_entry_type * D.4519;
  long unsigned int D.4520;
  long unsigned int D.4521;
  register unsigned int obj_start;
  register unsigned int displ;
  register map_entry_type * new_map;
  word map_entry;

  if (sz > 512) goto <D.4492>; else goto <D.4493>;
  <D.4492>:
  sz = 0;
  <D.4493>:
  D.4494 = GC_arrays._obj_map[sz];
  if (D.4494 != 0B) goto <D.4495>; else goto <D.4496>;
  <D.4495>:
  D.4497 = 1;
  return D.4497;
  <D.4496>:
  new_map = GC_scratch_alloc (4096);
  if (new_map == 0B) goto <D.4498>; else goto <D.4499>;
  <D.4498>:
  D.4497 = 0;
  return D.4497;
  <D.4499>:
  memset (new_map, 255, 4096);
  if (sz == 0) goto <D.4500>; else goto <D.4501>;
  <D.4500>:
  displ = 0;
  goto <D.4444>;
  <D.4443>:
  GC_all_interior_pointers.6 = GC_all_interior_pointers;
  if (GC_all_interior_pointers.6 != 0) goto <D.4502>; else goto <D.4505>;
  <D.4505>:
  D.4506 = GC_arrays._valid_offsets[displ];
  if (D.4506 != 0) goto <D.4502>; else goto <D.4503>;
  <D.4502>:
  map_entry = displ >> 2;
  if (map_entry > 253) goto <D.4507>; else goto <D.4508>;
  <D.4507>:
  map_entry = 254;
  <D.4508>:
  D.4509 = new_map + displ;
  D.4510 = (unsigned char) map_entry;
  *D.4509 = D.4510;
  <D.4503>:
  displ = displ + 1;
  <D.4444>:
  max_valid_offset.7 = max_valid_offset;
  if (displ <= max_valid_offset.7) goto <D.4443>; else goto <D.4445>;
  <D.4445>:
  goto <D.4512>;
  <D.4501>:
  obj_start = 0;
  goto <D.4450>;
  <D.4449>:
  displ = 0;
  goto <D.4447>;
  <D.4446>:
  GC_all_interior_pointers.6 = GC_all_interior_pointers;
  if (GC_all_interior_pointers.6 != 0) goto <D.4513>; else goto <D.4515>;
  <D.4515>:
  D.4506 = GC_arrays._valid_offsets[displ];
  if (D.4506 != 0) goto <D.4513>; else goto <D.4514>;
  <D.4513>:
  map_entry = displ >> 2;
  if (map_entry > 253) goto <D.4516>; else goto <D.4517>;
  <D.4516>:
  map_entry = 254;
  <D.4517>:
  D.4518 = obj_start + displ;
  D.4519 = new_map + D.4518;
  D.4510 = (unsigned char) map_entry;
  *D.4519 = D.4510;
  <D.4514>:
  displ = displ + 1;
  <D.4447>:
  max_valid_offset.7 = max_valid_offset;
  if (displ <= max_valid_offset.7) goto <D.4446>; else goto <D.4448>;
  <D.4448>:
  D.4520 = sz << 2;
  obj_start = D.4520 + obj_start;
  <D.4450>:
  D.4520 = sz << 2;
  D.4521 = D.4520 + obj_start;
  if (D.4521 <= 4096) goto <D.4449>; else goto <D.4451>;
  <D.4451>:
  <D.4512>:
  GC_arrays._obj_map[sz] = new_map;
  D.4497 = 1;
  return D.4497;
}


memset (void * __dest, int __ch, size_t __len)
{
  int D.4525;
  int D.4530;
  void * D.4532;
  unsigned int D.4533;

  D.4525 = __builtin_constant_p (__len);
  if (D.4525 != 0) goto <D.4526>; else goto <D.4527>;
  <D.4526>:
  if (__len == 0) goto <D.4528>; else goto <D.4529>;
  <D.4528>:
  D.4530 = __builtin_constant_p (__ch);
  if (D.4530 == 0) goto <D.4523>; else goto <D.4531>;
  <D.4531>:
  if (__ch != 0) goto <D.4523>; else goto <D.4524>;
  <D.4523>:
  __warn_memset_zero_len ();
  D.4532 = __dest;
  return D.4532;
  <D.4524>:
  <D.4529>:
  <D.4527>:
  D.4533 = __builtin_object_size (__dest, 0);
  D.4532 = __builtin___memset_chk (__dest, __ch, __len, D.4533);
  return D.4532;
}


