Skip to content

Commit ba28ea0

Browse files
authored
Optimize for powers of two in ipow32/64 (#1610)
1 parent 0e12d7a commit ba28ea0

8 files changed

+212
-66
lines changed

std/assembly/math.ts

+6
Original file line numberDiff line numberDiff line change
@@ -3080,6 +3080,9 @@ export namespace NativeMathf {
30803080
export function ipow32(x: i32, e: i32): i32 {
30813081
var out = 1;
30823082
if (ASC_SHRINK_LEVEL < 1) {
3083+
if (x == 2) {
3084+
return select<i32>(1 << e, 0, <u32>e < 32);
3085+
}
30833086
if (e <= 0) {
30843087
if (x == -1) return select<i32>(-1, 1, e & 1);
30853088
return i32(e == 0) | i32(x == 1);
@@ -3129,6 +3132,9 @@ export function ipow32(x: i32, e: i32): i32 {
31293132
export function ipow64(x: i64, e: i64): i64 {
31303133
var out: i64 = 1;
31313134
if (ASC_SHRINK_LEVEL < 1) {
3135+
if (x == 2) {
3136+
return select<i64>(1 << e, 0, <u64>e < 64);
3137+
}
31323138
if (e <= 0) {
31333139
if (x == -1) return select<i64>(-1, 1, e & 1);
31343140
return i64(e == 0) | i64(x == 1);

tests/compiler/binary.untouched.wat

+14
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,20 @@
3131
i32.const 1
3232
i32.lt_s
3333
drop
34+
local.get $0
35+
i32.const 2
36+
i32.eq
37+
if
38+
i32.const 1
39+
local.get $1
40+
i32.shl
41+
i32.const 0
42+
local.get $1
43+
i32.const 32
44+
i32.lt_u
45+
select
46+
return
47+
end
3448
local.get $1
3549
i32.const 0
3650
i32.le_s

tests/compiler/resolve-binary.untouched.wat

+14
Original file line numberDiff line numberDiff line change
@@ -6429,6 +6429,20 @@
64296429
i32.const 1
64306430
i32.lt_s
64316431
drop
6432+
local.get $0
6433+
i32.const 2
6434+
i32.eq
6435+
if
6436+
i32.const 1
6437+
local.get $1
6438+
i32.shl
6439+
i32.const 0
6440+
local.get $1
6441+
i32.const 32
6442+
i32.lt_u
6443+
select
6444+
return
6445+
end
64326446
local.get $1
64336447
i32.const 0
64346448
i32.le_s

tests/compiler/std/math.optimized.wat

+59-33
Original file line numberDiff line numberDiff line change
@@ -49372,6 +49372,32 @@
4937249372
call $~lib/builtins/abort
4937349373
unreachable
4937449374
end
49375+
i64.const 2
49376+
i64.const 64
49377+
call $~lib/math/ipow64
49378+
i64.eqz
49379+
i32.eqz
49380+
if
49381+
i32.const 0
49382+
i32.const 1056
49383+
i32.const 4077
49384+
i32.const 1
49385+
call $~lib/builtins/abort
49386+
unreachable
49387+
end
49388+
i64.const 2
49389+
i64.const 128
49390+
call $~lib/math/ipow64
49391+
i64.eqz
49392+
i32.eqz
49393+
if
49394+
i32.const 0
49395+
i32.const 1056
49396+
i32.const 4078
49397+
i32.const 1
49398+
call $~lib/builtins/abort
49399+
unreachable
49400+
end
4937549401
i32.const 1
4937649402
i32.const 3
4937749403
call $~lib/math/ipow32
@@ -49380,7 +49406,7 @@
4938049406
if
4938149407
i32.const 0
4938249408
i32.const 1056
49383-
i32.const 4082
49409+
i32.const 4084
4938449410
i32.const 1
4938549411
call $~lib/builtins/abort
4938649412
unreachable
@@ -49393,7 +49419,7 @@
4939349419
if
4939449420
i32.const 0
4939549421
i32.const 1056
49396-
i32.const 4083
49422+
i32.const 4085
4939749423
i32.const 1
4939849424
call $~lib/builtins/abort
4939949425
unreachable
@@ -49406,7 +49432,7 @@
4940649432
if
4940749433
i32.const 0
4940849434
i32.const 1056
49409-
i32.const 4084
49435+
i32.const 4086
4941049436
i32.const 1
4941149437
call $~lib/builtins/abort
4941249438
unreachable
@@ -49419,7 +49445,7 @@
4941949445
if
4942049446
i32.const 0
4942149447
i32.const 1056
49422-
i32.const 4085
49448+
i32.const 4087
4942349449
i32.const 1
4942449450
call $~lib/builtins/abort
4942549451
unreachable
@@ -49432,7 +49458,7 @@
4943249458
if
4943349459
i32.const 0
4943449460
i32.const 1056
49435-
i32.const 4086
49461+
i32.const 4088
4943649462
i32.const 1
4943749463
call $~lib/builtins/abort
4943849464
unreachable
@@ -49445,7 +49471,7 @@
4944549471
if
4944649472
i32.const 0
4944749473
i32.const 1056
49448-
i32.const 4087
49474+
i32.const 4089
4944949475
i32.const 1
4945049476
call $~lib/builtins/abort
4945149477
unreachable
@@ -49456,7 +49482,7 @@
4945649482
if
4945749483
i32.const 0
4945849484
i32.const 1056
49459-
i32.const 4089
49485+
i32.const 4091
4946049486
i32.const 1
4946149487
call $~lib/builtins/abort
4946249488
unreachable
@@ -49467,7 +49493,7 @@
4946749493
if
4946849494
i32.const 0
4946949495
i32.const 1056
49470-
i32.const 4090
49496+
i32.const 4092
4947149497
i32.const 1
4947249498
call $~lib/builtins/abort
4947349499
unreachable
@@ -49478,7 +49504,7 @@
4947849504
if
4947949505
i32.const 0
4948049506
i32.const 1056
49481-
i32.const 4093
49507+
i32.const 4095
4948249508
i32.const 1
4948349509
call $~lib/builtins/abort
4948449510
unreachable
@@ -49491,7 +49517,7 @@
4949149517
if
4949249518
i32.const 0
4949349519
i32.const 1056
49494-
i32.const 4095
49520+
i32.const 4097
4949549521
i32.const 1
4949649522
call $~lib/builtins/abort
4949749523
unreachable
@@ -49504,7 +49530,7 @@
4950449530
if
4950549531
i32.const 0
4950649532
i32.const 1056
49507-
i32.const 4096
49533+
i32.const 4098
4950849534
i32.const 1
4950949535
call $~lib/builtins/abort
4951049536
unreachable
@@ -49517,7 +49543,7 @@
4951749543
if
4951849544
i32.const 0
4951949545
i32.const 1056
49520-
i32.const 4099
49546+
i32.const 4101
4952149547
i32.const 1
4952249548
call $~lib/builtins/abort
4952349549
unreachable
@@ -49532,7 +49558,7 @@
4953249558
if
4953349559
i32.const 0
4953449560
i32.const 1056
49535-
i32.const 4101
49561+
i32.const 4103
4953649562
i32.const 1
4953749563
call $~lib/builtins/abort
4953849564
unreachable
@@ -49547,7 +49573,7 @@
4954749573
if
4954849574
i32.const 0
4954949575
i32.const 1056
49550-
i32.const 4102
49576+
i32.const 4104
4955149577
i32.const 1
4955249578
call $~lib/builtins/abort
4955349579
unreachable
@@ -49562,7 +49588,7 @@
4956249588
if
4956349589
i32.const 0
4956449590
i32.const 1056
49565-
i32.const 4103
49591+
i32.const 4105
4956649592
i32.const 1
4956749593
call $~lib/builtins/abort
4956849594
unreachable
@@ -49575,7 +49601,7 @@
4957549601
if
4957649602
i32.const 0
4957749603
i32.const 1056
49578-
i32.const 4104
49604+
i32.const 4106
4957949605
i32.const 1
4958049606
call $~lib/builtins/abort
4958149607
unreachable
@@ -49590,7 +49616,7 @@
4959049616
if
4959149617
i32.const 0
4959249618
i32.const 1056
49593-
i32.const 4105
49619+
i32.const 4107
4959449620
i32.const 1
4959549621
call $~lib/builtins/abort
4959649622
unreachable
@@ -49603,7 +49629,7 @@
4960349629
if
4960449630
i32.const 0
4960549631
i32.const 1056
49606-
i32.const 4107
49632+
i32.const 4109
4960749633
i32.const 1
4960849634
call $~lib/builtins/abort
4960949635
unreachable
@@ -49616,7 +49642,7 @@
4961649642
if
4961749643
i32.const 0
4961849644
i32.const 1056
49619-
i32.const 4108
49645+
i32.const 4110
4962049646
i32.const 1
4962149647
call $~lib/builtins/abort
4962249648
unreachable
@@ -49629,7 +49655,7 @@
4962949655
if
4963049656
i32.const 0
4963149657
i32.const 1056
49632-
i32.const 4109
49658+
i32.const 4111
4963349659
i32.const 1
4963449660
call $~lib/builtins/abort
4963549661
unreachable
@@ -49642,7 +49668,7 @@
4964249668
if
4964349669
i32.const 0
4964449670
i32.const 1056
49645-
i32.const 4110
49671+
i32.const 4112
4964649672
i32.const 1
4964749673
call $~lib/builtins/abort
4964849674
unreachable
@@ -49655,7 +49681,7 @@
4965549681
if
4965649682
i32.const 0
4965749683
i32.const 1056
49658-
i32.const 4111
49684+
i32.const 4113
4965949685
i32.const 1
4966049686
call $~lib/builtins/abort
4966149687
unreachable
@@ -49668,7 +49694,7 @@
4966849694
if
4966949695
i32.const 0
4967049696
i32.const 1056
49671-
i32.const 4112
49697+
i32.const 4114
4967249698
i32.const 1
4967349699
call $~lib/builtins/abort
4967449700
unreachable
@@ -49681,7 +49707,7 @@
4968149707
if
4968249708
i32.const 0
4968349709
i32.const 1056
49684-
i32.const 4113
49710+
i32.const 4115
4968549711
i32.const 1
4968649712
call $~lib/builtins/abort
4968749713
unreachable
@@ -49694,7 +49720,7 @@
4969449720
if
4969549721
i32.const 0
4969649722
i32.const 1056
49697-
i32.const 4114
49723+
i32.const 4116
4969849724
i32.const 1
4969949725
call $~lib/builtins/abort
4970049726
unreachable
@@ -49707,7 +49733,7 @@
4970749733
if
4970849734
i32.const 0
4970949735
i32.const 1056
49710-
i32.const 4115
49736+
i32.const 4117
4971149737
i32.const 1
4971249738
call $~lib/builtins/abort
4971349739
unreachable
@@ -49726,7 +49752,7 @@
4972649752
if
4972749753
i32.const 0
4972849754
i32.const 1056
49729-
i32.const 4117
49755+
i32.const 4119
4973049756
i32.const 1
4973149757
call $~lib/builtins/abort
4973249758
unreachable
@@ -49743,7 +49769,7 @@
4974349769
if
4974449770
i32.const 0
4974549771
i32.const 1056
49746-
i32.const 4118
49772+
i32.const 4120
4974749773
i32.const 1
4974849774
call $~lib/builtins/abort
4974949775
unreachable
@@ -49756,7 +49782,7 @@
4975649782
if
4975749783
i32.const 0
4975849784
i32.const 1056
49759-
i32.const 4120
49785+
i32.const 4122
4976049786
i32.const 1
4976149787
call $~lib/builtins/abort
4976249788
unreachable
@@ -49769,7 +49795,7 @@
4976949795
if
4977049796
i32.const 0
4977149797
i32.const 1056
49772-
i32.const 4121
49798+
i32.const 4123
4977349799
i32.const 1
4977449800
call $~lib/builtins/abort
4977549801
unreachable
@@ -49782,7 +49808,7 @@
4978249808
if
4978349809
i32.const 0
4978449810
i32.const 1056
49785-
i32.const 4122
49811+
i32.const 4124
4978649812
i32.const 1
4978749813
call $~lib/builtins/abort
4978849814
unreachable
@@ -49795,7 +49821,7 @@
4979549821
if
4979649822
i32.const 0
4979749823
i32.const 1056
49798-
i32.const 4123
49824+
i32.const 4125
4979949825
i32.const 1
4980049826
call $~lib/builtins/abort
4980149827
unreachable
@@ -49808,7 +49834,7 @@
4980849834
if
4980949835
i32.const 0
4981049836
i32.const 1056
49811-
i32.const 4124
49837+
i32.const 4126
4981249838
i32.const 1
4981349839
call $~lib/builtins/abort
4981449840
unreachable

0 commit comments

Comments
 (0)