--- guile-1.6.4/libguile/gc_os_dep.c.amd64 2003-04-16 22:16:21.000000000 +0200 +++ guile-1.6.4/libguile/gc_os_dep.c 2003-08-28 22:06:33.000000000 +0200 @@ -205,6 +205,10 @@ typedef int GC_bool; # define I386 # define mach_type_known # endif +# if defined(LINUX) && defined(__x86_64__) +# define X86_64 +# define mach_type_known +# endif # if defined(LINUX) && (defined(__ia64__) || defined(__ia64)) # define IA64 # define mach_type_known @@ -407,6 +411,7 @@ typedef int GC_bool; /* ARM32 ==> Intel StrongARM */ /* IA64 ==> Intel IA64 */ /* (e.g. Itanium) */ + /* X86_64 ==> AMD x86-64 */ /* @@ -1247,6 +1252,44 @@ typedef int GC_bool; # endif #endif +# ifdef X86_64 +# define MACH_TYPE "X86_64" +# define ALIGNMENT 8 +# define CPP_WORDSZ 64 +# define HBLKSIZE 4096 +# define CACHE_LINE_SIZE 64 +# define USE_GENERIC_PUSH_REGS +# ifdef LINUX +# define OS_TYPE "LINUX" +# define LINUX_STACKBOTTOM +# if !defined(GC_LINUX_THREADS) || !defined(REDIRECT_MALLOC) +# define MPROTECT_VDB +# else + /* We seem to get random errors in incremental mode, */ + /* possibly because Linux threads is itself a malloc client */ + /* and can't deal with the signals. */ +# endif +# ifdef __ELF__ +# define DYNAMIC_LOADING +# ifdef UNDEFINED /* includes ro data */ + extern int _etext[]; +# define DATASTART ((ptr_t)((((word) (_etext)) + 0xfff) & ~0xfff)) +# endif +# include <features.h> +# define LINUX_DATA_START + extern int _end[]; +# define DATAEND (_end) +# else + extern int etext[]; +# define DATASTART ((ptr_t)((((word) (etext)) + 0xfff) & ~0xfff)) +# endif +# define PREFETCH(x) \ + __asm__ __volatile__ (" prefetch %0": : "m"(*(char *)(x))) +# define PREFETCH_FOR_WRITE(x) \ + __asm__ __volatile__ (" prefetchw %0": : "m"(*(char *)(x))) +# endif +# endif + #ifdef LINUX_DATA_START /* Some Linux distributions arrange to define __data_start. Some */ /* define data_start as a weak symbol. The latter is technically */