Merge pull request #3654 from jangko/vm_uinttouint64conv

fixed #2514 unable to echo uint8-32 at compile time
This commit is contained in:
Andreas Rumpf
2015-12-21 00:37:48 +01:00
2 changed files with 85 additions and 1 deletions

View File

@@ -359,7 +359,14 @@ proc opConv*(dest: var TFullReg, src: TFullReg, desttyp, srctyp: PType): bool =
of tyFloat..tyFloat64:
dest.intVal = int(src.floatVal)
else:
dest.intVal = src.intVal and ((1 shl (desttyp.size*8))-1)
let srcDist = (sizeof(src.intVal) - srctyp.size) * 8
let destDist = (sizeof(dest.intVal) - desttyp.size) * 8
when system.cpuEndian == bigEndian:
dest.intVal = (src.intVal shr srcDist) shl srcDist
dest.intVal = (dest.intVal shr destDist) shl destDist
else:
dest.intVal = (src.intVal shl srcDist) shr srcDist
dest.intVal = (dest.intVal shl destDist) shr destDist
of tyFloat..tyFloat64:
if dest.kind != rkFloat:
myreset(dest); dest.kind = rkFloat

77
tests/vm/ttouintconv.nim Normal file
View File

@@ -0,0 +1,77 @@
import macros
discard """
msg: '''
8 9 17
239 255
61439 65534 65535
4026531839 4294967294
17293822569102704639
18446744073709551614
18446744073709551615
127
32767
2147483647
9223372036854775807
0
128
4294967287'''
"""
#bug #2514
macro foo(): stmt =
var x = 8'u8
var y = 9'u16
var z = 17'u32
echo x," ", y," ", z
var a = 0xEF'u8
var aa = 0xFF'u8
echo a, " ", aa
var b = 0xEFFF'u16
var bb = 0xFFFE'u16
var bbb = 0xFFFF'u16
echo b, " ", bb, " ", bbb
var c = 0xEFFFFFFF'u32
var cc = 0xFFFFFFFE'u32
echo c, " ", cc
var d = 0xEFFFFFFFFFFFFFFF'u64
echo d
var f = 0xFFFFFFFFFFFFFFFE'u64
echo f
var g = 0xFFFFFFFFFFFFFFFF'u64
echo g
var xx = 0x7F'u8 and 0xFF
echo xx
var yy = 0x7FFF'u16
echo yy
var zz = 0x7FFFFFFF'u32
echo zz
macro foo2(): stmt =
var xx = 0x7FFFFFFFFFFFFFFF
echo xx
var yy = 0
echo yy
var zz = 0x80'u8
echo zz
var ww = -9
var vv = ww.uint
var kk = vv.uint32
echo kk
foo()
foo2()