diff --git a/misc/wasm/wasm_exec.js b/misc/wasm/wasm_exec.js
index f616b5a1a6faa47a98fa39a854ae7fbd70c9c6ba..d61bbcc95a45adb61f04a4f1566009f4f9b0f499 100755
--- a/misc/wasm/wasm_exec.js
+++ b/misc/wasm/wasm_exec.js
@@ -77,11 +77,7 @@
 
 	const setInt64 = (addr, v) => {
 		mem().setUint32(addr + 0, v, true);
-		if (v >= 0) {
-			mem().setUint32(addr + 4, v / 4294967296, true);
-		} else {
-			mem().setUint32(addr + 4, -1, true); // FIXME
-		}
+		mem().setUint32(addr + 4, Math.floor(v / 4294967296), true);
 	}
 
 	const getInt64 = (addr) => {
diff --git a/src/syscall/js/js_test.go b/src/syscall/js/js_test.go
index 39e3744a995ae03a4e1f714dc85b0ffa956f1b11..ca065e321d33c2d6ef0f9a681c373fdc4660b3b3 100644
--- a/src/syscall/js/js_test.go
+++ b/src/syscall/js/js_test.go
@@ -58,6 +58,24 @@ func TestInt(t *testing.T) {
 	}
 }
 
+func TestIntConversion(t *testing.T) {
+	testIntConversion(t, 0)
+	testIntConversion(t, 1)
+	testIntConversion(t, -1)
+	testIntConversion(t, 1<<20)
+	testIntConversion(t, -1<<20)
+	testIntConversion(t, 1<<40)
+	testIntConversion(t, -1<<40)
+	testIntConversion(t, 1<<60)
+	testIntConversion(t, -1<<60)
+}
+
+func testIntConversion(t *testing.T, want int) {
+	if got := js.ValueOf(want).Int(); got != want {
+		t.Errorf("got %#v, want %#v", got, want)
+	}
+}
+
 func TestFloat(t *testing.T) {
 	want := 42.123
 	o := dummys.Get("someFloat")