summaryrefslogtreecommitdiff
path: root/examples/wasm/loop.wat
blob: 0dcd1910a07f6c26451b2229845bd40dc3ff8f55 (plain)
(module
  (func $loop_test (export "loop_test") (result i32)
    (local i32) ;; Local 0: Counter

    ;; Initialize the counter
    (local.set 0 (i32.const 0))

    ;; Loop starts here
    (loop $my_loop
      ;; Increment the counter
      (local.set 0 (i32.add (local.get 0) (i32.const 1)))

      ;; Exit condition: break out of the loop if counter >= 10
      (br_if $my_loop (i32.lt_s (local.get 0) (i32.const 10)))
    )
    
    ;; Return the counter value
    (local.get 0)
  )

  (func $loop_test3 (export "loop_test3") (result i32)
    (local i32) ;; Local 0: Counter

    ;; Initialize the counter
    (local.set 0 (i32.const 0))

    ;; Loop starts here
    (block $exit_loop  ;; Label for exiting the loop
      (loop $my_loop
        ;; Increment the counter
        (local.set 0 (i32.add (local.get 0) (i32.const 1)))

        ;; Prepare an index for br_table
        ;; Here, we use the counter, but you could modify this
        ;; For simplicity, 0 will continue the loop, any other value will exit
        (local.get 0)
        (i32.const 10)
        (i32.lt_s)
        (br_table $my_loop $exit_loop)
      )
    )
    
    ;; Return the counter value
    (local.get 0)
  )

  (func $calculate (export "loop_test2") (result i32)
    (local i32) ;; Local 0: Counter for the outer loop
    (local i32) ;; Local 1: Counter for the inner loop
    (local i32) ;; Local 2: Result variable

    ;; Initialize variables
    (local.set 0 (i32.const 0)) ;; Initialize outer loop counter
    (local.set 1 (i32.const 0)) ;; Initialize inner loop counter
    (local.set 2 (i32.const 0)) ;; Initialize result variable

    (block $outer  ;; Outer loop label
      (loop $outer_loop
        (local.set 1 (i32.const 5)) ;; Reset inner loop counter for each iteration of the outer loop

        (block $inner  ;; Inner loop label
          (loop $inner_loop
            (br_if $inner (i32.eqz (local.get 1))) ;; Break to $inner if inner loop counter is zero

            ;; Computation: Adding product of counters to the result
            (local.set 2 (i32.add (local.get 2) (i32.mul (local.get 0) (local.get 1))))

            ;; Decrement inner loop counter
            (local.set 1 (i32.sub (local.get 1) (i32.const 1)))
          )
        )

        ;; Increment outer loop counter
        (local.set 0 (i32.add (local.get 0) (i32.const 1)))

        ;; Break condition for outer loop: break if outer loop counter >= 5
        (br_if $outer (i32.ge_s (local.get 0) (i32.const 5))) 
      )
    )

    ;; Return the result
    (local.get 2)
  )
)