1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
|
discard """
matrix: "; --backend:js --jsbigint64:off; --backend:js --jsbigint64:on"
output: '''
0 0
0 0
Success'''
"""
# Test the different integer operations
import std/private/jsutils
var testNumber = 0
template test(opr, a, b, c: untyped): untyped =
# test the expression at compile and runtime
block:
const constExpr = opr(a, b)
when constExpr != c:
{.error: "Test failed " & $constExpr & " " & $c.}
inc(testNumber)
#Echo("Test: " & $testNumber)
var aa = a
var bb = b
var varExpr = opr(aa, bb)
assert(varExpr == c)
test(`+`, 12'i8, -13'i16, -1'i16)
test(`shl`, 0b11, 0b100, 0b110000)
whenJsNoBigInt64: discard
do:
test(`shl`, 0b11'i64, 0b100'i64, 0b110000'i64)
when not defined(js):
# mixed type shr needlessly complicates codegen with bigint
# and thus is not yet supported in JS for 64 bit ints
test(`shl`, 0b11'i32, 0b100'i64, 0b110000'i64)
test(`shl`, 0b11'i32, 0b100'i32, 0b110000'i32)
test(`or`, 0xf0f0'i16, 0x0d0d'i16, 0xfdfd'i16)
test(`and`, 0xf0f0'i16, 0xfdfd'i16, 0xf0f0'i16)
whenJsNoBigInt64: discard
do:
test(`shr`, 0xffffffffffffffff'i64, 0x4'i64, 0xffffffffffffffff'i64)
test(`shr`, 0xffff'i16, 0x4'i16, 0xffff'i16)
test(`shr`, 0xff'i8, 0x4'i8, 0xff'i8)
whenJsNoBigInt64: discard
do:
test(`shr`, 0xffffffff'i64, 0x4'i64, 0x0fffffff'i64)
test(`shr`, 0xffffffff'i32, 0x4'i32, 0xffffffff'i32)
whenJsNoBigInt64: discard
do:
test(`shl`, 0xffffffffffffffff'i64, 0x4'i64, 0xfffffffffffffff0'i64)
test(`shl`, 0xffff'i16, 0x4'i16, 0xfff0'i16)
test(`shl`, 0xff'i8, 0x4'i8, 0xf0'i8)
whenJsNoBigInt64: discard
do:
test(`shl`, 0xffffffff'i64, 0x4'i64, 0xffffffff0'i64)
test(`shl`, 0xffffffff'i32, 0x4'i32, 0xfffffff0'i32)
# bug #916
proc unc(a: float): float =
return a
echo int(unc(0.5)), " ", int(unc(-0.5))
echo int(0.5), " ", int(-0.5)
block: # Casts to uint
template testCast(fromValue: typed, toType: typed, expectedResult: typed) =
let src = fromValue
let dst = cast[toType](src)
if dst != expectedResult:
echo "Casting ", astToStr(fromValue), " to ", astToStr(toType), " = ", dst.int, " instead of ", astToStr(expectedResult)
doAssert(dst == expectedResult)
testCast(-1'i16, uint16, 0xffff'u16)
testCast(0xffff'u16, int16, -1'i16)
testCast(0xff'u16, uint8, 0xff'u8)
testCast(0xffff'u16, uint8, 0xff'u8)
testCast(-1'i16, uint32, 0xffffffff'u32)
testCast(0xffffffff'u32, int32, -1)
testCast(0xfffffffe'u32, int32, -2'i32)
testCast(0xffffff'u32, int16, -1'i32)
testCast(-5'i32, uint8, 251'u8)
# issue #7174
let c = 1'u
let val = c > 0
doAssert val
block: # bug #6752
when not defined(js) or (defined(js) and compileOption("jsbigint64")):
let x = 711127'i64
doAssert x * 86400'i64 == 61441372800'i64
block: # bug #17604
let a = 2147483648'u
doAssert (a and a) == a
doAssert (a or 0) == a
block: # bitwise not
let
z8 = 0'u8
z16 = 0'u16
z32 = 0'u32
z64 = 0'u64
doAssert (not z8) == uint8.high
doAssert (not z16) == uint16.high
doAssert (not z32) == uint32.high
when not defined(js) or (defined(js) and compileOption("jsbigint64")):
doAssert (not z64) == uint64.high
block: # shl
let i8 = int8.high
let i16 = int16.high
let i32 = int32.high
let i64 = int64.high
doAssert i8 shl 1 == -2
doAssert i8 shl 2 == -4
doAssert i16 shl 1 == -2
doAssert i16 shl 2 == -4
doAssert i32 shl 1 == -2
doAssert i32 shl 2 == -4
when not defined(js) or (defined(js) and compileOption("jsbigint64")):
doAssert i64 shl 1 == -2
doAssert i64 shl 2 == -4
let u8 = uint8.high
let u16 = uint16.high
let u32 = uint32.high
let u64 = uint64.high
doAssert u8 shl 1 == u8 - 1
doAssert u16 shl 1 == u16 - 1
doAssert u32 shl 1 == u32 - 1
when not defined(js) or (defined(js) and compileOption("jsbigint64")):
doAssert u64 shl 1 == u64 - 1
block: # bug #23378
var neg = -1 # prevent compile-time evaluation
let n = abs BiggestInt neg
doAssert n == 1
echo("Success") #OUT Success
|