void _jit_create_closure(unsigned char *buf, void *func, void *closure, void *_type) {
alpha_inst inst = (alpha_inst) buf;
- /* NOT IMPLEMENTED YET! */
+ /* Compute and load the global pointer */
+ alpha_ldah(inst,ALPHA_GP,ALPHA_PV,0);
+ alpha_lda( inst,ALPHA_GP,ALPHA_GP,0);
+
+ /* Allocate space for a new stack frame. */
+ alpha_lda(inst,ALPHA_SP,ALPHA_SP,-(14*8));
+
+ /* Save the return address. */
+ alpha_stq(inst,ALPHA_RA,ALPHA_SP,0*8);
+
+ /* Save integer register arguments as local variables */
+ alpha_stq(inst,ALPHA_A0,ALPHA_SP,1*8);
+ alpha_stq(inst,ALPHA_A1,ALPHA_SP,2*8);
+ alpha_stq(inst,ALPHA_A2,ALPHA_SP,3*8);
+ alpha_stq(inst,ALPHA_A3,ALPHA_SP,4*8);
+ alpha_stq(inst,ALPHA_A4,ALPHA_SP,5*8);
+ alpha_stq(inst,ALPHA_A5,ALPHA_SP,6*8);
+
+ /* Save floating-point register arguments as local variables */
+ alpha_stt(inst,ALPHA_FA0,ALPHA_SP, 7*8);
+ alpha_stt(inst,ALPHA_FA1,ALPHA_SP, 8*8);
+ alpha_stt(inst,ALPHA_FA2,ALPHA_SP, 9*8);
+ alpha_stt(inst,ALPHA_FA3,ALPHA_SP,10*8);
+ alpha_stt(inst,ALPHA_FA4,ALPHA_SP,11*8);
+ alpha_stt(inst,ALPHA_FA5,ALPHA_SP,12*8);
- /* Set up the local stack frame */
- /* Create the apply argument block on the stack */
- /* Push the arguments for calling "func" */
/* Call the closure handling function */
+ alpha_call(inst,func);
+
+ /* Restore the return address */
+ alpha_ldq(inst,ALPHA_RA,ALPHA_SP,0*8);
+
+ /* Restore integer register arguments */
+ alpha_ldq(inst,ALPHA_A0,ALPHA_SP,1*8);
+ alpha_ldq(inst,ALPHA_A1,ALPHA_SP,2*8);
+ alpha_ldq(inst,ALPHA_A2,ALPHA_SP,3*8);
+ alpha_ldq(inst,ALPHA_A3,ALPHA_SP,4*8);
+ alpha_ldq(inst,ALPHA_A4,ALPHA_SP,5*8);
+ alpha_ldq(inst,ALPHA_A5,ALPHA_SP,6*8);
+
+ /* Restore floating-point register arguments */
+ alpha_ldt(inst,ALPHA_FA0,ALPHA_SP, 7*8);
+ alpha_ldt(inst,ALPHA_FA1,ALPHA_SP, 8*8);
+ alpha_ldt(inst,ALPHA_FA2,ALPHA_SP, 9*8);
+ alpha_ldt(inst,ALPHA_FA3,ALPHA_SP,10*8);
+ alpha_ldt(inst,ALPHA_FA4,ALPHA_SP,11*8);
+ alpha_ldt(inst,ALPHA_FA5,ALPHA_SP,12*8);
+ /* restore the stack pointer */
+ alpha_lda(inst,ALPHA_SP,ALPHA_SP,(8*13));
}
void *_jit_create_redirector(unsigned char *buf, void *func, void *user_data, int abi) {
*/
void *_jit_gen_prolog(jit_gencode_t gen, jit_function_t func, void *buf) {
unsigned int prolog[JIT_PROLOG_SIZE];
- unsigned int offset = 0;
alpha_inst inst = prolog;
+ /* Compute and load the global pointer (2 instruction) */
+ alpha_ldah(inst,ALPHA_GP,ALPHA_PV,0);
+ alpha_lda( inst,ALPHA_GP,ALPHA_GP,0);
+
/* Allocate space for a new stack frame. (1 instruction) */
- alpha_lda(inst,ALPHA_SP,ALPHA_SP,-(64));
+ alpha_lda(inst,ALPHA_SP,ALPHA_SP,-(16*8));
/* Save the return address. (1 instruction) */
- alpha_stq(inst,ALPHA_RA,ALPHA_SP,offset); offset += 8;
+ alpha_stq(inst,ALPHA_RA,ALPHA_SP,0*8);
/* Save the frame pointer. (1 instruction) */
- alpha_stq(inst,ALPHA_FP,ALPHA_SP,offset); offset += 8;
+ alpha_stq(inst,ALPHA_FP,ALPHA_SP,1*8);
/* Save the integer save registers (6 instructions) */
- alpha_stq(inst,ALPHA_S0,ALPHA_SP,offset); offset += 8;
- alpha_stq(inst,ALPHA_S1,ALPHA_SP,offset); offset += 8;
- alpha_stq(inst,ALPHA_S2,ALPHA_SP,offset); offset += 8;
- alpha_stq(inst,ALPHA_S3,ALPHA_SP,offset); offset += 8;
- alpha_stq(inst,ALPHA_S4,ALPHA_SP,offset); offset += 8;
- alpha_stq(inst,ALPHA_S5,ALPHA_SP,offset); offset += 8;
+ alpha_stq(inst,ALPHA_S0,ALPHA_SP,2*8);
+ alpha_stq(inst,ALPHA_S1,ALPHA_SP,3*8);
+ alpha_stq(inst,ALPHA_S2,ALPHA_SP,4*8);
+ alpha_stq(inst,ALPHA_S3,ALPHA_SP,5*8);
+ alpha_stq(inst,ALPHA_S4,ALPHA_SP,6*8);
+ alpha_stq(inst,ALPHA_S5,ALPHA_SP,7*8);
+
+ /* Save the floating point save registers (8 instructions) */
+ alpha_stt(inst,ALPHA_FS0,ALPHA_SP, 8*8);
+ alpha_stt(inst,ALPHA_FS1,ALPHA_SP, 9*8);
+ alpha_stt(inst,ALPHA_FS2,ALPHA_SP,10*8);
+ alpha_stt(inst,ALPHA_FS3,ALPHA_SP,11*8);
+ alpha_stt(inst,ALPHA_FS4,ALPHA_SP,12*8);
+ alpha_stt(inst,ALPHA_FS5,ALPHA_SP,13*8);
+ alpha_stt(inst,ALPHA_FS6,ALPHA_SP,14*8);
+ alpha_stt(inst,ALPHA_FS7,ALPHA_SP,15*8);
/* Set the frame pointer (1 instruction) */
alpha_mov(inst,ALPHA_SP,ALPHA_FP);
- /* TODO: Save the floating point save registers ; requires fp support */
-
/* Force any pending hardware exceptions to be raised. (1 instruction) */
alpha_trapb(inst);
void _jit_gen_epilog(jit_gencode_t gen, jit_function_t func) {
alpha_inst inst;
void **fixup, **next;
- unsigned int offset = 0;
inst = (alpha_inst) gen->posn.ptr;
alpha_mov(inst,ALPHA_FP,ALPHA_SP);
/* Restore the return address. (1 instruction) */
- alpha_ldq(inst,ALPHA_RA,ALPHA_SP,offset); offset += 8;
+ alpha_ldq(inst,ALPHA_RA,ALPHA_SP,0*8);
/* Restore the frame pointer. (1 instruction) */
- alpha_ldq(inst,ALPHA_FP,ALPHA_SP,offset); offset += 8;
+ alpha_ldq(inst,ALPHA_FP,ALPHA_SP,1*8);
/* Restore the integer save registers (6 instructions) */
- alpha_ldq(inst,ALPHA_S0,ALPHA_SP,offset); offset += 8;
- alpha_ldq(inst,ALPHA_S1,ALPHA_SP,offset); offset += 8;
- alpha_ldq(inst,ALPHA_S2,ALPHA_SP,offset); offset += 8;
- alpha_ldq(inst,ALPHA_S3,ALPHA_SP,offset); offset += 8;
- alpha_ldq(inst,ALPHA_S4,ALPHA_SP,offset); offset += 8;
- alpha_ldq(inst,ALPHA_S5,ALPHA_SP,offset); offset += 8;
-
- /* TODO: Restore the floating point save registers ; requires fp support */
+ alpha_ldq(inst,ALPHA_S0,ALPHA_SP,2*8);
+ alpha_ldq(inst,ALPHA_S1,ALPHA_SP,3*8);
+ alpha_ldq(inst,ALPHA_S2,ALPHA_SP,4*8);
+ alpha_ldq(inst,ALPHA_S3,ALPHA_SP,5*8);
+ alpha_ldq(inst,ALPHA_S4,ALPHA_SP,6*8);
+ alpha_ldq(inst,ALPHA_S5,ALPHA_SP,7*8);
+
+ /* Restore the floating point save registers (8 instructions) */
+ alpha_ldt(inst,ALPHA_FS0,ALPHA_SP, 8*8);
+ alpha_ldt(inst,ALPHA_FS1,ALPHA_SP, 9*8);
+ alpha_ldt(inst,ALPHA_FS2,ALPHA_SP,10*8);
+ alpha_ldt(inst,ALPHA_FS3,ALPHA_SP,11*8);
+ alpha_ldt(inst,ALPHA_FS4,ALPHA_SP,12*8);
+ alpha_ldt(inst,ALPHA_FS5,ALPHA_SP,13*8);
+ alpha_ldt(inst,ALPHA_FS6,ALPHA_SP,14*8);
+ alpha_ldt(inst,ALPHA_FS7,ALPHA_SP,15*8);
+
+ /* Restore the stack pointer (1 instruction) */
+ alpha_lda(inst,ALPHA_SP,ALPHA_SP,16*8);
/* Force any pending hardware exceptions to be raised. (1 instruction) */
alpha_trapb(inst);