Skip to content

Commit cfb909c

Browse files
authored
feat(stdlib)!: Replace Int64 arithmatic functions with operators (#1935)
1 parent 8a69dd3 commit cfb909c

File tree

4 files changed

+295
-171
lines changed

4 files changed

+295
-171
lines changed

compiler/test/stdlib/int64.test.gr

Lines changed: 29 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -5,59 +5,63 @@ from Int64 use *
55

66
// Suppress warnings about using `fromNumber` on constants, since that's what we want to test.
77
let fromNumber = fromNumber
8+
from Pervasives use { (==) }
89
assert fromNumber(5) == 5L
910
assert fromNumber(0) == 0L
1011

1112
assert toNumber(555L) == 555
1213
assert toNumber(0L) == 0
1314

15+
from Int64 use { (==) }
16+
1417
assert fromUint64(1uL) == 1L
1518
assert fromUint64(0xffffffffffffffffuL) == -1L
1619

1720
assert lnot(0xffffffffffffffffL) == 0L
1821
assert lnot(0L) == 0xffffffffffffffffL
1922
assert lnot(0xf0f0f0f0f0f0f0f0L) == 0x0f0f0f0f0f0f0f0fL
2023

21-
assert land(0b1010L, 0b10L) == 0b10L
22-
assert land(0b1010L, 0L) == 0L
24+
assert (0b1010L & 0b10L) == 0b10L
25+
assert (0b1010L & 0L) == 0L
2326

24-
assert lor(0b1010L, 0b0101L) == 0b1111L
25-
assert lor(0b1010L, 0L) == 0b1010L
27+
assert (0b1010L | 0b0101L) == 0b1111L
28+
assert (0b1010L | 0L) == 0b1010L
2629

27-
assert lxor(0b1010L, 0b1101L) == 0b0111L
28-
assert lxor(0b1010L, 0L) == 0b1010L
30+
assert (0b1010L ^ 0b1101L) == 0b0111L
31+
assert (0b1010L ^ 0L) == 0b1010L
2932

30-
assert shl(-1L, 1L) == -2L
31-
assert shl(-1L, 2L) == -4L
32-
assert shl(-1L, 3L) == -8L
33-
assert shl(-2L, 63L) == 0L
34-
assert shl(24L, 1L) == 48L
33+
assert -1L << 1L == -2L
34+
assert -1L << 2L == -4L
35+
assert -1L << 3L == -8L
36+
assert -2L << 63L == 0L
37+
assert 24L << 1L == 48L
3538

36-
assert shr(-1L, 63L) == -1L
37-
assert shr(-24L, 1L) == -12L
39+
assert -1L >> 63L == -1L
40+
assert -24L >> 1L == -12L
3841

39-
assert gt(5L, 4L)
40-
assert gte(5L, 5L)
41-
assert lt(5L, 17L)
42-
assert lte(5L, 5L)
43-
assert !gt(5L, 5L)
44-
assert !gte(5L, 22L)
45-
assert !lt(5L, -17L)
46-
assert !lte(5L, 4L)
42+
assert 5L > 4L
43+
assert 5L >= 5L
44+
assert 5L < 17L
45+
assert 5L <= 5L
46+
assert !(5L > 5L)
47+
assert !(5L >= 22L)
48+
assert !(5L < -17L)
49+
assert !(5L <= 4L)
4750

4851
assert clz(0b11L) == 62L
4952
assert ctz(0b11000L) == 3L
5053
assert popcnt(0b1100110011L) == 6L
5154
assert rotl(0b11L, 3L) == 0b11000L
5255
assert rotr(0b110000L, 3L) == 0b110L
5356

54-
assert eq(5L, 5L)
55-
assert !eq(5L, 55L)
56-
assert ne(5L, 55L)
57-
assert !ne(5L, 5L)
57+
assert 5L == 5L
58+
assert !(5L == 55L)
59+
assert 5L != 55L
60+
assert !(5L != 5L)
5861
assert eqz(0L)
5962
assert !eqz(-42L)
6063

64+
from Pervasives use { (==) }
6165
// Regression #1339
6266
let arr = [> 1, 2, 3]
6367
assert arr[toNumber(1L)] == 2

compiler/test/stdlib/sys.time.test.gr

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
module TimeTest
22

33
include "int64"
4-
from Int64 use { lt as (<), lte as (<=) }
4+
from Int64 use { (<), (<=) }
55
include "sys/time"
66

77
let mt1 = Time.monotonicTime()

stdlib/int64.gr

Lines changed: 57 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -10,23 +10,7 @@ module Int64
1010

1111
include "runtime/unsafe/wasmi32"
1212
include "runtime/unsafe/wasmi64"
13-
from WasmI64 use {
14-
(==),
15-
(!=),
16-
(&),
17-
(|),
18-
(^),
19-
(+),
20-
(-),
21-
(*),
22-
(/),
23-
(<<),
24-
(>>),
25-
(<),
26-
(<=),
27-
(>),
28-
(>=),
29-
}
13+
from WasmI64 use { (==), (!=), (&), (|), (^), (<<), (>>), (<), (<=), (>), (>=) }
3014
include "runtime/exception"
3115

3216
include "runtime/dataStructures"
@@ -65,6 +49,7 @@ provide let fromUint64 = (x: Uint64) => {
6549
*/
6650
@unsafe
6751
provide let incr = (value: Int64) => {
52+
from WasmI64 use { (+) }
6853
let value = WasmI32.fromGrain(value)
6954
let ptr = newInt64(WasmI64.load(value, 8n) + 1N)
7055
WasmI32.toGrain(ptr): Int64
@@ -80,6 +65,7 @@ provide let incr = (value: Int64) => {
8065
*/
8166
@unsafe
8267
provide let decr = (value: Int64) => {
68+
from WasmI64 use { (-) }
8369
let value = WasmI32.fromGrain(value)
8470
let ptr = newInt64(WasmI64.load(value, 8n) - 1N)
8571
WasmI32.toGrain(ptr): Int64
@@ -92,10 +78,12 @@ provide let decr = (value: Int64) => {
9278
* @param y: The second operand
9379
* @returns The sum of the two operands
9480
*
95-
* @since v0.2.0
81+
* @since v0.6.0
82+
* @history v0.2.0: Originally named `add`
9683
*/
9784
@unsafe
98-
provide let add = (x: Int64, y: Int64) => {
85+
provide let (+) = (x: Int64, y: Int64) => {
86+
from WasmI64 use { (+) }
9987
let xv = WasmI64.load(WasmI32.fromGrain(x), 8n)
10088
let yv = WasmI64.load(WasmI32.fromGrain(y), 8n)
10189
let ptr = newInt64(xv + yv)
@@ -109,10 +97,12 @@ provide let add = (x: Int64, y: Int64) => {
10997
* @param y: The second operand
11098
* @returns The difference of the two operands
11199
*
112-
* @since v0.2.0
100+
* @since v0.6.0
101+
* @history v0.2.0: Originally named `sub`
113102
*/
114103
@unsafe
115-
provide let sub = (x: Int64, y: Int64) => {
104+
provide let (-) = (x: Int64, y: Int64) => {
105+
from WasmI64 use { (-) }
116106
let xv = WasmI64.load(WasmI32.fromGrain(x), 8n)
117107
let yv = WasmI64.load(WasmI32.fromGrain(y), 8n)
118108
let ptr = newInt64(xv - yv)
@@ -126,10 +116,12 @@ provide let sub = (x: Int64, y: Int64) => {
126116
* @param y: The second operand
127117
* @returns The product of the two operands
128118
*
129-
* @since v0.2.0
119+
* @since v0.6.0
120+
* @history v0.2.0: Originally named `*`
130121
*/
131122
@unsafe
132-
provide let mul = (x: Int64, y: Int64) => {
123+
provide let (*) = (x: Int64, y: Int64) => {
124+
from WasmI64 use { (*) }
133125
let xv = WasmI64.load(WasmI32.fromGrain(x), 8n)
134126
let yv = WasmI64.load(WasmI32.fromGrain(y), 8n)
135127
let ptr = newInt64(xv * yv)
@@ -143,10 +135,12 @@ provide let mul = (x: Int64, y: Int64) => {
143135
* @param y: The second operand
144136
* @returns The quotient of its operands
145137
*
146-
* @since v0.2.0
138+
* @since v0.6.0
139+
* @history v0.2.0: Originally named `div`
147140
*/
148141
@unsafe
149-
provide let div = (x: Int64, y: Int64) => {
142+
provide let (/) = (x: Int64, y: Int64) => {
143+
from WasmI64 use { (/) }
150144
let xv = WasmI64.load(WasmI32.fromGrain(x), 8n)
151145
let yv = WasmI64.load(WasmI32.fromGrain(y), 8n)
152146
let ptr = newInt64(xv / yv)
@@ -172,6 +166,7 @@ provide let rem = (x: Int64, y: Int64) => {
172166

173167
@unsafe
174168
let abs = n => {
169+
from WasmI64 use { (-) }
175170
let mask = n >> 63N
176171
(n ^ mask) - mask
177172
}
@@ -186,10 +181,12 @@ let abs = n => {
186181
*
187182
* @throws ModuloByZero: When `y` is zero
188183
*
189-
* @since v0.2.0
184+
* @since v0.6.0
185+
* @history v0.2.0: Originally named `mod`
190186
*/
191187
@unsafe
192-
provide let mod = (x: Int64, y: Int64) => {
188+
provide let (%) = (x: Int64, y: Int64) => {
189+
from WasmI64 use { (-) }
193190
let xval = WasmI64.load(WasmI32.fromGrain(x), 8n)
194191
let yval = WasmI64.load(WasmI32.fromGrain(y), 8n)
195192

@@ -250,10 +247,11 @@ provide let rotr = (value: Int64, amount: Int64) => {
250247
* @param amount: The number of bits to shift by
251248
* @returns The shifted value
252249
*
253-
* @since v0.2.0
250+
* @since v0.6.0
251+
* @history v0.2.0: Originally named `shl`
254252
*/
255253
@unsafe
256-
provide let shl = (value: Int64, amount: Int64) => {
254+
provide let (<<) = (value: Int64, amount: Int64) => {
257255
let xv = WasmI64.load(WasmI32.fromGrain(value), 8n)
258256
let yv = WasmI64.load(WasmI32.fromGrain(amount), 8n)
259257
let ptr = newInt64(xv << yv)
@@ -267,10 +265,11 @@ provide let shl = (value: Int64, amount: Int64) => {
267265
* @param amount: The amount to shift by
268266
* @returns The shifted value
269267
*
270-
* @since v0.2.0
268+
* @since v0.6.0
269+
* @history v0.2.0: Originally named `shr`
271270
*/
272271
@unsafe
273-
provide let shr = (value: Int64, amount: Int64) => {
272+
provide let (>>) = (value: Int64, amount: Int64) => {
274273
let xv = WasmI64.load(WasmI32.fromGrain(value), 8n)
275274
let yv = WasmI64.load(WasmI32.fromGrain(amount), 8n)
276275
let ptr = newInt64(xv >> yv)
@@ -284,10 +283,11 @@ provide let shr = (value: Int64, amount: Int64) => {
284283
* @param y: The second value
285284
* @returns `true` if the first value is equal to the second value or `false` otherwise
286285
*
287-
* @since v0.4.0
286+
* @since v0.6.0
287+
* @history v0.4.0: Originally named `eq`
288288
*/
289289
@unsafe
290-
provide let eq = (x: Int64, y: Int64) => {
290+
provide let (==) = (x: Int64, y: Int64) => {
291291
let xv = WasmI64.load(WasmI32.fromGrain(x), 8n)
292292
let yv = WasmI64.load(WasmI32.fromGrain(y), 8n)
293293
xv == yv
@@ -300,10 +300,11 @@ provide let eq = (x: Int64, y: Int64) => {
300300
* @param y: The second value
301301
* @returns `true` if the first value is not equal to the second value or `false` otherwise
302302
*
303-
* @since v0.4.0
303+
* @since v0.6.0
304+
* @history v0.4.0: Originally named `ne`
304305
*/
305306
@unsafe
306-
provide let ne = (x: Int64, y: Int64) => {
307+
provide let (!=) = (x: Int64, y: Int64) => {
307308
let xv = WasmI64.load(WasmI32.fromGrain(x), 8n)
308309
let yv = WasmI64.load(WasmI32.fromGrain(y), 8n)
309310
xv != yv
@@ -330,10 +331,11 @@ provide let eqz = (value: Int64) => {
330331
* @param y: The second value
331332
* @returns `true` if the first value is less than the second value or `false` otherwise
332333
*
333-
* @since v0.2.0
334+
* @since v0.6.0
335+
* @history v0.2.0: Originally named `lt`
334336
*/
335337
@unsafe
336-
provide let lt = (x: Int64, y: Int64) => {
338+
provide let (<) = (x: Int64, y: Int64) => {
337339
let xv = WasmI64.load(WasmI32.fromGrain(x), 8n)
338340
let yv = WasmI64.load(WasmI32.fromGrain(y), 8n)
339341
xv < yv
@@ -346,10 +348,11 @@ provide let lt = (x: Int64, y: Int64) => {
346348
* @param y: The second value
347349
* @returns `true` if the first value is greater than the second value or `false` otherwise
348350
*
349-
* @since v0.2.0
351+
* @since v0.6.0
352+
* @history v0.2.0: Originally named `gt`
350353
*/
351354
@unsafe
352-
provide let gt = (x: Int64, y: Int64) => {
355+
provide let (>) = (x: Int64, y: Int64) => {
353356
let xv = WasmI64.load(WasmI32.fromGrain(x), 8n)
354357
let yv = WasmI64.load(WasmI32.fromGrain(y), 8n)
355358
xv > yv
@@ -362,10 +365,11 @@ provide let gt = (x: Int64, y: Int64) => {
362365
* @param y: The second value
363366
* @returns `true` if the first value is less than or equal to the second value or `false` otherwise
364367
*
365-
* @since v0.2.0
368+
* @since v0.6.0
369+
* @history v0.2.0: Originally named `lte`
366370
*/
367371
@unsafe
368-
provide let lte = (x: Int64, y: Int64) => {
372+
provide let (<=) = (x: Int64, y: Int64) => {
369373
let xv = WasmI64.load(WasmI32.fromGrain(x), 8n)
370374
let yv = WasmI64.load(WasmI32.fromGrain(y), 8n)
371375
xv <= yv
@@ -378,10 +382,11 @@ provide let lte = (x: Int64, y: Int64) => {
378382
* @param y: The second value
379383
* @returns `true` if the first value is greater than or equal to the second value or `false` otherwise
380384
*
381-
* @since v0.2.0
385+
* @since v0.6.0
386+
* @history v0.2.0: Originally named `gte`
382387
*/
383388
@unsafe
384-
provide let gte = (x: Int64, y: Int64) => {
389+
provide let (>=) = (x: Int64, y: Int64) => {
385390
let xv = WasmI64.load(WasmI32.fromGrain(x), 8n)
386391
let yv = WasmI64.load(WasmI32.fromGrain(y), 8n)
387392
xv >= yv
@@ -409,10 +414,11 @@ provide let lnot = (value: Int64) => {
409414
* @param y: The second operand
410415
* @returns Containing a `1` in each bit position for which the corresponding bits of both operands are `1`
411416
*
412-
* @since v0.2.0
417+
* @since v0.6.0
418+
* @history v0.2.0: Originally named `land`
413419
*/
414420
@unsafe
415-
provide let land = (x: Int64, y: Int64) => {
421+
provide let (&) = (x: Int64, y: Int64) => {
416422
let xv = WasmI64.load(WasmI32.fromGrain(x), 8n)
417423
let yv = WasmI64.load(WasmI32.fromGrain(y), 8n)
418424
let ptr = newInt64(xv & yv)
@@ -426,10 +432,11 @@ provide let land = (x: Int64, y: Int64) => {
426432
* @param y: The second operand
427433
* @returns Containing a `1` in each bit position for which the corresponding bits of either or both operands are `1`
428434
*
429-
* @since v0.2.0
435+
* @since v0.6.0
436+
* @history v0.2.0: Originally named `lor`
430437
*/
431438
@unsafe
432-
provide let lor = (x: Int64, y: Int64) => {
439+
provide let (|) = (x: Int64, y: Int64) => {
433440
let xv = WasmI64.load(WasmI32.fromGrain(x), 8n)
434441
let yv = WasmI64.load(WasmI32.fromGrain(y), 8n)
435442
let ptr = newInt64(xv | yv)
@@ -443,10 +450,11 @@ provide let lor = (x: Int64, y: Int64) => {
443450
* @param y: The second operand
444451
* @returns Containing a `1` in each bit position for which the corresponding bits of either but not both operands are `1`
445452
*
446-
* @since v0.2.0
453+
* @since v0.6.0
454+
* @history v0.2.0: Originally named `lxor`
447455
*/
448456
@unsafe
449-
provide let lxor = (x: Int64, y: Int64) => {
457+
provide let (^) = (x: Int64, y: Int64) => {
450458
let xv = WasmI64.load(WasmI32.fromGrain(x), 8n)
451459
let yv = WasmI64.load(WasmI32.fromGrain(y), 8n)
452460
let ptr = newInt64(xv ^ yv)

0 commit comments

Comments
 (0)