1 /* Copyright (C) 2009 Matthew Fluet.
2 * Copyright (C) 2000-2007 Henry Cejtin, Matthew Fluet, Suresh
3 * Jagannathan, and Stephen Weeks.
5 * MLton is released under a BSD-style license.
6 * See the file MLton-LICENSE for details.
12 #include "common-main.h"
15 PRIVATE Word32 applyFFTempFun
;
16 PRIVATE Word32 applyFFTempArg
;
17 PRIVATE Word32 checkTemp
;
18 PRIVATE Word32 cReturnTemp
[16];
19 PRIVATE Pointer c_stackP
;
20 PRIVATE Word32 divTemp
;
21 PRIVATE Word32 fildTemp
;
22 PRIVATE Word32 fpswTemp
;
23 PRIVATE Word32 indexTemp
;
24 PRIVATE Word32 raTemp1
;
25 PRIVATE Real64 raTemp2
;
26 PRIVATE Real64 realTemp1D
;
27 PRIVATE Real64 realTemp2D
;
28 PRIVATE Real64 realTemp3D
;
29 PRIVATE Real32 realTemp1S
;
30 PRIVATE Real32 realTemp2S
;
31 PRIVATE Real32 realTemp3S
;
32 PRIVATE Word32 spill
[16];
33 PRIVATE Word32 stackTopTemp
;
34 PRIVATE Word8 wordTemp1B
;
35 PRIVATE Word16 wordTemp1W
;
36 PRIVATE Word32 wordTemp1L
;
38 #ifndef DEBUG_X86CODEGEN
39 #define DEBUG_X86CODEGEN FALSE
42 static GC_frameIndex
returnAddressToFrameIndex (GC_returnAddress ra
) {
43 return *((GC_frameIndex
*)(ra
- sizeof(GC_frameIndex
)));
46 #define MLtonCallFromC \
47 PRIVATE void MLton_jumpToSML (pointer jump); \
48 static void MLton_callFromC () { \
52 if (DEBUG_X86CODEGEN) \
53 fprintf (stderr, "MLton_callFromC() starting\n"); \
55 GC_setSavedThread (s, GC_getCurrentThread (s)); \
56 s->atomicState += 3; \
57 if (s->signalsInfo.signalIsPending) \
58 s->limit = s->limitPlusSlop - GC_HEAP_LIMIT_SLOP; \
59 /* Return to the C Handler thread. */ \
60 GC_switchToThread (s, GC_getCallFromCHandlerThread (s), 0); \
61 jump = *(pointer*)(s->stackTop - GC_RETURNADDRESS_SIZE); \
62 MLton_jumpToSML(jump); \
63 s->atomicState += 1; \
64 GC_switchToThread (s, GC_getSavedThread (s), 0); \
65 s->atomicState -= 1; \
66 if (0 == s->atomicState \
67 && s->signalsInfo.signalIsPending) \
69 if (DEBUG_X86CODEGEN) \
70 fprintf (stderr, "MLton_callFromC() done\n"); \
74 #define MLtonMain(al, mg, mfs, mmc, pk, ps, ml) \
76 PUBLIC int MLton_main (int argc, char* argv[]) { \
80 Initialize (al, mg, mfs, mmc, pk, ps); \
81 if (gcState.amOriginal) { \
83 jump = (pointer)&ml; \
85 jump = *(pointer*)(gcState.stackTop - GC_RETURNADDRESS_SIZE); \
87 MLton_jumpToSML(jump); \
91 #define MLtonLibrary(al, mg, mfs, mmc, pk, ps, ml) \
93 PUBLIC void LIB_OPEN(LIBNAME) (int argc, char* argv[]) { \
97 Initialize (al, mg, mfs, mmc, pk, ps); \
98 if (gcState.amOriginal) { \
100 jump = (pointer)&ml; \
102 jump = *(pointer*)(gcState.stackTop - GC_RETURNADDRESS_SIZE); \
104 MLton_jumpToSML(jump); \
106 PUBLIC void LIB_CLOSE(LIBNAME) () { \
108 jump = *(pointer*)(gcState.stackTop - GC_RETURNADDRESS_SIZE); \
109 MLton_jumpToSML(jump); \
113 #endif /* #ifndef _X86_MAIN_H_ */