Skip to content

Commit d5a2959

Browse files
authored
refactor: Add isPowerOf2 helper for use in stdlib (#1348)
1 parent 52850bc commit d5a2959

14 files changed

+311
-319
lines changed

std/assembly/util/number.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,12 @@ f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff";
122122
0x9E19DB92B4E31BA9, 0xEB96BF6EBADF77D9, 0xAF87023B9BF0EE6B
123123
]);
124124

125+
// @ts-ignore: decorator
126+
@inline
127+
export function isPowerOf2<T extends number>(value: T): bool {
128+
return popcnt<T>(value) == 1;
129+
}
130+
125131
// Count number of decimals for u32 values
126132
// In our case input value always non-zero so we can simplify some parts
127133
export function decimalCount32(value: u32): u32 {
@@ -159,7 +165,7 @@ export function decimalCount64High(value: u64): u32 {
159165
}
160166

161167
function ulog_base(num: u64, base: i32): u32 {
162-
if ((base & (base - 1)) == 0) { // if base is pow of two
168+
if (isPowerOf2(base)) {
163169
return (63 - <u32>clz(num)) / (31 - <u32>clz(base)) + 1;
164170
}
165171
var b64 = u64(base), b = b64, e: u32 = 1;

tests/compiler/number.untouched.wat

Lines changed: 24 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -418,16 +418,15 @@
418418
end
419419
)
420420
(func $~lib/util/number/ulog_base (param $0 i64) (param $1 i32) (result i32)
421-
(local $2 i64)
421+
(local $2 i32)
422422
(local $3 i64)
423-
(local $4 i32)
423+
(local $4 i64)
424424
(local $5 i32)
425425
local.get $1
426-
local.get $1
426+
local.set $2
427+
local.get $2
428+
i32.popcnt
427429
i32.const 1
428-
i32.sub
429-
i32.and
430-
i32.const 0
431430
i32.eq
432431
if
433432
i32.const 63
@@ -446,52 +445,52 @@
446445
end
447446
local.get $1
448447
i64.extend_i32_s
449-
local.set $2
450-
local.get $2
451448
local.set $3
452-
i32.const 1
449+
local.get $3
453450
local.set $4
451+
i32.const 1
452+
local.set $5
454453
loop $while-continue|0
455454
local.get $0
456-
local.get $3
455+
local.get $4
457456
i64.ge_u
458-
local.set $5
459-
local.get $5
457+
local.set $2
458+
local.get $2
460459
if
461460
local.get $0
462-
local.get $3
461+
local.get $4
463462
i64.div_u
464463
local.set $0
465-
local.get $3
466-
local.get $3
467-
i64.mul
468-
local.set $3
469464
local.get $4
465+
local.get $4
466+
i64.mul
467+
local.set $4
468+
local.get $5
470469
i32.const 1
471470
i32.shl
472-
local.set $4
471+
local.set $5
473472
br $while-continue|0
474473
end
475474
end
476475
loop $while-continue|1
477476
local.get $0
478477
i64.const 1
479478
i64.ge_u
480-
local.set $5
481-
local.get $5
479+
local.set $2
480+
local.get $2
482481
if
483482
local.get $0
484-
local.get $2
483+
local.get $3
485484
i64.div_u
486485
local.set $0
487-
local.get $4
486+
local.get $5
488487
i32.const 1
489488
i32.add
490-
local.set $4
489+
local.set $5
491490
br $while-continue|1
492491
end
493492
end
494-
local.get $4
493+
local.get $5
495494
i32.const 1
496495
i32.sub
497496
)
@@ -613,7 +612,7 @@
613612
if
614613
i32.const 32
615614
i32.const 160
616-
i32.const 367
615+
i32.const 373
617616
i32.const 5
618617
call $~lib/builtins/abort
619618
unreachable

tests/compiler/resolve-access.untouched.wat

Lines changed: 25 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1909,16 +1909,15 @@
19091909
end
19101910
)
19111911
(func $~lib/util/number/ulog_base (param $0 i64) (param $1 i32) (result i32)
1912-
(local $2 i64)
1912+
(local $2 i32)
19131913
(local $3 i64)
1914-
(local $4 i32)
1914+
(local $4 i64)
19151915
(local $5 i32)
19161916
local.get $1
1917-
local.get $1
1917+
local.set $2
1918+
local.get $2
1919+
i32.popcnt
19181920
i32.const 1
1919-
i32.sub
1920-
i32.and
1921-
i32.const 0
19221921
i32.eq
19231922
if
19241923
i32.const 63
@@ -1937,52 +1936,52 @@
19371936
end
19381937
local.get $1
19391938
i64.extend_i32_s
1940-
local.set $2
1941-
local.get $2
19421939
local.set $3
1943-
i32.const 1
1940+
local.get $3
19441941
local.set $4
1942+
i32.const 1
1943+
local.set $5
19451944
loop $while-continue|0
19461945
local.get $0
1947-
local.get $3
1946+
local.get $4
19481947
i64.ge_u
1949-
local.set $5
1950-
local.get $5
1948+
local.set $2
1949+
local.get $2
19511950
if
19521951
local.get $0
1953-
local.get $3
1952+
local.get $4
19541953
i64.div_u
19551954
local.set $0
1956-
local.get $3
1957-
local.get $3
1958-
i64.mul
1959-
local.set $3
19601955
local.get $4
1956+
local.get $4
1957+
i64.mul
1958+
local.set $4
1959+
local.get $5
19611960
i32.const 1
19621961
i32.shl
1963-
local.set $4
1962+
local.set $5
19641963
br $while-continue|0
19651964
end
19661965
end
19671966
loop $while-continue|1
19681967
local.get $0
19691968
i64.const 1
19701969
i64.ge_u
1971-
local.set $5
1972-
local.get $5
1970+
local.set $2
1971+
local.get $2
19731972
if
19741973
local.get $0
1975-
local.get $2
1974+
local.get $3
19761975
i64.div_u
19771976
local.set $0
1978-
local.get $4
1977+
local.get $5
19791978
i32.const 1
19801979
i32.add
1981-
local.set $4
1980+
local.set $5
19821981
br $while-continue|1
19831982
end
19841983
end
1985-
local.get $4
1984+
local.get $5
19861985
i32.const 1
19871986
i32.sub
19881987
)
@@ -2102,7 +2101,7 @@
21022101
if
21032102
i32.const 176
21042103
i32.const 304
2105-
i32.const 395
2104+
i32.const 401
21062105
i32.const 5
21072106
call $~lib/builtins/abort
21082107
unreachable
@@ -2318,7 +2317,7 @@
23182317
if
23192318
i32.const 176
23202319
i32.const 304
2321-
i32.const 344
2320+
i32.const 350
23222321
i32.const 5
23232322
call $~lib/builtins/abort
23242323
unreachable

tests/compiler/resolve-binary.untouched.wat

Lines changed: 24 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -651,16 +651,15 @@
651651
end
652652
)
653653
(func $~lib/util/number/ulog_base (param $0 i64) (param $1 i32) (result i32)
654-
(local $2 i64)
654+
(local $2 i32)
655655
(local $3 i64)
656-
(local $4 i32)
656+
(local $4 i64)
657657
(local $5 i32)
658658
local.get $1
659-
local.get $1
659+
local.set $2
660+
local.get $2
661+
i32.popcnt
660662
i32.const 1
661-
i32.sub
662-
i32.and
663-
i32.const 0
664663
i32.eq
665664
if
666665
i32.const 63
@@ -679,52 +678,52 @@
679678
end
680679
local.get $1
681680
i64.extend_i32_s
682-
local.set $2
683-
local.get $2
684681
local.set $3
685-
i32.const 1
682+
local.get $3
686683
local.set $4
684+
i32.const 1
685+
local.set $5
687686
loop $while-continue|0
688687
local.get $0
689-
local.get $3
688+
local.get $4
690689
i64.ge_u
691-
local.set $5
692-
local.get $5
690+
local.set $2
691+
local.get $2
693692
if
694693
local.get $0
695-
local.get $3
694+
local.get $4
696695
i64.div_u
697696
local.set $0
698-
local.get $3
699-
local.get $3
700-
i64.mul
701-
local.set $3
702697
local.get $4
698+
local.get $4
699+
i64.mul
700+
local.set $4
701+
local.get $5
703702
i32.const 1
704703
i32.shl
705-
local.set $4
704+
local.set $5
706705
br $while-continue|0
707706
end
708707
end
709708
loop $while-continue|1
710709
local.get $0
711710
i64.const 1
712711
i64.ge_u
713-
local.set $5
714-
local.get $5
712+
local.set $2
713+
local.get $2
715714
if
716715
local.get $0
717-
local.get $2
716+
local.get $3
718717
i64.div_u
719718
local.set $0
720-
local.get $4
719+
local.get $5
721720
i32.const 1
722721
i32.add
723-
local.set $4
722+
local.set $5
724723
br $while-continue|1
725724
end
726725
end
727-
local.get $4
726+
local.get $5
728727
i32.const 1
729728
i32.sub
730729
)
@@ -843,7 +842,7 @@
843842
if
844843
i32.const 192
845844
i32.const 320
846-
i32.const 367
845+
i32.const 373
847846
i32.const 5
848847
call $~lib/builtins/abort
849848
unreachable

0 commit comments

Comments
 (0)