__attribute__((visibility ("hidden")))
sgen_get_complex_descriptor (mword desc)
{
  gsize * D.17792;
  gsize * complex_descriptors.0;
  long unsigned int D.17794;
  long unsigned int D.17795;

  complex_descriptors.0 = complex_descriptors;
  D.17794 = desc >> 3;
  D.17795 = D.17794 * 8;
  D.17792 = complex_descriptors.0 + D.17795;
  return D.17792;
}


__attribute__((visibility ("hidden")))
mono_gc_make_descr_for_string (gsize * bitmap, int numbits)
{
  void * D.17797;

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


__attribute__((visibility ("hidden")))
mono_gc_make_descr_for_object (gsize * bitmap, int numbits, size_t obj_size)
{
  long unsigned int D.17799;
  long unsigned int D.17800;
  long unsigned int D.17801;
  gsize * D.17802;
  long unsigned int D.17803;
  unsigned int i.1;
  unsigned int D.17805;
  long unsigned int D.17806;
  long unsigned int D.17807;
  struct FILE * gc_debug_file.2;
  void * desc.3;
  void * D.17820;
  long unsigned int D.17821;
  long unsigned int D.17822;
  _Bool D.17823;
  long int D.17824;
  long int D.17825;
  int D.17834;
  int D.17835;
  int D.17838;
  long unsigned int D.17839;
  long unsigned int D.17840;
  int D.17841;
  long unsigned int D.17842;
  long unsigned int D.17843;
  unsigned int last_set.4;
  long unsigned int D.17851;
  long unsigned int D.17852;
  long unsigned int D.17853;
  long unsigned int D.17854;
  long unsigned int D.17859;
  int D.17862;
  int D.17863;
  int D.17864;
  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.17727>;
  <D.17726>:
  D.17799 = (long unsigned int) i;
  D.17800 = D.17799 / 64;
  D.17801 = D.17800 * 8;
  D.17802 = bitmap + D.17801;
  D.17803 = *D.17802;
  i.1 = (unsigned int) i;
  D.17805 = i.1 & 63;
  D.17806 = D.17803 >> D.17805;
  D.17807 = D.17806 & 1;
  if (D.17807 != 0) goto <D.17808>; else goto <D.17809>;
  <D.17808>:
  if (first_set < 0) goto <D.17810>; else goto <D.17811>;
  <D.17810>:
  first_set = i;
  <D.17811>:
  last_set = i;
  num_set = num_set + 1;
  <D.17809>:
  i = i + 1;
  <D.17727>:
  if (i < numbits) goto <D.17726>; else goto <D.17728>;
  <D.17728>:
  if (first_set < 0) goto <D.17812>; else goto <D.17813>;
  <D.17812>:
  if (0 != 0) goto <D.17814>; else goto <D.17815>;
  <D.17814>:
  gc_debug_file.2 = gc_debug_file;
  desc.3 = (void *) desc;
  fprintf (gc_debug_file.2, "Ptrfree descriptor %p, size: %zd\n", desc.3, stored_size);
  gc_debug_file.2 = gc_debug_file;
  fflush (gc_debug_file.2);
  <D.17815>:
  if (stored_size <= 65535) goto <D.17818>; else goto <D.17819>;
  <D.17818>:
  D.17821 = stored_size | 1;
  D.17820 = (void *) D.17821;
  return D.17820;
  <D.17819>:
  D.17820 = 7B;
  return D.17820;
  <D.17813>:
  D.17822 = stored_size & 7;
  D.17823 = D.17822 != 0;
  D.17824 = (long int) D.17823;
  D.17825 = __builtin_expect (D.17824, 0);
  if (D.17825 != 0) goto <D.17826>; else goto <D.17827>;
  <D.17826>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-descriptor.c", 149, "!(stored_size & 0x7)");
  <D.17827>:
  if (stored_size <= 65535) goto <D.17828>; else goto <D.17829>;
  <D.17828>:
  if (first_set <= 255) goto <D.17830>; else goto <D.17831>;
  <D.17830>:
  if (num_set <= 255) goto <D.17832>; else goto <D.17833>;
  <D.17832>:
  D.17834 = first_set + num_set;
  D.17835 = last_set + 1;
  if (D.17834 == D.17835) goto <D.17836>; else goto <D.17837>;
  <D.17836>:
  D.17838 = first_set << 16;
  D.17839 = (long unsigned int) D.17838;
  D.17840 = D.17839 | stored_size;
  D.17841 = num_set << 24;
  D.17842 = (long unsigned int) D.17841;
  D.17843 = D.17840 | D.17842;
  desc = D.17843 | 1;
  if (0 != 0) goto <D.17844>; else goto <D.17845>;
  <D.17844>:
  gc_debug_file.2 = gc_debug_file;
  desc.3 = (void *) desc;
  fprintf (gc_debug_file.2, "Runlen descriptor %p, size: %zd, first set: %d, num set: %d\n", desc.3, stored_size, first_set, num_set);
  gc_debug_file.2 = gc_debug_file;
  fflush (gc_debug_file.2);
  <D.17845>:
  D.17820 = (void *) desc;
  return D.17820;
  <D.17837>:
  <D.17833>:
  <D.17831>:
  <D.17829>:
  last_set.4 = (unsigned int) last_set;
  if (last_set.4 <= 49) goto <D.17847>; else goto <D.17848>;
  <D.17847>:
  if (stored_size <= 65535) goto <D.17849>; else goto <D.17850>;
  <D.17849>:
  D.17851 = *bitmap;
  D.17852 = D.17851 >> 2;
  D.17853 = D.17852 << 16;
  D.17854 = D.17853 | stored_size;
  desc = D.17854 | 2;
  if (0 != 0) goto <D.17855>; else goto <D.17856>;
  <D.17855>:
  gc_debug_file.2 = gc_debug_file;
  desc.3 = (void *) desc;
  fprintf (gc_debug_file.2, "Smallbitmap descriptor %p, size: %zd, last set: %d\n", desc.3, stored_size, last_set);
  gc_debug_file.2 = gc_debug_file;
  fflush (gc_debug_file.2);
  <D.17856>:
  D.17820 = (void *) desc;
  return D.17820;
  <D.17850>:
  <D.17848>:
  last_set.4 = (unsigned int) last_set;
  if (last_set.4 <= 62) goto <D.17857>; else goto <D.17858>;
  <D.17857>:
  D.17851 = *bitmap;
  D.17852 = D.17851 >> 2;
  D.17859 = D.17852 << 3;
  desc = D.17859 | 5;
  if (0 != 0) goto <D.17860>; else goto <D.17861>;
  <D.17860>:
  gc_debug_file.2 = gc_debug_file;
  desc.3 = (void *) desc;
  fprintf (gc_debug_file.2, "Largebitmap descriptor %p, size: %zd, last set: %d\n", desc.3, stored_size, last_set);
  gc_debug_file.2 = gc_debug_file;
  fflush (gc_debug_file.2);
  <D.17861>:
  D.17820 = (void *) desc;
  return D.17820;
  <D.17858>:
  D.17835 = last_set + 1;
  D.17862 = alloc_complex_descriptor (bitmap, D.17835);
  D.17863 = D.17862 << 3;
  D.17864 = D.17863 | 3;
  desc = (mword) D.17864;
  D.17820 = (void *) desc;
  return D.17820;
}


alloc_complex_descriptor (gsize * bitmap, int numbits)
{
  unsigned int numbits.5;
  unsigned int D.17867;
  int D.17868;
  long unsigned int D.17869;
  long unsigned int D.17870;
  unsigned int D.17871;
  unsigned int D.17872;
  gsize * complex_descriptors.6;
  long unsigned int D.17874;
  long unsigned int D.17875;
  gsize * D.17876;
  long unsigned int D.17877;
  long unsigned int D.17878;
  int D.17881;
  int D.17882;
  long unsigned int D.17883;
  long unsigned int D.17884;
  gsize * D.17885;
  long unsigned int D.17886;
  long unsigned int D.17887;
  long unsigned int D.17888;
  gsize * D.17889;
  long unsigned int D.17890;
  int D.17893;
  int D.17896;
  unsigned int D.17897;
  unsigned int i.7;
  unsigned int D.17899;
  int complex_descriptors_next.8;
  int D.17901;
  int complex_descriptors_size.9;
  int D.17905;
  long unsigned int D.17906;
  long unsigned int D.17907;
  void * D.17908;
  struct FILE * gc_debug_file.10;
  long unsigned int D.17912;
  long unsigned int D.17913;
  gsize * D.17914;
  int D.17915;
  int D.17916;
  long unsigned int D.17917;
  long unsigned int D.17918;
  gsize * D.17919;
  gsize * D.17920;
  long unsigned int D.17921;
  long unsigned int D.17924;
  void * D.17925;
  int nwords;
  int res;
  int i;

  numbits.5 = (unsigned int) numbits;
  D.17867 = numbits.5 + 63;
  D.17868 = (int) D.17867;
  numbits = D.17868 & -64;
  D.17869 = (long unsigned int) numbits;
  D.17870 = D.17869 / 64;
  D.17871 = (unsigned int) D.17870;
  D.17872 = D.17871 + 1;
  nwords = (int) D.17872;
  sgen_gc_lock ();
  res = complex_descriptors_next;
  i = 0;
  goto <D.17702>;
  <D.17701>:
  complex_descriptors.6 = complex_descriptors;
  D.17874 = (long unsigned int) i;
  D.17875 = D.17874 * 8;
  D.17876 = complex_descriptors.6 + D.17875;
  D.17877 = *D.17876;
  D.17878 = (long unsigned int) nwords;
  if (D.17877 == D.17878) goto <D.17879>; else goto <D.17880>;
  <D.17879>:
  {
    int j;
    int found;

    found = 1;
    j = 0;
    goto <D.17700>;
    <D.17699>:
    complex_descriptors.6 = complex_descriptors;
    D.17881 = i + 1;
    D.17882 = D.17881 + j;
    D.17883 = (long unsigned int) D.17882;
    D.17884 = D.17883 * 8;
    D.17885 = complex_descriptors.6 + D.17884;
    D.17886 = *D.17885;
    D.17887 = (long unsigned int) j;
    D.17888 = D.17887 * 8;
    D.17889 = bitmap + D.17888;
    D.17890 = *D.17889;
    if (D.17886 != D.17890) goto <D.17891>; else goto <D.17892>;
    <D.17891>:
    found = 0;
    goto <D.17698>;
    <D.17892>:
    j = j + 1;
    <D.17700>:
    D.17893 = nwords + -1;
    if (D.17893 > j) goto <D.17699>; else goto <D.17698>;
    <D.17698>:
    if (found != 0) goto <D.17894>; else goto <D.17895>;
    <D.17894>:
    sgen_gc_unlock ();
    D.17896 = i;
    return D.17896;
    <D.17895>:
  }
  <D.17880>:
  complex_descriptors.6 = complex_descriptors;
  D.17874 = (long unsigned int) i;
  D.17875 = D.17874 * 8;
  D.17876 = complex_descriptors.6 + D.17875;
  D.17877 = *D.17876;
  D.17897 = (unsigned int) D.17877;
  i.7 = (unsigned int) i;
  D.17899 = D.17897 + i.7;
  i = (int) D.17899;
  <D.17702>:
  complex_descriptors_next.8 = complex_descriptors_next;
  if (i < complex_descriptors_next.8) goto <D.17701>; else goto <D.17703>;
  <D.17703>:
  complex_descriptors_next.8 = complex_descriptors_next;
  D.17901 = complex_descriptors_next.8 + nwords;
  complex_descriptors_size.9 = complex_descriptors_size;
  if (D.17901 > complex_descriptors_size.9) goto <D.17903>; else goto <D.17904>;
  <D.17903>:
  {
    int new_size;

    complex_descriptors_size.9 = complex_descriptors_size;
    D.17905 = complex_descriptors_size.9 * 2;
    new_size = D.17905 + nwords;
    complex_descriptors.6 = complex_descriptors;
    D.17906 = (long unsigned int) new_size;
    D.17907 = D.17906 * 8;
    D.17908 = monoeg_realloc (complex_descriptors.6, D.17907);
    complex_descriptors = D.17908;
    complex_descriptors_size = new_size;
  }
  <D.17904>:
  if (0 != 0) goto <D.17909>; else goto <D.17910>;
  <D.17909>:
  gc_debug_file.10 = gc_debug_file;
  complex_descriptors_size.9 = complex_descriptors_size;
  fprintf (gc_debug_file.10, "Complex descriptor %d, size: %d (total desc memory: %d)\n", res, nwords, complex_descriptors_size.9);
  gc_debug_file.10 = gc_debug_file;
  fflush (gc_debug_file.10);
  <D.17910>:
  complex_descriptors_next.8 = complex_descriptors_next;
  D.17901 = complex_descriptors_next.8 + nwords;
  complex_descriptors_next = D.17901;
  complex_descriptors.6 = complex_descriptors;
  D.17912 = (long unsigned int) res;
  D.17913 = D.17912 * 8;
  D.17914 = complex_descriptors.6 + D.17913;
  D.17878 = (long unsigned int) nwords;
  *D.17914 = D.17878;
  i = 0;
  goto <D.17706>;
  <D.17705>:
  complex_descriptors.6 = complex_descriptors;
  D.17915 = res + 1;
  D.17916 = D.17915 + i;
  D.17917 = (long unsigned int) D.17916;
  D.17918 = D.17917 * 8;
  D.17919 = complex_descriptors.6 + D.17918;
  D.17874 = (long unsigned int) i;
  D.17875 = D.17874 * 8;
  D.17920 = bitmap + D.17875;
  D.17921 = *D.17920;
  *D.17919 = D.17921;
  if (0 != 0) goto <D.17922>; else goto <D.17923>;
  <D.17922>:
  gc_debug_file.10 = gc_debug_file;
  complex_descriptors.6 = complex_descriptors;
  D.17915 = res + 1;
  D.17916 = D.17915 + i;
  D.17917 = (long unsigned int) D.17916;
  D.17918 = D.17917 * 8;
  D.17919 = complex_descriptors.6 + D.17918;
  D.17924 = *D.17919;
  D.17925 = (void *) D.17924;
  fprintf (gc_debug_file.10, "\tvalue: %p\n", D.17925);
  gc_debug_file.10 = gc_debug_file;
  fflush (gc_debug_file.10);
  <D.17923>:
  i = i + 1;
  <D.17706>:
  D.17893 = nwords + -1;
  if (D.17893 > i) goto <D.17705>; else goto <D.17707>;
  <D.17707>:
  sgen_gc_unlock ();
  D.17896 = res;
  return D.17896;
}


__attribute__((visibility ("hidden")))
mono_gc_make_descr_for_array (int vector, gsize * elem_bitmap, int numbits, size_t elem_size)
{
  mword iftmp.11;
  long unsigned int D.17931;
  long unsigned int D.17932;
  long unsigned int D.17933;
  gsize * D.17934;
  long unsigned int D.17935;
  unsigned int i.12;
  unsigned int D.17937;
  long unsigned int D.17938;
  long unsigned int D.17939;
  void * D.17948;
  long unsigned int D.17949;
  long unsigned int D.17950;
  long unsigned int D.17955;
  long unsigned int D.17956;
  long unsigned int D.17959;
  unsigned int last_set.13;
  long unsigned int D.17963;
  long unsigned int D.17964;
  long unsigned int D.17965;
  long unsigned int D.17966;
  int D.17967;
  int D.17968;
  int D.17969;
  long unsigned int D.17970;
  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.17928>; else goto <D.17929>;
  <D.17928>:
  iftmp.11 = 4;
  goto <D.17930>;
  <D.17929>:
  iftmp.11 = 8196;
  <D.17930>:
  desc = iftmp.11;
  i = 0;
  goto <D.17741>;
  <D.17740>:
  D.17931 = (long unsigned int) i;
  D.17932 = D.17931 / 64;
  D.17933 = D.17932 * 8;
  D.17934 = elem_bitmap + D.17933;
  D.17935 = *D.17934;
  i.12 = (unsigned int) i;
  D.17937 = i.12 & 63;
  D.17938 = D.17935 >> D.17937;
  D.17939 = D.17938 & 1;
  if (D.17939 != 0) goto <D.17940>; else goto <D.17941>;
  <D.17940>:
  if (first_set < 0) goto <D.17942>; else goto <D.17943>;
  <D.17942>:
  first_set = i;
  <D.17943>:
  last_set = i;
  num_set = num_set + 1;
  <D.17941>:
  i = i + 1;
  <D.17741>:
  if (i < numbits) goto <D.17740>; else goto <D.17742>;
  <D.17742>:
  if (first_set < 0) goto <D.17944>; else goto <D.17945>;
  <D.17944>:
  if (elem_size <= 1023) goto <D.17946>; else goto <D.17947>;
  <D.17946>:
  D.17949 = elem_size << 3;
  D.17950 = D.17949 | desc;
  D.17948 = (void *) D.17950;
  return D.17948;
  <D.17947>:
  D.17948 = 7B;
  return D.17948;
  <D.17945>:
  if (elem_size <= 1023) goto <D.17951>; else goto <D.17952>;
  <D.17951>:
  D.17949 = elem_size << 3;
  desc = D.17949 | desc;
  if (num_set == 0) goto <D.17953>; else goto <D.17954>;
  <D.17953>:
  D.17948 = (void *) desc;
  return D.17948;
  <D.17954>:
  D.17955 = (long unsigned int) num_set;
  D.17956 = D.17955 * 8;
  if (D.17956 == elem_size) goto <D.17957>; else goto <D.17958>;
  <D.17957>:
  D.17959 = desc | 18446744073709502464;
  D.17948 = (void *) D.17959;
  return D.17948;
  <D.17958>:
  last_set.13 = (unsigned int) last_set;
  if (last_set.13 <= 47) goto <D.17961>; else goto <D.17962>;
  <D.17961>:
  D.17963 = *elem_bitmap;
  D.17964 = D.17963 << 16;
  D.17965 = D.17964 | desc;
  D.17966 = D.17965 | 49152;
  D.17948 = (void *) D.17966;
  return D.17948;
  <D.17962>:
  <D.17952>:
  desc = 6;
  D.17967 = last_set + 1;
  D.17968 = alloc_complex_descriptor (elem_bitmap, D.17967);
  D.17969 = D.17968 << 3;
  D.17970 = (long unsigned int) D.17969;
  desc = D.17970 | desc;
  D.17948 = (void *) desc;
  return D.17948;
}


__attribute__((visibility ("hidden")))
mono_gc_get_bitmap_for_descr (void * descr, int * numbits)
{
  long unsigned int D.17972;
  long unsigned int D.17973;
  int D.17974;
  long unsigned int D.17975;
  int D.17976;
  int D.17977;
  int D.17978;
  int D.17979;
  long unsigned int D.17980;
  long unsigned int D.17981;
  long unsigned int D.17982;
  long unsigned int D.17983;
  long unsigned int D.17984;
  gsize * D.17985;
  long unsigned int D.17986;
  unsigned int i.14;
  unsigned int D.17988;
  long unsigned int D.17989;
  long unsigned int D.17990;
  gsize * D.17991;
  long unsigned int D.17992;
  long unsigned int D.17993;
  int D.17994;
  int D.17995;
  long unsigned int D.17996;
  unsigned int D.17997;
  unsigned int D.17998;
  long unsigned int D.17999;
  long unsigned int D.18000;
  unsigned int bwords.15;
  unsigned int D.18002;
  int D.18003;
  long unsigned int D.18004;
  long unsigned int D.18005;
  gsize * D.18006;
  sizetype D.18007;
  sizetype D.18008;
  sizetype D.18009;
  gsize * D.18010;
  long unsigned int D.18011;
  mword d;
  gsize * bitmap;

  d = (mword) descr;
  D.17972 = d & 7;
  switch (D.17972) <default: <D.17769>, case 1: <D.17749>, case 2: <D.17756>, case 3: <D.17762>, case 5: <D.17757>>
  <D.17749>:
  {
    int first_set;
    int num_set;
    int i;

    D.17973 = d >> 16;
    D.17974 = (int) D.17973;
    first_set = D.17974 & 255;
    D.17975 = d >> 24;
    D.17976 = (int) D.17975;
    num_set = D.17976 & 255;
    D.17977 = first_set + num_set;
    D.17978 = D.17977 + 7;
    D.17979 = D.17978 / 8;
    D.17980 = (long unsigned int) D.17979;
    D.17981 = D.17980 * 8;
    bitmap = monoeg_malloc0 (D.17981);
    i = first_set;
    goto <D.17754>;
    <D.17753>:
    D.17982 = (long unsigned int) i;
    D.17983 = D.17982 / 64;
    D.17984 = D.17983 * 8;
    D.17985 = bitmap + D.17984;
    D.17984 = D.17983 * 8;
    D.17985 = bitmap + D.17984;
    D.17986 = *D.17985;
    i.14 = (unsigned int) i;
    D.17988 = i.14 & 63;
    D.17989 = 1 << D.17988;
    D.17990 = D.17986 | D.17989;
    *D.17985 = D.17990;
    i = i + 1;
    <D.17754>:
    D.17977 = first_set + num_set;
    if (D.17977 > i) goto <D.17753>; else goto <D.17755>;
    <D.17755>:
    D.17977 = first_set + num_set;
    *numbits = D.17977;
    D.17991 = bitmap;
    return D.17991;
  }
  <D.17756>:
  bitmap = monoeg_malloc0 (8);
  D.17973 = d >> 16;
  D.17992 = D.17973 << 2;
  *bitmap = D.17992;
  *numbits = 64;
  D.17991 = bitmap;
  return D.17991;
  <D.17757>:
  {
    gsize bmap;

    D.17993 = d >> 3;
    bmap = D.17993 << 2;
    bitmap = monoeg_malloc0 (8);
    *bitmap = bmap;
    *numbits = 0;
    goto <D.17760>;
    <D.17759>:
    D.17994 = *numbits;
    D.17995 = D.17994 + 1;
    *numbits = D.17995;
    bmap = bmap >> 1;
    <D.17760>:
    if (bmap != 0) goto <D.17759>; else goto <D.17761>;
    <D.17761>:
    D.17991 = bitmap;
    return D.17991;
  }
  <D.17762>:
  {
    gsize * bitmap_data;
    int bwords;
    int i;

    bitmap_data = sgen_get_complex_descriptor (d);
    D.17996 = *bitmap_data;
    D.17997 = (unsigned int) D.17996;
    D.17998 = D.17997 + 4294967295;
    bwords = (int) D.17998;
    D.17999 = (long unsigned int) bwords;
    D.18000 = D.17999 * 8;
    bitmap = monoeg_malloc0 (D.18000);
    bwords.15 = (unsigned int) bwords;
    D.18002 = bwords.15 * 64;
    D.18003 = (int) D.18002;
    *numbits = D.18003;
    i = 0;
    goto <D.17767>;
    <D.17766>:
    D.18004 = (long unsigned int) i;
    D.18005 = D.18004 * 8;
    D.18006 = bitmap + D.18005;
    D.18007 = (sizetype) i;
    D.18008 = D.18007 + 1;
    D.18009 = D.18008 * 8;
    D.18010 = bitmap_data + D.18009;
    D.18011 = *D.18010;
    *D.18006 = D.18011;
    i = i + 1;
    <D.17767>:
    if (i < bwords) goto <D.17766>; else goto <D.17768>;
    <D.17768>:
    D.17991 = bitmap;
    return D.17991;
  }
  <D.17769>:
  monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "sgen-descriptor.c", 283);
}


__attribute__((visibility ("hidden")))
mono_gc_make_descr_from_bitmap (gsize * bitmap, int numbits)
{
  void * D.18015;
  unsigned int numbits.16;
  long unsigned int D.18019;
  long unsigned int D.18020;
  long unsigned int D.18021;
  int D.18022;
  long unsigned int D.18023;
  long unsigned int D.18024;

  if (numbits == 0) goto <D.18013>; else goto <D.18014>;
  <D.18013>:
  D.18015 = 1B;
  return D.18015;
  <D.18014>:
  numbits.16 = (unsigned int) numbits;
  if (numbits.16 <= 60) goto <D.18017>; else goto <D.18018>;
  <D.18017>:
  D.18019 = *bitmap;
  D.18020 = D.18019 << 3;
  D.18021 = D.18020 | 1;
  D.18015 = (void *) D.18021;
  return D.18015;
  <D.18018>:
  {
    mword complex;

    D.18022 = alloc_complex_descriptor (bitmap, numbits);
    complex = (mword) D.18022;
    D.18023 = complex << 3;
    D.18024 = D.18023 | 3;
    D.18015 = (void *) D.18024;
    return D.18015;
  }
}


__attribute__((visibility ("hidden")))
mono_gc_make_root_descr_all_refs (int numbits)
{
  void * D.18028;
  void * D.18031;
  long unsigned int D.18032;
  long unsigned int D.18033;
  long unsigned int D.18034;
  long unsigned int D.18035;
  long unsigned int D.18036;
  unsigned int numbits.17;
  long unsigned int D.18040;
  unsigned int D.18041;
  unsigned int D.18042;
  unsigned int D.18043;
  unsigned int D.18044;
  unsigned int D.18045;
  unsigned int D.18046;
  unsigned int D.18047;
  unsigned int D.18048;
  unsigned int D.18049;
  unsigned int D.18050;
  long unsigned int D.18051;
  long unsigned int D.18052;
  long unsigned int D.18053;
  unsigned int D.18054;
  unsigned int D.18055;
  unsigned int D.18056;
  unsigned int D.18057;
  unsigned int D.18058;
  unsigned int D.18059;
  unsigned int D.18060;
  unsigned int D.18061;
  unsigned int D.18062;
  unsigned int D.18063;
  long unsigned int D.18064;
  long unsigned int D.18065;
  long unsigned int D.18069;
  long unsigned int D.18070;
  int D.18073;
  long unsigned int D.18074;
  long unsigned int D.18075;
  gsize * D.18076;
  long unsigned int D.18077;
  unsigned int D.18078;
  unsigned int D.18079;
  unsigned int D.18080;
  unsigned int D.18081;
  unsigned int D.18082;
  unsigned int D.18083;
  unsigned int D.18084;
  unsigned int D.18085;
  unsigned int D.18086;
  unsigned int D.18087;
  long unsigned int D.18088;
  long unsigned int D.18089;
  long unsigned int D.18090;
  unsigned int D.18091;
  unsigned int D.18092;
  unsigned int D.18093;
  unsigned int D.18094;
  unsigned int D.18095;
  unsigned int D.18096;
  unsigned int D.18097;
  unsigned int D.18098;
  unsigned int D.18099;
  unsigned int D.18100;
  long unsigned int D.18101;
  long unsigned int D.18102;
  unsigned int numbits.18;
  unsigned int D.18104;
  int D.18107;
  long unsigned int D.18108;
  long unsigned int D.18109;
  gsize * D.18110;
  int D.18111;
  int D.18112;
  int D.18113;
  long unsigned int D.18114;
  gsize * gc_bitmap;
  void * descr;
  int num_bytes;

  num_bytes = numbits / 8;
  if (numbits <= 31) goto <D.18026>; else goto <D.18027>;
  <D.18026>:
  D.18028 = all_ref_root_descrs[numbits];
  if (D.18028 != 0B) goto <D.18029>; else goto <D.18030>;
  <D.18029>:
  D.18031 = all_ref_root_descrs[numbits];
  return D.18031;
  <D.18030>:
  <D.18027>:
  D.18032 = (long unsigned int) numbits;
  D.18033 = D.18032 + 7;
  D.18034 = D.18033 & 18446744073709551608;
  D.18035 = D.18034 + 8;
  gc_bitmap = monoeg_malloc0 (D.18035);
  D.18036 = (long unsigned int) num_bytes;
  memset (gc_bitmap, 255, D.18036);
  numbits.17 = (unsigned int) numbits;
  if (numbits.17 <= 60) goto <D.18038>; else goto <D.18039>;
  <D.18038>:
  D.18040 = *gc_bitmap;
  D.18041 = (unsigned int) D.18040;
  D.18042 = D.18041 << 24;
  D.18040 = *gc_bitmap;
  D.18041 = (unsigned int) D.18040;
  D.18043 = D.18041 >> 8;
  D.18044 = D.18043 & 65280;
  D.18045 = D.18042 | D.18044;
  D.18040 = *gc_bitmap;
  D.18041 = (unsigned int) D.18040;
  D.18046 = D.18041 << 8;
  D.18047 = D.18046 & 16711680;
  D.18048 = D.18045 | D.18047;
  D.18040 = *gc_bitmap;
  D.18041 = (unsigned int) D.18040;
  D.18049 = D.18041 >> 24;
  D.18050 = D.18048 | D.18049;
  D.18051 = (long unsigned int) D.18050;
  D.18052 = D.18051 << 32;
  D.18040 = *gc_bitmap;
  D.18053 = D.18040 >> 32;
  D.18054 = (unsigned int) D.18053;
  D.18055 = D.18054 << 24;
  D.18040 = *gc_bitmap;
  D.18053 = D.18040 >> 32;
  D.18054 = (unsigned int) D.18053;
  D.18056 = D.18054 >> 8;
  D.18057 = D.18056 & 65280;
  D.18058 = D.18055 | D.18057;
  D.18040 = *gc_bitmap;
  D.18053 = D.18040 >> 32;
  D.18054 = (unsigned int) D.18053;
  D.18059 = D.18054 << 8;
  D.18060 = D.18059 & 16711680;
  D.18061 = D.18058 | D.18060;
  D.18040 = *gc_bitmap;
  D.18053 = D.18040 >> 32;
  D.18054 = (unsigned int) D.18053;
  D.18062 = D.18054 >> 24;
  D.18063 = D.18061 | D.18062;
  D.18064 = (long unsigned int) D.18063;
  D.18065 = D.18052 | D.18064;
  *gc_bitmap = D.18065;
  goto <D.18066>;
  <D.18039>:
  if (numbits != 0) goto <D.18067>; else goto <D.18068>;
  <D.18067>:
  D.18069 = (long unsigned int) num_bytes;
  D.18070 = D.18069 & 7;
  if (D.18070 != 0) goto <D.18071>; else goto <D.18072>;
  <D.18071>:
  D.18073 = num_bytes / 8;
  D.18074 = (long unsigned int) D.18073;
  D.18075 = D.18074 * 8;
  D.18076 = gc_bitmap + D.18075;
  D.18073 = num_bytes / 8;
  D.18074 = (long unsigned int) D.18073;
  D.18075 = D.18074 * 8;
  D.18076 = gc_bitmap + D.18075;
  D.18077 = *D.18076;
  D.18078 = (unsigned int) D.18077;
  D.18079 = D.18078 << 24;
  D.18073 = num_bytes / 8;
  D.18074 = (long unsigned int) D.18073;
  D.18075 = D.18074 * 8;
  D.18076 = gc_bitmap + D.18075;
  D.18077 = *D.18076;
  D.18078 = (unsigned int) D.18077;
  D.18080 = D.18078 >> 8;
  D.18081 = D.18080 & 65280;
  D.18082 = D.18079 | D.18081;
  D.18073 = num_bytes / 8;
  D.18074 = (long unsigned int) D.18073;
  D.18075 = D.18074 * 8;
  D.18076 = gc_bitmap + D.18075;
  D.18077 = *D.18076;
  D.18078 = (unsigned int) D.18077;
  D.18083 = D.18078 << 8;
  D.18084 = D.18083 & 16711680;
  D.18085 = D.18082 | D.18084;
  D.18073 = num_bytes / 8;
  D.18074 = (long unsigned int) D.18073;
  D.18075 = D.18074 * 8;
  D.18076 = gc_bitmap + D.18075;
  D.18077 = *D.18076;
  D.18078 = (unsigned int) D.18077;
  D.18086 = D.18078 >> 24;
  D.18087 = D.18085 | D.18086;
  D.18088 = (long unsigned int) D.18087;
  D.18089 = D.18088 << 32;
  D.18073 = num_bytes / 8;
  D.18074 = (long unsigned int) D.18073;
  D.18075 = D.18074 * 8;
  D.18076 = gc_bitmap + D.18075;
  D.18077 = *D.18076;
  D.18090 = D.18077 >> 32;
  D.18091 = (unsigned int) D.18090;
  D.18092 = D.18091 << 24;
  D.18073 = num_bytes / 8;
  D.18074 = (long unsigned int) D.18073;
  D.18075 = D.18074 * 8;
  D.18076 = gc_bitmap + D.18075;
  D.18077 = *D.18076;
  D.18090 = D.18077 >> 32;
  D.18091 = (unsigned int) D.18090;
  D.18093 = D.18091 >> 8;
  D.18094 = D.18093 & 65280;
  D.18095 = D.18092 | D.18094;
  D.18073 = num_bytes / 8;
  D.18074 = (long unsigned int) D.18073;
  D.18075 = D.18074 * 8;
  D.18076 = gc_bitmap + D.18075;
  D.18077 = *D.18076;
  D.18090 = D.18077 >> 32;
  D.18091 = (unsigned int) D.18090;
  D.18096 = D.18091 << 8;
  D.18097 = D.18096 & 16711680;
  D.18098 = D.18095 | D.18097;
  D.18073 = num_bytes / 8;
  D.18074 = (long unsigned int) D.18073;
  D.18075 = D.18074 * 8;
  D.18076 = gc_bitmap + D.18075;
  D.18077 = *D.18076;
  D.18090 = D.18077 >> 32;
  D.18091 = (unsigned int) D.18090;
  D.18099 = D.18091 >> 24;
  D.18100 = D.18098 | D.18099;
  D.18101 = (long unsigned int) D.18100;
  D.18102 = D.18089 | D.18101;
  *D.18076 = D.18102;
  <D.18072>:
  <D.18068>:
  <D.18066>:
  numbits.18 = (unsigned int) numbits;
  D.18104 = numbits.18 & 7;
  if (D.18104 != 0) goto <D.18105>; else goto <D.18106>;
  <D.18105>:
  D.18107 = numbits / 8;
  D.18108 = (long unsigned int) D.18107;
  D.18109 = D.18108 * 8;
  D.18110 = gc_bitmap + D.18109;
  D.18111 = numbits % 8;
  D.18112 = 1 << D.18111;
  D.18113 = D.18112 + -1;
  D.18114 = (long unsigned int) D.18113;
  *D.18110 = D.18114;
  <D.18106>:
  descr = mono_gc_make_descr_from_bitmap (gc_bitmap, numbits);
  monoeg_g_free (gc_bitmap);
  if (numbits <= 31) goto <D.18115>; else goto <D.18116>;
  <D.18115>:
  all_ref_root_descrs[numbits] = descr;
  <D.18116>:
  D.18031 = descr;
  return D.18031;
}


__attribute__((__artificial__, __gnu_inline__, __always_inline__, __nothrow__, __leaf__))
memset (void * __dest, int __ch, size_t __len)
{
  void * D.18118;
  long unsigned int D.18119;

  D.18119 = __builtin_object_size (__dest, 0);
  D.18118 = __builtin___memset_chk (__dest, __ch, __len, D.18119);
  return D.18118;
}


mono_gc_make_root_descr_user (void (*MonoGCRootMarkFunc) (void *, void (*MonoGCMarkFunc) (void * *)) marker)
{
  int user_descriptors_next.19;
  _Bool D.18122;
  long int D.18123;
  long int D.18124;
  long unsigned int D.18127;
  long unsigned int D.18128;
  long unsigned int D.18129;
  int user_descriptors_next.20;
  int D.18131;
  void * D.18132;
  void * descr;

  user_descriptors_next.19 = user_descriptors_next;
  D.18122 = user_descriptors_next.19 > 15;
  D.18123 = (long int) D.18122;
  D.18124 = __builtin_expect (D.18123, 0);
  if (D.18124 != 0) goto <D.18125>; else goto <D.18126>;
  <D.18125>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-descriptor.c", 332, "user_descriptors_next < MAX_USER_DESCRIPTORS");
  <D.18126>:
  user_descriptors_next.19 = user_descriptors_next;
  D.18127 = (long unsigned int) user_descriptors_next.19;
  D.18128 = D.18127 << 3;
  D.18129 = D.18128 | 4;
  descr = (void *) D.18129;
  user_descriptors_next.19 = user_descriptors_next;
  user_descriptors_next.20 = user_descriptors_next.19;
  D.18131 = user_descriptors_next.20 + 1;
  user_descriptors_next = D.18131;
  user_descriptors[user_descriptors_next.20] = marker;
  D.18132 = descr;
  return D.18132;
}


__attribute__((visibility ("hidden")))
sgen_get_complex_descriptor_bitmap (mword desc)
{
  void * D.18134;
  gsize * complex_descriptors.21;
  long unsigned int D.18136;
  long unsigned int D.18137;

  complex_descriptors.21 = complex_descriptors;
  D.18136 = desc >> 3;
  D.18137 = D.18136 * 8;
  D.18134 = complex_descriptors.21 + D.18137;
  return D.18134;
}


__attribute__((visibility ("hidden")))
sgen_get_user_descriptor_func (mword desc)
{
  void (*MonoGCRootMarkFunc) (void *, void (*MonoGCMarkFunc) (void * *)) D.18139;
  long unsigned int D.18140;

  D.18140 = desc >> 3;
  D.18139 = user_descriptors[D.18140];
  return D.18139;
}


