cvsuser 04/10/24 02:50:55
Modified: . MANIFEST
config/init/hints darwin.pl
jit/ppc core.jit jit_emit.h
Added: config/gen/platform/darwin asm.s
Log:
PPC fpr allocation fix
Revision Changes Path
1.756 +1 -0 parrot/MANIFEST
Index: MANIFEST
===================================================================
RCS file: /cvs/public/parrot/MANIFEST,v
retrieving revision 1.755
retrieving revision 1.756
diff -u -r1.755 -r1.756
--- MANIFEST 23 Oct 2004 17:53:48 -0000 1.755
+++ MANIFEST 24 Oct 2004 09:50:51 -0000 1.756
@@ -208,6 +208,7 @@
config/gen/platform/ansi/exec.c []
config/gen/platform/ansi/io.h []
config/gen/platform/ansi/time.c []
+config/gen/platform/darwin/asm.s []
config/gen/platform/darwin/begin.c []
config/gen/platform/darwin/dl.c []
config/gen/platform/darwin/memalign.c []
1.1 parrot/config/gen/platform/darwin/asm.s
Index: asm.s
===================================================================
#define PPC_JIT_GP_REGISTER_SAVE_SPACE (4*19)
;; This macro would generate the below asm, but requires using 'cc -c'
;; rather than 'as' as the assembler (so that the preprocessor runs),
;; and this is not currently configurable in the Parrot makefiles
.macro RESTORE_NONVOLATILE_FLOATS
lfd f14, -PPC_JIT_GP_REGISTER_SAVE_SPACE-1*8(r1)
lfd f15, -PPC_JIT_GP_REGISTER_SAVE_SPACE-2*8(r1)
lfd f16, -PPC_JIT_GP_REGISTER_SAVE_SPACE-3*8(r1)
lfd f17, -PPC_JIT_GP_REGISTER_SAVE_SPACE-4*8(r1)
lfd f18, -PPC_JIT_GP_REGISTER_SAVE_SPACE-5*8(r1)
lfd f19, -PPC_JIT_GP_REGISTER_SAVE_SPACE-6*8(r1)
lfd f20, -PPC_JIT_GP_REGISTER_SAVE_SPACE-7*8(r1)
lfd f21, -PPC_JIT_GP_REGISTER_SAVE_SPACE-8*8(r1)
lfd f22, -PPC_JIT_GP_REGISTER_SAVE_SPACE-9*8(r1)
lfd f23, -PPC_JIT_GP_REGISTER_SAVE_SPACE-10*8(r1)
lfd f24, -PPC_JIT_GP_REGISTER_SAVE_SPACE-11*8(r1)
lfd f25, -PPC_JIT_GP_REGISTER_SAVE_SPACE-12*8(r1)
lfd f26, -PPC_JIT_GP_REGISTER_SAVE_SPACE-13*8(r1)
lfd f27, -PPC_JIT_GP_REGISTER_SAVE_SPACE-14*8(r1)
lfd f28, -PPC_JIT_GP_REGISTER_SAVE_SPACE-15*8(r1)
lfd f29, -PPC_JIT_GP_REGISTER_SAVE_SPACE-16*8(r1)
lfd f30, -PPC_JIT_GP_REGISTER_SAVE_SPACE-17*8(r1)
lfd f31, -PPC_JIT_GP_REGISTER_SAVE_SPACE-18*8(r1)
.endmacro
.text
.align 12 ; vm page aligned
.globl _Parrot_ppc_jit_restore_nonvolatile_registers
_Parrot_ppc_jit_restore_nonvolatile_registers:
lfd f14,-84(r1)
lfd f15,-92(r1)
lfd f16,-100(r1)
lfd f17,-108(r1)
lfd f18,-116(r1)
lfd f19,-124(r1)
lfd f20,-132(r1)
lfd f21,-140(r1)
lfd f22,-148(r1)
lfd f23,-156(r1)
lfd f24,-164(r1)
lfd f25,-172(r1)
lfd f26,-180(r1)
lfd f27,-188(r1)
lfd f28,-196(r1)
lfd f29,-204(r1)
lfd f30,-212(r1)
lfd f31,-220(r1)
blr
1.16 +1 -0 parrot/config/init/hints/darwin.pl
Index: darwin.pl
===================================================================
RCS file: /cvs/public/parrot/config/init/hints/darwin.pl,v
retrieving revision 1.15
retrieving revision 1.16
diff -u -r1.15 -r1.16
--- darwin.pl 13 Oct 2004 14:38:06 -0000 1.15
+++ darwin.pl 24 Oct 2004 09:50:54 -0000 1.16
@@ -26,4 +26,5 @@
ld_share_flags => '-dynamiclib',
ld_load_flags => '-bundle -undefined suppress',
memalign => 'some_memalign',
+ platform_asm => 1,
);
1.19 +37 -2 parrot/jit/ppc/core.jit
Index: core.jit
===================================================================
RCS file: /cvs/public/parrot/jit/ppc/core.jit,v
retrieving revision 1.18
retrieving revision 1.19
diff -u -r1.18 -r1.19
--- core.jit 21 Oct 2004 20:34:35 -0000 1.18
+++ core.jit 24 Oct 2004 09:50:55 -0000 1.19
@@ -2,7 +2,7 @@
; ppc/core.jit
;
;
-; $Id: core.jit,v 1.18 2004/10/21 20:34:35 leo Exp $
+; $Id: core.jit,v 1.19 2004/10/24 09:50:55 leo Exp $
;
# TODO complete this
@@ -10,8 +10,12 @@
Parrot_end {
jit_emit_lwz(NATIVECODE, r1, 0, r1);
jit_emit_lwz(NATIVECODE, r0, 8, r1);
+
+ jit_emit_call_func(NATIVECODE, (void
*)Parrot_ppc_jit_restore_nonvolatile_registers);
+
jit_emit_mtlr(NATIVECODE, r0);
- jit_emit_lmw(NATIVECODE, r13, -PPC_JIT_REGISTER_SAVE_SPACE, r1);
+ jit_emit_lmw(NATIVECODE, r13, -PPC_JIT_GP_REGISTER_SAVE_SPACE, r1);
+
jit_emit_blr(NATIVECODE);
}
@@ -919,3 +923,34 @@
jit_emit_blr(NATIVECODE);
}
+TEMPLATE Parrot_set_or_clone_s_sc {
+; string_copy(Interp *interpreter, STRING *s)
+ jit_emit_mov_rr(NATIVECODE, r3, r13);
+ jit_emit_mov_ri_i(NATIVECODE, r4, CONST(2)->u.string);
+
+ jit_emit_call_func(NATIVECODE, (void*) string_copy);
+
+ jit_emit_mov_mr_i(NATIVECODE, &STRING_REG[1], r3);
+}
+
+Parrot_set_s_sc {
+ Parrot_set_or_clone_s_sc
+}
+
+Parrot_clone_s_sc {
+ Parrot_set_or_clone_s_sc
+}
+
+Parrot_set_s_s {
+ jit_emit_mov_rm_i(NATIVECODE, ISR1, &STRING_REG[2]);
+ jit_emit_mov_mr_i(NATIVECODE, &STRING_REG[1], ISR1);
+}
+
+Parrot_clone_s_s {
+ jit_emit_mov_rr(NATIVECODE, r3, r13);
+ jit_emit_mov_rm_i(NATIVECODE, r4, &STRING_REG[2]);
+
+ jit_emit_call_func(NATIVECODE, (void*) string_copy);
+
+ jit_emit_mov_mr_i(NATIVECODE, &STRING_REG[1], r3);
+}
1.44 +44 -28 parrot/jit/ppc/jit_emit.h
Index: jit_emit.h
===================================================================
RCS file: /cvs/public/parrot/jit/ppc/jit_emit.h,v
retrieving revision 1.43
retrieving revision 1.44
diff -u -r1.43 -r1.44
--- jit_emit.h 22 Oct 2004 08:36:39 -0000 1.43
+++ jit_emit.h 24 Oct 2004 09:50:55 -0000 1.44
@@ -3,7 +3,7 @@
*
* PPC
*
- * $Id: jit_emit.h,v 1.43 2004/10/22 08:36:39 leo Exp $
+ * $Id: jit_emit.h,v 1.44 2004/10/24 09:50:55 leo Exp $
*/
#if !defined(PARROT_PPC_JIT_EMIT_H_GUARD)
@@ -367,6 +367,9 @@
# define jit_emit_lwz(pc, D, disp, A) \
jit_emit_2reg(pc, 32, D, A, disp)
+# define jit_emit_lwzx(pc, D, A, B) \
+ jit_emit_3reg_x(pc, 31, D, A, B, 23, 0)
+
# define jit_emit_stw(pc, S, disp, A) \
jit_emit_2reg(pc, 36, S, A, disp)
@@ -589,11 +592,21 @@
# define jit_emit_branch_to_opcode(pc, D) \
jit_emit_sub_rrr(jit_info->native_ptr, ISR1, D, r15); \
- jit_emit_add_rrr(jit_info->native_ptr, ISR1, r14, ISR1); \
- jit_emit_lwz(jit_info->native_ptr, ISR1, 0, ISR1); \
+ jit_emit_lwzx(jit_info->native_ptr, ISR1, ISR1, r14); \
jit_emit_mtctr(jit_info->native_ptr, ISR1); \
jit_emit_bctrl(jit_info->native_ptr)
+#if PARROT_EXEC_OS_AIX /* support AIX calling convention using compiler
intermediary _ptrgl */
+# define jit_emit_call_func(pc, addr) \
+ jit_emit_mov_ri_i(jit_info->native_ptr, ISR1, (long)*((long*)(addr))); \
+ jit_emit_mtctr(jit_info->native_ptr, ISR1); \
+ jit_emit_bctrl(jit_info->native_ptr);
+#else
+# define jit_emit_call_func(pc, addr) \
+ jit_emit_mov_ri_i(jit_info->native_ptr, ISR1, (long)(addr)); \
+ jit_emit_mtctr(jit_info->native_ptr, ISR1); \
+ jit_emit_bctrl(jit_info->native_ptr);
+#endif
# if EXEC_CAPABLE
# define load_nc(pc, D, disp) \
@@ -607,16 +620,21 @@
#endif /* JIT_EMIT */
+void Parrot_ppc_jit_restore_nonvolatile_registers(void);
+
/*
* r13 - r31 are preserved i.e. 19 GPRs
+ * f14 - f31 are preserved
+ * (these are all of the nonvolatile registers)
*/
-#define PPC_JIT_REGISTER_SAVE_SPACE (4*19)
+#define PPC_JIT_GP_REGISTER_SAVE_SPACE (4*19)
+#define PPC_JIT_FP_REGISTER_SAVE_SPACE (8*18)
/*
* 24 linkage area
* 32 param area i.e.enough for 8 args
* 12 round up so that sum is divisible by 16
*/
-#define PPC_JIT_FRAME_SIZE (PPC_JIT_REGISTER_SAVE_SPACE + 68)
+#define PPC_JIT_FRAME_SIZE (PPC_JIT_GP_REGISTER_SAVE_SPACE +
PPC_JIT_FP_REGISTER_SAVE_SPACE + 68)
#if JIT_EMIT == 2
/*
@@ -627,8 +645,14 @@
Parrot_jit_begin(Parrot_jit_info_t *jit_info,
Interp * interpreter)
{
+ int i;
jit_emit_mflr(jit_info->native_ptr, r0);
- jit_emit_stmw(jit_info->native_ptr, r13, -PPC_JIT_REGISTER_SAVE_SPACE, r1);
+ jit_emit_stmw(jit_info->native_ptr, r13, -PPC_JIT_GP_REGISTER_SAVE_SPACE, r1);
+
+ for( i = 1; i <= 18; ++i )
+ {
+ jit_emit_stfd(jit_info->native_ptr, (i + 13),
(-PPC_JIT_GP_REGISTER_SAVE_SPACE - i*8), r1);
+ }
jit_emit_stw(jit_info->native_ptr, r0, 8, r1);
jit_emit_stwu(jit_info->native_ptr, r1, -PPC_JIT_FRAME_SIZE, r1);
jit_emit_xor_rrr(jit_info->native_ptr, r31, r31, r31);
@@ -673,16 +697,8 @@
_emit_bx(jit_info->native_ptr, 1, 0);
*/
-# if PARROT_EXEC_OS_AIX
- /* support AIX calling convention using compiler intermediary _ptrgl */
- jit_emit_mov_ri_i(jit_info->native_ptr, ISR1, (long)
- *((long*)(interpreter->op_func_table[*(jit_info->cur_op)])));
-# else
- jit_emit_mov_ri_i(jit_info->native_ptr, ISR1,
- (long)(interpreter->op_func_table[*(jit_info->cur_op)]));
-# endif
- jit_emit_mtctr(jit_info->native_ptr, ISR1);
- jit_emit_bctrl(jit_info->native_ptr);
+ jit_emit_call_func(jit_info->native_ptr,
+ interpreter->op_func_table[*(jit_info->cur_op)]);
}
void
@@ -827,11 +843,11 @@
# define REQUIRES_CONSTANT_POOL 0
# ifdef PARROT_EXEC_OS_AIX
-# define INT_REGISTERS_TO_MAP 22
+# define INT_REGISTERS_TO_MAP 14
# else
-# define INT_REGISTERS_TO_MAP 23
+# define INT_REGISTERS_TO_MAP 14
# endif
-# define FLOAT_REGISTERS_TO_MAP 12
+# define FLOAT_REGISTERS_TO_MAP 18
/*
* Register usage
@@ -859,22 +875,22 @@
char intval_map[INT_REGISTERS_TO_MAP] =
{ r17, r18, r19, r20, r21, r22, r23,
- r24, r25, r26, r27, r28, r29, r30,
+ r24, r25, r26, r27, r28, r29, r30
# ifndef PARROT_EXEC_OS_AIX
/* AIX calling convention reserves r2 */
- r2,
+ /* r2, */
# endif
- r3, r4, r5, r6, r7, r8, r9, r10 };
+ /* r3, r4, r5, r6, r7, r8, r9, r10 */ };
/*
- * f14 - f31 are not preserved currently
- * f1 - f11 are usable without preserving
+ * f0, f13 are used as scratch registers
+ * f1 - f12 are (additional) volatile registers
+ * f14 - f31 are not nonvolatile, and preserved in begin/end
*/
char floatval_map[FLOAT_REGISTERS_TO_MAP] =
{
- f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12
- /* not currently saved - so don't use */
- /* f14, f15, f16, f17, f18, f19, f20, f21,
- f22, f23, f24, f25, f26, f27, f28, f29, f30, f31 */
+ /* f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12 */
+ f14, f15, f16, f17, f18, f19, f20, f21,
+ f22, f23, f24, f25, f26, f27, f28, f29, f30, f31
};
void ppc_flush_line(char *_sync);