1 /* { dg-do compile } */
2 /* { dg-require-effective-target int32plus } */
3 /* { dg-require-effective-target label_values } */
4 /* { dg-require-effective-target indirect_jumps } */
7 typedef unsigned char uint8_t;
8 typedef unsigned long int uintptr_t;
9 typedef uint8_t scm_t_uint8
;
10 typedef int32_t scm_t_int32
;
11 typedef uintptr_t scm_t_uintptr
;
12 typedef scm_t_uintptr scm_t_bits
;
13 typedef struct scm_unused_struct
{
16 scm_tc8_flag
= 4 + 0x00, scm_tc8_char
= 4 + 0x08, scm_tc8_unused_0
= 4 + 0x10, scm_tc8_unused_1
= 4 + 0x18 };
17 struct __jmp_buf_tag
{
19 typedef struct __jmp_buf_tag
jmp_buf[1];
20 typedef struct scm_t_cell
{
22 struct scm_prompt_registers
{
26 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
, };
27 typedef SCM (*scm_t_vm_engine
) (SCM vm
, SCM program
, SCM
*argv
, int nargs
);
35 static SCM
vm_regular_engine (SCM vm
, SCM program
, SCM
*argv
, int nargs
) {
37 void vm_dispatch_hook ();
39 static SCM
vm_debug_engine (SCM vm
, SCM program
, SCM
*argv
, int nargs
) {
40 register scm_t_uint8
*ip
;
43 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))]))))));
44 static const void **jump_table_pointer
= ((void *)0);
45 const void **jump_table
;
46 if (__builtin_expect ((!jump_table_pointer
), 0)) {
47 jump_table_pointer
[0] = &&l_nop
;
56 while (old_sp
< sp
) *++old_sp
= ((SCM
) ((((((9)) << 8) + scm_tc8_flag
))));
59 { 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
); } };
64 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
))) {
65 { ip
= vp
->ip
; sp
= vp
->sp
; fp
= vp
->fp
; };
66 { { 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)]; };
69 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
); } ;
73 static const scm_t_vm_engine vm_engines
[] = {
74 vm_regular_engine
, vm_debug_engine
};
75 SCM
scm_c_vm_run (SCM vm
, SCM program
, SCM
*argv
, int nargs
) {
76 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))]))))));
77 return vm_engines
[vp
->engine
](vm
, program
, argv
, nargs
);