GC_dlopen (const char * path, int mode)
{
  void * D.4487;
  void * result;

  disable_gc_for_dlopen ();
  result = dlopen (path, mode);
  GC_enable ();
  D.4487 = result;
  return D.4487;
}


disable_gc_for_dlopen ()
{
  int D.4489;
  int GC_incremental.0;
  int D.4494;
  int GC_dont_gc.1;
  int GC_dont_gc.2;
  extern int GC_collection_in_progress ();

  D.4489 = _test_and_set (&GC_allocate_lock, 1);
  if (D.4489 != 0) goto <D.4490>; else goto <D.4491>;
  <D.4490>:
  GC_lock ();
  <D.4491>:
  goto <D.4415>;
  <D.4414>:
  GC_collect_a_little_inner (1000);
  <D.4415>:
  GC_incremental.0 = GC_incremental;
  if (GC_incremental.0 != 0) goto <D.4493>; else goto <D.4416>;
  <D.4493>:
  D.4494 = GC_collection_in_progress ();
  if (D.4494 != 0) goto <D.4414>; else goto <D.4416>;
  <D.4416>:
  GC_dont_gc.1 = GC_dont_gc;
  GC_dont_gc.2 = GC_dont_gc.1 + 1;
  GC_dont_gc = GC_dont_gc.2;
  GC_clear (&GC_allocate_lock);
}


_test_and_set (int * __p, int __v)
{
  int D.4497;
  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.4497 = __r;
  return D.4497;
}


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


