Title: [270265] trunk
Revision
270265
Author
[email protected]
Date
2020-11-30 14:12:02 -0800 (Mon, 30 Nov 2020)

Log Message

Add support for the Wasm i64 sign-extension-ops proposal
https://bugs.webkit.org/show_bug.cgi?id=218990

Patch by Sergey Rubanov <[email protected]> on 2020-11-30
Reviewed by Yusuke Suzuki.

JSTests:

* wasm/spec-tests/i64.wast.js:
* wasm/wasm.json:

Source/_javascript_Core:

* llint/WebAssembly.asm:
* offlineasm/arm64.rb:
* offlineasm/cloop.rb:
* offlineasm/instructions.rb:
* offlineasm/x86.rb:
* wasm/WasmAirIRGenerator.cpp:
(JSC::Wasm::AirIRGenerator::addOp<OpType::I64Extend8S>):
(JSC::Wasm::AirIRGenerator::addOp<OpType::I64Extend16S>):
(JSC::Wasm::AirIRGenerator::addOp<OpType::I64Extend32S>):
* wasm/wasm.json:

LayoutTests:

* workers/wasm-references/test.js:

Modified Paths

Diff

Modified: trunk/JSTests/ChangeLog (270264 => 270265)


--- trunk/JSTests/ChangeLog	2020-11-30 21:49:30 UTC (rev 270264)
+++ trunk/JSTests/ChangeLog	2020-11-30 22:12:02 UTC (rev 270265)
@@ -1,3 +1,13 @@
+2020-11-30  Sergey Rubanov  <[email protected]>
+
+        Add support for the Wasm i64 sign-extension-ops proposal
+        https://bugs.webkit.org/show_bug.cgi?id=218990
+
+        Reviewed by Yusuke Suzuki.
+
+        * wasm/spec-tests/i64.wast.js:
+        * wasm/wasm.json:
+
 2020-11-28  Yusuke Suzuki  <[email protected]>
 
         Unreviewd, annotate stress/bounds-checking-in-cold-loop.js with memoryLimited

Modified: trunk/JSTests/wasm/spec-tests/i64.wast.js (270264 => 270265)


--- trunk/JSTests/wasm/spec-tests/i64.wast.js	2020-11-30 21:49:30 UTC (rev 270264)
+++ trunk/JSTests/wasm/spec-tests/i64.wast.js	2020-11-30 22:12:02 UTC (rev 270265)
@@ -1,9 +1,6 @@
 
 // i64.wast:3
-// FIXME: implement sign-extension operators
-// https://bugs.webkit.org/show_bug.cgi?id=218990
-// let $1 = instance("\x00\x61\x73\x6d\x01\x00\x00\x00\x01\x97\x80\x80\x80\x00\x04\x60\x02\x7e\x7e\x01\x7e\x60\x01\x7e\x01\x7e\x60\x01\x7e\x01\x7f\x60\x02\x7e\x7e\x01\x7f\x03\xa1\x80\x80\x80\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x01\x01\x01\x01\x01\x02\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x07\xeb\x81\x80\x80\x00\x20\x03\x61\x64\x64\x00\x00\x03\x73\x75\x62\x00\x01\x03\x6d\x75\x6c\x00\x02\x05\x64\x69\x76\x5f\x73\x00\x03\x05\x64\x69\x76\x5f\x75\x00\x04\x05\x72\x65\x6d\x5f\x73\x00\x05\x05\x72\x65\x6d\x5f\x75\x00\x06\x03\x61\x6e\x64\x00\x07\x02\x6f\x72\x00\x08\x03\x78\x6f\x72\x00\x09\x03\x73\x68\x6c\x00\x0a\x05\x73\x68\x72\x5f\x73\x00\x0b\x05\x73\x68\x72\x5f\x75\x00\x0c\x04\x72\x6f\x74\x6c\x00\x0d\x04\x72\x6f\x74\x72\x00\x0e\x03\x63\x6c\x7a\x00\x0f\x03\x63\x74\x7a\x00\x10\x06\x70\x6f\x70\x63\x6e\x74\x00\x11\x09\x65\x78\x74\x65\x6e\x64\x38\x5f\x73\x00\x12\x0a\x65\x78\x74\x65\x6e\x64\x31\x36\x5f\x73\x00\x13\x0a\x65\x78\x74\x65\x6e\x64\x33\x32\x5f\x
 73\x00\x14\x03\x65\x71\x7a\x00\x15\x02\x65\x71\x00\x16\x02\x6e\x65\x00\x17\x04\x6c\x74\x5f\x73\x00\x18\x04\x6c\x74\x5f\x75\x00\x19\x04\x6c\x65\x5f\x73\x00\x1a\x04\x6c\x65\x5f\x75\x00\x1b\x04\x67\x74\x5f\x73\x00\x1c\x04\x67\x74\x5f\x75\x00\x1d\x04\x67\x65\x5f\x73\x00\x1e\x04\x67\x65\x5f\x75\x00\x1f\x0a\xf3\x82\x80\x80\x00\x20\x87\x80\x80\x80\x00\x00\x20\x00\x20\x01\x7c\x0b\x87\x80\x80\x80\x00\x00\x20\x00\x20\x01\x7d\x0b\x87\x80\x80\x80\x00\x00\x20\x00\x20\x01\x7e\x0b\x87\x80\x80\x80\x00\x00\x20\x00\x20\x01\x7f\x0b\x87\x80\x80\x80\x00\x00\x20\x00\x20\x01\x80\x0b\x87\x80\x80\x80\x00\x00\x20\x00\x20\x01\x81\x0b\x87\x80\x80\x80\x00\x00\x20\x00\x20\x01\x82\x0b\x87\x80\x80\x80\x00\x00\x20\x00\x20\x01\x83\x0b\x87\x80\x80\x80\x00\x00\x20\x00\x20\x01\x84\x0b\x87\x80\x80\x80\x00\x00\x20\x00\x20\x01\x85\x0b\x87\x80\x80\x80\x00\x00\x20\x00\x20\x01\x86\x0b\x87\x80\x80\x80\x00\x00\x20\x00\x20\x01\x87\x0b\x87\x80\x80\x80\x00\x00\x20\x00\x20\x01\x88\x0b\x87\x80\x80\x80\x00\x00\x20\x00\x20\x01\x89\x0
 b\x87\x80\x80\x80\x00\x00\x20\x00\x20\x01\x8a\x0b\x85\x80\x80\x80\x00\x00\x20\x00\x79\x0b\x85\x80\x80\x80\x00\x00\x20\x00\x7a\x0b\x85\x80\x80\x80\x00\x00\x20\x00\x7b\x0b\x85\x80\x80\x80\x00\x00\x20\x00\xc2\x0b\x85\x80\x80\x80\x00\x00\x20\x00\xc3\x0b\x85\x80\x80\x80\x00\x00\x20\x00\xc4\x0b\x85\x80\x80\x80\x00\x00\x20\x00\x50\x0b\x87\x80\x80\x80\x00\x00\x20\x00\x20\x01\x51\x0b\x87\x80\x80\x80\x00\x00\x20\x00\x20\x01\x52\x0b\x87\x80\x80\x80\x00\x00\x20\x00\x20\x01\x53\x0b\x87\x80\x80\x80\x00\x00\x20\x00\x20\x01\x54\x0b\x87\x80\x80\x80\x00\x00\x20\x00\x20\x01\x57\x0b\x87\x80\x80\x80\x00\x00\x20\x00\x20\x01\x58\x0b\x87\x80\x80\x80\x00\x00\x20\x00\x20\x01\x55\x0b\x87\x80\x80\x80\x00\x00\x20\x00\x20\x01\x56\x0b\x87\x80\x80\x80\x00\x00\x20\x00\x20\x01\x59\x0b\x87\x80\x80\x80\x00\x00\x20\x00\x20\x01\x5a\x0b");
-let $1 = instance("\x00\x61\x73\x6d\x01\x00\x00\x00\x01\x97\x80\x80\x80\x00\x04\x60\x02\x7e\x7e\x01\x7e\x60\x01\x7e\x01\x7e\x60\x01\x7e\x01\x7f\x60\x02\x7e\x7e\x01\x7f\x03\x9e\x80\x80\x80\x00\x1d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x01\x01\x02\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x07\xc5\x81\x80\x80\x00\x1d\x03\x61\x64\x64\x00\x00\x03\x73\x75\x62\x00\x01\x03\x6d\x75\x6c\x00\x02\x05\x64\x69\x76\x5f\x73\x00\x03\x05\x64\x69\x76\x5f\x75\x00\x04\x05\x72\x65\x6d\x5f\x73\x00\x05\x05\x72\x65\x6d\x5f\x75\x00\x06\x03\x61\x6e\x64\x00\x07\x02\x6f\x72\x00\x08\x03\x78\x6f\x72\x00\x09\x03\x73\x68\x6c\x00\x0a\x05\x73\x68\x72\x5f\x73\x00\x0b\x05\x73\x68\x72\x5f\x75\x00\x0c\x04\x72\x6f\x74\x6c\x00\x0d\x04\x72\x6f\x74\x72\x00\x0e\x03\x63\x6c\x7a\x00\x0f\x03\x63\x74\x7a\x00\x10\x06\x70\x6f\x70\x63\x6e\x74\x00\x11\x03\x65\x71\x7a\x00\x12\x02\x65\x71\x00\x13\x02\x6e\x65\x00\x14\x04\x6c\x74\x5f\x73\x00\x15\x04\x6c\x74\x5f\x75\x00\x16\x04\x6c\x65\x5f\x73\x00\x17\x04\x6c\
 x65\x5f\x75\x00\x18\x04\x67\x74\x5f\x73\x00\x19\x04\x67\x74\x5f\x75\x00\x1a\x04\x67\x65\x5f\x73\x00\x1b\x04\x67\x65\x5f\x75\x00\x1c\x0a\xd5\x82\x80\x80\x00\x1d\x87\x80\x80\x80\x00\x00\x20\x00\x20\x01\x7c\x0b\x87\x80\x80\x80\x00\x00\x20\x00\x20\x01\x7d\x0b\x87\x80\x80\x80\x00\x00\x20\x00\x20\x01\x7e\x0b\x87\x80\x80\x80\x00\x00\x20\x00\x20\x01\x7f\x0b\x87\x80\x80\x80\x00\x00\x20\x00\x20\x01\x80\x0b\x87\x80\x80\x80\x00\x00\x20\x00\x20\x01\x81\x0b\x87\x80\x80\x80\x00\x00\x20\x00\x20\x01\x82\x0b\x87\x80\x80\x80\x00\x00\x20\x00\x20\x01\x83\x0b\x87\x80\x80\x80\x00\x00\x20\x00\x20\x01\x84\x0b\x87\x80\x80\x80\x00\x00\x20\x00\x20\x01\x85\x0b\x87\x80\x80\x80\x00\x00\x20\x00\x20\x01\x86\x0b\x87\x80\x80\x80\x00\x00\x20\x00\x20\x01\x87\x0b\x87\x80\x80\x80\x00\x00\x20\x00\x20\x01\x88\x0b\x87\x80\x80\x80\x00\x00\x20\x00\x20\x01\x89\x0b\x87\x80\x80\x80\x00\x00\x20\x00\x20\x01\x8a\x0b\x85\x80\x80\x80\x00\x00\x20\x00\x79\x0b\x85\x80\x80\x80\x00\x00\x20\x00\x7a\x0b\x85\x80\x80\x80\x00\x00\x20\x00\x7b\x
 0b\x85\x80\x80\x80\x00\x00\x20\x00\x50\x0b\x87\x80\x80\x80\x00\x00\x20\x00\x20\x01\x51\x0b\x87\x80\x80\x80\x00\x00\x20\x00\x20\x01\x52\x0b\x87\x80\x80\x80\x00\x00\x20\x00\x20\x01\x53\x0b\x87\x80\x80\x80\x00\x00\x20\x00\x20\x01\x54\x0b\x87\x80\x80\x80\x00\x00\x20\x00\x20\x01\x57\x0b\x87\x80\x80\x80\x00\x00\x20\x00\x20\x01\x58\x0b\x87\x80\x80\x80\x00\x00\x20\x00\x20\x01\x55\x0b\x87\x80\x80\x80\x00\x00\x20\x00\x20\x01\x56\x0b\x87\x80\x80\x80\x00\x00\x20\x00\x20\x01\x59\x0b\x87\x80\x80\x80\x00\x00\x20\x00\x20\x01\x5a\x0b");
+let $1 = instance("\x00\x61\x73\x6d\x01\x00\x00\x00\x01\x97\x80\x80\x80\x00\x04\x60\x02\x7e\x7e\x01\x7e\x60\x01\x7e\x01\x7e\x60\x01\x7e\x01\x7f\x60\x02\x7e\x7e\x01\x7f\x03\xa1\x80\x80\x80\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x01\x01\x01\x01\x01\x02\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x07\xeb\x81\x80\x80\x00\x20\x03\x61\x64\x64\x00\x00\x03\x73\x75\x62\x00\x01\x03\x6d\x75\x6c\x00\x02\x05\x64\x69\x76\x5f\x73\x00\x03\x05\x64\x69\x76\x5f\x75\x00\x04\x05\x72\x65\x6d\x5f\x73\x00\x05\x05\x72\x65\x6d\x5f\x75\x00\x06\x03\x61\x6e\x64\x00\x07\x02\x6f\x72\x00\x08\x03\x78\x6f\x72\x00\x09\x03\x73\x68\x6c\x00\x0a\x05\x73\x68\x72\x5f\x73\x00\x0b\x05\x73\x68\x72\x5f\x75\x00\x0c\x04\x72\x6f\x74\x6c\x00\x0d\x04\x72\x6f\x74\x72\x00\x0e\x03\x63\x6c\x7a\x00\x0f\x03\x63\x74\x7a\x00\x10\x06\x70\x6f\x70\x63\x6e\x74\x00\x11\x09\x65\x78\x74\x65\x6e\x64\x38\x5f\x73\x00\x12\x0a\x65\x78\x74\x65\x6e\x64\x31\x36\x5f\x73\x00\x13\x0a\x65\x78\x74\x65\x6e\x64\x33\x
 32\x5f\x73\x00\x14\x03\x65\x71\x7a\x00\x15\x02\x65\x71\x00\x16\x02\x6e\x65\x00\x17\x04\x6c\x74\x5f\x73\x00\x18\x04\x6c\x74\x5f\x75\x00\x19\x04\x6c\x65\x5f\x73\x00\x1a\x04\x6c\x65\x5f\x75\x00\x1b\x04\x67\x74\x5f\x73\x00\x1c\x04\x67\x74\x5f\x75\x00\x1d\x04\x67\x65\x5f\x73\x00\x1e\x04\x67\x65\x5f\x75\x00\x1f\x0a\xf3\x82\x80\x80\x00\x20\x87\x80\x80\x80\x00\x00\x20\x00\x20\x01\x7c\x0b\x87\x80\x80\x80\x00\x00\x20\x00\x20\x01\x7d\x0b\x87\x80\x80\x80\x00\x00\x20\x00\x20\x01\x7e\x0b\x87\x80\x80\x80\x00\x00\x20\x00\x20\x01\x7f\x0b\x87\x80\x80\x80\x00\x00\x20\x00\x20\x01\x80\x0b\x87\x80\x80\x80\x00\x00\x20\x00\x20\x01\x81\x0b\x87\x80\x80\x80\x00\x00\x20\x00\x20\x01\x82\x0b\x87\x80\x80\x80\x00\x00\x20\x00\x20\x01\x83\x0b\x87\x80\x80\x80\x00\x00\x20\x00\x20\x01\x84\x0b\x87\x80\x80\x80\x00\x00\x20\x00\x20\x01\x85\x0b\x87\x80\x80\x80\x00\x00\x20\x00\x20\x01\x86\x0b\x87\x80\x80\x80\x00\x00\x20\x00\x20\x01\x87\x0b\x87\x80\x80\x80\x00\x00\x20\x00\x20\x01\x88\x0b\x87\x80\x80\x80\x00\x00\x20\x00\x20\x0
 1\x89\x0b\x87\x80\x80\x80\x00\x00\x20\x00\x20\x01\x8a\x0b\x85\x80\x80\x80\x00\x00\x20\x00\x79\x0b\x85\x80\x80\x80\x00\x00\x20\x00\x7a\x0b\x85\x80\x80\x80\x00\x00\x20\x00\x7b\x0b\x85\x80\x80\x80\x00\x00\x20\x00\xc2\x0b\x85\x80\x80\x80\x00\x00\x20\x00\xc3\x0b\x85\x80\x80\x80\x00\x00\x20\x00\xc4\x0b\x85\x80\x80\x80\x00\x00\x20\x00\x50\x0b\x87\x80\x80\x80\x00\x00\x20\x00\x20\x01\x51\x0b\x87\x80\x80\x80\x00\x00\x20\x00\x20\x01\x52\x0b\x87\x80\x80\x80\x00\x00\x20\x00\x20\x01\x53\x0b\x87\x80\x80\x80\x00\x00\x20\x00\x20\x01\x54\x0b\x87\x80\x80\x80\x00\x00\x20\x00\x20\x01\x57\x0b\x87\x80\x80\x80\x00\x00\x20\x00\x20\x01\x58\x0b\x87\x80\x80\x80\x00\x00\x20\x00\x20\x01\x55\x0b\x87\x80\x80\x80\x00\x00\x20\x00\x20\x01\x56\x0b\x87\x80\x80\x80\x00\x00\x20\x00\x20\x01\x59\x0b\x87\x80\x80\x80\x00\x00\x20\x00\x20\x01\x5a\x0b");
 
 // i64.wast:38
 run(() => call(instance("\x00\x61\x73\x6d\x01\x00\x00\x00\x01\x8a\x80\x80\x80\x00\x02\x60\x00\x00\x60\x02\x7e\x7e\x01\x7e\x02\x8a\x80\x80\x80\x00\x01\x02\x24\x31\x03\x61\x64\x64\x00\x01\x03\x82\x80\x80\x80\x00\x01\x00\x07\x87\x80\x80\x80\x00\x01\x03\x72\x75\x6e\x00\x01\x0a\x9b\x80\x80\x80\x00\x01\x95\x80\x80\x80\x00\x00\x02\x40\x42\x01\x42\x01\x10\x00\x01\x42\x02\x01\x51\x45\x0d\x00\x0f\x0b\x00\x0b", exports("$1", $1)),  "run", []));  // assert_return(() => call($1, "add", [int64("1"), int64("1")]), int64("2"))
@@ -651,129 +648,79 @@
 run(() => call(instance("\x00\x61\x73\x6d\x01\x00\x00\x00\x01\x89\x80\x80\x80\x00\x02\x60\x00\x00\x60\x01\x7e\x01\x7e\x02\x8d\x80\x80\x80\x00\x01\x02\x24\x31\x06\x70\x6f\x70\x63\x6e\x74\x00\x01\x03\x82\x80\x80\x80\x00\x01\x00\x07\x87\x80\x80\x80\x00\x01\x03\x72\x75\x6e\x00\x01\x0a\xa1\x80\x80\x80\x00\x01\x9b\x80\x80\x80\x00\x00\x02\x40\x42\xef\xfd\xb6\xf5\xfd\xdd\xef\xd6\x5e\x10\x00\x01\x42\x30\x01\x51\x45\x0d\x00\x0f\x0b\x00\x0b", exports("$1", $1)),  "run", []));  // assert_return(() => call($1, "popcnt", [int64("-2_401_053_088_876_216_593")]), int64("48"))
 
 // i64.wast:271
-// FIXME: implement sign-extension operators
-// https://bugs.webkit.org/show_bug.cgi?id=218990
-// run(() => call(instance("\x00\x61\x73\x6d\x01\x00\x00\x00\x01\x89\x80\x80\x80\x00\x02\x60\x00\x00\x60\x01\x7e\x01\x7e\x02\x90\x80\x80\x80\x00\x01\x02\x24\x31\x09\x65\x78\x74\x65\x6e\x64\x38\x5f\x73\x00\x01\x03\x82\x80\x80\x80\x00\x01\x00\x07\x87\x80\x80\x80\x00\x01\x03\x72\x75\x6e\x00\x01\x0a\x99\x80\x80\x80\x00\x01\x93\x80\x80\x80\x00\x00\x02\x40\x42\x00\x10\x00\x01\x42\x00\x01\x51\x45\x0d\x00\x0f\x0b\x00\x0b", exports("$1", $1)),  "run", []));  // assert_return(() => call($1, "extend8_s", [int64("0")]), int64("0"))
+run(() => call(instance("\x00\x61\x73\x6d\x01\x00\x00\x00\x01\x89\x80\x80\x80\x00\x02\x60\x00\x00\x60\x01\x7e\x01\x7e\x02\x90\x80\x80\x80\x00\x01\x02\x24\x31\x09\x65\x78\x74\x65\x6e\x64\x38\x5f\x73\x00\x01\x03\x82\x80\x80\x80\x00\x01\x00\x07\x87\x80\x80\x80\x00\x01\x03\x72\x75\x6e\x00\x01\x0a\x99\x80\x80\x80\x00\x01\x93\x80\x80\x80\x00\x00\x02\x40\x42\x00\x10\x00\x01\x42\x00\x01\x51\x45\x0d\x00\x0f\x0b\x00\x0b", exports("$1", $1)),  "run", []));  // assert_return(() => call($1, "extend8_s", [int64("0")]), int64("0"))
 
 // i64.wast:272
-// FIXME: implement sign-extension operators
-// https://bugs.webkit.org/show_bug.cgi?id=218990
-// run(() => call(instance("\x00\x61\x73\x6d\x01\x00\x00\x00\x01\x89\x80\x80\x80\x00\x02\x60\x00\x00\x60\x01\x7e\x01\x7e\x02\x90\x80\x80\x80\x00\x01\x02\x24\x31\x09\x65\x78\x74\x65\x6e\x64\x38\x5f\x73\x00\x01\x03\x82\x80\x80\x80\x00\x01\x00\x07\x87\x80\x80\x80\x00\x01\x03\x72\x75\x6e\x00\x01\x0a\x9b\x80\x80\x80\x00\x01\x95\x80\x80\x80\x00\x00\x02\x40\x42\xff\x00\x10\x00\x01\x42\xff\x00\x01\x51\x45\x0d\x00\x0f\x0b\x00\x0b", exports("$1", $1)),  "run", []));  // assert_return(() => call($1, "extend8_s", [int64("127")]), int64("127"))
+run(() => call(instance("\x00\x61\x73\x6d\x01\x00\x00\x00\x01\x89\x80\x80\x80\x00\x02\x60\x00\x00\x60\x01\x7e\x01\x7e\x02\x90\x80\x80\x80\x00\x01\x02\x24\x31\x09\x65\x78\x74\x65\x6e\x64\x38\x5f\x73\x00\x01\x03\x82\x80\x80\x80\x00\x01\x00\x07\x87\x80\x80\x80\x00\x01\x03\x72\x75\x6e\x00\x01\x0a\x9b\x80\x80\x80\x00\x01\x95\x80\x80\x80\x00\x00\x02\x40\x42\xff\x00\x10\x00\x01\x42\xff\x00\x01\x51\x45\x0d\x00\x0f\x0b\x00\x0b", exports("$1", $1)),  "run", []));  // assert_return(() => call($1, "extend8_s", [int64("127")]), int64("127"))
 
 // i64.wast:273
-// FIXME: implement sign-extension operators
-// https://bugs.webkit.org/show_bug.cgi?id=218990
-// run(() => call(instance("\x00\x61\x73\x6d\x01\x00\x00\x00\x01\x89\x80\x80\x80\x00\x02\x60\x00\x00\x60\x01\x7e\x01\x7e\x02\x90\x80\x80\x80\x00\x01\x02\x24\x31\x09\x65\x78\x74\x65\x6e\x64\x38\x5f\x73\x00\x01\x03\x82\x80\x80\x80\x00\x01\x00\x07\x87\x80\x80\x80\x00\x01\x03\x72\x75\x6e\x00\x01\x0a\x9b\x80\x80\x80\x00\x01\x95\x80\x80\x80\x00\x00\x02\x40\x42\x80\x01\x10\x00\x01\x42\x80\x7f\x01\x51\x45\x0d\x00\x0f\x0b\x00\x0b", exports("$1", $1)),  "run", []));  // assert_return(() => call($1, "extend8_s", [int64("128")]), int64("-128"))
+run(() => call(instance("\x00\x61\x73\x6d\x01\x00\x00\x00\x01\x89\x80\x80\x80\x00\x02\x60\x00\x00\x60\x01\x7e\x01\x7e\x02\x90\x80\x80\x80\x00\x01\x02\x24\x31\x09\x65\x78\x74\x65\x6e\x64\x38\x5f\x73\x00\x01\x03\x82\x80\x80\x80\x00\x01\x00\x07\x87\x80\x80\x80\x00\x01\x03\x72\x75\x6e\x00\x01\x0a\x9b\x80\x80\x80\x00\x01\x95\x80\x80\x80\x00\x00\x02\x40\x42\x80\x01\x10\x00\x01\x42\x80\x7f\x01\x51\x45\x0d\x00\x0f\x0b\x00\x0b", exports("$1", $1)),  "run", []));  // assert_return(() => call($1, "extend8_s", [int64("128")]), int64("-128"))
 
 // i64.wast:274
-// FIXME: implement sign-extension operators
-// https://bugs.webkit.org/show_bug.cgi?id=218990
-// run(() => call(instance("\x00\x61\x73\x6d\x01\x00\x00\x00\x01\x89\x80\x80\x80\x00\x02\x60\x00\x00\x60\x01\x7e\x01\x7e\x02\x90\x80\x80\x80\x00\x01\x02\x24\x31\x09\x65\x78\x74\x65\x6e\x64\x38\x5f\x73\x00\x01\x03\x82\x80\x80\x80\x00\x01\x00\x07\x87\x80\x80\x80\x00\x01\x03\x72\x75\x6e\x00\x01\x0a\x9a\x80\x80\x80\x00\x01\x94\x80\x80\x80\x00\x00\x02\x40\x42\xff\x01\x10\x00\x01\x42\x7f\x01\x51\x45\x0d\x00\x0f\x0b\x00\x0b", exports("$1", $1)),  "run", []));  // assert_return(() => call($1, "extend8_s", [int64("255")]), int64("-1"))
+run(() => call(instance("\x00\x61\x73\x6d\x01\x00\x00\x00\x01\x89\x80\x80\x80\x00\x02\x60\x00\x00\x60\x01\x7e\x01\x7e\x02\x90\x80\x80\x80\x00\x01\x02\x24\x31\x09\x65\x78\x74\x65\x6e\x64\x38\x5f\x73\x00\x01\x03\x82\x80\x80\x80\x00\x01\x00\x07\x87\x80\x80\x80\x00\x01\x03\x72\x75\x6e\x00\x01\x0a\x9a\x80\x80\x80\x00\x01\x94\x80\x80\x80\x00\x00\x02\x40\x42\xff\x01\x10\x00\x01\x42\x7f\x01\x51\x45\x0d\x00\x0f\x0b\x00\x0b", exports("$1", $1)),  "run", []));  // assert_return(() => call($1, "extend8_s", [int64("255")]), int64("-1"))
 
 // i64.wast:275
-// FIXME: implement sign-extension operators
-// https://bugs.webkit.org/show_bug.cgi?id=218990
-// run(() => call(instance("\x00\x61\x73\x6d\x01\x00\x00\x00\x01\x89\x80\x80\x80\x00\x02\x60\x00\x00\x60\x01\x7e\x01\x7e\x02\x90\x80\x80\x80\x00\x01\x02\x24\x31\x09\x65\x78\x74\x65\x6e\x64\x38\x5f\x73\x00\x01\x03\x82\x80\x80\x80\x00\x01\x00\x07\x87\x80\x80\x80\x00\x01\x03\x72\x75\x6e\x00\x01\x0a\xa1\x80\x80\x80\x00\x01\x9b\x80\x80\x80\x00\x00\x02\x40\x42\x80\x9a\xaf\xcd\xf8\xac\xd1\x91\x01\x10\x00\x01\x42\x00\x01\x51\x45\x0d\x00\x0f\x0b\x00\x0b", exports("$1", $1)),  "run", []));  // assert_return(() => call($1, "extend8_s", [int64("81_985_529_216_486_656")]), int64("0"))
+run(() => call(instance("\x00\x61\x73\x6d\x01\x00\x00\x00\x01\x89\x80\x80\x80\x00\x02\x60\x00\x00\x60\x01\x7e\x01\x7e\x02\x90\x80\x80\x80\x00\x01\x02\x24\x31\x09\x65\x78\x74\x65\x6e\x64\x38\x5f\x73\x00\x01\x03\x82\x80\x80\x80\x00\x01\x00\x07\x87\x80\x80\x80\x00\x01\x03\x72\x75\x6e\x00\x01\x0a\xa1\x80\x80\x80\x00\x01\x9b\x80\x80\x80\x00\x00\x02\x40\x42\x80\x9a\xaf\xcd\xf8\xac\xd1\x91\x01\x10\x00\x01\x42\x00\x01\x51\x45\x0d\x00\x0f\x0b\x00\x0b", exports("$1", $1)),  "run", []));  // assert_return(() => call($1, "extend8_s", [int64("81_985_529_216_486_656")]), int64("0"))
 
 // i64.wast:276
-// FIXME: implement sign-extension operators
-// https://bugs.webkit.org/show_bug.cgi?id=218990
-// run(() => call(instance("\x00\x61\x73\x6d\x01\x00\x00\x00\x01\x89\x80\x80\x80\x00\x02\x60\x00\x00\x60\x01\x7e\x01\x7e\x02\x90\x80\x80\x80\x00\x01\x02\x24\x31\x09\x65\x78\x74\x65\x6e\x64\x38\x5f\x73\x00\x01\x03\x82\x80\x80\x80\x00\x01\x00\x07\x87\x80\x80\x80\x00\x01\x03\x72\x75\x6e\x00\x01\x0a\xa2\x80\x80\x80\x00\x01\x9c\x80\x80\x80\x00\x00\x02\x40\x42\x80\xe5\xd0\xb2\x87\xd3\xae\xee\x7e\x10\x00\x01\x42\x80\x7f\x01\x51\x45\x0d\x00\x0f\x0b\x00\x0b", exports("$1", $1)),  "run", []));  // assert_return(() => call($1, "extend8_s", [int64("-81_985_529_216_486_784")]), int64("-128"))
+run(() => call(instance("\x00\x61\x73\x6d\x01\x00\x00\x00\x01\x89\x80\x80\x80\x00\x02\x60\x00\x00\x60\x01\x7e\x01\x7e\x02\x90\x80\x80\x80\x00\x01\x02\x24\x31\x09\x65\x78\x74\x65\x6e\x64\x38\x5f\x73\x00\x01\x03\x82\x80\x80\x80\x00\x01\x00\x07\x87\x80\x80\x80\x00\x01\x03\x72\x75\x6e\x00\x01\x0a\xa2\x80\x80\x80\x00\x01\x9c\x80\x80\x80\x00\x00\x02\x40\x42\x80\xe5\xd0\xb2\x87\xd3\xae\xee\x7e\x10\x00\x01\x42\x80\x7f\x01\x51\x45\x0d\x00\x0f\x0b\x00\x0b", exports("$1", $1)),  "run", []));  // assert_return(() => call($1, "extend8_s", [int64("-81_985_529_216_486_784")]), int64("-128"))
 
 // i64.wast:277
-// FIXME: implement sign-extension operators
-// https://bugs.webkit.org/show_bug.cgi?id=218990
-// run(() => call(instance("\x00\x61\x73\x6d\x01\x00\x00\x00\x01\x89\x80\x80\x80\x00\x02\x60\x00\x00\x60\x01\x7e\x01\x7e\x02\x90\x80\x80\x80\x00\x01\x02\x24\x31\x09\x65\x78\x74\x65\x6e\x64\x38\x5f\x73\x00\x01\x03\x82\x80\x80\x80\x00\x01\x00\x07\x87\x80\x80\x80\x00\x01\x03\x72\x75\x6e\x00\x01\x0a\x99\x80\x80\x80\x00\x01\x93\x80\x80\x80\x00\x00\x02\x40\x42\x7f\x10\x00\x01\x42\x7f\x01\x51\x45\x0d\x00\x0f\x0b\x00\x0b", exports("$1", $1)),  "run", []));  // assert_return(() => call($1, "extend8_s", [int64("-1")]), int64("-1"))
+run(() => call(instance("\x00\x61\x73\x6d\x01\x00\x00\x00\x01\x89\x80\x80\x80\x00\x02\x60\x00\x00\x60\x01\x7e\x01\x7e\x02\x90\x80\x80\x80\x00\x01\x02\x24\x31\x09\x65\x78\x74\x65\x6e\x64\x38\x5f\x73\x00\x01\x03\x82\x80\x80\x80\x00\x01\x00\x07\x87\x80\x80\x80\x00\x01\x03\x72\x75\x6e\x00\x01\x0a\x99\x80\x80\x80\x00\x01\x93\x80\x80\x80\x00\x00\x02\x40\x42\x7f\x10\x00\x01\x42\x7f\x01\x51\x45\x0d\x00\x0f\x0b\x00\x0b", exports("$1", $1)),  "run", []));  // assert_return(() => call($1, "extend8_s", [int64("-1")]), int64("-1"))
 
 // i64.wast:279
-// FIXME: implement sign-extension operators
-// https://bugs.webkit.org/show_bug.cgi?id=218990
-// run(() => call(instance("\x00\x61\x73\x6d\x01\x00\x00\x00\x01\x89\x80\x80\x80\x00\x02\x60\x00\x00\x60\x01\x7e\x01\x7e\x02\x91\x80\x80\x80\x00\x01\x02\x24\x31\x0a\x65\x78\x74\x65\x6e\x64\x31\x36\x5f\x73\x00\x01\x03\x82\x80\x80\x80\x00\x01\x00\x07\x87\x80\x80\x80\x00\x01\x03\x72\x75\x6e\x00\x01\x0a\x99\x80\x80\x80\x00\x01\x93\x80\x80\x80\x00\x00\x02\x40\x42\x00\x10\x00\x01\x42\x00\x01\x51\x45\x0d\x00\x0f\x0b\x00\x0b", exports("$1", $1)),  "run", []));  // assert_return(() => call($1, "extend16_s", [int64("0")]), int64("0"))
+run(() => call(instance("\x00\x61\x73\x6d\x01\x00\x00\x00\x01\x89\x80\x80\x80\x00\x02\x60\x00\x00\x60\x01\x7e\x01\x7e\x02\x91\x80\x80\x80\x00\x01\x02\x24\x31\x0a\x65\x78\x74\x65\x6e\x64\x31\x36\x5f\x73\x00\x01\x03\x82\x80\x80\x80\x00\x01\x00\x07\x87\x80\x80\x80\x00\x01\x03\x72\x75\x6e\x00\x01\x0a\x99\x80\x80\x80\x00\x01\x93\x80\x80\x80\x00\x00\x02\x40\x42\x00\x10\x00\x01\x42\x00\x01\x51\x45\x0d\x00\x0f\x0b\x00\x0b", exports("$1", $1)),  "run", []));  // assert_return(() => call($1, "extend16_s", [int64("0")]), int64("0"))
 
 // i64.wast:280
-// FIXME: implement sign-extension operators
-// https://bugs.webkit.org/show_bug.cgi?id=218990
-// run(() => call(instance("\x00\x61\x73\x6d\x01\x00\x00\x00\x01\x89\x80\x80\x80\x00\x02\x60\x00\x00\x60\x01\x7e\x01\x7e\x02\x91\x80\x80\x80\x00\x01\x02\x24\x31\x0a\x65\x78\x74\x65\x6e\x64\x31\x36\x5f\x73\x00\x01\x03\x82\x80\x80\x80\x00\x01\x00\x07\x87\x80\x80\x80\x00\x01\x03\x72\x75\x6e\x00\x01\x0a\x9d\x80\x80\x80\x00\x01\x97\x80\x80\x80\x00\x00\x02\x40\x42\xff\xff\x01\x10\x00\x01\x42\xff\xff\x01\x01\x51\x45\x0d\x00\x0f\x0b\x00\x0b", exports("$1", $1)),  "run", []));  // assert_return(() => call($1, "extend16_s", [int64("32_767")]), int64("32_767"))
+run(() => call(instance("\x00\x61\x73\x6d\x01\x00\x00\x00\x01\x89\x80\x80\x80\x00\x02\x60\x00\x00\x60\x01\x7e\x01\x7e\x02\x91\x80\x80\x80\x00\x01\x02\x24\x31\x0a\x65\x78\x74\x65\x6e\x64\x31\x36\x5f\x73\x00\x01\x03\x82\x80\x80\x80\x00\x01\x00\x07\x87\x80\x80\x80\x00\x01\x03\x72\x75\x6e\x00\x01\x0a\x9d\x80\x80\x80\x00\x01\x97\x80\x80\x80\x00\x00\x02\x40\x42\xff\xff\x01\x10\x00\x01\x42\xff\xff\x01\x01\x51\x45\x0d\x00\x0f\x0b\x00\x0b", exports("$1", $1)),  "run", []));  // assert_return(() => call($1, "extend16_s", [int64("32_767")]), int64("32_767"))
 
 // i64.wast:281
-// FIXME: implement sign-extension operators
-// https://bugs.webkit.org/show_bug.cgi?id=218990
-// run(() => call(instance("\x00\x61\x73\x6d\x01\x00\x00\x00\x01\x89\x80\x80\x80\x00\x02\x60\x00\x00\x60\x01\x7e\x01\x7e\x02\x91\x80\x80\x80\x00\x01\x02\x24\x31\x0a\x65\x78\x74\x65\x6e\x64\x31\x36\x5f\x73\x00\x01\x03\x82\x80\x80\x80\x00\x01\x00\x07\x87\x80\x80\x80\x00\x01\x03\x72\x75\x6e\x00\x01\x0a\x9d\x80\x80\x80\x00\x01\x97\x80\x80\x80\x00\x00\x02\x40\x42\x80\x80\x02\x10\x00\x01\x42\x80\x80\x7e\x01\x51\x45\x0d\x00\x0f\x0b\x00\x0b", exports("$1", $1)),  "run", []));  // assert_return(() => call($1, "extend16_s", [int64("32_768")]), int64("-32_768"))
+run(() => call(instance("\x00\x61\x73\x6d\x01\x00\x00\x00\x01\x89\x80\x80\x80\x00\x02\x60\x00\x00\x60\x01\x7e\x01\x7e\x02\x91\x80\x80\x80\x00\x01\x02\x24\x31\x0a\x65\x78\x74\x65\x6e\x64\x31\x36\x5f\x73\x00\x01\x03\x82\x80\x80\x80\x00\x01\x00\x07\x87\x80\x80\x80\x00\x01\x03\x72\x75\x6e\x00\x01\x0a\x9d\x80\x80\x80\x00\x01\x97\x80\x80\x80\x00\x00\x02\x40\x42\x80\x80\x02\x10\x00\x01\x42\x80\x80\x7e\x01\x51\x45\x0d\x00\x0f\x0b\x00\x0b", exports("$1", $1)),  "run", []));  // assert_return(() => call($1, "extend16_s", [int64("32_768")]), int64("-32_768"))
 
 // i64.wast:282
-// FIXME: implement sign-extension operators
-// https://bugs.webkit.org/show_bug.cgi?id=218990
-// run(() => call(instance("\x00\x61\x73\x6d\x01\x00\x00\x00\x01\x89\x80\x80\x80\x00\x02\x60\x00\x00\x60\x01\x7e\x01\x7e\x02\x91\x80\x80\x80\x00\x01\x02\x24\x31\x0a\x65\x78\x74\x65\x6e\x64\x31\x36\x5f\x73\x00\x01\x03\x82\x80\x80\x80\x00\x01\x00\x07\x87\x80\x80\x80\x00\x01\x03\x72\x75\x6e\x00\x01\x0a\x9b\x80\x80\x80\x00\x01\x95\x80\x80\x80\x00\x00\x02\x40\x42\xff\xff\x03\x10\x00\x01\x42\x7f\x01\x51\x45\x0d\x00\x0f\x0b\x00\x0b", exports("$1", $1)),  "run", []));  // assert_return(() => call($1, "extend16_s", [int64("65_535")]), int64("-1"))
+run(() => call(instance("\x00\x61\x73\x6d\x01\x00\x00\x00\x01\x89\x80\x80\x80\x00\x02\x60\x00\x00\x60\x01\x7e\x01\x7e\x02\x91\x80\x80\x80\x00\x01\x02\x24\x31\x0a\x65\x78\x74\x65\x6e\x64\x31\x36\x5f\x73\x00\x01\x03\x82\x80\x80\x80\x00\x01\x00\x07\x87\x80\x80\x80\x00\x01\x03\x72\x75\x6e\x00\x01\x0a\x9b\x80\x80\x80\x00\x01\x95\x80\x80\x80\x00\x00\x02\x40\x42\xff\xff\x03\x10\x00\x01\x42\x7f\x01\x51\x45\x0d\x00\x0f\x0b\x00\x0b", exports("$1", $1)),  "run", []));  // assert_return(() => call($1, "extend16_s", [int64("65_535")]), int64("-1"))
 
 // i64.wast:283
-// FIXME: implement sign-extension operators
-// https://bugs.webkit.org/show_bug.cgi?id=218990
-// run(() => call(instance("\x00\x61\x73\x6d\x01\x00\x00\x00\x01\x89\x80\x80\x80\x00\x02\x60\x00\x00\x60\x01\x7e\x01\x7e\x02\x91\x80\x80\x80\x00\x01\x02\x24\x31\x0a\x65\x78\x74\x65\x6e\x64\x31\x36\x5f\x73\x00\x01\x03\x82\x80\x80\x80\x00\x01\x00\x07\x87\x80\x80\x80\x00\x01\x03\x72\x75\x6e\x00\x01\x0a\xa1\x80\x80\x80\x00\x01\x9b\x80\x80\x80\x00\x00\x02\x40\x42\x80\x80\xf0\xd5\x89\xcf\x95\x9a\x12\x10\x00\x01\x42\x00\x01\x51\x45\x0d\x00\x0f\x0b\x00\x0b", exports("$1", $1)),  "run", []));  // assert_return(() => call($1, "extend16_s", [int64("1_311_768_467_463_733_248")]), int64("0"))
+run(() => call(instance("\x00\x61\x73\x6d\x01\x00\x00\x00\x01\x89\x80\x80\x80\x00\x02\x60\x00\x00\x60\x01\x7e\x01\x7e\x02\x91\x80\x80\x80\x00\x01\x02\x24\x31\x0a\x65\x78\x74\x65\x6e\x64\x31\x36\x5f\x73\x00\x01\x03\x82\x80\x80\x80\x00\x01\x00\x07\x87\x80\x80\x80\x00\x01\x03\x72\x75\x6e\x00\x01\x0a\xa1\x80\x80\x80\x00\x01\x9b\x80\x80\x80\x00\x00\x02\x40\x42\x80\x80\xf0\xd5\x89\xcf\x95\x9a\x12\x10\x00\x01\x42\x00\x01\x51\x45\x0d\x00\x0f\x0b\x00\x0b", exports("$1", $1)),  "run", []));  // assert_return(() => call($1, "extend16_s", [int64("1_311_768_467_463_733_248")]), int64("0"))
 
 // i64.wast:284
-// FIXME: implement sign-extension operators
-// https://bugs.webkit.org/show_bug.cgi?id=218990
-// run(() => call(instance("\x00\x61\x73\x6d\x01\x00\x00\x00\x01\x89\x80\x80\x80\x00\x02\x60\x00\x00\x60\x01\x7e\x01\x7e\x02\x91\x80\x80\x80\x00\x01\x02\x24\x31\x0a\x65\x78\x74\x65\x6e\x64\x31\x36\x5f\x73\x00\x01\x03\x82\x80\x80\x80\x00\x01\x00\x07\x87\x80\x80\x80\x00\x01\x03\x72\x75\x6e\x00\x01\x0a\xa3\x80\x80\x80\x00\x01\x9d\x80\x80\x80\x00\x00\x02\x40\x42\x80\x80\xd2\xb2\x87\xd3\xae\xee\x7e\x10\x00\x01\x42\x80\x80\x7e\x01\x51\x45\x0d\x00\x0f\x0b\x00\x0b", exports("$1", $1)),  "run", []));  // assert_return(() => call($1, "extend16_s", [int64("-81_985_529_216_466_944")]), int64("-32_768"))
+run(() => call(instance("\x00\x61\x73\x6d\x01\x00\x00\x00\x01\x89\x80\x80\x80\x00\x02\x60\x00\x00\x60\x01\x7e\x01\x7e\x02\x91\x80\x80\x80\x00\x01\x02\x24\x31\x0a\x65\x78\x74\x65\x6e\x64\x31\x36\x5f\x73\x00\x01\x03\x82\x80\x80\x80\x00\x01\x00\x07\x87\x80\x80\x80\x00\x01\x03\x72\x75\x6e\x00\x01\x0a\xa3\x80\x80\x80\x00\x01\x9d\x80\x80\x80\x00\x00\x02\x40\x42\x80\x80\xd2\xb2\x87\xd3\xae\xee\x7e\x10\x00\x01\x42\x80\x80\x7e\x01\x51\x45\x0d\x00\x0f\x0b\x00\x0b", exports("$1", $1)),  "run", []));  // assert_return(() => call($1, "extend16_s", [int64("-81_985_529_216_466_944")]), int64("-32_768"))
 
 // i64.wast:285
-// FIXME: implement sign-extension operators
-// https://bugs.webkit.org/show_bug.cgi?id=218990
-// run(() => call(instance("\x00\x61\x73\x6d\x01\x00\x00\x00\x01\x89\x80\x80\x80\x00\x02\x60\x00\x00\x60\x01\x7e\x01\x7e\x02\x91\x80\x80\x80\x00\x01\x02\x24\x31\x0a\x65\x78\x74\x65\x6e\x64\x31\x36\x5f\x73\x00\x01\x03\x82\x80\x80\x80\x00\x01\x00\x07\x87\x80\x80\x80\x00\x01\x03\x72\x75\x6e\x00\x01\x0a\x99\x80\x80\x80\x00\x01\x93\x80\x80\x80\x00\x00\x02\x40\x42\x7f\x10\x00\x01\x42\x7f\x01\x51\x45\x0d\x00\x0f\x0b\x00\x0b", exports("$1", $1)),  "run", []));  // assert_return(() => call($1, "extend16_s", [int64("-1")]), int64("-1"))
+run(() => call(instance("\x00\x61\x73\x6d\x01\x00\x00\x00\x01\x89\x80\x80\x80\x00\x02\x60\x00\x00\x60\x01\x7e\x01\x7e\x02\x91\x80\x80\x80\x00\x01\x02\x24\x31\x0a\x65\x78\x74\x65\x6e\x64\x31\x36\x5f\x73\x00\x01\x03\x82\x80\x80\x80\x00\x01\x00\x07\x87\x80\x80\x80\x00\x01\x03\x72\x75\x6e\x00\x01\x0a\x99\x80\x80\x80\x00\x01\x93\x80\x80\x80\x00\x00\x02\x40\x42\x7f\x10\x00\x01\x42\x7f\x01\x51\x45\x0d\x00\x0f\x0b\x00\x0b", exports("$1", $1)),  "run", []));  // assert_return(() => call($1, "extend16_s", [int64("-1")]), int64("-1"))
 
 // i64.wast:287
-// FIXME: implement sign-extension operators
-// https://bugs.webkit.org/show_bug.cgi?id=218990
-// run(() => call(instance("\x00\x61\x73\x6d\x01\x00\x00\x00\x01\x89\x80\x80\x80\x00\x02\x60\x00\x00\x60\x01\x7e\x01\x7e\x02\x91\x80\x80\x80\x00\x01\x02\x24\x31\x0a\x65\x78\x74\x65\x6e\x64\x33\x32\x5f\x73\x00\x01\x03\x82\x80\x80\x80\x00\x01\x00\x07\x87\x80\x80\x80\x00\x01\x03\x72\x75\x6e\x00\x01\x0a\x99\x80\x80\x80\x00\x01\x93\x80\x80\x80\x00\x00\x02\x40\x42\x00\x10\x00\x01\x42\x00\x01\x51\x45\x0d\x00\x0f\x0b\x00\x0b", exports("$1", $1)),  "run", []));  // assert_return(() => call($1, "extend32_s", [int64("0")]), int64("0"))
+run(() => call(instance("\x00\x61\x73\x6d\x01\x00\x00\x00\x01\x89\x80\x80\x80\x00\x02\x60\x00\x00\x60\x01\x7e\x01\x7e\x02\x91\x80\x80\x80\x00\x01\x02\x24\x31\x0a\x65\x78\x74\x65\x6e\x64\x33\x32\x5f\x73\x00\x01\x03\x82\x80\x80\x80\x00\x01\x00\x07\x87\x80\x80\x80\x00\x01\x03\x72\x75\x6e\x00\x01\x0a\x99\x80\x80\x80\x00\x01\x93\x80\x80\x80\x00\x00\x02\x40\x42\x00\x10\x00\x01\x42\x00\x01\x51\x45\x0d\x00\x0f\x0b\x00\x0b", exports("$1", $1)),  "run", []));  // assert_return(() => call($1, "extend32_s", [int64("0")]), int64("0"))
 
 // i64.wast:288
-// FIXME: implement sign-extension operators
-// https://bugs.webkit.org/show_bug.cgi?id=218990
-// run(() => call(instance("\x00\x61\x73\x6d\x01\x00\x00\x00\x01\x89\x80\x80\x80\x00\x02\x60\x00\x00\x60\x01\x7e\x01\x7e\x02\x91\x80\x80\x80\x00\x01\x02\x24\x31\x0a\x65\x78\x74\x65\x6e\x64\x33\x32\x5f\x73\x00\x01\x03\x82\x80\x80\x80\x00\x01\x00\x07\x87\x80\x80\x80\x00\x01\x03\x72\x75\x6e\x00\x01\x0a\x9d\x80\x80\x80\x00\x01\x97\x80\x80\x80\x00\x00\x02\x40\x42\xff\xff\x01\x10\x00\x01\x42\xff\xff\x01\x01\x51\x45\x0d\x00\x0f\x0b\x00\x0b", exports("$1", $1)),  "run", []));  // assert_return(() => call($1, "extend32_s", [int64("32_767")]), int64("32_767"))
+run(() => call(instance("\x00\x61\x73\x6d\x01\x00\x00\x00\x01\x89\x80\x80\x80\x00\x02\x60\x00\x00\x60\x01\x7e\x01\x7e\x02\x91\x80\x80\x80\x00\x01\x02\x24\x31\x0a\x65\x78\x74\x65\x6e\x64\x33\x32\x5f\x73\x00\x01\x03\x82\x80\x80\x80\x00\x01\x00\x07\x87\x80\x80\x80\x00\x01\x03\x72\x75\x6e\x00\x01\x0a\x9d\x80\x80\x80\x00\x01\x97\x80\x80\x80\x00\x00\x02\x40\x42\xff\xff\x01\x10\x00\x01\x42\xff\xff\x01\x01\x51\x45\x0d\x00\x0f\x0b\x00\x0b", exports("$1", $1)),  "run", []));  // assert_return(() => call($1, "extend32_s", [int64("32_767")]), int64("32_767"))
 
 // i64.wast:289
-// FIXME: implement sign-extension operators
-// https://bugs.webkit.org/show_bug.cgi?id=218990
-// run(() => call(instance("\x00\x61\x73\x6d\x01\x00\x00\x00\x01\x89\x80\x80\x80\x00\x02\x60\x00\x00\x60\x01\x7e\x01\x7e\x02\x91\x80\x80\x80\x00\x01\x02\x24\x31\x0a\x65\x78\x74\x65\x6e\x64\x33\x32\x5f\x73\x00\x01\x03\x82\x80\x80\x80\x00\x01\x00\x07\x87\x80\x80\x80\x00\x01\x03\x72\x75\x6e\x00\x01\x0a\x9d\x80\x80\x80\x00\x01\x97\x80\x80\x80\x00\x00\x02\x40\x42\x80\x80\x02\x10\x00\x01\x42\x80\x80\x02\x01\x51\x45\x0d\x00\x0f\x0b\x00\x0b", exports("$1", $1)),  "run", []));  // assert_return(() => call($1, "extend32_s", [int64("32_768")]), int64("32_768"))
+run(() => call(instance("\x00\x61\x73\x6d\x01\x00\x00\x00\x01\x89\x80\x80\x80\x00\x02\x60\x00\x00\x60\x01\x7e\x01\x7e\x02\x91\x80\x80\x80\x00\x01\x02\x24\x31\x0a\x65\x78\x74\x65\x6e\x64\x33\x32\x5f\x73\x00\x01\x03\x82\x80\x80\x80\x00\x01\x00\x07\x87\x80\x80\x80\x00\x01\x03\x72\x75\x6e\x00\x01\x0a\x9d\x80\x80\x80\x00\x01\x97\x80\x80\x80\x00\x00\x02\x40\x42\x80\x80\x02\x10\x00\x01\x42\x80\x80\x02\x01\x51\x45\x0d\x00\x0f\x0b\x00\x0b", exports("$1", $1)),  "run", []));  // assert_return(() => call($1, "extend32_s", [int64("32_768")]), int64("32_768"))
 
 // i64.wast:290
-// FIXME: implement sign-extension operators
-// https://bugs.webkit.org/show_bug.cgi?id=218990
-// run(() => call(instance("\x00\x61\x73\x6d\x01\x00\x00\x00\x01\x89\x80\x80\x80\x00\x02\x60\x00\x00\x60\x01\x7e\x01\x7e\x02\x91\x80\x80\x80\x00\x01\x02\x24\x31\x0a\x65\x78\x74\x65\x6e\x64\x33\x32\x5f\x73\x00\x01\x03\x82\x80\x80\x80\x00\x01\x00\x07\x87\x80\x80\x80\x00\x01\x03\x72\x75\x6e\x00\x01\x0a\x9d\x80\x80\x80\x00\x01\x97\x80\x80\x80\x00\x00\x02\x40\x42\xff\xff\x03\x10\x00\x01\x42\xff\xff\x03\x01\x51\x45\x0d\x00\x0f\x0b\x00\x0b", exports("$1", $1)),  "run", []));  // assert_return(() => call($1, "extend32_s", [int64("65_535")]), int64("65_535"))
+run(() => call(instance("\x00\x61\x73\x6d\x01\x00\x00\x00\x01\x89\x80\x80\x80\x00\x02\x60\x00\x00\x60\x01\x7e\x01\x7e\x02\x91\x80\x80\x80\x00\x01\x02\x24\x31\x0a\x65\x78\x74\x65\x6e\x64\x33\x32\x5f\x73\x00\x01\x03\x82\x80\x80\x80\x00\x01\x00\x07\x87\x80\x80\x80\x00\x01\x03\x72\x75\x6e\x00\x01\x0a\x9d\x80\x80\x80\x00\x01\x97\x80\x80\x80\x00\x00\x02\x40\x42\xff\xff\x03\x10\x00\x01\x42\xff\xff\x03\x01\x51\x45\x0d\x00\x0f\x0b\x00\x0b", exports("$1", $1)),  "run", []));  // assert_return(() => call($1, "extend32_s", [int64("65_535")]), int64("65_535"))
 
 // i64.wast:291
-// FIXME: implement sign-extension operators
-// https://bugs.webkit.org/show_bug.cgi?id=218990
-// run(() => call(instance("\x00\x61\x73\x6d\x01\x00\x00\x00\x01\x89\x80\x80\x80\x00\x02\x60\x00\x00\x60\x01\x7e\x01\x7e\x02\x91\x80\x80\x80\x00\x01\x02\x24\x31\x0a\x65\x78\x74\x65\x6e\x64\x33\x32\x5f\x73\x00\x01\x03\x82\x80\x80\x80\x00\x01\x00\x07\x87\x80\x80\x80\x00\x01\x03\x72\x75\x6e\x00\x01\x0a\xa1\x80\x80\x80\x00\x01\x9b\x80\x80\x80\x00\x00\x02\x40\x42\xff\xff\xff\xff\x07\x10\x00\x01\x42\xff\xff\xff\xff\x07\x01\x51\x45\x0d\x00\x0f\x0b\x00\x0b", exports("$1", $1)),  "run", []));  // assert_return(() => call($1, "extend32_s", [int64("2_147_483_647")]), int64("2_147_483_647"))
+run(() => call(instance("\x00\x61\x73\x6d\x01\x00\x00\x00\x01\x89\x80\x80\x80\x00\x02\x60\x00\x00\x60\x01\x7e\x01\x7e\x02\x91\x80\x80\x80\x00\x01\x02\x24\x31\x0a\x65\x78\x74\x65\x6e\x64\x33\x32\x5f\x73\x00\x01\x03\x82\x80\x80\x80\x00\x01\x00\x07\x87\x80\x80\x80\x00\x01\x03\x72\x75\x6e\x00\x01\x0a\xa1\x80\x80\x80\x00\x01\x9b\x80\x80\x80\x00\x00\x02\x40\x42\xff\xff\xff\xff\x07\x10\x00\x01\x42\xff\xff\xff\xff\x07\x01\x51\x45\x0d\x00\x0f\x0b\x00\x0b", exports("$1", $1)),  "run", []));  // assert_return(() => call($1, "extend32_s", [int64("2_147_483_647")]), int64("2_147_483_647"))
 
 // i64.wast:292
-// FIXME: implement sign-extension operators
-// https://bugs.webkit.org/show_bug.cgi?id=218990
-// run(() => call(instance("\x00\x61\x73\x6d\x01\x00\x00\x00\x01\x89\x80\x80\x80\x00\x02\x60\x00\x00\x60\x01\x7e\x01\x7e\x02\x91\x80\x80\x80\x00\x01\x02\x24\x31\x0a\x65\x78\x74\x65\x6e\x64\x33\x32\x5f\x73\x00\x01\x03\x82\x80\x80\x80\x00\x01\x00\x07\x87\x80\x80\x80\x00\x01\x03\x72\x75\x6e\x00\x01\x0a\xa1\x80\x80\x80\x00\x01\x9b\x80\x80\x80\x00\x00\x02\x40\x42\x80\x80\x80\x80\x08\x10\x00\x01\x42\x80\x80\x80\x80\x78\x01\x51\x45\x0d\x00\x0f\x0b\x00\x0b", exports("$1", $1)),  "run", []));  // assert_return(() => call($1, "extend32_s", [int64("2_147_483_648")]), int64("-2_147_483_648"))
+run(() => call(instance("\x00\x61\x73\x6d\x01\x00\x00\x00\x01\x89\x80\x80\x80\x00\x02\x60\x00\x00\x60\x01\x7e\x01\x7e\x02\x91\x80\x80\x80\x00\x01\x02\x24\x31\x0a\x65\x78\x74\x65\x6e\x64\x33\x32\x5f\x73\x00\x01\x03\x82\x80\x80\x80\x00\x01\x00\x07\x87\x80\x80\x80\x00\x01\x03\x72\x75\x6e\x00\x01\x0a\xa1\x80\x80\x80\x00\x01\x9b\x80\x80\x80\x00\x00\x02\x40\x42\x80\x80\x80\x80\x08\x10\x00\x01\x42\x80\x80\x80\x80\x78\x01\x51\x45\x0d\x00\x0f\x0b\x00\x0b", exports("$1", $1)),  "run", []));  // assert_return(() => call($1, "extend32_s", [int64("2_147_483_648")]), int64("-2_147_483_648"))
 
 // i64.wast:293
-// FIXME: implement sign-extension operators
-// https://bugs.webkit.org/show_bug.cgi?id=218990
-// run(() => call(instance("\x00\x61\x73\x6d\x01\x00\x00\x00\x01\x89\x80\x80\x80\x00\x02\x60\x00\x00\x60\x01\x7e\x01\x7e\x02\x91\x80\x80\x80\x00\x01\x02\x24\x31\x0a\x65\x78\x74\x65\x6e\x64\x33\x32\x5f\x73\x00\x01\x03\x82\x80\x80\x80\x00\x01\x00\x07\x87\x80\x80\x80\x00\x01\x03\x72\x75\x6e\x00\x01\x0a\x9d\x80\x80\x80\x00\x01\x97\x80\x80\x80\x00\x00\x02\x40\x42\xff\xff\xff\xff\x0f\x10\x00\x01\x42\x7f\x01\x51\x45\x0d\x00\x0f\x0b\x00\x0b", exports("$1", $1)),  "run", []));  // assert_return(() => call($1, "extend32_s", [int64("4_294_967_295")]), int64("-1"))
+run(() => call(instance("\x00\x61\x73\x6d\x01\x00\x00\x00\x01\x89\x80\x80\x80\x00\x02\x60\x00\x00\x60\x01\x7e\x01\x7e\x02\x91\x80\x80\x80\x00\x01\x02\x24\x31\x0a\x65\x78\x74\x65\x6e\x64\x33\x32\x5f\x73\x00\x01\x03\x82\x80\x80\x80\x00\x01\x00\x07\x87\x80\x80\x80\x00\x01\x03\x72\x75\x6e\x00\x01\x0a\x9d\x80\x80\x80\x00\x01\x97\x80\x80\x80\x00\x00\x02\x40\x42\xff\xff\xff\xff\x0f\x10\x00\x01\x42\x7f\x01\x51\x45\x0d\x00\x0f\x0b\x00\x0b", exports("$1", $1)),  "run", []));  // assert_return(() => call($1, "extend32_s", [int64("4_294_967_295")]), int64("-1"))
 
 // i64.wast:294
-// FIXME: implement sign-extension operators
-// https://bugs.webkit.org/show_bug.cgi?id=218990
-// run(() => call(instance("\x00\x61\x73\x6d\x01\x00\x00\x00\x01\x89\x80\x80\x80\x00\x02\x60\x00\x00\x60\x01\x7e\x01\x7e\x02\x91\x80\x80\x80\x00\x01\x02\x24\x31\x0a\x65\x78\x74\x65\x6e\x64\x33\x32\x5f\x73\x00\x01\x03\x82\x80\x80\x80\x00\x01\x00\x07\x87\x80\x80\x80\x00\x01\x03\x72\x75\x6e\x00\x01\x0a\xa1\x80\x80\x80\x00\x01\x9b\x80\x80\x80\x00\x00\x02\x40\x42\x80\x80\x80\x80\xf0\xac\xd1\x91\x01\x10\x00\x01\x42\x00\x01\x51\x45\x0d\x00\x0f\x0b\x00\x0b", exports("$1", $1)),  "run", []));  // assert_return(() => call($1, "extend32_s", [int64("81_985_526_906_748_928")]), int64("0"))
+run(() => call(instance("\x00\x61\x73\x6d\x01\x00\x00\x00\x01\x89\x80\x80\x80\x00\x02\x60\x00\x00\x60\x01\x7e\x01\x7e\x02\x91\x80\x80\x80\x00\x01\x02\x24\x31\x0a\x65\x78\x74\x65\x6e\x64\x33\x32\x5f\x73\x00\x01\x03\x82\x80\x80\x80\x00\x01\x00\x07\x87\x80\x80\x80\x00\x01\x03\x72\x75\x6e\x00\x01\x0a\xa1\x80\x80\x80\x00\x01\x9b\x80\x80\x80\x00\x00\x02\x40\x42\x80\x80\x80\x80\xf0\xac\xd1\x91\x01\x10\x00\x01\x42\x00\x01\x51\x45\x0d\x00\x0f\x0b\x00\x0b", exports("$1", $1)),  "run", []));  // assert_return(() => call($1, "extend32_s", [int64("81_985_526_906_748_928")]), int64("0"))
 
 // i64.wast:295
-// FIXME: implement sign-extension operators
-// https://bugs.webkit.org/show_bug.cgi?id=218990
-// run(() => call(instance("\x00\x61\x73\x6d\x01\x00\x00\x00\x01\x89\x80\x80\x80\x00\x02\x60\x00\x00\x60\x01\x7e\x01\x7e\x02\x91\x80\x80\x80\x00\x01\x02\x24\x31\x0a\x65\x78\x74\x65\x6e\x64\x33\x32\x5f\x73\x00\x01\x03\x82\x80\x80\x80\x00\x01\x00\x07\x87\x80\x80\x80\x00\x01\x03\x72\x75\x6e\x00\x01\x0a\xa5\x80\x80\x80\x00\x01\x9f\x80\x80\x80\x00\x00\x02\x40\x42\x80\x80\x80\x80\x88\xd3\xae\xee\x7e\x10\x00\x01\x42\x80\x80\x80\x80\x78\x01\x51\x45\x0d\x00\x0f\x0b\x00\x0b", exports("$1", $1)),  "run", []));  // assert_return(() => call($1, "extend32_s", [int64("-81_985_529_054_232_576")]), int64("-2_147_483_648"))
+run(() => call(instance("\x00\x61\x73\x6d\x01\x00\x00\x00\x01\x89\x80\x80\x80\x00\x02\x60\x00\x00\x60\x01\x7e\x01\x7e\x02\x91\x80\x80\x80\x00\x01\x02\x24\x31\x0a\x65\x78\x74\x65\x6e\x64\x33\x32\x5f\x73\x00\x01\x03\x82\x80\x80\x80\x00\x01\x00\x07\x87\x80\x80\x80\x00\x01\x03\x72\x75\x6e\x00\x01\x0a\xa5\x80\x80\x80\x00\x01\x9f\x80\x80\x80\x00\x00\x02\x40\x42\x80\x80\x80\x80\x88\xd3\xae\xee\x7e\x10\x00\x01\x42\x80\x80\x80\x80\x78\x01\x51\x45\x0d\x00\x0f\x0b\x00\x0b", exports("$1", $1)),  "run", []));  // assert_return(() => call($1, "extend32_s", [int64("-81_985_529_054_232_576")]), int64("-2_147_483_648"))
 
 // i64.wast:296
-// FIXME: implement sign-extension operators
-// https://bugs.webkit.org/show_bug.cgi?id=218990
-// run(() => call(instance("\x00\x61\x73\x6d\x01\x00\x00\x00\x01\x89\x80\x80\x80\x00\x02\x60\x00\x00\x60\x01\x7e\x01\x7e\x02\x91\x80\x80\x80\x00\x01\x02\x24\x31\x0a\x65\x78\x74\x65\x6e\x64\x33\x32\x5f\x73\x00\x01\x03\x82\x80\x80\x80\x00\x01\x00\x07\x87\x80\x80\x80\x00\x01\x03\x72\x75\x6e\x00\x01\x0a\x99\x80\x80\x80\x00\x01\x93\x80\x80\x80\x00\x00\x02\x40\x42\x7f\x10\x00\x01\x42\x7f\x01\x51\x45\x0d\x00\x0f\x0b\x00\x0b", exports("$1", $1)),  "run", []));  // assert_return(() => call($1, "extend32_s", [int64("-1")]), int64("-1"))
+run(() => call(instance("\x00\x61\x73\x6d\x01\x00\x00\x00\x01\x89\x80\x80\x80\x00\x02\x60\x00\x00\x60\x01\x7e\x01\x7e\x02\x91\x80\x80\x80\x00\x01\x02\x24\x31\x0a\x65\x78\x74\x65\x6e\x64\x33\x32\x5f\x73\x00\x01\x03\x82\x80\x80\x80\x00\x01\x00\x07\x87\x80\x80\x80\x00\x01\x03\x72\x75\x6e\x00\x01\x0a\x99\x80\x80\x80\x00\x01\x93\x80\x80\x80\x00\x00\x02\x40\x42\x7f\x10\x00\x01\x42\x7f\x01\x51\x45\x0d\x00\x0f\x0b\x00\x0b", exports("$1", $1)),  "run", []));  // assert_return(() => call($1, "extend32_s", [int64("-1")]), int64("-1"))
 
 // i64.wast:298
-// FIXME: implement sign-extension operators
-// https://bugs.webkit.org/show_bug.cgi?id=218990
-// run(() => call(instance("\x00\x61\x73\x6d\x01\x00\x00\x00\x01\x89\x80\x80\x80\x00\x02\x60\x00\x00\x60\x01\x7e\x01\x7f\x02\x8a\x80\x80\x80\x00\x01\x02\x24\x31\x03\x65\x71\x7a\x00\x01\x03\x82\x80\x80\x80\x00\x01\x00\x07\x87\x80\x80\x80\x00\x01\x03\x72\x75\x6e\x00\x01\x0a\x99\x80\x80\x80\x00\x01\x93\x80\x80\x80\x00\x00\x02\x40\x42\x00\x10\x00\x01\x41\x01\x01\x46\x45\x0d\x00\x0f\x0b\x00\x0b", exports("$1", $1)),  "run", []));  // assert_return(() => call($1, "eqz", [int64("0")]), 1)
+run(() => call(instance("\x00\x61\x73\x6d\x01\x00\x00\x00\x01\x89\x80\x80\x80\x00\x02\x60\x00\x00\x60\x01\x7e\x01\x7f\x02\x8a\x80\x80\x80\x00\x01\x02\x24\x31\x03\x65\x71\x7a\x00\x01\x03\x82\x80\x80\x80\x00\x01\x00\x07\x87\x80\x80\x80\x00\x01\x03\x72\x75\x6e\x00\x01\x0a\x99\x80\x80\x80\x00\x01\x93\x80\x80\x80\x00\x00\x02\x40\x42\x00\x10\x00\x01\x41\x01\x01\x46\x45\x0d\x00\x0f\x0b\x00\x0b", exports("$1", $1)),  "run", []));  // assert_return(() => call($1, "eqz", [int64("0")]), 1)
 
 // i64.wast:299
 run(() => call(instance("\x00\x61\x73\x6d\x01\x00\x00\x00\x01\x89\x80\x80\x80\x00\x02\x60\x00\x00\x60\x01\x7e\x01\x7f\x02\x8a\x80\x80\x80\x00\x01\x02\x24\x31\x03\x65\x71\x7a\x00\x01\x03\x82\x80\x80\x80\x00\x01\x00\x07\x87\x80\x80\x80\x00\x01\x03\x72\x75\x6e\x00\x01\x0a\x99\x80\x80\x80\x00\x01\x93\x80\x80\x80\x00\x00\x02\x40\x42\x01\x10\x00\x01\x41\x00\x01\x46\x45\x0d\x00\x0f\x0b\x00\x0b", exports("$1", $1)),  "run", []));  // assert_return(() => call($1, "eqz", [int64("1")]), 0)

Modified: trunk/JSTests/wasm/wasm.json (270264 => 270265)


--- trunk/JSTests/wasm/wasm.json	2020-11-30 21:49:30 UTC (rev 270264)
+++ trunk/JSTests/wasm/wasm.json	2020-11-30 22:12:02 UTC (rev 270265)
@@ -224,6 +224,9 @@
         "i64.reinterpret/f64": { "category": "conversion", "value": 189, "return": ["i64"],                          "parameter": ["f64"],                        "immediate": [], "b3op": "BitwiseCast"  },
         "i32.extend8_s":       { "category": "conversion", "value": 192, "return": ["i32"],                          "parameter": ["i32"],                        "immediate": [], "b3op": "SExt8"        },
         "i32.extend16_s":      { "category": "conversion", "value": 193, "return": ["i32"],                          "parameter": ["i32"],                        "immediate": [], "b3op": "SExt16"       },
+        "i64.extend8_s":       { "category": "conversion", "value": 194, "return": ["i64"],                          "parameter": ["i64"],                        "immediate": [], "b3op": "SExt32(SExt8(Trunc(@0)))"  },
+        "i64.extend16_s":      { "category": "conversion", "value": 195, "return": ["i64"],                          "parameter": ["i64"],                        "immediate": [], "b3op": "SExt32(SExt16(Trunc(@0)))" },
+        "i64.extend32_s":      { "category": "conversion", "value": 196, "return": ["i64"],                          "parameter": ["i64"],                        "immediate": [], "b3op": "SExt32(Trunc(@0))"         },
 
         "memory.atomic.notify":       { "category": "atomic",     "value": 254, "return": ["i32"],      "parameter": ["addr", "i32"],          "immediate": [{"name": "flags",          "type": "varuint32"}, {"name": "offset",   "type": "varuint32"}], "extendedOp":  0 },
         "memory.atomic.wait32":       { "category": "atomic",     "value": 254, "return": ["i32"],      "parameter": ["addr", "i32", "i64"],   "immediate": [{"name": "flags",          "type": "varuint32"}, {"name": "offset",   "type": "varuint32"}], "extendedOp":  1 },

Modified: trunk/LayoutTests/ChangeLog (270264 => 270265)


--- trunk/LayoutTests/ChangeLog	2020-11-30 21:49:30 UTC (rev 270264)
+++ trunk/LayoutTests/ChangeLog	2020-11-30 22:12:02 UTC (rev 270265)
@@ -1,3 +1,12 @@
+2020-11-30  Sergey Rubanov  <[email protected]>
+
+        Add support for the Wasm i64 sign-extension-ops proposal
+        https://bugs.webkit.org/show_bug.cgi?id=218990
+
+        Reviewed by Yusuke Suzuki.
+
+        * workers/wasm-references/test.js:
+
 2020-11-30  Truitt Savell  <[email protected]>
 
         REGRESSION: imported/w3c/web-platform-tests/streams/transform-streams/terminate.any.html is a flaky failure

Modified: trunk/LayoutTests/workers/wasm-references/test.js (270264 => 270265)


--- trunk/LayoutTests/workers/wasm-references/test.js	2020-11-30 21:49:30 UTC (rev 270264)
+++ trunk/LayoutTests/workers/wasm-references/test.js	2020-11-30 22:12:02 UTC (rev 270265)
@@ -393,7 +393,10 @@
         "i32.reinterpret/f32": { "category": "conversion", "value": 188, "return": ["i32"],      "parameter": ["f32"],                  "immediate": [], "b3op": "BitwiseCast"  },
         "i64.reinterpret/f64": { "category": "conversion", "value": 189, "return": ["i64"],      "parameter": ["f64"],                  "immediate": [], "b3op": "BitwiseCast"  },
         "i32.extend8_s":       { "category": "conversion", "value": 192, "return": ["i32"],      "parameter": ["i32"],                  "immediate": [], "b3op": "SExt8"        },
-        "i32.extend16_s":      { "category": "conversion", "value": 193, "return": ["i32"],      "parameter": ["i32"],                  "immediate": [], "b3op": "SExt16"       }
+        "i32.extend16_s":      { "category": "conversion", "value": 193, "return": ["i32"],      "parameter": ["i32"],                  "immediate": [], "b3op": "SExt16"       },
+        "i64.extend8_s":       { "category": "conversion", "value": 194, "return": ["i64"],      "parameter": ["i64"],                  "immediate": [], "b3op": "SExt32(SExt8(Trunc(@0)))"  },
+        "i64.extend16_s":      { "category": "conversion", "value": 195, "return": ["i64"],      "parameter": ["i64"],                  "immediate": [], "b3op": "SExt32(SExt16(Trunc(@0)))" },
+        "i64.extend32_s":      { "category": "conversion", "value": 196, "return": ["i64"],      "parameter": ["i64"],                  "immediate": [], "b3op": "SExt32(Trunc(@0))"         }
     }
 }
 `;

Modified: trunk/Source/_javascript_Core/ChangeLog (270264 => 270265)


--- trunk/Source/_javascript_Core/ChangeLog	2020-11-30 21:49:30 UTC (rev 270264)
+++ trunk/Source/_javascript_Core/ChangeLog	2020-11-30 22:12:02 UTC (rev 270265)
@@ -1,3 +1,21 @@
+2020-11-30  Sergey Rubanov  <[email protected]>
+
+        Add support for the Wasm i64 sign-extension-ops proposal
+        https://bugs.webkit.org/show_bug.cgi?id=218990
+
+        Reviewed by Yusuke Suzuki.
+
+        * llint/WebAssembly.asm:
+        * offlineasm/arm64.rb:
+        * offlineasm/cloop.rb:
+        * offlineasm/instructions.rb:
+        * offlineasm/x86.rb:
+        * wasm/WasmAirIRGenerator.cpp:
+        (JSC::Wasm::AirIRGenerator::addOp<OpType::I64Extend8S>):
+        (JSC::Wasm::AirIRGenerator::addOp<OpType::I64Extend16S>):
+        (JSC::Wasm::AirIRGenerator::addOp<OpType::I64Extend32S>):
+        * wasm/wasm.json:
+
 2020-11-28  Yusuke Suzuki  <[email protected]>
 
         Unreviewed, follow-up after r270214

Modified: trunk/Source/_javascript_Core/llint/WebAssembly.asm (270264 => 270265)


--- trunk/Source/_javascript_Core/llint/WebAssembly.asm	2020-11-30 21:49:30 UTC (rev 270264)
+++ trunk/Source/_javascript_Core/llint/WebAssembly.asm	2020-11-30 22:12:02 UTC (rev 270265)
@@ -2080,6 +2080,24 @@
     returnq(ctx, t1)
 end)
 
+wasmOp(i64_extend8_s, WasmI64Extend8S, macro(ctx)
+    mloadq(ctx, m_operand, t0)
+    sxb2q t0, t1
+    returnq(ctx, t1)
+end)
+
+wasmOp(i64_extend16_s, WasmI64Extend16S, macro(ctx)
+    mloadq(ctx, m_operand, t0)
+    sxh2q t0, t1
+    returnq(ctx, t1)
+end)
+
+wasmOp(i64_extend32_s, WasmI64Extend16S, macro(ctx)
+    mloadq(ctx, m_operand, t0)
+    sxi2q t0, t1
+    returnq(ctx, t1)
+end)
+
 wasmOp(f32_convert_s_i32, WasmF32ConvertSI32, macro(ctx)
     mloadi(ctx, m_operand, t0)
     ci2fs t0, ft0

Modified: trunk/Source/_javascript_Core/offlineasm/arm64.rb (270264 => 270265)


--- trunk/Source/_javascript_Core/offlineasm/arm64.rb	2020-11-30 21:49:30 UTC (rev 270264)
+++ trunk/Source/_javascript_Core/offlineasm/arm64.rb	2020-11-30 22:12:02 UTC (rev 270265)
@@ -901,6 +901,10 @@
             emitARM64("sxtb", operands, [:word, :word])
         when "sxh2i"
             emitARM64("sxth", operands, [:word, :word])
+        when "sxb2q"
+            emitARM64("sxtb", operands, [:quad, :quad])
+        when "sxh2q"
+            emitARM64("sxth", operands, [:quad, :quad])
         when "nop"
             $asm.puts "nop"
         when "bieq", "bbeq"

Modified: trunk/Source/_javascript_Core/offlineasm/cloop.rb (270264 => 270265)


--- trunk/Source/_javascript_Core/offlineasm/cloop.rb	2020-11-30 21:49:30 UTC (rev 270264)
+++ trunk/Source/_javascript_Core/offlineasm/cloop.rb	2020-11-30 22:12:02 UTC (rev 270265)
@@ -746,6 +746,10 @@
             $asm.putc "#{operands[1].clLValue(:int32)} = #{operands[0].clValue(:int8)};"
         when "sxh2i"
             $asm.putc "#{operands[1].clLValue(:int32)} = #{operands[0].clValue(:int16)};"
+        when "sxb2q"
+            $asm.putc "#{operands[1].clLValue(:int64)} = #{operands[0].clValue(:int8)};"
+        when "sxh2q"
+            $asm.putc "#{operands[1].clLValue(:int64)} = #{operands[0].clValue(:int16)};"
         when "nop"
             $asm.putc "// nop"
         when "bbeq"

Modified: trunk/Source/_javascript_Core/offlineasm/instructions.rb (270264 => 270265)


--- trunk/Source/_javascript_Core/offlineasm/instructions.rb	2020-11-30 21:49:30 UTC (rev 270264)
+++ trunk/Source/_javascript_Core/offlineasm/instructions.rb	2020-11-30 22:12:02 UTC (rev 270265)
@@ -143,6 +143,8 @@
      "zxi2q",
      "sxb2i",
      "sxh2i",
+     "sxb2q",
+     "sxh2q",
      "nop",
      "bieq",
      "bineq",

Modified: trunk/Source/_javascript_Core/offlineasm/x86.rb (270264 => 270265)


--- trunk/Source/_javascript_Core/offlineasm/x86.rb	2020-11-30 21:49:30 UTC (rev 270264)
+++ trunk/Source/_javascript_Core/offlineasm/x86.rb	2020-11-30 22:12:02 UTC (rev 270265)
@@ -1426,6 +1426,18 @@
             else
                 $asm.puts "movsx #{orderOperands(operands[0].x86Operand(:half), operands[1].x86Operand(:int))}"
             end
+        when "sxb2q"
+            if !isIntelSyntax
+                $asm.puts "movsbq #{operands[0].x86Operand(:byte)}, #{operands[1].x86Operand(:quad)}"
+            else
+                $asm.puts "movsxd #{orderOperands(operands[0].x86Operand(:byte), operands[1].x86Operand(:quad))}"
+            end
+        when "sxh2q"
+            if !isIntelSyntax
+                $asm.puts "movswq #{operands[0].x86Operand(:half)}, #{operands[1].x86Operand(:quad)}"
+            else
+                $asm.puts "movsxd #{orderOperands(operands[0].x86Operand(:half), operands[1].x86Operand(:quad))}"
+            end
         when "nop"
             $asm.puts "nop"
         when "bieq"

Modified: trunk/Source/_javascript_Core/wasm/WasmAirIRGenerator.cpp (270264 => 270265)


--- trunk/Source/_javascript_Core/wasm/WasmAirIRGenerator.cpp	2020-11-30 21:49:30 UTC (rev 270264)
+++ trunk/Source/_javascript_Core/wasm/WasmAirIRGenerator.cpp	2020-11-30 22:12:02 UTC (rev 270265)
@@ -4618,6 +4618,35 @@
     return { };
 }
 
+template<> auto AirIRGenerator::addOp<OpType::I64Extend8S>(ExpressionType arg0, ExpressionType& result) -> PartialResult
+{
+    result = g64();
+    auto temp = g32();
+    append(Move32, arg0, temp);
+    append(SignExtend8To32, temp, temp);
+    append(SignExtend32ToPtr, temp, result);
+    return { };
+}
+
+template<> auto AirIRGenerator::addOp<OpType::I64Extend16S>(ExpressionType arg0, ExpressionType& result) -> PartialResult
+{
+    result = g64();
+    auto temp = g32();
+    append(Move32, arg0, temp);
+    append(SignExtend16To32, temp, temp);
+    append(SignExtend32ToPtr, temp, result);
+    return { };
+}
+
+template<> auto AirIRGenerator::addOp<OpType::I64Extend32S>(ExpressionType arg0, ExpressionType& result) -> PartialResult
+{
+    result = g64();
+    auto temp = g32();
+    append(Move32, arg0, temp);
+    append(SignExtend32ToPtr, temp, result);
+    return { };
+}
+
 template<> auto AirIRGenerator::addOp<OpType::I32GtS>(ExpressionType arg0, ExpressionType arg1, ExpressionType& result) -> PartialResult
 {
     result = g32();

Modified: trunk/Source/_javascript_Core/wasm/wasm.json (270264 => 270265)


--- trunk/Source/_javascript_Core/wasm/wasm.json	2020-11-30 21:49:30 UTC (rev 270264)
+++ trunk/Source/_javascript_Core/wasm/wasm.json	2020-11-30 22:12:02 UTC (rev 270265)
@@ -224,6 +224,9 @@
         "i64.reinterpret/f64": { "category": "conversion", "value": 189, "return": ["i64"],                          "parameter": ["f64"],                        "immediate": [], "b3op": "BitwiseCast"  },
         "i32.extend8_s":       { "category": "conversion", "value": 192, "return": ["i32"],                          "parameter": ["i32"],                        "immediate": [], "b3op": "SExt8"        },
         "i32.extend16_s":      { "category": "conversion", "value": 193, "return": ["i32"],                          "parameter": ["i32"],                        "immediate": [], "b3op": "SExt16"       },
+        "i64.extend8_s":       { "category": "conversion", "value": 194, "return": ["i64"],                          "parameter": ["i64"],                        "immediate": [], "b3op": "SExt32(SExt8(Trunc(@0)))"  },
+        "i64.extend16_s":      { "category": "conversion", "value": 195, "return": ["i64"],                          "parameter": ["i64"],                        "immediate": [], "b3op": "SExt32(SExt16(Trunc(@0)))" },
+        "i64.extend32_s":      { "category": "conversion", "value": 196, "return": ["i64"],                          "parameter": ["i64"],                        "immediate": [], "b3op": "SExt32(Trunc(@0))"         },
 
         "memory.atomic.notify":       { "category": "atomic",     "value": 254, "return": ["i32"],      "parameter": ["addr", "i32"],          "immediate": [{"name": "flags",          "type": "varuint32"}, {"name": "offset",   "type": "varuint32"}], "extendedOp":  0 },
         "memory.atomic.wait32":       { "category": "atomic",     "value": 254, "return": ["i32"],      "parameter": ["addr", "i32", "i64"],   "immediate": [{"name": "flags",          "type": "varuint32"}, {"name": "offset",   "type": "varuint32"}], "extendedOp":  1 },
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to