sgen_get_complex_descriptor (mword desc)
{
  gsize * D.19850;
  gsize * complex_descriptors.0;
  unsigned int D.19852;
  unsigned int D.19853;

  complex_descriptors.0 = complex_descriptors;
  D.19852 = desc >> 3;
  D.19853 = D.19852 * 4;
  D.19850 = complex_descriptors.0 + D.19853;
  return D.19850;
}


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

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


mono_gc_make_descr_for_object (gsize * bitmap, int numbits, size_t obj_size)
{
  unsigned int i.1;
  unsigned int D.19858;
  unsigned int D.19859;
  gsize * D.19860;
  unsigned int D.19861;
  int D.19862;
  unsigned int D.19863;
  unsigned int D.19864;
  struct FILE * gc_debug_file.2;
  void * desc.3;
  void * D.19877;
  unsigned int D.19878;
  unsigned int D.19879;
  _Bool D.19880;
  long int D.19881;
  long int D.19882;
  _Bool D.19887;
  _Bool D.19888;
  _Bool D.19889;
  int D.19892;
  int D.19893;
  int D.19896;
  unsigned int D.19897;
  unsigned int D.19898;
  int D.19899;
  unsigned int D.19900;
  unsigned int D.19901;
  unsigned int last_set.4;
  _Bool D.19905;
  _Bool D.19906;
  _Bool D.19907;
  unsigned int D.19910;
  unsigned int D.19911;
  unsigned int D.19912;
  unsigned int D.19913;
  unsigned int D.19918;
  int D.19921;
  int D.19922;
  int D.19923;
  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 & 4294967288;
  i = 0;
  goto <D.19783>;
  <D.19782>:
  i.1 = (unsigned int) i;
  D.19858 = i.1 / 32;
  D.19859 = D.19858 * 4;
  D.19860 = bitmap + D.19859;
  D.19861 = *D.19860;
  D.19862 = i & 31;
  D.19863 = 1 << D.19862;
  D.19864 = D.19861 & D.19863;
  if (D.19864 != 0) goto <D.19865>; else goto <D.19866>;
  <D.19865>:
  if (first_set < 0) goto <D.19867>; else goto <D.19868>;
  <D.19867>:
  first_set = i;
  <D.19868>:
  last_set = i;
  num_set = num_set + 1;
  <D.19866>:
  i = i + 1;
  <D.19783>:
  if (i < numbits) goto <D.19782>; else goto <D.19784>;
  <D.19784>:
  if (first_set < 0) goto <D.19869>; else goto <D.19870>;
  <D.19869>:
  if (0 != 0) goto <D.19871>; else goto <D.19872>;
  <D.19871>:
  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.19872>:
  if (stored_size <= 65535) goto <D.19875>; else goto <D.19876>;
  <D.19875>:
  D.19878 = stored_size | 1;
  D.19877 = (void *) D.19878;
  return D.19877;
  <D.19876>:
  D.19877 = 7B;
  return D.19877;
  <D.19870>:
  D.19879 = stored_size & 7;
  D.19880 = D.19879 != 0;
  D.19881 = (long int) D.19880;
  D.19882 = __builtin_expect (D.19881, 0);
  if (D.19882 != 0) goto <D.19883>; else goto <D.19884>;
  <D.19883>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-descriptor.c", 149, "!(stored_size & 0x7)");
  <D.19884>:
  if (stored_size <= 65535) goto <D.19885>; else goto <D.19886>;
  <D.19885>:
  D.19887 = first_set <= 255;
  D.19888 = num_set <= 255;
  D.19889 = D.19887 & D.19888;
  if (D.19889 != 0) goto <D.19890>; else goto <D.19891>;
  <D.19890>:
  D.19892 = first_set + num_set;
  D.19893 = last_set + 1;
  if (D.19892 == D.19893) goto <D.19894>; else goto <D.19895>;
  <D.19894>:
  D.19896 = first_set << 16;
  D.19897 = (unsigned int) D.19896;
  D.19898 = D.19897 | stored_size;
  D.19899 = num_set << 24;
  D.19900 = (unsigned int) D.19899;
  D.19901 = D.19898 | D.19900;
  desc = D.19901 | 1;
  if (0 != 0) goto <D.19902>; else goto <D.19903>;
  <D.19902>:
  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.19903>:
  D.19877 = (void *) desc;
  return D.19877;
  <D.19895>:
  <D.19891>:
  <D.19886>:
  last_set.4 = (unsigned int) last_set;
  D.19905 = last_set.4 <= 17;
  D.19906 = stored_size <= 65535;
  D.19907 = D.19905 & D.19906;
  if (D.19907 != 0) goto <D.19908>; else goto <D.19909>;
  <D.19908>:
  D.19910 = *bitmap;
  D.19911 = D.19910 >> 2;
  D.19912 = D.19911 << 16;
  D.19913 = D.19912 | stored_size;
  desc = D.19913 | 2;
  if (0 != 0) goto <D.19914>; else goto <D.19915>;
  <D.19914>:
  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.19915>:
  D.19877 = (void *) desc;
  return D.19877;
  <D.19909>:
  last_set.4 = (unsigned int) last_set;
  if (last_set.4 <= 30) goto <D.19916>; else goto <D.19917>;
  <D.19916>:
  D.19910 = *bitmap;
  D.19911 = D.19910 >> 2;
  D.19918 = D.19911 << 3;
  desc = D.19918 | 5;
  if (0 != 0) goto <D.19919>; else goto <D.19920>;
  <D.19919>:
  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.19920>:
  D.19877 = (void *) desc;
  return D.19877;
  <D.19917>:
  D.19893 = last_set + 1;
  D.19921 = alloc_complex_descriptor (bitmap, D.19893);
  D.19922 = D.19921 << 3;
  D.19923 = D.19922 | 3;
  desc = (mword) D.19923;
  D.19877 = (void *) desc;
  return D.19877;
}


alloc_complex_descriptor (gsize * bitmap, int numbits)
{
  unsigned int numbits.5;
  unsigned int D.19926;
  int D.19927;
  unsigned int numbits.6;
  unsigned int D.19929;
  unsigned int D.19930;
  gsize * complex_descriptors.7;
  unsigned int i.8;
  unsigned int D.19933;
  gsize * D.19934;
  unsigned int D.19935;
  unsigned int nwords.9;
  int D.19939;
  int D.19940;
  unsigned int D.19941;
  unsigned int D.19942;
  gsize * D.19943;
  unsigned int D.19944;
  unsigned int j.10;
  unsigned int D.19946;
  gsize * D.19947;
  unsigned int D.19948;
  int D.19951;
  int D.19954;
  unsigned int i.11;
  unsigned int D.19956;
  int complex_descriptors_next.12;
  int complex_descriptors_next.17;
  int complex_descriptors_size.13;
  int D.19962;
  unsigned int new_size.14;
  unsigned int D.19964;
  void * complex_descriptors.15;
  struct FILE * gc_debug_file.16;
  unsigned int res.18;
  unsigned int D.19970;
  gsize * D.19971;
  int D.19972;
  int D.19973;
  unsigned int D.19974;
  unsigned int D.19975;
  gsize * D.19976;
  gsize * D.19977;
  unsigned int D.19978;
  unsigned int D.19981;
  void * D.19982;
  int nwords;
  int res;
  int i;

  numbits.5 = (unsigned int) numbits;
  D.19926 = numbits.5 + 31;
  D.19927 = (int) D.19926;
  numbits = D.19927 & -32;
  numbits.6 = (unsigned int) numbits;
  D.19929 = numbits.6 / 32;
  D.19930 = D.19929 + 1;
  nwords = (int) D.19930;
  sgen_gc_lock ();
  res = complex_descriptors_next;
  i = 0;
  goto <D.19758>;
  <D.19757>:
  complex_descriptors.7 = complex_descriptors;
  i.8 = (unsigned int) i;
  D.19933 = i.8 * 4;
  D.19934 = complex_descriptors.7 + D.19933;
  D.19935 = *D.19934;
  nwords.9 = (unsigned int) nwords;
  if (D.19935 == nwords.9) goto <D.19937>; else goto <D.19938>;
  <D.19937>:
  {
    int j;
    int found;

    found = 1;
    j = 0;
    goto <D.19756>;
    <D.19755>:
    complex_descriptors.7 = complex_descriptors;
    D.19939 = i + 1;
    D.19940 = D.19939 + j;
    D.19941 = (unsigned int) D.19940;
    D.19942 = D.19941 * 4;
    D.19943 = complex_descriptors.7 + D.19942;
    D.19944 = *D.19943;
    j.10 = (unsigned int) j;
    D.19946 = j.10 * 4;
    D.19947 = bitmap + D.19946;
    D.19948 = *D.19947;
    if (D.19944 != D.19948) goto <D.19949>; else goto <D.19950>;
    <D.19949>:
    found = 0;
    goto <D.19754>;
    <D.19950>:
    j = j + 1;
    <D.19756>:
    D.19951 = nwords + -1;
    if (D.19951 > j) goto <D.19755>; else goto <D.19754>;
    <D.19754>:
    if (found != 0) goto <D.19952>; else goto <D.19953>;
    <D.19952>:
    sgen_gc_unlock ();
    D.19954 = i;
    return D.19954;
    <D.19953>:
  }
  <D.19938>:
  complex_descriptors.7 = complex_descriptors;
  i.8 = (unsigned int) i;
  D.19933 = i.8 * 4;
  D.19934 = complex_descriptors.7 + D.19933;
  D.19935 = *D.19934;
  i.11 = (unsigned int) i;
  D.19956 = D.19935 + i.11;
  i = (int) D.19956;
  <D.19758>:
  complex_descriptors_next.12 = complex_descriptors_next;
  if (i < complex_descriptors_next.12) goto <D.19757>; else goto <D.19759>;
  <D.19759>:
  complex_descriptors_next.12 = complex_descriptors_next;
  complex_descriptors_next.17 = complex_descriptors_next.12 + nwords;
  complex_descriptors_size.13 = complex_descriptors_size;
  if (complex_descriptors_next.17 > complex_descriptors_size.13) goto <D.19960>; else goto <D.19961>;
  <D.19960>:
  {
    int new_size;

    complex_descriptors_size.13 = complex_descriptors_size;
    D.19962 = complex_descriptors_size.13 * 2;
    new_size = D.19962 + nwords;
    complex_descriptors.7 = complex_descriptors;
    new_size.14 = (unsigned int) new_size;
    D.19964 = new_size.14 * 4;
    complex_descriptors.15 = monoeg_realloc (complex_descriptors.7, D.19964);
    complex_descriptors = complex_descriptors.15;
    complex_descriptors_size = new_size;
  }
  <D.19961>:
  if (0 != 0) goto <D.19966>; else goto <D.19967>;
  <D.19966>:
  gc_debug_file.16 = gc_debug_file;
  complex_descriptors_size.13 = complex_descriptors_size;
  fprintf (gc_debug_file.16, "Complex descriptor %d, size: %d (total desc memory: %d)\n", res, nwords, complex_descriptors_size.13);
  gc_debug_file.16 = gc_debug_file;
  fflush (gc_debug_file.16);
  <D.19967>:
  complex_descriptors_next.12 = complex_descriptors_next;
  complex_descriptors_next.17 = complex_descriptors_next.12 + nwords;
  complex_descriptors_next = complex_descriptors_next.17;
  complex_descriptors.7 = complex_descriptors;
  res.18 = (unsigned int) res;
  D.19970 = res.18 * 4;
  D.19971 = complex_descriptors.7 + D.19970;
  nwords.9 = (unsigned int) nwords;
  *D.19971 = nwords.9;
  i = 0;
  goto <D.19762>;
  <D.19761>:
  complex_descriptors.7 = complex_descriptors;
  D.19972 = res + 1;
  D.19973 = D.19972 + i;
  D.19974 = (unsigned int) D.19973;
  D.19975 = D.19974 * 4;
  D.19976 = complex_descriptors.7 + D.19975;
  i.8 = (unsigned int) i;
  D.19933 = i.8 * 4;
  D.19977 = bitmap + D.19933;
  D.19978 = *D.19977;
  *D.19976 = D.19978;
  if (0 != 0) goto <D.19979>; else goto <D.19980>;
  <D.19979>:
  gc_debug_file.16 = gc_debug_file;
  complex_descriptors.7 = complex_descriptors;
  D.19972 = res + 1;
  D.19973 = D.19972 + i;
  D.19974 = (unsigned int) D.19973;
  D.19975 = D.19974 * 4;
  D.19976 = complex_descriptors.7 + D.19975;
  D.19981 = *D.19976;
  D.19982 = (void *) D.19981;
  fprintf (gc_debug_file.16, "\tvalue: %p\n", D.19982);
  gc_debug_file.16 = gc_debug_file;
  fflush (gc_debug_file.16);
  <D.19980>:
  i = i + 1;
  <D.19762>:
  D.19951 = nwords + -1;
  if (D.19951 > i) goto <D.19761>; else goto <D.19763>;
  <D.19763>:
  sgen_gc_unlock ();
  D.19954 = res;
  return D.19954;
}


mono_gc_make_descr_for_array (int vector, gsize * elem_bitmap, int numbits, size_t elem_size)
{
  mword iftmp.19;
  unsigned int i.20;
  unsigned int D.19989;
  unsigned int D.19990;
  gsize * D.19991;
  unsigned int D.19992;
  int D.19993;
  unsigned int D.19994;
  unsigned int D.19995;
  void * D.20004;
  unsigned int D.20005;
  unsigned int D.20006;
  unsigned int num_set.21;
  unsigned int D.20012;
  unsigned int D.20015;
  unsigned int last_set.22;
  unsigned int D.20019;
  unsigned int D.20020;
  unsigned int D.20021;
  unsigned int D.20022;
  int D.20023;
  int D.20024;
  int D.20025;
  unsigned int D.20026;
  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.19985>; else goto <D.19986>;
  <D.19985>:
  iftmp.19 = 4;
  goto <D.19987>;
  <D.19986>:
  iftmp.19 = 8196;
  <D.19987>:
  desc = iftmp.19;
  i = 0;
  goto <D.19797>;
  <D.19796>:
  i.20 = (unsigned int) i;
  D.19989 = i.20 / 32;
  D.19990 = D.19989 * 4;
  D.19991 = elem_bitmap + D.19990;
  D.19992 = *D.19991;
  D.19993 = i & 31;
  D.19994 = 1 << D.19993;
  D.19995 = D.19992 & D.19994;
  if (D.19995 != 0) goto <D.19996>; else goto <D.19997>;
  <D.19996>:
  if (first_set < 0) goto <D.19998>; else goto <D.19999>;
  <D.19998>:
  first_set = i;
  <D.19999>:
  last_set = i;
  num_set = num_set + 1;
  <D.19997>:
  i = i + 1;
  <D.19797>:
  if (i < numbits) goto <D.19796>; else goto <D.19798>;
  <D.19798>:
  if (first_set < 0) goto <D.20000>; else goto <D.20001>;
  <D.20000>:
  if (elem_size <= 1023) goto <D.20002>; else goto <D.20003>;
  <D.20002>:
  D.20005 = elem_size << 3;
  D.20006 = D.20005 | desc;
  D.20004 = (void *) D.20006;
  return D.20004;
  <D.20003>:
  D.20004 = 7B;
  return D.20004;
  <D.20001>:
  if (elem_size <= 1023) goto <D.20007>; else goto <D.20008>;
  <D.20007>:
  D.20005 = elem_size << 3;
  desc = D.20005 | desc;
  if (num_set == 0) goto <D.20009>; else goto <D.20010>;
  <D.20009>:
  D.20004 = (void *) desc;
  return D.20004;
  <D.20010>:
  num_set.21 = (unsigned int) num_set;
  D.20012 = num_set.21 * 4;
  if (D.20012 == elem_size) goto <D.20013>; else goto <D.20014>;
  <D.20013>:
  D.20015 = desc | 4294918144;
  D.20004 = (void *) D.20015;
  return D.20004;
  <D.20014>:
  last_set.22 = (unsigned int) last_set;
  if (last_set.22 <= 15) goto <D.20017>; else goto <D.20018>;
  <D.20017>:
  D.20019 = *elem_bitmap;
  D.20020 = D.20019 << 16;
  D.20021 = D.20020 | desc;
  D.20022 = D.20021 | 49152;
  D.20004 = (void *) D.20022;
  return D.20004;
  <D.20018>:
  <D.20008>:
  desc = 6;
  D.20023 = last_set + 1;
  D.20024 = alloc_complex_descriptor (elem_bitmap, D.20023);
  D.20025 = D.20024 << 3;
  D.20026 = (unsigned int) D.20025;
  desc = D.20026 | desc;
  D.20004 = (void *) desc;
  return D.20004;
}


mono_gc_get_bitmap_for_descr (void * descr, int * numbits)
{
  unsigned int D.20028;
  unsigned int D.20029;
  int D.20030;
  unsigned int D.20031;
  int D.20032;
  int D.20033;
  int D.20034;
  unsigned int D.20035;
  unsigned int D.20036;
  unsigned int i.23;
  unsigned int D.20038;
  unsigned int D.20039;
  gsize * D.20040;
  unsigned int D.20041;
  int D.20042;
  unsigned int D.20043;
  unsigned int D.20044;
  gsize * D.20045;
  unsigned int D.20046;
  unsigned int D.20047;
  int D.20048;
  int D.20049;
  unsigned int D.20050;
  unsigned int D.20051;
  unsigned int bwords.24;
  unsigned int D.20053;
  unsigned int D.20054;
  int D.20055;
  unsigned int i.25;
  unsigned int D.20057;
  gsize * D.20058;
  sizetype i.26;
  sizetype D.20060;
  sizetype D.20061;
  gsize * D.20062;
  unsigned int D.20063;
  mword d;
  gsize * bitmap;

  d = (mword) descr;
  D.20028 = d & 7;
  switch (D.20028) <default: <D.19825>, case 1: <D.19805>, case 2: <D.19812>, case 3: <D.19818>, case 5: <D.19813>>
  <D.19805>:
  {
    int first_set;
    int num_set;
    int i;

    D.20029 = d >> 16;
    D.20030 = (int) D.20029;
    first_set = D.20030 & 255;
    D.20031 = d >> 24;
    num_set = (int) D.20031;
    D.20032 = first_set + num_set;
    D.20033 = D.20032 + 7;
    D.20034 = D.20033 / 8;
    D.20035 = (unsigned int) D.20034;
    D.20036 = D.20035 * 4;
    bitmap = monoeg_malloc0 (D.20036);
    i = first_set;
    goto <D.19810>;
    <D.19809>:
    i.23 = (unsigned int) i;
    D.20038 = i.23 / 32;
    D.20039 = D.20038 * 4;
    D.20040 = bitmap + D.20039;
    D.20039 = D.20038 * 4;
    D.20040 = bitmap + D.20039;
    D.20041 = *D.20040;
    D.20042 = i & 31;
    D.20043 = 1 << D.20042;
    D.20044 = D.20041 | D.20043;
    *D.20040 = D.20044;
    i = i + 1;
    <D.19810>:
    D.20032 = first_set + num_set;
    if (D.20032 > i) goto <D.19809>; else goto <D.19811>;
    <D.19811>:
    D.20032 = first_set + num_set;
    *numbits = D.20032;
    D.20045 = bitmap;
    return D.20045;
  }
  <D.19812>:
  bitmap = monoeg_malloc0 (4);
  D.20029 = d >> 16;
  D.20046 = D.20029 << 2;
  *bitmap = D.20046;
  *numbits = 32;
  D.20045 = bitmap;
  return D.20045;
  <D.19813>:
  {
    gsize bmap;

    D.20047 = d >> 3;
    bmap = D.20047 << 2;
    bitmap = monoeg_malloc0 (4);
    *bitmap = bmap;
    *numbits = 0;
    goto <D.19816>;
    <D.19815>:
    D.20048 = *numbits;
    D.20049 = D.20048 + 1;
    *numbits = D.20049;
    bmap = bmap >> 1;
    <D.19816>:
    if (bmap != 0) goto <D.19815>; else goto <D.19817>;
    <D.19817>:
    D.20045 = bitmap;
    return D.20045;
  }
  <D.19818>:
  {
    gsize * bitmap_data;
    int bwords;
    int i;

    bitmap_data = sgen_get_complex_descriptor (d);
    D.20050 = *bitmap_data;
    D.20051 = D.20050 + 4294967295;
    bwords = (int) D.20051;
    bwords.24 = (unsigned int) bwords;
    D.20053 = bwords.24 * 4;
    bitmap = monoeg_malloc0 (D.20053);
    bwords.24 = (unsigned int) bwords;
    D.20054 = bwords.24 * 32;
    D.20055 = (int) D.20054;
    *numbits = D.20055;
    i = 0;
    goto <D.19823>;
    <D.19822>:
    i.25 = (unsigned int) i;
    D.20057 = i.25 * 4;
    D.20058 = bitmap + D.20057;
    i.26 = (sizetype) i;
    D.20060 = i.26 + 1;
    D.20061 = D.20060 * 4;
    D.20062 = bitmap_data + D.20061;
    D.20063 = *D.20062;
    *D.20058 = D.20063;
    i = i + 1;
    <D.19823>:
    if (i < bwords) goto <D.19822>; else goto <D.19824>;
    <D.19824>:
    D.20045 = bitmap;
    return D.20045;
  }
  <D.19825>:
  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.20067;
  unsigned int numbits.27;
  unsigned int D.20071;
  unsigned int D.20072;
  unsigned int D.20073;
  int D.20074;
  unsigned int D.20075;
  unsigned int D.20076;

  if (numbits == 0) goto <D.20065>; else goto <D.20066>;
  <D.20065>:
  D.20067 = 1B;
  return D.20067;
  <D.20066>:
  numbits.27 = (unsigned int) numbits;
  if (numbits.27 <= 28) goto <D.20069>; else goto <D.20070>;
  <D.20069>:
  D.20071 = *bitmap;
  D.20072 = D.20071 << 3;
  D.20073 = D.20072 | 1;
  D.20067 = (void *) D.20073;
  return D.20067;
  <D.20070>:
  {
    mword complex;

    D.20074 = alloc_complex_descriptor (bitmap, numbits);
    complex = (mword) D.20074;
    D.20075 = complex << 3;
    D.20076 = D.20075 | 3;
    D.20067 = (void *) D.20076;
    return D.20067;
  }
}


mono_gc_make_root_descr_all_refs (int numbits)
{
  void * D.20080;
  void * D.20083;
  unsigned int numbits.28;
  unsigned int D.20085;
  unsigned int D.20086;
  unsigned int D.20087;
  unsigned int num_bytes.29;
  unsigned int numbits.30;
  unsigned int D.20092;
  unsigned int num_bytes.31;
  unsigned int D.20097;
  int D.20100;
  unsigned int D.20101;
  unsigned int D.20102;
  gsize * D.20103;
  unsigned int D.20104;
  unsigned int numbits.32;
  unsigned int D.20106;
  int D.20109;
  unsigned int D.20110;
  unsigned int D.20111;
  gsize * D.20112;
  int D.20113;
  int D.20114;
  int D.20115;
  unsigned int D.20116;
  gsize * gc_bitmap;
  void * descr;
  int num_bytes;

  num_bytes = numbits / 8;
  if (numbits <= 31) goto <D.20078>; else goto <D.20079>;
  <D.20078>:
  D.20080 = all_ref_root_descrs[numbits];
  if (D.20080 != 0B) goto <D.20081>; else goto <D.20082>;
  <D.20081>:
  D.20083 = all_ref_root_descrs[numbits];
  return D.20083;
  <D.20082>:
  <D.20079>:
  numbits.28 = (unsigned int) numbits;
  D.20085 = numbits.28 + 7;
  D.20086 = D.20085 & 4294967288;
  D.20087 = D.20086 + 4;
  gc_bitmap = monoeg_malloc0 (D.20087);
  num_bytes.29 = (unsigned int) num_bytes;
  memset (gc_bitmap, 255, num_bytes.29);
  numbits.30 = (unsigned int) numbits;
  if (numbits.30 <= 28) goto <D.20090>; else goto <D.20091>;
  <D.20090>:
  D.20092 = *gc_bitmap;
  *gc_bitmap = D.20092;
  goto <D.20093>;
  <D.20091>:
  if (numbits != 0) goto <D.20094>; else goto <D.20095>;
  <D.20094>:
  num_bytes.31 = (unsigned int) num_bytes;
  D.20097 = num_bytes.31 & 3;
  if (D.20097 != 0) goto <D.20098>; else goto <D.20099>;
  <D.20098>:
  D.20100 = num_bytes / 8;
  D.20101 = (unsigned int) D.20100;
  D.20102 = D.20101 * 4;
  D.20103 = gc_bitmap + D.20102;
  D.20100 = num_bytes / 8;
  D.20101 = (unsigned int) D.20100;
  D.20102 = D.20101 * 4;
  D.20103 = gc_bitmap + D.20102;
  D.20104 = *D.20103;
  *D.20103 = D.20104;
  <D.20099>:
  <D.20095>:
  <D.20093>:
  numbits.32 = (unsigned int) numbits;
  D.20106 = numbits.32 & 7;
  if (D.20106 != 0) goto <D.20107>; else goto <D.20108>;
  <D.20107>:
  D.20109 = numbits / 8;
  D.20110 = (unsigned int) D.20109;
  D.20111 = D.20110 * 4;
  D.20112 = gc_bitmap + D.20111;
  D.20113 = numbits % 8;
  D.20114 = 1 << D.20113;
  D.20115 = D.20114 + -1;
  D.20116 = (unsigned int) D.20115;
  *D.20112 = D.20116;
  <D.20108>:
  descr = mono_gc_make_descr_from_bitmap (gc_bitmap, numbits);
  monoeg_g_free (gc_bitmap);
  if (numbits <= 31) goto <D.20117>; else goto <D.20118>;
  <D.20117>:
  all_ref_root_descrs[numbits] = descr;
  <D.20118>:
  D.20083 = descr;
  return D.20083;
}


memset (void * __dest, int __ch, size_t __len)
{
  int D.20122;
  int D.20127;
  void * D.20129;
  unsigned int D.20130;

  D.20122 = __builtin_constant_p (__len);
  if (D.20122 != 0) goto <D.20123>; else goto <D.20124>;
  <D.20123>:
  if (__len == 0) goto <D.20125>; else goto <D.20126>;
  <D.20125>:
  D.20127 = __builtin_constant_p (__ch);
  if (D.20127 == 0) goto <D.20120>; else goto <D.20128>;
  <D.20128>:
  if (__ch != 0) goto <D.20120>; else goto <D.20121>;
  <D.20120>:
  __warn_memset_zero_len ();
  D.20129 = __dest;
  return D.20129;
  <D.20121>:
  <D.20126>:
  <D.20124>:
  D.20130 = __builtin_object_size (__dest, 0);
  D.20129 = __builtin___memset_chk (__dest, __ch, __len, D.20130);
  return D.20129;
}


mono_gc_make_root_descr_user (void (*MonoGCRootMarkFunc) (void *, void (*MonoGCMarkFunc) (void * *)) marker)
{
  int user_descriptors_next.33;
  _Bool D.20133;
  long int D.20134;
  long int D.20135;
  unsigned int user_descriptors_next.34;
  unsigned int D.20139;
  unsigned int D.20140;
  int user_descriptors_next.35;
  int user_descriptors_next.36;
  void * D.20143;
  void * descr;

  user_descriptors_next.33 = user_descriptors_next;
  D.20133 = user_descriptors_next.33 > 15;
  D.20134 = (long int) D.20133;
  D.20135 = __builtin_expect (D.20134, 0);
  if (D.20135 != 0) goto <D.20136>; else goto <D.20137>;
  <D.20136>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-descriptor.c", 332, "user_descriptors_next < MAX_USER_DESCRIPTORS");
  <D.20137>:
  user_descriptors_next.33 = user_descriptors_next;
  user_descriptors_next.34 = (unsigned int) user_descriptors_next.33;
  D.20139 = user_descriptors_next.34 << 3;
  D.20140 = D.20139 | 4;
  descr = (void *) D.20140;
  user_descriptors_next.33 = user_descriptors_next;
  user_descriptors_next.35 = user_descriptors_next.33;
  user_descriptors_next.36 = user_descriptors_next.35 + 1;
  user_descriptors_next = user_descriptors_next.36;
  user_descriptors[user_descriptors_next.35] = marker;
  D.20143 = descr;
  return D.20143;
}


sgen_get_complex_descriptor_bitmap (mword desc)
{
  void * D.20145;
  gsize * complex_descriptors.37;
  unsigned int D.20147;
  unsigned int D.20148;

  complex_descriptors.37 = complex_descriptors;
  D.20147 = desc >> 3;
  D.20148 = D.20147 * 4;
  D.20145 = complex_descriptors.37 + D.20148;
  return D.20145;
}


sgen_get_user_descriptor_func (mword desc)
{
  void (*MonoGCRootMarkFunc) (void *, void (*MonoGCMarkFunc) (void * *)) D.20150;
  unsigned int D.20151;

  D.20151 = desc >> 3;
  D.20150 = user_descriptors[D.20151];
  return D.20150;
}


