Commit d51dabf0 authored by Raymond Toy's avatar Raymond Toy
Browse files

Fix #86: Make cmucl work with gcc 8.1.1 and later

In alloc(), save the fpu state on entry to the function and restore it
just before returning.  

While we're at it, use the __attribute__ option to get a 16-byte
aligned area where we can save the fpu state.

And also set optimization to -O2 for linux.
parent 38372fd9
Pipeline #1783 failed with stage
in 8 minutes and 43 seconds
...@@ -3,7 +3,7 @@ include Config.x86_common ...@@ -3,7 +3,7 @@ include Config.x86_common
# gcc 8.1.1 and 8.3.1 (and probably anything after 8.1.1?) won't # gcc 8.1.1 and 8.3.1 (and probably anything after 8.1.1?) won't
# produce a working lisp with -O2. Just use -O1. # produce a working lisp with -O2. Just use -O1.
COPT = -O1 COPT = -O2
CFLAGS += $(COPT) CFLAGS += $(COPT)
CPPFLAGS += -m32 -D__NO_CTYPE -D_GNU_SOURCE CPPFLAGS += -m32 -D__NO_CTYPE -D_GNU_SOURCE
CFLAGS += -rdynamic -march=pentium4 -mfpmath=sse -mtune=generic CFLAGS += -rdynamic -march=pentium4 -mfpmath=sse -mtune=generic
......
...@@ -8412,9 +8412,24 @@ gencgc_pickup_dynamic(void) ...@@ -8412,9 +8412,24 @@ gencgc_pickup_dynamic(void)
void do_pending_interrupt(void); void do_pending_interrupt(void);
//#pragma GCC optimize ("-O1")
char * char *
alloc(int nbytes) alloc(int nbytes)
{ {
#if 0 && (defined(i386) || defined(__x86_64))
/*
* Need to save and restore the FPU registers on x86, but only for
* sse2. See Ticket #61.
*
* Not needed by sparc or ppc because we never call alloc from
* Lisp directly to do allocation.
*/
FPU_STATE(fpu_state);
if (fpu_mode == SSE2) {
save_fpu_state(fpu_state);
}
#endif
void *new_obj; void *new_obj;
#if !(defined(sparc) || (defined(DARWIN) && defined(__ppc__))) #if !(defined(sparc) || (defined(DARWIN) && defined(__ppc__)))
/* /*
...@@ -8442,19 +8457,19 @@ alloc(int nbytes) ...@@ -8442,19 +8457,19 @@ alloc(int nbytes)
set_current_region_free((lispobj) new_free_pointer); set_current_region_free((lispobj) new_free_pointer);
break; break;
} else if (bytes_allocated <= auto_gc_trigger) { } else if (bytes_allocated <= auto_gc_trigger) {
#if defined(i386) || defined(__x86_64) #if 1 && (defined(i386) || defined(__x86_64))
/* /*
* Need to save and restore the FPU registers on x86, but only for * Need to save and restore the FPU registers on x86, but only for
* sse2. See Ticket #61. * sse2. See Ticket #61.
* *
* Not needed by sparc or ppc because we never call alloc from * Not needed by sparc or ppc because we never call alloc from
* Lisp directly to do allocation. * Lisp directly to do allocation.
*/ */
FPU_STATE(fpu_state); FPU_STATE(fpu_state);
if (fpu_mode == SSE2) { if (fpu_mode == SSE2) {
save_fpu_state(fpu_state); save_fpu_state(fpu_state);
} }
#endif #endif
/* Call gc_alloc. */ /* Call gc_alloc. */
boxed_region.free_pointer = (void *) get_current_region_free(); boxed_region.free_pointer = (void *) get_current_region_free();
...@@ -8466,10 +8481,10 @@ alloc(int nbytes) ...@@ -8466,10 +8481,10 @@ alloc(int nbytes)
set_current_region_free((lispobj) boxed_region.free_pointer); set_current_region_free((lispobj) boxed_region.free_pointer);
set_current_region_end((lispobj) boxed_region.end_addr); set_current_region_end((lispobj) boxed_region.end_addr);
#if defined(i386) || defined(__x86_64) #if 1 && (defined(i386) || defined(__x86_64))
if (fpu_mode == SSE2) { if (fpu_mode == SSE2) {
restore_fpu_state(fpu_state); restore_fpu_state(fpu_state);
} }
#endif #endif
break; break;
} else { } else {
...@@ -8484,8 +8499,14 @@ alloc(int nbytes) ...@@ -8484,8 +8499,14 @@ alloc(int nbytes)
} }
} }
#if 0 && (defined(i386) || defined(__x86_64))
if (fpu_mode == SSE2) {
restore_fpu_state(fpu_state);
}
#endif
return new_obj; return new_obj;
} }
#pragma GCC optimize ("-O2")
char * char *
alloc_pseudo_atomic(int nbytes) alloc_pseudo_atomic(int nbytes)
...@@ -8545,6 +8566,7 @@ component_ptr_from_pc(lispobj * pc) ...@@ -8545,6 +8566,7 @@ component_ptr_from_pc(lispobj * pc)
return NULL; return NULL;
} }
#pragma GCC optimize ("-O1")
/* /*
* Get lower and upper(middle) 28 bits of total allocation * Get lower and upper(middle) 28 bits of total allocation
*/ */
......
...@@ -21,12 +21,12 @@ extern boolean os_support_sse2(void); ...@@ -21,12 +21,12 @@ extern boolean os_support_sse2(void);
* 512+16 bytes of space and let the routine adjust the appropriate * 512+16 bytes of space and let the routine adjust the appropriate
* alignment. * alignment.
*/ */
#define SSE_STATE_SIZE ((512+16)/4) #define SSE_STATE_SIZE 512
/* /*
* Just use the SSE size for both x87 and sse2 since the SSE size is * Just use the SSE size for both x87 and sse2 since the SSE size is
* enough for either. * enough for either.
*/ */
#define FPU_STATE(name) int name[SSE_STATE_SIZE]; #define FPU_STATE(name) u_int8_t name[SSE_STATE_SIZE] __attribute__((aligned(16)))
#endif #endif
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment