commit
e7bb37d12c
8 changed files with 78 additions and 125 deletions
|
|
@ -539,22 +539,21 @@ type
|
||||||
mIncl, mExcl, mCard, mChr,
|
mIncl, mExcl, mCard, mChr,
|
||||||
mGCref, mGCunref,
|
mGCref, mGCunref,
|
||||||
|
|
||||||
mAddI, mSubI, mMulI, mDivI, mModI, mAddI64, mSubI64, mMulI64,
|
mAddI, mSubI, mMulI, mDivI, mModI,
|
||||||
mDivI64, mModI64, mSucc, mPred,
|
mSucc, mPred,
|
||||||
mAddF64, mSubF64, mMulF64, mDivF64,
|
mAddF64, mSubF64, mMulF64, mDivF64,
|
||||||
|
|
||||||
mShrI, mShlI, mBitandI, mBitorI, mBitxorI, mMinI, mMaxI,
|
mShrI, mShlI, mBitandI, mBitorI, mBitxorI, mMinI, mMaxI,
|
||||||
mShrI64, mShlI64, mBitandI64, mBitorI64, mBitxorI64,
|
|
||||||
mMinF64, mMaxF64, mAddU, mSubU, mMulU,
|
mMinF64, mMaxF64, mAddU, mSubU, mMulU,
|
||||||
mDivU, mModU, mEqI, mLeI,
|
mDivU, mModU, mEqI, mLeI,
|
||||||
mLtI,
|
mLtI,
|
||||||
mEqI64, mLeI64, mLtI64, mEqF64, mLeF64, mLtF64,
|
mEqF64, mLeF64, mLtF64,
|
||||||
mLeU, mLtU, mLeU64, mLtU64,
|
mLeU, mLtU, mLeU64, mLtU64,
|
||||||
mEqEnum, mLeEnum, mLtEnum, mEqCh, mLeCh, mLtCh, mEqB, mLeB, mLtB, mEqRef,
|
mEqEnum, mLeEnum, mLtEnum, mEqCh, mLeCh, mLtCh, mEqB, mLeB, mLtB, mEqRef,
|
||||||
mEqUntracedRef, mLePtr, mLtPtr, mEqCString, mXor, mEqProc, mUnaryMinusI,
|
mEqUntracedRef, mLePtr, mLtPtr, mEqCString, mXor, mEqProc, mUnaryMinusI,
|
||||||
mUnaryMinusI64, mAbsI, mAbsI64, mNot,
|
mUnaryMinusI64, mAbsI, mNot,
|
||||||
mUnaryPlusI, mBitnotI,
|
mUnaryPlusI, mBitnotI,
|
||||||
mBitnotI64, mUnaryPlusF64, mUnaryMinusF64, mAbsF64, mZe8ToI, mZe8ToI64,
|
mUnaryPlusF64, mUnaryMinusF64, mAbsF64, mZe8ToI, mZe8ToI64,
|
||||||
mZe16ToI, mZe16ToI64, mZe32ToI64, mZeIToI64, mToU8, mToU16, mToU32,
|
mZe16ToI, mZe16ToI64, mZe32ToI64, mZeIToI64, mToU8, mToU16, mToU32,
|
||||||
mToFloat, mToBiggestFloat, mToInt, mToBiggestInt, mCharToStr, mBoolToStr,
|
mToFloat, mToBiggestFloat, mToInt, mToBiggestInt, mCharToStr, mBoolToStr,
|
||||||
mIntToStr, mInt64ToStr, mFloatToStr, mCStrToStr, mStrToStr, mEnumToStr,
|
mIntToStr, mInt64ToStr, mFloatToStr, mCStrToStr, mStrToStr, mEnumToStr,
|
||||||
|
|
@ -594,20 +593,19 @@ const
|
||||||
mPred, mInc, mDec, mOrd, mLengthOpenArray,
|
mPred, mInc, mDec, mOrd, mLengthOpenArray,
|
||||||
mLengthStr, mLengthArray, mLengthSeq, mXLenStr, mXLenSeq,
|
mLengthStr, mLengthArray, mLengthSeq, mXLenStr, mXLenSeq,
|
||||||
mIncl, mExcl, mCard, mChr,
|
mIncl, mExcl, mCard, mChr,
|
||||||
mAddI, mSubI, mMulI, mDivI, mModI, mAddI64, mSubI64, mMulI64,
|
mAddI, mSubI, mMulI, mDivI, mModI,
|
||||||
mDivI64, mModI64, mAddF64, mSubF64, mMulF64, mDivF64,
|
mAddF64, mSubF64, mMulF64, mDivF64,
|
||||||
mShrI, mShlI, mBitandI, mBitorI, mBitxorI, mMinI, mMaxI,
|
mShrI, mShlI, mBitandI, mBitorI, mBitxorI, mMinI, mMaxI,
|
||||||
mShrI64, mShlI64, mBitandI64, mBitorI64, mBitxorI64,
|
|
||||||
mMinF64, mMaxF64, mAddU, mSubU, mMulU,
|
mMinF64, mMaxF64, mAddU, mSubU, mMulU,
|
||||||
mDivU, mModU, mEqI, mLeI,
|
mDivU, mModU, mEqI, mLeI,
|
||||||
mLtI,
|
mLtI,
|
||||||
mEqI64, mLeI64, mLtI64, mEqF64, mLeF64, mLtF64,
|
mEqF64, mLeF64, mLtF64,
|
||||||
mLeU, mLtU, mLeU64, mLtU64,
|
mLeU, mLtU, mLeU64, mLtU64,
|
||||||
mEqEnum, mLeEnum, mLtEnum, mEqCh, mLeCh, mLtCh, mEqB, mLeB, mLtB, mEqRef,
|
mEqEnum, mLeEnum, mLtEnum, mEqCh, mLeCh, mLtCh, mEqB, mLeB, mLtB, mEqRef,
|
||||||
mEqProc, mEqUntracedRef, mLePtr, mLtPtr, mEqCString, mXor, mUnaryMinusI,
|
mEqProc, mEqUntracedRef, mLePtr, mLtPtr, mEqCString, mXor, mUnaryMinusI,
|
||||||
mUnaryMinusI64, mAbsI, mAbsI64, mNot,
|
mUnaryMinusI64, mAbsI, mNot,
|
||||||
mUnaryPlusI, mBitnotI,
|
mUnaryPlusI, mBitnotI,
|
||||||
mBitnotI64, mUnaryPlusF64, mUnaryMinusF64, mAbsF64, mZe8ToI, mZe8ToI64,
|
mUnaryPlusF64, mUnaryMinusF64, mAbsF64, mZe8ToI, mZe8ToI64,
|
||||||
mZe16ToI, mZe16ToI64, mZe32ToI64, mZeIToI64, mToU8, mToU16, mToU32,
|
mZe16ToI, mZe16ToI64, mZe32ToI64, mZeIToI64, mToU8, mToU16, mToU32,
|
||||||
mToFloat, mToBiggestFloat, mToInt, mToBiggestInt, mCharToStr, mBoolToStr,
|
mToFloat, mToBiggestFloat, mToInt, mToBiggestInt, mCharToStr, mBoolToStr,
|
||||||
mIntToStr, mInt64ToStr, mFloatToStr, mCStrToStr, mStrToStr, mEnumToStr,
|
mIntToStr, mInt64ToStr, mFloatToStr, mCStrToStr, mStrToStr, mEnumToStr,
|
||||||
|
|
|
||||||
|
|
@ -503,13 +503,8 @@ proc binaryArithOverflow(p: BProc, e: PNode, d: var TLoc, m: TMagic) =
|
||||||
"$# = #addInt($#, $#);$n", "$# = #subInt($#, $#);$n",
|
"$# = #addInt($#, $#);$n", "$# = #subInt($#, $#);$n",
|
||||||
"$# = #mulInt($#, $#);$n", "$# = #divInt($#, $#);$n",
|
"$# = #mulInt($#, $#);$n", "$# = #divInt($#, $#);$n",
|
||||||
"$# = #modInt($#, $#);$n",
|
"$# = #modInt($#, $#);$n",
|
||||||
"$# = #addInt64($#, $#);$n", "$# = #subInt64($#, $#);$n",
|
|
||||||
"$# = #mulInt64($#, $#);$n", "$# = #divInt64($#, $#);$n",
|
|
||||||
"$# = #modInt64($#, $#);$n",
|
|
||||||
"$# = #addInt($#, $#);$n", "$# = #subInt($#, $#);$n"]
|
"$# = #addInt($#, $#);$n", "$# = #subInt($#, $#);$n"]
|
||||||
opr: array[mAddI..mPred, string] = [
|
opr: array[mAddI..mPred, string] = [
|
||||||
"($#)($# + $#)", "($#)($# - $#)", "($#)($# * $#)",
|
|
||||||
"($#)($# / $#)", "($#)($# % $#)",
|
|
||||||
"($#)($# + $#)", "($#)($# - $#)", "($#)($# * $#)",
|
"($#)($# + $#)", "($#)($# - $#)", "($#)($# * $#)",
|
||||||
"($#)($# / $#)", "($#)($# % $#)",
|
"($#)($# / $#)", "($#)($# % $#)",
|
||||||
"($#)($# + $#)", "($#)($# - $#)"]
|
"($#)($# + $#)", "($#)($# - $#)"]
|
||||||
|
|
@ -530,11 +525,10 @@ proc binaryArithOverflow(p: BProc, e: PNode, d: var TLoc, m: TMagic) =
|
||||||
|
|
||||||
proc unaryArithOverflow(p: BProc, e: PNode, d: var TLoc, m: TMagic) =
|
proc unaryArithOverflow(p: BProc, e: PNode, d: var TLoc, m: TMagic) =
|
||||||
const
|
const
|
||||||
opr: array[mUnaryMinusI..mAbsI64, string] = [
|
opr: array[mUnaryMinusI..mAbsI, string] = [
|
||||||
mUnaryMinusI: "((NI$2)-($1))",
|
mUnaryMinusI: "((NI$2)-($1))",
|
||||||
mUnaryMinusI64: "-($1)",
|
mUnaryMinusI64: "-($1)",
|
||||||
mAbsI: "($1 > 0? ($1) : -($1))",
|
mAbsI: "($1 > 0? ($1) : -($1))"]
|
||||||
mAbsI64: "($1 > 0? ($1) : -($1))"]
|
|
||||||
var
|
var
|
||||||
a: TLoc
|
a: TLoc
|
||||||
t: PType
|
t: PType
|
||||||
|
|
@ -561,11 +555,6 @@ proc binaryArith(p: BProc, e: PNode, d: var TLoc, op: TMagic) =
|
||||||
"($4)($1 ^ $2)", # BitxorI
|
"($4)($1 ^ $2)", # BitxorI
|
||||||
"(($1 <= $2) ? $1 : $2)", # MinI
|
"(($1 <= $2) ? $1 : $2)", # MinI
|
||||||
"(($1 >= $2) ? $1 : $2)", # MaxI
|
"(($1 >= $2) ? $1 : $2)", # MaxI
|
||||||
"($4)((NU64)($1) >> (NU64)($2))", # ShrI64
|
|
||||||
"($4)((NU64)($1) << (NU64)($2))", # ShlI64
|
|
||||||
"($4)($1 & $2)", # BitandI64
|
|
||||||
"($4)($1 | $2)", # BitorI64
|
|
||||||
"($4)($1 ^ $2)", # BitxorI64
|
|
||||||
"(($1 <= $2) ? $1 : $2)", # MinF64
|
"(($1 <= $2) ? $1 : $2)", # MinF64
|
||||||
"(($1 >= $2) ? $1 : $2)", # MaxF64
|
"(($1 >= $2) ? $1 : $2)", # MaxF64
|
||||||
"($4)((NU$3)($1) + (NU$3)($2))", # AddU
|
"($4)((NU$3)($1) + (NU$3)($2))", # AddU
|
||||||
|
|
@ -576,9 +565,6 @@ proc binaryArith(p: BProc, e: PNode, d: var TLoc, op: TMagic) =
|
||||||
"($1 == $2)", # EqI
|
"($1 == $2)", # EqI
|
||||||
"($1 <= $2)", # LeI
|
"($1 <= $2)", # LeI
|
||||||
"($1 < $2)", # LtI
|
"($1 < $2)", # LtI
|
||||||
"($1 == $2)", # EqI64
|
|
||||||
"($1 <= $2)", # LeI64
|
|
||||||
"($1 < $2)", # LtI64
|
|
||||||
"($1 == $2)", # EqF64
|
"($1 == $2)", # EqF64
|
||||||
"($1 <= $2)", # LeF64
|
"($1 <= $2)", # LeF64
|
||||||
"($1 < $2)", # LtF64
|
"($1 < $2)", # LtF64
|
||||||
|
|
@ -638,7 +624,6 @@ proc unaryArith(p: BProc, e: PNode, d: var TLoc, op: TMagic) =
|
||||||
unArithTab: array[mNot..mToBiggestInt, string] = ["!($1)", # Not
|
unArithTab: array[mNot..mToBiggestInt, string] = ["!($1)", # Not
|
||||||
"$1", # UnaryPlusI
|
"$1", # UnaryPlusI
|
||||||
"($3)((NU$2) ~($1))", # BitnotI
|
"($3)((NU$2) ~($1))", # BitnotI
|
||||||
"($3)((NU$2) ~($1))", # BitnotI64
|
|
||||||
"$1", # UnaryPlusF64
|
"$1", # UnaryPlusF64
|
||||||
"-($1)", # UnaryMinusF64
|
"-($1)", # UnaryMinusF64
|
||||||
"($1 > 0? ($1) : -($1))", # AbsF64; BUGFIX: fabs() makes problems
|
"($1 > 0? ($1) : -($1))", # AbsF64; BUGFIX: fabs() makes problems
|
||||||
|
|
@ -1661,7 +1646,7 @@ proc genMagicExpr(p: BProc, e: PNode, d: var TLoc, op: TMagic) =
|
||||||
case op
|
case op
|
||||||
of mOr, mAnd: genAndOr(p, e, d, op)
|
of mOr, mAnd: genAndOr(p, e, d, op)
|
||||||
of mNot..mToBiggestInt: unaryArith(p, e, d, op)
|
of mNot..mToBiggestInt: unaryArith(p, e, d, op)
|
||||||
of mUnaryMinusI..mAbsI64: unaryArithOverflow(p, e, d, op)
|
of mUnaryMinusI..mAbsI: unaryArithOverflow(p, e, d, op)
|
||||||
of mAddF64..mDivF64: binaryFloatArith(p, e, d, op)
|
of mAddF64..mDivF64: binaryFloatArith(p, e, d, op)
|
||||||
of mShrI..mXor: binaryArith(p, e, d, op)
|
of mShrI..mXor: binaryArith(p, e, d, op)
|
||||||
of mEqProc: genEqProc(p, e, d)
|
of mEqProc: genEqProc(p, e, d)
|
||||||
|
|
|
||||||
|
|
@ -12,9 +12,9 @@
|
||||||
import ast, astalgo
|
import ast, astalgo
|
||||||
|
|
||||||
const
|
const
|
||||||
someCmp = {mEqI, mEqI64, mEqF64, mEqEnum, mEqCh, mEqB, mEqRef, mEqProc,
|
someCmp = {mEqI, mEqF64, mEqEnum, mEqCh, mEqB, mEqRef, mEqProc,
|
||||||
mEqUntracedRef, mLeI, mLeI64, mLeF64, mLeU, mLeU64, mLeEnum,
|
mEqUntracedRef, mLeI, mLeF64, mLeU, mLeU64, mLeEnum,
|
||||||
mLeCh, mLeB, mLePtr, mLtI, mLtI64, mLtF64, mLtU, mLtU64, mLtEnum,
|
mLeCh, mLeB, mLePtr, mLtI, mLtF64, mLtU, mLtU64, mLtEnum,
|
||||||
mLtCh, mLtB, mLtPtr}
|
mLtCh, mLtB, mLtPtr}
|
||||||
|
|
||||||
proc isCounter(s: PSym): bool {.inline.} =
|
proc isCounter(s: PSym): bool {.inline.} =
|
||||||
|
|
|
||||||
|
|
@ -13,13 +13,13 @@ import ast, astalgo, msgs, magicsys, nimsets, trees, types, renderer, idents,
|
||||||
saturate
|
saturate
|
||||||
|
|
||||||
const
|
const
|
||||||
someEq = {mEqI, mEqI64, mEqF64, mEqEnum, mEqCh, mEqB, mEqRef, mEqProc,
|
someEq = {mEqI, mEqF64, mEqEnum, mEqCh, mEqB, mEqRef, mEqProc,
|
||||||
mEqUntracedRef, mEqStr, mEqSet, mEqCString}
|
mEqUntracedRef, mEqStr, mEqSet, mEqCString}
|
||||||
|
|
||||||
# set excluded here as the semantics are vastly different:
|
# set excluded here as the semantics are vastly different:
|
||||||
someLe = {mLeI, mLeI64, mLeF64, mLeU, mLeU64, mLeEnum,
|
someLe = {mLeI, mLeF64, mLeU, mLeU64, mLeEnum,
|
||||||
mLeCh, mLeB, mLePtr, mLeStr}
|
mLeCh, mLeB, mLePtr, mLeStr}
|
||||||
someLt = {mLtI, mLtI64, mLtF64, mLtU, mLtU64, mLtEnum,
|
someLt = {mLtI, mLtF64, mLtU, mLtU64, mLtEnum,
|
||||||
mLtCh, mLtB, mLtPtr, mLtStr}
|
mLtCh, mLtB, mLtPtr, mLtStr}
|
||||||
|
|
||||||
someLen = {mLengthOpenArray, mLengthStr, mLengthArray, mLengthSeq,
|
someLen = {mLengthOpenArray, mLengthStr, mLengthArray, mLengthSeq,
|
||||||
|
|
@ -30,11 +30,11 @@ const
|
||||||
someHigh = {mHigh}
|
someHigh = {mHigh}
|
||||||
# we don't list unsigned here because wrap around semantics suck for
|
# we don't list unsigned here because wrap around semantics suck for
|
||||||
# proving anything:
|
# proving anything:
|
||||||
someAdd = {mAddI, mAddI64, mAddF64, mSucc}
|
someAdd = {mAddI, mAddF64, mSucc}
|
||||||
someSub = {mSubI, mSubI64, mSubF64, mPred}
|
someSub = {mSubI, mSubF64, mPred}
|
||||||
someMul = {mMulI, mMulI64, mMulF64}
|
someMul = {mMulI, mMulF64}
|
||||||
someDiv = {mDivI, mDivI64, mDivF64}
|
someDiv = {mDivI, mDivF64}
|
||||||
someMod = {mModI, mModI64}
|
someMod = {mModI}
|
||||||
someMax = {mMaxI, mMaxF64}
|
someMax = {mMaxI, mMaxF64}
|
||||||
someMin = {mMinI, mMinF64}
|
someMin = {mMinI, mMinF64}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -258,11 +258,6 @@ const # magic checked op; magic unchecked op; checked op; unchecked op
|
||||||
["mulInt", "", "mulInt($1, $2)", "($1 * $2)"], # MulI
|
["mulInt", "", "mulInt($1, $2)", "($1 * $2)"], # MulI
|
||||||
["divInt", "", "divInt($1, $2)", "Math.floor($1 / $2)"], # DivI
|
["divInt", "", "divInt($1, $2)", "Math.floor($1 / $2)"], # DivI
|
||||||
["modInt", "", "modInt($1, $2)", "Math.floor($1 % $2)"], # ModI
|
["modInt", "", "modInt($1, $2)", "Math.floor($1 % $2)"], # ModI
|
||||||
["addInt64", "", "addInt64($1, $2)", "($1 + $2)"], # AddI64
|
|
||||||
["subInt64", "", "subInt64($1, $2)", "($1 - $2)"], # SubI64
|
|
||||||
["mulInt64", "", "mulInt64($1, $2)", "($1 * $2)"], # MulI64
|
|
||||||
["divInt64", "", "divInt64($1, $2)", "Math.floor($1 / $2)"], # DivI64
|
|
||||||
["modInt64", "", "modInt64($1, $2)", "Math.floor($1 % $2)"], # ModI64
|
|
||||||
["addInt", "", "addInt($1, $2)", "($1 + $2)"], # Succ
|
["addInt", "", "addInt($1, $2)", "($1 + $2)"], # Succ
|
||||||
["subInt", "", "subInt($1, $2)", "($1 - $2)"], # Pred
|
["subInt", "", "subInt($1, $2)", "($1 - $2)"], # Pred
|
||||||
["", "", "($1 + $2)", "($1 + $2)"], # AddF64
|
["", "", "($1 + $2)", "($1 + $2)"], # AddF64
|
||||||
|
|
@ -276,11 +271,6 @@ const # magic checked op; magic unchecked op; checked op; unchecked op
|
||||||
["", "", "($1 ^ $2)", "($1 ^ $2)"], # BitxorI
|
["", "", "($1 ^ $2)", "($1 ^ $2)"], # BitxorI
|
||||||
["nimMin", "nimMin", "nimMin($1, $2)", "nimMin($1, $2)"], # MinI
|
["nimMin", "nimMin", "nimMin($1, $2)", "nimMin($1, $2)"], # MinI
|
||||||
["nimMax", "nimMax", "nimMax($1, $2)", "nimMax($1, $2)"], # MaxI
|
["nimMax", "nimMax", "nimMax($1, $2)", "nimMax($1, $2)"], # MaxI
|
||||||
["", "", "($1 >>> $2)", "($1 >>> $2)"], # ShrI64
|
|
||||||
["", "", "($1 << $2)", "($1 << $2)"], # ShlI64
|
|
||||||
["", "", "($1 & $2)", "($1 & $2)"], # BitandI64
|
|
||||||
["", "", "($1 | $2)", "($1 | $2)"], # BitorI64
|
|
||||||
["", "", "($1 ^ $2)", "($1 ^ $2)"], # BitxorI64
|
|
||||||
["nimMin", "nimMin", "nimMin($1, $2)", "nimMin($1, $2)"], # MinF64
|
["nimMin", "nimMin", "nimMin($1, $2)", "nimMin($1, $2)"], # MinF64
|
||||||
["nimMax", "nimMax", "nimMax($1, $2)", "nimMax($1, $2)"], # MaxF64
|
["nimMax", "nimMax", "nimMax($1, $2)", "nimMax($1, $2)"], # MaxF64
|
||||||
["addU", "addU", "addU($1, $2)", "addU($1, $2)"], # addU
|
["addU", "addU", "addU($1, $2)", "addU($1, $2)"], # addU
|
||||||
|
|
@ -291,9 +281,6 @@ const # magic checked op; magic unchecked op; checked op; unchecked op
|
||||||
["", "", "($1 == $2)", "($1 == $2)"], # EqI
|
["", "", "($1 == $2)", "($1 == $2)"], # EqI
|
||||||
["", "", "($1 <= $2)", "($1 <= $2)"], # LeI
|
["", "", "($1 <= $2)", "($1 <= $2)"], # LeI
|
||||||
["", "", "($1 < $2)", "($1 < $2)"], # LtI
|
["", "", "($1 < $2)", "($1 < $2)"], # LtI
|
||||||
["", "", "($1 == $2)", "($1 == $2)"], # EqI64
|
|
||||||
["", "", "($1 <= $2)", "($1 <= $2)"], # LeI64
|
|
||||||
["", "", "($1 < $2)", "($1 < $2)"], # LtI64
|
|
||||||
["", "", "($1 == $2)", "($1 == $2)"], # EqF64
|
["", "", "($1 == $2)", "($1 == $2)"], # EqF64
|
||||||
["", "", "($1 <= $2)", "($1 <= $2)"], # LeF64
|
["", "", "($1 <= $2)", "($1 <= $2)"], # LeF64
|
||||||
["", "", "($1 < $2)", "($1 < $2)"], # LtF64
|
["", "", "($1 < $2)", "($1 < $2)"], # LtF64
|
||||||
|
|
@ -320,11 +307,9 @@ const # magic checked op; magic unchecked op; checked op; unchecked op
|
||||||
["negInt", "", "negInt($1)", "-($1)"], # UnaryMinusI
|
["negInt", "", "negInt($1)", "-($1)"], # UnaryMinusI
|
||||||
["negInt64", "", "negInt64($1)", "-($1)"], # UnaryMinusI64
|
["negInt64", "", "negInt64($1)", "-($1)"], # UnaryMinusI64
|
||||||
["absInt", "", "absInt($1)", "Math.abs($1)"], # AbsI
|
["absInt", "", "absInt($1)", "Math.abs($1)"], # AbsI
|
||||||
["absInt64", "", "absInt64($1)", "Math.abs($1)"], # AbsI64
|
|
||||||
["", "", "!($1)", "!($1)"], # Not
|
["", "", "!($1)", "!($1)"], # Not
|
||||||
["", "", "+($1)", "+($1)"], # UnaryPlusI
|
["", "", "+($1)", "+($1)"], # UnaryPlusI
|
||||||
["", "", "~($1)", "~($1)"], # BitnotI
|
["", "", "~($1)", "~($1)"], # BitnotI
|
||||||
["", "", "~($1)", "~($1)"], # BitnotI64
|
|
||||||
["", "", "+($1)", "+($1)"], # UnaryPlusF64
|
["", "", "+($1)", "+($1)"], # UnaryPlusF64
|
||||||
["", "", "-($1)", "-($1)"], # UnaryMinusF64
|
["", "", "-($1)", "-($1)"], # UnaryMinusF64
|
||||||
["", "", "Math.abs($1)", "Math.abs($1)"], # AbsF64
|
["", "", "Math.abs($1)", "Math.abs($1)"], # AbsF64
|
||||||
|
|
@ -357,11 +342,6 @@ const # magic checked op; magic unchecked op; checked op; unchecked op
|
||||||
["mulInt", "", "mulInt($1, $2)", "($1 * $2)"], # MulI
|
["mulInt", "", "mulInt($1, $2)", "($1 * $2)"], # MulI
|
||||||
["divInt", "", "divInt($1, $2)", "Math.floor($1 / $2)"], # DivI
|
["divInt", "", "divInt($1, $2)", "Math.floor($1 / $2)"], # DivI
|
||||||
["modInt", "", "modInt($1, $2)", "Math.floor($1 % $2)"], # ModI
|
["modInt", "", "modInt($1, $2)", "Math.floor($1 % $2)"], # ModI
|
||||||
["addInt64", "", "addInt64($1, $2)", "($1 + $2)"], # AddI64
|
|
||||||
["subInt64", "", "subInt64($1, $2)", "($1 - $2)"], # SubI64
|
|
||||||
["mulInt64", "", "mulInt64($1, $2)", "($1 * $2)"], # MulI64
|
|
||||||
["divInt64", "", "divInt64($1, $2)", "Math.floor($1 / $2)"], # DivI64
|
|
||||||
["modInt64", "", "modInt64($1, $2)", "Math.floor($1 % $2)"], # ModI64
|
|
||||||
["addInt", "", "addInt($1, $2)", "($1 + $2)"], # Succ
|
["addInt", "", "addInt($1, $2)", "($1 + $2)"], # Succ
|
||||||
["subInt", "", "subInt($1, $2)", "($1 - $2)"], # Pred
|
["subInt", "", "subInt($1, $2)", "($1 - $2)"], # Pred
|
||||||
["", "", "($1 + $2)", "($1 + $2)"], # AddF64
|
["", "", "($1 + $2)", "($1 + $2)"], # AddF64
|
||||||
|
|
@ -375,11 +355,6 @@ const # magic checked op; magic unchecked op; checked op; unchecked op
|
||||||
["", "", "($1 ^ $2)", "($1 ^ $2)"], # BitxorI
|
["", "", "($1 ^ $2)", "($1 ^ $2)"], # BitxorI
|
||||||
["nimMin", "nimMin", "nimMin($1, $2)", "nimMin($1, $2)"], # MinI
|
["nimMin", "nimMin", "nimMin($1, $2)", "nimMin($1, $2)"], # MinI
|
||||||
["nimMax", "nimMax", "nimMax($1, $2)", "nimMax($1, $2)"], # MaxI
|
["nimMax", "nimMax", "nimMax($1, $2)", "nimMax($1, $2)"], # MaxI
|
||||||
["", "", "($1 >>> $2)", "($1 >>> $2)"], # ShrI64
|
|
||||||
["", "", "($1 << $2)", "($1 << $2)"], # ShlI64
|
|
||||||
["", "", "($1 & $2)", "($1 & $2)"], # BitandI64
|
|
||||||
["", "", "($1 | $2)", "($1 | $2)"], # BitorI64
|
|
||||||
["", "", "($1 ^ $2)", "($1 ^ $2)"], # BitxorI64
|
|
||||||
["nimMin", "nimMin", "nimMin($1, $2)", "nimMin($1, $2)"], # MinF64
|
["nimMin", "nimMin", "nimMin($1, $2)", "nimMin($1, $2)"], # MinF64
|
||||||
["nimMax", "nimMax", "nimMax($1, $2)", "nimMax($1, $2)"], # MaxF64
|
["nimMax", "nimMax", "nimMax($1, $2)", "nimMax($1, $2)"], # MaxF64
|
||||||
["addU", "addU", "addU($1, $2)", "addU($1, $2)"], # addU
|
["addU", "addU", "addU($1, $2)", "addU($1, $2)"], # addU
|
||||||
|
|
@ -390,9 +365,6 @@ const # magic checked op; magic unchecked op; checked op; unchecked op
|
||||||
["", "", "($1 == $2)", "($1 == $2)"], # EqI
|
["", "", "($1 == $2)", "($1 == $2)"], # EqI
|
||||||
["", "", "($1 <= $2)", "($1 <= $2)"], # LeI
|
["", "", "($1 <= $2)", "($1 <= $2)"], # LeI
|
||||||
["", "", "($1 < $2)", "($1 < $2)"], # LtI
|
["", "", "($1 < $2)", "($1 < $2)"], # LtI
|
||||||
["", "", "($1 == $2)", "($1 == $2)"], # EqI64
|
|
||||||
["", "", "($1 <= $2)", "($1 <= $2)"], # LeI64
|
|
||||||
["", "", "($1 < $2)", "($1 < $2)"], # LtI64
|
|
||||||
["", "", "($1 == $2)", "($1 == $2)"], # EqF64
|
["", "", "($1 == $2)", "($1 == $2)"], # EqF64
|
||||||
["", "", "($1 <= $2)", "($1 <= $2)"], # LeF64
|
["", "", "($1 <= $2)", "($1 <= $2)"], # LeF64
|
||||||
["", "", "($1 < $2)", "($1 < $2)"], # LtF64
|
["", "", "($1 < $2)", "($1 < $2)"], # LtF64
|
||||||
|
|
@ -419,11 +391,9 @@ const # magic checked op; magic unchecked op; checked op; unchecked op
|
||||||
["negInt", "", "negInt($1)", "-($1)"], # UnaryMinusI
|
["negInt", "", "negInt($1)", "-($1)"], # UnaryMinusI
|
||||||
["negInt64", "", "negInt64($1)", "-($1)"], # UnaryMinusI64
|
["negInt64", "", "negInt64($1)", "-($1)"], # UnaryMinusI64
|
||||||
["absInt", "", "absInt($1)", "Math.abs($1)"], # AbsI
|
["absInt", "", "absInt($1)", "Math.abs($1)"], # AbsI
|
||||||
["absInt64", "", "absInt64($1)", "Math.abs($1)"], # AbsI64
|
|
||||||
["", "", "not ($1)", "not ($1)"], # Not
|
["", "", "not ($1)", "not ($1)"], # Not
|
||||||
["", "", "+($1)", "+($1)"], # UnaryPlusI
|
["", "", "+($1)", "+($1)"], # UnaryPlusI
|
||||||
["", "", "~($1)", "~($1)"], # BitnotI
|
["", "", "~($1)", "~($1)"], # BitnotI
|
||||||
["", "", "~($1)", "~($1)"], # BitnotI64
|
|
||||||
["", "", "+($1)", "+($1)"], # UnaryPlusF64
|
["", "", "+($1)", "+($1)"], # UnaryPlusF64
|
||||||
["", "", "-($1)", "-($1)"], # UnaryMinusF64
|
["", "", "-($1)", "-($1)"], # UnaryMinusF64
|
||||||
["", "", "Math.abs($1)", "Math.abs($1)"], # AbsF64
|
["", "", "Math.abs($1)", "Math.abs($1)"], # AbsF64
|
||||||
|
|
|
||||||
|
|
@ -179,7 +179,7 @@ proc getIntervalType*(m: TMagic, n: PNode): PType =
|
||||||
else:
|
else:
|
||||||
result = makeRangeF(a, abs(getFloat(a.n.sons[1])),
|
result = makeRangeF(a, abs(getFloat(a.n.sons[1])),
|
||||||
abs(getFloat(a.n.sons[0])))
|
abs(getFloat(a.n.sons[0])))
|
||||||
of mAbsI, mAbsI64:
|
of mAbsI:
|
||||||
let a = n.sons[1].typ
|
let a = n.sons[1].typ
|
||||||
if isIntRange(a):
|
if isIntRange(a):
|
||||||
if a.n[0].intVal <= 0:
|
if a.n[0].intVal <= 0:
|
||||||
|
|
@ -200,13 +200,13 @@ proc getIntervalType*(m: TMagic, n: PNode): PType =
|
||||||
if isIntRange(a) and isIntLit(b):
|
if isIntRange(a) and isIntLit(b):
|
||||||
result = makeRange(a, pickMinInt(n.sons[1]) |-| pickMinInt(n.sons[2]),
|
result = makeRange(a, pickMinInt(n.sons[1]) |-| pickMinInt(n.sons[2]),
|
||||||
pickMaxInt(n.sons[1]) |-| pickMaxInt(n.sons[2]))
|
pickMaxInt(n.sons[1]) |-| pickMaxInt(n.sons[2]))
|
||||||
of mAddI, mAddI64, mAddU:
|
of mAddI, mAddU:
|
||||||
commutativeOp(`|+|`)
|
commutativeOp(`|+|`)
|
||||||
of mMulI, mMulI64, mMulU:
|
of mMulI, mMulU:
|
||||||
commutativeOp(`|*|`)
|
commutativeOp(`|*|`)
|
||||||
of mSubI, mSubI64, mSubU:
|
of mSubI, mSubU:
|
||||||
binaryOp(`|-|`)
|
binaryOp(`|-|`)
|
||||||
of mBitandI, mBitandI64:
|
of mBitandI:
|
||||||
# since uint64 is still not even valid for 'range' (since it's no ordinal
|
# since uint64 is still not even valid for 'range' (since it's no ordinal
|
||||||
# yet), we exclude it from the list (see bug #1638) for now:
|
# yet), we exclude it from the list (see bug #1638) for now:
|
||||||
var a = n.sons[1]
|
var a = n.sons[1]
|
||||||
|
|
@ -225,7 +225,7 @@ proc getIntervalType*(m: TMagic, n: PNode): PType =
|
||||||
result = makeRange(a.typ, 0, b.intVal-1)
|
result = makeRange(a.typ, 0, b.intVal-1)
|
||||||
else:
|
else:
|
||||||
result = makeRange(a.typ, b.intVal+1, 0)
|
result = makeRange(a.typ, b.intVal+1, 0)
|
||||||
of mModI, mModI64:
|
of mModI:
|
||||||
# so ... if you ever wondered about modulo's signedness; this defines it:
|
# so ... if you ever wondered about modulo's signedness; this defines it:
|
||||||
let a = n.sons[1]
|
let a = n.sons[1]
|
||||||
let b = n.sons[2]
|
let b = n.sons[2]
|
||||||
|
|
@ -234,7 +234,7 @@ proc getIntervalType*(m: TMagic, n: PNode): PType =
|
||||||
result = makeRange(a.typ, -(b.intVal-1), b.intVal-1)
|
result = makeRange(a.typ, -(b.intVal-1), b.intVal-1)
|
||||||
else:
|
else:
|
||||||
result = makeRange(a.typ, b.intVal+1, -(b.intVal+1))
|
result = makeRange(a.typ, b.intVal+1, -(b.intVal+1))
|
||||||
of mDivI, mDivI64, mDivU:
|
of mDivI, mDivU:
|
||||||
binaryOp(`|div|`)
|
binaryOp(`|div|`)
|
||||||
of mMinI:
|
of mMinI:
|
||||||
commutativeOp(min)
|
commutativeOp(min)
|
||||||
|
|
@ -243,8 +243,8 @@ proc getIntervalType*(m: TMagic, n: PNode): PType =
|
||||||
else: discard
|
else: discard
|
||||||
|
|
||||||
discard """
|
discard """
|
||||||
mShlI, mShlI64,
|
mShlI,
|
||||||
mShrI, mShrI64, mAddF64, mSubF64, mMulF64, mDivF64, mMaxF64, mMinF64
|
mShrI, mAddF64, mSubF64, mMulF64, mDivF64, mMaxF64, mMinF64
|
||||||
"""
|
"""
|
||||||
|
|
||||||
proc evalIs(n, a: PNode): PNode =
|
proc evalIs(n, a: PNode): PNode =
|
||||||
|
|
@ -285,7 +285,7 @@ proc evalOp(m: TMagic, n, a, b, c: PNode): PNode =
|
||||||
of mUnaryMinusF64: result = newFloatNodeT(- getFloat(a), n)
|
of mUnaryMinusF64: result = newFloatNodeT(- getFloat(a), n)
|
||||||
of mNot: result = newIntNodeT(1 - getInt(a), n)
|
of mNot: result = newIntNodeT(1 - getInt(a), n)
|
||||||
of mCard: result = newIntNodeT(nimsets.cardSet(a), n)
|
of mCard: result = newIntNodeT(nimsets.cardSet(a), n)
|
||||||
of mBitnotI, mBitnotI64: result = newIntNodeT(not getInt(a), n)
|
of mBitnotI: result = newIntNodeT(not getInt(a), n)
|
||||||
of mLengthStr, mXLenStr:
|
of mLengthStr, mXLenStr:
|
||||||
if a.kind == nkNilLit: result = newIntNodeT(0, n)
|
if a.kind == nkNilLit: result = newIntNodeT(0, n)
|
||||||
else: result = newIntNodeT(len(getStr(a)), n)
|
else: result = newIntNodeT(len(getStr(a)), n)
|
||||||
|
|
@ -298,7 +298,7 @@ proc evalOp(m: TMagic, n, a, b, c: PNode): PNode =
|
||||||
result = newFloatNodeT(toFloat(int(getInt(a))), n)
|
result = newFloatNodeT(toFloat(int(getInt(a))), n)
|
||||||
of mToInt, mToBiggestInt: result = newIntNodeT(system.toInt(getFloat(a)), n)
|
of mToInt, mToBiggestInt: result = newIntNodeT(system.toInt(getFloat(a)), n)
|
||||||
of mAbsF64: result = newFloatNodeT(abs(getFloat(a)), n)
|
of mAbsF64: result = newFloatNodeT(abs(getFloat(a)), n)
|
||||||
of mAbsI, mAbsI64:
|
of mAbsI:
|
||||||
if getInt(a) >= 0: result = a
|
if getInt(a) >= 0: result = a
|
||||||
else: result = newIntNodeT(- getInt(a), n)
|
else: result = newIntNodeT(- getInt(a), n)
|
||||||
of mZe8ToI, mZe8ToI64, mZe16ToI, mZe16ToI64, mZe32ToI64, mZeIToI64:
|
of mZe8ToI, mZe8ToI64, mZe16ToI, mZe16ToI64, mZe32ToI64, mZeIToI64:
|
||||||
|
|
@ -310,16 +310,16 @@ proc evalOp(m: TMagic, n, a, b, c: PNode): PNode =
|
||||||
of mUnaryLt: result = newIntNodeT(getOrdValue(a) - 1, n)
|
of mUnaryLt: result = newIntNodeT(getOrdValue(a) - 1, n)
|
||||||
of mSucc: result = newIntNodeT(getOrdValue(a) + getInt(b), n)
|
of mSucc: result = newIntNodeT(getOrdValue(a) + getInt(b), n)
|
||||||
of mPred: result = newIntNodeT(getOrdValue(a) - getInt(b), n)
|
of mPred: result = newIntNodeT(getOrdValue(a) - getInt(b), n)
|
||||||
of mAddI, mAddI64: result = newIntNodeT(getInt(a) + getInt(b), n)
|
of mAddI: result = newIntNodeT(getInt(a) + getInt(b), n)
|
||||||
of mSubI, mSubI64: result = newIntNodeT(getInt(a) - getInt(b), n)
|
of mSubI: result = newIntNodeT(getInt(a) - getInt(b), n)
|
||||||
of mMulI, mMulI64: result = newIntNodeT(getInt(a) * getInt(b), n)
|
of mMulI: result = newIntNodeT(getInt(a) * getInt(b), n)
|
||||||
of mMinI:
|
of mMinI:
|
||||||
if getInt(a) > getInt(b): result = newIntNodeT(getInt(b), n)
|
if getInt(a) > getInt(b): result = newIntNodeT(getInt(b), n)
|
||||||
else: result = newIntNodeT(getInt(a), n)
|
else: result = newIntNodeT(getInt(a), n)
|
||||||
of mMaxI:
|
of mMaxI:
|
||||||
if getInt(a) > getInt(b): result = newIntNodeT(getInt(a), n)
|
if getInt(a) > getInt(b): result = newIntNodeT(getInt(a), n)
|
||||||
else: result = newIntNodeT(getInt(b), n)
|
else: result = newIntNodeT(getInt(b), n)
|
||||||
of mShlI, mShlI64:
|
of mShlI:
|
||||||
case skipTypes(n.typ, abstractRange).kind
|
case skipTypes(n.typ, abstractRange).kind
|
||||||
of tyInt8: result = newIntNodeT(int8(getInt(a)) shl int8(getInt(b)), n)
|
of tyInt8: result = newIntNodeT(int8(getInt(a)) shl int8(getInt(b)), n)
|
||||||
of tyInt16: result = newIntNodeT(int16(getInt(a)) shl int16(getInt(b)), n)
|
of tyInt16: result = newIntNodeT(int16(getInt(a)) shl int16(getInt(b)), n)
|
||||||
|
|
@ -327,7 +327,7 @@ proc evalOp(m: TMagic, n, a, b, c: PNode): PNode =
|
||||||
of tyInt64, tyInt, tyUInt..tyUInt64:
|
of tyInt64, tyInt, tyUInt..tyUInt64:
|
||||||
result = newIntNodeT(`shl`(getInt(a), getInt(b)), n)
|
result = newIntNodeT(`shl`(getInt(a), getInt(b)), n)
|
||||||
else: internalError(n.info, "constant folding for shl")
|
else: internalError(n.info, "constant folding for shl")
|
||||||
of mShrI, mShrI64:
|
of mShrI:
|
||||||
case skipTypes(n.typ, abstractRange).kind
|
case skipTypes(n.typ, abstractRange).kind
|
||||||
of tyInt8: result = newIntNodeT(int8(getInt(a)) shr int8(getInt(b)), n)
|
of tyInt8: result = newIntNodeT(int8(getInt(a)) shr int8(getInt(b)), n)
|
||||||
of tyInt16: result = newIntNodeT(int16(getInt(a)) shr int16(getInt(b)), n)
|
of tyInt16: result = newIntNodeT(int16(getInt(a)) shr int16(getInt(b)), n)
|
||||||
|
|
@ -335,11 +335,11 @@ proc evalOp(m: TMagic, n, a, b, c: PNode): PNode =
|
||||||
of tyInt64, tyInt, tyUInt..tyUInt64:
|
of tyInt64, tyInt, tyUInt..tyUInt64:
|
||||||
result = newIntNodeT(`shr`(getInt(a), getInt(b)), n)
|
result = newIntNodeT(`shr`(getInt(a), getInt(b)), n)
|
||||||
else: internalError(n.info, "constant folding for shr")
|
else: internalError(n.info, "constant folding for shr")
|
||||||
of mDivI, mDivI64:
|
of mDivI:
|
||||||
let y = getInt(b)
|
let y = getInt(b)
|
||||||
if y != 0:
|
if y != 0:
|
||||||
result = newIntNodeT(getInt(a) div y, n)
|
result = newIntNodeT(getInt(a) div y, n)
|
||||||
of mModI, mModI64:
|
of mModI:
|
||||||
let y = getInt(b)
|
let y = getInt(b)
|
||||||
if y != 0:
|
if y != 0:
|
||||||
result = newIntNodeT(getInt(a) mod y, n)
|
result = newIntNodeT(getInt(a) mod y, n)
|
||||||
|
|
@ -359,11 +359,11 @@ proc evalOp(m: TMagic, n, a, b, c: PNode): PNode =
|
||||||
if getFloat(a) > getFloat(b): result = newFloatNodeT(getFloat(b), n)
|
if getFloat(a) > getFloat(b): result = newFloatNodeT(getFloat(b), n)
|
||||||
else: result = newFloatNodeT(getFloat(a), n)
|
else: result = newFloatNodeT(getFloat(a), n)
|
||||||
of mIsNil: result = newIntNodeT(ord(a.kind == nkNilLit), n)
|
of mIsNil: result = newIntNodeT(ord(a.kind == nkNilLit), n)
|
||||||
of mLtI, mLtI64, mLtB, mLtEnum, mLtCh:
|
of mLtI, mLtB, mLtEnum, mLtCh:
|
||||||
result = newIntNodeT(ord(getOrdValue(a) < getOrdValue(b)), n)
|
result = newIntNodeT(ord(getOrdValue(a) < getOrdValue(b)), n)
|
||||||
of mLeI, mLeI64, mLeB, mLeEnum, mLeCh:
|
of mLeI, mLeB, mLeEnum, mLeCh:
|
||||||
result = newIntNodeT(ord(getOrdValue(a) <= getOrdValue(b)), n)
|
result = newIntNodeT(ord(getOrdValue(a) <= getOrdValue(b)), n)
|
||||||
of mEqI, mEqI64, mEqB, mEqEnum, mEqCh:
|
of mEqI, mEqB, mEqEnum, mEqCh:
|
||||||
result = newIntNodeT(ord(getOrdValue(a) == getOrdValue(b)), n)
|
result = newIntNodeT(ord(getOrdValue(a) == getOrdValue(b)), n)
|
||||||
of mLtF64: result = newIntNodeT(ord(getFloat(a) < getFloat(b)), n)
|
of mLtF64: result = newIntNodeT(ord(getFloat(a) < getFloat(b)), n)
|
||||||
of mLeF64: result = newIntNodeT(ord(getFloat(a) <= getFloat(b)), n)
|
of mLeF64: result = newIntNodeT(ord(getFloat(a) <= getFloat(b)), n)
|
||||||
|
|
@ -375,9 +375,9 @@ proc evalOp(m: TMagic, n, a, b, c: PNode): PNode =
|
||||||
result = newIntNodeT(ord(`<%`(getOrdValue(a), getOrdValue(b))), n)
|
result = newIntNodeT(ord(`<%`(getOrdValue(a), getOrdValue(b))), n)
|
||||||
of mLeU, mLeU64:
|
of mLeU, mLeU64:
|
||||||
result = newIntNodeT(ord(`<=%`(getOrdValue(a), getOrdValue(b))), n)
|
result = newIntNodeT(ord(`<=%`(getOrdValue(a), getOrdValue(b))), n)
|
||||||
of mBitandI, mBitandI64, mAnd: result = newIntNodeT(a.getInt and b.getInt, n)
|
of mBitandI, mAnd: result = newIntNodeT(a.getInt and b.getInt, n)
|
||||||
of mBitorI, mBitorI64, mOr: result = newIntNodeT(getInt(a) or getInt(b), n)
|
of mBitorI, mOr: result = newIntNodeT(getInt(a) or getInt(b), n)
|
||||||
of mBitxorI, mBitxorI64, mXor: result = newIntNodeT(a.getInt xor b.getInt, n)
|
of mBitxorI, mXor: result = newIntNodeT(a.getInt xor b.getInt, n)
|
||||||
of mAddU: result = newIntNodeT(`+%`(getInt(a), getInt(b)), n)
|
of mAddU: result = newIntNodeT(`+%`(getInt(a), getInt(b)), n)
|
||||||
of mSubU: result = newIntNodeT(`-%`(getInt(a), getInt(b)), n)
|
of mSubU: result = newIntNodeT(`-%`(getInt(a), getInt(b)), n)
|
||||||
of mMulU: result = newIntNodeT(`*%`(getInt(a), getInt(b)), n)
|
of mMulU: result = newIntNodeT(`*%`(getInt(a), getInt(b)), n)
|
||||||
|
|
|
||||||
|
|
@ -710,9 +710,9 @@ proc genMagic(c: PCtx; n: PNode; dest: var TDest; m: TMagic) =
|
||||||
if dest < 0: dest = c.getTemp(n.typ)
|
if dest < 0: dest = c.getTemp(n.typ)
|
||||||
c.gABI(n, opcSubImmInt, dest, tmp, 1)
|
c.gABI(n, opcSubImmInt, dest, tmp, 1)
|
||||||
c.freeTemp(tmp)
|
c.freeTemp(tmp)
|
||||||
of mPred, mSubI, mSubI64:
|
of mPred, mSubI:
|
||||||
c.genAddSubInt(n, dest, opcSubInt)
|
c.genAddSubInt(n, dest, opcSubInt)
|
||||||
of mSucc, mAddI, mAddI64:
|
of mSucc, mAddI:
|
||||||
c.genAddSubInt(n, dest, opcAddInt)
|
c.genAddSubInt(n, dest, opcAddInt)
|
||||||
of mInc, mDec:
|
of mInc, mDec:
|
||||||
unused(n, dest)
|
unused(n, dest)
|
||||||
|
|
@ -759,28 +759,28 @@ proc genMagic(c: PCtx; n: PNode; dest: var TDest; m: TMagic) =
|
||||||
c.freeTemp(d)
|
c.freeTemp(d)
|
||||||
c.freeTemp(tmp)
|
c.freeTemp(tmp)
|
||||||
of mCard: genCard(c, n, dest)
|
of mCard: genCard(c, n, dest)
|
||||||
of mMulI, mMulI64: genBinaryABCnarrow(c, n, dest, opcMulInt)
|
of mMulI: genBinaryABCnarrow(c, n, dest, opcMulInt)
|
||||||
of mDivI, mDivI64: genBinaryABCnarrow(c, n, dest, opcDivInt)
|
of mDivI: genBinaryABCnarrow(c, n, dest, opcDivInt)
|
||||||
of mModI, mModI64: genBinaryABCnarrow(c, n, dest, opcModInt)
|
of mModI: genBinaryABCnarrow(c, n, dest, opcModInt)
|
||||||
of mAddF64: genBinaryABC(c, n, dest, opcAddFloat)
|
of mAddF64: genBinaryABC(c, n, dest, opcAddFloat)
|
||||||
of mSubF64: genBinaryABC(c, n, dest, opcSubFloat)
|
of mSubF64: genBinaryABC(c, n, dest, opcSubFloat)
|
||||||
of mMulF64: genBinaryABC(c, n, dest, opcMulFloat)
|
of mMulF64: genBinaryABC(c, n, dest, opcMulFloat)
|
||||||
of mDivF64: genBinaryABC(c, n, dest, opcDivFloat)
|
of mDivF64: genBinaryABC(c, n, dest, opcDivFloat)
|
||||||
of mShrI, mShrI64: genBinaryABCnarrowU(c, n, dest, opcShrInt)
|
of mShrI: genBinaryABCnarrowU(c, n, dest, opcShrInt)
|
||||||
of mShlI, mShlI64: genBinaryABCnarrowU(c, n, dest, opcShlInt)
|
of mShlI: genBinaryABCnarrowU(c, n, dest, opcShlInt)
|
||||||
of mBitandI, mBitandI64: genBinaryABCnarrowU(c, n, dest, opcBitandInt)
|
of mBitandI: genBinaryABCnarrowU(c, n, dest, opcBitandInt)
|
||||||
of mBitorI, mBitorI64: genBinaryABCnarrowU(c, n, dest, opcBitorInt)
|
of mBitorI: genBinaryABCnarrowU(c, n, dest, opcBitorInt)
|
||||||
of mBitxorI, mBitxorI64: genBinaryABCnarrowU(c, n, dest, opcBitxorInt)
|
of mBitxorI: genBinaryABCnarrowU(c, n, dest, opcBitxorInt)
|
||||||
of mAddU: genBinaryABCnarrowU(c, n, dest, opcAddu)
|
of mAddU: genBinaryABCnarrowU(c, n, dest, opcAddu)
|
||||||
of mSubU: genBinaryABCnarrowU(c, n, dest, opcSubu)
|
of mSubU: genBinaryABCnarrowU(c, n, dest, opcSubu)
|
||||||
of mMulU: genBinaryABCnarrowU(c, n, dest, opcMulu)
|
of mMulU: genBinaryABCnarrowU(c, n, dest, opcMulu)
|
||||||
of mDivU: genBinaryABCnarrowU(c, n, dest, opcDivu)
|
of mDivU: genBinaryABCnarrowU(c, n, dest, opcDivu)
|
||||||
of mModU: genBinaryABCnarrowU(c, n, dest, opcModu)
|
of mModU: genBinaryABCnarrowU(c, n, dest, opcModu)
|
||||||
of mEqI, mEqI64, mEqB, mEqEnum, mEqCh:
|
of mEqI, mEqB, mEqEnum, mEqCh:
|
||||||
genBinaryABC(c, n, dest, opcEqInt)
|
genBinaryABC(c, n, dest, opcEqInt)
|
||||||
of mLeI, mLeI64, mLeEnum, mLeCh, mLeB:
|
of mLeI, mLeEnum, mLeCh, mLeB:
|
||||||
genBinaryABC(c, n, dest, opcLeInt)
|
genBinaryABC(c, n, dest, opcLeInt)
|
||||||
of mLtI, mLtI64, mLtEnum, mLtCh, mLtB:
|
of mLtI, mLtEnum, mLtCh, mLtB:
|
||||||
genBinaryABC(c, n, dest, opcLtInt)
|
genBinaryABC(c, n, dest, opcLtInt)
|
||||||
of mEqF64: genBinaryABC(c, n, dest, opcEqFloat)
|
of mEqF64: genBinaryABC(c, n, dest, opcEqFloat)
|
||||||
of mLeF64: genBinaryABC(c, n, dest, opcLeFloat)
|
of mLeF64: genBinaryABC(c, n, dest, opcLeFloat)
|
||||||
|
|
@ -796,7 +796,7 @@ proc genMagic(c: PCtx; n: PNode; dest: var TDest; m: TMagic) =
|
||||||
genNarrow(c, n, dest)
|
genNarrow(c, n, dest)
|
||||||
of mUnaryMinusF64: genUnaryABC(c, n, dest, opcUnaryMinusFloat)
|
of mUnaryMinusF64: genUnaryABC(c, n, dest, opcUnaryMinusFloat)
|
||||||
of mUnaryPlusI, mUnaryPlusF64: gen(c, n.sons[1], dest)
|
of mUnaryPlusI, mUnaryPlusF64: gen(c, n.sons[1], dest)
|
||||||
of mBitnotI, mBitnotI64:
|
of mBitnotI:
|
||||||
genUnaryABC(c, n, dest, opcBitnotInt)
|
genUnaryABC(c, n, dest, opcBitnotInt)
|
||||||
genNarrowU(c, n, dest)
|
genNarrowU(c, n, dest)
|
||||||
of mZe8ToI, mZe8ToI64, mZe16ToI, mZe16ToI64, mZe32ToI64, mZeIToI64,
|
of mZe8ToI, mZe8ToI64, mZe16ToI, mZe16ToI64, mZe32ToI64, mZeIToI64,
|
||||||
|
|
@ -1013,7 +1013,7 @@ proc genMagic(c: PCtx; n: PNode; dest: var TDest; m: TMagic) =
|
||||||
c.gABC(n, opcCallSite, dest)
|
c.gABC(n, opcCallSite, dest)
|
||||||
of mNGenSym: genBinaryABC(c, n, dest, opcGenSym)
|
of mNGenSym: genBinaryABC(c, n, dest, opcGenSym)
|
||||||
of mMinI, mMaxI, mAbsF64, mMinF64, mMaxF64, mAbsI,
|
of mMinI, mMaxI, mAbsF64, mMinF64, mMaxF64, mAbsI,
|
||||||
mAbsI64, mDotDot:
|
mDotDot:
|
||||||
c.genCall(n, dest)
|
c.genCall(n, dest)
|
||||||
of mExpandToAst:
|
of mExpandToAst:
|
||||||
if n.len != 2:
|
if n.len != 2:
|
||||||
|
|
|
||||||
|
|
@ -677,35 +677,35 @@ proc `not` *(x: int): int {.magic: "BitnotI", noSideEffect.}
|
||||||
proc `not` *(x: int8): int8 {.magic: "BitnotI", noSideEffect.}
|
proc `not` *(x: int8): int8 {.magic: "BitnotI", noSideEffect.}
|
||||||
proc `not` *(x: int16): int16 {.magic: "BitnotI", noSideEffect.}
|
proc `not` *(x: int16): int16 {.magic: "BitnotI", noSideEffect.}
|
||||||
proc `not` *(x: int32): int32 {.magic: "BitnotI", noSideEffect.}
|
proc `not` *(x: int32): int32 {.magic: "BitnotI", noSideEffect.}
|
||||||
proc `not` *(x: int64): int64 {.magic: "BitnotI64", noSideEffect.}
|
proc `not` *(x: int64): int64 {.magic: "BitnotI", noSideEffect.}
|
||||||
## computes the `bitwise complement` of the integer `x`.
|
## computes the `bitwise complement` of the integer `x`.
|
||||||
|
|
||||||
proc `+` *(x, y: int): int {.magic: "AddI", noSideEffect.}
|
proc `+` *(x, y: int): int {.magic: "AddI", noSideEffect.}
|
||||||
proc `+` *(x, y: int8): int8 {.magic: "AddI", noSideEffect.}
|
proc `+` *(x, y: int8): int8 {.magic: "AddI", noSideEffect.}
|
||||||
proc `+` *(x, y: int16): int16 {.magic: "AddI", noSideEffect.}
|
proc `+` *(x, y: int16): int16 {.magic: "AddI", noSideEffect.}
|
||||||
proc `+` *(x, y: int32): int32 {.magic: "AddI", noSideEffect.}
|
proc `+` *(x, y: int32): int32 {.magic: "AddI", noSideEffect.}
|
||||||
proc `+` *(x, y: int64): int64 {.magic: "AddI64", noSideEffect.}
|
proc `+` *(x, y: int64): int64 {.magic: "AddI", noSideEffect.}
|
||||||
## Binary `+` operator for an integer.
|
## Binary `+` operator for an integer.
|
||||||
|
|
||||||
proc `-` *(x, y: int): int {.magic: "SubI", noSideEffect.}
|
proc `-` *(x, y: int): int {.magic: "SubI", noSideEffect.}
|
||||||
proc `-` *(x, y: int8): int8 {.magic: "SubI", noSideEffect.}
|
proc `-` *(x, y: int8): int8 {.magic: "SubI", noSideEffect.}
|
||||||
proc `-` *(x, y: int16): int16 {.magic: "SubI", noSideEffect.}
|
proc `-` *(x, y: int16): int16 {.magic: "SubI", noSideEffect.}
|
||||||
proc `-` *(x, y: int32): int32 {.magic: "SubI", noSideEffect.}
|
proc `-` *(x, y: int32): int32 {.magic: "SubI", noSideEffect.}
|
||||||
proc `-` *(x, y: int64): int64 {.magic: "SubI64", noSideEffect.}
|
proc `-` *(x, y: int64): int64 {.magic: "SubI", noSideEffect.}
|
||||||
## Binary `-` operator for an integer.
|
## Binary `-` operator for an integer.
|
||||||
|
|
||||||
proc `*` *(x, y: int): int {.magic: "MulI", noSideEffect.}
|
proc `*` *(x, y: int): int {.magic: "MulI", noSideEffect.}
|
||||||
proc `*` *(x, y: int8): int8 {.magic: "MulI", noSideEffect.}
|
proc `*` *(x, y: int8): int8 {.magic: "MulI", noSideEffect.}
|
||||||
proc `*` *(x, y: int16): int16 {.magic: "MulI", noSideEffect.}
|
proc `*` *(x, y: int16): int16 {.magic: "MulI", noSideEffect.}
|
||||||
proc `*` *(x, y: int32): int32 {.magic: "MulI", noSideEffect.}
|
proc `*` *(x, y: int32): int32 {.magic: "MulI", noSideEffect.}
|
||||||
proc `*` *(x, y: int64): int64 {.magic: "MulI64", noSideEffect.}
|
proc `*` *(x, y: int64): int64 {.magic: "MulI", noSideEffect.}
|
||||||
## Binary `*` operator for an integer.
|
## Binary `*` operator for an integer.
|
||||||
|
|
||||||
proc `div` *(x, y: int): int {.magic: "DivI", noSideEffect.}
|
proc `div` *(x, y: int): int {.magic: "DivI", noSideEffect.}
|
||||||
proc `div` *(x, y: int8): int8 {.magic: "DivI", noSideEffect.}
|
proc `div` *(x, y: int8): int8 {.magic: "DivI", noSideEffect.}
|
||||||
proc `div` *(x, y: int16): int16 {.magic: "DivI", noSideEffect.}
|
proc `div` *(x, y: int16): int16 {.magic: "DivI", noSideEffect.}
|
||||||
proc `div` *(x, y: int32): int32 {.magic: "DivI", noSideEffect.}
|
proc `div` *(x, y: int32): int32 {.magic: "DivI", noSideEffect.}
|
||||||
proc `div` *(x, y: int64): int64 {.magic: "DivI64", noSideEffect.}
|
proc `div` *(x, y: int64): int64 {.magic: "DivI", noSideEffect.}
|
||||||
## computes the integer division. This is roughly the same as
|
## computes the integer division. This is roughly the same as
|
||||||
## ``floor(x/y)``.
|
## ``floor(x/y)``.
|
||||||
##
|
##
|
||||||
|
|
@ -718,7 +718,7 @@ proc `mod` *(x, y: int): int {.magic: "ModI", noSideEffect.}
|
||||||
proc `mod` *(x, y: int8): int8 {.magic: "ModI", noSideEffect.}
|
proc `mod` *(x, y: int8): int8 {.magic: "ModI", noSideEffect.}
|
||||||
proc `mod` *(x, y: int16): int16 {.magic: "ModI", noSideEffect.}
|
proc `mod` *(x, y: int16): int16 {.magic: "ModI", noSideEffect.}
|
||||||
proc `mod` *(x, y: int32): int32 {.magic: "ModI", noSideEffect.}
|
proc `mod` *(x, y: int32): int32 {.magic: "ModI", noSideEffect.}
|
||||||
proc `mod` *(x, y: int64): int64 {.magic: "ModI64", noSideEffect.}
|
proc `mod` *(x, y: int64): int64 {.magic: "ModI", noSideEffect.}
|
||||||
## computes the integer modulo operation. This is the same as
|
## computes the integer modulo operation. This is the same as
|
||||||
## ``x - (x div y) * y``.
|
## ``x - (x div y) * y``.
|
||||||
|
|
||||||
|
|
@ -726,7 +726,7 @@ proc `shr` *(x, y: int): int {.magic: "ShrI", noSideEffect.}
|
||||||
proc `shr` *(x, y: int8): int8 {.magic: "ShrI", noSideEffect.}
|
proc `shr` *(x, y: int8): int8 {.magic: "ShrI", noSideEffect.}
|
||||||
proc `shr` *(x, y: int16): int16 {.magic: "ShrI", noSideEffect.}
|
proc `shr` *(x, y: int16): int16 {.magic: "ShrI", noSideEffect.}
|
||||||
proc `shr` *(x, y: int32): int32 {.magic: "ShrI", noSideEffect.}
|
proc `shr` *(x, y: int32): int32 {.magic: "ShrI", noSideEffect.}
|
||||||
proc `shr` *(x, y: int64): int64 {.magic: "ShrI64", noSideEffect.}
|
proc `shr` *(x, y: int64): int64 {.magic: "ShrI", noSideEffect.}
|
||||||
## computes the `shift right` operation of `x` and `y`.
|
## computes the `shift right` operation of `x` and `y`.
|
||||||
##
|
##
|
||||||
## .. code-block:: Nim
|
## .. code-block:: Nim
|
||||||
|
|
@ -738,49 +738,49 @@ proc `shl` *(x, y: int): int {.magic: "ShlI", noSideEffect.}
|
||||||
proc `shl` *(x, y: int8): int8 {.magic: "ShlI", noSideEffect.}
|
proc `shl` *(x, y: int8): int8 {.magic: "ShlI", noSideEffect.}
|
||||||
proc `shl` *(x, y: int16): int16 {.magic: "ShlI", noSideEffect.}
|
proc `shl` *(x, y: int16): int16 {.magic: "ShlI", noSideEffect.}
|
||||||
proc `shl` *(x, y: int32): int32 {.magic: "ShlI", noSideEffect.}
|
proc `shl` *(x, y: int32): int32 {.magic: "ShlI", noSideEffect.}
|
||||||
proc `shl` *(x, y: int64): int64 {.magic: "ShlI64", noSideEffect.}
|
proc `shl` *(x, y: int64): int64 {.magic: "ShlI", noSideEffect.}
|
||||||
## computes the `shift left` operation of `x` and `y`.
|
## computes the `shift left` operation of `x` and `y`.
|
||||||
|
|
||||||
proc `and` *(x, y: int): int {.magic: "BitandI", noSideEffect.}
|
proc `and` *(x, y: int): int {.magic: "BitandI", noSideEffect.}
|
||||||
proc `and` *(x, y: int8): int8 {.magic: "BitandI", noSideEffect.}
|
proc `and` *(x, y: int8): int8 {.magic: "BitandI", noSideEffect.}
|
||||||
proc `and` *(x, y: int16): int16 {.magic: "BitandI", noSideEffect.}
|
proc `and` *(x, y: int16): int16 {.magic: "BitandI", noSideEffect.}
|
||||||
proc `and` *(x, y: int32): int32 {.magic: "BitandI", noSideEffect.}
|
proc `and` *(x, y: int32): int32 {.magic: "BitandI", noSideEffect.}
|
||||||
proc `and` *(x, y: int64): int64 {.magic: "BitandI64", noSideEffect.}
|
proc `and` *(x, y: int64): int64 {.magic: "BitandI", noSideEffect.}
|
||||||
## computes the `bitwise and` of numbers `x` and `y`.
|
## computes the `bitwise and` of numbers `x` and `y`.
|
||||||
|
|
||||||
proc `or` *(x, y: int): int {.magic: "BitorI", noSideEffect.}
|
proc `or` *(x, y: int): int {.magic: "BitorI", noSideEffect.}
|
||||||
proc `or` *(x, y: int8): int8 {.magic: "BitorI", noSideEffect.}
|
proc `or` *(x, y: int8): int8 {.magic: "BitorI", noSideEffect.}
|
||||||
proc `or` *(x, y: int16): int16 {.magic: "BitorI", noSideEffect.}
|
proc `or` *(x, y: int16): int16 {.magic: "BitorI", noSideEffect.}
|
||||||
proc `or` *(x, y: int32): int32 {.magic: "BitorI", noSideEffect.}
|
proc `or` *(x, y: int32): int32 {.magic: "BitorI", noSideEffect.}
|
||||||
proc `or` *(x, y: int64): int64 {.magic: "BitorI64", noSideEffect.}
|
proc `or` *(x, y: int64): int64 {.magic: "BitorI", noSideEffect.}
|
||||||
## computes the `bitwise or` of numbers `x` and `y`.
|
## computes the `bitwise or` of numbers `x` and `y`.
|
||||||
|
|
||||||
proc `xor` *(x, y: int): int {.magic: "BitxorI", noSideEffect.}
|
proc `xor` *(x, y: int): int {.magic: "BitxorI", noSideEffect.}
|
||||||
proc `xor` *(x, y: int8): int8 {.magic: "BitxorI", noSideEffect.}
|
proc `xor` *(x, y: int8): int8 {.magic: "BitxorI", noSideEffect.}
|
||||||
proc `xor` *(x, y: int16): int16 {.magic: "BitxorI", noSideEffect.}
|
proc `xor` *(x, y: int16): int16 {.magic: "BitxorI", noSideEffect.}
|
||||||
proc `xor` *(x, y: int32): int32 {.magic: "BitxorI", noSideEffect.}
|
proc `xor` *(x, y: int32): int32 {.magic: "BitxorI", noSideEffect.}
|
||||||
proc `xor` *(x, y: int64): int64 {.magic: "BitxorI64", noSideEffect.}
|
proc `xor` *(x, y: int64): int64 {.magic: "BitxorI", noSideEffect.}
|
||||||
## computes the `bitwise xor` of numbers `x` and `y`.
|
## computes the `bitwise xor` of numbers `x` and `y`.
|
||||||
|
|
||||||
proc `==` *(x, y: int): bool {.magic: "EqI", noSideEffect.}
|
proc `==` *(x, y: int): bool {.magic: "EqI", noSideEffect.}
|
||||||
proc `==` *(x, y: int8): bool {.magic: "EqI", noSideEffect.}
|
proc `==` *(x, y: int8): bool {.magic: "EqI", noSideEffect.}
|
||||||
proc `==` *(x, y: int16): bool {.magic: "EqI", noSideEffect.}
|
proc `==` *(x, y: int16): bool {.magic: "EqI", noSideEffect.}
|
||||||
proc `==` *(x, y: int32): bool {.magic: "EqI", noSideEffect.}
|
proc `==` *(x, y: int32): bool {.magic: "EqI", noSideEffect.}
|
||||||
proc `==` *(x, y: int64): bool {.magic: "EqI64", noSideEffect.}
|
proc `==` *(x, y: int64): bool {.magic: "EqI", noSideEffect.}
|
||||||
## Compares two integers for equality.
|
## Compares two integers for equality.
|
||||||
|
|
||||||
proc `<=` *(x, y: int): bool {.magic: "LeI", noSideEffect.}
|
proc `<=` *(x, y: int): bool {.magic: "LeI", noSideEffect.}
|
||||||
proc `<=` *(x, y: int8): bool {.magic: "LeI", noSideEffect.}
|
proc `<=` *(x, y: int8): bool {.magic: "LeI", noSideEffect.}
|
||||||
proc `<=` *(x, y: int16): bool {.magic: "LeI", noSideEffect.}
|
proc `<=` *(x, y: int16): bool {.magic: "LeI", noSideEffect.}
|
||||||
proc `<=` *(x, y: int32): bool {.magic: "LeI", noSideEffect.}
|
proc `<=` *(x, y: int32): bool {.magic: "LeI", noSideEffect.}
|
||||||
proc `<=` *(x, y: int64): bool {.magic: "LeI64", noSideEffect.}
|
proc `<=` *(x, y: int64): bool {.magic: "LeI", noSideEffect.}
|
||||||
## Returns true iff `x` is less than or equal to `y`.
|
## Returns true iff `x` is less than or equal to `y`.
|
||||||
|
|
||||||
proc `<` *(x, y: int): bool {.magic: "LtI", noSideEffect.}
|
proc `<` *(x, y: int): bool {.magic: "LtI", noSideEffect.}
|
||||||
proc `<` *(x, y: int8): bool {.magic: "LtI", noSideEffect.}
|
proc `<` *(x, y: int8): bool {.magic: "LtI", noSideEffect.}
|
||||||
proc `<` *(x, y: int16): bool {.magic: "LtI", noSideEffect.}
|
proc `<` *(x, y: int16): bool {.magic: "LtI", noSideEffect.}
|
||||||
proc `<` *(x, y: int32): bool {.magic: "LtI", noSideEffect.}
|
proc `<` *(x, y: int32): bool {.magic: "LtI", noSideEffect.}
|
||||||
proc `<` *(x, y: int64): bool {.magic: "LtI64", noSideEffect.}
|
proc `<` *(x, y: int64): bool {.magic: "LtI", noSideEffect.}
|
||||||
## Returns true iff `x` is less than `y`.
|
## Returns true iff `x` is less than `y`.
|
||||||
|
|
||||||
type
|
type
|
||||||
|
|
@ -2304,7 +2304,7 @@ proc abs*(x: int16): int16 {.magic: "AbsI", noSideEffect.} =
|
||||||
if x < 0: -x else: x
|
if x < 0: -x else: x
|
||||||
proc abs*(x: int32): int32 {.magic: "AbsI", noSideEffect.} =
|
proc abs*(x: int32): int32 {.magic: "AbsI", noSideEffect.} =
|
||||||
if x < 0: -x else: x
|
if x < 0: -x else: x
|
||||||
proc abs*(x: int64): int64 {.magic: "AbsI64", noSideEffect.} =
|
proc abs*(x: int64): int64 {.magic: "AbsI", noSideEffect.} =
|
||||||
## returns the absolute value of `x`. If `x` is ``low(x)`` (that
|
## returns the absolute value of `x`. If `x` is ``low(x)`` (that
|
||||||
## is -MININT for its type), an overflow exception is thrown (if overflow
|
## is -MININT for its type), an overflow exception is thrown (if overflow
|
||||||
## checking is turned on).
|
## checking is turned on).
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue