blob: e4affb2e4614f9ab9c41cf27a3c85f9db57362c5 [file] [log] [blame]
/* { 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);
}