for using reserved registers on i386
authorchristian <none@none>
Thu, 14 Apr 2005 08:13:36 +0000 (08:13 +0000)
committerchristian <none@none>
Thu, 14 Apr 2005 08:13:36 +0000 (08:13 +0000)
src/vm/jit/i386/icmd_uses_reg_res.inc [new file with mode: 0644]

diff --git a/src/vm/jit/i386/icmd_uses_reg_res.inc b/src/vm/jit/i386/icmd_uses_reg_res.inc
new file mode 100644 (file)
index 0000000..05d27aa
--- /dev/null
@@ -0,0 +1,269 @@
+
+#define NO   0 /* Register survives this ICMD */
+#define S    1 /* Register can not be an source operand */
+#define D    2 /* Register can not be an destination operand */
+#define YES  4 /* Register does not survive this ICMD */
+
+int lsra_reg_res[REG_RES_CNT]={EAX, ECX, EDX};
+
+int icmd_uses_reg_res[256][REG_RES_CNT + 1] ={
+/*EAX, ECX, EDX, OUTPUT */
+{  NO,  NO,  NO, REG_NULL},    /* ICMD_NOP */
+{ YES,  NO,  NO, REG_NULL},    /* ICMD_ACONST */       
+{  NO,  NO,  NO, REG_NULL},    /* ICMD_NULLCHECKPOP */
+{  NO,  NO,  NO, REG_NULL},    /* ICMD_ICONST */       
+{  NO,  NO,  NO, REG_NULL}, /* ICMD_UNDEF4     */
+{ YES,  NO,  NO, REG_NULL},    /* ICMD_IDIVPOW2        */ 
+{ YES, YES,  NO, REG_NULL},    /* ICMD_LDIVPOW2        */
+{  NO,  NO,  NO, REG_NULL}, /* ICMD_UNDEF7     */
+{  NO,  NO,  NO, REG_NULL}, /* ICMD_UNDEF8     */
+{  NO,  NO,  NO, REG_NULL},    /* ICMD_LCONST */       
+{ YES, YES, YES, REG_NULL}, /* ICMD_LCMPCONST  */
+{ YES,  NO,  NO, REG_NULL},    /* ICMD_FCONST  */      
+{  NO,  NO,  NO, REG_NULL}, /* ICMD_UNDEF12    */
+{ YES, YES, YES, REG_NULL},    /* ICMD_ELSE_ICONST     */
+{ YES,  NO,  NO, REG_NULL},    /* ICMD_DCONST  */      
+{ YES, YES, YES, REG_NULL},    /* ICMD_IFEQ_ICONST     */
+{ YES, YES, YES, REG_NULL},    /* ICMD_IFNE_ICONST     */
+{ YES, YES, YES, REG_NULL},    /* ICMD_IFLT_ICONST     */
+{ YES, YES, YES, REG_NULL},    /* ICMD_IFGE_ICONST     */
+{ YES, YES, YES, REG_NULL},    /* ICMD_IFGT_ICONST     */
+{ YES, YES, YES, REG_NULL},    /* ICMD_IFLE_ICONST     */
+{ YES,  NO,  NO, REG_NULL},    /* ICMD_ILOAD   */ 
+{  NO,  NO,  NO, REG_NULL},    /* ICMD_LLOAD   */
+{  NO,  NO,  NO, REG_NULL},    /* ICMD_FLOAD   */
+{  NO,  NO,  NO, REG_NULL},    /* ICMD_DLOAD   */      
+{ YES,  NO,  NO, REG_NULL},    /* ICMD_ALOAD   */
+{  NO,  NO,  NO, REG_NULL},    /* ICMD_IADDCONST       */
+{  NO,  NO,  NO, REG_NULL},    /* ICMD_ISUBCONST       */
+{ YES,  NO,  NO, REG_NULL},    /* ICMD_IMULCONST       */
+{ YES,  NO,  NO, REG_NULL},    /* ICMD_IANDCONST       */
+{ YES,  NO,  NO, REG_NULL},    /* ICMD_IORCONST        */
+{ YES,  NO,  NO, REG_NULL},    /* ICMD_IXORCONST       */
+{ YES,  NO,  NO, REG_NULL},    /* ICMD_ISHLCONST       */
+{ YES,  NO,  NO, REG_NULL},    /* ICMD_ISHRCONST       */
+{ YES,  NO,  NO, REG_NULL},    /* ICMD_IUSHRCONST      */
+{ YES, YES,  NO, REG_NULL},    /* ICMD_IREMPOW2        */
+{  NO,  NO,  NO, REG_NULL},    /* ICMD_LADDCONST       */
+{ YES,  NO,  NO, REG_NULL},    /* ICMD_LSUBCONST       */      
+{ S|YES, S|YES, S|YES, REG_NULL},    /* ICMD_LMULCONST */
+{  NO,  NO,  NO, REG_NULL},    /* ICMD_LANDCONST       */
+{  NO,  NO,  NO, REG_NULL},    /* ICMD_LORCONST        */
+{  NO,  NO,  NO, REG_NULL},    /* ICMD_LXORCONST       */
+{ YES, YES,  NO, REG_NULL},    /* ICMD_LSHLCONST       */
+{ YES, YES,  NO, REG_NULL},    /* ICMD_LSHRCONST       */
+{ YES, YES,  NO, REG_NULL},    /* ICMD_LUSHRCONST      */
+{ YES, YES,  NO, REG_NULL},    /* ICMD_LREMPOW2        */
+{ S|YES, S|YES,  NO, REG_NULL},    /* ICMD_IALOAD      */
+{ S|YES, S|YES, S|YES, REG_NULL},  /* ICMD_LALOAD      */
+{ S|YES, S|YES,  NO, REG_NULL},    /* ICMD_FALOAD      */
+{ S|YES, S|YES,  NO, REG_NULL},    /* ICMD_DALOAD      */
+{ S|YES, S|YES,  NO, REG_NULL},    /* ICMD_AALOAD      */
+{ S|YES, S|YES,  NO, REG_NULL},    /* ICMD_BALOAD      */
+{ S|YES, S|YES,  NO, REG_NULL},    /* ICMD_CALOAD      */
+{ S|YES, S|YES,  NO, REG_NULL},    /* ICMD_SALOAD      */
+{ YES,  NO,  NO, REG_NULL},    /* ICMD_ISTORE  */
+{  NO,  NO,  NO, REG_NULL},    /* ICMD_LSTORE  */
+{  NO,  NO,  NO, REG_NULL},    /* ICMD_FSTORE  */
+{  NO,  NO,  NO, REG_NULL},    /* ICMD_DSTORE  */      
+{ YES,  NO,  NO, REG_NULL},    /* ICMD_ASTORE  */
+{ YES, YES, YES, REG_NULL},    /* ICMD_IF_LEQ  */
+{ YES, YES, YES, REG_NULL},    /* ICMD_IF_LNE  */
+{ YES, YES, YES, REG_NULL},    /* ICMD_IF_LLT  */
+{ YES, YES, YES, REG_NULL},    /* ICMD_IF_LGE  */
+{ YES, YES, YES, REG_NULL},    /* ICMD_IF_LGT  */
+{ YES, YES, YES, REG_NULL},    /* ICMD_IF_LLE  */
+{ YES, YES, YES, REG_NULL},    /* ICMD_IF_LCMPEQ       */
+{ YES, YES, YES, REG_NULL},    /* ICMD_IF_LCMPNE       */
+{ YES, YES, YES, REG_NULL},    /* ICMD_IF_LCMPLT       */
+{ YES, YES, YES, REG_NULL},    /* ICMD_IF_LCMPGE       */
+{ YES, YES, YES, REG_NULL},    /* ICMD_IF_LCMPGT       */
+{ YES, YES, YES, REG_NULL},    /* ICMD_IF_LCMPLE       */
+{  NO,  NO,  NO, REG_NULL}, /* ICMD_UNDEF71    */
+{  NO,  NO,  NO, REG_NULL}, /* ICMD_UNDEF72    */
+{  NO,  NO,  NO, REG_NULL}, /* ICMD_UNDEF73    */
+{  NO,  NO,  NO, REG_NULL}, /* ICMD_UNDEF74    */
+{  NO,  NO,  NO, REG_NULL}, /* ICMD_UNDEF75    */
+{  NO,  NO,  NO, REG_NULL}, /* ICMD_UNDEF76    */
+{  NO,  NO,  NO, REG_NULL}, /* ICMD_UNDEF77    */
+{  NO,  NO,  NO, REG_NULL}, /* ICMD_UNDEF78    */
+{ S|YES, S|YES, S|YES, REG_NULL},    /* ICMD_IASTORE   */
+{ S|YES, S|YES, S|YES, REG_NULL},    /* ICMD_LASTORE   */
+{ S|YES, S|YES,  NO, REG_NULL},    /* ICMD_FASTORE     */
+{ S|YES, S|YES,  NO, REG_NULL},    /* ICMD_DASTORE     */
+{ S|YES, S|YES, S|YES, REG_NULL},    /* ICMD_AASTORE   */
+{ S|YES, S|YES, S|YES, REG_NULL},    /* ICMD_BASTORE   */
+{ S|YES, S|YES, S|YES, REG_NULL},    /* ICMD_CASTORE   */
+{ S|YES, S|YES, S|YES, REG_NULL},    /* ICMD_SASTORE   */
+{  NO,  NO,  NO, REG_NULL},    /* ICMD_POP     */
+{  NO,  NO,  NO, REG_NULL},    /* ICMD_POP2    */
+{ YES,  NO,  NO, REG_NULL},    /* ICMD_DUP     */
+{ YES,  NO,  NO, REG_NULL},    /* ICMD_DUP_X1  */
+{ YES,  NO,  NO, REG_NULL},    /* ICMD_DUP_X2  */
+{ YES,  NO,  NO, REG_NULL},    /* ICMD_DUP2    */
+{ YES,  NO,  NO, REG_NULL},    /* ICMD_DUP2_X1 */
+{ YES,  NO,  NO, REG_NULL},    /* ICMD_DUP2_X2 */      
+{ YES,  NO,  NO, REG_NULL},    /* ICMD_SWAP    */
+{ S|YES,  NO,  NO, REG_NULL},    /* ICMD_IADD  */
+{ S|YES,  NO,  NO, REG_NULL},    /* ICMD_LADD  */
+{  NO,  NO,  NO, REG_NULL},    /* ICMD_FADD    */
+{  NO,  NO,  NO, REG_NULL},    /* ICMD_DADD    */
+{ S|YES,  NO,  NO, REG_NULL},    /* ICMD_ISUB  */
+{ YES,  NO,  NO, REG_NULL},    /* ICMD_LSUB    */
+{  NO,  NO,  NO, REG_NULL},    /* ICMD_FSUB    */
+{  NO,  NO,  NO, REG_NULL},    /* ICMD_DSUB    */
+{ S|YES,  NO,  NO, EAX},    /* ICMD_IMUL       */
+{ S|YES, S|YES, S|YES, REG_NULL},    /* ICMD_LMUL      */
+{  NO,  NO,  NO, REG_NULL},    /* ICMD_FMUL    */
+{  NO,  NO,  NO, REG_NULL},    /* ICMD_DMUL    */
+{ S|YES, S|YES, S|YES, EAX},    /* ICMD_IDIV   */ /* Really uses EDX? */
+{ YES, YES, YES, REG_NULL}, /* ICMD_LDIV       */
+{  NO,  NO,  NO, REG_NULL},    /* ICMD_FDIV    */
+{  NO,  NO,  NO, REG_NULL},    /* ICMD_DDIV    */
+{ S|YES, S|YES, S|YES, EDX},    /* ICMD_IREM   */     /* last checked */
+{ YES, YES, YES, REG_NULL}, /* ICMD_LREM       */
+{  NO,  NO,  NO, REG_NULL},    /* ICMD_FREM    */
+{  NO,  NO,  NO, REG_NULL},    /* ICMD_DREM    */
+{ YES,  NO,  NO, REG_NULL},    /* ICMD_INEG    */      
+{ YES,  NO,  NO, REG_NULL},    /* ICMD_LNEG    */      
+{  NO,  NO,  NO, REG_NULL},    /* ICMD_FNEG    */
+{  NO,  NO,  NO, REG_NULL},    /* ICMD_DNEG    */
+{ YES, D|S|YES,  NO, REG_NULL},    /* ICMD_ISHL        */
+{ S|YES, YES, S|YES, REG_NULL},    /* ICMD_LSHL        */
+{ YES, D|S|YES,  NO, REG_NULL},    /* ICMD_ISHR        */
+{ S|YES, YES, S|YES, REG_NULL},    /* ICMD_LSHR        */
+{ YES, D|S|YES,  NO, REG_NULL},    /* ICMD_IUSHR       */
+{ S|YES, YES, S|YES, REG_NULL},    /* ICMD_LUSHR       */
+{ S|YES,  NO,  NO, REG_NULL},    /* ICMD_IAND  */
+{ YES,  NO,  NO, REG_NULL},    /* ICMD_LAND    */
+{ S|YES,  NO,  NO, REG_NULL},    /* ICMD_IOR   */
+{ YES,  NO,  NO, REG_NULL},    /* ICMD_LOR     */
+{ S|YES,  NO,  NO, REG_NULL},    /* ICMD_IXOR  */
+{ YES,  NO,  NO, REG_NULL},    /* ICMD_LXOR    */
+{  NO,  NO,  NO, REG_NULL},    /* ICMD_IINC    */
+{ YES,  NO, YES, REG_NULL},    /* ICMD_I2L     */
+{ S|YES,  NO,  NO, REG_NULL},    /* ICMD_I2F   */
+{ S|YES,  NO,  NO, REG_NULL},    /* ICMD_I2D   */
+{ YES,  NO,  NO, REG_NULL},    /* ICMD_L2I     */
+{  NO,  NO,  NO, REG_NULL},    /* ICMD_L2F     */
+{  NO,  NO,  NO, REG_NULL},    /* ICMD_L2D     */
+{  D|YES, NO,  NO, EAX},         /* ICMD_F2I   */
+{  YES, NO, YES, REG_NULL},    /* ICMD_F2L     */
+{  NO,  NO,  NO, REG_NULL},    /* ICMD_F2D     */
+{  D|YES, NO,  NO, EAX},         /* ICMD_D2I   */
+{  YES, NO, YES, REG_NULL},    /* ICMD_D2L     */
+{  NO,  NO,  NO, REG_NULL},    /* ICMD_D2F     */
+{ YES,  NO,  NO, REG_NULL},    /* ICMD_INT2BYTE        */
+{ YES,  NO,  NO, REG_NULL},    /* ICMD_INT2CHAR        */
+{ YES,  NO,  NO, REG_NULL},    /* ICMD_INT2SHORT       */
+{ YES, YES, YES, REG_NULL}, /* ICMD_LCMP       */
+{ YES,  NO,  NO, REG_NULL},    /* ICMD_FCMPL   */
+{ YES,  NO,  NO, REG_NULL},    /* ICMD_FCMPG   */
+{ YES,  NO,  NO, REG_NULL},    /* ICMD_DCMPL   */
+{ YES,  NO,  NO, REG_NULL},    /* ICMD_DCMPG   */
+{ YES, YES, YES, REG_NULL},    /* ICMD_IFEQ    */
+{ YES, YES, YES, REG_NULL},    /* ICMD_IFNE    */
+{ YES, YES, YES, REG_NULL},    /* ICMD_IFLT    */
+{ YES, YES, YES, REG_NULL},    /* ICMD_IFGE    */
+{ YES, YES, YES, REG_NULL},    /* ICMD_IFGT    */
+{ YES, YES, YES, REG_NULL},    /* ICMD_IFLE    */
+{ YES, YES, YES, REG_NULL},    /* ICMD_IF_ICMPEQ       */
+{ YES, YES, YES, REG_NULL},    /* ICMD_IF_ICMPNE       */
+{ YES, YES, YES, REG_NULL},    /* ICMD_IF_ICMPLT       */
+{ YES, YES, YES, REG_NULL},    /* ICMD_IF_ICMPGE       */
+{ YES, YES, YES, REG_NULL},    /* ICMD_IF_ICMPGT       */
+{ YES, YES, YES, REG_NULL},    /* ICMD_IF_ICMPLE       */
+{ YES, YES, YES, REG_NULL},    /* ICMD_IF_ACMPEQ       */
+{ YES, YES, YES, REG_NULL},    /* ICMD_IF_ACMPNE       */
+{ YES, YES, YES, REG_NULL},    /* ICMD_GOTO    */
+{ YES, YES, YES, REG_NULL},    /* ICMD_JSR     */
+{ YES, YES, YES, REG_NULL},    /* ICMD_RET     */
+{ YES, YES, YES, REG_NULL},    /* ICMD_TABLESWITCH     */
+{ YES, YES, YES, REG_NULL},    /* ICMD_LOOKUPSWITCH    */
+{ YES, YES, YES, REG_NULL},    /* ICMD_IRETURN */
+{ YES, YES, YES, REG_NULL},    /* ICMD_LRETURN */
+{ YES, YES, YES, REG_NULL},    /* ICMD_FRETURN */
+{ YES, YES, YES, REG_NULL},    /* ICMD_DRETURN */
+{ YES, YES, YES, REG_NULL},    /* ICMD_ARETURN */
+{ YES, YES, YES, REG_NULL},    /* ICMD_RETURN  */
+{ S|YES, S|YES, S|YES, EAX},    /* ICMD_GETSTATIC*/   
+{ S|YES, S|YES, S|YES, REG_NULL},    /* ICMD_PUTSTATIC*/   
+{ YES, S|YES,  NO, REG_NULL},    /* ICMD_GETFIELD      */    
+{ S|YES, S|YES,  NO, REG_NULL},    /* ICMD_PUTFIELD    */   
+{ S|YES, YES, YES, EAX},        /* ICMD_INVOKEVIRTUAL  */    
+{ S|YES, YES, YES, EAX},        /* ICMD_INVOKESPECIAL  */  
+{ S|YES, YES, YES, EAX},        /* ICMD_INVOKESTATIC   */     
+{ S|YES, YES, YES, EAX},        /* ICMD_INVOKEINTERFACE*/
+{  NO,  NO,  NO, REG_NULL},    /* ICMD_CHECKASIZE      */
+{ YES, YES, YES, REG_NULL}, /* ICMD_NEW        */
+{ YES, YES, YES, REG_NULL}, /* ICMD_NEWARRAY   */
+{ YES, YES, YES, REG_NULL}, /* ICMD_ANEWARRAY  */
+{ YES,  NO,  NO, REG_NULL},    /* ICMD_ARRAYLENGTH     */
+{ YES, YES, YES, REG_NULL},    /* ICMD_ATHROW  */
+{ YES, S|YES, S|YES, REG_NULL},  /* ICMD_CHECKCAST     */
+/* { S|D|YES, S|D|YES, S|D|YES, REG_NULL}, */    /* ICMD_CHECKCAST     */
+{ D|YES, D|YES, YES, REG_NULL},    /* ICMD_INSTANCEOF  */
+/*{ S|D|YES, S|D|YES, S|D|YES, REG_NULL}, */    /* ICMD_INSTANCEOF     */
+{ YES, YES, YES, REG_NULL}, /* ICMD_MONITORENTER       */
+{ YES, YES, YES, REG_NULL}, /* ICMD_MONITOREXIT        */
+{  NO,  NO,  NO, REG_NULL}, /* ICMD_UNDEF196   */
+{ S|YES, YES, YES, EAX},       /* ICMD_MULTIANEWARRAY  */
+{ YES, YES, YES, REG_NULL},    /* ICMD_IFNULL  */
+{ YES, YES, YES, REG_NULL},    /* ICMD_IFNONNULL       */
+{ YES, YES, YES, REG_NULL}, /* ICMD_UNDEF200   */
+{ YES, YES, YES, REG_NULL}, /* ICMD_UNDEF201   */
+{ YES, YES, YES, REG_NULL}, /* ICMD_UNDEF202   */
+{ YES,  NO,  NO, REG_NULL},    /* ICMD_CHECKEXCEPTION  */
+{ S|YES, S|YES,  NO, REG_NULL},    /* ICMD_IASTORECONST        */
+{ S|YES, S|YES,  NO, REG_NULL},    /* ICMD_LASTORECONST        */
+{ S|YES, S|YES, YES, REG_NULL}, /* ICMD_FASTORECONST   */
+{ S|YES, S|YES, YES, REG_NULL}, /* ICMD_DASTORECONST   */
+{ S|YES, S|YES,  NO, REG_NULL},    /* ICMD_AASTORECONST        */
+{ S|YES, S|YES,  NO, REG_NULL},    /* ICMD_BASTORECONST        */
+{ S|YES, S|YES,  NO, REG_NULL},    /* ICMD_CASTORECONST        */
+{ S|YES, S|YES,  NO, REG_NULL},    /* ICMD_SASTORECONST        */
+{ S|YES, S|YES, S|YES, REG_NULL},    /* ICMD_PUTSTATICCONST */
+{  YES,  NO,  NO, REG_NULL},    /* ICMD_PUTFIELDCONST */
+{ YES, YES, YES, REG_NULL}, /* ICMD_IMULPOW2 */
+{ YES, YES, YES, REG_NULL}, /* ICMD_LMULPOW2 */
+{  NO,  NO,  NO, REG_NULL}, /*         "UNDEF216"      */
+{  NO,  NO,  NO, REG_NULL}, /*         ,"UNDEF217"     */
+{  NO,  NO,  NO, REG_NULL}, /*         ,"UNDEF218"     */
+{  NO,  NO,  NO, REG_NULL}, /*         ,"UNDEF219"     */
+{  NO,  NO,  NO, REG_NULL}, /*         ,"UNDEF220",    */
+{  NO,  NO,  NO, REG_NULL}, /*         "UNDEF" */
+{  NO,  NO,  NO, REG_NULL}, /*         ,"UNDEF"        */
+{  NO,  NO,  NO, REG_NULL}, /*         ,"UNDEF"        */
+{  NO,  NO,  NO, REG_NULL}, /*         ,"UNDEF"        */
+{  NO,  NO,  NO, REG_NULL}, /*         ,"UNDEF",       */
+{  NO,  NO,  NO, REG_NULL}, /*         "UNDEF226"      */
+{  NO,  NO,  NO, REG_NULL}, /*         ,"UNDEF227"     */
+{  NO,  NO,  NO, REG_NULL}, /*         ,"UNDEF228"     */
+{  NO,  NO,  NO, REG_NULL}, /*         ,"UNDEF229"     */
+{  NO,  NO,  NO, REG_NULL}, /*         ,"UNDEF230",    */
+{  NO,  NO,  NO, REG_NULL}, /*         "UNDEF" */
+{  NO,  NO,  NO, REG_NULL}, /*         ,"UNDEF"        */
+{  NO,  NO,  NO, REG_NULL}, /*         ,"UNDEF"        */
+{  NO,  NO,  NO, REG_NULL}, /*         ,"UNDEF"        */
+{  NO,  NO,  NO, REG_NULL}, /*         ,"UNDEF",       */
+{  NO,  NO,  NO, REG_NULL}, /*         "UNDEF236"      */
+{  NO,  NO,  NO, REG_NULL}, /*         ,"UNDEF237"     */
+{  NO,  NO,  NO, REG_NULL}, /*         ,"UNDEF238"     */
+{  NO,  NO,  NO, REG_NULL}, /*         ,"UNDEF239"     */
+{  NO,  NO,  NO, REG_NULL}, /*         ,"UNDEF240",    */
+{  NO,  NO,  NO, REG_NULL}, /*         "UNDEF" */
+{  NO,  NO,  NO, REG_NULL}, /*         ,"UNDEF"        */
+{  NO,  NO,  NO, REG_NULL}, /*         ,"UNDEF"        */
+{  NO,  NO,  NO, REG_NULL}, /*         ,"UNDEF"        */
+{  NO,  NO,  NO, REG_NULL}, /*         ,"UNDEF",       */
+{  NO,  NO,  NO, REG_NULL}, /*         "UNDEF246"      */
+{  NO,  NO,  NO, REG_NULL}, /*         ,"UNDEF247"     */
+{  NO,  NO,  NO, REG_NULL}, /*         ,"UNDEF248"     */
+{  NO,  NO,  NO, REG_NULL}, /*         ,"UNDEF249"     */
+{  NO,  NO,  NO, REG_NULL}, /*         ,"UNDEF250",    */
+{  NO,  NO,  NO, REG_NULL},    /* ICMD_INLINE_START    */
+{  NO,  NO,  NO, REG_NULL},    /* ICMD_INLINE_END      */
+{ S|YES, YES, YES, EAX},       /* ICMD_BUILTIN3        */  
+{ S|YES, YES, YES, EAX},       /* ICMD_BUILTIN2        */   
+{ S|YES, YES, YES, EAX},       /* ICMD_BUILTIN1        */   
+};