diff options
author | Araq <rumpf_a@web.de> | 2014-07-08 20:12:07 +0200 |
---|---|---|
committer | Araq <rumpf_a@web.de> | 2014-07-08 20:12:07 +0200 |
commit | d80d8aa74d4e7471c262d95aedbe0971a1b2672a (patch) | |
tree | 5b4477c47e9c028265c6f1427241b4bd365b868a /compiler/vmgen.nim | |
parent | 39ce17a73e1e9f9e0eea0fa885a7969c96f1a3b4 (diff) | |
download | Nim-d80d8aa74d4e7471c262d95aedbe0971a1b2672a.tar.gz |
fixes #1323
Diffstat (limited to 'compiler/vmgen.nim')
-rw-r--r-- | compiler/vmgen.nim | 9 |
1 files changed, 6 insertions, 3 deletions
diff --git a/compiler/vmgen.nim b/compiler/vmgen.nim index b04e60549..c1ec637dd 100644 --- a/compiler/vmgen.nim +++ b/compiler/vmgen.nim @@ -1244,12 +1244,15 @@ proc genRdVar(c: PCtx; n: PNode; dest: var TDest; flags: TGenFlags) = # see tests/t99bott for an example that triggers it: cannotEval(n) +template needsRegLoad(): expr = + gfAddrOf notin flags and fitsRegister(n.typ.skipTypes({tyVar})) + proc genArrAccess2(c: PCtx; n: PNode; dest: var TDest; opc: TOpcode; flags: TGenFlags) = let a = c.genx(n.sons[0], flags) let b = c.genIndex(n.sons[1], n.sons[0].typ) if dest < 0: dest = c.getTemp(n.typ) - if gfAddrOf notin flags and fitsRegister(n.typ): + if needsRegLoad(): var cc = c.getTemp(n.typ) c.gABC(n, opc, cc, a, b) c.gABC(n, opcNodeToReg, dest, cc) @@ -1265,7 +1268,7 @@ proc genObjAccess(c: PCtx; n: PNode; dest: var TDest; flags: TGenFlags) = let a = c.genx(n.sons[0], flags) let b = genField(n.sons[1]) if dest < 0: dest = c.getTemp(n.typ) - if gfAddrOf notin flags and fitsRegister(n.typ.skipTypes({tyVar})): + if needsRegLoad(): var cc = c.getTemp(n.typ) c.gABC(n, opcLdObj, cc, a, b) c.gABC(n, opcNodeToReg, dest, cc) @@ -1700,7 +1703,7 @@ proc genProc(c: PCtx; s: PSym): int = c.gABC(body, opcEof, eofInstr.regA) c.optimizeJumps(result) s.offset = c.prc.maxSlots - #if s.name.s == "get_data": + #if s.name.s == "calc": # echo renderTree(body) # c.echoCode(result) c.prc = oldPrc |