diff --git a/test/mjsunit/wasm/params.js b/test/mjsunit/wasm/params.js
new file mode 100644
index 0000000..52d6214
--- /dev/null
+++ b/test/mjsunit/wasm/params.js
@@ -0,0 +1,139 @@
+// Copyright 2015 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Flags: --expose-wasm
+
+load("test/mjsunit/wasm/wasm-constants.js");
+
+function runSelect2(module, which, a, b) {
+  assertEquals(which == 0 ? a : b, module.select(a, b));
+}
+
+function testSelect2(type) {
+  var kBodySize = 2;
+  var kNameOffset = 21 + kBodySize + 1;
+
+  for (var which = 0; which < 2; which++) {
+    print("type = " + type + ", which = " + which);
+
+    var data = bytes(
+      // -- memory
+      kDeclMemory,
+      12, 12, 1,                  // memory
+      // -- signatures
+      kDeclSignatures, 1,
+      2, type, type, type,        // signature: (t,t)->t
+      // -- select
+      kDeclFunctions, 1,
+      kDeclFunctionName | kDeclFunctionExport,
+      0, 0,
+      kNameOffset, 0, 0, 0,       // name offset
+      kBodySize, 0,               // body size
+      kExprGetLocal, which,       // --
+      kDeclEnd,
+      's','e','l','e','c','t',0   // name
+    );
+
+    var module = _WASMEXP_.instantiateModule(data);
+
+    assertEquals("function", typeof module.select);
+    runSelect2(module, which, 99, 97);
+    runSelect2(module, which, -99, -97);
+
+    if (type != kAstF32) {
+      runSelect2(module, which, 0x80000000 | 0, 0x7fffffff | 0);
+      runSelect2(module, which, 0x80000001 | 0, 0x7ffffffe | 0);
+      runSelect2(module, which, 0xffffffff | 0, 0xfffffffe | 0);
+      runSelect2(module, which, -2147483647, 2147483646);
+      runSelect2(module, which, -2147483646, 2147483645);
+      runSelect2(module, which, -2147483648, 2147483647);
+    }
+
+    if (type != kAstI32 && type != kAstI64) {
+      runSelect2(module, which, -1.25, 5.25);
+      runSelect2(module, which, Infinity, -Infinity);
+    }
+  }
+}
+
+
+testSelect2(kAstI32);
+testSelect2(kAstF32);
+testSelect2(kAstF64);
+
+
+function runSelect10(module, which, a, b) {
+  var x = -1;
+
+  var result = [
+    module.select(a, b, x, x, x, x, x, x, x, x),
+    module.select(x, a, b, x, x, x, x, x, x, x),
+    module.select(x, x, a, b, x, x, x, x, x, x),
+    module.select(x, x, x, a, b, x, x, x, x, x),
+    module.select(x, x, x, x, a, b, x, x, x, x),
+    module.select(x, x, x, x, x, a, b, x, x, x),
+    module.select(x, x, x, x, x, x, a, b, x, x),
+    module.select(x, x, x, x, x, x, x, a, b, x),
+    module.select(x, x, x, x, x, x, x, x, a, b),
+    module.select(x, x, x, x, x, x, x, x, x, a)
+  ];
+
+  for (var i = 0; i < 10; i++) {
+     if (which == i) assertEquals(a, result[i]);
+     else if (which == i+1) assertEquals(b, result[i]);
+     else assertEquals(x, result[i]);
+  }
+}
+
+function testSelect10(type) {
+  var kBodySize = 2;
+  var kNameOffset = 29 + kBodySize + 1;
+
+  for (var which = 0; which < 10; which++) {
+    print("type = " + type + ", which = " + which);
+
+    var t = type;
+    var data = bytes(
+      kDeclMemory,
+      12, 12, 1,                  // memory
+      // signatures
+      kDeclSignatures, 1,
+      10, t,t,t,t,t,t,t,t,t,t,t,  // (tx10)->t
+      // main function
+      kDeclFunctions, 1,
+      kDeclFunctionName | kDeclFunctionExport,
+      0, 0,
+      kNameOffset, 0, 0, 0,       // name offset
+      kBodySize, 0,               // body size
+      kExprGetLocal, which,       // --
+      kDeclEnd,
+      's','e','l','e','c','t',0   // name
+    );
+
+    var module = _WASMEXP_.instantiateModule(data);
+
+    assertEquals("function", typeof module.select);
+    runSelect10(module, which, 99, 97);
+    runSelect10(module, which, -99, -97);
+
+    if (type != kAstF32) {
+      runSelect10(module, which, 0x80000000 | 0, 0x7fffffff | 0);
+      runSelect10(module, which, 0x80000001 | 0, 0x7ffffffe | 0);
+      runSelect10(module, which, 0xffffffff | 0, 0xfffffffe | 0);
+      runSelect10(module, which, -2147483647, 2147483646);
+      runSelect10(module, which, -2147483646, 2147483645);
+      runSelect10(module, which, -2147483648, 2147483647);
+    }
+
+    if (type != kAstI32 && type != kAstI64) {
+      runSelect10(module, which, -1.25, 5.25);
+      runSelect10(module, which, Infinity, -Infinity);
+    }
+  }
+}
+
+
+testSelect10(kAstI32);
+testSelect10(kAstF32);
+testSelect10(kAstF64);
