Nick Fitzgerald
5 years ago
7 changed files with 445 additions and 11 deletions
@ -0,0 +1,129 @@ |
|||||
|
(module $foreign |
||||
|
(memory (export "mem") 1 1) |
||||
|
(data 0 (i32.const 1000) "hello") |
||||
|
(data 0 (i32.const 2000) "olleh")) |
||||
|
|
||||
|
(register "foreign" $foreign) |
||||
|
|
||||
|
(module |
||||
|
(memory (import "foreign" "mem") 1 1) |
||||
|
|
||||
|
(func $is_char (param i32 i32) (result i32) |
||||
|
local.get 0 |
||||
|
i32.load8_u |
||||
|
local.get 1 |
||||
|
i32.eq) |
||||
|
|
||||
|
(func (export "is hello?") (param i32) (result i32) |
||||
|
local.get 0 |
||||
|
i32.const 104 ;; 'h' |
||||
|
call $is_char |
||||
|
|
||||
|
local.get 0 |
||||
|
i32.const 1 |
||||
|
i32.add |
||||
|
i32.const 101 ;; 'e' |
||||
|
call $is_char |
||||
|
|
||||
|
local.get 0 |
||||
|
i32.const 2 |
||||
|
i32.add |
||||
|
i32.const 108 ;; 'l' |
||||
|
call $is_char |
||||
|
|
||||
|
local.get 0 |
||||
|
i32.const 3 |
||||
|
i32.add |
||||
|
i32.const 108 ;; 'l' |
||||
|
call $is_char |
||||
|
|
||||
|
local.get 0 |
||||
|
i32.const 4 |
||||
|
i32.add |
||||
|
i32.const 111 ;; 'o' |
||||
|
call $is_char |
||||
|
|
||||
|
i32.and |
||||
|
i32.and |
||||
|
i32.and |
||||
|
i32.and |
||||
|
) |
||||
|
|
||||
|
(func (export "is olleh?") (param i32) (result i32) |
||||
|
local.get 0 |
||||
|
i32.const 111 ;; 'o' |
||||
|
call $is_char |
||||
|
|
||||
|
local.get 0 |
||||
|
i32.const 1 |
||||
|
i32.add |
||||
|
i32.const 108 ;; 'l' |
||||
|
call $is_char |
||||
|
|
||||
|
local.get 0 |
||||
|
i32.const 2 |
||||
|
i32.add |
||||
|
i32.const 108 ;; 'l' |
||||
|
call $is_char |
||||
|
|
||||
|
local.get 0 |
||||
|
i32.const 3 |
||||
|
i32.add |
||||
|
i32.const 101 ;; 'e' |
||||
|
call $is_char |
||||
|
|
||||
|
local.get 0 |
||||
|
i32.const 4 |
||||
|
i32.add |
||||
|
i32.const 104 ;; 'h' |
||||
|
call $is_char |
||||
|
|
||||
|
i32.and |
||||
|
i32.and |
||||
|
i32.and |
||||
|
i32.and |
||||
|
) |
||||
|
|
||||
|
(func (export "memory.copy") (param i32 i32 i32) |
||||
|
local.get 0 |
||||
|
local.get 1 |
||||
|
local.get 2 |
||||
|
memory.copy)) |
||||
|
|
||||
|
;; Our memory has our initial data in the right places. |
||||
|
(assert_return |
||||
|
(invoke "is hello?" (i32.const 1000)) |
||||
|
(i32.const 1)) |
||||
|
(assert_return |
||||
|
(invoke "is olleh?" (i32.const 2000)) |
||||
|
(i32.const 1)) |
||||
|
|
||||
|
;; Non-overlapping memory copy with dst < src. |
||||
|
(invoke "memory.copy" (i32.const 500) (i32.const 1000) (i32.const 5)) |
||||
|
(assert_return |
||||
|
(invoke "is hello?" (i32.const 500)) |
||||
|
(i32.const 1)) |
||||
|
|
||||
|
;; Non-overlapping memory copy with dst > src. |
||||
|
(invoke "memory.copy" (i32.const 1500) (i32.const 1000) (i32.const 5)) |
||||
|
(assert_return |
||||
|
(invoke "is hello?" (i32.const 1500)) |
||||
|
(i32.const 1)) |
||||
|
|
||||
|
;; Overlapping memory copy with dst < src. |
||||
|
(invoke "memory.copy" (i32.const 1998) (i32.const 2000) (i32.const 5)) |
||||
|
(assert_return |
||||
|
(invoke "is olleh?" (i32.const 1998)) |
||||
|
(i32.const 1)) |
||||
|
|
||||
|
;; Overlapping memory copy with dst > src. |
||||
|
(invoke "memory.copy" (i32.const 2000) (i32.const 1998) (i32.const 5)) |
||||
|
(assert_return |
||||
|
(invoke "is olleh?" (i32.const 2000)) |
||||
|
(i32.const 1)) |
||||
|
|
||||
|
;; Overlapping memory copy with dst = src. |
||||
|
(invoke "memory.copy" (i32.const 2000) (i32.const 2000) (i32.const 5)) |
||||
|
(assert_return |
||||
|
(invoke "is olleh?" (i32.const 2000)) |
||||
|
(i32.const 1)) |
@ -0,0 +1,124 @@ |
|||||
|
(module |
||||
|
(memory 1 1) |
||||
|
(data 0 (i32.const 1000) "hello") |
||||
|
(data 0 (i32.const 2000) "olleh") |
||||
|
|
||||
|
(func $is_char (param i32 i32) (result i32) |
||||
|
local.get 0 |
||||
|
i32.load8_u |
||||
|
local.get 1 |
||||
|
i32.eq) |
||||
|
|
||||
|
(func (export "is hello?") (param i32) (result i32) |
||||
|
local.get 0 |
||||
|
i32.const 104 ;; 'h' |
||||
|
call $is_char |
||||
|
|
||||
|
local.get 0 |
||||
|
i32.const 1 |
||||
|
i32.add |
||||
|
i32.const 101 ;; 'e' |
||||
|
call $is_char |
||||
|
|
||||
|
local.get 0 |
||||
|
i32.const 2 |
||||
|
i32.add |
||||
|
i32.const 108 ;; 'l' |
||||
|
call $is_char |
||||
|
|
||||
|
local.get 0 |
||||
|
i32.const 3 |
||||
|
i32.add |
||||
|
i32.const 108 ;; 'l' |
||||
|
call $is_char |
||||
|
|
||||
|
local.get 0 |
||||
|
i32.const 4 |
||||
|
i32.add |
||||
|
i32.const 111 ;; 'o' |
||||
|
call $is_char |
||||
|
|
||||
|
i32.and |
||||
|
i32.and |
||||
|
i32.and |
||||
|
i32.and |
||||
|
) |
||||
|
|
||||
|
(func (export "is olleh?") (param i32) (result i32) |
||||
|
local.get 0 |
||||
|
i32.const 111 ;; 'o' |
||||
|
call $is_char |
||||
|
|
||||
|
local.get 0 |
||||
|
i32.const 1 |
||||
|
i32.add |
||||
|
i32.const 108 ;; 'l' |
||||
|
call $is_char |
||||
|
|
||||
|
local.get 0 |
||||
|
i32.const 2 |
||||
|
i32.add |
||||
|
i32.const 108 ;; 'l' |
||||
|
call $is_char |
||||
|
|
||||
|
local.get 0 |
||||
|
i32.const 3 |
||||
|
i32.add |
||||
|
i32.const 101 ;; 'e' |
||||
|
call $is_char |
||||
|
|
||||
|
local.get 0 |
||||
|
i32.const 4 |
||||
|
i32.add |
||||
|
i32.const 104 ;; 'h' |
||||
|
call $is_char |
||||
|
|
||||
|
i32.and |
||||
|
i32.and |
||||
|
i32.and |
||||
|
i32.and |
||||
|
) |
||||
|
|
||||
|
(func (export "memory.copy") (param i32 i32 i32) |
||||
|
local.get 0 |
||||
|
local.get 1 |
||||
|
local.get 2 |
||||
|
memory.copy)) |
||||
|
|
||||
|
;; Our memory has our initial data in the right places. |
||||
|
(assert_return |
||||
|
(invoke "is hello?" (i32.const 1000)) |
||||
|
(i32.const 1)) |
||||
|
(assert_return |
||||
|
(invoke "is olleh?" (i32.const 2000)) |
||||
|
(i32.const 1)) |
||||
|
|
||||
|
;; Non-overlapping memory copy with dst < src. |
||||
|
(invoke "memory.copy" (i32.const 500) (i32.const 1000) (i32.const 5)) |
||||
|
(assert_return |
||||
|
(invoke "is hello?" (i32.const 500)) |
||||
|
(i32.const 1)) |
||||
|
|
||||
|
;; Non-overlapping memory copy with dst > src. |
||||
|
(invoke "memory.copy" (i32.const 1500) (i32.const 1000) (i32.const 5)) |
||||
|
(assert_return |
||||
|
(invoke "is hello?" (i32.const 1500)) |
||||
|
(i32.const 1)) |
||||
|
|
||||
|
;; Overlapping memory copy with dst < src. |
||||
|
(invoke "memory.copy" (i32.const 1998) (i32.const 2000) (i32.const 5)) |
||||
|
(assert_return |
||||
|
(invoke "is olleh?" (i32.const 1998)) |
||||
|
(i32.const 1)) |
||||
|
|
||||
|
;; Overlapping memory copy with dst > src. |
||||
|
(invoke "memory.copy" (i32.const 2000) (i32.const 1998) (i32.const 5)) |
||||
|
(assert_return |
||||
|
(invoke "is olleh?" (i32.const 2000)) |
||||
|
(i32.const 1)) |
||||
|
|
||||
|
;; Overlapping memory copy with dst = src. |
||||
|
(invoke "memory.copy" (i32.const 2000) (i32.const 2000) (i32.const 5)) |
||||
|
(assert_return |
||||
|
(invoke "is olleh?" (i32.const 2000)) |
||||
|
(i32.const 1)) |
Loading…
Reference in new issue