1 /* Copyright (C) 2000-2007 Henry Cejtin, Matthew Fluet, Suresh
2 * Jagannathan, and Stephen Weeks.
4 * MLton is released under a BSD-style license.
5 * See the file MLton-LICENSE for details.
11 #include "common-main.h"
14 PRIVATE Word64 applyFFTempFun
;
15 PRIVATE Word64 applyFFTempStackArg
;
16 PRIVATE Word64 applyFFTempRegArg
[6];
17 PRIVATE Real32 applyFFTempXmmsRegArgD
[8];
18 PRIVATE Real64 applyFFTempXmmsRegArgS
[8];
19 PRIVATE Word32 checkTemp
;
20 PRIVATE Word64 cReturnTemp
[16];
21 PRIVATE Pointer c_stackP
;
22 PRIVATE Word64 fpcvtTemp
;
23 PRIVATE Word32 fpeqTemp
;
24 PRIVATE Word64 divTemp
;
25 PRIVATE Word64 indexTemp
;
26 PRIVATE Word64 raTemp1
;
27 PRIVATE Word64 spill
[32];
28 PRIVATE Word64 stackTopTemp
;
30 #ifndef DEBUG_AMD64CODEGEN
31 #define DEBUG_AMD64CODEGEN FALSE
34 static GC_frameIndex
returnAddressToFrameIndex (GC_returnAddress ra
) {
35 return *((GC_frameIndex
*)(ra
- sizeof(GC_frameIndex
)));
38 #define MLtonCallFromC \
39 PRIVATE void MLton_jumpToSML (pointer jump); \
40 static void MLton_callFromC () { \
44 if (DEBUG_AMD64CODEGEN) \
45 fprintf (stderr, "MLton_callFromC() starting\n"); \
47 GC_setSavedThread (s, GC_getCurrentThread (s)); \
48 s->atomicState += 3; \
49 if (s->signalsInfo.signalIsPending) \
50 s->limit = s->limitPlusSlop - GC_HEAP_LIMIT_SLOP; \
51 /* Return to the C Handler thread. */ \
52 GC_switchToThread (s, GC_getCallFromCHandlerThread (s), 0); \
53 jump = *(pointer*)(s->stackTop - GC_RETURNADDRESS_SIZE); \
54 MLton_jumpToSML(jump); \
55 s->atomicState += 1; \
56 GC_switchToThread (s, GC_getSavedThread (s), 0); \
57 s->atomicState -= 1; \
58 if (0 == s->atomicState && s->signalsInfo.signalIsPending) \
60 if (DEBUG_AMD64CODEGEN) \
61 fprintf (stderr, "MLton_callFromC() done\n"); \
65 #define MLtonMain(al, mg, mfs, mmc, pk, ps, ml) \
67 PUBLIC int MLton_main (int argc, char* argv[]) { \
71 Initialize (al, mg, mfs, mmc, pk, ps); \
72 if (gcState.amOriginal) { \
74 jump = (pointer)&ml; \
76 jump = *(pointer*)(gcState.stackTop - GC_RETURNADDRESS_SIZE); \
78 MLton_jumpToSML(jump); \
82 #define MLtonLibrary(al, mg, mfs, mmc, pk, ps, ml) \
84 PUBLIC void LIB_OPEN(LIBNAME) (int argc, char* argv[]) { \
88 Initialize (al, mg, mfs, mmc, pk, ps); \
89 if (gcState.amOriginal) { \
91 jump = (pointer)&ml; \
93 jump = *(pointer*)(gcState.stackTop - GC_RETURNADDRESS_SIZE); \
95 MLton_jumpToSML(jump); \
97 PUBLIC void LIB_CLOSE(LIBNAME) () { \
99 jump = *(pointer*)(gcState.stackTop - GC_RETURNADDRESS_SIZE); \
100 MLton_jumpToSML(jump); \
104 #endif /* #ifndef _AMD64_MAIN_H_ */