GenTree* ptrToSpan = impPopStack().val;
GenTree* indexClone = nullptr;
GenTree* ptrToSpanClone = nullptr;
- assert(varTypeIsIntegral(index));
+ assert(genActualType(index) == TYP_INT);
assert(ptrToSpan->TypeGet() == TYP_BYREF);
#if defined(DEBUG)
GenTreeBoundsChk(GT_ARR_BOUNDS_CHECK, TYP_VOID, index, length, SCK_RNGCHK_FAIL);
// Element access
- GenTree* indexIntPtr = impImplicitIorI4Cast(indexClone, TYP_I_IMPL);
- GenTree* sizeofNode = gtNewIconNode(elemSize);
- GenTree* mulNode = gtNewOperNode(GT_MUL, TYP_I_IMPL, indexIntPtr, sizeofNode);
- CORINFO_FIELD_HANDLE ptrHnd = info.compCompHnd->getFieldInClass(clsHnd, 0);
- const unsigned ptrOffset = info.compCompHnd->getFieldOffset(ptrHnd);
- GenTree* data = gtNewFieldRef(TYP_BYREF, ptrHnd, ptrToSpanClone, ptrOffset);
- GenTree* result = gtNewOperNode(GT_ADD, TYP_BYREF, data, mulNode);
+ index = indexClone;
+
+#ifdef TARGET_64BIT
+ if (index->OperGet() == GT_CNS_INT)
+ {
+ index->gtType = TYP_I_IMPL;
+ }
+ else
+ {
+ index = gtNewCastNode(TYP_I_IMPL, index, true, TYP_I_IMPL);
+ }
+#endif
+
+ if (elemSize != 1)
+ {
+ GenTree* sizeofNode = gtNewIconNode(elemSize);
+ index = gtNewOperNode(GT_MUL, TYP_I_IMPL, index, sizeofNode);
+ }
+
+ CORINFO_FIELD_HANDLE ptrHnd = info.compCompHnd->getFieldInClass(clsHnd, 0);
+ const unsigned ptrOffset = info.compCompHnd->getFieldOffset(ptrHnd);
+ GenTree* data = gtNewFieldRef(TYP_BYREF, ptrHnd, ptrToSpanClone, ptrOffset);
+ GenTree* result = gtNewOperNode(GT_ADD, TYP_BYREF, data, index);
// Prepare result
var_types resultType = JITtype2varType(sig->retType);
if (bndsChkType != TYP_INT)
{
- arrLen = gtNewCastNode(bndsChkType, arrLen, false, bndsChkType);
+ arrLen = gtNewCastNode(bndsChkType, arrLen, true, bndsChkType);
}
GenTreeBoundsChk* arrBndsChk = new (this, GT_ARR_BOUNDS_CHECK)
}
else
{
- index = gtNewCastNode(TYP_I_IMPL, index, false, TYP_I_IMPL);
+ index = gtNewCastNode(TYP_I_IMPL, index, true, TYP_I_IMPL);
}
}
#endif // TARGET_64BIT