You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by va...@apache.org on 2007/03/15 10:14:52 UTC

svn commit: r518533 - in /harmony/enhanced/drlvm/trunk/vm/jitrino/src: codegenerator/ codegenerator/ia32/ codegenerator/ipf/ codegenerator/ipf/include/ optimizer/ translator/java/

Author: varlax
Date: Thu Mar 15 02:14:50 2007
New Revision: 518533

URL: http://svn.apache.org/viewvc?view=rev&rev=518533
Log:
Applied HARMONY-3374 [drlvm][jit] VMMagic EM64T port

Modified:
    harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/CodeGenIntfc.h
    harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32InstCodeSelector.cpp
    harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32InstCodeSelector.h
    harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ipf/IpfInstCodeSelector.cpp
    harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ipf/include/IpfCodeSelector.h
    harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/CodeSelectors.cpp
    harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/IRBuilder.cpp
    harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/IRBuilder.h
    harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/Inst.cpp
    harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/Inst.h
    harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/Opcode.cpp
    harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/Opcode.h
    harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/codelowerer.h
    harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/escapeanalyzer.cpp
    harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/hashvaluenumberer.cpp
    harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/lazyexceptionopt.cpp
    harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/memoryopt.cpp
    harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/simplifier.cpp
    harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/simplifier.h
    harmony/enhanced/drlvm/trunk/vm/jitrino/src/translator/java/JavaByteCodeTranslator.cpp

Modified: harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/CodeGenIntfc.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/CodeGenIntfc.h?view=diff&rev=518533&r1=518532&r2=518533
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/CodeGenIntfc.h (original)
+++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/CodeGenIntfc.h Thu Mar 15 02:14:50 2007
@@ -246,7 +246,7 @@
     /// convert object or integer to unmanaged pointer. Unboxing
     virtual CG_OpndHandle*  convToUPtr(PtrType * dstType, CG_OpndHandle* op) = 0;
 
-    virtual CG_OpndHandle*  convToInt(ConvertToIntOp::Types, bool isSigned, 
+    virtual CG_OpndHandle*  convToInt(ConvertToIntOp::Types, bool isSigned, bool isZeroExtend, 
                                       ConvertToIntOp::OverflowMod,
                                       Type* dstType, CG_OpndHandle* src) = 0;
     virtual CG_OpndHandle*  convToFp(ConvertToFpOp::Types, Type* dstType, CG_OpndHandle* src) = 0;

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?view=diff&rev=518533&r1=518532&r2=518533
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32InstCodeSelector.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32InstCodeSelector.cpp Thu Mar 15 02:14:50 2007
@@ -29,7 +29,6 @@
 #include "open/em_profile_access.h"
 #include "open/vm.h"
 
-
 #include <float.h>
 #include <math.h>
 
@@ -265,7 +264,7 @@
     appendInsts(irManager.newRuntimeHelperCallInst(CompilationInterface::Helper_Throw_LinkingException, lengthof(args), args, NULL));
 }
 //_______________________________________________________________________________________________________________
-Opnd * InstCodeSelector::convertIntToInt(Opnd * srcOpnd, Type * dstType, Opnd * dstOpnd)
+Opnd * InstCodeSelector::convertIntToInt(Opnd * srcOpnd, Type * dstType, Opnd * dstOpnd, bool isZeroExtend)
 {
     Type * srcType=srcOpnd->getType();
     assert(isIntegerType(srcType) && (isIntegerType(dstType) || dstType->isPtr()));
@@ -290,16 +289,15 @@
         if (dstOpnd==NULL)
             dstOpnd=irManager.newOpnd(dstType);
 #ifdef _EM64T_
-            appendInsts(irManager.newInstEx(srcType->isSignedInteger()?Mnemonic_MOVSX:Mnemonic_MOVZX, 1, dstOpnd, srcOpnd));
+            appendInsts(irManager.newInstEx(srcType->isSignedInteger() & !isZeroExtend ? Mnemonic_MOVSX:Mnemonic_MOVZX, 1, dstOpnd, srcOpnd));
 #else
         if (dstSize<OpndSize_64){
-            appendInsts(irManager.newInstEx(srcType->isSignedInteger()?Mnemonic_MOVSX:Mnemonic_MOVZX, 1, dstOpnd, srcOpnd));
+            appendInsts(irManager.newInstEx(srcType->isSignedInteger() && !isZeroExtend ? Mnemonic_MOVSX:Mnemonic_MOVZX, 1, dstOpnd, srcOpnd));
         }else{
             appendInsts(irManager.newI8PseudoInst(srcType->isSignedInteger()?Mnemonic_MOVSX:Mnemonic_MOVZX, 1, dstOpnd, srcOpnd));
         }
 #endif
     }
-
     return dstOpnd;
 }
 
@@ -370,15 +368,26 @@
 }
 
 //_______________________________________________________________________________________________________________
-Opnd * InstCodeSelector::convertToUnmanagedPtr(Opnd * srcOpnd, Type * dstType, Opnd * dstOpnd) {
+Opnd * InstCodeSelector::convertToUnmanagedPtr(Opnd * srcOpnd, Type * dstType, Opnd * dstOpnd, bool isZeroExtend) {
     assert(dstType->isUnmanagedPtr());
     Type* srcType = srcOpnd->getType();
     if (dstOpnd == NULL) {
         dstOpnd = irManager.newOpnd(dstType);
     }
-
     if (srcType->isObject()) {
-        appendInsts(irManager.newCopyPseudoInst(Mnemonic_MOV, dstOpnd, srcOpnd));
+        OpndSize srcSize=irManager.getTypeSize(srcType);
+        OpndSize dstSize=irManager.getTypeSize(dstType);
+        if (srcSize == dstSize) {
+            appendInsts(irManager.newCopyPseudoInst(Mnemonic_MOV, dstOpnd, srcOpnd));
+        } else {
+#ifdef _EM64T_
+            if (srcType->isInteger()) {
+                appendInsts(irManager.newInstEx(isZeroExtend?Mnemonic_MOVZX:Mnemonic_MOVSX, 1, dstOpnd, srcOpnd)); 
+            }       
+#else
+            assert(0);
+#endif
+        }
     } else if (srcType->isInteger()) {
         convertIntToInt(srcOpnd, dstType, dstOpnd);
     } else {
@@ -418,7 +427,7 @@
 }
 
 //_______________________________________________________________________________________________________________
-Opnd * InstCodeSelector::convert(CG_OpndHandle * oph, Type * dstType, Opnd * dstOpnd)
+Opnd * InstCodeSelector::convert(CG_OpndHandle * oph, Type * dstType, Opnd * dstOpnd, bool isZeroExtend)
 {
     if (!oph)
         return NULL;
@@ -428,13 +437,13 @@
     bool converted=false;
     if (isIntegerType(srcType)){
         if (isIntegerType(dstType)){
-            dstOpnd=convertIntToInt(srcOpnd, dstType, dstOpnd);
+            dstOpnd=convertIntToInt(srcOpnd, dstType, dstOpnd, isZeroExtend);
             converted=true;
         } else if (dstType->isFP()){
             dstOpnd=convertIntToFp(srcOpnd, dstType, dstOpnd);
             converted=true;
         } else if (dstType->isUnmanagedPtr()) {
-            dstOpnd = convertToUnmanagedPtr(srcOpnd, dstType, dstOpnd);
+            dstOpnd = convertToUnmanagedPtr(srcOpnd, dstType, dstOpnd, isZeroExtend);
             converted = true;
         }
     }else if (srcType->isFP()){
@@ -452,7 +461,6 @@
         dstOpnd = convertToUnmanagedPtr(srcOpnd, dstType, dstOpnd);
         converted = true;
     }
-
     if (!converted){
         assert(irManager.getTypeSize(dstType)==srcOpnd->getSize());
         if (dstOpnd==NULL)
@@ -460,7 +468,6 @@
         else
             copyOpndTrivialOrTruncatingConversion(dstOpnd, srcOpnd);
     }
-
     return dstOpnd;
 }
 
@@ -470,6 +477,7 @@
 
 CG_OpndHandle* InstCodeSelector::convToInt(ConvertToIntOp::Types       opType,
                                                 bool                        isSigned,
+						bool                        isZeroExtend,
                                                 ConvertToIntOp::OverflowMod ovfMod,
                                                 Type*                       dstType, 
                                                 CG_OpndHandle*              src) 
@@ -482,17 +490,25 @@
         case ConvertToIntOp::I2:
             sizeType=isSigned?typeManager.getInt16Type():typeManager.getUInt16Type();
             break;
+
+#ifdef _IA32_	    
         case ConvertToIntOp::I:
+#endif	
         case ConvertToIntOp::I4:
             sizeType=isSigned?typeManager.getInt32Type():typeManager.getUInt32Type();
             break;
+
+#ifdef _EM64T_
+        case ConvertToIntOp::I:
+#endif	
         case ConvertToIntOp::I8:
-            sizeType=typeManager.getInt64Type();
+            sizeType=isSigned?typeManager.getInt64Type():typeManager.getUInt64Type();
             break;
         default: assert(0);
     }
-    Opnd * tmpOpnd=convert(src, sizeType); 
-    return convert(tmpOpnd, dstType);
+    Opnd * tmpOpnd = convert(src, sizeType, NULL, isZeroExtend); 
+    CG_OpndHandle* res =  convert(tmpOpnd, dstType, NULL, isZeroExtend);
+    return res;
 }
 
 //_______________________________________________________________________________________________________________
@@ -1930,7 +1946,7 @@
     copyOpnd(dst, opnd);
     return dst;
 #else
-    if(memType > Type::Float) {
+    if(memType > Type::Float && memType!=Type::UnmanagedPtr) {
         Opnd * opnd = irManager.newMemOpndAutoKind(typeManager.getInt32Type(), addr);
         Opnd * tmp =  irManager.newOpnd(typeManager.getInt32Type());
         Opnd * dst = irManager.newOpnd(typeManager.getInt64Type());
@@ -1963,7 +1979,11 @@
     Opnd * dst = irManager.newMemOpndAutoKind(irManager.getTypeFromTag(memType), addr);
     copyOpnd(dst, src);
 #else
-    if(memType > Type::Float) {
+    if (src->getType()->isUnmanagedPtr()) {
+        assert(src->getType()->asPtrType()->getPointedToType()->isInt1());
+        Opnd* dst = irManager.newMemOpndAutoKind(irManager.getTypeFromTag(memType), addr);
+        copyOpnd(dst, src);
+    } else  if(memType > Type::Float) {
         src = simpleOp_I8(Mnemonic_SUB, src->getType(), src, irManager.newImmOpnd(typeManager.getIntPtrType(), (POINTER_SIZE_INT)compilationInterface.getHeapBase()));
         Opnd * opnd = irManager.newMemOpndAutoKind(typeManager.compressType(src->getType()), addr);
         appendInsts(irManager.newCopyPseudoInst(Mnemonic_MOV, opnd, src));
@@ -2780,10 +2800,21 @@
         Opnd** opnds = (Opnd**)args;
 
         //deal with constraints       
+#ifdef _EM64T_
+        Type* opnd1Type = opnds[1]->getType();
+        assert(irManager.getTypeSize(opnd1Type)==OpndSize_32 || irManager.getTypeSize(opnd1Type)==OpndSize_64);
+        assert(irManager.getTypeSize(opnds[1]->getType())==irManager.getTypeSize(opnds[2]->getType()));
+        bool is64bit = irManager.getTypeSize(opnd1Type) == OpndSize_64;
+//        Type* opType = is64bit ? typeManager.getInt64Type():typeManager.getInt32Type();
+        Constraint ceax(OpndKind_GPReg, is64bit?OpndSize_64:OpndSize_32, 1<<getRegIndex(is64bit?RegName_RAX:RegName_EAX));
+        Constraint cecx(OpndKind_GPReg, is64bit?OpndSize_64:OpndSize_32, 1<<getRegIndex(is64bit?RegName_RCX:RegName_ECX));
+        Opnd* eaxOpnd = irManager.newOpnd(opnds[1]->getType(), ceax);
+        Opnd* ecxOpnd = irManager.newOpnd(opnds[2]->getType(), cecx);
+#else
         Opnd* eaxOpnd = irManager.getRegOpnd(RegName_EAX);
         Opnd* ecxOpnd = irManager.getRegOpnd(RegName_ECX);
-        Opnd* memOpnd = irManager.newMemOpnd(opnds[0]->getType(), opnds[0]);
-        
+#endif
+        Opnd* memOpnd = irManager.newMemOpnd(opnds[1]->getType(), opnds[0]);//use opnd1 type for memopnd
         appendInsts(irManager.newCopyPseudoInst(Mnemonic_MOV, eaxOpnd, opnds[1]));
         appendInsts(irManager.newCopyPseudoInst(Mnemonic_MOV, ecxOpnd, opnds[2]));
         

Modified: harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32InstCodeSelector.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32InstCodeSelector.h?view=diff&rev=518533&r1=518532&r2=518533
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32InstCodeSelector.h (original)
+++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32InstCodeSelector.h Thu Mar 15 02:14:50 2007
@@ -113,7 +113,7 @@
     void           tableSwitch(CG_OpndHandle* src, uint32 nTargets);       
     void           throwException(CG_OpndHandle* exceptionObj, bool createStackTrace);
     void            throwSystemException(CompilationInterface::SystemExceptionId);
-    CG_OpndHandle* convToInt(ConvertToIntOp::Types,bool isSigned,
+    CG_OpndHandle* convToInt(ConvertToIntOp::Types,bool isSigned, bool isZeroExtend,
                               ConvertToIntOp::OverflowMod,Type* dstType, CG_OpndHandle* src);
     CG_OpndHandle* convToFp(ConvertToFpOp::Types, Type* dstType, CG_OpndHandle* src);
 
@@ -318,19 +318,19 @@
     //
     uint64 currentHIRInstrID;
 
-    Opnd *  convertIntToInt(Opnd * srcOpnd, Type * dstType, Opnd * dstOpnd=NULL);
+    Opnd *  convertIntToInt(Opnd * srcOpnd, Type * dstType, Opnd * dstOpnd=NULL, bool isZeroExtend=false);
     Opnd *  convertIntToFp(Opnd * srcOpnd, Type * dstType, Opnd * dstOpnd=NULL);
     Opnd *  convertFpToInt(Opnd * srcOpnd, Type * dstType, Opnd * dstOpnd=NULL);
     Opnd *  convertFpToFp(Opnd * srcOpnd, Type * dstType, Opnd * dstOpnd=NULL);
     Opnd*   convertUnmanagedPtr(Opnd * srcOpnd, Type * dstType, Opnd * dstOpnd=NULL);
-    Opnd*   convertToUnmanagedPtr(Opnd * srcOpnd, Type * dstType, Opnd * dstOpnd=NULL);
+    Opnd*   convertToUnmanagedPtr(Opnd * srcOpnd, Type * dstType, Opnd * dstOpnd=NULL, bool isZeroExtend=false);
     
     bool    isIntegerType(Type * type)
     { return type->isInteger()||type->isBoolean()||type->isChar(); }
     void    copyOpnd(Opnd *dst, Opnd *src);
     void    copyOpndTrivialOrTruncatingConversion(Opnd *dst, Opnd *src);
 
-    Opnd * convert(CG_OpndHandle * oph, Type * dstType, Opnd * dstOpnd=NULL);
+    Opnd * convert(CG_OpndHandle * oph, Type * dstType, Opnd * dstOpnd=NULL, bool isZeroExtend=false);
 
     Opnd * simpleOp_I8(Mnemonic mn, Type * dstType, Opnd * src1, Opnd * src2);
 

Modified: harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ipf/IpfInstCodeSelector.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ipf/IpfInstCodeSelector.cpp?view=diff&rev=518533&r1=518532&r2=518533
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ipf/IpfInstCodeSelector.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ipf/IpfInstCodeSelector.cpp Thu Mar 15 02:14:50 2007
@@ -689,6 +689,7 @@
 
 CG_OpndHandle *IpfInstCodeSelector::convToInt(ConvertToIntOp::Types       opType,
                                               bool                        isSigned,
+					      bool                        isZeroExtend,
                                               ConvertToIntOp::OverflowMod ovfMod,
                                               Type                        *dstType, 
                                               CG_OpndHandle               *src_) {

Modified: harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ipf/include/IpfCodeSelector.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ipf/include/IpfCodeSelector.h?view=diff&rev=518533&r1=518532&r2=518533
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ipf/include/IpfCodeSelector.h (original)
+++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ipf/include/IpfCodeSelector.h Thu Mar 15 02:14:50 2007
@@ -144,7 +144,7 @@
     CG_OpndHandle *shru  (IntegerOp::Types, CG_OpndHandle*, CG_OpndHandle*);
     CG_OpndHandle *shladd(IntegerOp::Types, CG_OpndHandle*, uint32, CG_OpndHandle*);
 
-    CG_OpndHandle *convToInt(ConvertToIntOp::Types, bool, ConvertToIntOp::OverflowMod, Type*, CG_OpndHandle*);
+    CG_OpndHandle *convToInt(ConvertToIntOp::Types, bool, bool, ConvertToIntOp::OverflowMod, Type*, CG_OpndHandle*);
     CG_OpndHandle *convToFp(ConvertToFpOp::Types, Type*, CG_OpndHandle*);
 
     CG_OpndHandle *ldc_i4(int32);

Modified: harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/CodeSelectors.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/CodeSelectors.cpp?view=diff&rev=518533&r1=518532&r2=518533
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/CodeSelectors.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/CodeSelectors.cpp Thu Mar 15 02:14:50 2007
@@ -607,6 +607,7 @@
             }
             break;
         case Op_Conv:
+        case Op_ConvZE:
         case Op_ConvUnmanaged:
             {
                 assert(inst->getNumSrcOperands() == 1);
@@ -621,8 +622,10 @@
                     cgInst = instructionCallback.convToUPtr(dstType->asPtrType(), getCGInst(inst->getSrc(0)));
                 } else {
                     bool isSigned = Type::isSignedInteger(inst->getType());
+                    bool isZeroExtend = inst->getOpcode() == Op_ConvZE;
                     cgInst = instructionCallback.convToInt(mapToIntConvertOpType(inst),
                         isSigned, 
+                        isZeroExtend,
                         mapToIntConvertOvfMod(inst), 
                         dstType,
                         getCGInst(inst->getSrc(0)));
@@ -984,12 +987,19 @@
                 if (!genConsts) break;
                 ConstInst* constInst = (ConstInst*)inst;
                 switch (inst->getType()) {
-        case Type::UIntPtr://mfursov todo!
-        case Type::IntPtr://mfursov todo!
-        case Type::UnmanagedPtr://mfursov todo!
+#ifdef _IA32_
+        case Type::UIntPtr:
+        case Type::IntPtr:
+        case Type::UnmanagedPtr:
+#endif
         case Type::Int32:
             cgInst = instructionCallback.ldc_i4(constInst->getValue().i4);
             break;
+#ifdef _EM64T_
+        case Type::UIntPtr:
+        case Type::IntPtr:
+        case Type::UnmanagedPtr:
+#endif
         case Type::Int64:
             cgInst = instructionCallback.ldc_i8(constInst->getValue().i8);
             break;

Modified: harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/IRBuilder.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/IRBuilder.cpp?view=diff&rev=518533&r1=518532&r2=518533
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/IRBuilder.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/IRBuilder.cpp Thu Mar 15 02:14:50 2007
@@ -109,6 +109,15 @@
     virtual Inst* genConv(Type* dstType, Type::Tag toType, Modifier ovfMod, Opnd* src){
         return irBuilder.genConv(dstType, toType, ovfMod, src)->getInst();
     }
+
+    virtual Inst* genConvZE(Type* dstType, Type::Tag toType, Modifier ovfMod, Opnd* src){
+        return irBuilder.genConvZE(dstType, toType, ovfMod, src)->getInst();
+    }
+    
+    virtual Inst* genConvUnmanaged(Type* dstType, Type::Tag toType, Modifier ovfMod, Opnd* src){
+        return irBuilder.genConvUnmanaged(dstType, toType, ovfMod, src)->getInst();
+    }
+    
     // shifts
     virtual Inst* genShladd(Type* type, Opnd* src1, Opnd* src2, Opnd *src3){
         return irBuilder.genShladd(type, src1, src2, src3)->getInst();
@@ -944,13 +953,10 @@
 IRBuilder::genConv(Type* dstType,
                    Type::Tag toType,
                    Modifier ovfMod,
-                   Opnd* src) {
+                   Opnd* src) 
+{
     src = propagateCopy(src);
-    Opcode opcode = Op_Conv;
-    if ((dstType->isUnmanagedPtr() && src->getType()->isObject()) || (dstType->isObject() && src->getType()->isUnmanagedPtr())) {
-        opcode = Op_ConvUnmanaged;
-    }
-    Operation operation(opcode, toType, ovfMod);
+    Operation operation(Op_Conv, toType, ovfMod);
     uint32 hashcode = operation.encodeForHashing();
     Opnd* dst = lookupHash(hashcode, src->getId());
     if (dst) return dst;
@@ -960,7 +966,60 @@
     }
     if (!dst) {
         dst = createOpnd(dstType);
-        appendInst(instFactory->makeConv(ovfMod, toType, dst, src));
+	Inst* inst = instFactory->makeConv(ovfMod, toType, dst, src);
+        appendInst(inst);
+    }
+    insertHash(hashcode, src->getId(), dst->getInst());
+    return dst;
+}
+
+Opnd*
+IRBuilder::genConvUnmanaged(Type* dstType,
+                   Type::Tag toType,
+                   Modifier ovfMod,
+                   Opnd* src) 
+{
+    assert((dstType->isUnmanagedPtr() && src->getType()->isObject()) 
+            || (dstType->isObject() && src->getType()->isUnmanagedPtr()));
+    src = propagateCopy(src);
+    Operation operation(Op_ConvUnmanaged, toType, ovfMod);
+    uint32 hashcode = operation.encodeForHashing();
+    Opnd* dst = lookupHash(hashcode, src->getId());
+    if (dst) return dst;
+
+    if (irBuilderFlags.doSimplify) {
+        dst = simplifier->simplifyConvUnmanaged(dstType, toType, ovfMod, src);
+    }
+    if (!dst) {
+        dst = createOpnd(dstType);
+        Inst* inst = instFactory->makeConvUnmanaged(ovfMod, toType, dst, src);
+        appendInst(inst);
+    }
+    
+    insertHash(hashcode, src->getId(), dst->getInst());
+    return dst;
+}
+
+Opnd*
+IRBuilder::genConvZE(Type* dstType,
+                   Type::Tag toType,
+                   Modifier ovfMod,
+                   Opnd* src) 
+{
+    assert(src->getType()->isInteger() && (dstType->isInteger() || dstType->isUnmanagedPtr()));
+    src = propagateCopy(src);
+    Operation operation(Op_ConvZE, toType, ovfMod);
+    uint32 hashcode = operation.encodeForHashing();
+    Opnd* dst = lookupHash(hashcode, src->getId());
+    if (dst) return dst;
+
+    if (irBuilderFlags.doSimplify) {
+        dst = simplifier->simplifyConvZE(dstType, toType, ovfMod, src);
+    }
+    if (!dst) {
+        dst = createOpnd(dstType);
+	Inst* inst = instFactory->makeConvZE(ovfMod, toType, dst, src);
+        appendInst(inst);
     }
     insertHash(hashcode, src->getId(), dst->getInst());
     return dst;

Modified: harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/IRBuilder.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/IRBuilder.h?view=diff&rev=518533&r1=518532&r2=518533
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/IRBuilder.h (original)
+++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/IRBuilder.h Thu Mar 15 02:14:50 2007
@@ -104,6 +104,8 @@
     Opnd* genNot(Type* dstType, Opnd* src);//TR //SI
     // Conversion
     Opnd* genConv(Type* dstType, Type::Tag toType, Modifier ovfMod, Opnd* src); //TR //SI
+    Opnd* genConvZE(Type* dstType, Type::Tag toType, Modifier ovfMod, Opnd* src); //TR //SI
+    Opnd* genConvUnmanaged(Type* dstType, Type::Tag toType, Modifier ovfMod, Opnd* src); //TR //SI
     // Shift
     Opnd* genShl(Type* dstType, Modifier mod, Opnd* value, Opnd* shiftAmount);//TR //SI
     Opnd* genShr(Type* dstType, Modifier mods, Opnd* value, Opnd* shiftAmount);//TR //SI

Modified: harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/Inst.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/Inst.cpp?view=diff&rev=518533&r1=518532&r2=518533
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/Inst.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/Inst.cpp Thu Mar 15 02:14:50 2007
@@ -1781,13 +1781,18 @@
 
 // conversion
 Inst* InstFactory::makeConv(Modifier mod, Type::Tag toType, Opnd* dst, Opnd* src) {
-    Opcode opcode = Op_Conv;
-    if ((dst->getType()->isUnmanagedPtr() && src->getType()->isObject()) 
-        || (dst->getType()->isObject() && src->getType()->isUnmanagedPtr())) 
-    {
-        opcode = Op_ConvUnmanaged;
-    }
-    return makeInst(opcode, mod, toType, dst, src);
+    return makeInst(Op_Conv, mod, toType, dst, src);
+}
+
+Inst* InstFactory::makeConvZE(Modifier mod, Type::Tag toType, Opnd* dst, Opnd* src) {
+    assert((dst->getType()->isInteger() || dst->getType()->isUnmanagedPtr()) && src->getType()->isInteger());
+    return makeInst(Op_ConvZE, mod, toType, dst, src);
+}
+
+Inst* InstFactory::makeConvUnmanaged(Modifier mod, Type::Tag toType, Opnd* dst, Opnd* src) {
+    assert ((dst->getType()->isUnmanagedPtr() && src->getType()->isObject()) 
+        || (dst->getType()->isObject() && src->getType()->isUnmanagedPtr())); 
+    return makeInst(Op_ConvUnmanaged, mod, toType, dst, src);
 }
 
 // shifts
@@ -2657,6 +2662,7 @@
     case Op_Not:                return caseNot(inst);
     case Op_Select:             return caseSelect(inst);
     case Op_Conv:               return caseConv(inst);
+    case Op_ConvZE:             return caseConvZE(inst);
     case Op_ConvUnmanaged:      return caseConvUnmanaged(inst);
     case Op_Shladd:             return caseShladd(inst);
     case Op_Shl:                return caseShl(inst);

Modified: harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/Inst.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/Inst.h?view=diff&rev=518533&r1=518532&r2=518533
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/Inst.h (original)
+++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/Inst.h Thu Mar 15 02:14:50 2007
@@ -1113,6 +1113,8 @@
     Inst*    makeSelect(Opnd* dst, Opnd* src1, Opnd* src2, Opnd* src3);
     // conversion
     Inst*    makeConv(Modifier mod, Type::Tag toType, Opnd* dst, Opnd* src);
+    Inst*    makeConvZE(Modifier mod, Type::Tag toType, Opnd* dst, Opnd* src);
+    Inst*    makeConvUnmanaged(Modifier mod, Type::Tag toType, Opnd* dst, Opnd* src);
     // shifts
     Inst*    makeShladd(Opnd* dst, Opnd* value, Opnd* shiftAmount, Opnd *addTo); // shiftAmount must be constant
     Inst*    makeShl(Modifier mod, Opnd* dst, Opnd* value, Opnd* shiftAmount);
@@ -1614,6 +1616,10 @@
     // conversion
     virtual Inst*
     caseConv(Inst* inst)=0;//                {return caseDefault(inst);}
+
+    // conversion
+    virtual Inst*
+    caseConvZE(Inst* inst)=0;//                {return caseDefault(inst);}
 
     // conversion
     virtual Inst*

Modified: harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/Opcode.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/Opcode.cpp?view=diff&rev=518533&r1=518532&r2=518533
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/Opcode.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/Opcode.cpp Thu Mar 15 02:14:50 2007
@@ -92,7 +92,8 @@
     { Op_Not,                   false, MB::Movable,       MK::None,                                  "not   ",        "not       %s -) %l",           },
     { Op_Select,                false, MB::Movable,       MK::None,                                  "select",        "select %s -) %l",              }, // (src1 ? src2 : src3)
     { Op_Conv,                  false, MB::Movable,       MK::Overflow_and_Exception_and_Strict,     "conv  ",        "conv%t%m %s -) %l",            }, 
-    { Op_ConvUnmanaged,         false, MB::StoreOrSync,   MK::Overflow_and_Exception_and_Strict,     "convu ",        "convu%t%m %s -) %l",           }, 
+    { Op_ConvZE,                false, MB::Movable,       MK::Overflow_and_Exception_and_Strict,     "convze ",        "conv_ze_%t%m %s -) %l",            }, 
+    { Op_ConvUnmanaged,         false, MB::StoreOrSync,   MK::Overflow_and_Exception_and_Strict,     "convu ",        "conv_unm_%t%m %s -) %l",           }, 
     { Op_Shladd,                false, MB::Movable,       MK::None,                                  "shladd",        "shladd %s -) %l",              }, // no mods, 2nd operand must be LdConstant
     { Op_Shl,                   false, MB::Movable,       MK::ShiftMask,                             "shl   ",        "shl%m  %s -) %l",              }, 
     { Op_Shr,                   false, MB::Movable,       MK::ShiftMask_and_Signed,                  "shr   ",        "shr%m  %s -) %l",              }, 

Modified: harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/Opcode.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/Opcode.h?view=diff&rev=518533&r1=518532&r2=518533
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/Opcode.h (original)
+++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/Opcode.h Thu Mar 15 02:14:50 2007
@@ -292,6 +292,7 @@
     Op_Select,                      // (src1 ? src2 : src3)
     // Conversion
     Op_Conv,                        // OverflowModifier, ExceptionModifier
+    Op_ConvZE,                      // OverflowModifier, ExceptionModifier    
     Op_ConvUnmanaged,               // OverflowModifier, ExceptionModifier
     // Shift
     Op_Shladd,                      // no mods, 2nd operand must be LdConstant

Modified: harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/codelowerer.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/codelowerer.h?view=diff&rev=518533&r1=518532&r2=518533
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/codelowerer.h (original)
+++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/codelowerer.h Thu Mar 15 02:14:50 2007
@@ -104,6 +104,9 @@
     Inst* caseConv(Inst* inst) {return caseDefault(inst);}
 
     // conversion
+    Inst* caseConvZE(Inst* inst) {return caseDefault(inst);}
+
+    // conversion
     Inst* caseConvUnmanaged(Inst* inst) {return caseDefault(inst);}
 
     // shifts

Modified: harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/escapeanalyzer.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/escapeanalyzer.cpp?view=diff&rev=518533&r1=518532&r2=518533
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/escapeanalyzer.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/escapeanalyzer.cpp Thu Mar 15 02:14:50 2007
@@ -136,6 +136,7 @@
         // conversion to unmanaged pointer is also an escape!
         //
     case Op_Conv:
+    case Op_ConvZE:
     case Op_ConvUnmanaged:
         break;
         // in the absence of ssa form, stores to vars can conservatively escape

Modified: harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/hashvaluenumberer.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/hashvaluenumberer.cpp?view=diff&rev=518533&r1=518532&r2=518533
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/hashvaluenumberer.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/hashvaluenumberer.cpp Thu Mar 15 02:14:50 2007
@@ -157,6 +157,7 @@
     
     // conversion
     Inst* caseConv(Inst* inst)              { return hashIfNoException(inst); }
+    Inst* caseConvZE(Inst* inst)            { return hashIfNoException(inst); }
     Inst* caseConvUnmanaged(Inst* inst)     { return caseDefault(inst); }
     
     // shifts
@@ -2359,7 +2360,7 @@
 void InstValueNumberer::addInfoFromPEI(Inst *pei, bool isExceptionEdge)
 {
     switch (pei->getOpcode()) {
-    case Op_Add: case Op_Mul: case Op_Sub: case Op_Conv: case Op_ConvUnmanaged:
+    case Op_Add: case Op_Mul: case Op_Sub: case Op_Conv: case Op_ConvZE: case Op_ConvUnmanaged:
     case Op_TauCheckDivOpnds:
         break;
     case Op_DirectCall: case Op_TauVirtualCall: case Op_IndirectCall:

Modified: harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/lazyexceptionopt.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/lazyexceptionopt.cpp?view=diff&rev=518533&r1=518532&r2=518533
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/lazyexceptionopt.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/lazyexceptionopt.cpp Thu Mar 15 02:14:50 2007
@@ -874,6 +874,7 @@
         case Op_Select:
             return false;
         case Op_Conv:
+        case Op_ConvZE:
         case Op_ConvUnmanaged:
             return true;
         case Op_Shladd:

Modified: harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/memoryopt.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/memoryopt.cpp?view=diff&rev=518533&r1=518532&r2=518533
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/memoryopt.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/memoryopt.cpp Thu Mar 15 02:14:50 2007
@@ -930,7 +930,7 @@
     case Op_Add: case Op_Mul: case Op_Sub: case Op_TauDiv: case Op_TauRem: 
     case Op_Neg: case Op_MulHi: case Op_Min: case Op_Max: case Op_Abs:
     case Op_And: case Op_Or: case Op_Xor: 
-    case Op_Not: case Op_Select: case Op_Conv: case Op_ConvUnmanaged: case Op_Shladd: case Op_Shl: 
+    case Op_Not: case Op_Select: case Op_Conv: case Op_ConvZE: case Op_ConvUnmanaged: case Op_Shladd: case Op_Shl: 
     case Op_Shr: case Op_Cmp: case Op_Cmp3: 
     case Op_Branch: case Op_Jump: case Op_Switch:
     case Op_LdConstant: 
@@ -1393,6 +1393,7 @@
     case Op_DefArg: //magic as method param
         break;
     case Op_Conv: //the result of a conversion
+    case Op_ConvZE:
     case Op_ConvUnmanaged:
     case Op_TauLdInd: // the result of static field load
         break;

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?view=diff&rev=518533&r1=518532&r2=518533
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/simplifier.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/simplifier.cpp Thu Mar 15 02:14:50 2007
@@ -1803,6 +1803,25 @@
 }
 
 Opnd*
+Simplifier::simplifyConvZE(Type* dstType,
+                         Type::Tag toType,
+                         Modifier ovfmod,
+                         Opnd* src) 
+{
+    return NULL;
+}
+
+Opnd*
+Simplifier::simplifyConvUnmanaged(Type* dstType,
+                         Type::Tag toType,
+                         Modifier ovfmod,
+                         Opnd* src) 
+{
+    return NULL;
+}
+
+
+Opnd*
 Simplifier::simplifyShladd(Type* dstType,
                            Opnd* value,
                            Opnd* shiftAmount,
@@ -4086,6 +4105,27 @@
 {
     Opnd* dst = opndManager.createSsaTmpOpnd(type);
     Inst* inst = instFactory.makeConv(ovfMod, toType, dst, src);
+    insertInst(inst);
+    return inst;
+}
+
+Inst* 
+SimplifierWithInstFactory::genConvZE(Type* type, Type::Tag toType, 
+                                   Modifier ovfMod, 
+                                   Opnd* src)
+{
+    Opnd* dst = opndManager.createSsaTmpOpnd(type);
+    Inst* inst = instFactory.makeConvZE(ovfMod, toType, dst, src);
+    insertInst(inst);
+    return inst;
+}
+Inst* 
+SimplifierWithInstFactory::genConvUnmanaged(Type* type, Type::Tag toType, 
+                                   Modifier ovfMod, 
+                                   Opnd* src)
+{
+    Opnd* dst = opndManager.createSsaTmpOpnd(type);
+    Inst* inst = instFactory.makeConvUnmanaged(ovfMod, toType, dst, src);
     insertInst(inst);
     return inst;
 }

Modified: harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/simplifier.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/simplifier.h?view=diff&rev=518533&r1=518532&r2=518533
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/simplifier.h (original)
+++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/simplifier.h Thu Mar 15 02:14:50 2007
@@ -62,6 +62,8 @@
     Opnd* simplifyNot(Type*, Opnd* src1);
     Opnd* simplifySelect(Type*, Opnd* src1, Opnd* src2, Opnd* src3);
     Opnd* simplifyConv(Type*, Type::Tag toType, Modifier, Opnd* src);
+    Opnd* simplifyConvZE(Type*, Type::Tag toType, Modifier, Opnd* src);
+    Opnd* simplifyConvUnmanaged(Type*, Type::Tag toType, Modifier, Opnd* src);
     Opnd* simplifyShladd(Type* dstType, Opnd* value, Opnd* shiftAmount, Opnd *addto);
     Opnd* simplifyShl(Type* dstType, Modifier, Opnd* value, Opnd* shiftAmount);
     Opnd* simplifyShr(Type* dstType, Modifier, Opnd* value, Opnd* shiftAmount);
@@ -206,6 +208,10 @@
     // conversion
     virtual Inst* genConv(Type*, Type::Tag toType, Modifier, 
                           Opnd* src1) = 0;
+    virtual Inst* genConvZE(Type*, Type::Tag toType, Modifier, 
+                          Opnd* src1) = 0;
+    virtual Inst* genConvUnmanaged(Type*, Type::Tag toType, Modifier, 
+                          Opnd* src1) = 0;
     // shifts
     virtual Inst* genShladd(Type*, Opnd *value,
                             Opnd* shiftAmount, Opnd* addTo) = 0;
@@ -420,6 +426,11 @@
     Inst* caseConvUnmanaged(Inst* inst) {
         return inst;
     }
+    
+    Inst* caseConvZE(Inst* inst) {
+        return inst;
+    }
+
 
     // shifts
     Inst* caseShladd(Inst* inst) {
@@ -1114,6 +1125,11 @@
 
     virtual Inst* genConv(Type*, Type::Tag toType, Modifier, 
                           Opnd* src1);
+    virtual Inst* genConvZE(Type*, Type::Tag toType, Modifier, 
+                          Opnd* src1);
+    virtual Inst* genConvUnmanaged(Type*, Type::Tag toType, Modifier, 
+                          Opnd* src1);
+
     virtual Inst* genShladd(Type*, Opnd *value,
                             Opnd* shiftAmount, Opnd* addTo);
     virtual Inst* genShl(Type*, Modifier,

Modified: harmony/enhanced/drlvm/trunk/vm/jitrino/src/translator/java/JavaByteCodeTranslator.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/jitrino/src/translator/java/JavaByteCodeTranslator.cpp?view=diff&rev=518533&r1=518532&r2=518533
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/jitrino/src/translator/java/JavaByteCodeTranslator.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/translator/java/JavaByteCodeTranslator.cpp Thu Mar 15 02:14:50 2007
@@ -41,16 +41,12 @@
 
 // magics support    
 static bool isMagicClass(Type* type) {
-#ifdef _EM64T_
-    return false;//magics are not tested on EM64T.
-#else
     static const char magicPackage[] = "org/vmmagic/unboxed/";
     static const unsigned magicPackageLen = sizeof(magicPackage)-1;
 
     const char* name = type->getName();
     bool res =  !strncmp(name, magicPackage, magicPackageLen);
     return res;
-#endif    
 }
 
 static bool isMagicMethod(MethodDesc* md) {
@@ -3712,6 +3708,7 @@
 void JavaByteCodeTranslator::genMagic(MethodDesc *md, uint32 numArgs, Opnd **srcOpnds, Type *magicRetType) {
     const char* mname = md->getName();
     Type* resType = convertMagicType2HIR(typeManager, magicRetType);
+    Type* cmpResType = typeManager.getInt32Type();
     Opnd* tauSafe = irBuilder.genTauSafe();
     Opnd* arg0 = numArgs > 0 ? srcOpnds[0]: NULL;
     Opnd* arg1 = numArgs > 1 ? srcOpnds[1]: NULL;
@@ -3719,15 +3716,21 @@
 
     
     // max, one, zero
-    int theConst = 0;
+    POINTER_SIZE_INT theConst = 0;
     bool loadConst = false;
-    if (!strcmp(mname, "max"))          { loadConst = true; theConst = -1;}
+    if (!strcmp(mname, "max"))          { loadConst = true; theConst = ~(POINTER_SIZE_INT)0;}
     else if (!strcmp(mname, "one"))     { loadConst = true; theConst =  1;}
     else if (!strcmp(mname, "zero"))    { loadConst = true; theConst =  0;}
     else if (!strcmp(mname, "nullReference")) { loadConst = true; theConst =  0;}
     if (loadConst) {
-        ConstInst::ConstValue v; v.i4 = theConst;
+        ConstInst::ConstValue v;
+#ifdef _EM64T_
+	v.i8 = theConst;
+#else
+	v.i4 = theConst;	
+#endif
         Opnd* res = irBuilder.genLdConstant(typeManager.getUIntPtrType(), v);
+	
         if (resType->isPtr()) {
             res = irBuilder.genConv(resType, resType->tag, mod, res);
         }
@@ -3754,11 +3757,22 @@
         || !strcmp(mname, "toOffset"))
     {
         assert(numArgs == 1);
-        if (resType == arg0->getType()) {
+        Type* srcType = arg0->getType();
+        if (resType == srcType) {
             pushOpnd(irBuilder.genCopy(arg0));
             return;
-        } 
-        Opnd* res = irBuilder.genConv(resType, resType->tag, mod, arg0);
+        }
+        Opnd* res = NULL;
+        
+        if ((srcType->isObject() && resType->isUnmanagedPtr())
+            || (resType->isObject() && srcType->isUnmanagedPtr())) 
+        {
+            res = irBuilder.genConvUnmanaged(resType, resType->tag, mod, arg0);
+        } else if (!strcmp(mname, "fromIntZeroExtend")) {
+            res = irBuilder.genConvZE(resType, resType->tag, mod, arg0);
+        } else {
+            res = irBuilder.genConv(resType, resType->tag, mod, arg0);
+        }
         pushOpnd(res);
         return;
     }
@@ -3768,11 +3782,11 @@
     //
     bool isOp = false;
     if (!strcmp(mname, "isZero")) { isOp = true; theConst = 0; }
-    else if (!strcmp(mname, "isMax")) { isOp = true; theConst = ~0; }
+    else if (!strcmp(mname, "isMax")) { isOp = true; theConst = ~(POINTER_SIZE_INT)0; }
     else if (!strcmp(mname, "isNull")) { isOp = true; theConst = 0; }
     if (isOp) {
         assert(numArgs == 1);
-        Opnd* res = irBuilder.genCmp(typeManager.getInt32Type(), Type::Int32, Cmp_EQ, arg0, irBuilder.genLdConstant(theConst));
+        Opnd* res = irBuilder.genCmp(cmpResType, arg0->getType()->tag, Cmp_EQ, arg0, irBuilder.genLdConstant((POINTER_SIZE_SINT)theConst));
         pushOpnd(res);
         return;
     }
@@ -3800,7 +3814,7 @@
         assert(arg0->getType() == arg1->getType());
         Opnd* op0 = commuteOpnds ? arg1 : arg0;
         Opnd* op1 = commuteOpnds ? arg0 : arg1;
-        Opnd* res = irBuilder.genCmp(typeManager.getInt32Type(), Type::Int32, cm, op0, op1);
+        Opnd* res = irBuilder.genCmp(cmpResType, arg0->getType()->tag, cm, op0, op1);
         pushOpnd(res);
         return;
     }
@@ -3821,7 +3835,8 @@
     if (!strcmp(mname, "minus")){ 
         assert(numArgs==2); 
         if (resType->isPtr()) {
-            Opnd* negArg1 = irBuilder.genNeg(typeManager.getInt32Type(), arg1);
+            Type* negType = arg1->getType()->isUIntPtr() ? typeManager.getIntPtrType() : arg1->getType();
+            Opnd* negArg1 = irBuilder.genNeg(negType, arg1);
             pushOpnd(irBuilder.genAddScaledIndex(arg0, negArg1)); 
         } else {
             pushOpnd(irBuilder.genSub(resType, mod, arg0, arg1));