Skip to content

Commit fa1ae52

Browse files
committed
Add collatz conjecture wasm microbenchmark.
1 parent 14eebb6 commit fa1ae52

File tree

2 files changed

+114
-0
lines changed

2 files changed

+114
-0
lines changed
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
int 986
Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
;;
2+
;; Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved.
3+
;; DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4+
;;
5+
;; The Universal Permissive License (UPL), Version 1.0
6+
;;
7+
;; Subject to the condition set forth below, permission is hereby granted to any
8+
;; person obtaining a copy of this software, associated documentation and/or
9+
;; data (collectively the "Software"), free of charge and under any and all
10+
;; copyright rights in the Software, and any and all patent rights owned or
11+
;; freely licensable by each licensor hereunder covering either (i) the
12+
;; unmodified Software as contributed to or provided by such licensor, or (ii)
13+
;; the Larger Works (as defined below), to deal in both
14+
;;
15+
;; (a) the Software, and
16+
;;
17+
;; (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if
18+
;; one is included with the Software each a "Larger Work" to which the Software
19+
;; is contributed by such licensors),
20+
;;
21+
;; without restriction, including without limitation the rights to copy, create
22+
;; derivative works of, display, perform, and distribute the Software and make,
23+
;; use, sell, offer for sale, import, export, have made, and have sold the
24+
;; Software and the Larger Work(s), and to sublicense the foregoing rights on
25+
;; either these or other terms.
26+
;;
27+
;; This license is subject to the following condition:
28+
;;
29+
;; The above copyright notice and either this complete permission notice or at a
30+
;; minimum a reference to the UPL must be included in all copies or substantial
31+
;; portions of the Software.
32+
;;
33+
;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
34+
;; IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
35+
;; FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
36+
;; AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
37+
;; LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
38+
;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
39+
;; SOFTWARE.
40+
;;
41+
42+
(;
43+
pub fn collatz_steps(mut n: u64) -> u64 {
44+
let mut counter = 0;
45+
while n != 1 {
46+
if n % 2 == 0 {
47+
n /= 2;
48+
} else {
49+
n = 3 * n + 1;
50+
}
51+
counter += 1;
52+
}
53+
counter
54+
}
55+
;)
56+
57+
(module
58+
(type $int_func (func (result i32)))
59+
(type $setup_func (func))
60+
(type $teardown_func (func (param i32)))
61+
62+
(global $iterations i64 (i64.const 670617279))
63+
64+
(memory $memory (export "memory") 0)
65+
66+
(func (export "benchmarkSetupEach") (type $setup_func))
67+
68+
(func (export "benchmarkTeardownEach") (type $teardown_func))
69+
70+
(func (export "benchmarkRun") (type $int_func)
71+
global.get $iterations
72+
call $collatz_steps
73+
i32.wrap_i64
74+
)
75+
76+
(func $collatz_steps (export "collatz_steps") (param i64) (result i64)
77+
(local i64)
78+
i64.const 0
79+
local.set 1
80+
block
81+
local.get 0
82+
i64.const 1
83+
i64.eq
84+
br_if 0
85+
i64.const 0
86+
local.set 1
87+
loop $continue
88+
local.get 1
89+
i64.const 1
90+
i64.add
91+
local.set 1
92+
local.get 0
93+
i64.const 1
94+
i64.shr_u
95+
local.get 0
96+
i64.const 3
97+
i64.mul
98+
i64.const 1
99+
i64.add
100+
local.get 0
101+
i64.const 1
102+
i64.and
103+
i64.eqz
104+
select
105+
local.tee 0
106+
i64.const 1
107+
i64.ne
108+
br_if $continue
109+
end
110+
end
111+
local.get 1
112+
)
113+
)

0 commit comments

Comments
 (0)