1 /* { dg-do compile } */
4 typedef unsigned char uint8_t;
5 typedef unsigned long int uintptr_t;
6 typedef uint8_t scm_t_uint8
;
7 typedef int32_t scm_t_int32
;
8 typedef uintptr_t scm_t_uintptr
;
9 typedef scm_t_uintptr scm_t_bits
;
10 typedef struct scm_unused_struct
{
13 scm_tc8_flag
= 4 + 0x00, scm_tc8_char
= 4 + 0x08, scm_tc8_unused_0
= 4 + 0x10, scm_tc8_unused_1
= 4 + 0x18 };
14 struct __jmp_buf_tag
{
16 typedef struct __jmp_buf_tag
jmp_buf[1];
17 typedef struct scm_t_cell
{
19 struct scm_prompt_registers
{
23 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
, };
24 typedef SCM (*scm_t_vm_engine
) (SCM vm
, SCM program
, SCM
*argv
, int nargs
);
32 static SCM
vm_regular_engine (SCM vm
, SCM program
, SCM
*argv
, int nargs
) {
34 static SCM
vm_debug_engine (SCM vm
, SCM program
, SCM
*argv
, int nargs
) {
35 register scm_t_uint8
*ip
;
38 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))]))))));
39 static const void **jump_table_pointer
= ((void *)0);
40 const void **jump_table
;
41 if (__builtin_expect ((!jump_table_pointer
), 0)) {
42 jump_table_pointer
[0] = &&l_nop
;
51 while (old_sp
< sp
) *++old_sp
= ((SCM
) ((((((9)) << 8) + scm_tc8_flag
))));
54 { 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
); } };
59 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
))) {
60 { ip
= vp
->ip
; sp
= vp
->sp
; fp
= vp
->fp
; };
61 { { 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)]; };
64 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
); } ;
68 static const scm_t_vm_engine vm_engines
[] = {
69 vm_regular_engine
, vm_debug_engine
};
70 SCM
scm_c_vm_run (SCM vm
, SCM program
, SCM
*argv
, int nargs
) {
71 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))]))))));
72 return vm_engines
[vp
->engine
](vm
, program
, argv
, nargs
);