parseBiggestFloat is now builtin
This commit is contained in:
parent
396b5619fc
commit
a7911addf7
10 changed files with 309 additions and 95 deletions
|
|
@ -553,7 +553,7 @@ type
|
|||
mInRange, mInSet, mRepr, mExit, mSetLengthStr, mSetLengthSeq,
|
||||
mIsPartOf, mAstToStr, mParallel,
|
||||
mSwap, mIsNil, mArrToSeq, mCopyStr, mCopyStrLast,
|
||||
mNewString, mNewStringOfCap,
|
||||
mNewString, mNewStringOfCap, mParseBiggestFloat,
|
||||
mReset,
|
||||
mArray, mOpenArray, mRange, mSet, mSeq, mVarargs,
|
||||
mOrdinal,
|
||||
|
|
|
|||
|
|
@ -1640,7 +1640,8 @@ proc genMagicExpr(p: BProc, e: PNode, d: var TLoc, op: TMagic) =
|
|||
of mIncl, mExcl, mCard, mLtSet, mLeSet, mEqSet, mMulSet, mPlusSet, mMinusSet,
|
||||
mInSet:
|
||||
genSetOp(p, e, d, op)
|
||||
of mNewString, mNewStringOfCap, mCopyStr, mCopyStrLast, mExit:
|
||||
of mNewString, mNewStringOfCap, mCopyStr, mCopyStrLast, mExit,
|
||||
mParseBiggestFloat:
|
||||
var opr = e.sons[0].sym
|
||||
if lfNoDecl notin opr.loc.flags:
|
||||
discard cgsym(p.module, opr.loc.r.ropeToStr)
|
||||
|
|
|
|||
|
|
@ -50,6 +50,7 @@ proc initDefines*() =
|
|||
defineSymbol("nimunion")
|
||||
defineSymbol("nimnewshared")
|
||||
defineSymbol("nimrequiresnimframe")
|
||||
defineSymbol("nimparsebiggestfloatmagic")
|
||||
|
||||
# add platform specific symbols:
|
||||
case targetCPU
|
||||
|
|
|
|||
|
|
@ -16,7 +16,7 @@ import ast except getstr
|
|||
|
||||
import
|
||||
strutils, astalgo, msgs, vmdef, vmgen, nimsets, types, passes, unsigned,
|
||||
parser, vmdeps, idents, trees, renderer, options, transf
|
||||
parser, vmdeps, idents, trees, renderer, options, transf, parseutils
|
||||
|
||||
from semfold import leValueConv, ordinalValToString
|
||||
from evaltempl import evalTemplate
|
||||
|
|
@ -776,6 +776,18 @@ proc rawExecute(c: PCtx, start: int, tos: PStackFrame): TFullReg =
|
|||
createStr regs[ra]
|
||||
regs[ra].node.strVal = substr(regs[rb].node.strVal,
|
||||
regs[rc].intVal.int, regs[rd].intVal.int)
|
||||
of opcParseFloat:
|
||||
decodeBC(rkInt)
|
||||
inc pc
|
||||
assert c.code[pc].opcode == opcParseFloat
|
||||
let rd = c.code[pc].regA
|
||||
var rcAddr = addr(regs[rc])
|
||||
if rcAddr.kind == rkRegisterAddr: rcAddr = rcAddr.regAddr
|
||||
elif regs[rc].kind != rkFloat:
|
||||
myreset(regs[rc])
|
||||
regs[rc].kind = rkFloat
|
||||
regs[ra].intVal = parseBiggestFloat(regs[rb].node.strVal,
|
||||
rcAddr.floatVal, regs[rd].intVal.int)
|
||||
of opcRangeChck:
|
||||
let rb = instr.regB
|
||||
let rc = instr.regC
|
||||
|
|
|
|||
|
|
@ -66,7 +66,7 @@ type
|
|||
opcMulSet, opcPlusSet, opcMinusSet, opcSymdiffSet, opcConcatStr,
|
||||
opcContainsSet, opcRepr, opcSetLenStr, opcSetLenSeq,
|
||||
opcSwap, opcIsNil, opcOf, opcIs,
|
||||
opcSubStr, opcConv, opcCast, opcQuit, opcReset,
|
||||
opcSubStr, opcParseFloat, opcConv, opcCast, opcQuit, opcReset,
|
||||
opcNarrowS, opcNarrowU,
|
||||
|
||||
opcAddStrCh,
|
||||
|
|
|
|||
|
|
@ -852,6 +852,24 @@ proc genMagic(c: PCtx; n: PNode; dest: var TDest) =
|
|||
c.freeTemp(tmp1)
|
||||
c.freeTemp(tmp2)
|
||||
c.freeTemp(tmp3)
|
||||
of mParseBiggestFloat:
|
||||
if dest < 0: dest = c.getTemp(n.typ)
|
||||
var d2: TRegister
|
||||
# skip 'nkHiddenAddr':
|
||||
let d2AsNode = n.sons[2].sons[0]
|
||||
if needsAsgnPatch(d2AsNode):
|
||||
d2 = c.getTemp(getSysType(tyFloat))
|
||||
else:
|
||||
d2 = c.genx(d2AsNode)
|
||||
var
|
||||
tmp1 = c.genx(n.sons[1])
|
||||
tmp3 = c.genx(n.sons[3])
|
||||
c.gABC(n, opcParseFloat, dest, tmp1, d2)
|
||||
c.gABC(n, opcParseFloat, tmp3)
|
||||
c.freeTemp(tmp1)
|
||||
c.freeTemp(tmp3)
|
||||
c.genAsgnPatch(d2AsNode, d2)
|
||||
c.freeTemp(d2)
|
||||
of mReset:
|
||||
unused(n, dest)
|
||||
var d = c.genx(n.sons[1])
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue