These two patches add jit support for is<compare> style ops (isgt, isge, isle,
islt, iseq, isne) on integers for the sun/sparc platform.

The jitted code follows this "pattern":

           cmp     %r2, %r3
           b<c>,a  next
           mov     1, %r1
           mov     0, %r1
    next:  ..

<c> defining the branch condition.
Thanks,
Stéphane

On Sun, Sep 26, 2004 at 02:40:29AM -0700, Leopold Toetsch wrote:
> The integer and number variants of these opcodes could need JIT support.
Index: jit/sun4/core.jit
===================================================================
RCS file: /cvs/public/parrot/jit/sun4/core.jit,v
retrieving revision 1.7
diff -u -r1.7 core.jit
--- jit/sun4/core.jit   25 Sep 2004 14:44:22 -0000      1.7
+++ jit/sun4/core.jit   2 Oct 2004 10:53:54 -0000
@@ -197,11 +197,11 @@
         jit_emit_store_i(jit_info, interpreter, 1, arg1);
     }
 }
-                                                                                      
                     
+
 Parrot_inc_i {
     Parrot_incdec_i s/<op>/add/
 }
-                                                                                      
                     
+
 Parrot_dec_i {
     Parrot_incdec_i s/<op>/sub/
 }
@@ -701,6 +701,132 @@
     Parrot_cmp_ix_ix_ic  s/<a>/bge/
 }
 
+TEMPLATE Parrot_iscmp_ix_ix_ix {
+    if(MAP[2] && MAP[3]){
+        emitm_subcc_r(NATIVECODE, MAP[2], MAP[3], emitm_g(0));
+    }
+    else if (MAP[2]) {
+        jit_emit_load_i(jit_info, interpreter, 3, ISR2);
+        emitm_subcc_r(NATIVECODE, MAP[2], ISR2, emitm_g(0));
+    }
+    else if (MAP[3]) {
+        jit_emit_load_i(jit_info, interpreter, 2, ISR1);
+        emitm_subcc_r(NATIVECODE, ISR1, MAP[3], emitm_g(0));
+    }
+    else {
+        jit_emit_load_i(jit_info, interpreter, 2, ISR1);
+        jit_emit_load_i(jit_info, interpreter, 3, ISR2);
+        emitm_subcc_r(NATIVECODE, ISR1, ISR2, emitm_g(0));
+    }
+
+    emitm_bicc(NATIVECODE, 1, emitm_<a>, 3);
+
+    if(MAP[1]){
+        emitm_mov_i(NATIVECODE, 1, MAP[1]);
+        emitm_or_r(NATIVECODE, emitm_g(0), emitm_g(0), MAP[1]);
+    } else {
+        emitm_bicc(NATIVECODE, 1, emitm_<a>, 3);
+        jit_emit_store_i(jit_info, interpreter, 1, 1);
+        jit_emit_store_i(jit_info, interpreter, 1, 0);
+    }
+}
+
+Parrot_isgt_i_i_i {
+    Parrot_iscmp_ix_ix_ix  s/<a>/bg/
+}
+
+Parrot_isgt_i_ic_i {
+    Parrot_iscmp_ix_ix_ix  s/<a>/bg/
+}
+
+Parrot_isgt_i_i_ic {
+    Parrot_iscmp_ix_ix_ix  s/<a>/bg/
+}
+
+Parrot_isgt_i_ic_ic {
+    Parrot_iscmp_ix_ix_ix  s/<a>/bg/
+}
+
+Parrot_isge_i_i_i {
+    Parrot_iscmp_ix_ix_ix  s/<a>/bge/
+}
+
+Parrot_isge_i_ic_i {
+    Parrot_iscmp_ix_ix_ix  s/<a>/bge/
+}
+
+Parrot_isge_i_i_ic {
+    Parrot_iscmp_ix_ix_ix  s/<a>/bge/
+}
+
+Parrot_isge_i_ic_ic {
+    Parrot_iscmp_ix_ix_ix  s/<a>/bge/
+}
+
+Parrot_isle_i_i_i {
+    Parrot_iscmp_ix_ix_ix  s/<a>/ble/
+}
+
+Parrot_isle_i_ic_i {
+    Parrot_iscmp_ix_ix_ix  s/<a>/ble/
+}
+
+Parrot_isle_i_i_ic {
+    Parrot_iscmp_ix_ix_ix  s/<a>/ble/
+}
+
+Parrot_isle_i_ic_ic {
+    Parrot_iscmp_ix_ix_ix  s/<a>/ble/
+}
+
+Parrot_islt_i_i_i {
+    Parrot_iscmp_ix_ix_ix  s/<a>/bl/
+}
+
+Parrot_islt_i_ic_i {
+    Parrot_iscmp_ix_ix_ix  s/<a>/bl/
+}
+
+Parrot_islt_i_i_ic {
+    Parrot_iscmp_ix_ix_ix  s/<a>/bl/
+}
+
+Parrot_islt_i_ic_ic {
+    Parrot_iscmp_ix_ix_ix  s/<a>/bl/
+}
+
+Parrot_iseq_i_i_i {
+    Parrot_iscmp_ix_ix_ix  s/<a>/be/
+}
+
+Parrot_iseq_i_ic_i {
+    Parrot_iscmp_ix_ix_ix  s/<a>/be/
+}
+
+Parrot_iseq_i_i_ic {
+    Parrot_iscmp_ix_ix_ix  s/<a>/be/
+}
+
+Parrot_iseq_i_ic_ic {
+    Parrot_iscmp_ix_ix_ix  s/<a>/be/
+}
+
+Parrot_isne_i_i_i {
+    Parrot_iscmp_ix_ix_ix  s/<a>/bne/
+}
+
+Parrot_isne_i_ic_i {
+    Parrot_iscmp_ix_ix_ix  s/<a>/bne/
+}
+
+Parrot_isne_i_i_ic {
+    Parrot_iscmp_ix_ix_ix  s/<a>/bne/
+}
+
+Parrot_isne_i_ic_ic {
+    Parrot_iscmp_ix_ix_ix  s/<a>/bne/
+}
+
 /*
  * Local variables:
  * c-indentation-style: bsd
Index: jit/sun4/jit_emit.h
===================================================================
RCS file: /cvs/public/parrot/jit/sun4/jit_emit.h,v
retrieving revision 1.28
diff -u -r1.28 jit_emit.h
--- jit/sun4/jit_emit.h 25 Sep 2004 14:44:22 -0000      1.28
+++ jit/sun4/jit_emit.h 2 Oct 2004 10:54:20 -0000
@@ -77,7 +77,7 @@
         emitm_rs1(rs1) | (low14); \
     pc +=4 ; }
 
-/* format 3b */
+/* format 3a */
 #define emitm_3a(pc, op, rd, op3, rs1, asi, rs2) \
     emitm_fmt3(pc, op, rd, op3, rs1, ((asi) << 5) | (rs2))
 
@@ -107,7 +107,8 @@
 #define emitm_restore_i(pc, rs1, i, rd)   emitm_3b(pc, 2, rd, 075, rs1, i)
 
 /* MOV */
-#define emitm_mov(pc, rs, rd) emitm_or_r(pc, emitm_g(0), rs, rd)
+#define emitm_mov_r(pc, rs, rd) emitm_or_r(pc, emitm_g(0), rs, rd)
+#define emitm_mov_i(pc, i, rd)  emitm_or_i(pc, emitm_g(0), i, rd)
 
 /* Integer Register Loads */
 
@@ -283,7 +284,7 @@
 /* Branch */
 #define emitm_bicc(pc, a, cond, disp22) emitm_2b(pc, a, cond, 02, disp22)
 
-#define jit_emit_mov_rr_i(pc, dst, src) emitm_mov(pc, src, dst)
+#define jit_emit_mov_rr_i(pc, dst, src) emitm_mov_r(pc, src, dst)
 #define jit_emit_mov_rr_n(pc, dst, src) { \
     emitm_fmovs(pc, src, dst); \
     emitm_fmovs(pc, (src)+1, (dst)+1); }
@@ -671,7 +672,7 @@
         (void (*)(void))interpreter->op_func_table[*(jit_info->cur_op)];
 
     emitm_call_30(jit_info->native_ptr, 0);
-    emitm_mov(jit_info->native_ptr, Parrot_jit_intrp, emitm_o(1));
+    emitm_mov_r(jit_info->native_ptr, Parrot_jit_intrp, emitm_o(1));
 }
 
 void Parrot_jit_cpcf_op(Parrot_jit_info_t *jit_info,

Reply via email to