sgen_get_complex_descriptor (mword desc)
{
  gsize * D.17648;
  gsize * complex_descriptors.0;
  long unsigned int D.17650;
  long unsigned int D.17651;

  complex_descriptors.0 = complex_descriptors;
  D.17650 = desc >> 3;
  D.17651 = D.17650 * 8;
  D.17648 = complex_descriptors.0 + D.17651;
  return D.17648;
}


mono_gc_make_descr_for_string (gsize * bitmap, int numbits)
{
  void * D.17653;

  D.17653 = 1B;
  return D.17653;
}


mono_gc_make_descr_for_object (gsize * bitmap, int numbits, size_t obj_size)
{
  long unsigned int D.17655;
  long unsigned int D.17656;
  long unsigned int D.17657;
  gsize * D.17658;
  long unsigned int D.17659;
  int D.17660;
  long unsigned int D.17661;
  long unsigned int D.17662;
  void * desc.1;
  struct FILE * gc_debug_file.2;
  void * D.17675;
  long unsigned int D.17676;
  long unsigned int D.17677;
  _Bool D.17678;
  long int D.17679;
  long int D.17680;
  _Bool D.17685;
  _Bool D.17686;
  _Bool D.17687;
  int D.17690;
  int D.17691;
  int D.17694;
  long unsigned int D.17695;
  long unsigned int D.17696;
  int D.17697;
  long unsigned int D.17698;
  long unsigned int D.17699;
  unsigned int last_set.3;
  _Bool D.17703;
  _Bool D.17704;
  _Bool D.17705;
  long unsigned int D.17708;
  long unsigned int D.17709;
  long unsigned int D.17710;
  long unsigned int D.17711;
  long unsigned int D.17716;
  int D.17719;
  int D.17720;
  int D.17721;
  int first_set;
  int num_set;
  int last_set;
  int i;
  mword desc;
  size_t stored_size;

  first_set = -1;
  num_set = 0;
  last_set = -1;
  desc = 0;
  stored_size = obj_size;
  stored_size = stored_size + 7;
  stored_size = stored_size & 18446744073709551608;
  i = 0;
  goto <D.17583>;
  <D.17582>:
  D.17655 = (long unsigned int) i;
  D.17656 = D.17655 / 64;
  D.17657 = D.17656 * 8;
  D.17658 = bitmap + D.17657;
  D.17659 = *D.17658;
  D.17660 = i & 63;
  D.17661 = D.17659 >> D.17660;
  D.17662 = D.17661 & 1;
  if (D.17662 != 0) goto <D.17663>; else goto <D.17664>;
  <D.17663>:
  if (first_set < 0) goto <D.17665>; else goto <D.17666>;
  <D.17665>:
  first_set = i;
  <D.17666>:
  last_set = i;
  num_set = num_set + 1;
  <D.17664>:
  i = i + 1;
  <D.17583>:
  if (i < numbits) goto <D.17582>; else goto <D.17584>;
  <D.17584>:
  if (first_set < 0) goto <D.17667>; else goto <D.17668>;
  <D.17667>:
  if (0 != 0) goto <D.17669>; else goto <D.17670>;
  <D.17669>:
  desc.1 = (void *) desc;
  gc_debug_file.2 = gc_debug_file;
  fprintf (gc_debug_file.2, "Ptrfree descriptor %p, size: %zd\n", desc.1, stored_size);
  gc_debug_file.2 = gc_debug_file;
  fflush (gc_debug_file.2);
  <D.17670>:
  if (stored_size <= 65535) goto <D.17673>; else goto <D.17674>;
  <D.17673>:
  D.17676 = stored_size | 1;
  D.17675 = (void *) D.17676;
  return D.17675;
  <D.17674>:
  D.17675 = 7B;
  return D.17675;
  <D.17668>:
  D.17677 = stored_size & 7;
  D.17678 = D.17677 != 0;
  D.17679 = (long int) D.17678;
  D.17680 = __builtin_expect (D.17679, 0);
  if (D.17680 != 0) goto <D.17681>; else goto <D.17682>;
  <D.17681>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-descriptor.c", 149, "!(stored_size & 0x7)");
  <D.17682>:
  if (stored_size <= 65535) goto <D.17683>; else goto <D.17684>;
  <D.17683>:
  D.17685 = first_set <= 255;
  D.17686 = num_set <= 255;
  D.17687 = D.17685 & D.17686;
  if (D.17687 != 0) goto <D.17688>; else goto <D.17689>;
  <D.17688>:
  D.17690 = first_set + num_set;
  D.17691 = last_set + 1;
  if (D.17690 == D.17691) goto <D.17692>; else goto <D.17693>;
  <D.17692>:
  D.17694 = first_set << 16;
  D.17695 = (long unsigned int) D.17694;
  D.17696 = D.17695 | stored_size;
  D.17697 = num_set << 24;
  D.17698 = (long unsigned int) D.17697;
  D.17699 = D.17696 | D.17698;
  desc = D.17699 | 1;
  if (0 != 0) goto <D.17700>; else goto <D.17701>;
  <D.17700>:
  desc.1 = (void *) desc;
  gc_debug_file.2 = gc_debug_file;
  fprintf (gc_debug_file.2, "Runlen descriptor %p, size: %zd, first set: %d, num set: %d\n", desc.1, stored_size, first_set, num_set);
  gc_debug_file.2 = gc_debug_file;
  fflush (gc_debug_file.2);
  <D.17701>:
  D.17675 = (void *) desc;
  return D.17675;
  <D.17693>:
  <D.17689>:
  <D.17684>:
  last_set.3 = (unsigned int) last_set;
  D.17703 = last_set.3 <= 49;
  D.17704 = stored_size <= 65535;
  D.17705 = D.17703 & D.17704;
  if (D.17705 != 0) goto <D.17706>; else goto <D.17707>;
  <D.17706>:
  D.17708 = *bitmap;
  D.17709 = D.17708 >> 2;
  D.17710 = D.17709 << 16;
  D.17711 = D.17710 | stored_size;
  desc = D.17711 | 2;
  if (0 != 0) goto <D.17712>; else goto <D.17713>;
  <D.17712>:
  desc.1 = (void *) desc;
  gc_debug_file.2 = gc_debug_file;
  fprintf (gc_debug_file.2, "Smallbitmap descriptor %p, size: %zd, last set: %d\n", desc.1, stored_size, last_set);
  gc_debug_file.2 = gc_debug_file;
  fflush (gc_debug_file.2);
  <D.17713>:
  D.17675 = (void *) desc;
  return D.17675;
  <D.17707>:
  last_set.3 = (unsigned int) last_set;
  if (last_set.3 <= 62) goto <D.17714>; else goto <D.17715>;
  <D.17714>:
  D.17708 = *bitmap;
  D.17709 = D.17708 >> 2;
  D.17716 = D.17709 << 3;
  desc = D.17716 | 5;
  if (0 != 0) goto <D.17717>; else goto <D.17718>;
  <D.17717>:
  desc.1 = (void *) desc;
  gc_debug_file.2 = gc_debug_file;
  fprintf (gc_debug_file.2, "Largebitmap descriptor %p, size: %zd, last set: %d\n", desc.1, stored_size, last_set);
  gc_debug_file.2 = gc_debug_file;
  fflush (gc_debug_file.2);
  <D.17718>:
  D.17675 = (void *) desc;
  return D.17675;
  <D.17715>:
  D.17691 = last_set + 1;
  D.17719 = alloc_complex_descriptor (bitmap, D.17691);
  D.17720 = D.17719 << 3;
  D.17721 = D.17720 | 3;
  desc = (mword) D.17721;
  D.17675 = (void *) desc;
  return D.17675;
}


alloc_complex_descriptor (gsize * bitmap, int numbits)
{
  unsigned int numbits.4;
  unsigned int D.17724;
  int D.17725;
  long unsigned int D.17726;
  long unsigned int D.17727;
  unsigned int D.17728;
  unsigned int D.17729;
  gsize * complex_descriptors.5;
  long unsigned int D.17731;
  long unsigned int D.17732;
  gsize * D.17733;
  long unsigned int D.17734;
  long unsigned int D.17735;
  int D.17738;
  int D.17739;
  long unsigned int D.17740;
  long unsigned int D.17741;
  gsize * D.17742;
  long unsigned int D.17743;
  long unsigned int D.17744;
  long unsigned int D.17745;
  gsize * D.17746;
  long unsigned int D.17747;
  int D.17750;
  int D.17753;
  unsigned int D.17754;
  unsigned int i.6;
  unsigned int D.17756;
  int complex_descriptors_next.7;
  int complex_descriptors_next.11;
  int complex_descriptors_size.8;
  int D.17762;
  long unsigned int D.17763;
  long unsigned int D.17764;
  void * complex_descriptors.9;
  struct FILE * gc_debug_file.10;
  long unsigned int D.17769;
  long unsigned int D.17770;
  gsize * D.17771;
  int D.17772;
  int D.17773;
  long unsigned int D.17774;
  long unsigned int D.17775;
  gsize * D.17776;
  gsize * D.17777;
  long unsigned int D.17778;
  long unsigned int D.17781;
  void * D.17782;
  int nwords;
  int res;
  int i;

  numbits.4 = (unsigned int) numbits;
  D.17724 = numbits.4 + 63;
  D.17725 = (int) D.17724;
  numbits = D.17725 & -64;
  D.17726 = (long unsigned int) numbits;
  D.17727 = D.17726 / 64;
  D.17728 = (unsigned int) D.17727;
  D.17729 = D.17728 + 1;
  nwords = (int) D.17729;
  sgen_gc_lock ();
  res = complex_descriptors_next;
  i = 0;
  goto <D.17558>;
  <D.17557>:
  complex_descriptors.5 = complex_descriptors;
  D.17731 = (long unsigned int) i;
  D.17732 = D.17731 * 8;
  D.17733 = complex_descriptors.5 + D.17732;
  D.17734 = *D.17733;
  D.17735 = (long unsigned int) nwords;
  if (D.17734 == D.17735) goto <D.17736>; else goto <D.17737>;
  <D.17736>:
  {
    int j;
    int found;

    found = 1;
    j = 0;
    goto <D.17556>;
    <D.17555>:
    complex_descriptors.5 = complex_descriptors;
    D.17738 = i + 1;
    D.17739 = D.17738 + j;
    D.17740 = (long unsigned int) D.17739;
    D.17741 = D.17740 * 8;
    D.17742 = complex_descriptors.5 + D.17741;
    D.17743 = *D.17742;
    D.17744 = (long unsigned int) j;
    D.17745 = D.17744 * 8;
    D.17746 = bitmap + D.17745;
    D.17747 = *D.17746;
    if (D.17743 != D.17747) goto <D.17748>; else goto <D.17749>;
    <D.17748>:
    found = 0;
    goto <D.17554>;
    <D.17749>:
    j = j + 1;
    <D.17556>:
    D.17750 = nwords + -1;
    if (D.17750 > j) goto <D.17555>; else goto <D.17554>;
    <D.17554>:
    if (found != 0) goto <D.17751>; else goto <D.17752>;
    <D.17751>:
    sgen_gc_unlock ();
    D.17753 = i;
    return D.17753;
    <D.17752>:
  }
  <D.17737>:
  complex_descriptors.5 = complex_descriptors;
  D.17731 = (long unsigned int) i;
  D.17732 = D.17731 * 8;
  D.17733 = complex_descriptors.5 + D.17732;
  D.17734 = *D.17733;
  D.17754 = (unsigned int) D.17734;
  i.6 = (unsigned int) i;
  D.17756 = D.17754 + i.6;
  i = (int) D.17756;
  <D.17558>:
  complex_descriptors_next.7 = complex_descriptors_next;
  if (i < complex_descriptors_next.7) goto <D.17557>; else goto <D.17559>;
  <D.17559>:
  complex_descriptors_next.7 = complex_descriptors_next;
  complex_descriptors_next.11 = complex_descriptors_next.7 + nwords;
  complex_descriptors_size.8 = complex_descriptors_size;
  if (complex_descriptors_next.11 > complex_descriptors_size.8) goto <D.17760>; else goto <D.17761>;
  <D.17760>:
  {
    int new_size;

    complex_descriptors_size.8 = complex_descriptors_size;
    D.17762 = complex_descriptors_size.8 * 2;
    new_size = D.17762 + nwords;
    D.17763 = (long unsigned int) new_size;
    D.17764 = D.17763 * 8;
    complex_descriptors.5 = complex_descriptors;
    complex_descriptors.9 = monoeg_realloc (complex_descriptors.5, D.17764);
    complex_descriptors = complex_descriptors.9;
    complex_descriptors_size = new_size;
  }
  <D.17761>:
  if (0 != 0) goto <D.17766>; else goto <D.17767>;
  <D.17766>:
  complex_descriptors_size.8 = complex_descriptors_size;
  gc_debug_file.10 = gc_debug_file;
  fprintf (gc_debug_file.10, "Complex descriptor %d, size: %d (total desc memory: %d)\n", res, nwords, complex_descriptors_size.8);
  gc_debug_file.10 = gc_debug_file;
  fflush (gc_debug_file.10);
  <D.17767>:
  complex_descriptors_next.7 = complex_descriptors_next;
  complex_descriptors_next.11 = complex_descriptors_next.7 + nwords;
  complex_descriptors_next = complex_descriptors_next.11;
  complex_descriptors.5 = complex_descriptors;
  D.17769 = (long unsigned int) res;
  D.17770 = D.17769 * 8;
  D.17771 = complex_descriptors.5 + D.17770;
  D.17735 = (long unsigned int) nwords;
  *D.17771 = D.17735;
  i = 0;
  goto <D.17562>;
  <D.17561>:
  complex_descriptors.5 = complex_descriptors;
  D.17772 = res + 1;
  D.17773 = D.17772 + i;
  D.17774 = (long unsigned int) D.17773;
  D.17775 = D.17774 * 8;
  D.17776 = complex_descriptors.5 + D.17775;
  D.17731 = (long unsigned int) i;
  D.17732 = D.17731 * 8;
  D.17777 = bitmap + D.17732;
  D.17778 = *D.17777;
  *D.17776 = D.17778;
  if (0 != 0) goto <D.17779>; else goto <D.17780>;
  <D.17779>:
  complex_descriptors.5 = complex_descriptors;
  D.17772 = res + 1;
  D.17773 = D.17772 + i;
  D.17774 = (long unsigned int) D.17773;
  D.17775 = D.17774 * 8;
  D.17776 = complex_descriptors.5 + D.17775;
  D.17781 = *D.17776;
  D.17782 = (void *) D.17781;
  gc_debug_file.10 = gc_debug_file;
  fprintf (gc_debug_file.10, "\tvalue: %p\n", D.17782);
  gc_debug_file.10 = gc_debug_file;
  fflush (gc_debug_file.10);
  <D.17780>:
  i = i + 1;
  <D.17562>:
  D.17750 = nwords + -1;
  if (D.17750 > i) goto <D.17561>; else goto <D.17563>;
  <D.17563>:
  sgen_gc_unlock ();
  D.17753 = res;
  return D.17753;
}


mono_gc_make_descr_for_array (int vector, gsize * elem_bitmap, int numbits, size_t elem_size)
{
  mword iftmp.12;
  long unsigned int D.17788;
  long unsigned int D.17789;
  long unsigned int D.17790;
  gsize * D.17791;
  long unsigned int D.17792;
  int D.17793;
  long unsigned int D.17794;
  long unsigned int D.17795;
  void * D.17804;
  long unsigned int D.17805;
  long unsigned int D.17806;
  long unsigned int D.17811;
  long unsigned int D.17812;
  long unsigned int D.17815;
  unsigned int last_set.13;
  long unsigned int D.17819;
  long unsigned int D.17820;
  long unsigned int D.17821;
  long unsigned int D.17822;
  int D.17823;
  int D.17824;
  int D.17825;
  long unsigned int D.17826;
  int first_set;
  int num_set;
  int last_set;
  int i;
  mword desc;

  first_set = -1;
  num_set = 0;
  last_set = -1;
  if (vector != 0) goto <D.17785>; else goto <D.17786>;
  <D.17785>:
  iftmp.12 = 4;
  goto <D.17787>;
  <D.17786>:
  iftmp.12 = 8196;
  <D.17787>:
  desc = iftmp.12;
  i = 0;
  goto <D.17597>;
  <D.17596>:
  D.17788 = (long unsigned int) i;
  D.17789 = D.17788 / 64;
  D.17790 = D.17789 * 8;
  D.17791 = elem_bitmap + D.17790;
  D.17792 = *D.17791;
  D.17793 = i & 63;
  D.17794 = D.17792 >> D.17793;
  D.17795 = D.17794 & 1;
  if (D.17795 != 0) goto <D.17796>; else goto <D.17797>;
  <D.17796>:
  if (first_set < 0) goto <D.17798>; else goto <D.17799>;
  <D.17798>:
  first_set = i;
  <D.17799>:
  last_set = i;
  num_set = num_set + 1;
  <D.17797>:
  i = i + 1;
  <D.17597>:
  if (i < numbits) goto <D.17596>; else goto <D.17598>;
  <D.17598>:
  if (first_set < 0) goto <D.17800>; else goto <D.17801>;
  <D.17800>:
  if (elem_size <= 1023) goto <D.17802>; else goto <D.17803>;
  <D.17802>:
  D.17805 = elem_size << 3;
  D.17806 = D.17805 | desc;
  D.17804 = (void *) D.17806;
  return D.17804;
  <D.17803>:
  D.17804 = 7B;
  return D.17804;
  <D.17801>:
  if (elem_size <= 1023) goto <D.17807>; else goto <D.17808>;
  <D.17807>:
  D.17805 = elem_size << 3;
  desc = D.17805 | desc;
  if (num_set == 0) goto <D.17809>; else goto <D.17810>;
  <D.17809>:
  D.17804 = (void *) desc;
  return D.17804;
  <D.17810>:
  D.17811 = (long unsigned int) num_set;
  D.17812 = D.17811 * 8;
  if (D.17812 == elem_size) goto <D.17813>; else goto <D.17814>;
  <D.17813>:
  D.17815 = desc | 18446744073709502464;
  D.17804 = (void *) D.17815;
  return D.17804;
  <D.17814>:
  last_set.13 = (unsigned int) last_set;
  if (last_set.13 <= 47) goto <D.17817>; else goto <D.17818>;
  <D.17817>:
  D.17819 = *elem_bitmap;
  D.17820 = D.17819 << 16;
  D.17821 = D.17820 | desc;
  D.17822 = D.17821 | 49152;
  D.17804 = (void *) D.17822;
  return D.17804;
  <D.17818>:
  <D.17808>:
  desc = 6;
  D.17823 = last_set + 1;
  D.17824 = alloc_complex_descriptor (elem_bitmap, D.17823);
  D.17825 = D.17824 << 3;
  D.17826 = (long unsigned int) D.17825;
  desc = D.17826 | desc;
  D.17804 = (void *) desc;
  return D.17804;
}


mono_gc_get_bitmap_for_descr (void * descr, int * numbits)
{
  long unsigned int D.17828;
  long unsigned int D.17829;
  int D.17830;
  long unsigned int D.17831;
  int D.17832;
  int D.17833;
  int D.17834;
  int D.17835;
  long unsigned int D.17836;
  long unsigned int D.17837;
  long unsigned int D.17838;
  long unsigned int D.17839;
  long unsigned int D.17840;
  gsize * D.17841;
  long unsigned int D.17842;
  int D.17843;
  long unsigned int D.17844;
  long unsigned int D.17845;
  gsize * D.17846;
  long unsigned int D.17847;
  long unsigned int D.17848;
  int D.17849;
  int D.17850;
  long unsigned int D.17851;
  unsigned int D.17852;
  unsigned int D.17853;
  long unsigned int D.17854;
  long unsigned int D.17855;
  unsigned int bwords.14;
  unsigned int D.17857;
  int D.17858;
  long unsigned int D.17859;
  long unsigned int D.17860;
  gsize * D.17861;
  sizetype D.17862;
  sizetype D.17863;
  sizetype D.17864;
  gsize * D.17865;
  long unsigned int D.17866;
  mword d;
  gsize * bitmap;

  d = (mword) descr;
  D.17828 = d & 7;
  switch (D.17828) <default: <D.17625>, case 1: <D.17605>, case 2: <D.17612>, case 3: <D.17618>, case 5: <D.17613>>
  <D.17605>:
  {
    int first_set;
    int num_set;
    int i;

    D.17829 = d >> 16;
    D.17830 = (int) D.17829;
    first_set = D.17830 & 255;
    D.17831 = d >> 24;
    D.17832 = (int) D.17831;
    num_set = D.17832 & 255;
    D.17833 = first_set + num_set;
    D.17834 = D.17833 + 7;
    D.17835 = D.17834 / 8;
    D.17836 = (long unsigned int) D.17835;
    D.17837 = D.17836 * 8;
    bitmap = monoeg_malloc0 (D.17837);
    i = first_set;
    goto <D.17610>;
    <D.17609>:
    D.17838 = (long unsigned int) i;
    D.17839 = D.17838 / 64;
    D.17840 = D.17839 * 8;
    D.17841 = bitmap + D.17840;
    D.17840 = D.17839 * 8;
    D.17841 = bitmap + D.17840;
    D.17842 = *D.17841;
    D.17843 = i & 63;
    D.17844 = 1 << D.17843;
    D.17845 = D.17842 | D.17844;
    *D.17841 = D.17845;
    i = i + 1;
    <D.17610>:
    D.17833 = first_set + num_set;
    if (D.17833 > i) goto <D.17609>; else goto <D.17611>;
    <D.17611>:
    D.17833 = first_set + num_set;
    *numbits = D.17833;
    D.17846 = bitmap;
    return D.17846;
  }
  <D.17612>:
  bitmap = monoeg_malloc0 (8);
  D.17829 = d >> 16;
  D.17847 = D.17829 << 2;
  *bitmap = D.17847;
  *numbits = 64;
  D.17846 = bitmap;
  return D.17846;
  <D.17613>:
  {
    gsize bmap;

    D.17848 = d >> 3;
    bmap = D.17848 << 2;
    bitmap = monoeg_malloc0 (8);
    *bitmap = bmap;
    *numbits = 0;
    goto <D.17616>;
    <D.17615>:
    D.17849 = *numbits;
    D.17850 = D.17849 + 1;
    *numbits = D.17850;
    bmap = bmap >> 1;
    <D.17616>:
    if (bmap != 0) goto <D.17615>; else goto <D.17617>;
    <D.17617>:
    D.17846 = bitmap;
    return D.17846;
  }
  <D.17618>:
  {
    gsize * bitmap_data;
    int bwords;
    int i;

    bitmap_data = sgen_get_complex_descriptor (d);
    D.17851 = *bitmap_data;
    D.17852 = (unsigned int) D.17851;
    D.17853 = D.17852 + 4294967295;
    bwords = (int) D.17853;
    D.17854 = (long unsigned int) bwords;
    D.17855 = D.17854 * 8;
    bitmap = monoeg_malloc0 (D.17855);
    bwords.14 = (unsigned int) bwords;
    D.17857 = bwords.14 * 64;
    D.17858 = (int) D.17857;
    *numbits = D.17858;
    i = 0;
    goto <D.17623>;
    <D.17622>:
    D.17859 = (long unsigned int) i;
    D.17860 = D.17859 * 8;
    D.17861 = bitmap + D.17860;
    D.17862 = (sizetype) i;
    D.17863 = D.17862 + 1;
    D.17864 = D.17863 * 8;
    D.17865 = bitmap_data + D.17864;
    D.17866 = *D.17865;
    *D.17861 = D.17866;
    i = i + 1;
    <D.17623>:
    if (i < bwords) goto <D.17622>; else goto <D.17624>;
    <D.17624>:
    D.17846 = bitmap;
    return D.17846;
  }
  <D.17625>:
  monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "sgen-descriptor.c", 283);
}


mono_gc_make_descr_from_bitmap (gsize * bitmap, int numbits)
{
  void * D.17870;
  unsigned int numbits.15;
  long unsigned int D.17874;
  long unsigned int D.17875;
  long unsigned int D.17876;
  int D.17877;
  long unsigned int D.17878;
  long unsigned int D.17879;

  if (numbits == 0) goto <D.17868>; else goto <D.17869>;
  <D.17868>:
  D.17870 = 1B;
  return D.17870;
  <D.17869>:
  numbits.15 = (unsigned int) numbits;
  if (numbits.15 <= 60) goto <D.17872>; else goto <D.17873>;
  <D.17872>:
  D.17874 = *bitmap;
  D.17875 = D.17874 << 3;
  D.17876 = D.17875 | 1;
  D.17870 = (void *) D.17876;
  return D.17870;
  <D.17873>:
  {
    mword complex;

    D.17877 = alloc_complex_descriptor (bitmap, numbits);
    complex = (mword) D.17877;
    D.17878 = complex << 3;
    D.17879 = D.17878 | 3;
    D.17870 = (void *) D.17879;
    return D.17870;
  }
}


mono_gc_make_root_descr_all_refs (int numbits)
{
  void * D.17883;
  void * D.17886;
  long unsigned int D.17887;
  long unsigned int D.17888;
  long unsigned int D.17889;
  long unsigned int D.17890;
  long unsigned int D.17891;
  unsigned int numbits.16;
  long unsigned int D.17895;
  long unsigned int D.17899;
  long unsigned int D.17900;
  int D.17903;
  long unsigned int D.17904;
  long unsigned int D.17905;
  gsize * D.17906;
  long unsigned int D.17907;
  unsigned int numbits.17;
  unsigned int D.17909;
  int D.17912;
  long unsigned int D.17913;
  long unsigned int D.17914;
  gsize * D.17915;
  int D.17916;
  int D.17917;
  int D.17918;
  long unsigned int D.17919;
  gsize * gc_bitmap;
  void * descr;
  int num_bytes;

  num_bytes = numbits / 8;
  if (numbits <= 31) goto <D.17881>; else goto <D.17882>;
  <D.17881>:
  D.17883 = all_ref_root_descrs[numbits];
  if (D.17883 != 0B) goto <D.17884>; else goto <D.17885>;
  <D.17884>:
  D.17886 = all_ref_root_descrs[numbits];
  return D.17886;
  <D.17885>:
  <D.17882>:
  D.17887 = (long unsigned int) numbits;
  D.17888 = D.17887 + 7;
  D.17889 = D.17888 & 18446744073709551608;
  D.17890 = D.17889 + 8;
  gc_bitmap = monoeg_malloc0 (D.17890);
  D.17891 = (long unsigned int) num_bytes;
  memset (gc_bitmap, 255, D.17891);
  numbits.16 = (unsigned int) numbits;
  if (numbits.16 <= 60) goto <D.17893>; else goto <D.17894>;
  <D.17893>:
  D.17895 = *gc_bitmap;
  *gc_bitmap = D.17895;
  goto <D.17896>;
  <D.17894>:
  if (numbits != 0) goto <D.17897>; else goto <D.17898>;
  <D.17897>:
  D.17899 = (long unsigned int) num_bytes;
  D.17900 = D.17899 & 7;
  if (D.17900 != 0) goto <D.17901>; else goto <D.17902>;
  <D.17901>:
  D.17903 = num_bytes / 8;
  D.17904 = (long unsigned int) D.17903;
  D.17905 = D.17904 * 8;
  D.17906 = gc_bitmap + D.17905;
  D.17903 = num_bytes / 8;
  D.17904 = (long unsigned int) D.17903;
  D.17905 = D.17904 * 8;
  D.17906 = gc_bitmap + D.17905;
  D.17907 = *D.17906;
  *D.17906 = D.17907;
  <D.17902>:
  <D.17898>:
  <D.17896>:
  numbits.17 = (unsigned int) numbits;
  D.17909 = numbits.17 & 7;
  if (D.17909 != 0) goto <D.17910>; else goto <D.17911>;
  <D.17910>:
  D.17912 = numbits / 8;
  D.17913 = (long unsigned int) D.17912;
  D.17914 = D.17913 * 8;
  D.17915 = gc_bitmap + D.17914;
  D.17916 = numbits % 8;
  D.17917 = 1 << D.17916;
  D.17918 = D.17917 + -1;
  D.17919 = (long unsigned int) D.17918;
  *D.17915 = D.17919;
  <D.17911>:
  descr = mono_gc_make_descr_from_bitmap (gc_bitmap, numbits);
  monoeg_g_free (gc_bitmap);
  if (numbits <= 31) goto <D.17920>; else goto <D.17921>;
  <D.17920>:
  all_ref_root_descrs[numbits] = descr;
  <D.17921>:
  D.17886 = descr;
  return D.17886;
}


memset (void * __dest, int __ch, size_t __len)
{
  int D.17925;
  int D.17930;
  void * D.17932;
  long unsigned int D.17933;

  D.17925 = __builtin_constant_p (__len);
  if (D.17925 != 0) goto <D.17926>; else goto <D.17927>;
  <D.17926>:
  if (__len == 0) goto <D.17928>; else goto <D.17929>;
  <D.17928>:
  D.17930 = __builtin_constant_p (__ch);
  if (D.17930 == 0) goto <D.17923>; else goto <D.17931>;
  <D.17931>:
  if (__ch != 0) goto <D.17923>; else goto <D.17924>;
  <D.17923>:
  __warn_memset_zero_len ();
  D.17932 = __dest;
  return D.17932;
  <D.17924>:
  <D.17929>:
  <D.17927>:
  D.17933 = __builtin_object_size (__dest, 0);
  D.17932 = __builtin___memset_chk (__dest, __ch, __len, D.17933);
  return D.17932;
}


mono_gc_make_root_descr_user (void (*MonoGCRootMarkFunc) (void *, void (*MonoGCMarkFunc) (void * *)) marker)
{
  int user_descriptors_next.18;
  _Bool D.17936;
  long int D.17937;
  long int D.17938;
  long unsigned int D.17941;
  long unsigned int D.17942;
  long unsigned int D.17943;
  int user_descriptors_next.19;
  int user_descriptors_next.20;
  void * D.17946;
  void * descr;

  user_descriptors_next.18 = user_descriptors_next;
  D.17936 = user_descriptors_next.18 > 15;
  D.17937 = (long int) D.17936;
  D.17938 = __builtin_expect (D.17937, 0);
  if (D.17938 != 0) goto <D.17939>; else goto <D.17940>;
  <D.17939>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-descriptor.c", 332, "user_descriptors_next < MAX_USER_DESCRIPTORS");
  <D.17940>:
  user_descriptors_next.18 = user_descriptors_next;
  D.17941 = (long unsigned int) user_descriptors_next.18;
  D.17942 = D.17941 << 3;
  D.17943 = D.17942 | 4;
  descr = (void *) D.17943;
  user_descriptors_next.18 = user_descriptors_next;
  user_descriptors_next.19 = user_descriptors_next.18;
  user_descriptors_next.20 = user_descriptors_next.19 + 1;
  user_descriptors_next = user_descriptors_next.20;
  user_descriptors[user_descriptors_next.19] = marker;
  D.17946 = descr;
  return D.17946;
}


sgen_get_complex_descriptor_bitmap (mword desc)
{
  void * D.17948;
  gsize * complex_descriptors.21;
  long unsigned int D.17950;
  long unsigned int D.17951;

  complex_descriptors.21 = complex_descriptors;
  D.17950 = desc >> 3;
  D.17951 = D.17950 * 8;
  D.17948 = complex_descriptors.21 + D.17951;
  return D.17948;
}


sgen_get_user_descriptor_func (mword desc)
{
  void (*MonoGCRootMarkFunc) (void *, void (*MonoGCMarkFunc) (void * *)) D.17953;
  long unsigned int D.17954;

  D.17954 = desc >> 3;
  D.17953 = user_descriptors[D.17954];
  return D.17953;
}


