diff options
author | Parashurama <Rhagdamaziel@ymail.com> | 2017-08-10 14:34:57 +0200 |
---|---|---|
committer | Andreas Rumpf <rumpf_a@web.de> | 2017-08-10 14:34:57 +0200 |
commit | 4fdf7f2ea3c1019635a21c96265372ef166ccce0 (patch) | |
tree | feaf8d3db798f0a30795214ceb4f122cbe69b885 | |
parent | 11082180b703f1aec6915c0635b144e5c692d2f0 (diff) | |
download | Nim-4fdf7f2ea3c1019635a21c96265372ef166ccce0.tar.gz |
fix VM intsize for 32bits and smaller targetOS. (#6211)
This commit change the default behaviour of VM int/uint always being 64bits and make int/uint on VM behave identically to compiled code. This insert 'opcNarrowU' or 'opcNarrow' opcode on Int/Uint operations when needed to simulate smaller Int/Uint on VM.
-rw-r--r-- | compiler/vmgen.nim | 7 |
1 files changed, 4 insertions, 3 deletions
diff --git a/compiler/vmgen.nim b/compiler/vmgen.nim index ab969a42f..dbb8c9dcd 100644 --- a/compiler/vmgen.nim +++ b/compiler/vmgen.nim @@ -656,16 +656,17 @@ proc genNarrow(c: PCtx; n: PNode; dest: TDest) = let t = skipTypes(n.typ, abstractVar-{tyTypeDesc}) # uint is uint64 in the VM, we we only need to mask the result for # other unsigned types: - if t.kind in {tyUInt8..tyUInt32}: + if t.kind in {tyUInt8..tyUInt32} or (t.kind == tyUInt and t.size < 8): c.gABC(n, opcNarrowU, dest, TRegister(t.size*8)) - elif t.kind in {tyInt8..tyInt32}: + elif t.kind in {tyInt8..tyInt32} or (t.kind == tyInt and t.size < 8): c.gABC(n, opcNarrowS, dest, TRegister(t.size*8)) proc genNarrowU(c: PCtx; n: PNode; dest: TDest) = let t = skipTypes(n.typ, abstractVar-{tyTypeDesc}) # uint is uint64 in the VM, we we only need to mask the result for # other unsigned types: - if t.kind in {tyUInt8..tyUInt32, tyInt8..tyInt32}: + if t.kind in {tyUInt8..tyUInt32, tyInt8..tyInt32} or + (t.kind in {tyUInt, tyInt} and t.size < 8): c.gABC(n, opcNarrowU, dest, TRegister(t.size*8)) proc genBinaryABCnarrow(c: PCtx; n: PNode; dest: var TDest; opc: TOpcode) = |