mono_arch_get_restore_context (struct MonoTrampInfo * * info, gboolean aot)
{
  int D.24703;
  int D.24706;
  unsigned int D.24707;
  unsigned int D.24708;
  unsigned int D.24709;
  int D.24710;
  int D.24711;
  int D.24712;
  int iftmp.0;
  int D.24717;
  int D.24718;
  unsigned int D.24719;
  unsigned int D.24720;
  int code.1;
  int start.2;
  int D.24723;
  _Bool D.24724;
  long int D.24725;
  long int D.24726;
  unsigned int D.24731;
  struct MonoTrampInfo * D.24732;
  void * D.24733;
  guint8 * code;
  guint8 * start;
  int ctx_reg;
  struct MonoJumpInfo * ji;
  struct GSList * unwind_ops;

  ji = 0B;
  unwind_ops = 0B;
  code = mono_global_codeman_reserve (128);
  start = code;
  ctx_reg = 0;
  D.24703 = mono_arch_is_soft_float ();
  if (D.24703 == 0) goto <D.24704>; else goto <D.24705>;
  <D.24704>:
  {
    arminstr_t * __ainstrp;

    __ainstrp = code;
    D.24706 = ctx_reg << 16;
    D.24707 = (unsigned int) D.24706;
    D.24708 = D.24707 | 3800088648;
    *__ainstrp = D.24708;
    code = __ainstrp + 4;
  }
  {
    arminstr_t * __ainstrp;

    __ainstrp = code;
    *__ainstrp = 3969649440;
    code = __ainstrp + 4;
  }
  <D.24705>:
  {
    arminstr_t * __ainstrp;

    __ainstrp = code;
    D.24706 = ctx_reg << 16;
    D.24707 = (unsigned int) D.24706;
    D.24709 = D.24707 | 3851468800;
    *__ainstrp = D.24709;
    code = __ainstrp + 4;
  }
  {
    int _imm12;

    _imm12 = 64;
    {
      arminstr_t * __ainstrp;

      __ainstrp = code;
      D.24710 = ABS_EXPR <_imm12>;
      D.24711 = D.24710 | 49152;
      D.24706 = ctx_reg << 16;
      D.24712 = D.24711 | D.24706;
      if (_imm12 >= 0) goto <D.24714>; else goto <D.24715>;
      <D.24714>:
      iftmp.0 = 8388608;
      goto <D.24716>;
      <D.24715>:
      iftmp.0 = 0;
      <D.24716>:
      D.24717 = D.24712 | iftmp.0;
      D.24718 = D.24717 | -452984832;
      D.24719 = (unsigned int) D.24718;
      *__ainstrp = D.24719;
      code = __ainstrp + 4;
    }
  }
  {
    arminstr_t * __ainstrp;

    __ainstrp = code;
    D.24706 = ctx_reg << 16;
    D.24707 = (unsigned int) D.24706;
    D.24720 = D.24707 | 3800088580;
    *__ainstrp = D.24720;
    code = __ainstrp + 4;
  }
  {
    arminstr_t * __ainstrp;

    __ainstrp = code;
    *__ainstrp = 3902603263;
    code = __ainstrp + 4;
  }
  {
    arminstr_t * __ainstrp;

    __ainstrp = code;
    *__ainstrp = 3858759696;
    code = __ainstrp + 4;
  }
  code.1 = (int) code;
  start.2 = (int) start;
  D.24723 = code.1 - start.2;
  D.24724 = D.24723 > 127;
  D.24725 = (long int) D.24724;
  D.24726 = __builtin_expect (D.24725, 0);
  if (D.24726 != 0) goto <D.24727>; else goto <D.24728>;
  <D.24727>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "exceptions-arm.c", 79, "(code - start) < 128");
  <D.24728>:
  code.1 = (int) code;
  start.2 = (int) start;
  D.24723 = code.1 - start.2;
  mono_arch_flush_icache (start, D.24723);
  if (info != 0B) goto <D.24729>; else goto <D.24730>;
  <D.24729>:
  code.1 = (int) code;
  start.2 = (int) start;
  D.24723 = code.1 - start.2;
  D.24731 = (unsigned int) D.24723;
  D.24732 = mono_tramp_info_create ("restore_context", start, D.24731, ji, unwind_ops);
  *info = D.24732;
  <D.24730>:
  D.24733 = start;
  return D.24733;
}


mono_arch_is_soft_float ()
{
  gboolean D.24735;

  D.24735 = 0;
  return D.24735;
}


mono_arch_get_call_filter (struct MonoTrampInfo * * info, gboolean aot)
{
  int D.24737;
  unsigned int D.24738;
  unsigned int D.24739;
  unsigned int D.24740;
  int code.3;
  int start.4;
  int D.24743;
  _Bool D.24744;
  long int D.24745;
  long int D.24746;
  unsigned int D.24751;
  struct MonoTrampInfo * D.24752;
  void * D.24753;
  guint8 * code;
  guint8 * start;
  int ctx_reg;
  struct MonoJumpInfo * ji;
  struct GSList * unwind_ops;

  ji = 0B;
  unwind_ops = 0B;
  code = mono_global_codeman_reserve (320);
  start = code;
  {
    arminstr_t * __ainstrp;

    __ainstrp = code;
    *__ainstrp = 3785408525;
    code = __ainstrp + 4;
  }
  {
    arminstr_t * __ainstrp;

    __ainstrp = code;
    *__ainstrp = 3912065008;
    code = __ainstrp + 4;
  }
  ctx_reg = 0;
  {
    arminstr_t * __ainstrp;

    __ainstrp = code;
    D.24737 = ctx_reg << 16;
    D.24738 = (unsigned int) D.24737;
    D.24739 = D.24738 | 3851468800;
    *__ainstrp = D.24739;
    code = __ainstrp + 4;
  }
  {
    arminstr_t * __ainstrp;

    __ainstrp = code;
    D.24737 = ctx_reg << 16;
    D.24738 = (unsigned int) D.24737;
    D.24740 = D.24738 | 3800096788;
    *__ainstrp = D.24740;
    code = __ainstrp + 4;
  }
  {
    arminstr_t * __ainstrp;

    __ainstrp = code;
    *__ainstrp = 3902693360;
    code = __ainstrp + 4;
  }
  {
    arminstr_t * __ainstrp;

    __ainstrp = code;
    *__ainstrp = 3785359362;
    code = __ainstrp + 4;
  }
  {
    arminstr_t * __ainstrp;

    __ainstrp = code;
    *__ainstrp = 3785416719;
    code = __ainstrp + 4;
  }
  {
    arminstr_t * __ainstrp;

    __ainstrp = code;
    *__ainstrp = 3785420801;
    code = __ainstrp + 4;
  }
  {
    arminstr_t * __ainstrp;

    __ainstrp = code;
    *__ainstrp = 3902648304;
    code = __ainstrp + 4;
  }
  code.3 = (int) code;
  start.4 = (int) start;
  D.24743 = code.3 - start.4;
  D.24744 = D.24743 > 319;
  D.24745 = (long int) D.24744;
  D.24746 = __builtin_expect (D.24745, 0);
  if (D.24746 != 0) goto <D.24747>; else goto <D.24748>;
  <D.24747>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "exceptions-arm.c", 125, "(code - start) < 320");
  <D.24748>:
  code.3 = (int) code;
  start.4 = (int) start;
  D.24743 = code.3 - start.4;
  mono_arch_flush_icache (start, D.24743);
  if (info != 0B) goto <D.24749>; else goto <D.24750>;
  <D.24749>:
  code.3 = (int) code;
  start.4 = (int) start;
  D.24743 = code.3 - start.4;
  D.24751 = (unsigned int) D.24743;
  D.24752 = mono_tramp_info_create ("call_filter", start, D.24751, ji, unwind_ops);
  *info = D.24752;
  <D.24750>:
  D.24753 = start;
  return D.24753;
}


mono_arm_throw_exception (struct MonoObject * exc, mgreg_t pc, mgreg_t sp, mgreg_t * int_regs, gdouble * fp_regs)
{
  int D.24755;
  struct MonoClass * D.24756;
  struct MonoObject * D.24757;
  struct MonoContext ctx;
  gboolean rethrow;

  try
    {
      rethrow = pc & 1;
      pc = pc & -2;
      pc = pc + -4;
      D.24755 = MEM[(mgreg_t *)int_regs + 28B];
      ctx.regs[11] = D.24755;
      ctx.regs[13] = sp;
      ctx.pc = pc;
      memcpy (&ctx.regs[4], int_regs, 32);
      memcpy (&ctx.fregs, fp_regs, 128);
      D.24756 = mono_defaults.exception_class;
      D.24757 = mono_object_isinst (exc, D.24756);
      if (D.24757 != 0B) goto <D.24758>; else goto <D.24759>;
      <D.24758>:
      {
        struct MonoException * mono_ex;

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


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

  D.24763 = __builtin_object_size (__dest, 0);
  D.24762 = __builtin___memcpy_chk (__dest, __src, __len, D.24763);
  return D.24762;
}


mono_arm_throw_exception_by_token (guint32 type_token, mgreg_t pc, mgreg_t sp, mgreg_t * int_regs, gdouble * fp_regs)
{
  struct MonoImage * D.24765;
  struct MonoException * D.24766;

  pc = pc & -2;
  D.24765 = mono_defaults.corlib;
  D.24766 = mono_exception_from_token (D.24765, type_token);
  mono_arm_throw_exception (D.24766, pc, sp, int_regs, fp_regs);
}


mono_arm_resume_unwind (guint32 dummy1, mgreg_t pc, mgreg_t sp, mgreg_t * int_regs, gdouble * fp_regs)
{
  int D.24767;
  struct MonoContext ctx;

  try
    {
      pc = pc & -2;
      pc = pc + -4;
      D.24767 = MEM[(mgreg_t *)int_regs + 28B];
      ctx.regs[11] = D.24767;
      ctx.regs[13] = sp;
      ctx.pc = pc;
      memcpy (&ctx.regs[4], int_regs, 32);
      mono_resume_unwind (&ctx);
    }
  finally
    {
      ctx = {CLOBBER};
    }
}


mono_arch_get_throw_exception (struct MonoTrampInfo * * info, gboolean aot)
{
  void * D.24768;

  D.24768 = get_throw_trampoline (132, 0, 0, 0, 0, "throw_exception", info, aot);
  return D.24768;
}


get_throw_trampoline (int size, gboolean corlib, gboolean rethrow, gboolean llvm, gboolean resume_unwind, const char * tramp_name, struct MonoTrampInfo * * info, gboolean aot)
{
  int code.5;
  int start.6;
  int D.24772;
  struct MonoUnwindOp * D.24773;
  struct MonoUnwindOp * D.24774;
  struct MonoUnwindOp * D.24775;
  int D.24776;
  unsigned int cfa_offset.7;
  unsigned int D.24780;
  struct MonoUnwindOp * D.24781;
  struct MonoUnwindOp * D.24782;
  int D.24783;
  int D.24784;
  unsigned int D.24785;
  unsigned int D.24791;
  unsigned int D.24792;
  unsigned int D.24793;
  int D.24794;
  int D.24795;
  unsigned int D.24796;
  int D.24797;
  int D.24798;
  int iftmp.8;
  int D.24803;
  int D.24804;
  unsigned int D.24805;
  unsigned int iftmp.9;
  unsigned int iftmp.10;
  _Bool D.24823;
  long int D.24824;
  long int D.24825;
  unsigned int D.24830;
  struct MonoTrampInfo * D.24831;
  void * D.24832;
  guint8 * start;
  guint8 * code;
  struct MonoJumpInfo * ji;
  struct GSList * unwind_ops;
  int cfa_offset;

  ji = 0B;
  unwind_ops = 0B;
  start = mono_global_codeman_reserve (size);
  code = start;
  code.5 = (int) code;
  start.6 = (int) start;
  D.24772 = code.5 - start.6;
  D.24773 = mono_create_unwind_op (D.24772, 12, 13, 0);
  unwind_ops = monoeg_g_slist_append (unwind_ops, D.24773);
  {
    arminstr_t * __ainstrp;

    __ainstrp = code;
    *__ainstrp = 3785408525;
    code = __ainstrp + 4;
  }
  {
    arminstr_t * __ainstrp;

    __ainstrp = code;
    *__ainstrp = 3912065008;
    code = __ainstrp + 4;
  }
  cfa_offset = 40;
  code.5 = (int) code;
  start.6 = (int) start;
  D.24772 = code.5 - start.6;
  D.24774 = mono_create_unwind_op (D.24772, 12, 13, cfa_offset);
  unwind_ops = monoeg_g_slist_append (unwind_ops, D.24774);
  code.5 = (int) code;
  start.6 = (int) start;
  D.24772 = code.5 - start.6;
  D.24775 = mono_create_unwind_op (D.24772, 128, 14, -4);
  unwind_ops = monoeg_g_slist_append (unwind_ops, D.24775);
  D.24776 = mono_arch_is_soft_float ();
  if (D.24776 == 0) goto <D.24777>; else goto <D.24778>;
  <D.24777>:
  {
    arminstr_t * __ainstrp;

    __ainstrp = code;
    *__ainstrp = 3796750464;
    code = __ainstrp + 4;
  }
  cfa_offset.7 = (unsigned int) cfa_offset;
  D.24780 = cfa_offset.7 + 128;
  cfa_offset = (int) D.24780;
  code.5 = (int) code;
  start.6 = (int) start;
  D.24772 = code.5 - start.6;
  D.24781 = mono_create_unwind_op (D.24772, 14, 0, cfa_offset);
  unwind_ops = monoeg_g_slist_append (unwind_ops, D.24781);
  {
    arminstr_t * __ainstrp;

    __ainstrp = code;
    *__ainstrp = 3968666400;
    code = __ainstrp + 4;
  }
  <D.24778>:
  {
    arminstr_t * __ainstrp;

    __ainstrp = code;
    *__ainstrp = 3796750344;
    code = __ainstrp + 4;
  }
  cfa_offset = cfa_offset + 8;
  code.5 = (int) code;
  start.6 = (int) start;
  D.24772 = code.5 - start.6;
  D.24782 = mono_create_unwind_op (D.24772, 14, 0, cfa_offset);
  unwind_ops = monoeg_g_slist_append (unwind_ops, D.24782);
  {
    arminstr_t * __ainstrp;

    __ainstrp = code;
    D.24783 = cfa_offset & 255;
    D.24784 = D.24783 | -494067712;
    D.24785 = (unsigned int) D.24784;
    *__ainstrp = D.24785;
    code = __ainstrp + 4;
  }
  if (corlib != 0) goto <D.24786>; else goto <D.24787>;
  <D.24786>:
  if (llvm != 0) goto <D.24788>; else goto <D.24789>;
  <D.24788>:
  {
    arminstr_t * __ainstrp;

    __ainstrp = code;
    *__ainstrp = 3800109060;
    code = __ainstrp + 4;
  }
  <D.24789>:
  goto <D.24790>;
  <D.24787>:
  {
    arminstr_t * __ainstrp;

    __ainstrp = code;
    *__ainstrp = 3785363470;
    code = __ainstrp + 4;
  }
  <D.24790>:
  {
    arminstr_t * __ainstrp;

    __ainstrp = code;
    cfa_offset.7 = (unsigned int) cfa_offset;
    D.24791 = cfa_offset.7 + 4294967256;
    D.24792 = D.24791 & 255;
    D.24793 = D.24792 | 3800903680;
    *__ainstrp = D.24793;
    code = __ainstrp + 4;
  }
  {
    arminstr_t * __ainstrp;

    __ainstrp = code;
    D.24794 = rethrow & 255;
    D.24795 = D.24794 | -478081024;
    D.24796 = (unsigned int) D.24795;
    *__ainstrp = D.24796;
    code = __ainstrp + 4;
  }
  {
    arminstr_t * __ainstrp;

    __ainstrp = code;
    *__ainstrp = 3800948744;
    code = __ainstrp + 4;
  }
  {
    int _imm12;

    _imm12 = 0;
    {
      arminstr_t * __ainstrp;

      __ainstrp = code;
      D.24797 = ABS_EXPR <_imm12>;
      D.24798 = D.24797 | 909312;
      if (_imm12 >= 0) goto <D.24800>; else goto <D.24801>;
      <D.24800>:
      iftmp.8 = 8388608;
      goto <D.24802>;
      <D.24801>:
      iftmp.8 = 0;
      <D.24802>:
      D.24803 = D.24798 | iftmp.8;
      D.24804 = D.24803 | -452984832;
      D.24805 = (unsigned int) D.24804;
      *__ainstrp = D.24805;
      code = __ainstrp + 4;
    }
  }
  if (aot != 0) goto <D.24806>; else goto <D.24807>;
  <D.24806>:
  {
    const char * icall_name;

    if (resume_unwind != 0) goto <D.24808>; else goto <D.24809>;
    <D.24808>:
    icall_name = "mono_arm_resume_unwind";
    goto <D.24810>;
    <D.24809>:
    if (corlib != 0) goto <D.24811>; else goto <D.24812>;
    <D.24811>:
    icall_name = "mono_arm_throw_exception_by_token";
    goto <D.24813>;
    <D.24812>:
    icall_name = "mono_arm_throw_exception";
    <D.24813>:
    <D.24810>:
    code.5 = (int) code;
    start.6 = (int) start;
    D.24772 = code.5 - start.6;
    ji = mono_patch_info_list_prepend (ji, D.24772, 32, icall_name);
    {
      arminstr_t * __ainstrp;

      __ainstrp = code;
      *__ainstrp = 3852451840;
      code = __ainstrp + 4;
    }
    {
      arminstr_t * __ainstrp;

      __ainstrp = code;
      *__ainstrp = 3925868544;
      code = __ainstrp + 4;
    }
    MEM[(void * *)code] = 0B;
    code = code + 4;
    {
      arminstr_t * __ainstrp;

      __ainstrp = code;
      *__ainstrp = 3886006284;
      code = __ainstrp + 4;
    }
  }
  goto <D.24814>;
  <D.24807>:
  if (resume_unwind == 0) goto <D.24816>; else goto <D.24817>;
  <D.24816>:
  if (corlib != 0) goto <D.24819>; else goto <D.24820>;
  <D.24819>:
  iftmp.10 = (unsigned int) mono_arm_throw_exception_by_token;
  goto <D.24821>;
  <D.24820>:
  iftmp.10 = (unsigned int) mono_arm_throw_exception;
  <D.24821>:
  iftmp.9 = iftmp.10;
  goto <D.24822>;
  <D.24817>:
  iftmp.9 = (unsigned int) mono_arm_resume_unwind;
  <D.24822>:
  code = mono_arm_emit_load_imm (code, 12, iftmp.9);
  <D.24814>:
  {
    arminstr_t * __ainstrp;

    __ainstrp = code;
    *__ainstrp = 3785416719;
    code = __ainstrp + 4;
  }
  {
    arminstr_t * __ainstrp;

    __ainstrp = code;
    *__ainstrp = 3785420812;
    code = __ainstrp + 4;
  }
  {
    arminstr_t * __ainstrp;

    __ainstrp = code;
    *__ainstrp = 3858759696;
    code = __ainstrp + 4;
  }
  code.5 = (int) code;
  start.6 = (int) start;
  D.24772 = code.5 - start.6;
  D.24823 = D.24772 >= size;
  D.24824 = (long int) D.24823;
  D.24825 = __builtin_expect (D.24824, 0);
  if (D.24825 != 0) goto <D.24826>; else goto <D.24827>;
  <D.24826>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "exceptions-arm.c", 274, "(code - start) < size");
  <D.24827>:
  code.5 = (int) code;
  start.6 = (int) start;
  D.24772 = code.5 - start.6;
  mono_arch_flush_icache (start, D.24772);
  if (info != 0B) goto <D.24828>; else goto <D.24829>;
  <D.24828>:
  code.5 = (int) code;
  start.6 = (int) start;
  D.24772 = code.5 - start.6;
  D.24830 = (unsigned int) D.24772;
  D.24831 = mono_tramp_info_create (tramp_name, start, D.24830, ji, unwind_ops);
  *info = D.24831;
  <D.24829>:
  D.24832 = start;
  return D.24832;
}


mono_arch_get_rethrow_exception (struct MonoTrampInfo * * info, gboolean aot)
{
  void * D.24834;

  D.24834 = get_throw_trampoline (132, 0, 1, 0, 0, "rethrow_exception", info, aot);
  return D.24834;
}


mono_arch_get_throw_corlib_exception (struct MonoTrampInfo * * info, gboolean aot)
{
  void * D.24836;

  D.24836 = get_throw_trampoline (168, 1, 0, 0, 0, "throw_corlib_exception", info, aot);
  return D.24836;
}


mono_arm_get_exception_trampolines (gboolean aot)
{
  struct MonoTrampInfo * info.11;
  struct GSList * D.24839;
  struct MonoTrampInfo * info;
  struct GSList * tramps;

  try
    {
      tramps = 0B;
      get_throw_trampoline (168, 1, 0, 0, 0, "llvm_throw_corlib_exception_trampoline", &info, aot);
      info.11 = info;
      tramps = monoeg_g_slist_prepend (tramps, info.11);
      get_throw_trampoline (168, 1, 0, 1, 0, "llvm_throw_corlib_exception_abs_trampoline", &info, aot);
      info.11 = info;
      tramps = monoeg_g_slist_prepend (tramps, info.11);
      get_throw_trampoline (168, 0, 0, 0, 1, "llvm_resume_unwind_trampoline", &info, aot);
      info.11 = info;
      tramps = monoeg_g_slist_prepend (tramps, info.11);
      D.24839 = tramps;
      return D.24839;
    }
  finally
    {
      info = {CLOBBER};
    }
}


mono_arch_exceptions_init ()
{
  int mono_aot_only.12;
  guint8 * D.24846;
  char * D.24847;
  gchar * D.24848;
  guint8 * tramp;
  struct GSList * tramps;
  struct GSList * l;

  mono_aot_only.12 = mono_aot_only;
  if (mono_aot_only.12 != 0) goto <D.24843>; else goto <D.24844>;
  <D.24843>:
  tramp = mono_aot_get_trampoline ("llvm_throw_corlib_exception_trampoline");
  mono_register_jit_icall (tramp, "llvm_throw_corlib_exception_trampoline", 0B, 1);
  tramp = mono_aot_get_trampoline ("llvm_throw_corlib_exception_abs_trampoline");
  mono_register_jit_icall (tramp, "llvm_throw_corlib_exception_abs_trampoline", 0B, 1);
  tramp = mono_aot_get_trampoline ("llvm_resume_unwind_trampoline");
  mono_register_jit_icall (tramp, "llvm_resume_unwind_trampoline", 0B, 1);
  goto <D.24845>;
  <D.24844>:
  tramps = mono_arm_get_exception_trampolines (0);
  l = tramps;
  goto <D.24637>;
  <D.24636>:
  {
    struct MonoTrampInfo * info;

    info = l->data;
    D.24846 = info->code;
    D.24847 = info->name;
    D.24848 = monoeg_strdup (D.24847);
    mono_register_jit_icall (D.24846, D.24848, 0B, 1);
    mono_tramp_info_register (info);
  }
  l = l->next;
  <D.24637>:
  if (l != 0B) goto <D.24636>; else goto <D.24638>;
  <D.24638>:
  monoeg_g_slist_free (tramps);
  <D.24845>:
}


monoeg_strdup (const gchar * str)
{
  gchar * D.24851;

  if (str != 0B) goto <D.24849>; else goto <D.24850>;
  <D.24849>:
  D.24851 = __strdup (str);
  return D.24851;
  <D.24850>:
  D.24851 = 0B;
  return D.24851;
}


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.24853;
  unsigned char D.24856;
  unsigned char D.24857;
  unsigned int D.24861;
  int D.24862;
  unsigned int unwind_info_len.13;
  void * D.24864;
  int D.24865;
  sizetype D.24866;
  guint8 * D.24867;
  int D.24868;
  int D.24869;
  guint8 * cfa.14;
  int cfa.15;
  struct MonoLMF * D.24872;
  int D.24875;
  void * D.24876;
  int D.24877;
  void * D.24878;
  void * D.24881;
  unsigned int D.24882;
  unsigned int D.24883;
  struct MonoLMF * D.24884;
  int D.24885;
  int D.24886;
  int D.24887;
  gboolean D.24888;
  unsigned int D.24891;
  int D.24894;
  _Bool D.24895;
  long int D.24896;
  long int D.24897;
  struct MonoContext * D.24900;
  int D.24901;
  char * D.24902;
  struct MonoMethod * D.24906;
  mgreg_t * D.24909;
  mgreg_t * D.24910;
  int D.24911;
  void * ip;

  D.24853 = ctx->pc;
  ip = (void *) D.24853;
  memset (frame, 0, 52);
  frame->ji = ji;
  *new_ctx = *ctx;
  if (ji != 0B) goto <D.24854>; else goto <D.24855>;
  <D.24854>:
  {
    int i;
    gssize regs[25];
    guint8 * cfa;
    guint32 unwind_info_len;
    guint8 * unwind_info;

    try
      {
        frame->type = 0;
        D.24856 = BIT_FIELD_REF <*ji, 8, 176>;
        D.24857 = D.24856 & 16;
        if (D.24857 != 0) goto <D.24858>; else goto <D.24859>;
        <D.24858>:
        unwind_info = mono_aot_get_unwind_info (ji, &unwind_info_len);
        goto <D.24860>;
        <D.24859>:
        D.24861 = ji->used_regs;
        unwind_info = mono_get_cached_unwind_info (D.24861, &unwind_info_len);
        <D.24860>:
        i = 0;
        goto <D.24656>;
        <D.24655>:
        D.24862 = new_ctx->regs[i];
        regs[i] = D.24862;
        i = i + 1;
        <D.24656>:
        if (i <= 15) goto <D.24655>; else goto <D.24657>;
        <D.24657>:
        unwind_info_len.13 = unwind_info_len;
        D.24864 = ji->code_start;
        D.24864 = ji->code_start;
        D.24865 = ji->code_size;
        D.24866 = (sizetype) D.24865;
        D.24867 = D.24864 + D.24866;
        mono_unwind_frame (unwind_info, unwind_info_len.13, D.24864, D.24867, ip, &regs, 24, save_locations, 16, &cfa);
        i = 0;
        goto <D.24659>;
        <D.24658>:
        D.24868 = regs[i];
        new_ctx->regs[i] = D.24868;
        i = i + 1;
        <D.24659>:
        if (i <= 15) goto <D.24658>; else goto <D.24660>;
        <D.24660>:
        D.24869 = regs[14];
        new_ctx->pc = D.24869;
        cfa.14 = cfa;
        cfa.15 = (int) cfa.14;
        new_ctx->regs[13] = cfa.15;
        D.24872 = *lmf;
        if (D.24872 != 0B) goto <D.24873>; else goto <D.24874>;
        <D.24873>:
        D.24875 = ctx->regs[13];
        D.24876 = (void *) D.24875;
        D.24872 = *lmf;
        D.24877 = D.24872->sp;
        D.24878 = (void *) D.24877;
        if (D.24876 >= D.24878) goto <D.24879>; else goto <D.24880>;
        <D.24879>:
        D.24872 = *lmf;
        D.24881 = D.24872->previous_lmf;
        D.24882 = (unsigned int) D.24881;
        D.24883 = D.24882 & 4294967292;
        D.24884 = (struct MonoLMF *) D.24883;
        *lmf = D.24884;
        <D.24880>:
        <D.24874>:
        D.24885 = new_ctx->pc;
        D.24886 = D.24885 & -2;
        new_ctx->pc = D.24886;
        D.24885 = new_ctx->pc;
        D.24887 = D.24885 + -1;
        new_ctx->pc = D.24887;
        D.24888 = 1;
        return D.24888;
      }
    finally
      {
        regs = {CLOBBER};
        cfa = {CLOBBER};
        unwind_info_len = {CLOBBER};
      }
  }
  <D.24855>:
  D.24872 = *lmf;
  if (D.24872 != 0B) goto <D.24889>; else goto <D.24890>;
  <D.24889>:
  D.24872 = *lmf;
  D.24881 = D.24872->previous_lmf;
  D.24882 = (unsigned int) D.24881;
  D.24891 = D.24882 & 2;
  if (D.24891 != 0) goto <D.24892>; else goto <D.24893>;
  <D.24892>:
  {
    struct MonoLMFExt * ext;

    ext = *lmf;
    D.24894 = ext->debugger_invoke;
    D.24895 = D.24894 == 0;
    D.24896 = (long int) D.24895;
    D.24897 = __builtin_expect (D.24896, 0);
    if (D.24897 != 0) goto <D.24898>; else goto <D.24899>;
    <D.24898>:
    monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "exceptions-arm.c", 457, "ext->debugger_invoke");
    <D.24899>:
    D.24900 = &ext->ctx;
    memcpy (new_ctx, D.24900, 208);
    D.24872 = *lmf;
    D.24881 = D.24872->previous_lmf;
    D.24882 = (unsigned int) D.24881;
    D.24883 = D.24882 & 4294967292;
    D.24884 = (struct MonoLMF *) D.24883;
    *lmf = D.24884;
    frame->type = 1;
    D.24888 = 1;
    return D.24888;
  }
  <D.24893>:
  frame->type = 2;
  D.24872 = *lmf;
  D.24901 = D.24872->ip;
  D.24902 = (char *) D.24901;
  ji = mini_jit_info_table_find (domain, D.24902, 0B);
  if (ji != 0B) goto <D.24903>; else goto <D.24904>;
  <D.24903>:
  frame->ji = ji;
  goto <D.24905>;
  <D.24904>:
  D.24872 = *lmf;
  D.24906 = D.24872->method;
  if (D.24906 == 0B) goto <D.24907>; else goto <D.24908>;
  <D.24907>:
  D.24888 = 0;
  return D.24888;
  <D.24908>:
  D.24872 = *lmf;
  D.24906 = D.24872->method;
  frame->method = D.24906;
  <D.24905>:
  D.24909 = &new_ctx->regs[0];
  D.24872 = *lmf;
  D.24910 = &D.24872->iregs[0];
  memcpy (D.24909, D.24910, 52);
  D.24872 = *lmf;
  D.24901 = D.24872->ip;
  new_ctx->pc = D.24901;
  D.24872 = *lmf;
  D.24877 = D.24872->sp;
  new_ctx->regs[13] = D.24877;
  D.24872 = *lmf;
  D.24911 = D.24872->fp;
  new_ctx->regs[11] = D.24911;
  D.24885 = new_ctx->pc;
  D.24886 = D.24885 & -2;
  new_ctx->pc = D.24886;
  D.24885 = new_ctx->pc;
  D.24887 = D.24885 + -1;
  new_ctx->pc = D.24887;
  D.24872 = *lmf;
  D.24881 = D.24872->previous_lmf;
  D.24882 = (unsigned int) D.24881;
  D.24883 = D.24882 & 4294967292;
  D.24884 = (struct MonoLMF *) D.24883;
  *lmf = D.24884;
  D.24888 = 1;
  return D.24888;
  <D.24890>:
  D.24888 = 0;
  return D.24888;
}


memset (void * __dest, int __ch, size_t __len)
{
  int D.24916;
  int D.24921;
  void * D.24923;
  unsigned int D.24924;

  D.24916 = __builtin_constant_p (__len);
  if (D.24916 != 0) goto <D.24917>; else goto <D.24918>;
  <D.24917>:
  if (__len == 0) goto <D.24919>; else goto <D.24920>;
  <D.24919>:
  D.24921 = __builtin_constant_p (__ch);
  if (D.24921 == 0) goto <D.24914>; else goto <D.24922>;
  <D.24922>:
  if (__ch != 0) goto <D.24914>; else goto <D.24915>;
  <D.24914>:
  __warn_memset_zero_len ();
  D.24923 = __dest;
  return D.24923;
  <D.24915>:
  <D.24920>:
  <D.24918>:
  D.24924 = __builtin_object_size (__dest, 0);
  D.24923 = __builtin___memset_chk (__dest, __ch, __len, D.24924);
  return D.24923;
}


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 * ctx)
{
  mono_monoctx_to_sigctx (mctx, ctx);
}


mono_arch_handle_exception (void * ctx, void * obj)
{
  unsigned int mono_jit_tls_id.16;
  long unsigned int D.24927;
  struct MonoContext * D.24928;
  long unsigned int obj.17;
  long unsigned int D.24930;
  void * D.24931;
  long unsigned int D.24932;
  long unsigned int D.24933;
  unsigned int D.24934;
  long unsigned int D.24937;
  long unsigned int D.24938;
  long unsigned int D.24940;
  gboolean D.24941;
  struct arm_ucontext * sigctx;
  struct MonoJitTlsData * jit_tls;
  guint64 sp;

  sigctx = ctx;
  mono_jit_tls_id.16 = mono_jit_tls_id;
  jit_tls = pthread_getspecific (mono_jit_tls_id.16);
  D.24927 = sigctx->sig_ctx.arm_sp;
  sp = (guint64) D.24927;
  D.24928 = &jit_tls->ex_ctx;
  mono_arch_sigctx_to_monoctx (sigctx, D.24928);
  obj.17 = (long unsigned int) obj;
  sigctx->sig_ctx.arm_r0 = obj.17;
  sp = sp + 18446744073709551600;
  D.24930 = (long unsigned int) sp;
  sigctx->sig_ctx.arm_sp = D.24930;
  D.24931 = get_handle_signal_exception_addr ();
  D.24932 = (long unsigned int) D.24931;
  sigctx->sig_ctx.arm_pc = D.24932;
  D.24933 = sigctx->sig_ctx.arm_pc;
  D.24934 = D.24933 & 1;
  if (D.24934 != 0) goto <D.24935>; else goto <D.24936>;
  <D.24935>:
  D.24937 = sigctx->sig_ctx.arm_cpsr;
  D.24938 = D.24937 | 32;
  sigctx->sig_ctx.arm_cpsr = D.24938;
  goto <D.24939>;
  <D.24936>:
  D.24937 = sigctx->sig_ctx.arm_cpsr;
  D.24940 = D.24937 & 4294967263;
  sigctx->sig_ctx.arm_cpsr = D.24940;
  <D.24939>:
  D.24941 = 1;
  return D.24941;
}


get_handle_signal_exception_addr ()
{
  void * D.24943;

  D.24943 = handle_signal_exception;
  return D.24943;
}


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

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


mono_arch_ip_from_context (void * sigctx)
{
  void * D.24947;
  long unsigned int D.24948;
  struct arm_ucontext * my_uc;

  my_uc = sigctx;
  D.24948 = my_uc->sig_ctx.arm_pc;
  D.24947 = (void *) D.24948;
  return D.24947;
}


mono_arch_setup_async_callback (struct MonoContext * ctx, void (*<Tc1>) (void *) async_cb, void * user_data)
{
  _Bool D.24950;
  long int D.24951;
  long int D.24952;
  int async_cb.19;
  mgreg_t sp;

  sp = ctx->regs[13];
  D.24950 = user_data != 0B;
  D.24951 = (long int) D.24950;
  D.24952 = __builtin_expect (D.24951, 0);
  if (D.24952 != 0) goto <D.24953>; else goto <D.24954>;
  <D.24953>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "exceptions-arm.c", 622, "!user_data");
  <D.24954>:
  sp = sp + -16;
  ctx->regs[13] = sp;
  async_cb.19 = (int) async_cb;
  ctx->pc = async_cb.19;
}


mono_arch_setup_resume_sighandler_ctx (struct MonoContext * ctx, void * func)
{
  int func.20;
  int D.24957;
  int D.24958;
  int D.24961;
  int D.24962;
  int D.24964;

  func.20 = (int) func;
  ctx->pc = func.20;
  D.24957 = ctx->pc;
  D.24958 = D.24957 & 1;
  if (D.24958 != 0) goto <D.24959>; else goto <D.24960>;
  <D.24959>:
  D.24961 = ctx->cpsr;
  D.24962 = D.24961 | 32;
  ctx->cpsr = D.24962;
  goto <D.24963>;
  <D.24960>:
  D.24961 = ctx->cpsr;
  D.24964 = D.24961 & -33;
  ctx->cpsr = D.24964;
  <D.24963>:
}


