Constant pointer arithmetic for pointer initializers
This commit is contained in:
parent
ecb9bbee8a
commit
253be26335
|
@ -464,6 +464,11 @@ Expression* Expression::ConstantFold(Errors * errors)
|
|||
ex->mDecType = mLeft->mDecType;
|
||||
return ex;
|
||||
}
|
||||
else if (mType == EX_BINARY && mToken == TK_ADD && mLeft->mType == EX_VARIABLE && mLeft->mDecValue->mType == DT_VARIABLE && (mLeft->mDecValue->mFlags & DTF_CONST) && mLeft->mDecType->mType == DT_TYPE_POINTER && mRight->mType == EX_CONSTANT && mRight->mDecValue->mType == DT_CONST_INTEGER)
|
||||
{
|
||||
mLeft = mLeft->mDecValue->mValue;
|
||||
return this->ConstantFold(errors);
|
||||
}
|
||||
else if (mType == EX_QUALIFY && mLeft->mType == EX_VARIABLE && mLeft->mDecValue->mType == DT_VARIABLE && (mLeft->mDecValue->mFlags & DTF_GLOBAL) && mLeft->mDecType->mType == DT_TYPE_STRUCT)
|
||||
{
|
||||
Expression* ex = new Expression(mLocation, EX_VARIABLE);
|
||||
|
|
|
@ -5653,7 +5653,7 @@ int NativeCodeBasicBlock::ShortMultiply(InterCodeProcedure* proc, NativeCodeProc
|
|||
lshift++;
|
||||
}
|
||||
|
||||
if (mul > 1 && (lshift > 3 || lmul != 1) && ins->mSrc[index].IsUByte() && ins->mSrc[index].mRange.mMaxValue < 16)
|
||||
if (mul > 1 && ((lshift & 7) > 3 || lmul != 1) && ins->mSrc[index].IsUByte() && ins->mSrc[index].mRange.mMaxValue < 16)
|
||||
{
|
||||
int dreg = BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp];
|
||||
|
||||
|
|
Loading…
Reference in New Issue