sgen_get_complex_descriptor (mword desc)
{
  gsize * D.18178;
  gsize * complex_descriptors.0;
  long unsigned int D.18180;
  long unsigned int D.18181;

  complex_descriptors.0 = complex_descriptors;
  D.18180 = desc >> 3;
  D.18181 = D.18180 * 8;
  D.18178 = complex_descriptors.0 + D.18181;
  return D.18178;
}


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

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


mono_gc_make_descr_for_object (gsize * bitmap, int numbits, size_t obj_size)
{
  long unsigned int D.18185;
  long unsigned int D.18186;
  long unsigned int D.18187;
  gsize * D.18188;
  long unsigned int D.18189;
  int D.18190;
  long unsigned int D.18191;
  long unsigned int D.18192;
  struct FILE * gc_debug_file.1;
  void * desc.2;
  void * D.18205;
  long unsigned int D.18206;
  long unsigned int D.18207;
  _Bool D.18208;
  long int D.18209;
  long int D.18210;
  int D.18219;
  int D.18220;
  int D.18223;
  long unsigned int D.18224;
  long unsigned int D.18225;
  int D.18226;
  long unsigned int D.18227;
  long unsigned int D.18228;
  unsigned int last_set.3;
  long unsigned int D.18236;
  long unsigned int D.18237;
  long unsigned int D.18238;
  long unsigned int D.18239;
  long unsigned int D.18244;
  int D.18247;
  int D.18248;
  int D.18249;
  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.18113>;
  <D.18112>:
  D.18185 = (long unsigned int) i;
  D.18186 = D.18185 / 64;
  D.18187 = D.18186 * 8;
  D.18188 = bitmap + D.18187;
  D.18189 = *D.18188;
  D.18190 = i & 63;
  D.18191 = D.18189 >> D.18190;
  D.18192 = D.18191 & 1;
  if (D.18192 != 0) goto <D.18193>; else goto <D.18194>;
  <D.18193>:
  if (first_set < 0) goto <D.18195>; else goto <D.18196>;
  <D.18195>:
  first_set = i;
  <D.18196>:
  last_set = i;
  num_set = num_set + 1;
  <D.18194>:
  i = i + 1;
  <D.18113>:
  if (i < numbits) goto <D.18112>; else goto <D.18114>;
  <D.18114>:
  if (first_set < 0) goto <D.18197>; else goto <D.18198>;
  <D.18197>:
  if (0 != 0) goto <D.18199>; else goto <D.18200>;
  <D.18199>:
  gc_debug_file.1 = gc_debug_file;
  desc.2 = (void *) desc;
  fprintf (gc_debug_file.1, "Ptrfree descriptor %p, size: %zd\n", desc.2, stored_size);
  gc_debug_file.1 = gc_debug_file;
  fflush (gc_debug_file.1);
  <D.18200>:
  if (stored_size <= 65535) goto <D.18203>; else goto <D.18204>;
  <D.18203>:
  D.18206 = stored_size | 1;
  D.18205 = (void *) D.18206;
  return D.18205;
  <D.18204>:
  D.18205 = 7B;
  return D.18205;
  <D.18198>:
  D.18207 = stored_size & 7;
  D.18208 = D.18207 != 0;
  D.18209 = (long int) D.18208;
  D.18210 = __builtin_expect (D.18209, 0);
  if (D.18210 != 0) goto <D.18211>; else goto <D.18212>;
  <D.18211>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-descriptor.c", 149, "!(stored_size & 0x7)");
  <D.18212>:
  if (stored_size <= 65535) goto <D.18213>; else goto <D.18214>;
  <D.18213>:
  if (first_set <= 255) goto <D.18215>; else goto <D.18216>;
  <D.18215>:
  if (num_set <= 255) goto <D.18217>; else goto <D.18218>;
  <D.18217>:
  D.18219 = first_set + num_set;
  D.18220 = last_set + 1;
  if (D.18219 == D.18220) goto <D.18221>; else goto <D.18222>;
  <D.18221>:
  D.18223 = first_set << 16;
  D.18224 = (long unsigned int) D.18223;
  D.18225 = D.18224 | stored_size;
  D.18226 = num_set << 24;
  D.18227 = (long unsigned int) D.18226;
  D.18228 = D.18225 | D.18227;
  desc = D.18228 | 1;
  if (0 != 0) goto <D.18229>; else goto <D.18230>;
  <D.18229>:
  gc_debug_file.1 = gc_debug_file;
  desc.2 = (void *) desc;
  fprintf (gc_debug_file.1, "Runlen descriptor %p, size: %zd, first set: %d, num set: %d\n", desc.2, stored_size, first_set, num_set);
  gc_debug_file.1 = gc_debug_file;
  fflush (gc_debug_file.1);
  <D.18230>:
  D.18205 = (void *) desc;
  return D.18205;
  <D.18222>:
  <D.18218>:
  <D.18216>:
  <D.18214>:
  last_set.3 = (unsigned int) last_set;
  if (last_set.3 <= 49) goto <D.18232>; else goto <D.18233>;
  <D.18232>:
  if (stored_size <= 65535) goto <D.18234>; else goto <D.18235>;
  <D.18234>:
  D.18236 = *bitmap;
  D.18237 = D.18236 >> 2;
  D.18238 = D.18237 << 16;
  D.18239 = D.18238 | stored_size;
  desc = D.18239 | 2;
  if (0 != 0) goto <D.18240>; else goto <D.18241>;
  <D.18240>:
  gc_debug_file.1 = gc_debug_file;
  desc.2 = (void *) desc;
  fprintf (gc_debug_file.1, "Smallbitmap descriptor %p, size: %zd, last set: %d\n", desc.2, stored_size, last_set);
  gc_debug_file.1 = gc_debug_file;
  fflush (gc_debug_file.1);
  <D.18241>:
  D.18205 = (void *) desc;
  return D.18205;
  <D.18235>:
  <D.18233>:
  last_set.3 = (unsigned int) last_set;
  if (last_set.3 <= 62) goto <D.18242>; else goto <D.18243>;
  <D.18242>:
  D.18236 = *bitmap;
  D.18237 = D.18236 >> 2;
  D.18244 = D.18237 << 3;
  desc = D.18244 | 5;
  if (0 != 0) goto <D.18245>; else goto <D.18246>;
  <D.18245>:
  gc_debug_file.1 = gc_debug_file;
  desc.2 = (void *) desc;
  fprintf (gc_debug_file.1, "Largebitmap descriptor %p, size: %zd, last set: %d\n", desc.2, stored_size, last_set);
  gc_debug_file.1 = gc_debug_file;
  fflush (gc_debug_file.1);
  <D.18246>:
  D.18205 = (void *) desc;
  return D.18205;
  <D.18243>:
  D.18220 = last_set + 1;
  D.18247 = alloc_complex_descriptor (bitmap, D.18220);
  D.18248 = D.18247 << 3;
  D.18249 = D.18248 | 3;
  desc = (mword) D.18249;
  D.18205 = (void *) desc;
  return D.18205;
}


alloc_complex_descriptor (gsize * bitmap, int numbits)
{
  unsigned int numbits.4;
  unsigned int D.18252;
  int D.18253;
  long unsigned int D.18254;
  long unsigned int D.18255;
  unsigned int D.18256;
  unsigned int D.18257;
  gsize * complex_descriptors.5;
  long unsigned int D.18259;
  long unsigned int D.18260;
  gsize * D.18261;
  long unsigned int D.18262;
  long unsigned int D.18263;
  int D.18266;
  int D.18267;
  long unsigned int D.18268;
  long unsigned int D.18269;
  gsize * D.18270;
  long unsigned int D.18271;
  long unsigned int D.18272;
  long unsigned int D.18273;
  gsize * D.18274;
  long unsigned int D.18275;
  int D.18278;
  int D.18281;
  unsigned int D.18282;
  unsigned int i.6;
  unsigned int D.18284;
  int complex_descriptors_next.7;
  int complex_descriptors_next.11;
  int complex_descriptors_size.8;
  int D.18290;
  long unsigned int D.18291;
  long unsigned int D.18292;
  void * complex_descriptors.9;
  struct FILE * gc_debug_file.10;
  long unsigned int D.18297;
  long unsigned int D.18298;
  gsize * D.18299;
  int D.18300;
  int D.18301;
  long unsigned int D.18302;
  long unsigned int D.18303;
  gsize * D.18304;
  gsize * D.18305;
  long unsigned int D.18306;
  long unsigned int D.18309;
  void * D.18310;
  int nwords;
  int res;
  int i;

  numbits.4 = (unsigned int) numbits;
  D.18252 = numbits.4 + 63;
  D.18253 = (int) D.18252;
  numbits = D.18253 & -64;
  D.18254 = (long unsigned int) numbits;
  D.18255 = D.18254 / 64;
  D.18256 = (unsigned int) D.18255;
  D.18257 = D.18256 + 1;
  nwords = (int) D.18257;
  sgen_gc_lock ();
  res = complex_descriptors_next;
  i = 0;
  goto <D.18088>;
  <D.18087>:
  complex_descriptors.5 = complex_descriptors;
  D.18259 = (long unsigned int) i;
  D.18260 = D.18259 * 8;
  D.18261 = complex_descriptors.5 + D.18260;
  D.18262 = *D.18261;
  D.18263 = (long unsigned int) nwords;
  if (D.18262 == D.18263) goto <D.18264>; else goto <D.18265>;
  <D.18264>:
  {
    int j;
    int found;

    found = 1;
    j = 0;
    goto <D.18086>;
    <D.18085>:
    complex_descriptors.5 = complex_descriptors;
    D.18266 = i + 1;
    D.18267 = D.18266 + j;
    D.18268 = (long unsigned int) D.18267;
    D.18269 = D.18268 * 8;
    D.18270 = complex_descriptors.5 + D.18269;
    D.18271 = *D.18270;
    D.18272 = (long unsigned int) j;
    D.18273 = D.18272 * 8;
    D.18274 = bitmap + D.18273;
    D.18275 = *D.18274;
    if (D.18271 != D.18275) goto <D.18276>; else goto <D.18277>;
    <D.18276>:
    found = 0;
    goto <D.18084>;
    <D.18277>:
    j = j + 1;
    <D.18086>:
    D.18278 = nwords + -1;
    if (D.18278 > j) goto <D.18085>; else goto <D.18084>;
    <D.18084>:
    if (found != 0) goto <D.18279>; else goto <D.18280>;
    <D.18279>:
    sgen_gc_unlock ();
    D.18281 = i;
    return D.18281;
    <D.18280>:
  }
  <D.18265>:
  complex_descriptors.5 = complex_descriptors;
  D.18259 = (long unsigned int) i;
  D.18260 = D.18259 * 8;
  D.18261 = complex_descriptors.5 + D.18260;
  D.18262 = *D.18261;
  D.18282 = (unsigned int) D.18262;
  i.6 = (unsigned int) i;
  D.18284 = D.18282 + i.6;
  i = (int) D.18284;
  <D.18088>:
  complex_descriptors_next.7 = complex_descriptors_next;
  if (i < complex_descriptors_next.7) goto <D.18087>; else goto <D.18089>;
  <D.18089>:
  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.18288>; else goto <D.18289>;
  <D.18288>:
  {
    int new_size;

    complex_descriptors_size.8 = complex_descriptors_size;
    D.18290 = complex_descriptors_size.8 * 2;
    new_size = D.18290 + nwords;
    complex_descriptors.5 = complex_descriptors;
    D.18291 = (long unsigned int) new_size;
    D.18292 = D.18291 * 8;
    complex_descriptors.9 = monoeg_realloc (complex_descriptors.5, D.18292);
    complex_descriptors = complex_descriptors.9;
    complex_descriptors_size = new_size;
  }
  <D.18289>:
  if (0 != 0) goto <D.18294>; else goto <D.18295>;
  <D.18294>:
  gc_debug_file.10 = gc_debug_file;
  complex_descriptors_size.8 = complex_descriptors_size;
  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.18295>:
  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.18297 = (long unsigned int) res;
  D.18298 = D.18297 * 8;
  D.18299 = complex_descriptors.5 + D.18298;
  D.18263 = (long unsigned int) nwords;
  *D.18299 = D.18263;
  i = 0;
  goto <D.18092>;
  <D.18091>:
  complex_descriptors.5 = complex_descriptors;
  D.18300 = res + 1;
  D.18301 = D.18300 + i;
  D.18302 = (long unsigned int) D.18301;
  D.18303 = D.18302 * 8;
  D.18304 = complex_descriptors.5 + D.18303;
  D.18259 = (long unsigned int) i;
  D.18260 = D.18259 * 8;
  D.18305 = bitmap + D.18260;
  D.18306 = *D.18305;
  *D.18304 = D.18306;
  if (0 != 0) goto <D.18307>; else goto <D.18308>;
  <D.18307>:
  gc_debug_file.10 = gc_debug_file;
  complex_descriptors.5 = complex_descriptors;
  D.18300 = res + 1;
  D.18301 = D.18300 + i;
  D.18302 = (long unsigned int) D.18301;
  D.18303 = D.18302 * 8;
  D.18304 = complex_descriptors.5 + D.18303;
  D.18309 = *D.18304;
  D.18310 = (void *) D.18309;
  fprintf (gc_debug_file.10, "\tvalue: %p\n", D.18310);
  gc_debug_file.10 = gc_debug_file;
  fflush (gc_debug_file.10);
  <D.18308>:
  i = i + 1;
  <D.18092>:
  D.18278 = nwords + -1;
  if (D.18278 > i) goto <D.18091>; else goto <D.18093>;
  <D.18093>:
  sgen_gc_unlock ();
  D.18281 = res;
  return D.18281;
}


mono_gc_make_descr_for_array (int vector, gsize * elem_bitmap, int numbits, size_t elem_size)
{
  mword iftmp.12;
  long unsigned int D.18316;
  long unsigned int D.18317;
  long unsigned int D.18318;
  gsize * D.18319;
  long unsigned int D.18320;
  int D.18321;
  long unsigned int D.18322;
  long unsigned int D.18323;
  void * D.18332;
  long unsigned int D.18333;
  long unsigned int D.18334;
  long unsigned int D.18339;
  long unsigned int D.18340;
  long unsigned int D.18343;
  unsigned int last_set.13;
  long unsigned int D.18347;
  long unsigned int D.18348;
  long unsigned int D.18349;
  long unsigned int D.18350;
  int D.18351;
  int D.18352;
  int D.18353;
  long unsigned int D.18354;
  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.18313>; else goto <D.18314>;
  <D.18313>:
  iftmp.12 = 4;
  goto <D.18315>;
  <D.18314>:
  iftmp.12 = 8196;
  <D.18315>:
  desc = iftmp.12;
  i = 0;
  goto <D.18127>;
  <D.18126>:
  D.18316 = (long unsigned int) i;
  D.18317 = D.18316 / 64;
  D.18318 = D.18317 * 8;
  D.18319 = elem_bitmap + D.18318;
  D.18320 = *D.18319;
  D.18321 = i & 63;
  D.18322 = D.18320 >> D.18321;
  D.18323 = D.18322 & 1;
  if (D.18323 != 0) goto <D.18324>; else goto <D.18325>;
  <D.18324>:
  if (first_set < 0) goto <D.18326>; else goto <D.18327>;
  <D.18326>:
  first_set = i;
  <D.18327>:
  last_set = i;
  num_set = num_set + 1;
  <D.18325>:
  i = i + 1;
  <D.18127>:
  if (i < numbits) goto <D.18126>; else goto <D.18128>;
  <D.18128>:
  if (first_set < 0) goto <D.18328>; else goto <D.18329>;
  <D.18328>:
  if (elem_size <= 1023) goto <D.18330>; else goto <D.18331>;
  <D.18330>:
  D.18333 = elem_size << 3;
  D.18334 = D.18333 | desc;
  D.18332 = (void *) D.18334;
  return D.18332;
  <D.18331>:
  D.18332 = 7B;
  return D.18332;
  <D.18329>:
  if (elem_size <= 1023) goto <D.18335>; else goto <D.18336>;
  <D.18335>:
  D.18333 = elem_size << 3;
  desc = D.18333 | desc;
  if (num_set == 0) goto <D.18337>; else goto <D.18338>;
  <D.18337>:
  D.18332 = (void *) desc;
  return D.18332;
  <D.18338>:
  D.18339 = (long unsigned int) num_set;
  D.18340 = D.18339 * 8;
  if (D.18340 == elem_size) goto <D.18341>; else goto <D.18342>;
  <D.18341>:
  D.18343 = desc | 18446744073709502464;
  D.18332 = (void *) D.18343;
  return D.18332;
  <D.18342>:
  last_set.13 = (unsigned int) last_set;
  if (last_set.13 <= 47) goto <D.18345>; else goto <D.18346>;
  <D.18345>:
  D.18347 = *elem_bitmap;
  D.18348 = D.18347 << 16;
  D.18349 = D.18348 | desc;
  D.18350 = D.18349 | 49152;
  D.18332 = (void *) D.18350;
  return D.18332;
  <D.18346>:
  <D.18336>:
  desc = 6;
  D.18351 = last_set + 1;
  D.18352 = alloc_complex_descriptor (elem_bitmap, D.18351);
  D.18353 = D.18352 << 3;
  D.18354 = (long unsigned int) D.18353;
  desc = D.18354 | desc;
  D.18332 = (void *) desc;
  return D.18332;
}


mono_gc_get_bitmap_for_descr (void * descr, int * numbits)
{
  long unsigned int D.18356;
  long unsigned int D.18357;
  int D.18358;
  long unsigned int D.18359;
  int D.18360;
  int D.18361;
  int D.18362;
  int D.18363;
  long unsigned int D.18364;
  long unsigned int D.18365;
  long unsigned int D.18366;
  long unsigned int D.18367;
  long unsigned int D.18368;
  gsize * D.18369;
  long unsigned int D.18370;
  int D.18371;
  long unsigned int D.18372;
  long unsigned int D.18373;
  gsize * D.18374;
  long unsigned int D.18375;
  long unsigned int D.18376;
  int D.18377;
  int D.18378;
  long unsigned int D.18379;
  unsigned int D.18380;
  unsigned int D.18381;
  long unsigned int D.18382;
  long unsigned int D.18383;
  unsigned int bwords.14;
  unsigned int D.18385;
  int D.18386;
  long unsigned int D.18387;
  long unsigned int D.18388;
  gsize * D.18389;
  sizetype D.18390;
  sizetype D.18391;
  sizetype D.18392;
  gsize * D.18393;
  long unsigned int D.18394;
  mword d;
  gsize * bitmap;

  d = (mword) descr;
  D.18356 = d & 7;
  switch (D.18356) <default: <D.18155>, case 1: <D.18135>, case 2: <D.18142>, case 3: <D.18148>, case 5: <D.18143>>
  <D.18135>:
  {
    int first_set;
    int num_set;
    int i;

    D.18357 = d >> 16;
    D.18358 = (int) D.18357;
    first_set = D.18358 & 255;
    D.18359 = d >> 24;
    D.18360 = (int) D.18359;
    num_set = D.18360 & 255;
    D.18361 = first_set + num_set;
    D.18362 = D.18361 + 7;
    D.18363 = D.18362 / 8;
    D.18364 = (long unsigned int) D.18363;
    D.18365 = D.18364 * 8;
    bitmap = monoeg_malloc0 (D.18365);
    i = first_set;
    goto <D.18140>;
    <D.18139>:
    D.18366 = (long unsigned int) i;
    D.18367 = D.18366 / 64;
    D.18368 = D.18367 * 8;
    D.18369 = bitmap + D.18368;
    D.18368 = D.18367 * 8;
    D.18369 = bitmap + D.18368;
    D.18370 = *D.18369;
    D.18371 = i & 63;
    D.18372 = 1 << D.18371;
    D.18373 = D.18370 | D.18372;
    *D.18369 = D.18373;
    i = i + 1;
    <D.18140>:
    D.18361 = first_set + num_set;
    if (D.18361 > i) goto <D.18139>; else goto <D.18141>;
    <D.18141>:
    D.18361 = first_set + num_set;
    *numbits = D.18361;
    D.18374 = bitmap;
    return D.18374;
  }
  <D.18142>:
  bitmap = monoeg_malloc0 (8);
  D.18357 = d >> 16;
  D.18375 = D.18357 << 2;
  *bitmap = D.18375;
  *numbits = 64;
  D.18374 = bitmap;
  return D.18374;
  <D.18143>:
  {
    gsize bmap;

    D.18376 = d >> 3;
    bmap = D.18376 << 2;
    bitmap = monoeg_malloc0 (8);
    *bitmap = bmap;
    *numbits = 0;
    goto <D.18146>;
    <D.18145>:
    D.18377 = *numbits;
    D.18378 = D.18377 + 1;
    *numbits = D.18378;
    bmap = bmap >> 1;
    <D.18146>:
    if (bmap != 0) goto <D.18145>; else goto <D.18147>;
    <D.18147>:
    D.18374 = bitmap;
    return D.18374;
  }
  <D.18148>:
  {
    gsize * bitmap_data;
    int bwords;
    int i;

    bitmap_data = sgen_get_complex_descriptor (d);
    D.18379 = *bitmap_data;
    D.18380 = (unsigned int) D.18379;
    D.18381 = D.18380 + 4294967295;
    bwords = (int) D.18381;
    D.18382 = (long unsigned int) bwords;
    D.18383 = D.18382 * 8;
    bitmap = monoeg_malloc0 (D.18383);
    bwords.14 = (unsigned int) bwords;
    D.18385 = bwords.14 * 64;
    D.18386 = (int) D.18385;
    *numbits = D.18386;
    i = 0;
    goto <D.18153>;
    <D.18152>:
    D.18387 = (long unsigned int) i;
    D.18388 = D.18387 * 8;
    D.18389 = bitmap + D.18388;
    D.18390 = (sizetype) i;
    D.18391 = D.18390 + 1;
    D.18392 = D.18391 * 8;
    D.18393 = bitmap_data + D.18392;
    D.18394 = *D.18393;
    *D.18389 = D.18394;
    i = i + 1;
    <D.18153>:
    if (i < bwords) goto <D.18152>; else goto <D.18154>;
    <D.18154>:
    D.18374 = bitmap;
    return D.18374;
  }
  <D.18155>:
  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.18398;
  unsigned int numbits.15;
  long unsigned int D.18402;
  long unsigned int D.18403;
  long unsigned int D.18404;
  int D.18405;
  long unsigned int D.18406;
  long unsigned int D.18407;

  if (numbits == 0) goto <D.18396>; else goto <D.18397>;
  <D.18396>:
  D.18398 = 1B;
  return D.18398;
  <D.18397>:
  numbits.15 = (unsigned int) numbits;
  if (numbits.15 <= 60) goto <D.18400>; else goto <D.18401>;
  <D.18400>:
  D.18402 = *bitmap;
  D.18403 = D.18402 << 3;
  D.18404 = D.18403 | 1;
  D.18398 = (void *) D.18404;
  return D.18398;
  <D.18401>:
  {
    mword complex;

    D.18405 = alloc_complex_descriptor (bitmap, numbits);
    complex = (mword) D.18405;
    D.18406 = complex << 3;
    D.18407 = D.18406 | 3;
    D.18398 = (void *) D.18407;
    return D.18398;
  }
}


mono_gc_make_root_descr_all_refs (int numbits)
{
  void * D.18411;
  void * D.18414;
  long unsigned int D.18415;
  long unsigned int D.18416;
  long unsigned int D.18417;
  long unsigned int D.18418;
  long unsigned int D.18419;
  unsigned int numbits.16;
  long unsigned int D.18423;
  long unsigned int D.18427;
  long unsigned int D.18428;
  int D.18431;
  long unsigned int D.18432;
  long unsigned int D.18433;
  gsize * D.18434;
  long unsigned int D.18435;
  unsigned int numbits.17;
  unsigned int D.18437;
  int D.18440;
  long unsigned int D.18441;
  long unsigned int D.18442;
  gsize * D.18443;
  int D.18444;
  int D.18445;
  int D.18446;
  long unsigned int D.18447;
  gsize * gc_bitmap;
  void * descr;
  int num_bytes;

  num_bytes = numbits / 8;
  if (numbits <= 31) goto <D.18409>; else goto <D.18410>;
  <D.18409>:
  D.18411 = all_ref_root_descrs[numbits];
  if (D.18411 != 0B) goto <D.18412>; else goto <D.18413>;
  <D.18412>:
  D.18414 = all_ref_root_descrs[numbits];
  return D.18414;
  <D.18413>:
  <D.18410>:
  D.18415 = (long unsigned int) numbits;
  D.18416 = D.18415 + 7;
  D.18417 = D.18416 & 18446744073709551608;
  D.18418 = D.18417 + 8;
  gc_bitmap = monoeg_malloc0 (D.18418);
  D.18419 = (long unsigned int) num_bytes;
  memset (gc_bitmap, 255, D.18419);
  numbits.16 = (unsigned int) numbits;
  if (numbits.16 <= 60) goto <D.18421>; else goto <D.18422>;
  <D.18421>:
  D.18423 = *gc_bitmap;
  *gc_bitmap = D.18423;
  goto <D.18424>;
  <D.18422>:
  if (numbits != 0) goto <D.18425>; else goto <D.18426>;
  <D.18425>:
  D.18427 = (long unsigned int) num_bytes;
  D.18428 = D.18427 & 7;
  if (D.18428 != 0) goto <D.18429>; else goto <D.18430>;
  <D.18429>:
  D.18431 = num_bytes / 8;
  D.18432 = (long unsigned int) D.18431;
  D.18433 = D.18432 * 8;
  D.18434 = gc_bitmap + D.18433;
  D.18431 = num_bytes / 8;
  D.18432 = (long unsigned int) D.18431;
  D.18433 = D.18432 * 8;
  D.18434 = gc_bitmap + D.18433;
  D.18435 = *D.18434;
  *D.18434 = D.18435;
  <D.18430>:
  <D.18426>:
  <D.18424>:
  numbits.17 = (unsigned int) numbits;
  D.18437 = numbits.17 & 7;
  if (D.18437 != 0) goto <D.18438>; else goto <D.18439>;
  <D.18438>:
  D.18440 = numbits / 8;
  D.18441 = (long unsigned int) D.18440;
  D.18442 = D.18441 * 8;
  D.18443 = gc_bitmap + D.18442;
  D.18444 = numbits % 8;
  D.18445 = 1 << D.18444;
  D.18446 = D.18445 + -1;
  D.18447 = (long unsigned int) D.18446;
  *D.18443 = D.18447;
  <D.18439>:
  descr = mono_gc_make_descr_from_bitmap (gc_bitmap, numbits);
  monoeg_g_free (gc_bitmap);
  if (numbits <= 31) goto <D.18448>; else goto <D.18449>;
  <D.18448>:
  all_ref_root_descrs[numbits] = descr;
  <D.18449>:
  D.18414 = descr;
  return D.18414;
}


memset (void * __dest, int __ch, size_t __len)
{
  int D.18453;
  int D.18458;
  void * D.18460;
  long unsigned int D.18461;

  D.18453 = __builtin_constant_p (__len);
  if (D.18453 != 0) goto <D.18454>; else goto <D.18455>;
  <D.18454>:
  if (__len == 0) goto <D.18456>; else goto <D.18457>;
  <D.18456>:
  D.18458 = __builtin_constant_p (__ch);
  if (D.18458 == 0) goto <D.18451>; else goto <D.18459>;
  <D.18459>:
  if (__ch != 0) goto <D.18451>; else goto <D.18452>;
  <D.18451>:
  __warn_memset_zero_len ();
  D.18460 = __dest;
  return D.18460;
  <D.18452>:
  <D.18457>:
  <D.18455>:
  D.18461 = __builtin_object_size (__dest, 0);
  D.18460 = __builtin___memset_chk (__dest, __ch, __len, D.18461);
  return D.18460;
}


mono_gc_make_root_descr_user (void (*MonoGCRootMarkFunc) (void *, void (*MonoGCMarkFunc) (void * *)) marker)
{
  int user_descriptors_next.18;
  _Bool D.18464;
  long int D.18465;
  long int D.18466;
  long unsigned int D.18469;
  long unsigned int D.18470;
  long unsigned int D.18471;
  int user_descriptors_next.19;
  int user_descriptors_next.20;
  void * D.18474;
  void * descr;

  user_descriptors_next.18 = user_descriptors_next;
  D.18464 = user_descriptors_next.18 > 15;
  D.18465 = (long int) D.18464;
  D.18466 = __builtin_expect (D.18465, 0);
  if (D.18466 != 0) goto <D.18467>; else goto <D.18468>;
  <D.18467>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-descriptor.c", 332, "user_descriptors_next < MAX_USER_DESCRIPTORS");
  <D.18468>:
  user_descriptors_next.18 = user_descriptors_next;
  D.18469 = (long unsigned int) user_descriptors_next.18;
  D.18470 = D.18469 << 3;
  D.18471 = D.18470 | 4;
  descr = (void *) D.18471;
  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.18474 = descr;
  return D.18474;
}


sgen_get_complex_descriptor_bitmap (mword desc)
{
  void * D.18476;
  gsize * complex_descriptors.21;
  long unsigned int D.18478;
  long unsigned int D.18479;

  complex_descriptors.21 = complex_descriptors;
  D.18478 = desc >> 3;
  D.18479 = D.18478 * 8;
  D.18476 = complex_descriptors.21 + D.18479;
  return D.18476;
}


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

  D.18482 = desc >> 3;
  D.18481 = user_descriptors[D.18482];
  return D.18481;
}


