| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | #include "asm.h" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-10-13 00:57:24 -04:00
										 |  |  | /* Note that the XT is passed to the quotation in r12 */ | 
					
						
							|  |  |  | #define CALL_QUOT \ | 
					
						
							|  |  |  |         ldr r12,[r0, #9]     /* load quotation-xt slot */ ; \
 | 
					
						
							| 
									
										
										
										
											2007-10-13 17:57:29 -04:00
										 |  |  | 	mov lr,pc ; \
 | 
					
						
							|  |  |  |         mov pc,r12 | 
					
						
							| 
									
										
										
										
											2007-10-13 00:57:24 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | #define JUMP_QUOT \ | 
					
						
							| 
									
										
										
										
											2007-10-13 17:57:29 -04:00
										 |  |  |         ldr r12,[r0, #9]     /* load quotation-xt slot */ ; \
 | 
					
						
							|  |  |  | 	mov pc,r12 | 
					
						
							| 
									
										
										
										
											2007-10-13 00:57:24 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | #define SAVED_REGS_SIZE 32 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define FRAME (RESERVED_SIZE + SAVED_REGS_SIZE + 8) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-10-13 17:57:29 -04:00
										 |  |  | #define LR_SAVE [sp, #-4] | 
					
						
							| 
									
										
										
										
											2007-10-13 00:57:24 -04:00
										 |  |  | #define RESERVED_SIZE 8 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define SAVE_LR str lr,LR_SAVE | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define LOAD_LR ldr lr,LR_SAVE | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define SAVE_AT(offset) (RESERVED_SIZE + 4 * offset) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define SAVE(register,offset) str register,[sp, #SAVE_AT(offset)] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define RESTORE(register,offset) ldr register,[sp, #SAVE_AT(offset)] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define PROLOGUE \ | 
					
						
							| 
									
										
										
										
											2007-10-13 17:57:29 -04:00
										 |  |  | 	SAVE_LR ; \
 | 
					
						
							|  |  |  | 	sub sp,sp,#FRAME | 
					
						
							| 
									
										
										
										
											2007-10-13 00:57:24 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | #define EPILOGUE \ | 
					
						
							| 
									
										
										
										
											2007-10-13 17:57:29 -04:00
										 |  |  | 	add sp,sp,#FRAME ; \ | 
					
						
							|  |  |  | 	LOAD_LR | 
					
						
							| 
									
										
										
										
											2007-10-13 00:57:24 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | DEF(void,c_to_factor,(CELL quot)): | 
					
						
							|  |  |  |         PROLOGUE | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	SAVE(r4,0)           /* save GPRs */ | 
					
						
							|  |  |  |                              /* don't save ds pointer */ | 
					
						
							|  |  |  |                              /* don't save rs pointer */ | 
					
						
							|  |  |  |         SAVE(r7,3) | 
					
						
							|  |  |  |         SAVE(r8,4) | 
					
						
							|  |  |  |         SAVE(r9,5) | 
					
						
							|  |  |  |         SAVE(r10,6) | 
					
						
							|  |  |  |         SAVE(r11,7) | 
					
						
							|  |  |  | 	SAVE(r0,8)           /* save quotation since we're about to mangle it */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-10-14 20:38:23 -04:00
										 |  |  |         sub r0,sp,#4         /* pass call stack pointer as an argument */ | 
					
						
							| 
									
										
										
										
											2007-10-13 00:57:24 -04:00
										 |  |  | 	bl MANGLE(save_callstack_bottom) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	RESTORE(r0,8)        /* restore quotation */ | 
					
						
							|  |  |  |         CALL_QUOT | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         RESTORE(r11,7)       /* restore GPRs */ | 
					
						
							|  |  |  |         RESTORE(r10,6) | 
					
						
							|  |  |  |         RESTORE(r9,5) | 
					
						
							|  |  |  |         RESTORE(r8,4) | 
					
						
							|  |  |  |         RESTORE(r7,3) | 
					
						
							|  |  |  |                              /* don't restore rs pointer */ | 
					
						
							|  |  |  |                              /* don't restore ds pointer */ | 
					
						
							|  |  |  |         RESTORE(r4,0) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         EPILOGUE | 
					
						
							| 
									
										
										
										
											2007-10-13 17:57:29 -04:00
										 |  |  |         mov pc,lr | 
					
						
							| 
									
										
										
										
											2007-10-13 00:57:24 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-10-13 17:57:29 -04:00
										 |  |  | /* The JIT compiles an 'mov r1',sp in front of every primitive call, since a | 
					
						
							| 
									
										
										
										
											2007-10-13 00:57:24 -04:00
										 |  |  | word which was defined as a primitive will not change its definition for the | 
					
						
							|  |  |  | lifetime of the image -- adding new primitives requires a bootstrap. However, | 
					
						
							|  |  |  | an undefined word can certainly become defined, | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | DEFER: foo | 
					
						
							|  |  |  | ... | 
					
						
							|  |  |  | : foo ... ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | And calls to non-primitives do not have this one-instruction prologue, so we | 
					
						
							|  |  |  | set the XT of undefined words to this symbol. */ | 
					
						
							|  |  |  | DEF(void,undefined,(CELL word)): | 
					
						
							| 
									
										
										
										
											2007-10-14 20:38:23 -04:00
										 |  |  | 	sub r1,sp,#4 | 
					
						
							| 
									
										
										
										
											2007-10-13 00:57:24 -04:00
										 |  |  | 	b MANGLE(undefined_error) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Here we have two entry points. The first one is taken when profiling is | 
					
						
							|  |  |  | enabled */ | 
					
						
							|  |  |  | DEF(void,docol_profiling,(CELL word)): | 
					
						
							|  |  |  |         ldr r1,[r0, #25]     /* load profile-count slot */ | 
					
						
							|  |  |  |         add r1,r1,#8         /* increment count */ | 
					
						
							|  |  |  |         str r1,[r0, #25]     /* store profile-count slot */ | 
					
						
							|  |  |  | DEF(void,docol,(CELL word)): | 
					
						
							|  |  |  |         ldr r0,[r0, #13]     /* load word-def slot */ | 
					
						
							|  |  |  |         JUMP_QUOT | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-10-13 17:57:29 -04:00
										 |  |  | /* We must pass the XT to the quotation in r12. */ | 
					
						
							| 
									
										
										
										
											2007-10-13 00:57:24 -04:00
										 |  |  | DEF(void,primitive_call,(void)): | 
					
						
							| 
									
										
										
										
											2007-10-13 17:57:29 -04:00
										 |  |  |         ldr r0,[r5], #-4     /* load quotation from data stack */ | 
					
						
							| 
									
										
										
										
											2007-10-13 00:57:24 -04:00
										 |  |  |         JUMP_QUOT | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* We must preserve r1 here in case we're calling a primitive */ | 
					
						
							|  |  |  | DEF(void,primitive_execute,(void)): | 
					
						
							| 
									
										
										
										
											2007-10-13 17:57:29 -04:00
										 |  |  |         ldr r0,[r5], #-4     /* load word from data stack */ | 
					
						
							| 
									
										
										
										
											2007-10-13 00:57:24 -04:00
										 |  |  |         ldr pc,[r0, #29]     /* jump to word-xt */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | DEF(void,set_callstack,(F_STACK_FRAME *to, F_STACK_FRAME *from, CELL length)): | 
					
						
							| 
									
										
										
										
											2007-10-13 17:57:29 -04:00
										 |  |  |         sub sp,r0,r2         /* compute new stack pointer */ | 
					
						
							|  |  |  |         mov r0,sp            /* start of destination of memcpy() */ | 
					
						
							|  |  |  | 	sub sp,sp,#12        /* alignment */ | 
					
						
							|  |  |  |         bl MANGLE(memcpy)    /* go */ | 
					
						
							|  |  |  | 	add sp,sp,#16        /* point SP at innermost frame */ | 
					
						
							|  |  |  |         ldr pc,LR_SAVE       /* return */ | 
					
						
							| 
									
										
										
										
											2007-10-13 00:57:24 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | DEF(void,throw_impl,(CELL quot, F_STACK_FRAME *rewind_to)): | 
					
						
							| 
									
										
										
										
											2007-10-15 19:59:35 -04:00
										 |  |  | 	add sp,r1,#4         /* compute new stack pointer */ | 
					
						
							| 
									
										
										
										
											2007-10-13 17:57:29 -04:00
										 |  |  | 	ldr lr,LR_SAVE       /* we have rewound the stack; load return address */
 | 
					
						
							|  |  |  | 	JUMP_QUOT            /* call the quotation */ | 
					
						
							| 
									
										
										
										
											2007-10-13 00:57:24 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | DEF(void,lazy_jit_compile,(CELL quot)): | 
					
						
							| 
									
										
										
										
											2007-10-13 17:57:29 -04:00
										 |  |  | 	mov r1,sp            /* save stack pointer */ | 
					
						
							| 
									
										
										
										
											2007-10-13 00:57:24 -04:00
										 |  |  | 	PROLOGUE | 
					
						
							| 
									
										
										
										
											2008-11-24 16:59:27 -05:00
										 |  |  | 	bl MANGLE(lazy_jit_compile_impl) | 
					
						
							| 
									
										
										
										
											2007-10-13 00:57:24 -04:00
										 |  |  | 	EPILOGUE | 
					
						
							| 
									
										
										
										
											2007-10-13 17:57:29 -04:00
										 |  |  |         JUMP_QUOT            /* call the quotation */ | 
					
						
							| 
									
										
										
										
											2007-11-04 23:18:05 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | #ifdef WINCE | 
					
						
							|  |  |  | 	.section .drectve | 
					
						
							|  |  |  | 	.ascii " -export:c_to_factor" | 
					
						
							|  |  |  | #endif |