Import Upstream version 20180207
[hcoop/debian/mlton.git] / include / x86-main.h
CommitLineData
7f918cf1
CE
1/* Copyright (C) 2009 Matthew Fluet.
2 * Copyright (C) 2000-2007 Henry Cejtin, Matthew Fluet, Suresh
3 * Jagannathan, and Stephen Weeks.
4 *
5 * MLton is released under a BSD-style license.
6 * See the file MLton-LICENSE for details.
7 */
8
9#ifndef _X86_MAIN_H_
10#define _X86_MAIN_H_
11
12#include "common-main.h"
13
14/* Globals */
15PRIVATE Word32 applyFFTempFun;
16PRIVATE Word32 applyFFTempArg;
17PRIVATE Word32 checkTemp;
18PRIVATE Word32 cReturnTemp[16];
19PRIVATE Pointer c_stackP;
20PRIVATE Word32 divTemp;
21PRIVATE Word32 fildTemp;
22PRIVATE Word32 fpswTemp;
23PRIVATE Word32 indexTemp;
24PRIVATE Word32 raTemp1;
25PRIVATE Real64 raTemp2;
26PRIVATE Real64 realTemp1D;
27PRIVATE Real64 realTemp2D;
28PRIVATE Real64 realTemp3D;
29PRIVATE Real32 realTemp1S;
30PRIVATE Real32 realTemp2S;
31PRIVATE Real32 realTemp3S;
32PRIVATE Word32 spill[16];
33PRIVATE Word32 stackTopTemp;
34PRIVATE Word8 wordTemp1B;
35PRIVATE Word16 wordTemp1W;
36PRIVATE Word32 wordTemp1L;
37
38#ifndef DEBUG_X86CODEGEN
39#define DEBUG_X86CODEGEN FALSE
40#endif
41
42static GC_frameIndex returnAddressToFrameIndex (GC_returnAddress ra) {
43 return *((GC_frameIndex*)(ra - sizeof(GC_frameIndex)));
44}
45
46#define MLtonCallFromC \
47PRIVATE void MLton_jumpToSML (pointer jump); \
48static void MLton_callFromC () { \
49 pointer jump; \
50 GC_state s; \
51 \
52 if (DEBUG_X86CODEGEN) \
53 fprintf (stderr, "MLton_callFromC() starting\n"); \
54 s = &gcState; \
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) \
68 s->limit = 0; \
69 if (DEBUG_X86CODEGEN) \
70 fprintf (stderr, "MLton_callFromC() done\n"); \
71 return; \
72}
73
74#define MLtonMain(al, mg, mfs, mmc, pk, ps, ml) \
75MLtonCallFromC \
76PUBLIC int MLton_main (int argc, char* argv[]) { \
77 pointer jump; \
78 extern pointer ml; \
79 \
80 Initialize (al, mg, mfs, mmc, pk, ps); \
81 if (gcState.amOriginal) { \
82 real_Init(); \
83 jump = (pointer)&ml; \
84 } else { \
85 jump = *(pointer*)(gcState.stackTop - GC_RETURNADDRESS_SIZE); \
86 } \
87 MLton_jumpToSML(jump); \
88 return 1; \
89}
90
91#define MLtonLibrary(al, mg, mfs, mmc, pk, ps, ml) \
92MLtonCallFromC \
93PUBLIC void LIB_OPEN(LIBNAME) (int argc, char* argv[]) { \
94 pointer jump; \
95 extern pointer ml; \
96 \
97 Initialize (al, mg, mfs, mmc, pk, ps); \
98 if (gcState.amOriginal) { \
99 real_Init(); \
100 jump = (pointer)&ml; \
101 } else { \
102 jump = *(pointer*)(gcState.stackTop - GC_RETURNADDRESS_SIZE); \
103 } \
104 MLton_jumpToSML(jump); \
105} \
106PUBLIC void LIB_CLOSE(LIBNAME) () { \
107 pointer jump; \
108 jump = *(pointer*)(gcState.stackTop - GC_RETURNADDRESS_SIZE); \
109 MLton_jumpToSML(jump); \
110 GC_done(&gcState); \
111}
112
113#endif /* #ifndef _X86_MAIN_H_ */