cvsuser 02/08/01 12:58:41
Modified: docs jit.pod
jit/i386 core.jit jit_emit.h
jit/sun4 jit_emit.h
Log:
More Revisions of jit.doc as well as some more overview comments on the SPARC
jit approach. Also included is a change to the way interpreter functions are
invoked on x86. This uses the fact that the interpreter argument remains
unchanged on the stack to avoid pushing it every time.
Courtesty of Jason Gloudon
Revision Changes Path
1.5 +16 -10 parrot/docs/jit.pod
Index: jit.pod
===================================================================
RCS file: /cvs/public/parrot/docs/jit.pod,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -w -r1.4 -r1.5
--- jit.pod 29 Jul 2002 21:13:38 -0000 1.4
+++ jit.pod 1 Aug 2002 19:57:24 -0000 1.5
@@ -73,7 +73,9 @@
=item jit/${jitcpuarch}/core.jit
The functions to generate native code for core parrot opcodes are specified
-here.
+here. To simplify the maintenance of these functions, they are specified in a
+format that is pre-processed by B<jit2h.pl> to produce a valid C source file,
+B<jit_cpu.c>. See L<Format of .jit Files> below.
=item jit/${jitcpuarch}/string.jit
@@ -116,7 +118,7 @@
=item jit2h.pl
-Reads the .jit files and prints the struct opcode_assembly_t.
+Preprocesses the .jit files to produce and prints the struct opcode_assembly_t.
=back
@@ -129,12 +131,18 @@
=item I<op-name> { I<body> }
-Where I<op-name> is the name of the Parrot opcode, and I<body> consists
-of a sequence of the following forms:
-
-=item Assembly instruction.
-
-Which may have one of this B<Identifiers> as an argument:
+Where I<op-name> is the name of the Parrot opcode, and I<body> consists of C
+syntax code which may contain any of the identifiers listed in the following
+section.
+
+=item Identifiers
+
+In general, prefixing an identifier with I<&> yields the address of the
+referenced Parrot register or constant. If an identifier is given without a
+prefix, the value is returned by default. To emphasis the use of the value,
+the I<*> prefix may be used. Since Parrot register values vary during code
+execution, their values can not be obtained through identifier substitution
+alone.
B<INT_REG[n]>
@@ -207,8 +215,6 @@
B<TEMP_CHAR[n]>
Gets replaced by the I<n>th temporary char array.
-
-You must preside all the identifiers with I<&> requesting the address of that
identifier, or I<*> requesting the value, I<*> can be used only with constants since
the replacement is done before start running.
B<&INTERPRETER[n]>
1.21 +3 -1 parrot/jit/i386/core.jit
Index: core.jit
===================================================================
RCS file: /cvs/public/parrot/jit/i386/core.jit,v
retrieving revision 1.20
retrieving revision 1.21
diff -u -w -r1.20 -r1.21
--- core.jit 5 Jul 2002 11:15:42 -0000 1.20
+++ core.jit 1 Aug 2002 19:58:03 -0000 1.21
@@ -1,11 +1,13 @@
;
; i386/core.jit
;
-; $Id: core.jit,v 1.20 2002/07/05 11:15:42 tom Exp $
+; $Id: core.jit,v 1.21 2002/08/01 19:58:03 dan Exp $
;
Parrot_end {
+ emitm_addl_i_r(jit_info->native_ptr, 4, emit_ESP);
NATIVECODE = emit_popl_r(NATIVECODE, emit_ESI);
+ NATIVECODE = emit_popl_r(NATIVECODE, emit_EBP);
emitm_ret(NATIVECODE);
}
1.5 +21 -6 parrot/jit/i386/jit_emit.h
Index: jit_emit.h
===================================================================
RCS file: /cvs/public/parrot/jit/i386/jit_emit.h,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -w -r1.4 -r1.5
--- jit_emit.h 5 Jul 2002 11:11:09 -0000 1.4
+++ jit_emit.h 1 Aug 2002 19:58:03 -0000 1.5
@@ -3,7 +3,7 @@
**
** i386
**
-** $Id: jit_emit.h,v 1.4 2002/07/05 11:11:09 tom Exp $
+** $Id: jit_emit.h,v 1.5 2002/08/01 19:58:03 dan Exp $
**/
/* Register codes */
@@ -98,7 +98,7 @@
break;
default :
internal_exception(JIT_ERROR, "Invalid scale factor %d\n", scale);
- break;
+ return;
}
*pc = scale_byte | (i == emit_None ? emit_Index_None : emit_reg_Index(i)) |
@@ -108,7 +108,7 @@
static char *emit_r_X(char *pc, int reg_opcode, int base, int i, int scale,
long disp)
{
- if((i && !scale) || (scale && !i)){
+ if(i && !scale){
internal_exception(JIT_ERROR,
"emit_r_X passed invalid scale+index combo\n");
}
@@ -341,6 +341,8 @@
#define emitm_alul_i_r(pc, op1, op2, imm, reg) { *(pc++) = op1; *(pc++) =
emit_alu_X_r(op2, reg); *(long *)((pc)) = (long)(imm); (pc) += 4; }
+#define emitm_alub_i_r(pc, op1, op2, imm, reg) { *(pc++) = op1; *(pc++) =
emit_alu_X_r(op2, reg); *(pc++) = (char)(imm); }
+
#define emitm_alul_i_m(pc, op1, op2, imm, b, i, s, d) { \
*(pc++) = op1; \
(pc) = emit_r_X(pc, emit_reg(op2), b, i, s, d); \
@@ -366,6 +368,8 @@
/* ADDs */
#define emitm_addb_r_r(pc, reg1, reg2) emitm_alul_r_r(pc, 0x00, reg1, reg2)
+#define emitm_addb_i_r(pc, imm, reg) emitm_alub_i_r(pc, 0x83, emit_b000, imm, reg)
+
#define emitm_addl_r_r(pc, reg1, reg2) emitm_alul_r_r(pc, 0x01, reg1, reg2)
#define emitm_addl_i_r(pc, imm, reg) emitm_alul_i_r(pc, 0x81, emit_b000, imm, reg)
#define emitm_addl_r_m(pc, reg, b, i, s, d) emitm_alul_r_m(pc, 0x01, reg, b, i, s,
d)
@@ -667,14 +671,25 @@
void Parrot_jit_begin(Parrot_jit_info *jit_info,
struct Parrot_Interp * interpreter)
{
+ /* Maintain the stack frame pointer for the sake of gdb */
+ jit_info->native_ptr = emit_pushl_r(jit_info->native_ptr, emit_EBP);
+ emitm_movl_r_r(jit_info->native_ptr, emit_ESP, emit_EBP);
+
+ /* Save ESI, as it's value is clobbered by jit_cpcf_op */
jit_info->native_ptr = emit_pushl_r(jit_info->native_ptr, emit_ESI);
+
+ /* Cheat on op function calls by writing the interpreter arg on the stack
+ * just once. If an op function ever modifies the interpreter argument on
+ * the stack this will stop working !!! */
+ emitm_pushl_i(jit_info->native_ptr, interpreter);
+
+ /* Point ESI to the opcode-native code map array */
emitm_movl_i_r(jit_info->native_ptr, jit_info->op_map, emit_ESI);
}
void Parrot_jit_normal_op(Parrot_jit_info *jit_info,
struct Parrot_Interp * interpreter)
{
- emitm_pushl_i(jit_info->native_ptr, interpreter);
emitm_pushl_i(jit_info->native_ptr, jit_info->cur_op);
Parrot_jit_newfixup(jit_info);
@@ -683,7 +698,7 @@
(void (*)(void))interpreter->op_func_table[*(jit_info->cur_op)];
emitm_calll(jit_info->native_ptr, 0xdeafc0de);
- emitm_addl_i_r(jit_info->native_ptr, 8, emit_ESP);
+ emitm_addb_i_r(jit_info->native_ptr, 4, emit_ESP);
}
void Parrot_jit_cpcf_op(Parrot_jit_info *jit_info,
1.4 +28 -2 parrot/jit/sun4/jit_emit.h
Index: jit_emit.h
===================================================================
RCS file: /cvs/public/parrot/jit/sun4/jit_emit.h,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -w -r1.3 -r1.4
--- jit_emit.h 4 Jul 2002 22:40:59 -0000 1.3
+++ jit_emit.h 1 Aug 2002 19:58:41 -0000 1.4
@@ -3,9 +3,20 @@
**
** SPARC
**
-** $Id: jit_emit.h,v 1.3 2002/07/04 22:40:59 mrjoltcola Exp $
+** $Id: jit_emit.h,v 1.4 2002/08/01 19:58:41 dan Exp $
**/
+/*
+ * SPARC JIT overview:
+ *
+ * The interpreter pointer is kept in i0.
+ * The address of register I0 is stored in i1, with all parrot register access
+ * performed relative to this register.
+ * The address of the opcode - native code mapping array is kept in i3.
+ *
+ * See IMPORTANT SHORTCUTS below.
+ * /
+
/* Sparc register numbers */
#define emitm_g(n) (n)
#define emitm_o(n) ((n) + 8)
@@ -264,13 +275,27 @@
/* Fixup types */
enum {JIT_BRANCH, JIT_CALL30 };
-/* Shortcuts for registers */
+/*
+ *
+ * IMPORTANT SHORTCUTS
+ *
+ * */
+
+/* The register holding the interpreter pointer */
#define Parrot_jit_intrp emitm_i(0)
+
+/* The register holding the address of I0 */
#define Parrot_jit_regbase emitm_i(1)
+
+/* The register containing the address of the opmap */
#define Parrot_jit_opmap emitm_i(3)
+
+/* The scratch register used for certain address calculations */
#define Parrot_jit_tmp emitm_l(7)
#define Parrot_jit_regbase_ptr(i) &((i)->ctx.int_reg.registers[0])
+
+/* The offset of a Parrot register from the base register */
#define Parrot_jit_regoff(a, i) (unsigned)(a) -
(unsigned)(Parrot_jit_regbase_ptr(i))
/* Generate conditional branch to offset from current parrot op */
@@ -299,6 +324,7 @@
emitm_bicc(jit_info->native_ptr, annul, cond, 0);
}
+/* This function loads a value */
static void Parrot_jit_int_load(Parrot_jit_info *jit_info,
struct Parrot_Interp *interpreter,
int param,