Improve operators and toString on boolean vectors

- Make .valueOf throw()
- Implement toString() and toLocaleString()
- Fix a couple tests for toString/toLocaleString
diff --git a/src/ecmascript_simd.js b/src/ecmascript_simd.js
index 599b889..6444401 100644
--- a/src/ecmascript_simd.js
+++ b/src/ecmascript_simd.js
@@ -474,6 +474,38 @@
   }
 }
 
+if (!Object.hasOwnProperty(SIMD.Bool32x4.prototype, 'valueOf')) {
+  SIMD.Bool32x4.prototype.valueOf = function() {
+    throw new TypeError("Bool32x4 cannot be converted to a number");
+  }
+}
+
+if (!Object.hasOwnProperty(SIMD.Bool32x4.prototype, 'toString')) {
+  /**
+   * @return {String} a string representing the Bool32x4.
+   */
+  SIMD.Bool32x4.prototype.toString = function() {
+    return "SIMD.Bool32x4(" +
+      this.x_ + ", " +
+      this.y_ + ", " +
+      this.z_ + ", " +
+      this.w_ + ")"
+  }
+}
+
+if (!Object.hasOwnProperty(SIMD.Bool32x4.prototype, 'toLocaleString')) {
+  /**
+   * @return {String} a locale-sensitive string representing the Bool32x4.
+   */
+  SIMD.Bool32x4.prototype.toLocaleString = function() {
+    return "SIMD.Bool32x4(" +
+      this.x_.toLocaleString() + ", " +
+      this.y_.toLocaleString() + ", " +
+      this.z_.toLocaleString() + ", " +
+      this.w_.toLocaleString() + ")"
+  }
+}
+
 if (typeof SIMD.Bool16x8 === "undefined") {
   /**
     * Construct a new instance of Bool16x8 number.
@@ -738,6 +770,46 @@
   }
 }
 
+if (!Object.hasOwnProperty(SIMD.Bool16x8.prototype, 'valueOf')) {
+  SIMD.Bool16x8.prototype.valueOf = function() {
+    throw new TypeError("Bool16x8 cannot be converted to a number");
+  }
+}
+
+if (!Object.hasOwnProperty(SIMD.Bool16x8.prototype, 'toString')) {
+  /**
+   * @return {String} a string representing the Bool32x4.
+   */
+  SIMD.Bool16x8.prototype.toString = function() {
+    return "SIMD.Bool16x8(" +
+      this.s0_ + ", " +
+      this.s1_ + ", " +
+      this.s2_ + ", " +
+      this.s3_ + ", " +
+      this.s4_ + ", " +
+      this.s5_ + ", " +
+      this.s6_ + ", " +
+      this.s7_ + ")";
+  }
+}
+
+if (!Object.hasOwnProperty(SIMD.Bool16x8.prototype, 'toLocaleString')) {
+  /**
+   * @return {String} a locale-sensitive string representing the Bool16x8.
+   */
+  SIMD.Bool16x8.prototype.toLocaleString = function() {
+    return "SIMD.Bool16x8(" +
+      this.s0_.toLocaleString() + ", " +
+      this.s1_.toLocaleString() + ", " +
+      this.s2_.toLocaleString() + ", " +
+      this.s3_.toLocaleString() + ", " +
+      this.s4_.toLocaleString() + ", " +
+      this.s5_.toLocaleString() + ", " +
+      this.s6_.toLocaleString() + ", " +
+      this.s7_.toLocaleString() + ")";
+  }
+}
+
 if (typeof SIMD.Bool8x16 === "undefined") {
   /**
     * Construct a new instance of Bool8x16 number.
@@ -1085,6 +1157,63 @@
   }
 }
 
+if (!Object.hasOwnProperty(SIMD.Bool8x16.prototype, 'valueOf')) {
+  SIMD.Bool8x16.prototype.valueOf = function() {
+    throw new TypeError("Bool8x16 cannot be converted to a number");
+  }
+}
+
+if (!Object.hasOwnProperty(SIMD.Bool8x16.prototype, 'toString')) {
+  /**
+   * @return {String} a string representing the Bool32x4.
+   */
+  SIMD.Bool8x16.prototype.toString = function() {
+    return "SIMD.Bool8x16(" +
+      this.s0_ + ", " +
+      this.s1_ + ", " +
+      this.s2_ + ", " +
+      this.s3_ + ", " +
+      this.s4_ + ", " +
+      this.s5_ + ", " +
+      this.s6_ + ", " +
+      this.s7_ + ", " +
+      this.s8_ + ", " +
+      this.s9_ + ", " +
+      this.s10_ + ", " +
+      this.s11_ + ", " +
+      this.s12_ + ", " +
+      this.s13_ + ", " +
+      this.s14_ + ", " +
+      this.s15_ + ")";
+  }
+}
+
+if (!Object.hasOwnProperty(SIMD.Bool8x16.prototype, 'toLocaleString')) {
+  /**
+   * @return {String} a locale-sensitive string representing the Bool8x16.
+   */
+  SIMD.Bool8x16.prototype.toLocaleString = function() {
+    return "SIMD.Bool8x16(" +
+      this.s0_.toLocaleString() + ", " +
+      this.s1_.toLocaleString() + ", " +
+      this.s2_.toLocaleString() + ", " +
+      this.s3_.toLocaleString() + ", " +
+      this.s4_.toLocaleString() + ", " +
+      this.s5_.toLocaleString() + ", " +
+      this.s6_.toLocaleString() + ", " +
+      this.s7_.toLocaleString() + ", " +
+      this.s8_.toLocaleString() + ", " +
+      this.s9_.toLocaleString() + ", " +
+      this.s10_.toLocaleString() + ", " +
+      this.s11_.toLocaleString() + ", " +
+      this.s12_.toLocaleString() + ", " +
+      this.s13_.toLocaleString() + ", " +
+      this.s14_.toLocaleString() + ", " +
+      this.s15_.toLocaleString() + ")";
+  }
+}
+
+
 if (typeof SIMD.Float32x4 === "undefined") {
   /**
     * Construct a new instance of Float32x4 number.
diff --git a/src/ecmascript_simd_tests.js b/src/ecmascript_simd_tests.js
index 29983dc..8d241e9 100644
--- a/src/ecmascript_simd_tests.js
+++ b/src/ecmascript_simd_tests.js
@@ -330,7 +330,7 @@
     throws(function() {SIMD.Bool16x8(true, false, false, true, true, false, true, false) > SIMD.Bool16x8(false, true, false, true, false, true, false, true)});
     throws(function() {SIMD.Bool16x8(true, false, false, true, true, false, true, false) <= SIMD.Bool16x8(false, true, false, true, false, true, false, true)});
     throws(function() {SIMD.Bool16x8(true, false, false, true, true, false, true, false) >= SIMD.Bool16x8(false, true, false, true, false, true, false, true)});
-    equal(SIMD.Bool16x8(true, false, false, true, true, false, true, false).toString(), "Bool16x8(true, false, false, true, true, false, true, false)");
+    equal(SIMD.Bool16x8(true, false, false, true, true, false, true, false).toString(), "SIMD.Bool16x8(true, false, false, true, true, false, true, false)");
     equal(SIMD.Bool16x8(true, false, false, true, true, false, true, false).toLocaleString(), "SIMD.Bool16x8(true, false, false, true, true, false, true, false)");
     throws(function() { SIMD.Bool16x8(true, false, false, true, true, false, true, false)(); });
     equal(SIMD.Bool16x8(true, false, false, true, true, false, true, false)[0], undefined);
@@ -385,8 +385,8 @@
     throws(function() {SIMD.Bool8x16(true, false, false, true, true, false, true, false, true, false, true, false, true, false, true, false) > SIMD.Bool8x16(false, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true)});
     throws(function() {SIMD.Bool8x16(true, false, false, true, true, false, true, false, true, false, true, false, true, false, true, false) <= SIMD.Bool8x16(false, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true)});
     throws(function() {SIMD.Bool8x16(true, false, false, true, true, false, true, false, true, false, true, false, true, false, true, false) >= SIMD.Bool8x16(false, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true)});
-    equal(SIMD.Bool8x16(true, false, false, true, true, false, true, false, true, false, true, false, true, false, true, false).toString(), "SIMD.Bool8x16(true, false, false, true, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false)");
-    equal(SIMD.Bool8x16(true, false, false, true, true, false, true, false, true, false, true, false, true, false, true, false).toLocaleString(), "SIMD.Bool8x16(true, false, false, true, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false)");
+    equal(SIMD.Bool8x16(true, false, false, true, true, false, true, false, true, false, true, false, true, false, true, false).toString(), "SIMD.Bool8x16(true, false, false, true, true, false, true, false, true, false, true, false, true, false, true, false)");
+    equal(SIMD.Bool8x16(true, false, false, true, true, false, true, false, true, false, true, false, true, false, true, false).toLocaleString(), "SIMD.Bool8x16(true, false, false, true, true, false, true, false, true, false, true, false, true, false, true, false)");
     throws(function() { SIMD.Bool8x16(true, false, false, true, true, false, true, false, true, false, true, false, true, false, true, false)(); });
     equal(SIMD.Bool8x16(true, false, false, true, true, false, true, false, true, false, true, false, true, false, true, false)[0], undefined);
     equal(SIMD.Bool8x16(true, false, false, true, true, false, true, false, true, false, true, false, true, false, true, false).a, undefined);