mono_arch_get_restore_context (struct MonoTrampInfo * * info, gboolean aot)
{
  _Bool D.21715;
  long int D.21716;
  long int D.21717;
  int inited.0;
  void * D.21725;
  unsigned int i.1;
  int D.21729;
  unsigned int D.21730;
  sizetype i.2;
  sizetype D.21732;
  void * D.21733;
  unsigned int D.21734;
  unsigned int D.21735;
  unsigned int D.21736;
  unsigned int D.21737;
  int code.3;
  int start.4;
  int D.21740;
  unsigned int D.21741;
  _Bool D.21742;
  long int D.21743;
  long int D.21744;
  int i;
  guint8 * code;
  static guint8 start[512];
  static int inited = 0;
  guint32 iregs_to_restore;

  D.21715 = aot != 0;
  D.21716 = (long int) D.21715;
  D.21717 = __builtin_expect (D.21716, 0);
  if (D.21717 != 0) goto <D.21718>; else goto <D.21719>;
  <D.21718>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "exceptions-mips.c", 48, "!aot");
  <D.21719>:
  if (info != 0B) goto <D.21720>; else goto <D.21721>;
  <D.21720>:
  *info = 0B;
  <D.21721>:
  inited.0 = inited;
  if (inited.0 != 0) goto <D.21723>; else goto <D.21724>;
  <D.21723>:
  D.21725 = &start;
  return D.21725;
  <D.21724>:
  inited = 1;
  code = &start;
  MEM[(guint32 *)code] = 8390689;
  code = code + 4;
  iregs_to_restore = 3774808064;
  i = 0;
  goto <D.21608>;
  <D.21607>:
  i.1 = (unsigned int) i;
  if (i.1 > 1) goto <D.21727>; else goto <D.21728>;
  <D.21727>:
  D.21729 = i << 16;
  D.21730 = (unsigned int) D.21729;
  i.2 = (sizetype) i;
  D.21732 = i.2 * 4;
  D.21733 = 4B + D.21732;
  D.21734 = (unsigned int) D.21733;
  D.21735 = D.21734 & 65535;
  D.21736 = D.21730 | D.21735;
  D.21737 = D.21736 | 2350907392;
  MEM[(guint32 *)code] = D.21737;
  code = code + 4;
  <D.21728>:
  i = i + 1;
  <D.21608>:
  if (i <= 31) goto <D.21607>; else goto <D.21609>;
  <D.21609>:
  MEM[(guint32 *)code] = 2352545792;
  code = code + 4;
  MEM[(guint32 *)code] = 52428808;
  code = code + 4;
  MEM[(guint32 *)code] = 2099237;
  code = code + 4;
  MEM[(guint32 *)code] = 16333;
  code = code + 4;
  code.3 = (int) code;
  start.4 = (int) &start;
  D.21740 = code.3 - start.4;
  D.21741 = (unsigned int) D.21740;
  D.21742 = D.21741 > 511;
  D.21743 = (long int) D.21742;
  D.21744 = __builtin_expect (D.21743, 0);
  if (D.21744 != 0) goto <D.21745>; else goto <D.21746>;
  <D.21745>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "exceptions-mips.c", 78, "(code - start) < sizeof(start)");
  <D.21746>:
  code.3 = (int) code;
  start.4 = (int) &start;
  D.21740 = code.3 - start.4;
  mono_arch_flush_icache (&start, D.21740);
  D.21725 = &start;
  return D.21725;
}


mono_arch_get_call_filter (struct MonoTrampInfo * * info, gboolean aot)
{
  _Bool D.21748;
  long int D.21749;
  long int D.21750;
  int inited.5;
  void * D.21758;
  int D.21759;
  _Bool D.21760;
  long int D.21761;
  long int D.21762;
  int D.21765;
  int D.21766;
  int D.21767;
  unsigned int D.21768;
  unsigned int alloc_size.6;
  unsigned int D.21770;
  unsigned int D.21771;
  unsigned int D.21772;
  int D.21773;
  int D.21774;
  unsigned int D.21775;
  int D.21776;
  unsigned int D.21777;
  int D.21778;
  unsigned int D.21779;
  int D.21780;
  unsigned int D.21781;
  int D.21782;
  unsigned int D.21783;
  int D.21784;
  unsigned int D.21785;
  int D.21786;
  unsigned int D.21787;
  int D.21788;
  unsigned int D.21789;
  int D.21790;
  unsigned int D.21791;
  int D.21792;
  unsigned int D.21793;
  int D.21794;
  unsigned int D.21795;
  int D.21796;
  unsigned int D.21797;
  int D.21798;
  unsigned int D.21799;
  int D.21800;
  unsigned int D.21801;
  int D.21802;
  unsigned int D.21803;
  int D.21804;
  unsigned int D.21805;
  int D.21806;
  unsigned int D.21807;
  int D.21808;
  unsigned int D.21809;
  unsigned int D.21810;
  int D.21811;
  int D.21812;
  unsigned int D.21813;
  int code.7;
  int start.8;
  int D.21816;
  unsigned int D.21817;
  _Bool D.21818;
  long int D.21819;
  long int D.21820;
  static guint8 start[320];
  static int inited = 0;
  guint8 * code;
  int alloc_size;
  int offset;

  D.21748 = aot != 0;
  D.21749 = (long int) D.21748;
  D.21750 = __builtin_expect (D.21749, 0);
  if (D.21750 != 0) goto <D.21751>; else goto <D.21752>;
  <D.21751>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "exceptions-mips.c", 105, "!aot");
  <D.21752>:
  if (info != 0B) goto <D.21753>; else goto <D.21754>;
  <D.21753>:
  *info = 0B;
  <D.21754>:
  inited.5 = inited;
  if (inited.5 != 0) goto <D.21756>; else goto <D.21757>;
  <D.21756>:
  D.21758 = &start;
  return D.21758;
  <D.21757>:
  inited = 1;
  code = &start;
  alloc_size = 64;
  D.21759 = alloc_size & 15;
  D.21760 = D.21759 != 0;
  D.21761 = (long int) D.21760;
  D.21762 = __builtin_expect (D.21761, 0);
  if (D.21762 != 0) goto <D.21763>; else goto <D.21764>;
  <D.21763>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "exceptions-mips.c", 116, "(alloc_size & (MIPS_STACK_ALIGNMENT-1)) == 0");
  <D.21764>:
  D.21765 = -alloc_size;
  D.21766 = D.21765 & 65535;
  D.21767 = D.21766 | 666697728;
  D.21768 = (unsigned int) D.21767;
  MEM[(guint32 *)code] = D.21768;
  code = code + 4;
  alloc_size.6 = (unsigned int) alloc_size;
  D.21770 = alloc_size.6 + 4294967292;
  D.21771 = D.21770 & 65535;
  D.21772 = D.21771 | 2948530176;
  MEM[(guint32 *)code] = D.21772;
  code = code + 4;
  offset = 16;
  D.21773 = offset & 65535;
  D.21774 = D.21773 | -1347420160;
  D.21775 = (unsigned int) D.21774;
  MEM[(guint32 *)code] = D.21775;
  code = code + 4;
  offset = offset + 4;
  D.21773 = offset & 65535;
  D.21776 = D.21773 | -1347354624;
  D.21777 = (unsigned int) D.21776;
  MEM[(guint32 *)code] = D.21777;
  code = code + 4;
  offset = offset + 4;
  D.21773 = offset & 65535;
  D.21778 = D.21773 | -1347289088;
  D.21779 = (unsigned int) D.21778;
  MEM[(guint32 *)code] = D.21779;
  code = code + 4;
  offset = offset + 4;
  D.21773 = offset & 65535;
  D.21780 = D.21773 | -1347223552;
  D.21781 = (unsigned int) D.21780;
  MEM[(guint32 *)code] = D.21781;
  code = code + 4;
  offset = offset + 4;
  D.21773 = offset & 65535;
  D.21782 = D.21773 | -1347158016;
  D.21783 = (unsigned int) D.21782;
  MEM[(guint32 *)code] = D.21783;
  code = code + 4;
  offset = offset + 4;
  D.21773 = offset & 65535;
  D.21784 = D.21773 | -1347092480;
  D.21785 = (unsigned int) D.21784;
  MEM[(guint32 *)code] = D.21785;
  code = code + 4;
  offset = offset + 4;
  D.21773 = offset & 65535;
  D.21786 = D.21773 | -1347026944;
  D.21787 = (unsigned int) D.21786;
  MEM[(guint32 *)code] = D.21787;
  code = code + 4;
  offset = offset + 4;
  D.21773 = offset & 65535;
  D.21788 = D.21773 | -1346961408;
  D.21789 = (unsigned int) D.21788;
  MEM[(guint32 *)code] = D.21789;
  code = code + 4;
  offset = offset + 4;
  D.21773 = offset & 65535;
  D.21790 = D.21773 | -1346502656;
  D.21791 = (unsigned int) D.21790;
  MEM[(guint32 *)code] = D.21791;
  code = code + 4;
  offset = offset + 4;
  MEM[(guint32 *)code] = 2358247492;
  code = code + 4;
  MEM[(guint32 *)code] = 2358313032;
  code = code + 4;
  MEM[(guint32 *)code] = 2358378572;
  code = code + 4;
  MEM[(guint32 *)code] = 2358444112;
  code = code + 4;
  MEM[(guint32 *)code] = 2358509652;
  code = code + 4;
  MEM[(guint32 *)code] = 2358575192;
  code = code + 4;
  MEM[(guint32 *)code] = 2358640732;
  code = code + 4;
  MEM[(guint32 *)code] = 2358706272;
  code = code + 4;
  MEM[(guint32 *)code] = 2359165052;
  code = code + 4;
  MEM[(guint32 *)code] = 10536993;
  code = code + 4;
  MEM[(guint32 *)code] = 52492297;
  code = code + 4;
  MEM[(guint32 *)code] = 2099237;
  code = code + 4;
  offset = 16;
  D.21773 = offset & 65535;
  D.21792 = D.21773 | -1884291072;
  D.21793 = (unsigned int) D.21792;
  MEM[(guint32 *)code] = D.21793;
  code = code + 4;
  offset = offset + 4;
  D.21773 = offset & 65535;
  D.21794 = D.21773 | -1884225536;
  D.21795 = (unsigned int) D.21794;
  MEM[(guint32 *)code] = D.21795;
  code = code + 4;
  offset = offset + 4;
  D.21773 = offset & 65535;
  D.21796 = D.21773 | -1884160000;
  D.21797 = (unsigned int) D.21796;
  MEM[(guint32 *)code] = D.21797;
  code = code + 4;
  offset = offset + 4;
  D.21773 = offset & 65535;
  D.21798 = D.21773 | -1884094464;
  D.21799 = (unsigned int) D.21798;
  MEM[(guint32 *)code] = D.21799;
  code = code + 4;
  offset = offset + 4;
  D.21773 = offset & 65535;
  D.21800 = D.21773 | -1884028928;
  D.21801 = (unsigned int) D.21800;
  MEM[(guint32 *)code] = D.21801;
  code = code + 4;
  offset = offset + 4;
  D.21773 = offset & 65535;
  D.21802 = D.21773 | -1883963392;
  D.21803 = (unsigned int) D.21802;
  MEM[(guint32 *)code] = D.21803;
  code = code + 4;
  offset = offset + 4;
  D.21773 = offset & 65535;
  D.21804 = D.21773 | -1883897856;
  D.21805 = (unsigned int) D.21804;
  MEM[(guint32 *)code] = D.21805;
  code = code + 4;
  offset = offset + 4;
  D.21773 = offset & 65535;
  D.21806 = D.21773 | -1883832320;
  D.21807 = (unsigned int) D.21806;
  MEM[(guint32 *)code] = D.21807;
  code = code + 4;
  offset = offset + 4;
  D.21773 = offset & 65535;
  D.21808 = D.21773 | -1883373568;
  D.21809 = (unsigned int) D.21808;
  MEM[(guint32 *)code] = D.21809;
  code = code + 4;
  offset = offset + 4;
  alloc_size.6 = (unsigned int) alloc_size;
  D.21770 = alloc_size.6 + 4294967292;
  D.21771 = D.21770 & 65535;
  D.21810 = D.21771 | 2411659264;
  MEM[(guint32 *)code] = D.21810;
  code = code + 4;
  D.21811 = alloc_size & 65535;
  D.21812 = D.21811 | 666697728;
  D.21813 = (unsigned int) D.21812;
  MEM[(guint32 *)code] = D.21813;
  code = code + 4;
  MEM[(guint32 *)code] = 65011720;
  code = code + 4;
  MEM[(guint32 *)code] = 2099237;
  code = code + 4;
  code.7 = (int) code;
  start.8 = (int) &start;
  D.21816 = code.7 - start.8;
  D.21817 = (unsigned int) D.21816;
  D.21818 = D.21817 > 319;
  D.21819 = (long int) D.21818;
  D.21820 = __builtin_expect (D.21819, 0);
  if (D.21820 != 0) goto <D.21821>; else goto <D.21822>;
  <D.21821>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "exceptions-mips.c", 169, "(code - start) < sizeof(start)");
  <D.21822>:
  code.7 = (int) code;
  start.8 = (int) &start;
  D.21816 = code.7 - start.8;
  mono_arch_flush_icache (&start, D.21816);
  D.21758 = &start;
  return D.21758;
}


mono_arch_get_rethrow_exception (struct MonoTrampInfo * * info, gboolean aot)
{
  _Bool D.21824;
  long int D.21825;
  long int D.21826;
  int inited.9;
  void * D.21834;
  static guint8 start[256];
  static int inited = 0;

  D.21824 = aot != 0;
  D.21825 = (long int) D.21824;
  D.21826 = __builtin_expect (D.21825, 0);
  if (D.21826 != 0) goto <D.21827>; else goto <D.21828>;
  <D.21827>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "exceptions-mips.c", 301, "!aot");
  <D.21828>:
  if (info != 0B) goto <D.21829>; else goto <D.21830>;
  <D.21829>:
  *info = 0B;
  <D.21830>:
  inited.9 = inited;
  if (inited.9 != 0) goto <D.21832>; else goto <D.21833>;
  <D.21832>:
  D.21834 = &start;
  return D.21834;
  <D.21833>:
  mono_arch_get_throw_exception_generic (&start, 256, 0, 1);
  inited = 1;
  D.21834 = &start;
  return D.21834;
}


mono_arch_get_throw_exception_generic (guint8 * start, int size, int corlib, gboolean rethrow)
{
  unsigned int pos.10;
  unsigned int D.21837;
  unsigned int D.21838;
  int D.21839;
  _Bool D.21840;
  long int D.21841;
  long int D.21842;
  int D.21845;
  int D.21846;
  int D.21847;
  unsigned int D.21848;
  unsigned int alloc_size.11;
  unsigned int D.21850;
  unsigned int D.21851;
  unsigned int D.21852;
  int D.21855;
  int D.21856;
  int D.21857;
  int D.21858;
  int D.21859;
  int D.21860;
  unsigned int D.21861;
  int D.21863;
  int D.21864;
  unsigned int D.21865;
  int D.21866;
  unsigned int D.21867;
  struct MonoImage * D.21870;
  unsigned int D.21871;
  unsigned int D.21872;
  unsigned int D.21875;
  unsigned int D.21876;
  unsigned int D.21877;
  unsigned int D.21878;
  unsigned int D.21880;
  unsigned int D.21881;
  unsigned int D.21882;
  unsigned int mono_exception_from_token.12;
  unsigned int D.21884;
  unsigned int D.21887;
  unsigned int D.21888;
  unsigned int D.21889;
  unsigned int D.21890;
  unsigned int D.21892;
  unsigned int D.21893;
  unsigned int D.21894;
  unsigned int D.21897;
  int D.21899;
  int D.21900;
  unsigned int D.21901;
  unsigned int throw_exception.13;
  unsigned int D.21903;
  unsigned int D.21906;
  unsigned int D.21907;
  unsigned int D.21908;
  unsigned int D.21909;
  unsigned int D.21911;
  unsigned int D.21912;
  unsigned int D.21913;
  int code.14;
  int start.15;
  int D.21916;
  _Bool D.21917;
  long int D.21918;
  long int D.21919;
  void * D.21922;
  guint8 * code;
  int alloc_size;
  int pos;
  int i;

  code = start;
  pos = 0;
  pos.10 = (unsigned int) pos;
  D.21837 = pos.10 + 128;
  pos = (int) D.21837;
  pos.10 = (unsigned int) pos;
  D.21838 = pos.10 + 96;
  alloc_size = (int) D.21838;
  alloc_size = alloc_size + 15;
  alloc_size = alloc_size & -16;
  D.21839 = alloc_size & 15;
  D.21840 = D.21839 != 0;
  D.21841 = (long int) D.21840;
  D.21842 = __builtin_expect (D.21841, 0);
  if (D.21842 != 0) goto <D.21843>; else goto <D.21844>;
  <D.21843>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "exceptions-mips.c", 240, "(alloc_size & (MIPS_STACK_ALIGNMENT-1)) == 0");
  <D.21844>:
  D.21845 = -alloc_size;
  D.21846 = D.21845 & 65535;
  D.21847 = D.21846 | 666697728;
  D.21848 = (unsigned int) D.21847;
  MEM[(guint32 *)code] = D.21848;
  code = code + 4;
  alloc_size.11 = (unsigned int) alloc_size;
  D.21850 = alloc_size.11 + 4294967292;
  D.21851 = D.21850 & 65535;
  D.21852 = D.21851 | 2948530176;
  MEM[(guint32 *)code] = D.21852;
  code = code + 4;
  i = 0;
  goto <D.21638>;
  <D.21637>:
  if (i != 29) goto <D.21853>; else goto <D.21854>;
  <D.21853>:
  D.21855 = i << 16;
  D.21856 = D.21855 | -1348468736;
  D.21857 = i + 4;
  D.21858 = D.21857 * 4;
  D.21859 = D.21858 & 65535;
  D.21860 = D.21856 | D.21859;
  D.21861 = (unsigned int) D.21860;
  MEM[(guint32 *)code] = D.21861;
  code = code + 4;
  goto <D.21862>;
  <D.21854>:
  D.21863 = alloc_size & 65535;
  D.21864 = D.21863 | 664862720;
  D.21865 = (unsigned int) D.21864;
  MEM[(guint32 *)code] = D.21865;
  code = code + 4;
  D.21857 = i + 4;
  D.21858 = D.21857 * 4;
  D.21859 = D.21858 & 65535;
  D.21866 = D.21859 | -1348403200;
  D.21867 = (unsigned int) D.21866;
  MEM[(guint32 *)code] = D.21867;
  code = code + 4;
  <D.21862>:
  i = i + 1;
  <D.21638>:
  if (i <= 31) goto <D.21637>; else goto <D.21639>;
  <D.21639>:
  if (corlib != 0) goto <D.21868>; else goto <D.21869>;
  <D.21868>:
  MEM[(guint32 *)code] = 8398881;
  code = code + 4;
  D.21870 = mono_defaults.corlib;
  D.21871 = (unsigned int) D.21870;
  D.21872 = D.21871 & 32768;
  if (D.21872 != 0) goto <D.21873>; else goto <D.21874>;
  <D.21873>:
  D.21870 = mono_defaults.corlib;
  D.21871 = (unsigned int) D.21870;
  D.21875 = D.21871 >> 16;
  D.21876 = D.21875 + 1;
  D.21877 = D.21876 & 65535;
  D.21878 = D.21877 | 1006895104;
  MEM[(guint32 *)code] = D.21878;
  code = code + 4;
  goto <D.21879>;
  <D.21874>:
  D.21870 = mono_defaults.corlib;
  D.21871 = (unsigned int) D.21870;
  D.21875 = D.21871 >> 16;
  D.21880 = D.21875 | 1006895104;
  MEM[(guint32 *)code] = D.21880;
  code = code + 4;
  <D.21879>:
  D.21870 = mono_defaults.corlib;
  D.21871 = (unsigned int) D.21870;
  D.21881 = D.21871 & 65535;
  D.21882 = D.21881 | 612630528;
  MEM[(guint32 *)code] = D.21882;
  code = code + 4;
  mono_exception_from_token.12 = (unsigned int) mono_exception_from_token;
  D.21884 = mono_exception_from_token.12 & 32768;
  if (D.21884 != 0) goto <D.21885>; else goto <D.21886>;
  <D.21885>:
  mono_exception_from_token.12 = (unsigned int) mono_exception_from_token;
  D.21887 = mono_exception_from_token.12 >> 16;
  D.21888 = D.21887 + 1;
  D.21889 = D.21888 & 65535;
  D.21890 = D.21889 | 1008271360;
  MEM[(guint32 *)code] = D.21890;
  code = code + 4;
  goto <D.21891>;
  <D.21886>:
  mono_exception_from_token.12 = (unsigned int) mono_exception_from_token;
  D.21887 = mono_exception_from_token.12 >> 16;
  D.21892 = D.21887 | 1008271360;
  MEM[(guint32 *)code] = D.21892;
  code = code + 4;
  <D.21891>:
  mono_exception_from_token.12 = (unsigned int) mono_exception_from_token;
  D.21893 = mono_exception_from_token.12 & 65535;
  D.21894 = D.21893 | 658046976;
  MEM[(guint32 *)code] = D.21894;
  code = code + 4;
  MEM[(guint32 *)code] = 52492297;
  code = code + 4;
  MEM[(guint32 *)code] = 2099237;
  code = code + 4;
  MEM[(guint32 *)code] = 4202529;
  code = code + 4;
  <D.21869>:
  if (corlib != 0) goto <D.21895>; else goto <D.21896>;
  <D.21895>:
  alloc_size.11 = (unsigned int) alloc_size;
  D.21850 = alloc_size.11 + 4294967292;
  D.21851 = D.21850 & 65535;
  D.21897 = D.21851 | 2409955328;
  MEM[(guint32 *)code] = D.21897;
  code = code + 4;
  goto <D.21898>;
  <D.21896>:
  MEM[(guint32 *)code] = 65021985;
  code = code + 4;
  <D.21898>:
  MEM[(guint32 *)code] = 60829729;
  code = code + 4;
  D.21899 = rethrow & 65535;
  D.21900 = D.21899 | 604438528;
  D.21901 = (unsigned int) D.21900;
  MEM[(guint32 *)code] = D.21901;
  code = code + 4;
  throw_exception.13 = (unsigned int) throw_exception;
  D.21903 = throw_exception.13 & 32768;
  if (D.21903 != 0) goto <D.21904>; else goto <D.21905>;
  <D.21904>:
  throw_exception.13 = (unsigned int) throw_exception;
  D.21906 = throw_exception.13 >> 16;
  D.21907 = D.21906 + 1;
  D.21908 = D.21907 & 65535;
  D.21909 = D.21908 | 1008271360;
  MEM[(guint32 *)code] = D.21909;
  code = code + 4;
  goto <D.21910>;
  <D.21905>:
  throw_exception.13 = (unsigned int) throw_exception;
  D.21906 = throw_exception.13 >> 16;
  D.21911 = D.21906 | 1008271360;
  MEM[(guint32 *)code] = D.21911;
  code = code + 4;
  <D.21910>:
  throw_exception.13 = (unsigned int) throw_exception;
  D.21912 = throw_exception.13 & 65535;
  D.21913 = D.21912 | 658046976;
  MEM[(guint32 *)code] = D.21913;
  code = code + 4;
  MEM[(guint32 *)code] = 52428808;
  code = code + 4;
  MEM[(guint32 *)code] = 2099237;
  code = code + 4;
  MEM[(guint32 *)code] = 16269;
  code = code + 4;
  code.14 = (int) code;
  start.15 = (int) start;
  D.21916 = code.14 - start.15;
  D.21917 = D.21916 >= size;
  D.21918 = (long int) D.21917;
  D.21919 = __builtin_expect (D.21918, 0);
  if (D.21919 != 0) goto <D.21920>; else goto <D.21921>;
  <D.21920>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "exceptions-mips.c", 282, "(code - start) < size");
  <D.21921>:
  code.14 = (int) code;
  start.15 = (int) start;
  D.21916 = code.14 - start.15;
  mono_arch_flush_icache (start, D.21916);
  D.21922 = start;
  return D.21922;
}


throw_exception (struct MonoObject * exc, long unsigned int eip, long unsigned int esp, gboolean rethrow)
{
  long unsigned int D.21924;
  const void * D.21925;
  int eip.16;
  struct MonoClass * D.21927;
  struct MonoObject * D.21928;
  struct MonoContext ctx;

  try
    {
      eip = eip + 4294967288;
      memset (&ctx, 0, 260);
      D.21924 = esp + 16;
      D.21925 = (const void *) D.21924;
      memcpy (&ctx.sc_regs, D.21925, 128);
      memset (&ctx.sc_fpregs, 0, 128);
      eip.16 = (int) eip;
      ctx.sc_pc = eip.16;
      D.21927 = mono_defaults.exception_class;
      D.21928 = mono_object_isinst (exc, D.21927);
      if (D.21928 != 0B) goto <D.21929>; else goto <D.21930>;
      <D.21929>:
      {
        struct MonoException * mono_ex;

        mono_ex = exc;
        if (rethrow == 0) goto <D.21931>; else goto <D.21932>;
        <D.21931>:
        mono_ex->stack_trace = 0B;
        <D.21932>:
      }
      <D.21930>:
      mono_handle_exception (&ctx, exc);
      mono_restore_context (&ctx);
      monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "exceptions-mips.c", 208);
    }
  finally
    {
      ctx = {CLOBBER};
    }
}


memcpy (void * restrict __dest, const void * restrict __src, size_t __len)
{
  void * D.21933;
  unsigned int D.21934;

  D.21934 = __builtin_object_size (__dest, 0);
  D.21933 = __builtin___memcpy_chk (__dest, __src, __len, D.21934);
  return D.21933;
}


memset (void * __dest, int __ch, size_t __len)
{
  int D.21938;
  int D.21943;
  void * D.21945;
  unsigned int D.21946;

  D.21938 = __builtin_constant_p (__len);
  if (D.21938 != 0) goto <D.21939>; else goto <D.21940>;
  <D.21939>:
  if (__len == 0) goto <D.21941>; else goto <D.21942>;
  <D.21941>:
  D.21943 = __builtin_constant_p (__ch);
  if (D.21943 == 0) goto <D.21936>; else goto <D.21944>;
  <D.21944>:
  if (__ch != 0) goto <D.21936>; else goto <D.21937>;
  <D.21936>:
  __warn_memset_zero_len ();
  D.21945 = __dest;
  return D.21945;
  <D.21937>:
  <D.21942>:
  <D.21940>:
  D.21946 = __builtin_object_size (__dest, 0);
  D.21945 = __builtin___memset_chk (__dest, __ch, __len, D.21946);
  return D.21945;
}


mono_arch_get_throw_exception (struct MonoTrampInfo * * info, gboolean aot)
{
  _Bool D.21948;
  long int D.21949;
  long int D.21950;
  int inited.17;
  void * D.21958;
  static guint8 start[256];
  static int inited = 0;

  D.21948 = aot != 0;
  D.21949 = (long int) D.21948;
  D.21950 = __builtin_expect (D.21949, 0);
  if (D.21950 != 0) goto <D.21951>; else goto <D.21952>;
  <D.21951>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "exceptions-mips.c", 330, "!aot");
  <D.21952>:
  if (info != 0B) goto <D.21953>; else goto <D.21954>;
  <D.21953>:
  *info = 0B;
  <D.21954>:
  inited.17 = inited;
  if (inited.17 != 0) goto <D.21956>; else goto <D.21957>;
  <D.21956>:
  D.21958 = &start;
  return D.21958;
  <D.21957>:
  mono_arch_get_throw_exception_generic (&start, 256, 0, 0);
  inited = 1;
  D.21958 = &start;
  return D.21958;
}


mono_arch_get_throw_exception_by_name ()
{
  int code.18;
  int start.19;
  int D.21962;
  void * D.21963;
  guint8 * start;
  guint8 * code;
  int size;

  size = 64;
  code = mono_global_codeman_reserve (size);
  start = code;
  MEM[(guint32 *)code] = 16205;
  code = code + 4;
  code.18 = (int) code;
  start.19 = (int) start;
  D.21962 = code.18 - start.19;
  mono_arch_flush_icache (start, D.21962);
  D.21963 = start;
  return D.21963;
}


mono_arch_get_throw_corlib_exception (struct MonoTrampInfo * * info, gboolean aot)
{
  _Bool D.21965;
  long int D.21966;
  long int D.21967;
  int inited.20;
  void * D.21975;
  static guint8 start[256];
  static int inited = 0;

  D.21965 = aot != 0;
  D.21966 = (long int) D.21965;
  D.21967 = __builtin_expect (D.21966, 0);
  if (D.21967 != 0) goto <D.21968>; else goto <D.21969>;
  <D.21968>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "exceptions-mips.c", 368, "!aot");
  <D.21969>:
  if (info != 0B) goto <D.21970>; else goto <D.21971>;
  <D.21970>:
  *info = 0B;
  <D.21971>:
  inited.20 = inited;
  if (inited.20 != 0) goto <D.21973>; else goto <D.21974>;
  <D.21973>:
  D.21975 = &start;
  return D.21975;
  <D.21974>:
  mono_arch_get_throw_exception_generic (&start, 256, 1, 0);
  inited = 1;
  D.21975 = &start;
  return D.21975;
}


mono_arch_find_jit_info (struct MonoDomain * domain, struct MonoJitTlsData * jit_tls, struct MonoJitInfo * ji, struct MonoContext * ctx, struct MonoContext * new_ctx, struct MonoLMF * * lmf, mgreg_t * * save_locations, struct StackFrameInfo * frame)
{
  int D.21979;
  unsigned int D.21980;
  unsigned int D.21981;
  unsigned int D.21985;
  int D.21986;
  unsigned int unwind_info_len.21;
  void * D.21988;
  int D.21989;
  sizetype D.21990;
  guint8 * D.21991;
  int D.21992;
  int D.21993;
  guint8 * cfa.22;
  int cfa.23;
  struct MonoLMF * D.21996;
  int D.21999;
  void * D.22000;
  int D.22001;
  void * D.22002;
  void * D.22005;
  unsigned int D.22006;
  unsigned int D.22007;
  struct MonoLMF * D.22008;
  int D.22009;
  int D.22010;
  int D.22011;
  void * D.22012;
  _Bool D.22013;
  long int D.22014;
  long int D.22015;
  gboolean D.22018;
  int D.22021;
  int D.22022;
  int D.22025;
  _Bool D.22026;
  long int D.22027;
  long int D.22028;
  struct MonoContext * D.22031;
  struct MonoMethod * D.22032;
  int iftmp.24;
  long unsigned int D.22038;
  _Bool D.22041;
  long int D.22042;
  long int D.22043;
  void * D.22046;
  mgreg_t[32] * D.22049;
  mgreg_t[32] * D.22050;
  gfloat[32] * D.22051;
  mips_freg[32] * D.22052;
  int D.22053;
  _Bool D.22054;
  long int D.22055;
  long int D.22056;

  memset (frame, 0, 52);
  frame->ji = ji;
  *new_ctx = *ctx;
  if (ji != 0B) goto <D.21977>; else goto <D.21978>;
  <D.21977>:
  {
    int i;
    void * ip;
    mgreg_t regs[33];
    guint8 * cfa;
    guint32 unwind_info_len;
    guint8 * unwind_info;

    try
      {
        D.21979 = ctx->sc_pc;
        ip = (void *) D.21979;
        frame->type = 0;
        D.21980 = BIT_FIELD_REF <*ji, 32, 160>;
        D.21981 = D.21980 & 1048576;
        if (D.21981 != 0) goto <D.21982>; else goto <D.21983>;
        <D.21982>:
        unwind_info = mono_aot_get_unwind_info (ji, &unwind_info_len);
        goto <D.21984>;
        <D.21983>:
        D.21985 = ji->used_regs;
        unwind_info = mono_get_cached_unwind_info (D.21985, &unwind_info_len);
        <D.21984>:
        i = 0;
        goto <D.21681>;
        <D.21680>:
        D.21986 = new_ctx->sc_regs[i];
        regs[i] = D.21986;
        i = i + 1;
        <D.21681>:
        if (i <= 31) goto <D.21680>; else goto <D.21682>;
        <D.21682>:
        unwind_info_len.21 = unwind_info_len;
        D.21988 = ji->code_start;
        D.21988 = ji->code_start;
        D.21989 = ji->code_size;
        D.21990 = (sizetype) D.21989;
        D.21991 = D.21988 + D.21990;
        mono_unwind_frame (unwind_info, unwind_info_len.21, D.21988, D.21991, ip, &regs, 32, save_locations, 32, &cfa);
        i = 0;
        goto <D.21684>;
        <D.21683>:
        D.21992 = regs[i];
        new_ctx->sc_regs[i] = D.21992;
        i = i + 1;
        <D.21684>:
        if (i <= 31) goto <D.21683>; else goto <D.21685>;
        <D.21685>:
        D.21993 = regs[31];
        new_ctx->sc_pc = D.21993;
        cfa.22 = cfa;
        cfa.23 = (int) cfa.22;
        new_ctx->sc_regs[29] = cfa.23;
        D.21996 = *lmf;
        if (D.21996 != 0B) goto <D.21997>; else goto <D.21998>;
        <D.21997>:
        D.21999 = ctx->sc_regs[29];
        D.22000 = (void *) D.21999;
        D.21996 = *lmf;
        D.22001 = D.21996->iregs[29];
        D.22002 = (void *) D.22001;
        if (D.22000 >= D.22002) goto <D.22003>; else goto <D.22004>;
        <D.22003>:
        D.21996 = *lmf;
        D.22005 = D.21996->previous_lmf;
        D.22006 = (unsigned int) D.22005;
        D.22007 = D.22006 & 4294967292;
        D.22008 = (struct MonoLMF *) D.22007;
        *lmf = D.22008;
        <D.22004>:
        <D.21998>:
        D.22009 = new_ctx->sc_pc;
        D.22010 = D.22009 + -8;
        new_ctx->sc_pc = D.22010;
        D.22011 = new_ctx->sc_regs[29];
        D.22012 = (void *) D.22011;
        D.21999 = ctx->sc_regs[29];
        D.22000 = (void *) D.21999;
        D.22013 = D.22012 == D.22000;
        D.22014 = (long int) D.22013;
        D.22015 = __builtin_expect (D.22014, 0);
        if (D.22015 != 0) goto <D.22016>; else goto <D.22017>;
        <D.22016>:
        monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "exceptions-mips.c", 436, "MONO_CONTEXT_GET_SP (new_ctx) != MONO_CONTEXT_GET_SP (ctx)");
        <D.22017>:
        D.22018 = 1;
        return D.22018;
      }
    finally
      {
        regs = {CLOBBER};
        cfa = {CLOBBER};
        unwind_info_len = {CLOBBER};
      }
  }
  <D.21978>:
  D.21996 = *lmf;
  if (D.21996 != 0B) goto <D.22019>; else goto <D.22020>;
  <D.22019>:
  D.21996 = *lmf;
  D.22005 = D.21996->previous_lmf;
  D.22021 = (int) D.22005;
  D.22022 = D.22021 & 2;
  if (D.22022 != 0) goto <D.22023>; else goto <D.22024>;
  <D.22023>:
  {
    struct MonoLMFExt * ext;

    ext = *lmf;
    D.22025 = ext->debugger_invoke;
    D.22026 = D.22025 == 0;
    D.22027 = (long int) D.22026;
    D.22028 = __builtin_expect (D.22027, 0);
    if (D.22028 != 0) goto <D.22029>; else goto <D.22030>;
    <D.22029>:
    monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "exceptions-mips.c", 447, "ext->debugger_invoke");
    <D.22030>:
    D.22031 = &ext->ctx;
    memcpy (new_ctx, D.22031, 260);
    D.21996 = *lmf;
    D.22005 = D.21996->previous_lmf;
    D.22006 = (unsigned int) D.22005;
    D.22007 = D.22006 & 4294967292;
    D.22008 = (struct MonoLMF *) D.22007;
    *lmf = D.22008;
    frame->type = 1;
    D.22018 = 1;
    return D.22018;
  }
  <D.22024>:
  D.21996 = *lmf;
  D.22032 = D.21996->method;
  if (D.22032 == 0B) goto <D.22033>; else goto <D.22034>;
  <D.22033>:
  D.22018 = 0;
  return D.22018;
  <D.22034>:
  D.21996 = *lmf;
  D.22038 = D.21996->magic;
  if (D.22038 != 2779096485) goto <D.22039>; else goto <D.22036>;
  <D.22039>:
  D.21996 = *lmf;
  D.22038 = D.21996->magic;
  if (D.22038 != 3284386755) goto <D.22040>; else goto <D.22036>;
  <D.22040>:
  iftmp.24 = 1;
  goto <D.22037>;
  <D.22036>:
  iftmp.24 = 0;
  <D.22037>:
  D.22041 = iftmp.24 != 0;
  D.22042 = (long int) D.22041;
  D.22043 = __builtin_expect (D.22042, 0);
  if (D.22043 != 0) goto <D.22044>; else goto <D.22045>;
  <D.22044>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "exceptions-mips.c", 464, "((*lmf)->magic == MIPS_LMF_MAGIC1) || ((*lmf)->magic == MIPS_LMF_MAGIC2)");
  <D.22045>:
  D.21996 = *lmf;
  D.22046 = D.21996->eip;
  ji = mini_jit_info_table_find (domain, D.22046, 0B);
  if (ji == 0B) goto <D.22047>; else goto <D.22048>;
  <D.22047>:
  D.22018 = 0;
  return D.22018;
  <D.22048>:
  frame->ji = ji;
  frame->type = 2;
  D.22049 = &new_ctx->sc_regs;
  D.21996 = *lmf;
  D.22050 = &D.21996->iregs;
  memcpy (D.22049, D.22050, 128);
  D.22051 = &new_ctx->sc_fpregs;
  D.21996 = *lmf;
  D.22052 = &D.21996->fregs;
  memcpy (D.22051, D.22052, 128);
  D.21996 = *lmf;
  D.22046 = D.21996->eip;
  D.22053 = (int) D.22046;
  new_ctx->sc_pc = D.22053;
  D.22009 = new_ctx->sc_pc;
  D.21979 = ctx->sc_pc;
  D.22054 = D.22009 == D.21979;
  D.22055 = (long int) D.22054;
  D.22056 = __builtin_expect (D.22055, 0);
  if (D.22056 != 0) goto <D.22057>; else goto <D.22058>;
  <D.22057>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "exceptions-mips.c", 479, "new_ctx->sc_pc != ctx->sc_pc");
  <D.22058>:
  D.21996 = *lmf;
  D.22005 = D.21996->previous_lmf;
  D.22006 = (unsigned int) D.22005;
  D.22007 = D.22006 & 4294967292;
  D.22008 = (struct MonoLMF *) D.22007;
  *lmf = D.22008;
  D.22018 = 1;
  return D.22018;
  <D.22020>:
  D.22018 = 0;
  return D.22018;
}


mono_arch_sigctx_to_monoctx (void * sigctx, struct MonoContext * mctx)
{
  mono_sigctx_to_monoctx (sigctx, mctx);
}


mono_arch_monoctx_to_sigctx (struct MonoContext * mctx, void * sigctx)
{
  mono_monoctx_to_sigctx (mctx, sigctx);
}


mono_arch_ip_from_context (void * sigctx)
{
  void * D.22061;
  long long unsigned int D.22062;
  unsigned int D.22063;

  D.22062 = MEM[(struct ucontext_t *)sigctx].uc_mcontext.pc;
  D.22063 = (unsigned int) D.22062;
  D.22061 = (void *) D.22063;
  return D.22061;
}


mono_arch_handle_exception (void * ctx, void * obj)
{
  unsigned int mono_jit_tls_id.25;
  struct MonoContext * D.22066;
  unsigned int obj.26;
  long long unsigned int D.22068;
  unsigned int handle_signal_exception.27;
  long long unsigned int D.22070;
  gboolean D.22071;
  void * sigctx;
  struct MonoJitTlsData * jit_tls;
  guint64 sp;

  sigctx = ctx;
  mono_jit_tls_id.25 = mono_jit_tls_id;
  jit_tls = pthread_getspecific (mono_jit_tls_id.25);
  sp = MEM[(struct ucontext_t *)sigctx].uc_mcontext.gregs[29];
  D.22066 = &jit_tls->ex_ctx;
  mono_arch_sigctx_to_monoctx (sigctx, D.22066);
  obj.26 = (unsigned int) obj;
  D.22068 = (long long unsigned int) obj.26;
  MEM[(struct ucontext_t *)sigctx].uc_mcontext.gregs[4] = D.22068;
  sp = sp + 18446744073709551360;
  MEM[(struct ucontext_t *)sigctx].uc_mcontext.gregs[29] = sp;
  handle_signal_exception.27 = (unsigned int) handle_signal_exception;
  D.22070 = (long long unsigned int) handle_signal_exception.27;
  MEM[(struct ucontext_t *)sigctx].uc_mcontext.pc = D.22070;
  D.22071 = 1;
  return D.22071;
}


handle_signal_exception (void * obj)
{
  unsigned int mono_jit_tls_id.28;
  struct MonoContext * D.22074;
  struct MonoJitTlsData * jit_tls;
  struct MonoContext ctx;

  try
    {
      mono_jit_tls_id.28 = mono_jit_tls_id;
      jit_tls = pthread_getspecific (mono_jit_tls_id.28);
      D.22074 = &jit_tls->ex_ctx;
      memcpy (&ctx, D.22074, 260);
      mono_handle_exception (&ctx, obj);
      mono_restore_context (&ctx);
    }
  finally
    {
      ctx = {CLOBBER};
    }
}


mono_arch_setup_resume_sighandler_ctx (struct MonoContext * ctx, void * func)
{
  int func.29;

  func.29 = (int) func;
  ctx->sc_pc = func.29;
}


