WebAssembly: clear out insignificant i32 bits when calling JavaScript
authorjfbastien@apple.com <jfbastien@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 23 Feb 2017 06:35:50 +0000 (06:35 +0000)
committerjfbastien@apple.com <jfbastien@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 23 Feb 2017 06:35:50 +0000 (06:35 +0000)
commit9c4b2ddbfbd22549912c5ab54c0e9c00ae318cc3
tree4b25c73ba5bec0d615b589a16deb0258160180cd
parentf9da1f25ad0fd5997e771fa8e86e8055023a0bb7
WebAssembly: clear out insignificant i32 bits when calling JavaScript
https://bugs.webkit.org/show_bug.cgi?id=166677

Reviewed by Keith Miller.

When WebAssembly calls JavaScript it needs to clear out the
insignificant bits of int32 values:

  +------------------- tag
  |  +---------------- insignificant
  |  |   +------------ 32-bit integer value
  |  |   |
  |--|---|-------|
0xffff0000ffffffff

At least some JavaScript code assumes that these bits are all
zero. In the wasm-to-wasm.js example we store a 64-bit value in an
object with lo / hi fields, each containing 32-bit integers. We
then load these back, and the baseline compiler fails its
comparison because it first checks the value are the same type
(yes, because the int32 tag is set in both), and then whether they
have the same value (no, because comparing the two registers
fails). We could argue that the baseline compiler is wrong for
performing a 64-bit comparison, but it doesn't really matter
because there's not much of a point in breaking that invariant for
WebAssembly's sake.

* wasm/WasmBinding.cpp:
(JSC::Wasm::wasmToJs):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@212877 268f45cc-cd09-0410-ab3c-d52691b4dbfc
Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/wasm/WasmBinding.cpp