Skip to content

feat(std): add isPowerOf2 helper #1348

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Jun 20, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 7 additions & 1 deletion std/assembly/util/number.ts
Original file line number Diff line number Diff line change
Expand Up @@ -122,6 +122,12 @@ f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff";
0x9E19DB92B4E31BA9, 0xEB96BF6EBADF77D9, 0xAF87023B9BF0EE6B
]);

// @ts-ignore: decorator
@inline
export function isPowerOf2<T extends number>(value: T): bool {
return popcnt<T>(value) == 1;
}

// Count number of decimals for u32 values
// In our case input value always non-zero so we can simplify some parts
export function decimalCount32(value: u32): u32 {
Expand Down Expand Up @@ -159,7 +165,7 @@ export function decimalCount64High(value: u64): u32 {
}

function ulog_base(num: u64, base: i32): u32 {
if ((base & (base - 1)) == 0) { // if base is pow of two
if (isPowerOf2(base)) {
return (63 - <u32>clz(num)) / (31 - <u32>clz(base)) + 1;
}
var b64 = u64(base), b = b64, e: u32 = 1;
Expand Down
49 changes: 24 additions & 25 deletions tests/compiler/number.untouched.wat
Original file line number Diff line number Diff line change
Expand Up @@ -418,16 +418,15 @@
end
)
(func $~lib/util/number/ulog_base (param $0 i64) (param $1 i32) (result i32)
(local $2 i64)
(local $2 i32)
(local $3 i64)
(local $4 i32)
(local $4 i64)
(local $5 i32)
local.get $1
local.get $1
local.set $2
local.get $2
i32.popcnt
i32.const 1
i32.sub
i32.and
i32.const 0
i32.eq
if
i32.const 63
Expand All @@ -446,52 +445,52 @@
end
local.get $1
i64.extend_i32_s
local.set $2
local.get $2
local.set $3
i32.const 1
local.get $3
local.set $4
i32.const 1
local.set $5
loop $while-continue|0
local.get $0
local.get $3
local.get $4
i64.ge_u
local.set $5
local.get $5
local.set $2
local.get $2
if
local.get $0
local.get $3
local.get $4
i64.div_u
local.set $0
local.get $3
local.get $3
i64.mul
local.set $3
local.get $4
local.get $4
i64.mul
local.set $4
local.get $5
i32.const 1
i32.shl
local.set $4
local.set $5
br $while-continue|0
end
end
loop $while-continue|1
local.get $0
i64.const 1
i64.ge_u
local.set $5
local.get $5
local.set $2
local.get $2
if
local.get $0
local.get $2
local.get $3
i64.div_u
local.set $0
local.get $4
local.get $5
i32.const 1
i32.add
local.set $4
local.set $5
br $while-continue|1
end
end
local.get $4
local.get $5
i32.const 1
i32.sub
)
Expand Down Expand Up @@ -613,7 +612,7 @@
if
i32.const 32
i32.const 160
i32.const 367
i32.const 373
i32.const 5
call $~lib/builtins/abort
unreachable
Expand Down
51 changes: 25 additions & 26 deletions tests/compiler/resolve-access.untouched.wat
Original file line number Diff line number Diff line change
Expand Up @@ -1909,16 +1909,15 @@
end
)
(func $~lib/util/number/ulog_base (param $0 i64) (param $1 i32) (result i32)
(local $2 i64)
(local $2 i32)
(local $3 i64)
(local $4 i32)
(local $4 i64)
(local $5 i32)
local.get $1
local.get $1
local.set $2
local.get $2
i32.popcnt
i32.const 1
i32.sub
i32.and
i32.const 0
i32.eq
if
i32.const 63
Expand All @@ -1937,52 +1936,52 @@
end
local.get $1
i64.extend_i32_s
local.set $2
local.get $2
local.set $3
i32.const 1
local.get $3
local.set $4
i32.const 1
local.set $5
loop $while-continue|0
local.get $0
local.get $3
local.get $4
i64.ge_u
local.set $5
local.get $5
local.set $2
local.get $2
if
local.get $0
local.get $3
local.get $4
i64.div_u
local.set $0
local.get $3
local.get $3
i64.mul
local.set $3
local.get $4
local.get $4
i64.mul
local.set $4
local.get $5
i32.const 1
i32.shl
local.set $4
local.set $5
br $while-continue|0
end
end
loop $while-continue|1
local.get $0
i64.const 1
i64.ge_u
local.set $5
local.get $5
local.set $2
local.get $2
if
local.get $0
local.get $2
local.get $3
i64.div_u
local.set $0
local.get $4
local.get $5
i32.const 1
i32.add
local.set $4
local.set $5
br $while-continue|1
end
end
local.get $4
local.get $5
i32.const 1
i32.sub
)
Expand Down Expand Up @@ -2102,7 +2101,7 @@
if
i32.const 176
i32.const 304
i32.const 395
i32.const 401
i32.const 5
call $~lib/builtins/abort
unreachable
Expand Down Expand Up @@ -2318,7 +2317,7 @@
if
i32.const 176
i32.const 304
i32.const 344
i32.const 350
i32.const 5
call $~lib/builtins/abort
unreachable
Expand Down
49 changes: 24 additions & 25 deletions tests/compiler/resolve-binary.untouched.wat
Original file line number Diff line number Diff line change
Expand Up @@ -651,16 +651,15 @@
end
)
(func $~lib/util/number/ulog_base (param $0 i64) (param $1 i32) (result i32)
(local $2 i64)
(local $2 i32)
(local $3 i64)
(local $4 i32)
(local $4 i64)
(local $5 i32)
local.get $1
local.get $1
local.set $2
local.get $2
i32.popcnt
i32.const 1
i32.sub
i32.and
i32.const 0
i32.eq
if
i32.const 63
Expand All @@ -679,52 +678,52 @@
end
local.get $1
i64.extend_i32_s
local.set $2
local.get $2
local.set $3
i32.const 1
local.get $3
local.set $4
i32.const 1
local.set $5
loop $while-continue|0
local.get $0
local.get $3
local.get $4
i64.ge_u
local.set $5
local.get $5
local.set $2
local.get $2
if
local.get $0
local.get $3
local.get $4
i64.div_u
local.set $0
local.get $3
local.get $3
i64.mul
local.set $3
local.get $4
local.get $4
i64.mul
local.set $4
local.get $5
i32.const 1
i32.shl
local.set $4
local.set $5
br $while-continue|0
end
end
loop $while-continue|1
local.get $0
i64.const 1
i64.ge_u
local.set $5
local.get $5
local.set $2
local.get $2
if
local.get $0
local.get $2
local.get $3
i64.div_u
local.set $0
local.get $4
local.get $5
i32.const 1
i32.add
local.set $4
local.set $5
br $while-continue|1
end
end
local.get $4
local.get $5
i32.const 1
i32.sub
)
Expand Down Expand Up @@ -843,7 +842,7 @@
if
i32.const 192
i32.const 320
i32.const 367
i32.const 373
i32.const 5
call $~lib/builtins/abort
unreachable
Expand Down
Loading