71 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			ArmAsm
		
	
	
			
		
		
	
	
			71 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			ArmAsm
		
	
	
#define JUMP_QUOT \
 | 
						|
	mov QUOT_XT_OFFSET(ARG0),XT_REG ;     /* Load quot-xt */ \
 | 
						|
	jmp *XT_REG                           /* Jump to quot-xt */
 | 
						|
 | 
						|
DEF(F_FASTCALL void,c_to_factor,(CELL quot)):
 | 
						|
	PUSH_NONVOLATILE
 | 
						|
	push ARG0                             /* Save quot */
 | 
						|
 | 
						|
	lea -CELL_SIZE(STACK_REG),ARG0        /* Save stack pointer */
 | 
						|
	call MANGLE(save_callstack_bottom)
 | 
						|
 | 
						|
	mov (STACK_REG),ARG0                  /* Pass quot as arg 1 */
 | 
						|
	mov QUOT_XT_OFFSET(ARG0),XT_REG
 | 
						|
	call *XT_REG                          /* Call quot-xt */
 | 
						|
 | 
						|
	POP ARG0
 | 
						|
	POP_NONVOLATILE
 | 
						|
	ret
 | 
						|
 | 
						|
DEF(F_FASTCALL void,undefined,(CELL word)):
 | 
						|
	mov STACK_REG,ARG1                    /* Pass callstack pointer */
 | 
						|
	jmp MANGLE(undefined_error)           /* This throws an error */
 | 
						|
 | 
						|
DEF(F_FASTCALL void,dosym,(CELL word)):
 | 
						|
	add $CELL_SIZE,DS_REG                 /* Increment stack pointer */
 | 
						|
	mov ARG0,(DS_REG)                     /* Store word on stack */
 | 
						|
	ret
 | 
						|
 | 
						|
/* Here we have two entry points. The first one is taken when profiling is
 | 
						|
enabled */
 | 
						|
DEF(F_FASTCALL void,docol_profiling,(CELL word)):
 | 
						|
	add $8,PROFILING_OFFSET(ARG0)         /* Increment profile-count slot */
 | 
						|
DEF(F_FASTCALL void,docol,(CELL word)):
 | 
						|
	mov WORD_DEF_OFFSET(ARG0),ARG0        /* Load word-def slot */
 | 
						|
	JUMP_QUOT
 | 
						|
 | 
						|
/* We must pass the XT to the quotation in ECX. */
 | 
						|
DEF(F_FASTCALL void,primitive_call,(void)):
 | 
						|
        mov (DS_REG),ARG0                     /* Load quotation from data stack */
 | 
						|
	sub $CELL_SIZE,DS_REG                 /* Pop data stack */
 | 
						|
	JUMP_QUOT
 | 
						|
 | 
						|
/* We pass the word in EAX and the XT in ECX. Don't mess up EDX, it's the
 | 
						|
callstack top parameter to primitives. */
 | 
						|
DEF(F_FASTCALL void,primitive_execute,(void)):
 | 
						|
	mov (DS_REG),ARG0                     /* Load word from data stack */
 | 
						|
	sub $CELL_SIZE,DS_REG                 /* Pop data stack */
 | 
						|
        mov WORD_XT_OFFSET(ARG0),XT_REG       /* Load word-xt slot */
 | 
						|
	jmp *XT_REG                           /* Go */
 | 
						|
 | 
						|
DEF(F_FASTCALL void,throw_impl,(CELL quot, F_STACK_FRAME *rewind_to)):
 | 
						|
	mov ARG1,STACK_REG                    /* rewind_to */
 | 
						|
	JUMP_QUOT
 | 
						|
 | 
						|
DEF(FASTCALL void,lazy_jit_compile,(CELL quot)):
 | 
						|
	mov STACK_REG,ARG1           /* Save stack pointer */
 | 
						|
	push XT_REG                  /* Alignment */
 | 
						|
	push XT_REG
 | 
						|
	push XT_REG
 | 
						|
	call MANGLE(primitive_jit_compile)
 | 
						|
	mov RETURN_REG,ARG0          /* No-op on 32-bit */
 | 
						|
	pop XT_REG                   /* OK to clobber XT_REG here */
 | 
						|
	pop XT_REG
 | 
						|
	pop XT_REG
 | 
						|
        JUMP_QUOT                    /* Call the quotation */
 | 
						|
 | 
						|
#ifdef WINDOWS
 | 
						|
	.section .drectve
 | 
						|
	.ascii " -export:c_to_factor"
 | 
						|
#endif
 |