| 
									
										
										
										
											2007-09-21 22:56:01 -04:00
										 |  |  | #include "asm.h" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define ARG0 %eax | 
					
						
							|  |  |  | #define ARG1 %edx | 
					
						
							|  |  |  | #define STACK_REG %esp | 
					
						
							| 
									
										
										
										
											2007-09-22 00:44:27 -04:00
										 |  |  | #define DS_REG %esi | 
					
						
							| 
									
										
										
										
											2007-09-26 00:34:37 -04:00
										 |  |  | #define RETURN_REG %eax | 
					
						
							| 
									
										
										
										
											2007-09-21 22:56:01 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-11-08 22:06:51 -05:00
										 |  |  | #define NV_TEMP_REG %ebx | 
					
						
							| 
									
										
										
										
											2008-11-08 21:32:23 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-11-26 05:22:39 -05:00
										 |  |  | #define ARITH_TEMP_1 %ebp | 
					
						
							|  |  |  | #define ARITH_TEMP_2 %ebx | 
					
						
							|  |  |  | #define DIV_RESULT %eax | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-09-21 22:56:01 -04:00
										 |  |  | #define CELL_SIZE 4 | 
					
						
							| 
									
										
										
										
											2008-11-07 21:33:32 -05:00
										 |  |  | #define STACK_PADDING 12 | 
					
						
							| 
									
										
										
										
											2007-09-21 22:56:01 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | #define PUSH_NONVOLATILE \ | 
					
						
							| 
									
										
										
										
											2007-09-22 00:44:27 -04:00
										 |  |  | 	push %ebx ; \
 | 
					
						
							| 
									
										
										
										
											2008-11-08 21:32:23 -05:00
										 |  |  | 	push %ebp ; \
 | 
					
						
							| 
									
										
										
										
											2007-09-21 22:56:01 -04:00
										 |  |  | 	push %ebp | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define POP_NONVOLATILE \ | 
					
						
							| 
									
										
										
										
											2008-11-08 21:32:23 -05:00
										 |  |  | 	pop %ebp ; \
 | 
					
						
							| 
									
										
										
										
											2007-09-22 00:44:27 -04:00
										 |  |  | 	pop %ebp ; \
 | 
					
						
							| 
									
										
										
										
											2007-09-21 22:56:01 -04:00
										 |  |  | 	pop %ebx | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-05-12 04:09:15 -04:00
										 |  |  | #define QUOT_XT_OFFSET 12 | 
					
						
							| 
									
										
										
										
											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)): | 
					
						
							|  |  |  | 	mov 4(%esp),%ebp                   /* to */ | 
					
						
							|  |  |  | 	mov 8(%esp),%edx                   /* from */ | 
					
						
							|  |  |  | 	mov 12(%esp),%ecx                  /* length */ | 
					
						
							|  |  |  | 	mov 16(%esp),%eax                  /* memcpy */ | 
					
						
							|  |  |  | 	sub %ecx,%ebp                      /* compute new stack pointer */ | 
					
						
							|  |  |  | 	mov %ebp,%esp | 
					
						
							|  |  |  | 	push %ecx                          /* pass length */ | 
					
						
							|  |  |  | 	push %edx                          /* pass src */ | 
					
						
							|  |  |  | 	push %ebp                          /* pass dst */ | 
					
						
							|  |  |  | 	call *%eax                         /* call memcpy */ | 
					
						
							|  |  |  | 	add $12,%esp                       /* pop args from the stack */ | 
					
						
							|  |  |  | 	ret                                /* return _with new stack_ */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-10-20 06:56:39 -04:00
										 |  |  | /* cpu.x86.32 calls this */ | 
					
						
							| 
									
										
										
										
											2008-11-03 08:27:14 -05:00
										 |  |  | DEF(bool,check_sse2,(void)): | 
					
						
							| 
									
										
										
										
											2008-10-20 06:56:39 -04:00
										 |  |  | 	push %ebx | 
					
						
							| 
									
										
										
										
											2008-10-31 22:07:41 -04:00
										 |  |  | 	mov $1,%eax | 
					
						
							| 
									
										
										
										
											2008-10-20 06:56:39 -04:00
										 |  |  | 	cpuid | 
					
						
							|  |  |  | 	shr $26,%edx | 
					
						
							|  |  |  | 	and $1,%edx | 
					
						
							|  |  |  | 	pop %ebx | 
					
						
							|  |  |  | 	mov %edx,%eax | 
					
						
							|  |  |  | 	ret | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-05-07 13:33:31 -04:00
										 |  |  | DEF(void,primitive_inline_cache_miss,(void)): | 
					
						
							| 
									
										
										
										
											2009-05-06 20:22:22 -04:00
										 |  |  | 	mov (%esp),%ebx | 
					
						
							| 
									
										
										
										
											2009-05-07 13:33:31 -04:00
										 |  |  | DEF(void,primitive_inline_cache_miss_tail,(void)): | 
					
						
							| 
									
										
										
										
											2009-04-28 17:58:38 -04:00
										 |  |  | 	sub $8,%esp | 
					
						
							| 
									
										
										
										
											2009-05-06 20:22:22 -04:00
										 |  |  | 	push %ebx | 
					
						
							| 
									
										
										
										
											2009-04-28 17:58:38 -04:00
										 |  |  | 	call MANGLE(inline_cache_miss) | 
					
						
							|  |  |  | 	add $12,%esp | 
					
						
							| 
									
										
										
										
											2009-04-29 00:05:18 -04:00
										 |  |  | 	jmp *%eax | 
					
						
							| 
									
										
										
										
											2009-04-28 17:58:38 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-09-21 22:56:01 -04:00
										 |  |  | #include "cpu-x86.S" | 
					
						
							| 
									
										
										
										
											2008-11-04 01:04:18 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | #ifdef WINDOWS | 
					
						
							|  |  |  | 	.section .drectve | 
					
						
							|  |  |  | 	.ascii " -export:check_sse2" | 
					
						
							|  |  |  | #endif |