Bug 1317967 - Baldr: Fix x86 float32 stack argument passing (r=bbouvier)
authorLuke Wagner <luke@mozilla.com>
Thu, 17 Nov 2016 09:15:30 -0600
changeset 323106 234ca79c0f2ec4371cf7b83c4c9549584bb9d029
parent 323105 32bde324c727a46b0409bc174ec33ca2d77bdc1a
child 323107 48e65314c869d8d2fa7cea9ced0f61469dfff962
push id30967
push userphilringnalda@gmail.com
push dateFri, 18 Nov 2016 03:21:38 +0000
treeherdermozilla-central@8e476f8bd52d [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersbbouvier
bugs1317967
milestone53.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Bug 1317967 - Baldr: Fix x86 float32 stack argument passing (r=bbouvier) MozReview-Commit-ID: 2NZPFZQZPcI
js/src/jit-test/tests/wasm/wasm-abi.js
js/src/jit/x86-shared/CodeGenerator-x86-shared.cpp
new file mode 100644
--- /dev/null
+++ b/js/src/jit-test/tests/wasm/wasm-abi.js
@@ -0,0 +1,41 @@
+load(libdir + "wasm.js");
+
+for (let numLocals of [3, 4, 5, 6, 17, 18, 19]) {
+    for (let numParams of [1, 2, 3, 4, 5, 6, 7, 8]) {
+        let locals = `       (local `;
+        let setLocals = ``;
+        let getLocals = ``;
+        let adds = ``;
+        let sum = 0;
+        for (let i = 0; i < numLocals; i++) {
+            sum += i + 1;
+            locals += `i32 `;
+            setLocals += `       (set_local ${i + 1} (i32.add (get_local 0) (i32.const ${i + 1})))\n`;
+            getLocals += `       get_local ${i + 1}\n`;
+            if (i > 0)
+              adds += `       i32.add\n`;
+        }
+        locals += `)\n`;
+
+        var callee = `    (func $f (param `;
+        var caller = `       (call $f `;
+        for (let i = 0; i < numParams; i++) {
+            callee += `f32 `;
+            caller += `(f32.const ${i}) `;
+        }
+        callee += `))\n`;
+        caller += `)\n`;
+
+        var code = `(module \n` +
+                   callee +
+                   `    (func (export "run") (param i32) (result i32)\n` +
+                   locals +
+                   setLocals +
+                   caller +
+                   getLocals +
+                   adds +
+                   `    )\n` +
+                   `)`;
+        wasmFullPass(code, numLocals * 100 + sum, undefined, 100);
+    }
+}
--- a/js/src/jit/x86-shared/CodeGenerator-x86-shared.cpp
+++ b/js/src/jit/x86-shared/CodeGenerator-x86-shared.cpp
@@ -289,18 +289,20 @@ CodeGeneratorX86Shared::visitWasmStackAr
     Address dst(StackPointer, mir->spOffset());
     if (ins->arg()->isConstant()) {
         masm.storePtr(ImmWord(ToInt32(ins->arg())), dst);
     } else if (ins->arg()->isGeneralReg()) {
         masm.storePtr(ToRegister(ins->arg()), dst);
     } else {
         switch (mir->input()->type()) {
           case MIRType::Double:
+            masm.storeDouble(ToFloatRegister(ins->arg()), dst);
+            return;
           case MIRType::Float32:
-            masm.storeDouble(ToFloatRegister(ins->arg()), dst);
+            masm.storeFloat32(ToFloatRegister(ins->arg()), dst);
             return;
           // StackPointer is SIMD-aligned and ABIArgGenerator guarantees
           // stack offsets are SIMD-aligned.
           case MIRType::Int32x4:
           case MIRType::Bool32x4:
             masm.storeAlignedSimd128Int(ToFloatRegister(ins->arg()), dst);
             return;
           case MIRType::Float32x4: