mono_internal_hash_table_init (struct MonoInternalHashTable * table, guint (*GHashFunc) (const void *) hash_func, void * (*MonoInternalHashKeyExtractFunc) (void *) key_extract, void * * (*MonoInternalHashNextValueFunc) (void *) next_value)
{
  int D.4996;
  long unsigned int D.4997;
  long unsigned int D.4998;
  void * D.4999;

  table->hash_func = hash_func;
  table->key_extract = key_extract;
  table->next_value = next_value;
  table->size = 11;
  table->num_entries = 0;
  D.4996 = table->size;
  D.4997 = (long unsigned int) D.4996;
  D.4998 = D.4997 * 8;
  D.4999 = monoeg_malloc0 (D.4998);
  table->table = D.4999;
}


mono_internal_hash_table_destroy (struct MonoInternalHashTable * table)
{
  void * * D.5000;

  D.5000 = table->table;
  monoeg_g_free (D.5000);
  table->table = 0B;
}


mono_internal_hash_table_lookup (struct MonoInternalHashTable * table, void * key)
{
  void * * D.5001;
  _Bool D.5002;
  long int D.5003;
  long int D.5004;
  guint (*<Tc80>) (const void *) D.5007;
  unsigned int D.5008;
  int D.5009;
  unsigned int D.5010;
  unsigned int D.5011;
  long unsigned int D.5012;
  long unsigned int D.5013;
  void * * D.5014;
  void * (*<Te88>) (void *) D.5015;
  void * D.5016;
  void * D.5019;
  void * * (*<Te8d>) (void *) D.5020;
  void * * D.5021;
  void * value;

  D.5001 = table->table;
  D.5002 = D.5001 == 0B;
  D.5003 = (long int) D.5002;
  D.5004 = __builtin_expect (D.5003, 0);
  if (D.5004 != 0) goto <D.5005>; else goto <D.5006>;
  <D.5005>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "mono-internal-hash.c", 46, "table->table != NULL");
  <D.5006>:
  D.5001 = table->table;
  D.5007 = table->hash_func;
  D.5008 = D.5007 (key);
  D.5009 = table->size;
  D.5010 = (unsigned int) D.5009;
  D.5011 = D.5008 % D.5010;
  D.5012 = (long unsigned int) D.5011;
  D.5013 = D.5012 * 8;
  D.5014 = D.5001 + D.5013;
  value = *D.5014;
  goto <D.4964>;
  <D.4963>:
  D.5015 = table->key_extract;
  D.5016 = D.5015 (value);
  if (D.5016 == key) goto <D.5017>; else goto <D.5018>;
  <D.5017>:
  D.5019 = value;
  return D.5019;
  <D.5018>:
  D.5020 = table->next_value;
  D.5021 = D.5020 (value);
  value = *D.5021;
  <D.4964>:
  if (value != 0B) goto <D.4963>; else goto <D.4965>;
  <D.4965>:
  D.5019 = 0B;
  return D.5019;
}


mono_internal_hash_table_insert (struct MonoInternalHashTable * table, void * key, void * value)
{
  guint (*<Tc80>) (const void *) D.5023;
  unsigned int D.5024;
  int D.5025;
  unsigned int D.5026;
  unsigned int D.5027;
  void * (*<Te88>) (void *) D.5028;
  void * D.5029;
  _Bool D.5030;
  long int D.5031;
  long int D.5032;
  void * * (*<Te8d>) (void *) D.5035;
  void * * D.5036;
  void * D.5037;
  _Bool D.5038;
  long int D.5039;
  long int D.5040;
  void * D.5043;
  _Bool D.5044;
  long int D.5045;
  long int D.5046;
  void * * D.5049;
  void * * D.5050;
  long unsigned int D.5051;
  long unsigned int D.5052;
  void * * D.5053;
  void * D.5054;
  int D.5055;
  int D.5056;
  gint hash;

  D.5023 = table->hash_func;
  D.5024 = D.5023 (key);
  D.5025 = table->size;
  D.5026 = (unsigned int) D.5025;
  D.5027 = D.5024 % D.5026;
  hash = (gint) D.5027;
  D.5028 = table->key_extract;
  D.5029 = D.5028 (value);
  D.5030 = D.5029 != key;
  D.5031 = (long int) D.5030;
  D.5032 = __builtin_expect (D.5031, 0);
  if (D.5032 != 0) goto <D.5033>; else goto <D.5034>;
  <D.5033>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "mono-internal-hash.c", 96, "table->key_extract(value) == key");
  <D.5034>:
  D.5035 = table->next_value;
  D.5036 = D.5035 (value);
  D.5037 = *D.5036;
  D.5038 = D.5037 != 0B;
  D.5039 = (long int) D.5038;
  D.5040 = __builtin_expect (D.5039, 0);
  if (D.5040 != 0) goto <D.5041>; else goto <D.5042>;
  <D.5041>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "mono-internal-hash.c", 97, "*(table->next_value (value)) == NULL");
  <D.5042>:
  D.5043 = mono_internal_hash_table_lookup (table, key);
  D.5044 = D.5043 != 0B;
  D.5045 = (long int) D.5044;
  D.5046 = __builtin_expect (D.5045, 0);
  if (D.5046 != 0) goto <D.5047>; else goto <D.5048>;
  <D.5047>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "mono-internal-hash.c", 98, "mono_internal_hash_table_lookup (table, key) == NULL");
  <D.5048>:
  D.5035 = table->next_value;
  D.5049 = D.5035 (value);
  D.5050 = table->table;
  D.5051 = (long unsigned int) hash;
  D.5052 = D.5051 * 8;
  D.5053 = D.5050 + D.5052;
  D.5054 = *D.5053;
  *D.5049 = D.5054;
  D.5050 = table->table;
  D.5051 = (long unsigned int) hash;
  D.5052 = D.5051 * 8;
  D.5053 = D.5050 + D.5052;
  *D.5053 = value;
  D.5055 = table->num_entries;
  D.5056 = D.5055 + 1;
  table->num_entries = D.5056;
  resize_if_needed (table);
}


resize_if_needed (struct MonoInternalHashTable * table)
{
  int D.5057;
  int D.5058;
  int D.5059;
  unsigned int D.5062;
  unsigned int D.5063;
  long unsigned int D.5064;
  long unsigned int D.5065;
  void * * D.5066;
  long unsigned int D.5067;
  long unsigned int D.5068;
  void * * D.5069;
  void * * (*<Te8d>) (void *) D.5070;
  void * * D.5071;
  void * D.5072;
  guint (*<Tc80>) (const void *) D.5073;
  void * (*<Te88>) (void *) D.5074;
  void * D.5075;
  unsigned int D.5076;
  unsigned int new_size.0;
  unsigned int D.5078;
  void * * D.5079;
  long unsigned int D.5080;
  long unsigned int D.5081;
  void * * D.5082;
  void * D.5083;
  void * D.5084;
  void * * new_table;
  gint new_size;
  gint i;

  D.5057 = table->num_entries;
  D.5058 = table->size;
  D.5059 = D.5058 * 3;
  if (D.5057 < D.5059) goto <D.5060>; else goto <D.5061>;
  <D.5060>:
  return;
  <D.5061>:
  D.5057 = table->num_entries;
  D.5062 = (unsigned int) D.5057;
  D.5063 = monoeg_g_spaced_primes_closest (D.5062);
  new_size = (gint) D.5063;
  D.5064 = (long unsigned int) new_size;
  D.5065 = D.5064 * 8;
  new_table = monoeg_malloc0 (D.5065);
  i = 0;
  goto <D.4978>;
  <D.4977>:
  goto <D.4975>;
  <D.4974>:
  {
    void * value;
    gint hash;

    D.5066 = table->table;
    D.5067 = (long unsigned int) i;
    D.5068 = D.5067 * 8;
    D.5069 = D.5066 + D.5068;
    value = *D.5069;
    D.5066 = table->table;
    D.5067 = (long unsigned int) i;
    D.5068 = D.5067 * 8;
    D.5069 = D.5066 + D.5068;
    D.5070 = table->next_value;
    D.5071 = D.5070 (value);
    D.5072 = *D.5071;
    *D.5069 = D.5072;
    D.5073 = table->hash_func;
    D.5074 = table->key_extract;
    D.5075 = D.5074 (value);
    D.5076 = D.5073 (D.5075);
    new_size.0 = (unsigned int) new_size;
    D.5078 = D.5076 % new_size.0;
    hash = (gint) D.5078;
    D.5070 = table->next_value;
    D.5079 = D.5070 (value);
    D.5080 = (long unsigned int) hash;
    D.5081 = D.5080 * 8;
    D.5082 = new_table + D.5081;
    D.5083 = *D.5082;
    *D.5079 = D.5083;
    D.5080 = (long unsigned int) hash;
    D.5081 = D.5080 * 8;
    D.5082 = new_table + D.5081;
    *D.5082 = value;
  }
  <D.4975>:
  D.5066 = table->table;
  D.5067 = (long unsigned int) i;
  D.5068 = D.5067 * 8;
  D.5069 = D.5066 + D.5068;
  D.5084 = *D.5069;
  if (D.5084 != 0B) goto <D.4974>; else goto <D.4976>;
  <D.4976>:
  i = i + 1;
  <D.4978>:
  D.5058 = table->size;
  if (D.5058 > i) goto <D.4977>; else goto <D.4979>;
  <D.4979>:
  D.5066 = table->table;
  monoeg_g_free (D.5066);
  table->size = new_size;
  table->table = new_table;
}


mono_internal_hash_table_remove (struct MonoInternalHashTable * table, void * key)
{
  guint (*<Tc80>) (const void *) D.5086;
  unsigned int D.5087;
  int D.5088;
  unsigned int D.5089;
  unsigned int D.5090;
  void * * D.5091;
  long unsigned int D.5092;
  long unsigned int D.5093;
  void * (*<Te88>) (void *) D.5094;
  void * D.5095;
  void * D.5096;
  void * * (*<Te8d>) (void *) D.5099;
  void * * D.5100;
  void * D.5101;
  int D.5102;
  int D.5103;
  gint hash;
  void * * value;

  D.5086 = table->hash_func;
  D.5087 = D.5086 (key);
  D.5088 = table->size;
  D.5089 = (unsigned int) D.5088;
  D.5090 = D.5087 % D.5089;
  hash = (gint) D.5090;
  D.5091 = table->table;
  D.5092 = (long unsigned int) hash;
  D.5093 = D.5092 * 8;
  value = D.5091 + D.5093;
  goto <D.4993>;
  <D.4992>:
  D.5094 = table->key_extract;
  D.5095 = *value;
  D.5096 = D.5094 (D.5095);
  if (D.5096 == key) goto <D.5097>; else goto <D.5098>;
  <D.5097>:
  D.5099 = table->next_value;
  D.5095 = *value;
  D.5100 = D.5099 (D.5095);
  D.5101 = *D.5100;
  *value = D.5101;
  D.5102 = table->num_entries;
  D.5103 = D.5102 + -1;
  table->num_entries = D.5103;
  return;
  <D.5098>:
  D.5099 = table->next_value;
  D.5095 = *value;
  value = D.5099 (D.5095);
  <D.4993>:
  D.5095 = *value;
  if (D.5095 != 0B) goto <D.4992>; else goto <D.4994>;
  <D.4994>:
  if (1 != 0) goto <D.5104>; else goto <D.5105>;
  <D.5104>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "mono-internal-hash.c", 125, "0");
  <D.5105>:
}


