/* { dg-do compile } */
/* { dg-require-effective-target int32plus } */
/* { dg-require-effective-target label_values } */
/* { dg-require-effective-target indirect_jumps } */

typedef int int32_t;
typedef unsigned char uint8_t;
typedef unsigned long int uintptr_t;
typedef uint8_t scm_t_uint8;
typedef int32_t scm_t_int32;
typedef uintptr_t scm_t_uintptr;
typedef scm_t_uintptr scm_t_bits;
typedef struct scm_unused_struct {
} *SCM;
enum scm_tc8_tags {
    scm_tc8_flag = 4 + 0x00,   scm_tc8_char = 4 + 0x08,   scm_tc8_unused_0 = 4 + 0x10,   scm_tc8_unused_1 = 4 + 0x18 };
struct __jmp_buf_tag   {
};
typedef struct __jmp_buf_tag jmp_buf[1];
typedef struct scm_t_cell {
} scm_t_cell;
struct scm_prompt_registers {
    jmp_buf regs;
};
enum {
    SCM_VM_APPLY_HOOK,   SCM_VM_PUSH_CONTINUATION_HOOK,   SCM_VM_POP_CONTINUATION_HOOK,   SCM_VM_NEXT_HOOK,   SCM_VM_ABORT_CONTINUATION_HOOK,   SCM_VM_RESTORE_CONTINUATION_HOOK,   SCM_VM_NUM_HOOKS, };
typedef SCM (*scm_t_vm_engine) (SCM vm, SCM program, SCM *argv, int nargs);
struct scm_vm {
    scm_t_uint8 *ip;
    SCM *sp;
    SCM *fp;
    int engine;
    int trace_level;
};
static SCM vm_regular_engine (SCM vm, SCM program, SCM *argv, int nargs) {
}
void vm_dispatch_hook ();
int _setjmp ();
static SCM vm_debug_engine (SCM vm, SCM program, SCM *argv, int nargs) {
    register scm_t_uint8 *ip ;
    register SCM *sp ;
    register SCM *fp ;
    struct scm_vm *vp = ((struct scm_vm *) ((((scm_t_bits) (0? (*(SCM*)0=((((SCM *)((scm_t_cell *) (((scm_t_bits) (0? (*(SCM*)0=((((vm))))): (((vm)))))))) [((1))]))): (((SCM *)((scm_t_cell *) (((scm_t_bits) (0? (*(SCM*)0=((((vm))))): (((vm)))))))) [((1))]))))));
    static const void **jump_table_pointer = ((void *)0);
    const void **jump_table;
    if (__builtin_expect ((!jump_table_pointer), 0))     {
	jump_table_pointer[0] = &&l_nop;
    }
l_nop:
      {
	SCM *old_sp;
	scm_t_int32 n;
	old_sp = sp;
	sp = (fp - 1) + n;
	if (old_sp < sp)     {
	    while (old_sp < sp)         *++old_sp = ((SCM) ((((((9)) << 8) + scm_tc8_flag))));
	}
	  {
	      { if (__builtin_expect ((vp->trace_level > 0), 0)) { { vp->ip = ip; vp->sp = sp; vp->fp = fp; }; vm_dispatch_hook (vm, SCM_VM_NEXT_HOOK); } };
	  };
      }
      {
	SCM k, prompt;
	if ((_setjmp (((struct scm_prompt_registers*)((((scm_t_bits) (0? (*(SCM*)0=((((SCM *)((scm_t_cell *) (((scm_t_bits) (0? (*(SCM*)0=((((prompt))))): (((prompt)))))))) [((2))]))): (((SCM *)((scm_t_cell *) (((scm_t_bits) (0? (*(SCM*)0=((((prompt))))): (((prompt)))))))) [((2))]))))))->regs)))     {
	      { ip = vp->ip; sp = vp->sp; fp = vp->fp; };
	      { { if (__builtin_expect ((vp->trace_level > 0), 0)) { { vp->ip = ip; vp->sp = sp; vp->fp = fp; }; vm_dispatch_hook (vm, SCM_VM_NEXT_HOOK); } }; ; goto *jump_table[(*ip++) & ((1<<8)-1)]; };
	}

	if (__builtin_expect ((vp->trace_level > 0), 0)) { { vp->ip = ip; vp->sp = sp; vp->fp = fp; }; vm_dispatch_hook (vm, SCM_VM_NEXT_HOOK); } ;

      }
}
static const scm_t_vm_engine vm_engines[] =   {
    vm_regular_engine, vm_debug_engine };
SCM scm_c_vm_run (SCM vm, SCM program, SCM *argv, int nargs) {
    struct scm_vm *vp = ((struct scm_vm *) ((((scm_t_bits) (0? (*(SCM*)0=((((SCM *)((scm_t_cell *) (((scm_t_bits) (0? (*(SCM*)0=((((vm))))): (((vm)))))))) [((1))]))): (((SCM *)((scm_t_cell *) (((scm_t_bits) (0? (*(SCM*)0=((((vm))))): (((vm)))))))) [((1))]))))));
    return vm_engines[vp->engine](vm, program, argv, nargs);
}
