Unified variables changes for common/i386.
[cacao.git] / src / vm / jit / i386 / emit.c
index 6cac7fd36b10ee06107334c29dcb1dafd58c971c..fbc38dcb7de51c62cb7410e05a5080293560eb85 100644 (file)
@@ -28,7 +28,7 @@
 
    Changes:
 
-   $Id: emit.c 5352 2006-09-05 22:51:48Z christian $
+   $Id: emit.c 5404 2006-09-07 13:29:05Z christian $
 
 */
 
@@ -62,7 +62,7 @@
 
 *******************************************************************************/
 
-inline s4 emit_load(jitdata *jd, instruction *iptr, stackptr src, s4 tempreg)
+inline s4 emit_load(jitdata *jd, instruction *iptr, varinfo *src, s4 tempreg)
 {
        codegendata  *cd;
        s4            disp;
@@ -72,7 +72,7 @@ inline s4 emit_load(jitdata *jd, instruction *iptr, stackptr src, s4 tempreg)
 
        cd = jd->cd;
 
-       if (src->flags & INMEMORY) {
+       if (IS_INMEMORY(src->flags)) {
                COUNT_SPILLS;
 
                disp = src->regoff * 4;
@@ -105,7 +105,7 @@ inline s4 emit_load(jitdata *jd, instruction *iptr, stackptr src, s4 tempreg)
 
 *******************************************************************************/
 
-inline s4 emit_load_low(jitdata *jd, instruction *iptr, stackptr src, s4 tempreg)
+inline s4 emit_load_low(jitdata *jd, instruction *iptr, varinfo *src,s4 tempreg)
 {
        codegendata  *cd;
        s4            disp;
@@ -118,7 +118,7 @@ inline s4 emit_load_low(jitdata *jd, instruction *iptr, stackptr src, s4 tempreg
        cd = jd->cd;
 
 
-       if (src->flags & INMEMORY) {
+       if (IS_INMEMORY(src->flags)) {
                COUNT_SPILLS;
 
                disp = src->regoff * 4;
@@ -140,7 +140,7 @@ inline s4 emit_load_low(jitdata *jd, instruction *iptr, stackptr src, s4 tempreg
 
 *******************************************************************************/
 
-inline s4 emit_load_high(jitdata *jd, instruction *iptr, stackptr src, s4 tempreg)
+inline s4 emit_load_high(jitdata *jd, instruction *iptr,varinfo *src,s4 tempreg)
 {
        codegendata  *cd;
        s4            disp;
@@ -152,7 +152,7 @@ inline s4 emit_load_high(jitdata *jd, instruction *iptr, stackptr src, s4 tempre
 
        cd = jd->cd;
 
-       if (src->flags & INMEMORY) {
+       if (IS_INMEMORY(src->flags)) {
                COUNT_SPILLS;
 
                disp = src->regoff * 4;
@@ -176,12 +176,12 @@ inline s4 emit_load_high(jitdata *jd, instruction *iptr, stackptr src, s4 tempre
 
 s4 emit_load_s1(jitdata *jd, instruction *iptr, s4 tempreg)
 {
-       stackptr      src;
+       varinfo       *src;
        s4            reg;
 
        /* get required compiler data */
 
-       src = iptr->s1.var;
+       src = &(jd->var[iptr->s1.varindex]);
 
        reg = emit_load(jd, iptr, src, tempreg);
    
@@ -197,12 +197,12 @@ s4 emit_load_s1(jitdata *jd, instruction *iptr, s4 tempreg)
 
 s4 emit_load_s2(jitdata *jd, instruction *iptr, s4 tempreg)
 {
-       stackptr      src;
+       varinfo       *src;
        s4            reg;
 
        /* get required compiler data */
 
-       src = iptr->sx.s23.s2.var;
+       src = &(jd->var[iptr->sx.s23.s2.varindex]);
 
        reg = emit_load(jd, iptr, src, tempreg);
        
@@ -218,12 +218,12 @@ s4 emit_load_s2(jitdata *jd, instruction *iptr, s4 tempreg)
 
 s4 emit_load_s3(jitdata *jd, instruction *iptr, s4 tempreg)
 {
-       stackptr      src;
+       varinfo       *src;
        s4            reg;
 
        /* get required compiler data */
 
-       src = iptr->sx.s23.s3.var;
+       src = &(jd->var[iptr->sx.s23.s3.varindex]);
 
        reg = emit_load(jd, iptr, src, tempreg);
 
@@ -240,13 +240,13 @@ s4 emit_load_s3(jitdata *jd, instruction *iptr, s4 tempreg)
 
 s4 emit_load_s1_low(jitdata *jd, instruction *iptr, s4 tempreg)
 {
-       stackptr      src;
+       varinfo       *src;
        s4            reg;
 
 
        /* get required compiler data */
 
-       src = iptr->s1.var;
+       src = &(jd->var[iptr->s1.varindex]);
 
        reg = emit_load_low(jd, iptr, src, tempreg);
 
@@ -265,12 +265,12 @@ s4 emit_load_s1_low(jitdata *jd, instruction *iptr, s4 tempreg)
 
 s4 emit_load_s2_low(jitdata *jd, instruction *iptr, s4 tempreg)
 {
-       stackptr      src;
+       varinfo       *src;
        s4            reg;
 
        /* get required compiler data */
 
-       src = iptr->sx.s23.s2.var;
+       src = &(jd->var[iptr->sx.s23.s2.varindex]);
 
        reg = emit_load_low(jd, iptr, src, tempreg);
 
@@ -287,12 +287,12 @@ s4 emit_load_s2_low(jitdata *jd, instruction *iptr, s4 tempreg)
 
 s4 emit_load_s1_high(jitdata *jd, instruction *iptr, s4 tempreg)
 {
-       stackptr      src;
+       varinfo       *src;
        s4            reg;
 
        /* get required compiler data */
 
-       src = iptr->s1.var;
+       src = &(jd->var[iptr->s1.varindex]);
 
        reg = emit_load_high(jd, iptr, src, tempreg);
 
@@ -309,12 +309,12 @@ s4 emit_load_s1_high(jitdata *jd, instruction *iptr, s4 tempreg)
 
 s4 emit_load_s2_high(jitdata *jd, instruction *iptr, s4 tempreg)
 {
-       stackptr      src;
+       varinfo       *src;
        s4            reg;
 
        /* get required compiler data */
 
-       src = iptr->sx.s23.s2.var;
+       src = &(jd->var[iptr->sx.s23.s2.varindex]);
 
        reg = emit_load_high(jd, iptr, src, tempreg);
 
@@ -328,7 +328,7 @@ s4 emit_load_s2_high(jitdata *jd, instruction *iptr, s4 tempreg)
 
 *******************************************************************************/
 
-inline void emit_store(jitdata *jd, instruction *iptr, stackptr dst, s4 d)
+inline void emit_store(jitdata *jd, instruction *iptr, varinfo *dst, s4 d)
 {
        codegendata  *cd;
 
@@ -336,7 +336,7 @@ inline void emit_store(jitdata *jd, instruction *iptr, stackptr dst, s4 d)
 
        cd = jd->cd;
 
-       if (dst->flags & INMEMORY) {
+       if (IS_INMEMORY(dst->flags)) {
                COUNT_SPILLS;
 
                if (IS_FLT_DBL_TYPE(dst->type)) {
@@ -362,7 +362,7 @@ inline void emit_store(jitdata *jd, instruction *iptr, stackptr dst, s4 d)
 
 *******************************************************************************/
 
-inline void emit_store_low(jitdata *jd, instruction *iptr, stackptr dst, s4 d)
+inline void emit_store_low(jitdata *jd, instruction *iptr, varinfo *dst, s4 d)
 {
        codegendata  *cd;
 
@@ -372,7 +372,7 @@ inline void emit_store_low(jitdata *jd, instruction *iptr, stackptr dst, s4 d)
 
        cd = jd->cd;
 
-       if (dst->flags & INMEMORY) {
+       if (IS_INMEMORY(dst->flags)) {
                COUNT_SPILLS;
                M_IST(GET_LOW_REG(d), REG_SP, dst->regoff * 4);
        }
@@ -386,7 +386,7 @@ inline void emit_store_low(jitdata *jd, instruction *iptr, stackptr dst, s4 d)
 
 *******************************************************************************/
 
-inline void emit_store_high(jitdata *jd, instruction *iptr, stackptr dst, s4 d)
+inline void emit_store_high(jitdata *jd, instruction *iptr, varinfo *dst, s4 d)
 {
        codegendata  *cd;
 
@@ -396,7 +396,7 @@ inline void emit_store_high(jitdata *jd, instruction *iptr, stackptr dst, s4 d)
 
        cd = jd->cd;
 
-       if (dst->flags & INMEMORY) {
+       if (IS_INMEMORY(dst->flags)) {
                COUNT_SPILLS;
                M_IST(GET_HIGH_REG(d), REG_SP, dst->regoff * 4 + 4);
        }
@@ -413,38 +413,52 @@ inline void emit_store_high(jitdata *jd, instruction *iptr, stackptr dst, s4 d)
 
 void emit_store_dst(jitdata *jd, instruction *iptr, s4 d)
 {
-       stackptr dst;
+       varinfo *dst;
        
-       dst = iptr->dst.var;
+       dst = &(jd->var[iptr->dst.varindex]);
 
        emit_store(jd, iptr, dst, d);
 }
 
+
 /* emit_copy *******************************************************************
 
-   XXX
+   Generates a register/memory to register/memory copy.
 
 *******************************************************************************/
 
-void emit_copy(jitdata *jd, instruction *iptr, stackptr src, stackptr dst)
+void emit_copy(jitdata *jd, instruction *iptr, varinfo *src, varinfo *dst)
 {
        codegendata  *cd;
-       registerdata *rd;
        s4            s1, d;
 
        /* get required compiler data */
 
        cd = jd->cd;
-       rd = jd->rd;
 
        if ((src->regoff != dst->regoff) ||
                ((src->flags ^ dst->flags) & INMEMORY)) {
-               if (IS_LNG_TYPE(src->type))
-                       d = codegen_reg_of_var(rd, iptr->opc, dst, REG_ITMP12_PACKED);
-               else
-                       d = codegen_reg_of_var(rd, iptr->opc, dst, REG_ITMP1);
 
-               s1 = emit_load(jd, iptr, src, d);
+               /* If one of the variables resides in memory, we can eliminate
+                  the register move from/to the temporary register with the
+                  order of getting the destination register and the load. */
+
+               if (IS_INMEMORY(src->flags)) {
+                       if (IS_LNG_TYPE(src->type))
+                               d = codegen_reg_of_var(iptr->opc, dst, REG_ITMP12_PACKED);
+                       else
+                               d = codegen_reg_of_var(iptr->opc, dst, REG_ITMP1);
+
+                       s1 = emit_load(jd, iptr, src, d);
+               }
+               else {
+                       if (IS_LNG_TYPE(src->type))
+                               s1 = emit_load(jd, iptr, src, REG_ITMP12_PACKED);
+                       else
+                               s1 = emit_load(jd, iptr, src, REG_ITMP1);
+
+                       d = codegen_reg_of_var(iptr->opc, dst, s1);
+               }
 
                if (s1 != d) {
                        if (IS_FLT_DBL_TYPE(src->type)) {