diff --git a/lisp/lisp.c b/lisp/lisp.c index cc83690181ee7d43bd51141c5416fc87790cca28..7e21d7a748cb2bc9dc9a17e3bc0b0b24590dfd3b 100644 --- a/lisp/lisp.c +++ b/lisp/lisp.c @@ -1,7 +1,7 @@ /* * main() entry point for a stand alone lisp image. * - * $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/lisp/lisp.c,v 1.64 2008/12/09 23:17:57 rtoy Exp $ + * $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/lisp/lisp.c,v 1.65 2008/12/22 02:59:59 rtoy Exp $ * */ @@ -398,6 +398,37 @@ fpu_mode_t fpu_mode = AUTO; /* And here be main. */ +const char* locate_core(const char* cmucllib, const char* core, const char* default_core) +{ + if (core == NULL) { + if (getenv("CMUCLCORE") == NULL) { + core = search_core(cmucllib, default_core); + } else { + core = getenv("CMUCLCORE"); + } + } + { + struct stat statbuf; + + if (stat(core, &statbuf) != 0) { + core = NULL; + } + } + return core; +} + +void core_failure(const char* core, const char** argv) +{ + + fprintf(stderr, "Cannot find core file"); + if (core != NULL) { + fprintf(stderr, ": `%s'", core); + } + fprintf(stderr, "\n"); + fprintf(stderr, "Based on lisp binary path `%s'\n", argv[0]); + exit(1); +} + int main(int argc, char *argv[], char *envp[]) { @@ -620,29 +651,29 @@ main(int argc, char *argv[], char *envp[]) /* * If no core file specified, search for it in CMUCLLIB */ - if (core == NULL) { - if (getenv("CMUCLCORE") == NULL) { - core = search_core(cmucllib, default_core); - } else { - core = getenv("CMUCLCORE"); - } - } - - /* Die if the core file doesn't exist. */ - { - struct stat statbuf; - - if (stat(core, &statbuf) != 0) { - /* Can't find it so print a message and exit */ - fprintf(stderr, "Cannot find core file"); - if (core != NULL) { - fprintf(stderr, ": `%s'", core); - } - fprintf(stderr, "\n"); - fprintf(stderr, "Based on lisp binary path `%s'\n", argv[0]); - exit(1); - } - } + { + char* found_core; + + found_core = locate_core(cmucllib, core, default_core); +#ifdef FEATURE_SSE2 + if ((found_core == NULL) && (fpu_mode == AUTO)) { + /* + * If we support SSE2 but couldn't find the SSE2 core, try + * to fall back to the x87 core. + */ + found_core = locate_core(cmucllib, core, "lisp-x87.core"); + if (found_core == NULL) { + core_failure(core, argv); + } + fprintf(stderr, "Warning: Chip supports SSE2, but could not find SSE2 core.\n"); + fprintf(stderr, " Falling back to x87 core.\n"); + } +#endif + if (!found_core) { + core_failure(core, argv); + } + core = found_core; + } #if defined FEATURE_EXECUTABLE } else { /* The "core file" is the executable. We have to save the