From 6223bf8af6d271f2935b05948dc1395bb9f8c0ca Mon Sep 17 00:00:00 2001 From: zixuanzh Date: Tue, 29 May 2018 20:51:09 +0000 Subject: [PATCH] Fix MSTORE8 It was increasing wrongly memory by 8 bytes and not 8 bits --- wasm/MSTORE8.wast | 2 +- wasm/wast-async.json | 2 +- wasm/wast.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/wasm/MSTORE8.wast b/wasm/MSTORE8.wast index ce8e7568..2bbf8d03 100644 --- a/wasm/MSTORE8.wast +++ b/wasm/MSTORE8.wast @@ -23,7 +23,7 @@ (get_local $offset2) (get_local $offset3))) - (call $memusegas (get_local $offset) (i32.const 8)) + (call $memusegas (get_local $offset) (i32.const 1)) ;; pop stack (set_local $sp (i32.sub (get_global $sp) (i32.const 32))) diff --git a/wasm/wast-async.json b/wasm/wast-async.json index 2a167808..0cf223f0 100644 --- a/wasm/wast-async.json +++ b/wasm/wast-async.json @@ -161,7 +161,7 @@ "wast": ";; stack:\n;; 0: word\n;; -1: offset\n(func $MSTORE\n (local $sp i32)\n\n (local $offset i32)\n \n (local $offset0 i64)\n (local $offset1 i64)\n (local $offset2 i64)\n (local $offset3 i64)\n\n ;; load args from the stack\n (set_local $offset0 (i64.load (get_global $sp)))\n (set_local $offset1 (i64.load (i32.add (get_global $sp) (i32.const 8))))\n (set_local $offset2 (i64.load (i32.add (get_global $sp) (i32.const 16))))\n (set_local $offset3 (i64.load (i32.add (get_global $sp) (i32.const 24))))\n\n (set_local $offset \n (call $check_overflow (get_local $offset0)\n (get_local $offset1)\n (get_local $offset2)\n (get_local $offset3)))\n ;; subtrace gas useage\n (call $memusegas (get_local $offset) (i32.const 32))\n\n ;; pop itme from the stack\n (set_local $sp (i32.sub (get_global $sp) (i32.const 32)))\n\n ;; swap top stack item\n (drop (call $bswap_m256 (get_local $sp)))\n\n (set_local $offset (i32.add (get_local $offset) (get_global $memstart)))\n ;; store word to memory\n (i64.store (get_local $offset) (i64.load (get_local $sp)))\n (i64.store (i32.add (get_local $offset) (i32.const 8)) (i64.load (i32.add (get_local $sp) (i32.const 8))))\n (i64.store (i32.add (get_local $offset) (i32.const 16)) (i64.load (i32.add (get_local $sp) (i32.const 16))))\n (i64.store (i32.add (get_local $offset) (i32.const 24)) (i64.load (i32.add (get_local $sp) (i32.const 24))))\n)\n" }, "MSTORE8": { - "wast": ";; stack:\n;; 0: word\n;; -1: offset\n(func $MSTORE8\n (local $sp i32)\n\n (local $offset i32)\n\n (local $offset0 i64)\n (local $offset1 i64)\n (local $offset2 i64)\n (local $offset3 i64)\n\n ;; load args from the stack\n (set_local $offset0 (i64.load (get_global $sp)))\n (set_local $offset1 (i64.load (i32.add (get_global $sp) (i32.const 8))))\n (set_local $offset2 (i64.load (i32.add (get_global $sp) (i32.const 16))))\n (set_local $offset3 (i64.load (i32.add (get_global $sp) (i32.const 24))))\n\n (set_local $offset \n (call $check_overflow (get_local $offset0)\n (get_local $offset1)\n (get_local $offset2)\n (get_local $offset3)))\n\n (call $memusegas (get_local $offset) (i32.const 8))\n\n ;; pop stack\n (set_local $sp (i32.sub (get_global $sp) (i32.const 32)))\n (set_local $offset (i32.add (get_local $offset) (get_global $memstart)))\n (i32.store8 (i32.add (get_local $offset) (i32.const 0)) (i32.load (get_local $sp)))\n)\n" + "wast": ";; stack:\n;; 0: word\n;; -1: offset\n(func $MSTORE8\n (local $sp i32)\n\n (local $offset i32)\n\n (local $offset0 i64)\n (local $offset1 i64)\n (local $offset2 i64)\n (local $offset3 i64)\n\n ;; load args from the stack\n (set_local $offset0 (i64.load (get_global $sp)))\n (set_local $offset1 (i64.load (i32.add (get_global $sp) (i32.const 8))))\n (set_local $offset2 (i64.load (i32.add (get_global $sp) (i32.const 16))))\n (set_local $offset3 (i64.load (i32.add (get_global $sp) (i32.const 24))))\n\n (set_local $offset \n (call $check_overflow (get_local $offset0)\n (get_local $offset1)\n (get_local $offset2)\n (get_local $offset3)))\n\n (call $memusegas (get_local $offset) (i32.const 1))\n\n ;; pop stack\n (set_local $sp (i32.sub (get_global $sp) (i32.const 32)))\n (set_local $offset (i32.add (get_local $offset) (get_global $memstart)))\n (i32.store8 (i32.add (get_local $offset) (i32.const 0)) (i32.load (get_local $sp)))\n)\n" }, "MUL": { "wast": "(func $MUL\n (call $mul_256\n (i64.load (i32.add (get_global $sp) (i32.const 24)))\n (i64.load (i32.add (get_global $sp) (i32.const 16)))\n (i64.load (i32.add (get_global $sp) (i32.const 8)))\n (i64.load (get_global $sp))\n (i64.load (i32.sub (get_global $sp) (i32.const 8)))\n (i64.load (i32.sub (get_global $sp) (i32.const 16)))\n (i64.load (i32.sub (get_global $sp) (i32.const 24)))\n (i64.load (i32.sub (get_global $sp) (i32.const 32)))\n (i32.sub (get_global $sp) (i32.const 8))\n )\n)\n" diff --git a/wasm/wast.json b/wasm/wast.json index 8780a80f..fb749e9e 100644 --- a/wasm/wast.json +++ b/wasm/wast.json @@ -161,7 +161,7 @@ "wast": ";; stack:\n;; 0: word\n;; -1: offset\n(func $MSTORE\n (local $sp i32)\n\n (local $offset i32)\n \n (local $offset0 i64)\n (local $offset1 i64)\n (local $offset2 i64)\n (local $offset3 i64)\n\n ;; load args from the stack\n (set_local $offset0 (i64.load (get_global $sp)))\n (set_local $offset1 (i64.load (i32.add (get_global $sp) (i32.const 8))))\n (set_local $offset2 (i64.load (i32.add (get_global $sp) (i32.const 16))))\n (set_local $offset3 (i64.load (i32.add (get_global $sp) (i32.const 24))))\n\n (set_local $offset \n (call $check_overflow (get_local $offset0)\n (get_local $offset1)\n (get_local $offset2)\n (get_local $offset3)))\n ;; subtrace gas useage\n (call $memusegas (get_local $offset) (i32.const 32))\n\n ;; pop itme from the stack\n (set_local $sp (i32.sub (get_global $sp) (i32.const 32)))\n\n ;; swap top stack item\n (drop (call $bswap_m256 (get_local $sp)))\n\n (set_local $offset (i32.add (get_local $offset) (get_global $memstart)))\n ;; store word to memory\n (i64.store (get_local $offset) (i64.load (get_local $sp)))\n (i64.store (i32.add (get_local $offset) (i32.const 8)) (i64.load (i32.add (get_local $sp) (i32.const 8))))\n (i64.store (i32.add (get_local $offset) (i32.const 16)) (i64.load (i32.add (get_local $sp) (i32.const 16))))\n (i64.store (i32.add (get_local $offset) (i32.const 24)) (i64.load (i32.add (get_local $sp) (i32.const 24))))\n)\n" }, "MSTORE8": { - "wast": ";; stack:\n;; 0: word\n;; -1: offset\n(func $MSTORE8\n (local $sp i32)\n\n (local $offset i32)\n\n (local $offset0 i64)\n (local $offset1 i64)\n (local $offset2 i64)\n (local $offset3 i64)\n\n ;; load args from the stack\n (set_local $offset0 (i64.load (get_global $sp)))\n (set_local $offset1 (i64.load (i32.add (get_global $sp) (i32.const 8))))\n (set_local $offset2 (i64.load (i32.add (get_global $sp) (i32.const 16))))\n (set_local $offset3 (i64.load (i32.add (get_global $sp) (i32.const 24))))\n\n (set_local $offset \n (call $check_overflow (get_local $offset0)\n (get_local $offset1)\n (get_local $offset2)\n (get_local $offset3)))\n\n (call $memusegas (get_local $offset) (i32.const 8))\n\n ;; pop stack\n (set_local $sp (i32.sub (get_global $sp) (i32.const 32)))\n (set_local $offset (i32.add (get_local $offset) (get_global $memstart)))\n (i32.store8 (i32.add (get_local $offset) (i32.const 0)) (i32.load (get_local $sp)))\n)\n" + "wast": ";; stack:\n;; 0: word\n;; -1: offset\n(func $MSTORE8\n (local $sp i32)\n\n (local $offset i32)\n\n (local $offset0 i64)\n (local $offset1 i64)\n (local $offset2 i64)\n (local $offset3 i64)\n\n ;; load args from the stack\n (set_local $offset0 (i64.load (get_global $sp)))\n (set_local $offset1 (i64.load (i32.add (get_global $sp) (i32.const 8))))\n (set_local $offset2 (i64.load (i32.add (get_global $sp) (i32.const 16))))\n (set_local $offset3 (i64.load (i32.add (get_global $sp) (i32.const 24))))\n\n (set_local $offset \n (call $check_overflow (get_local $offset0)\n (get_local $offset1)\n (get_local $offset2)\n (get_local $offset3)))\n\n (call $memusegas (get_local $offset) (i32.const 1))\n\n ;; pop stack\n (set_local $sp (i32.sub (get_global $sp) (i32.const 32)))\n (set_local $offset (i32.add (get_local $offset) (get_global $memstart)))\n (i32.store8 (i32.add (get_local $offset) (i32.const 0)) (i32.load (get_local $sp)))\n)\n" }, "MUL": { "wast": "(func $MUL\n (call $mul_256\n (i64.load (i32.add (get_global $sp) (i32.const 24)))\n (i64.load (i32.add (get_global $sp) (i32.const 16)))\n (i64.load (i32.add (get_global $sp) (i32.const 8)))\n (i64.load (get_global $sp))\n (i64.load (i32.sub (get_global $sp) (i32.const 8)))\n (i64.load (i32.sub (get_global $sp) (i32.const 16)))\n (i64.load (i32.sub (get_global $sp) (i32.const 24)))\n (i64.load (i32.sub (get_global $sp) (i32.const 32)))\n (i32.sub (get_global $sp) (i32.const 8))\n )\n)\n"