You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by ch...@apache.org on 2009/02/25 17:49:14 UTC

svn commit: r747857 - in /harmony/enhanced/drlvm/trunk/vm: jitrino/src/codegenerator/ia32/ jitrino/src/optimizer/ port/src/encoder/ia32_em64t/

Author: chunrong
Date: Wed Feb 25 16:49:13 2009
New Revision: 747857

URL: http://svn.apache.org/viewvc?rev=747857&view=rev
Log:
Apply patch for HARMONY-5901, adding integer MUL/DIV/REM strength reduction in drlvm jit

Modified:
    harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32Encoder.cpp
    harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32IRConstants.h
    harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32Inst.h
    harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32InstCodeSelector.cpp
    harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/multiplybyconstant.cpp
    harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/simplifier.cpp
    harmony/enhanced/drlvm/trunk/vm/port/src/encoder/ia32_em64t/enc_defs.h

Modified: harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32Encoder.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32Encoder.cpp?rev=747857&r1=747856&r2=747857&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32Encoder.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32Encoder.cpp Wed Feb 25 16:49:13 2009
@@ -82,13 +82,8 @@
 
 const Encoder::MemOpndConstraints Encoder::memOpndConstraints[16]= {
     {{
-#ifdef _EM64T_
-    Constraint(OpndKind_GPReg, OpndSize_64), 
-    Constraint(OpndKind_GPReg, OpndSize_64),
-#else
     Constraint(OpndKind_GPReg, OpndSize_32), 
     Constraint(OpndKind_GPReg, OpndSize_32),
-#endif
     Constraint(OpndKind_Imm, OpndSize_32),
     Constraint(OpndKind_Imm, OpndSize_32) }}, 
     // others contain null constraints, to be fixed later

Modified: harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32IRConstants.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32IRConstants.h?rev=747857&r1=747856&r2=747857&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32IRConstants.h (original)
+++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32IRConstants.h Wed Feb 25 16:49:13 2009
@@ -64,6 +64,7 @@
     MemOpndKind_Stack=0x1f,
     MemOpndKind_Heap=0x20,
     MemOpndKind_ConstantArea=0x40,
+    MemOpndKind_LEA=0x80,
     MemOpndKind_Any=0xff,
 };
 

Modified: harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32Inst.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32Inst.h?rev=747857&r1=747856&r2=747857&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32Inst.h (original)
+++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32Inst.h Wed Feb 25 16:49:13 2009
@@ -343,7 +343,7 @@
      */
     bool isSubjectForLivenessAnalysis()const
     {
-        return (memOpndKind&(MemOpndKind_StackManualLayout|MemOpndKind_ConstantArea|MemOpndKind_Heap))==0 && !isPlacedIn(OpndKind_Imm);
+        return (memOpndKind&(MemOpndKind_StackManualLayout|MemOpndKind_ConstantArea|MemOpndKind_Heap|MemOpndKind_LEA))==0 && !isPlacedIn(OpndKind_Imm);
     }
 
     /** Returns the segment register used with the operand (memory). */

Modified: harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32InstCodeSelector.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32InstCodeSelector.cpp?rev=747857&r1=747856&r2=747857&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32InstCodeSelector.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32InstCodeSelector.cpp Wed Feb 25 16:49:13 2009
@@ -1201,12 +1201,32 @@
 
 //_______________________________________________________________________________________________________________
 //  Shift left and add
-
+#define LEA_EXP_LIMIT 3
 CG_OpndHandle*    InstCodeSelector::shladd(IntegerOp::Types opType, 
                                               CG_OpndHandle*   value, 
                                               U_32           imm, 
                                               CG_OpndHandle*   addto)  
 { 
+    if ((opType == IntegerOp::I4) && (imm <= LEA_EXP_LIMIT)) {
+        Type * dstType = irManager.getTypeFromTag(Type::Int32);
+        bool addtoIsImm = false;
+        if (((Opnd*)addto)->isPlacedIn(OpndKind_Imm))
+            addtoIsImm = true;
+        Opnd *res;
+        if (addtoIsImm) {
+            res = irManager.newMemOpnd(dstType, NULL, (Opnd*)value, 
+                irManager.newImmOpnd(typeManager.getInt32Type(), 1<<imm), (Opnd*)addto);
+        } else {
+            res = irManager.newMemOpnd(dstType, (Opnd*)addto, (Opnd*)value, 
+                irManager.newImmOpnd(typeManager.getInt32Type(), 1<<imm), NULL);
+        }
+        res->setMemOpndKind(MemOpndKind_LEA);
+        Opnd *dst = irManager.newOpnd(dstType);
+        Inst *newInst = irManager.newInstEx(Mnemonic_LEA, 1, dst, res);
+        appendInsts(newInst);
+        return dst;
+    }
+
     Opnd * shiftDest = (Opnd *)shl(opType, value, irManager.newImmOpnd(typeManager.getUInt8Type(), imm));
     ArithmeticOp::Types atype;
     switch (opType) {

Modified: harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/multiplybyconstant.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/multiplybyconstant.cpp?rev=747857&r1=747856&r2=747857&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/multiplybyconstant.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/multiplybyconstant.cpp Wed Feb 25 16:49:13 2009
@@ -172,7 +172,7 @@
             assert(sp < stackDepth);
             switch (op) {
             case MulOp::pushc: assert(ip<len); thestack[sp] = data[ip++]; when[sp] = 0; sp += 1; break;
-            case MulOp::pushy: thestack[sp] = y; when[sp] = 0; sp += 1; break;
+            case MulOp::pushy: thestack[sp] = y; when[sp] = COST_LOADY; sp += 1; break;
             case MulOp::swap: assert(sp >= 2); ::std::swap(thestack[sp-1], thestack[sp-2]); ::std::swap(when[sp-1], when[sp-2]); break;
             case MulOp::dup: assert(sp >= 1); thestack[sp] = thestack[sp-1]; when[sp] = when[sp-1]; sp += 1; break;
             case MulOp::dup2: assert(sp >= 2); thestack[sp] = thestack[sp-2]; when[sp] = when[sp-2]; sp += 1; break;
@@ -255,6 +255,8 @@
         int ip = 0;
         int sp = 0;
         int subnum = 0;
+        if (len == 0)
+            return; // no reduction
         while (ip < len) {
             enum MulOp::Op op = (enum MulOp::Op) data[ip];
             ip += 1;
@@ -351,6 +353,8 @@
         thestack[0] = 0;
         int ip = 0;
         int sp = 0;
+        if (len == 0)
+            return NULL; // no reduction
         while (ip < len) {
             enum MulOp::Op op = (enum MulOp::Op) data[ip];
             ip += 1;
@@ -442,6 +446,14 @@
         int k = width - 1;
         m.append(MulOp::pushy); m.append(MulOp::shiftl, k);
     } else {
+    /* ONLY DO REDUCTION FOR THE TWO CASES */
+        if ((d < 32) && (d > 0)) {
+            planMulLookup<inttype, width>(m, d, depth+1);
+        } else if (isPowerOf2(d)) {
+            int k = whichPowerOf2<inttype, width>(d);
+            m.append(MulOp::pushy); m.append(MulOp::shiftl, k);
+        }
+    /* 
         if (d < 0) {
             planMulNeg<inttype, width>(m, d, depth);
         } else if (d < 32) {
@@ -452,6 +464,7 @@
         } else {
             planMulLarge<inttype, width>(m, d, depth+1);
         }
+    */
     }
 #ifdef TEST_OUTPUT
     DEBUGPRINT2("planMul(" << d << ")", res);
@@ -875,50 +888,36 @@
     case 0: m.append(MulOp::pushc, 0); break;
     case 1: m.append(MulOp::pushy); break;
     case 2: m.append(MulOp::pushy); m.append(MulOp::pushc, 0); m.append(MulOp::shladd, 1); break;
-    case 3: m.append(MulOp::pushy); m.append(MulOp::pushy); m.append(MulOp::shladd, 1); break;
+    case 3: m.append(MulOp::pushy); m.append(MulOp::dup); m.append(MulOp::shladd, 1); break;
     case 4: m.append(MulOp::pushy); m.append(MulOp::pushc, 0); m.append(MulOp::shladd, 2); break;
-    case 5: m.append(MulOp::pushy); m.append(MulOp::pushy); m.append(MulOp::shladd, 2); break;
+    case 5: m.append(MulOp::pushy); m.append(MulOp::dup); m.append(MulOp::shladd, 2); break;
     case 6: 
-        m.append(MulOp::pushy); m.append(MulOp::pushy); m.append(MulOp::shladd, 1);
+        m.append(MulOp::pushy); m.append(MulOp::dup); m.append(MulOp::shladd, 1);
         m.append(MulOp::pushc, 0); m.append(MulOp::shladd, 1); break;
     case 7:
-        m.append(MulOp::pushy); m.append(MulOp::pushy); m.append(MulOp::shladd, 1);
+        m.append(MulOp::pushy); m.append(MulOp::dup); m.append(MulOp::shladd, 1);
         m.append(MulOp::pushy); m.append(MulOp::shladd, 1); break;
     case 8: m.append(MulOp::pushy); m.append(MulOp::pushc, 0); m.append(MulOp::shladd, 3); break;
-    case 9: m.append(MulOp::pushy); m.append(MulOp::pushy); m.append(MulOp::shladd, 3); break;
+    case 9: m.append(MulOp::pushy); m.append(MulOp::dup); m.append(MulOp::shladd, 3); break;
     case 10:
-        m.append(MulOp::pushy); m.append(MulOp::pushy); m.append(MulOp::shladd, 2);
+        m.append(MulOp::pushy); m.append(MulOp::dup); m.append(MulOp::shladd, 2);
         m.append(MulOp::pushc, 0); m.append(MulOp::shladd, 1); break;
     case 11:
-        m.append(MulOp::pushy); m.append(MulOp::pushy); m.append(MulOp::shladd, 2);
+        m.append(MulOp::pushy); m.append(MulOp::dup); m.append(MulOp::shladd, 2);
         m.append(MulOp::pushy); m.append(MulOp::shladd, 1); break;
     case 12:
-        m.append(MulOp::pushy); m.append(MulOp::pushy); m.append(MulOp::shladd, 1);
+        m.append(MulOp::pushy); m.append(MulOp::dup); m.append(MulOp::shladd, 1);
         m.append(MulOp::pushc, 0); m.append(MulOp::shladd, 2); break;
     case 13:
-        m.append(MulOp::pushy); m.append(MulOp::pushy); m.append(MulOp::shladd, 1);
+        m.append(MulOp::pushy); m.append(MulOp::dup); m.append(MulOp::shladd, 1);
         m.append(MulOp::pushy); m.append(MulOp::shladd, 2); break;
     case 14:
-        m.append(MulOp::pushy); 
-        if (m.SMALL_SHIFT_MAXBITS == 4) {
-            m.append(MulOp::pushc, 0); m.append(MulOp::shladd, 4);
-        } else if (m.SMALL_SHIFT_MAXBITS == 3) {
-            m.append(MulOp::shiftl, 4);
-        } else {
-            assert(0);
-        }
-        m.append(MulOp::pushy); m.append(MulOp::pushc, 0); m.append(MulOp::shladd, 1);
-        m.append(MulOp::sub); break;
+        m.append(MulOp::pushy); m.append(MulOp::dup); m.append(MulOp::shladd, 1);
+        m.append(MulOp::pushy); m.append(MulOp::shladd, 1);
+        m.append(MulOp::pushc, 0); m.append(MulOp::shladd, 1); break;
     case 15:
-        m.append(MulOp::pushy); 
-        if (m.SMALL_SHIFT_MAXBITS == 4) {
-            m.append(MulOp::pushc, 0); m.append(MulOp::shladd, 4);
-        } else if (m.SMALL_SHIFT_MAXBITS == 3) {
-            m.append(MulOp::shiftl, 4);
-        } else {
-            assert(0);
-        }
-        m.append(MulOp::pushy); m.append(MulOp::sub); break;
+        m.append(MulOp::pushy); m.append(MulOp::dup); m.append(MulOp::shladd, 1);
+        m.append(MulOp::dup); m.append(MulOp::shladd, 2); break;
     case 16:
         m.append(MulOp::pushy); 
         if (m.SMALL_SHIFT_MAXBITS == 4) {
@@ -930,70 +929,58 @@
         }
         break;
     case 17:
-        if (m.SMALL_SHIFT_MAXBITS == 4) {
-            m.append(MulOp::pushy); m.append(MulOp::pushy); m.append(MulOp::shladd, 4);
-        } else if (m.SMALL_SHIFT_MAXBITS == 3) {
-            m.append(MulOp::pushy); m.append(MulOp::pushy); m.append(MulOp::shiftl, 4); m.append(MulOp::add);
-        } else {
-            assert(0);
-        }
+        m.append(MulOp::pushy); m.append(MulOp::pushc, 0); m.append(MulOp::shladd, 3);
+        m.append(MulOp::pushy); m.append(MulOp::shladd, 1);
         break;
     case 18:
-        m.append(MulOp::pushy); m.append(MulOp::pushy); m.append(MulOp::shladd, 3); 
+        m.append(MulOp::pushy); m.append(MulOp::dup); m.append(MulOp::shladd, 3); 
         m.append(MulOp::pushc, 0); m.append(MulOp::shladd, 1); break;
     case 19:
-        m.append(MulOp::pushy); m.append(MulOp::pushy); m.append(MulOp::shladd, 3); 
+        m.append(MulOp::pushy); m.append(MulOp::dup); m.append(MulOp::shladd, 3); 
         m.append(MulOp::pushy); m.append(MulOp::shladd, 1); break;
     case 20:
-        m.append(MulOp::pushy); m.append(MulOp::pushy); m.append(MulOp::shladd, 2); 
+        m.append(MulOp::pushy); m.append(MulOp::dup); m.append(MulOp::shladd, 2); 
         m.append(MulOp::pushc, 0); m.append(MulOp::shladd, 2); break;
     case 21:
-        m.append(MulOp::pushy); m.append(MulOp::pushy); m.append(MulOp::shladd, 2); 
+        m.append(MulOp::pushy); m.append(MulOp::dup); m.append(MulOp::shladd, 2); 
         m.append(MulOp::pushy); m.append(MulOp::shladd, 2); break;
     case 22:
-        m.append(MulOp::pushy); m.append(MulOp::pushy); m.append(MulOp::shladd, 1);
-        m.append(MulOp::pushy); 
-        if (m.SMALL_SHIFT_MAXBITS == 4) {
-            m.append(MulOp::pushc, 0); m.append(MulOp::shladd, 4);
-        } else if (m.SMALL_SHIFT_MAXBITS == 3) {
-            m.append(MulOp::shiftl, 4);
-        } else {
-            assert(0);
-        }
-        m.append(MulOp::shladd, 1); break;
+        m.append(MulOp::pushy); m.append(MulOp::dup); m.append(MulOp::shladd, 2);
+        m.append(MulOp::pushy); m.append(MulOp::shladd, 1);
+        m.append(MulOp::pushc, 0); m.append(MulOp::shladd, 1); break;
     case 23:
-        m.append(MulOp::pushy); m.append(MulOp::pushy); m.append(MulOp::shladd, 1);
-        m.append(MulOp::pushy); m.append(MulOp::neg);
-        m.append(MulOp::shladd, 3); break;
+        m.append(MulOp::pushy); m.append(MulOp::dup); m.append(MulOp::shladd, 2);
+        m.append(MulOp::pushy); m.append(MulOp::shladd, 1);
+        m.append(MulOp::pushy); m.append(MulOp::shladd, 1); break;
     case 24:
-        m.append(MulOp::pushy); m.append(MulOp::pushy); m.append(MulOp::shladd, 1);
+        m.append(MulOp::pushy); m.append(MulOp::dup); m.append(MulOp::shladd, 1);
         m.append(MulOp::pushc, 0); m.append(MulOp::shladd, 3); break;
     case 25:
-        m.append(MulOp::pushy); m.append(MulOp::pushy); m.append(MulOp::shladd, 1);
+        m.append(MulOp::pushy); m.append(MulOp::dup); m.append(MulOp::shladd, 1);
         m.append(MulOp::pushy); m.append(MulOp::shladd, 3); break;
     case 26:
-        m.append(MulOp::pushy); m.append(MulOp::pushy); m.append(MulOp::shladd, 1);
-        m.append(MulOp::pushy); m.append(MulOp::pushc, 0); m.append(MulOp::shladd, 1);
-        m.append(MulOp::shladd, 3); break;
+        m.append(MulOp::pushy); m.append(MulOp::dup); m.append(MulOp::shladd, 1);
+        m.append(MulOp::pushy); m.append(MulOp::shladd, 2);
+        m.append(MulOp::pushc, 0); m.append(MulOp::shladd, 1); break;
     case 27:
-        m.append(MulOp::pushy); m.append(MulOp::pushy); m.append(MulOp::shladd, 1);
+        m.append(MulOp::pushy); m.append(MulOp::dup); m.append(MulOp::shladd, 1);
         m.append(MulOp::dup); m.append(MulOp::shladd, 3); break;
     case 28:
-        m.append(MulOp::pushy); m.append(MulOp::neg);
-        m.append(MulOp::pushy); m.append(MulOp::shiftl, 5);
-        m.append(MulOp::shladd, 2); break;
+        m.append(MulOp::pushy); m.append(MulOp::dup); m.append(MulOp::shladd, 1);
+        m.append(MulOp::pushy); m.append(MulOp::shladd, 1);
+        m.append(MulOp::pushc, 0); m.append(MulOp::shladd, 2); break;
     case 29:
-        m.append(MulOp::pushy); m.append(MulOp::pushy); m.append(MulOp::shladd, 1);
+        m.append(MulOp::pushy); m.append(MulOp::dup); m.append(MulOp::shladd, 1);
         m.append(MulOp::pushy); m.append(MulOp::shladd, 1);
         m.append(MulOp::pushy); m.append(MulOp::shladd, 2); break;
     case 30:
-        m.append(MulOp::pushy); m.append(MulOp::neg);
-        m.append(MulOp::pushy); m.append(MulOp::shiftl, 5);
-        m.append(MulOp::shladd, 1); break;
+        m.append(MulOp::pushy); m.append(MulOp::dup); m.append(MulOp::shladd, 1);
+        m.append(MulOp::dup); m.append(MulOp::shladd, 2);
+        m.append(MulOp::pushc, 0); m.append(MulOp::shladd, 1); break;
     case 31:
-        m.append(MulOp::pushy); m.append(MulOp::neg);
-        m.append(MulOp::pushy); m.append(MulOp::shiftl, 5);
-        m.append(MulOp::add); break;
+        m.append(MulOp::pushy); m.append(MulOp::dup); m.append(MulOp::shladd, 1);
+        m.append(MulOp::dup); m.append(MulOp::shladd, 2);
+        m.append(MulOp::pushy); m.append(MulOp::shladd, 1); break;
     default:
         assert(0);
     }

Modified: harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/simplifier.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/simplifier.cpp?rev=747857&r1=747856&r2=747857&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/simplifier.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/simplifier.cpp Wed Feb 25 16:49:13 2009
@@ -1185,10 +1185,9 @@
         return NULL;
     }
 
-    // convert multiply-by-constant to shifts if this is a late simplify pass
-    if (isLate) {
-        if (src1isConstant || src2isConstant) {
-            switch (type->tag) {
+    // reduce multiply-by-constant
+    if (src1isConstant || src2isConstant) {
+        switch (type->tag) {
             case Type::Int32:
             case Type::UInt32:
                 if (src1isConstant) {
@@ -1227,10 +1226,10 @@
                    
             default:
                 break;
-            }
         }
     }
 
+
     //
     // Inversion
     //
@@ -1321,11 +1320,10 @@
     if (src2isConstant && ConstantFolder::isConstantZero(src2))
         return src2;
 
-    // convert multiply-by-constant to shifts if this is a late simplify pass
-    if (isLate) {
-        if (src1isConstant || src2isConstant) {
-            bool isSigned = false;
-            switch (type->tag) {
+    // reduce multiply-by-constant
+    if (src1isConstant || src2isConstant) {
+        bool isSigned = false;
+        switch (type->tag) {
             case Type::Int32: isSigned = true;
             case Type::UInt32:
                 if (src1isConstant) {
@@ -1373,10 +1371,9 @@
 
             default:
                 break;
-            }
         }
     }
-
+    
     return NULL;
 }
 
@@ -1445,7 +1442,7 @@
                     src2->getInst()->asConstInst(),
                     mod.isSigned());
     
-#ifdef _IPF_
+
     const OptimizerFlags& optimizerFlags = irManager.getOptimizerFlags();
     //
     // further ops only for integers
@@ -1485,92 +1482,123 @@
             return opnd;
         
         // convert other cases to MulHi and shift if lower_divconst set
-        if (optimizerFlags.lower_divconst &&
-            (dstType->tag == Type::Int32) &&
-            mod.isSigned()) {
-
-            I_32 denom = value2.i4;
-            // note that 0 and 1 were handled above
-            if (denom == -1) {
-                // convert to neg
-                Opnd *res = genNeg(dstType, src1)->getDst();
-                return res;
-            } else if (isPowerOf2<I_32>(denom)) {
-                // convert to shift and such
-                I_32 absdenom = (denom < 0) ? -denom : denom;
-                int k = whichPowerOf2<I_32,32>(absdenom);
-                Opnd *kminus1 = genLdConstant((I_32)(k - 1))->getDst();
-                // make k-1 copies of the sign bit
-                Opnd *shiftTheSign = genShr(dstType, 
-                                            Modifier(SignedOp)|Modifier(ShiftMask_None),
-                                            src1, kminus1)->getDst();
-                // we 32-k zeros in on left to put copies of sign on right
-                Opnd *t32minusk = genLdConstant((I_32)(32-k))->getDst();
-                // if (n<0), this is 2^k-1, else 0
-                Opnd *kminus1ones = genShr(dstType, 
-                                           Modifier(UnsignedOp)|Modifier(ShiftMask_None),
-                                           shiftTheSign, t32minusk)->getDst();
-                Opnd *added = genAdd(dstType, Modifier(Overflow_None)|Modifier(Exception_Never)|Modifier(Strict_No),
-                                     src1, kminus1ones)->getDst();
-                Opnd *kOpnd = genLdConstant((I_32)k)->getDst();
-                Opnd *res = genShr(dstType, Modifier(SignedOp)|Modifier(ShiftMask_None),
-                                   added, kOpnd)->getDst();
-                if (denom != absdenom) { // ((denom < 0) && (k < 31))
-                    res = genNeg(dstType, res)->getDst();
-                }
-                return res;
-            } else {
-                // convert to MulHi and such
-                I_32 magicNum, shiftBy;
-                getMagic<I_32, U_32, 32>(denom, &magicNum, &shiftBy);
-                
-                Opnd *mulRes;
-                if (optimizerFlags.use_mulhi) {
-                    Opnd *magicOpnd = genLdConstant(magicNum)->getDst();
-                    mulRes = genMulHi(dstType, SignedOp, magicOpnd,
-                                      src1)->getDst();
+        if (optimizerFlags.lower_divconst && mod.isSigned()) {
+            if (dstType->tag == Type::Int32) {
+                I_32 denom = value2.i4;
+                // note that 0 and 1 were handled above
+                if (denom == -1) {
+                    // convert to neg
+                    Opnd *res = genNeg(dstType, src1)->getDst();
+                    return res;
+                } else if (isPowerOf2<I_32>(denom)) {
+                    // convert to shift and such
+                    I_32 absdenom = (denom < 0) ? -denom : denom;
+                    int k = whichPowerOf2<I_32,32>(absdenom);
+                    Opnd *kminus1 = genLdConstant((I_32)(k - 1))->getDst();
+                    // make k-1 copies of the sign bit
+                    Opnd *shiftTheSign = genShr(dstType, 
+                                                Modifier(SignedOp)|Modifier(ShiftMask_None),
+                                                src1, kminus1)->getDst();
+                    // we 32-k zeros in on left to put copies of sign on right
+                    Opnd *t32minusk = genLdConstant((I_32)(32-k))->getDst();
+                    // if (n<0), this is 2^k-1, else 0
+                    Opnd *kminus1ones = genShr(dstType, 
+                                               Modifier(UnsignedOp)|Modifier(ShiftMask_None),
+                                               shiftTheSign, t32minusk)->getDst();
+                    Opnd *added = genAdd(dstType, Modifier(Overflow_None)|Modifier(Exception_Never)|Modifier(Strict_No),
+                                         src1, kminus1ones)->getDst();
+                    Opnd *kOpnd = genLdConstant((I_32)k)->getDst();
+                    Opnd *res = genShr(dstType, Modifier(SignedOp)|Modifier(ShiftMask_None),
+                                       added, kOpnd)->getDst();
+                    if (denom != absdenom) { // ((denom < 0) && (k < 31))
+                        res = genNeg(dstType, res)->getDst();
+                    }
+                    return res;
                 } else {
-                    Opnd *magicOpnd = genLdConstant((int64)magicNum)->getDst();
-                    TypeManager &tm = irManager.getTypeManager();
-                    Type *dstType64 = tm.getInt64Type();
-                    Opnd *src64 = genConv(dstType64, Type::Int64, Modifier(Overflow_None)|Modifier(Exception_Never)|Modifier(Strict_No),
+                    // convert to MulHi and such
+                    I_32 magicNum, shiftBy;
+                    getMagic<I_32, U_32, 32>(denom, &magicNum, &shiftBy);
+                
+                    Opnd *mulRes;
+                    if (optimizerFlags.use_mulhi) {
+                        Opnd *magicOpnd = genLdConstant(magicNum)->getDst();
+                        mulRes = genMulHi(dstType, SignedOp, magicOpnd,
                                           src1)->getDst();
-                    Opnd *mulRes64 = genMul(dstType64, Modifier(Overflow_None)|Modifier(Exception_Never)|Modifier(Strict_No), magicOpnd,
-                                            src64)->getDst();
-                    Opnd *constant32 = genLdConstant((I_32)32)->getDst();
-                    Opnd *mulRes64h = genShr(dstType64, 
-                                             Modifier(SignedOp)|Modifier(ShiftMask_None),
-                                             mulRes64,
-                                             constant32)->getDst();
-                    mulRes = genConv(dstType, Type::Int32, Modifier(Overflow_None)|Modifier(Exception_Never)|Modifier(Strict_No),
-                                     mulRes64h)->getDst();
+                    } else {
+                        Opnd *magicOpnd = genLdConstant((int64)magicNum)->getDst();
+                        TypeManager &tm = irManager.getTypeManager();
+                        Type *dstType64 = tm.getInt64Type();
+                        Opnd *src64 = genConv(dstType64, Type::Int64, Modifier(Overflow_None)|Modifier(Exception_Never)|Modifier(Strict_No),
+                                              src1)->getDst();
+                        Opnd *mulRes64 = genMul(dstType64, Modifier(Overflow_None)|Modifier(Exception_Never)|Modifier(Strict_No), magicOpnd,
+                                                src64)->getDst();
+                        Opnd *constant32 = genLdConstant((I_32)32)->getDst();
+                        Opnd *mulRes64h = genShr(dstType64, 
+                                                 Modifier(SignedOp)|Modifier(ShiftMask_None),
+                                                 mulRes64,
+                                                 constant32)->getDst();
+                        mulRes = genConv(dstType, Type::Int32, Modifier(Overflow_None)|Modifier(Exception_Never)|Modifier(Strict_No),
+                                         mulRes64h)->getDst();
+                    }
+                    // need to adjust for overflow in magicNum
+                    // this is indicated by sign which differs from
+                    // the denom.
+                    if ((denom > 0) && (magicNum < 0)) {
+                        mulRes = genAdd(dstType, Modifier(Overflow_None)|Modifier(Exception_Never)|Modifier(Strict_No), 
+                                        mulRes, src1)->getDst();
+                    } else if ((denom < 0) && (magicNum > 0)) {
+                        mulRes = genSub(dstType, Modifier(Overflow_None)|Modifier(Exception_Never)|Modifier(Strict_No), 
+                                        mulRes, src1)->getDst();
+                    }
+                    Opnd *shiftByOpnd = genLdConstant(shiftBy)->getDst();
+                    mulRes = genShr(dstType, Modifier(SignedOp)|Modifier(ShiftMask_None),
+                                    mulRes, shiftByOpnd)->getDst();
+                    Opnd *thirtyOne = genLdConstant((I_32)31)->getDst();
+                    Opnd *oneIfNegative = genShr(dstType,
+                                                 Modifier(UnsignedOp)|Modifier(ShiftMask_None),
+                                                 ((denom < 0) 
+                                                  ? mulRes
+                                                  : src1),
+                                                 thirtyOne)->getDst();
+                    Opnd *res = genAdd(dstType, Modifier(Overflow_None)|Modifier(Exception_Never)|Modifier(Strict_No), mulRes, oneIfNegative)->getDst();
+                    return res;
                 }
-                // need to adjust for overflow in magicNum
-                // this is indicated by sign which differs from
-                // the denom.
-                if ((denom > 0) && (magicNum < 0)) {
-                    mulRes = genAdd(dstType, Modifier(Overflow_None)|Modifier(Exception_Never)|Modifier(Strict_No), 
-                                    mulRes, src1)->getDst();
-                } else if ((denom < 0) && (magicNum > 0)) {
-                    mulRes = genSub(dstType, Modifier(Overflow_None)|Modifier(Exception_Never)|Modifier(Strict_No), 
-                                    mulRes, src1)->getDst();
+            } else if (dstType->tag == Type::Int64) {
+                int64 denom = value2.i8;
+                // note that 0 and 1 were handled above
+                if (denom == -1) {
+                    // convert to neg
+                    Opnd *res = genNeg(dstType, src1)->getDst();
+                    return res;
+                } else if (isPowerOf2<int64>(denom)) {
+                    // convert to shift and such
+                    int64 absdenom = (denom < 0) ? -denom : denom;
+                    int k = whichPowerOf2<int64,64>(absdenom);
+                    Opnd *kminus1 = genLdConstant((int64)(k - 1))->getDst();
+                    // make k-1 copies of the sign bit
+                    Opnd *shiftTheSign = genShr(dstType, 
+                                                Modifier(SignedOp)|Modifier(ShiftMask_None),
+                                                src1, kminus1)->getDst();
+                    // we 64-k zeros in on left to put copies of sign on right
+                    Opnd *t64minusk = genLdConstant((int64)(64-k))->getDst();
+                    // if (n<0), this is 2^k-1, else 0
+                    Opnd *kminus1ones = genShr(dstType, 
+                                               Modifier(UnsignedOp)|Modifier(ShiftMask_None),
+                                               shiftTheSign, t64minusk)->getDst();
+                    Opnd *added = genAdd(dstType, Modifier(Overflow_None)|Modifier(Exception_Never)|Modifier(Strict_No),
+                                         src1, kminus1ones)->getDst();
+                    Opnd *kOpnd = genLdConstant((int64)k)->getDst();
+                    Opnd *res = genShr(dstType, Modifier(SignedOp)|Modifier(ShiftMask_None),
+                                       added, kOpnd)->getDst();
+                    if (denom != absdenom) { // ((denom < 0) && (k < 63))
+                        res = genNeg(dstType, res)->getDst();
+                    }
+                    return res;
                 }
-                Opnd *shiftByOpnd = genLdConstant(shiftBy)->getDst();
-                mulRes = genShr(dstType, Modifier(SignedOp)|Modifier(ShiftMask_None),
-                                mulRes, shiftByOpnd)->getDst();
-                Opnd *thirtyOne = genLdConstant((I_32)31)->getDst();
-                Opnd *oneIfNegative = genShr(dstType,
-                                             Modifier(UnsignedOp)|Modifier(ShiftMask_None),
-                                             ((denom < 0) 
-                                              ? mulRes
-                                              : src1),
-                                             thirtyOne)->getDst();
-                Opnd *res = genAdd(dstType, Modifier(Overflow_None)|Modifier(Exception_Never)|Modifier(Strict_No), mulRes, oneIfNegative)->getDst();
-                return res;
             }
         }
     }
-#endif
+
     return NULL;
 }
 
@@ -1593,7 +1621,7 @@
                     src1->getInst()->asConstInst(),
                     src2->getInst()->asConstInst(),
                     mod.isSigned());
-#ifdef _IPF_
+
     //
     // don't simplify floating point further
     //
@@ -1634,21 +1662,6 @@
                 //
                 return genLdConstant((I_32)0)->getDst();
             }
-            if (isPowerOf2<I_32>(denom)) {
-                int k = whichPowerOf2<I_32,32>(denom);
-                I_32 maskInt = (((I_32)0x1)<<k)-1;
-                Opnd *maskOpnd = genLdConstant(maskInt)->getDst();
-                Opnd *maskedOpnd = genAnd(src1->getType(),
-                                          src1, maskOpnd)->getDst();
-                Opnd *res = maskedOpnd;
-                if (denom < 0) {
-                    I_32 signInt = ((I_32)-1) ^ maskInt;
-                    Opnd *extendedSign 
-                        = genLdConstant(signInt)->getDst();
-                    res = genOr(src1->getType(), res, extendedSign)->getDst();
-                }
-                return res;
-            }
         } else if (ConstantFolder::isConstant(src2inst, cv.i8)) {
             int64 denom = cv.i8;
             if ((denom == -1) || (denom == 1)) {
@@ -1657,21 +1670,6 @@
                 //
                 return genLdConstant((int64)0)->getDst();
             }
-            if (isPowerOf2<int64>(denom)) {
-                int k = whichPowerOf2<int64,64>(denom);
-                int64 maskInt = (((int64)0x1)<<k)-1;
-                Opnd *maskOpnd = genLdConstant(maskInt)->getDst();
-                Opnd *maskedOpnd = genAnd(src1->getType(),
-                                          src1, maskOpnd)->getDst();
-                Opnd *res = maskedOpnd;
-                if (denom < 0) {
-                    int64 signInt = ((int64)-1) ^ maskInt;
-                    Opnd *extendedSign 
-                        = genLdConstant(signInt)->getDst();
-                    res = genOr(src1->getType(), res, extendedSign)->getDst();
-                }
-                return res;
-            }
         }
 
         // convert other cases to MulHi and shift, and Mul
@@ -1686,7 +1684,7 @@
             return remOpnd;
         }
     }
-#endif
+
     return NULL;
 }
 //-----------------------------------------------------------------------------

Modified: harmony/enhanced/drlvm/trunk/vm/port/src/encoder/ia32_em64t/enc_defs.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/port/src/encoder/ia32_em64t/enc_defs.h?rev=747857&r1=747856&r2=747857&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/port/src/encoder/ia32_em64t/enc_defs.h (original)
+++ harmony/enhanced/drlvm/trunk/vm/port/src/encoder/ia32_em64t/enc_defs.h Wed Feb 25 16:49:13 2009
@@ -604,12 +604,12 @@
     CCM(SET,NLE), CCM(SET,G),
 
 Mnemonic_SAL, Mnemonic_SHL=Mnemonic_SAL,// Shift left
-Mnemonic_SAR,                           // Unsigned shift right
+Mnemonic_SAR,                           // Shift right
 Mnemonic_ROR,                           // Rotate right
 Mnemonic_RCR,                           // Rotate right through CARRY flag
 Mnemonic_ROL,                           // Rotate left
 Mnemonic_RCL,                           // Rotate left through CARRY flag
-Mnemonic_SHR,                           // Signed shift right
+Mnemonic_SHR,                           // Unsigned shift right
 Mnemonic_SHRD,                          // Double Precision Shift Right
 Mnemonic_SHLD,                          // Double Precision Shift Left