| 
									
										
										
										
											2007-09-21 22:56:01 -04:00
										 |  |  | #include "asm.h" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define STACK_REG %rsp | 
					
						
							|  |  |  | #define DS_REG %r14 | 
					
						
							| 
									
										
										
										
											2007-09-26 00:34:37 -04:00
										 |  |  | #define RETURN_REG %rax | 
					
						
							| 
									
										
										
										
											2007-09-21 22:56:01 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | #define CELL_SIZE 8 | 
					
						
							| 
									
										
										
										
											2008-11-07 21:33:32 -05:00
										 |  |  | #define STACK_PADDING 56 | 
					
						
							| 
									
										
										
										
											2007-09-21 22:56:01 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-11-08 21:32:23 -05:00
										 |  |  | #define NV_TEMP_REG %rbp | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-11-26 05:22:39 -05:00
										 |  |  | #define ARITH_TEMP_1 %r8 | 
					
						
							|  |  |  | #define ARITH_TEMP_2 %r9 | 
					
						
							|  |  |  | #define DIV_RESULT %rax | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-11-07 21:33:32 -05:00
										 |  |  | #ifdef WINDOWS | 
					
						
							| 
									
										
										
										
											2007-09-21 22:56:01 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-11-07 21:33:32 -05:00
										 |  |  | 	#define ARG0 %rcx | 
					
						
							|  |  |  | 	#define ARG1 %rdx | 
					
						
							|  |  |  | 	#define ARG2 %r8 | 
					
						
							|  |  |  | 	#define ARG3 %r9 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	#define PUSH_NONVOLATILE \ | 
					
						
							|  |  |  | 		push %r12 ; \
 | 
					
						
							|  |  |  | 		push %r13 ; \
 | 
					
						
							|  |  |  | 		push %rdi ; \
 | 
					
						
							|  |  |  | 		push %rsi ; \
 | 
					
						
							|  |  |  | 		push %rbx ; \
 | 
					
						
							| 
									
										
										
										
											2008-11-08 21:32:23 -05:00
										 |  |  | 		push %rbp ; \
 | 
					
						
							| 
									
										
										
										
											2008-11-07 21:33:32 -05:00
										 |  |  | 		push %rbp | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	#define POP_NONVOLATILE \ | 
					
						
							| 
									
										
										
										
											2008-11-08 21:32:23 -05:00
										 |  |  | 		pop %rbp ; \
 | 
					
						
							| 
									
										
										
										
											2008-11-07 21:33:32 -05:00
										 |  |  | 		pop %rbp ; \
 | 
					
						
							|  |  |  | 		pop %rbx ; \
 | 
					
						
							|  |  |  | 		pop %rsi ; \
 | 
					
						
							|  |  |  | 		pop %rdi ; \
 | 
					
						
							|  |  |  | 		pop %r13 ; \
 | 
					
						
							|  |  |  | 		pop %r12 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #else | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	#define ARG0 %rdi | 
					
						
							|  |  |  | 	#define ARG1 %rsi | 
					
						
							|  |  |  | 	#define ARG2 %rdx | 
					
						
							|  |  |  | 	#define ARG3 %rcx | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	#define PUSH_NONVOLATILE \ | 
					
						
							|  |  |  | 		push %rbx ; \
 | 
					
						
							|  |  |  | 		push %rbp ; \
 | 
					
						
							|  |  |  | 		push %r12 ; \
 | 
					
						
							| 
									
										
										
										
											2008-11-08 21:32:23 -05:00
										 |  |  | 		push %r13 ; \
 | 
					
						
							| 
									
										
										
										
											2008-11-07 21:33:32 -05:00
										 |  |  | 		push %r13 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	#define POP_NONVOLATILE \ | 
					
						
							| 
									
										
										
										
											2008-11-08 21:32:23 -05:00
										 |  |  | 		pop %r13 ; \
 | 
					
						
							| 
									
										
										
										
											2008-11-07 21:33:32 -05:00
										 |  |  | 		pop %r13 ; \
 | 
					
						
							|  |  |  | 		pop %r12 ; \
 | 
					
						
							|  |  |  | 		pop %rbp ; \
 | 
					
						
							|  |  |  | 		pop %rbx | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #endif | 
					
						
							| 
									
										
										
										
											2007-09-21 22:56:01 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-09-26 00:34:10 -04:00
										 |  |  | #define QUOT_XT_OFFSET 21 | 
					
						
							| 
									
										
										
										
											2007-09-21 22:56:01 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-09-22 02:28:49 -04:00
										 |  |  | /* We pass a function pointer to memcpy to work around a Mac OS X | 
					
						
							| 
									
										
										
										
											2007-09-21 22:56:01 -04:00
										 |  |  | ABI limitation which would otherwise require us to do a bizzaro PC-relative | 
					
						
							|  |  |  | trampoline to retrieve the function address */ | 
					
						
							|  |  |  | DEF(void,set_callstack,(F_STACK_FRAME *to, F_STACK_FRAME *from, CELL length, void *memcpy)): | 
					
						
							| 
									
										
										
										
											2008-11-07 21:33:32 -05:00
										 |  |  | 	sub ARG2,ARG0                      /* compute new stack pointer */ | 
					
						
							|  |  |  | 	mov ARG0,%rsp | 
					
						
							|  |  |  | 	call *ARG3                         /* call memcpy */ | 
					
						
							| 
									
										
										
										
											2007-09-21 22:56:01 -04:00
										 |  |  | 	ret                                /* return _with new stack_ */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "cpu-x86.S" |