1 /* -----------------------------------------------------------------------------
2 * $Id: StgCRun.c,v 1.4 1999/03/01 17:42:11 simonm Exp $
4 * (c) The GHC Team, 1998-1999
6 * STG-to-C glue. Some architectures have this code written in
7 * straight assembler (see StgRun.S), some in C.
9 * -------------------------------------------------------------------------- */
11 /* include Stg.h first because we want real machine regs in here: we
12 * have to get the value of R1 back from Stg land to C land intact.
24 #ifdef USE_MINIINTERPRETER
26 /* -----------------------------------------------------------------------------
27 any architecture (using miniinterpreter)
28 -------------------------------------------------------------------------- */
30 /* The static @jmp_environment@ variable allows @miniInterpret@ to
31 * communicate with @StgReturn@.
33 * Because @StgRun@ may be used recursively, we carefully
34 * save and restore the whole of @jmp_environment@.
37 #include <string.h> /* for memcpy */
39 static jmp_buf jmp_environment;
41 extern StgThreadReturnCode StgRun(StgFunPtr f)
44 /* Save jmp_environment for previous call to miniInterpret */
45 memcpy((void *) jmp_environment, (void *) save_buf, sizeof(jmp_buf));
46 if (setjmp(jmp_environment) == 0) {
49 fprintf(stderr,"Jumping to ");
53 f = (StgFunPtr) (f)();
56 /* Restore jmp_environment for previous call */
57 memcpy((void*) save_buf, (void*) jmp_environment, sizeof(jmp_buf));
59 return (StgThreadReturnCode)R1.i;
64 longjmp(jmp_environment, 1);
67 #else /* !USE_MINIINTERPRETER */
69 #ifdef LEADING_UNDERSCORE
70 #define STG_RETURN "_StgReturn"
72 #define STG_RETURN "StgReturn"
75 /* -----------------------------------------------------------------------------
77 -------------------------------------------------------------------------- */
79 #ifdef sparc_TARGET_ARCH
84 StgChar space[RESERVED_C_STACK_BYTES+sizeof(void *)];
85 register void *i7 __asm__("%i7");
86 ((void **)(space))[100] = i7;
88 __asm__ volatile (".align 4\n"
89 ".global " STG_RETURN "\n"
91 "\tld %1,%0" : "=r" (i7) : "m" (((void **)(space))[100]));
92 return (StgThreadReturnCode)R1.i;
97 /* -----------------------------------------------------------------------------
99 -------------------------------------------------------------------------- */
101 #ifdef alpha_TARGET_ARCH
106 __asm__ volatile ("stq $9,-8($30)\n\t"
107 "stq $10,-16($30)\n\t"
108 "stq $11,-24($30)\n\t"
109 "stq $12,-32($30)\n\t"
110 "stq $13,-40($30)\n\t"
111 "stq $14,-48($30)\n\t"
112 "stq $15,-56($30)\n\t"
113 "stt $f2,-64($30)\n\t"
114 "stt $f3,-72($30)\n\t"
115 "stt $f4,-80($30)\n\t"
116 "stt $f5,-88($30)\n\t"
117 "stt $f6,-96($30)\n\t"
118 "stt $f7,-104($30)\n\t"
119 "stt $f8,-112($30)\n\t"
120 "stt $f9,-120($30)\n\t"
121 "lda $30,-%0($30)" : :
122 "K" (RESERVED_C_STACK_BYTES+
123 8*sizeof(double)+8*sizeof(long)));
127 __asm__ volatile (".align 3\n"
128 ".globl " STG_RETURN "\n"
130 "lda $30,%0($30)\n\t"
132 "ldq $10,-16($30)\n\t"
133 "ldq $11,-24($30)\n\t"
134 "ldq $12,-32($30)\n\t"
135 "ldq $13,-40($30)\n\t"
136 "ldq $14,-48($30)\n\t"
137 "ldq $15,-56($30)\n\t"
138 "ldt $f2,-64($30)\n\t"
139 "ldt $f3,-72($30)\n\t"
140 "ldt $f4,-80($30)\n\t"
141 "ldt $f5,-88($30)\n\t"
142 "ldt $f6,-96($30)\n\t"
143 "ldt $f7,-104($30)\n\t"
144 "ldt $f8,-112($30)\n\t"
145 "ldt $f9,-120($30)" : :
146 "K" (RESERVED_C_STACK_BYTES+
147 8*sizeof(double)+8*sizeof(long)));
149 return (StgThreadReturnCode)R1.i;
152 #endif /* sparc_TARGET_ARCH */
154 /* -----------------------------------------------------------------------------
156 -------------------------------------------------------------------------- */
158 #ifdef hppa1_1_TARGET_ARCH
163 StgChar space[RESERVED_C_STACK_BYTES+16*sizeof(long)+10*sizeof(double)];
164 __asm__ volatile ("ldo %0(%%r30),%%r19\n"
165 "\tstw %%r3, 0(0,%%r19)\n"
166 "\tstw %%r4, 4(0,%%r19)\n"
167 "\tstw %%r5, 8(0,%%r19)\n"
168 "\tstw %%r6,12(0,%%r19)\n"
169 "\tstw %%r7,16(0,%%r19)\n"
170 "\tstw %%r8,20(0,%%r19)\n"
171 "\tstw %%r9,24(0,%%r19)\n"
172 "\tstw %%r10,28(0,%%r19)\n"
173 "\tstw %%r11,32(0,%%r19)\n"
174 "\tstw %%r12,36(0,%%r19)\n"
175 "\tstw %%r13,40(0,%%r19)\n"
176 "\tstw %%r14,44(0,%%r19)\n"
177 "\tstw %%r15,48(0,%%r19)\n"
178 "\tstw %%r16,52(0,%%r19)\n"
179 "\tstw %%r17,56(0,%%r19)\n"
180 "\tstw %%r18,60(0,%%r19)\n"
181 "\tldo 80(%%r19),%%r19\n"
182 "\tfstds %%fr12,-16(0,%%r19)\n"
183 "\tfstds %%fr13, -8(0,%%r19)\n"
184 "\tfstds %%fr14, 0(0,%%r19)\n"
185 "\tfstds %%fr15, 8(0,%%r19)\n"
186 "\tldo 32(%%r19),%%r19\n"
187 "\tfstds %%fr16,-16(0,%%r19)\n"
188 "\tfstds %%fr17, -8(0,%%r19)\n"
189 "\tfstds %%fr18, 0(0,%%r19)\n"
190 "\tfstds %%fr19, 8(0,%%r19)\n"
191 "\tldo 32(%%r19),%%r19\n"
192 "\tfstds %%fr20,-16(0,%%r19)\n"
193 "\tfstds %%fr21, -8(0,%%r19)\n" : :
194 "n" (-(116 * sizeof(long) + 10 * sizeof(double))) : "%r19"
199 __asm__ volatile (".align 4\n"
200 "\t.EXPORT " STG_RETURN ",CODE\n"
201 "\t.EXPORT " STG_RETURN ",ENTRY,PRIV_LEV=3\n"
203 /* "\tldo %0(%%r3),%%r19\n" */
204 "\tldo %0(%%r30),%%r19\n"
205 "\tldw 0(0,%%r19),%%r3\n"
206 "\tldw 4(0,%%r19),%%r4\n"
207 "\tldw 8(0,%%r19),%%r5\n"
208 "\tldw 12(0,%%r19),%%r6\n"
209 "\tldw 16(0,%%r19),%%r7\n"
210 "\tldw 20(0,%%r19),%%r8\n"
211 "\tldw 24(0,%%r19),%%r9\n"
212 "\tldw 28(0,%%r19),%%r10\n"
213 "\tldw 32(0,%%r19),%%r11\n"
214 "\tldw 36(0,%%r19),%%r12\n"
215 "\tldw 40(0,%%r19),%%r13\n"
216 "\tldw 44(0,%%r19),%%r14\n"
217 "\tldw 48(0,%%r19),%%r15\n"
218 "\tldw 52(0,%%r19),%%r16\n"
219 "\tldw 56(0,%%r19),%%r17\n"
220 "\tldw 60(0,%%r19),%%r18\n"
221 "\tldo 80(%%r19),%%r19\n"
222 "\tfldds -16(0,%%r19),%%fr12\n"
223 "\tfldds -8(0,%%r19),%%fr13\n"
224 "\tfldds 0(0,%%r19),%%fr14\n"
225 "\tfldds 8(0,%%r19),%%fr15\n"
226 "\tldo 32(%%r19),%%r19\n"
227 "\tfldds -16(0,%%r19),%%fr16\n"
228 "\tfldds -8(0,%%r19),%%fr17\n"
229 "\tfldds 0(0,%%r19),%%fr18\n"
230 "\tfldds 8(0,%%r19),%%fr19\n"
231 "\tldo 32(%%r19),%%r19\n"
232 "\tfldds -16(0,%%r19),%%fr20\n"
233 "\tfldds -8(0,%%r19),%%fr21\n" : :
234 "n" (-(116 * sizeof(long) + 10 * sizeof(double))) : "%r19"
237 return (StgThreadReturnCode)R1.i;
240 #endif /* hppa1_1_TARGET_ARCH */
242 #endif /* !USE_MINIINTERPRETER */