1 /* -----------------------------------------------------------------------------
2 * $Id: StgCRun.c,v 1.7 1999/07/27 13:29:08 simonmar 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;
43 extern StgThreadReturnCode StgRun(StgFunPtr f)
46 /* Save jmp_environment for previous call to miniInterpret */
47 memcpy((void *) jmp_environment, (void *) save_buf, sizeof(jmp_buf));
48 if (setjmp(jmp_environment) == 0) {
51 fprintf(stderr,"Jumping to ");
55 f = (StgFunPtr) (f)();
58 /* Restore jmp_environment for previous call */
59 memcpy((void*) save_buf, (void*) jmp_environment, sizeof(jmp_buf));
61 return (StgThreadReturnCode)R1.i;
66 longjmp(jmp_environment, 1);
71 extern StgThreadReturnCode StgRun(StgFunPtr f)
78 fprintf(stderr,"Jumping to ");
79 nm = nameOfObjSym ( f );
81 fprintf(stderr, "%s (%p)", nm, f); else
85 if (0&& MainRegTable.rSp) {
87 StgWord* p = MainRegTable.rSp;
88 fprintf(stderr, "SP = %p\n", p);
90 for (i = 0; i < 8; i++, p--)
91 fprintf (stderr, "-- %p: %p\n", p, *p );
95 f = (StgFunPtr) (f)();
98 return (StgThreadReturnCode)R1.i;
109 #else /* !USE_MINIINTERPRETER */
111 #ifdef LEADING_UNDERSCORE
112 #define STG_RETURN "_StgReturn"
114 #define STG_RETURN "StgReturn"
117 /* -----------------------------------------------------------------------------
119 -------------------------------------------------------------------------- */
121 #ifdef sparc_TARGET_ARCH
124 StgRun(StgFunPtr f) {
126 StgChar space[RESERVED_C_STACK_BYTES+sizeof(void *)];
127 register void *i7 __asm__("%i7");
128 ((void **)(space))[100] = i7;
130 __asm__ volatile (".align 4\n"
131 ".global " STG_RETURN "\n"
133 "\tld %1,%0" : "=r" (i7) : "m" (((void **)(space))[100]));
134 return (StgThreadReturnCode)R1.i;
139 /* -----------------------------------------------------------------------------
141 -------------------------------------------------------------------------- */
143 #ifdef alpha_TARGET_ARCH
148 __asm__ volatile ("stq $9,-8($30)\n\t"
149 "stq $10,-16($30)\n\t"
150 "stq $11,-24($30)\n\t"
151 "stq $12,-32($30)\n\t"
152 "stq $13,-40($30)\n\t"
153 "stq $14,-48($30)\n\t"
154 "stq $15,-56($30)\n\t"
155 "stt $f2,-64($30)\n\t"
156 "stt $f3,-72($30)\n\t"
157 "stt $f4,-80($30)\n\t"
158 "stt $f5,-88($30)\n\t"
159 "stt $f6,-96($30)\n\t"
160 "stt $f7,-104($30)\n\t"
161 "stt $f8,-112($30)\n\t"
162 "stt $f9,-120($30)\n\t"
163 "lda $30,-%0($30)" : :
164 "K" (RESERVED_C_STACK_BYTES+
165 8*sizeof(double)+8*sizeof(long)));
169 __asm__ volatile (".align 3\n"
170 ".globl " STG_RETURN "\n"
172 "lda $30,%0($30)\n\t"
174 "ldq $10,-16($30)\n\t"
175 "ldq $11,-24($30)\n\t"
176 "ldq $12,-32($30)\n\t"
177 "ldq $13,-40($30)\n\t"
178 "ldq $14,-48($30)\n\t"
179 "ldq $15,-56($30)\n\t"
180 "ldt $f2,-64($30)\n\t"
181 "ldt $f3,-72($30)\n\t"
182 "ldt $f4,-80($30)\n\t"
183 "ldt $f5,-88($30)\n\t"
184 "ldt $f6,-96($30)\n\t"
185 "ldt $f7,-104($30)\n\t"
186 "ldt $f8,-112($30)\n\t"
187 "ldt $f9,-120($30)" : :
188 "K" (RESERVED_C_STACK_BYTES+
189 8*sizeof(double)+8*sizeof(long)));
191 return (StgThreadReturnCode)R1.i;
194 #endif /* alpha_TARGET_ARCH */
196 /* -----------------------------------------------------------------------------
198 -------------------------------------------------------------------------- */
200 #ifdef hppa1_1_TARGET_ARCH
205 StgChar space[RESERVED_C_STACK_BYTES+16*sizeof(long)+10*sizeof(double)];
206 StgThreadReturnCode ret;
208 __asm__ volatile ("ldo %0(%%r30),%%r19\n"
209 "\tstw %%r3, 0(0,%%r19)\n"
210 "\tstw %%r4, 4(0,%%r19)\n"
211 "\tstw %%r5, 8(0,%%r19)\n"
212 "\tstw %%r6,12(0,%%r19)\n"
213 "\tstw %%r7,16(0,%%r19)\n"
214 "\tstw %%r8,20(0,%%r19)\n"
215 "\tstw %%r9,24(0,%%r19)\n"
216 "\tstw %%r10,28(0,%%r19)\n"
217 "\tstw %%r11,32(0,%%r19)\n"
218 "\tstw %%r12,36(0,%%r19)\n"
219 "\tstw %%r13,40(0,%%r19)\n"
220 "\tstw %%r14,44(0,%%r19)\n"
221 "\tstw %%r15,48(0,%%r19)\n"
222 "\tstw %%r16,52(0,%%r19)\n"
223 "\tstw %%r17,56(0,%%r19)\n"
224 "\tstw %%r18,60(0,%%r19)\n"
225 "\tldo 80(%%r19),%%r19\n"
226 "\tfstds %%fr12,-16(0,%%r19)\n"
227 "\tfstds %%fr13, -8(0,%%r19)\n"
228 "\tfstds %%fr14, 0(0,%%r19)\n"
229 "\tfstds %%fr15, 8(0,%%r19)\n"
230 "\tldo 32(%%r19),%%r19\n"
231 "\tfstds %%fr16,-16(0,%%r19)\n"
232 "\tfstds %%fr17, -8(0,%%r19)\n"
233 "\tfstds %%fr18, 0(0,%%r19)\n"
234 "\tfstds %%fr19, 8(0,%%r19)\n"
235 "\tldo 32(%%r19),%%r19\n"
236 "\tfstds %%fr20,-16(0,%%r19)\n"
237 "\tfstds %%fr21, -8(0,%%r19)\n" : :
238 "n" (-(116 * sizeof(long) + 10 * sizeof(double))) : "%r19"
243 __asm__ volatile (".align 4\n"
244 "\t.EXPORT " STG_RETURN ",CODE\n"
245 "\t.EXPORT " STG_RETURN ",ENTRY,PRIV_LEV=3\n"
247 /* "\tldo %0(%%r3),%%r19\n" */
248 "\tldo %1(%%r30),%%r19\n"
249 "\tcopy %%r11, %0\n" /* save R1 */
250 "\tldw 0(0,%%r19),%%r3\n"
251 "\tldw 4(0,%%r19),%%r4\n"
252 "\tldw 8(0,%%r19),%%r5\n"
253 "\tldw 12(0,%%r19),%%r6\n"
254 "\tldw 16(0,%%r19),%%r7\n"
255 "\tldw 20(0,%%r19),%%r8\n"
256 "\tldw 24(0,%%r19),%%r9\n"
257 "\tldw 28(0,%%r19),%%r10\n"
258 "\tldw 32(0,%%r19),%%r11\n"
259 "\tldw 36(0,%%r19),%%r12\n"
260 "\tldw 40(0,%%r19),%%r13\n"
261 "\tldw 44(0,%%r19),%%r14\n"
262 "\tldw 48(0,%%r19),%%r15\n"
263 "\tldw 52(0,%%r19),%%r16\n"
264 "\tldw 56(0,%%r19),%%r17\n"
265 "\tldw 60(0,%%r19),%%r18\n"
266 "\tldo 80(%%r19),%%r19\n"
267 "\tfldds -16(0,%%r19),%%fr12\n"
268 "\tfldds -8(0,%%r19),%%fr13\n"
269 "\tfldds 0(0,%%r19),%%fr14\n"
270 "\tfldds 8(0,%%r19),%%fr15\n"
271 "\tldo 32(%%r19),%%r19\n"
272 "\tfldds -16(0,%%r19),%%fr16\n"
273 "\tfldds -8(0,%%r19),%%fr17\n"
274 "\tfldds 0(0,%%r19),%%fr18\n"
275 "\tfldds 8(0,%%r19),%%fr19\n"
276 "\tldo 32(%%r19),%%r19\n"
277 "\tfldds -16(0,%%r19),%%fr20\n"
278 "\tfldds -8(0,%%r19),%%fr21\n"
280 : "n" (-(116 * sizeof(long) + 10 * sizeof(double)))
287 #endif /* hppa1_1_TARGET_ARCH */
289 #endif /* !USE_MINIINTERPRETER */