Hello community,

here is the log from the commit of package v8 for openSUSE:Factory checked in 
at 2016-10-10 16:24:08
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/v8 (Old)
 and      /work/SRC/openSUSE:Factory/.v8.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "v8"

Changes:
--------
--- /work/SRC/openSUSE:Factory/v8/v8.changes    2016-08-15 10:31:39.000000000 
+0200
+++ /work/SRC/openSUSE:Factory/.v8.new/v8.changes       2016-10-10 
16:24:14.000000000 +0200
@@ -1,0 +2,8 @@
+Thu Oct  6 16:14:28 UTC 2016 - norm...@linux.vnet.ibm.com
+
+- _service updated last submodules commits upstream 5.3-lkgr branch
+  to avoid build errors, but keep previous v8 version 5.3.171
+  No changelog available.
+- add v8_deprecated_readdir_r.patch already upstream master
+
+-------------------------------------------------------------------

New:
----
  v8_deprecated_readdir_r.patch

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ v8.spec ++++++
--- /var/tmp/diff_new_pack.RptCgU/_old  2016-10-10 16:24:19.000000000 +0200
+++ /var/tmp/diff_new_pack.RptCgU/_new  2016-10-10 16:24:19.000000000 +0200
@@ -41,6 +41,7 @@
 Patch1:         add_ppc64le_arch.patch
 # PATCH-FIX-UPSTREAM v8-gcc6.patch mli...@suse.cz -- Fix build with GCC6
 Patch2:         v8-gcc6.patch
+Patch3:         v8_deprecated_readdir_r.patch
 BuildRequires:  gcc-c++
 BuildRequires:  gyp
 BuildRequires:  libicu-devel >= 4.0
@@ -111,6 +112,7 @@
 popd
 %patch1 -p1
 %patch2 -p1
+%patch3 -p1
 
 %build
 

++++++ _service ++++++
--- /var/tmp/diff_new_pack.RptCgU/_old  2016-10-10 16:24:19.000000000 +0200
+++ /var/tmp/diff_new_pack.RptCgU/_new  2016-10-10 16:24:19.000000000 +0200
@@ -4,7 +4,7 @@
     <param 
name="url">https://chromium.googlesource.com/chromium/deps/icu.git</param>
     <param name="scm">git</param>
     <param name="filename">third_party.icu</param>
-    <param name="revision">42c58d4e49f2250039f0e98d43e0b76e8f5ca024</param>
+    <param name="revision">ffa4b6704cf5cc9fec9485731f24a05b2ba94bca</param>
     <param name="version">46</param>
   </service>
   
@@ -12,7 +12,7 @@
     <param 
name="url">https://chromium.googlesource.com/chromium/buildtools.git</param>
     <param name="scm">git</param>
     <param name="filename">buildtools</param>
-    <param name="revision">3ba3ca22ec610fe95683f6bfdeea9d90c768abd7</param>
+    <param name="revision">56eaae134648135663c4aa1ed82278572b5f35ef</param>
     <param name="version">00</param>
   </service>
 
@@ -20,6 +20,7 @@
     <param 
name="url">https://chromium.googlesource.com/chromium/src/base/trace_event/common.git</param>
     <param name="scm">git</param>
     <param name="filename">trace_event</param>
+    <param name="revision">54b8455be9505c2cb0cf5c26bb86739c236471aa</param>
     <param name="version">00</param>
   </service>
 
@@ -27,7 +28,7 @@
     <param 
name="url">https://chromium.googlesource.com/external/swarming.client.git</param>
     <param name="scm">git</param>
     <param name="filename">tools.swarming_client</param>
-    <param name="revision">8fce79620b04bbe5415ace1103db27505bdc4c06</param>
+    <param name="revision">df6e95e7669883c8fe9ef956c69a544154701a49</param>
     <param name="version">00</param>
   </service>
   
@@ -67,7 +68,7 @@
     <param 
name="url">https://chromium.googlesource.com/external/github.com/tc39/ecmascript_simd.git</param>
     <param name="scm">git</param>
     <param name="filename">test.simdjs.data</param>
-    <param name="revision">c8ef63c728283debc25891123eb00482fee4b8cd</param>
+    <param name="revision">baf493985cb9ea7cdbd0d68704860a8156de9556</param>
     <param name="version">00</param>
   </service>
 
@@ -75,7 +76,7 @@
     <param 
name="url">https://chromium.googlesource.com/external/github.com/tc39/test262.git</param>
     <param name="scm">git</param>
     <param name="filename">test.test262.data</param>
-    <param name="revision">ea222fb7d09e334c321b987656315ad4056ded96</param>
+    <param name="revision">88bc7fe7586f161201c5f14f55c9c489f82b1b67</param>
     <param name="version">00</param>
   </service>
 

++++++ buildtools-00.tar.bz2 ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/buildtools-00/DEPS new/buildtools-00/DEPS
--- old/buildtools-00/DEPS      2015-12-02 20:07:46.000000000 +0100
+++ new/buildtools-00/DEPS      2016-06-21 14:52:16.000000000 +0200
@@ -4,9 +4,9 @@
 vars = {
   "git_url": "https://chromium.googlesource.com";,
 
-  "clang_format_rev": "81edd558fea5dd7855d67a1dc61db34ae8c1fd63", # r223685
-  "libcxx_revision": "48198f9110397fff47fe7c37cbfa296be7d44d3d",
-  "libcxxabi_revision": "4ad1009ab3a59fa7a6896d74d5e4de5885697f95",
+  "clang_format_rev": "a72164df8be7d1c68ae1ad6c3541e7819200327e", # r258123
+  "libcxx_revision": "aad34a13af010898f54c1bb2069194cb083cea4b",
+  "libcxxabi_revision": "9a39e428d018b723d7d187181fd08908b1cb6bd0",
 }
 
 deps = {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/buildtools-00/android/doclava.tar.gz.sha1 
new/buildtools-00/android/doclava.tar.gz.sha1
--- old/buildtools-00/android/doclava.tar.gz.sha1       1970-01-01 
01:00:00.000000000 +0100
+++ new/buildtools-00/android/doclava.tar.gz.sha1       2016-06-21 
14:52:16.000000000 +0200
@@ -0,0 +1 @@
+86b0c87e7e73c923f6d3373fe7547f1770dd4758
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/buildtools-00/checkdeps/builddeps.py 
new/buildtools-00/checkdeps/builddeps.py
--- old/buildtools-00/checkdeps/builddeps.py    2015-12-02 20:07:46.000000000 
+0100
+++ new/buildtools-00/checkdeps/builddeps.py    2016-06-21 14:52:16.000000000 
+0200
@@ -97,6 +97,11 @@
 SKIP_SUBDIRS_VAR_NAME = 'skip_child_includes'
 
 
+class DepsBuilderError(Exception):
+    """Base class for exceptions in this module."""
+    pass
+
+
 def NormalizePath(path):
   """Returns a path normalized to how we write DEPS rules and compare paths."""
   return os.path.normcase(path).replace(os.path.sep, posixpath.sep)
@@ -105,9 +110,6 @@
 def _GitSourceDirectories(base_directory):
   """Returns set of normalized paths to subdirectories containing sources
   managed by git."""
-  if not os.path.exists(os.path.join(base_directory, '.git')):
-    return set()
-
   base_dir_norm = NormalizePath(base_directory)
   git_source_directories = set([base_dir_norm])
 
@@ -161,9 +163,14 @@
     self._under_test = being_tested
     self._ignore_temp_rules = ignore_temp_rules
     self._ignore_specific_rules = ignore_specific_rules
+    self._git_source_directories = None
 
-    # Set of normalized paths
-    self.git_source_directories = _GitSourceDirectories(self.base_directory)
+    if os.path.exists(os.path.join(base_directory, '.git')):
+      self.is_git = True
+    elif os.path.exists(os.path.join(base_directory, '.svn')):
+      self.is_git = False
+    else:
+      raise DepsBuilderError("%s is not a repository root" % base_directory)
 
     # Map of normalized directory paths to rules to use for those
     # directories, or None for directories that should be skipped.
@@ -258,13 +265,6 @@
     """
     dir_path_norm = NormalizePath(dir_path_local_abs)
 
-    # Check for a .svn directory in this directory or that this directory is
-    # contained in git source directories. This will tell us if it's a source
-    # directory and should be checked.
-    if not (os.path.exists(os.path.join(dir_path_local_abs, '.svn')) or
-            dir_path_norm in self.git_source_directories):
-      return None, []
-
     # Check the DEPS file in this directory.
     if self.verbose:
       print 'Applying rules from', dir_path_local_abs
@@ -334,6 +334,56 @@
       subdir_path_norm = posixpath.join(dir_path_norm, subdir)
       self.directory_rules[subdir_path_norm] = None
 
+  def GetAllRulesAndFiles(self, dir_name=None):
+    """Yields (rules, filenames) for each repository directory with DEPS rules.
+
+    This walks the directory tree while staying in the repository. Specify
+    |dir_name| to walk just one directory and its children; omit |dir_name| to
+    walk the entire repository.
+
+    Yields:
+      Two-element (rules, filenames) tuples. |rules| is a rules.Rules object
+      for a directory, and |filenames| is a list of the absolute local paths
+      of all files in that directory.
+    """
+    if self.is_git and self._git_source_directories is None:
+      self._git_source_directories = _GitSourceDirectories(self.base_directory)
+
+    # Collect a list of all files and directories to check.
+    files_to_check = []
+    if dir_name and not os.path.isabs(dir_name):
+      dir_name = os.path.join(self.base_directory, dir_name)
+    dirs_to_check = [dir_name or self.base_directory]
+    while dirs_to_check:
+      current_dir = dirs_to_check.pop()
+
+      # Check that this directory is part of the source repository. This
+      # prevents us from descending into third-party code or directories
+      # generated by the build system.
+      if self.is_git:
+        if NormalizePath(current_dir) not in self._git_source_directories:
+          continue
+      elif not os.path.exists(os.path.join(current_dir, '.svn')):
+        continue
+
+      current_dir_rules = self.GetDirectoryRules(current_dir)
+
+      if not current_dir_rules:
+        continue  # Handle the 'skip_child_includes' case.
+
+      current_dir_contents = sorted(os.listdir(current_dir))
+      file_names = []
+      sub_dirs = []
+      for file_name in current_dir_contents:
+        full_name = os.path.join(current_dir, file_name)
+        if os.path.isdir(full_name):
+          sub_dirs.append(full_name)
+        else:
+          file_names.append(full_name)
+      dirs_to_check.extend(reversed(sub_dirs))
+
+      yield (current_dir_rules, file_names)
+
   def GetDirectoryRules(self, dir_path_local):
     """Returns a Rules object to use for the given directory, or None
     if the given directory should be skipped.
@@ -345,7 +395,9 @@
 
     Args:
       dir_path_local: A local path to the directory you want rules for.
-        Can be relative and unnormalized.
+        Can be relative and unnormalized. It is the caller's responsibility
+        to ensure that this is part of the repository rooted at
+        |self.base_directory|.
     """
     if os.path.isabs(dir_path_local):
       dir_path_local_abs = dir_path_local
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/buildtools-00/checkdeps/checkdeps.py 
new/buildtools-00/checkdeps/checkdeps.py
--- old/buildtools-00/checkdeps/checkdeps.py    2015-12-02 20:07:46.000000000 
+0100
+++ new/buildtools-00/checkdeps/checkdeps.py    2016-06-21 14:52:16.000000000 
+0200
@@ -43,7 +43,7 @@
                being_tested=False,
                ignore_temp_rules=False,
                skip_tests=False,
-               resolve_dotdot=False):
+               resolve_dotdot=True):
     """Creates a new DepsChecker.
 
     Args:
@@ -82,35 +82,18 @@
     checkers = dict(
         (extension, checker)
         for checker in [java, cpp] for extension in checker.EXTENSIONS)
-    self._CheckDirectoryImpl(checkers, start_dir)
 
-  def _CheckDirectoryImpl(self, checkers, dir_name):
-    rules = self.GetDirectoryRules(dir_name)
-    if rules is None:
-      return
-
-    # Collect a list of all files and directories to check.
-    files_to_check = []
-    dirs_to_check = []
-    contents = sorted(os.listdir(dir_name))
-    for cur in contents:
-      full_name = os.path.join(dir_name, cur)
-      if os.path.isdir(full_name):
-        dirs_to_check.append(full_name)
-      elif os.path.splitext(full_name)[1] in checkers:
-        if not self._skip_tests or not _IsTestFile(cur):
-          files_to_check.append(full_name)
-
-    # First check all files in this directory.
-    for cur in files_to_check:
-      checker = checkers[os.path.splitext(cur)[1]]
-      file_status = checker.CheckFile(rules, cur)
-      if file_status.HasViolations():
-        self.results_formatter.AddError(file_status)
-
-    # Next recurse into the subdirectories.
-    for cur in dirs_to_check:
-      self._CheckDirectoryImpl(checkers, cur)
+    for rules, file_paths in self.GetAllRulesAndFiles(start_dir):
+      for full_name in file_paths:
+        if self._skip_tests and _IsTestFile(os.path.basename(full_name)):
+          continue
+        file_extension = os.path.splitext(full_name)[1]
+        if not file_extension in checkers:
+          continue
+        checker = checkers[file_extension]
+        file_status = checker.CheckFile(rules, full_name)
+        if file_status.HasViolations():
+          self.results_formatter.AddError(file_status)
 
   def CheckAddedCppIncludes(self, added_includes):
     """This is used from PRESUBMIT.py to check new #include statements added in
@@ -124,7 +107,7 @@
       where rule_type is one of Rule.DISALLOW or Rule.TEMP_ALLOW and
       rule_description is human-readable. Empty if no problems.
     """
-    cpp = cpp_checker.CppChecker(self.verbose)
+    cpp = cpp_checker.CppChecker(self.verbose, self._resolve_dotdot)
     problems = []
     for file_path, include_lines in added_includes:
       if not cpp.IsCppFile(file_path):
@@ -196,8 +179,8 @@
       '', '--json',
       help='Path to JSON output file')
   option_parser.add_option(
-      '', '--resolve-dotdot',
-      action='store_true', dest='resolve_dotdot', default=False,
+      '', '--no-resolve-dotdot',
+      action='store_false', dest='resolve_dotdot', default=True,
       help='resolve leading ../ in include directive paths relative '
            'to the file perfoming the inclusion.')
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/buildtools-00/checkdeps/checkdeps_test.py 
new/buildtools-00/checkdeps/checkdeps_test.py
--- old/buildtools-00/checkdeps/checkdeps_test.py       2015-12-02 
20:07:46.000000000 +0100
+++ new/buildtools-00/checkdeps/checkdeps_test.py       2016-06-21 
14:52:16.000000000 +0200
@@ -10,6 +10,7 @@
 import unittest
 
 
+import builddeps
 import checkdeps
 import results
 
@@ -104,6 +105,12 @@
   def testCountViolationsIgnoringTempRules(self):
     self.failUnlessEqual('11', self.CountViolations(True))
 
+  def testCountViolationsWithRelativePath(self):
+    self.deps_checker.results_formatter = results.CountViolationsFormatter()
+    self.deps_checker.CheckDirectory(
+        os.path.join('checkdeps', 'testdata', 'allowed'))
+    self.failUnlessEqual('4', self.deps_checker.results_formatter.GetResults())
+
   def testTempRulesGenerator(self):
     self.deps_checker.results_formatter = results.TemporaryRulesFormatter()
     self.deps_checker.CheckDirectory(
@@ -116,6 +123,12 @@
                 u'  "!third_party/no_rule/bad.h",']
     self.failUnlessEqual(expected, temp_rules)
 
+  def testBadBaseDirectoryNotCheckoutRoot(self):
+    # This assumes git. It's not a valid test if buildtools is fetched via svn.
+    with self.assertRaises(builddeps.DepsBuilderError):
+      checkdeps.DepsChecker(being_tested=True,
+                            base_directory=os.path.dirname(__file__))
+
   def testCheckAddedIncludesAllGood(self):
     problems = self.deps_checker.CheckAddedCppIncludes(
       [['checkdeps/testdata/allowed/test.cc',
@@ -174,6 +187,17 @@
     self.failUnless(len(problems) == 1)
     self.failUnless(problems[0][0].endswith('/test.cc'))
 
+  def testTraversalIsOrdered(self):
+    dirs_traversed = []
+    for rules, filenames in self.deps_checker.GetAllRulesAndFiles():
+      self.failUnlessEqual(type(filenames), list)
+      self.failUnlessEqual(filenames, sorted(filenames))
+      if filenames:
+        dir_names = set(os.path.dirname(file) for file in filenames)
+        self.failUnlessEqual(1, len(dir_names))
+        dirs_traversed.append(dir_names.pop())
+    self.failUnlessEqual(dirs_traversed, sorted(dirs_traversed))
+
 
 if __name__ == '__main__':
   unittest.main()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/buildtools-00/checkdeps/graphdeps.py 
new/buildtools-00/checkdeps/graphdeps.py
--- old/buildtools-00/checkdeps/graphdeps.py    2015-12-02 20:07:46.000000000 
+0100
+++ new/buildtools-00/checkdeps/graphdeps.py    2016-06-21 14:52:16.000000000 
+0200
@@ -99,26 +99,18 @@
   def DumpDependencies(self):
     """ Builds a dependency rule table and dumps the corresponding dependency
     graph to all requested formats."""
-    self._BuildDepsGraph(self.base_directory)
+    self._BuildDepsGraph()
     self._DumpDependencies()
 
-  def _BuildDepsGraph(self, full_path):
+  def _BuildDepsGraph(self):
     """Recursively traverses the source tree starting at the specified 
directory
     and builds a dependency graph representation in self.deps."""
-    rel_path = os.path.relpath(full_path, self.base_directory)
-    #if re.search(self.incl, rel_path) and not re.search(self.excl, rel_path):
-    rules = self.GetDirectoryRules(full_path)
-    if rules:
+    for (rules, _) in self.GetAllRulesAndFiles():
       deps = rules.AsDependencyTuples(
           include_general_rules=True,
           include_specific_rules=not self.ignore_specific_rules)
       self.deps.update(deps)
 
-    for item in sorted(os.listdir(full_path)):
-      next_full_path = os.path.join(full_path, item)
-      if os.path.isdir(next_full_path):
-        self._BuildDepsGraph(next_full_path)
-
   def _DumpDependencies(self):
     """Dumps the built dependency graph to the specified file with specified
     format."""
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/buildtools-00/clang_format/README.chromium 
new/buildtools-00/clang_format/README.chromium
--- old/buildtools-00/clang_format/README.chromium      2015-12-02 
20:07:46.000000000 +0100
+++ new/buildtools-00/clang_format/README.chromium      2016-06-21 
14:52:16.000000000 +0200
@@ -1,8 +1,8 @@
 Name: clang-format
 Short Name: clang-format
 URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/clang-format/
-Version: 3.7
-Date: 15 Jul 2015
+Version: 3.9
+Date: 22 Jan 2016
 Revision: See DEPS
 License: University of Illinois/NCSA Open Source License
 License File: NOT_SHIPPED
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/buildtools-00/codereview.settings 
new/buildtools-00/codereview.settings
--- old/buildtools-00/codereview.settings       2015-12-02 20:07:46.000000000 
+0100
+++ new/buildtools-00/codereview.settings       2016-06-21 14:52:16.000000000 
+0200
@@ -1 +1,2 @@
 CODE_REVIEW_SERVER: codereview.chromium.org
+PROJECT: buildtools
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/buildtools-00/linux64/clang-format.sha1 
new/buildtools-00/linux64/clang-format.sha1
--- old/buildtools-00/linux64/clang-format.sha1 2015-12-02 20:07:46.000000000 
+0100
+++ new/buildtools-00/linux64/clang-format.sha1 2016-06-21 14:52:16.000000000 
+0200
@@ -1 +1 @@
-acc9e19e04ad4cf6be067366d2522348cd160ae1
\ No newline at end of file
+8b68e8093516183b8f38626740eeaff97f112f7e
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/buildtools-00/linux64/gn.sha1 
new/buildtools-00/linux64/gn.sha1
--- old/buildtools-00/linux64/gn.sha1   2015-12-02 20:07:46.000000000 +0100
+++ new/buildtools-00/linux64/gn.sha1   2016-06-21 14:52:16.000000000 +0200
@@ -1 +1 @@
-b567cb68d5004f2df6c6fb1fc305b0ac93e49dfd
+3fd43e5e0dcc674f0a0c004ec290d04bb2e1c60e
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/buildtools-00/mac/clang-format.sha1 
new/buildtools-00/mac/clang-format.sha1
--- old/buildtools-00/mac/clang-format.sha1     2015-12-02 20:07:46.000000000 
+0100
+++ new/buildtools-00/mac/clang-format.sha1     2016-06-21 14:52:16.000000000 
+0200
@@ -1 +1 @@
-e66adcd1631b8d80650e7b15106033b04c9c2212
\ No newline at end of file
+afe0942b94fe33619361efe1510ae081c3070dc1
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/buildtools-00/mac/gn.sha1 
new/buildtools-00/mac/gn.sha1
--- old/buildtools-00/mac/gn.sha1       2015-12-02 20:07:46.000000000 +0100
+++ new/buildtools-00/mac/gn.sha1       2016-06-21 14:52:16.000000000 +0200
@@ -1 +1 @@
-e413ad0618e0d504904208e316cec900f8eca7b2
+b13c4088bdb3fb887bd18f7e82d955f5771ff80e
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/buildtools-00/third_party/libc++/BUILD.gn 
new/buildtools-00/third_party/libc++/BUILD.gn
--- old/buildtools-00/third_party/libc++/BUILD.gn       2015-12-02 
20:07:46.000000000 +0100
+++ new/buildtools-00/third_party/libc++/BUILD.gn       2016-06-21 
14:52:16.000000000 +0200
@@ -2,16 +2,21 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
+import("//build/config/sanitizers/sanitizers.gni")
+import("//build/toolchain/toolchain.gni")
+
+# Used by libc++ and libc++abi.
 config("config") {
-  include_dirs = [
-    "trunk/include",
-    "../libc++abi/trunk/include",
-  ]
+  defines = [ "LIBCXX_BUILDING_LIBCXXABI" ]
   cflags = [
     "-fPIC",
     "-fstrict-aliasing",
-    "-nostdinc++",
     "-pthread",
+  ]
+  cflags_cc = [
+    "-nostdinc++",
+    "-isystem" + rebase_path("trunk/include", root_build_dir),
+    "-isystem" + rebase_path("../libc++abi/trunk/include", root_build_dir),
     "-std=c++11",
   ]
 }
@@ -19,6 +24,7 @@
 shared_library("libc++") {
   sources = [
     "trunk/src/algorithm.cpp",
+    "trunk/src/any.cpp",
     "trunk/src/bind.cpp",
     "trunk/src/chrono.cpp",
     "trunk/src/condition_variable.cpp",
@@ -55,6 +61,7 @@
     ":config",
     "//build/config/compiler:no_chromium_code",
     "//build/config/compiler:rtti",
+    "//build/config/gcc:symbol_visibility_default",
     "//build/config/sanitizers:sanitizer_options_link_helper",
   ]
 
@@ -65,19 +72,34 @@
   # warning. Explicitly link with -lpthread instead.
 
   libs = [
-    "c",
-    "gcc_s",
     "m",
-    "pthread",
-    "rt",
   ]
 
+  if (!is_mac) {
+    libs += [
+      "c",
+      "gcc_s",
+      "pthread",
+      "rt",
+    ]
+  }
+
   # libc++abi is linked statically into libc++.so. This allows us to get both
   # libc++ and libc++abi by passing '-stdlib=libc++'. If libc++abi was a
   # separate DSO, we'd have to link against it explicitly.
   deps = [
     "//buildtools/third_party/libc++abi",
   ]
+
+  if (is_mac && using_sanitizer) {
+    # -nodefaultlibs on mac doesn't add any kind of runtime libraries.
+    # These runtimes have to be added manually.
+    lib_dirs = [ 
"//third_party/llvm-build/Release+Asserts/lib/clang/$clang_version/lib/darwin" ]
+
+    if (is_asan) {
+      libs += [ "clang_rt.asan_osx_dynamic" ]
+    }
+  }
 }
 
 group("libcxx_proxy") {
@@ -87,6 +109,9 @@
   public_configs = [ ":link_helper" ]
 }
 
+# This config is only used by binaries and shared library targets.
+# //build/config/sanitizers:default_sanitizer_flags sets the include paths for
+# everything else.
 config("link_helper") {
   ldflags = [
     "-stdlib=libc++",
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/buildtools-00/third_party/libc++/libc++.gyp 
new/buildtools-00/third_party/libc++/libc++.gyp
--- old/buildtools-00/third_party/libc++/libc++.gyp     2015-12-02 
20:07:46.000000000 +0100
+++ new/buildtools-00/third_party/libc++/libc++.gyp     2016-06-21 
14:52:16.000000000 +0200
@@ -3,6 +3,9 @@
 # found in the LICENSE file.
 
 {
+  'variables': {
+    'libcxx_root': '../../buildtools/third_party/libc++',
+  },
   'targets': [
     {
       'target_name': 'libcxx_proxy',
@@ -23,12 +26,10 @@
       'all_dependent_settings': {
         'target_conditions': [
           ['_type!="none"', {
-            'include_dirs': [
-              'trunk/include',
-              '../libc++abi/trunk/include',
-            ],
             'cflags_cc': [
               '-nostdinc++',
+              '-isystem<(libcxx_root)/trunk/include',
+              '-isystem<(libcxx_root)/../libc++abi/trunk/include',
             ],
             'ldflags': [
               '-stdlib=libc++',
@@ -57,6 +58,7 @@
       ],
       'sources': [
         'trunk/src/algorithm.cpp',
+        'trunk/src/any.cpp',
         'trunk/src/bind.cpp',
         'trunk/src/chrono.cpp',
         'trunk/src/condition_variable.cpp',
@@ -83,15 +85,15 @@
         'trunk/src/utility.cpp',
         'trunk/src/valarray.cpp',
       ],
-      'include_dirs': [
-        'trunk/include',
-        '../libc++abi/trunk/include',
-      ],
       'cflags': [
         '-fPIC',
         '-fstrict-aliasing',
-        '-nostdinc++',
         '-pthread',
+      ],
+      'cflags_cc': [
+        '-nostdinc++',
+        '-isystem<(libcxx_root)/trunk/include',
+        '-isystem<(libcxx_root)/../libc++abi/trunk/include',
         '-std=c++11',
       ],
       'cflags_cc!': [
@@ -101,6 +103,9 @@
       'cflags!': [
         '-fvisibility=hidden',
       ],
+      'defines': [
+        'LIBCXX_BUILDING_LIBCXXABI',
+      ],
       'ldflags': [
         '-nodefaultlibs',
       ],
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/buildtools-00/third_party/libc++abi/BUILD.gn 
new/buildtools-00/third_party/libc++abi/BUILD.gn
--- old/buildtools-00/third_party/libc++abi/BUILD.gn    2015-12-02 
20:07:46.000000000 +0100
+++ new/buildtools-00/third_party/libc++abi/BUILD.gn    2016-06-21 
14:52:16.000000000 +0200
@@ -2,6 +2,13 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
+config("libc++abi_warnings") {
+  if (is_clang) {
+    # http://llvm.org/PR25978
+    cflags = [ "-Wno-unused-function" ]
+  }
+}
+
 static_library("libc++abi") {
   sources = [
     "trunk/src/abort_message.cpp",
@@ -14,6 +21,7 @@
     "trunk/src/cxa_handlers.cpp",
     "trunk/src/cxa_new_delete.cpp",
     "trunk/src/cxa_personality.cpp",
+    "trunk/src/cxa_thread_atexit.cpp",
     "trunk/src/cxa_unexpected.cpp",
     "trunk/src/cxa_vector.cpp",
     "trunk/src/cxa_virtual.cpp",
@@ -31,6 +39,9 @@
   configs += [
     "//build/config/compiler:no_chromium_code",
     "//build/config/compiler:rtti",
+    "//build/config/gcc:symbol_visibility_default",
     "//buildtools/third_party/libc++:config",
+    # Must be after no_chromium_code.
+    ":libc++abi_warnings",
   ]
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/buildtools-00/third_party/libc++abi/libc++abi.gyp 
new/buildtools-00/third_party/libc++abi/libc++abi.gyp
--- old/buildtools-00/third_party/libc++abi/libc++abi.gyp       2015-12-02 
20:07:46.000000000 +0100
+++ new/buildtools-00/third_party/libc++abi/libc++abi.gyp       2016-06-21 
14:52:16.000000000 +0200
@@ -20,6 +20,7 @@
         'trunk/src/cxa_handlers.cpp',
         'trunk/src/cxa_new_delete.cpp',
         'trunk/src/cxa_personality.cpp',
+        'trunk/src/cxa_thread_atexit.cpp',
         'trunk/src/cxa_unexpected.cpp',
         'trunk/src/cxa_vector.cpp',
         'trunk/src/cxa_virtual.cpp',
@@ -32,6 +33,12 @@
         'trunk/include',
         '../libc++/trunk/include'
       ],
+      'variables': {
+        'clang_warning_flags': [
+          # http://llvm.org/PR25978
+          '-Wno-unused-function',
+        ],
+      },
       'cflags': [
         '-fPIC',
         '-fstrict-aliasing',
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/buildtools-00/win/clang-format.exe.sha1 
new/buildtools-00/win/clang-format.exe.sha1
--- old/buildtools-00/win/clang-format.exe.sha1 2015-12-02 20:07:46.000000000 
+0100
+++ new/buildtools-00/win/clang-format.exe.sha1 2016-06-21 14:52:16.000000000 
+0200
@@ -1 +1 @@
-dd661c89fa003a9ebd57d59a7fea346c1fc87f79
\ No newline at end of file
+f80b6ab38d7c7e0903c25e968028c1eaa25bb874
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/buildtools-00/win/gn.exe.sha1 
new/buildtools-00/win/gn.exe.sha1
--- old/buildtools-00/win/gn.exe.sha1   2015-12-02 20:07:46.000000000 +0100
+++ new/buildtools-00/win/gn.exe.sha1   2016-06-21 14:52:16.000000000 +0200
@@ -1 +1 @@
-32dbf716cac7be137c1a68248b4884e19dc4ce88
+6bd94ed1e971692e83e245cbb162393f2c091af2

++++++ test.simdjs.data-00.tar.bz2 ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/test.simdjs.data-00/src/benchmarks/aobench.js 
new/test.simdjs.data-00/src/benchmarks/aobench.js
--- old/test.simdjs.data-00/src/benchmarks/aobench.js   2015-12-02 
20:07:58.000000000 +0100
+++ new/test.simdjs.data-00/src/benchmarks/aobench.js   2016-04-25 
18:45:39.000000000 +0200
@@ -292,7 +292,7 @@
 
         var x = SIMD.Float32x4.mul(cosphi, theta);
         var y = SIMD.Float32x4.mul(sinphi, theta);
-        var z = 
SIMD.Float32x4.sqrt(SIMD.Float32x4.sub(SIMD.Float32x4.splat(1), 
SIMD.Float32x4.mul(theta, theta)));
+        var z = 
SIMD.Float32x4.sqrt(SIMD.Float32x4.sub(SIMD.Float32x4.splat(1.0), 
SIMD.Float32x4.mul(theta, theta)));
 
         var dirx = SIMD.Float32x4.add(SIMD.Float32x4.mul(x, 
SIMD.Float32x4.splat(basis[0].x)),
                             SIMD.Float32x4.add(SIMD.Float32x4.mul(y, 
SIMD.Float32x4.splat(basis[1].x)),
@@ -310,7 +310,7 @@
 
         var occIsectA = {
           t: SIMD.Float32x4.splat(1e17),
-          hit: SIMD.Int32x4.splat(0)
+          hit: SIMD.Bool32x4.splat(false)
         };
         var occIsectB = {
           p: {
@@ -332,9 +332,8 @@
 
         occlusionx4 = SIMD.Float32x4.add(
                         occlusionx4,
-                        SIMD.Float32x4.fromInt32x4Bits(
-                          SIMD.Int32x4.and(
-                            occIsectA.hit, 
SIMD.Int32x4.fromFloat32x4Bits(SIMD.Float32x4.splat(1)))));
+                        SIMD.Float32x4.select(occIsectA.hit, 
SIMD.Float32x4.splat(1.0),
+                                                             
SIMD.Float32x4.splat(0.0)));
 
       }
     }
@@ -367,53 +366,29 @@
     var D = SIMD.Float32x4.sub(SIMD.Float32x4.mul(B, B), C);
 
     var cond1 = SIMD.Float32x4.greaterThan(D, SIMD.Float32x4.splat(0.0));
-    if (cond1.signMask) {
-      var t2 = SIMD.Float32x4.fromInt32x4Bits(SIMD.Int32x4.and(cond1, 
SIMD.Int32x4.fromFloat32x4Bits(SIMD.Float32x4.sub(SIMD.Float32x4.neg(B), 
SIMD.Float32x4.sqrt(D)))));
-      var cond2 = SIMD.Int32x4.and(SIMD.Float32x4.greaterThan(t2, 
SIMD.Float32x4.splat(0.0)),
-                                   SIMD.Float32x4.lessThan(t2, isectA.t));
-      if (cond2.signMask) {
-        isectA.t = SIMD.Float32x4.fromInt32x4Bits(
-                     SIMD.Int32x4.or(
-                       SIMD.Int32x4.and(
-                         cond2,
-                         SIMD.Int32x4.fromFloat32x4Bits(t2)),
-                       SIMD.Int32x4.and(
-                         SIMD.Int32x4.not(cond2),
-                         SIMD.Int32x4.fromFloat32x4Bits(isectA.t))));
-        isectA.hit = SIMD.Int32x4.or(cond2, isectA.hit);
-        isectB.p.x = SIMD.Float32x4.fromInt32x4Bits(
-                       SIMD.Int32x4.or(SIMD.Int32x4.and(cond2, 
SIMD.Int32x4.fromFloat32x4Bits(SIMD.Float32x4.add(orgx, 
SIMD.Float32x4.mul(dirx, isectA.t)))),
-                       SIMD.Int32x4.and(SIMD.Int32x4.not(cond2), 
SIMD.Int32x4.fromFloat32x4Bits(isectB.p.x))));
-        isectB.p.y = SIMD.Float32x4.fromInt32x4Bits(
-                       SIMD.Int32x4.or(SIMD.Int32x4.and(cond2, 
SIMD.Int32x4.fromFloat32x4Bits(SIMD.Float32x4.add(orgx, 
SIMD.Float32x4.mul(diry, isectA.t)))),
-                       SIMD.Int32x4.and(SIMD.Int32x4.not(cond2), 
SIMD.Int32x4.fromFloat32x4Bits(isectB.p.y))));
-        isectB.p.z = SIMD.Float32x4.fromInt32x4Bits(
-                       SIMD.Int32x4.or(SIMD.Int32x4.and(cond2, 
SIMD.Int32x4.fromFloat32x4Bits(SIMD.Float32x4.add(orgx, 
SIMD.Float32x4.mul(dirz, isectA.t)))),
-                       SIMD.Int32x4.and(SIMD.Int32x4.not(cond2), 
SIMD.Int32x4.fromFloat32x4Bits(isectB.p.z))));
-
-        isectB.n.x = SIMD.Float32x4.fromInt32x4Bits(
-                       SIMD.Int32x4.or(SIMD.Int32x4.and(cond2, 
SIMD.Int32x4.fromFloat32x4Bits(SIMD.Float32x4.sub(isectB.p.x, 
SIMD.Float32x4.splat(sphere.center.x)))),
-                       SIMD.Int32x4.and(SIMD.Int32x4.not(cond2), 
SIMD.Int32x4.fromFloat32x4Bits(isectB.n.x))));
-        isectB.n.y = SIMD.Float32x4.fromInt32x4Bits(
-                       SIMD.Int32x4.or(SIMD.Int32x4.and(cond2, 
SIMD.Int32x4.fromFloat32x4Bits(SIMD.Float32x4.sub(isectB.p.y, 
SIMD.Float32x4.splat(sphere.center.y)))),
-                       SIMD.Int32x4.and(SIMD.Int32x4.not(cond2), 
SIMD.Int32x4.fromFloat32x4Bits(isectB.n.y))));
-        isectB.n.z = SIMD.Float32x4.fromInt32x4Bits(
-                       SIMD.Int32x4.or(SIMD.Int32x4.and(cond2, 
SIMD.Int32x4.fromFloat32x4Bits(SIMD.Float32x4.sub(isectB.p.z, 
SIMD.Float32x4.splat(sphere.center.z)))),
-                       SIMD.Int32x4.and(SIMD.Int32x4.not(cond2), 
SIMD.Int32x4.fromFloat32x4Bits(isectB.n.z))));
+    if (SIMD.Bool32x4.anyTrue(cond1)) {
+      var t2 = SIMD.Float32x4.select(cond1, 
SIMD.Float32x4.sub(SIMD.Float32x4.neg(B), SIMD.Float32x4.sqrt(D)), 
SIMD.Float32x4.splat(0.0));
+      var cond2 = SIMD.Bool32x4.and(SIMD.Float32x4.greaterThan(t2, 
SIMD.Float32x4.splat(0.0)),
+                                    SIMD.Float32x4.lessThan(t2, isectA.t));
+      if (SIMD.Bool32x4.anyTrue(cond2)) {
+        isectA.t = SIMD.Float32x4.select(cond2, t2, isectA.t);
+        isectA.hit = SIMD.Bool32x4.or(cond2, isectA.hit);
+
+        isectB.p.x = SIMD.Float32x4.select(cond2, SIMD.Float32x4.add(orgx, 
SIMD.Float32x4.mul(dirx, isectA.t)), isectB.p.x);
+        isectB.p.y = SIMD.Float32x4.select(cond2, SIMD.Float32x4.add(orgx, 
SIMD.Float32x4.mul(diry, isectA.t)), isectB.p.y);
+        isectB.p.z = SIMD.Float32x4.select(cond2, SIMD.Float32x4.add(orgx, 
SIMD.Float32x4.mul(dirz, isectA.t)), isectB.p.z);
+
+        isectB.n.x = SIMD.Float32x4.select(cond2, 
SIMD.Float32x4.sub(isectB.p.x, SIMD.Float32x4.splat(sphere.center.x)), 
isectB.n.x);
+        isectB.n.y = SIMD.Float32x4.select(cond2, 
SIMD.Float32x4.sub(isectB.p.y, SIMD.Float32x4.splat(sphere.center.y)), 
isectB.n.y);
+        isectB.n.z = SIMD.Float32x4.select(cond2, 
SIMD.Float32x4.sub(isectB.p.z, SIMD.Float32x4.splat(sphere.center.z)), 
isectB.n.z);
 
         var lengths = 
SIMD.Float32x4.sqrt(SIMD.Float32x4.add(SIMD.Float32x4.mul(isectB.n.x, 
isectB.n.x),
                                           
SIMD.Float32x4.add(SIMD.Float32x4.mul(isectB.n.y, isectB.n.y),
                                                              
SIMD.Float32x4.mul(isectB.n.z, isectB.n.z))));
         var cond3 = SIMD.Float32x4.greaterThan(SIMD.Float32x4.abs(lengths), 
SIMD.Float32x4.splat(1e-17));
-        isectB.n.x = SIMD.Float32x4.fromInt32x4Bits(
-                       SIMD.Int32x4.or(SIMD.Int32x4.and(cond3, 
SIMD.Int32x4.fromFloat32x4Bits(SIMD.Float32x4.div(isectB.n.x, lengths))),
-                       SIMD.Int32x4.and(SIMD.Int32x4.not(cond3), 
SIMD.Int32x4.fromFloat32x4Bits(isectB.n.x))));
-        isectB.n.y = SIMD.Float32x4.fromInt32x4Bits(
-                       SIMD.Int32x4.or(SIMD.Int32x4.and(cond3, 
SIMD.Int32x4.fromFloat32x4Bits(SIMD.Float32x4.div(isectB.n.y, lengths))),
-                       SIMD.Int32x4.and(SIMD.Int32x4.not(cond3), 
SIMD.Int32x4.fromFloat32x4Bits(isectB.n.y))));
-        isectB.n.z = SIMD.Float32x4.fromInt32x4Bits(
-                       SIMD.Int32x4.or(SIMD.Int32x4.and(cond3, 
SIMD.Int32x4.fromFloat32x4Bits(SIMD.Float32x4.div(isectB.n.z, lengths))),
-                       SIMD.Int32x4.and(SIMD.Int32x4.not(cond3), 
SIMD.Int32x4.fromFloat32x4Bits(isectB.n.z))));
+        isectB.n.x = SIMD.Float32x4.select(cond3, 
SIMD.Float32x4.div(isectB.n.x, lengths), isectB.n.x);
+        isectB.n.y = SIMD.Float32x4.select(cond3, 
SIMD.Float32x4.div(isectB.n.y, lengths), isectB.n.y);
+        isectB.n.z = SIMD.Float32x4.select(cond3, 
SIMD.Float32x4.div(isectB.n.z, lengths), isectB.n.z);
       }
     }
   }
@@ -430,31 +405,19 @@
     var dp = SIMD.Float32x4.add(SIMD.Float32x4.mul(orgx, 
SIMD.Float32x4.splat(plane.n.x)),
                       SIMD.Float32x4.add(SIMD.Float32x4.mul(orgy, 
SIMD.Float32x4.splat(plane.n.y)),
                                SIMD.Float32x4.mul(orgz, 
SIMD.Float32x4.splat(plane.n.z))));
-    var t2 = SIMD.Float32x4.fromInt32x4Bits(SIMD.Int32x4.and(cond1, 
SIMD.Int32x4.fromFloat32x4Bits(SIMD.Float32x4.div(SIMD.Float32x4.neg(SIMD.Float32x4.add(dp,
 d)), v))));
-    var cond2 = SIMD.Int32x4.and(SIMD.Float32x4.greaterThan(t2, 
SIMD.Float32x4.splat(0.0)), SIMD.Float32x4.lessThan(t2, isectA.t));
-    if (cond2.signMask) {
-      isectA.t = 
SIMD.Float32x4.fromInt32x4Bits(SIMD.Int32x4.or(SIMD.Int32x4.and(cond2, 
SIMD.Int32x4.fromFloat32x4Bits(t2)),
-                                             
SIMD.Int32x4.and(SIMD.Int32x4.not(cond2), 
SIMD.Int32x4.fromFloat32x4Bits(isectA.t))));
-      isectA.hit = SIMD.Int32x4.or(cond2, isectA.hit);
-      isectB.p.x = SIMD.Float32x4.fromInt32x4Bits(
-                     SIMD.Int32x4.or(SIMD.Int32x4.and(cond2, 
SIMD.Int32x4.fromFloat32x4Bits(SIMD.Float32x4.add(orgx, 
SIMD.Float32x4.mul(dirx, isectA.t)))),
-                     SIMD.Int32x4.and(SIMD.Int32x4.not(cond2), 
SIMD.Int32x4.fromFloat32x4Bits(isectB.p.x))));
-      isectB.p.y = SIMD.Float32x4.fromInt32x4Bits(
-                     SIMD.Int32x4.or(SIMD.Int32x4.and(cond2, 
SIMD.Int32x4.fromFloat32x4Bits(SIMD.Float32x4.add(orgx, 
SIMD.Float32x4.mul(diry, isectA.t)))),
-                     SIMD.Int32x4.and(SIMD.Int32x4.not(cond2), 
SIMD.Int32x4.fromFloat32x4Bits(isectB.p.y))));
-      isectB.p.z = SIMD.Float32x4.fromInt32x4Bits(
-                     SIMD.Int32x4.or(SIMD.Int32x4.and(cond2, 
SIMD.Int32x4.fromFloat32x4Bits(SIMD.Float32x4.add(orgx, 
SIMD.Float32x4.mul(dirz, isectA.t)))),
-                     SIMD.Int32x4.and(SIMD.Int32x4.not(cond2), 
SIMD.Int32x4.fromFloat32x4Bits(isectB.p.z))));
-
-      isectB.n.x = SIMD.Float32x4.fromInt32x4Bits(
-                     SIMD.Int32x4.or(SIMD.Int32x4.and(cond2, 
SIMD.Int32x4.fromFloat32x4Bits(Float32x4.splat(plane.n.x))),
-                     SIMD.Int32x4.and(SIMD.Int32x4.not(cond2), 
SIMD.Int32x4.fromFloat32x4Bits(isectB.n.x))));
-      isectB.n.y = SIMD.Float32x4.fromInt32x4Bits(
-                     SIMD.Int32x4.or(SIMD.Int32x4.and(cond2, 
SIMD.Int32x4.fromFloat32x4Bits(Float32x4.splat(plane.n.y))),
-                     SIMD.Int32x4.and(SIMD.Int32x4.not(cond2), 
SIMD.Int32x4.fromFloat32x4Bits(isectB.n.y))));
-      isectB.n.z = SIMD.Float32x4.fromInt32x4Bits(
-                     SIMD.Int32x4.or(SIMD.Int32x4.and(cond2, 
SIMD.Int32x4.fromFloat32x4Bits(Float32x4.splat(plane.n.z))),
-                     SIMD.Int32x4.and(SIMD.Int32x4.not(cond2), 
SIMD.Int32x4.fromFloat32x4Bits(isectB.n.z))));
+    var t2 = SIMD.Float32x4.select(cond1, 
SIMD.Float32x4.div(SIMD.Float32x4.neg(SIMD.Float32x4.add(dp, d)), v), 
SIMD.Float32x4.splat(0.0));
+    var cond2 = SIMD.Bool32x4.and(SIMD.Float32x4.greaterThan(t2, 
SIMD.Float32x4.splat(0.0)), SIMD.Float32x4.lessThan(t2, isectA.t));
+    if (SIMD.Bool32x4.anyTrue(cond2)) {
+      isectA.t = SIMD.Float32x4.select(cond2, t2, isectA.t);
+      isectA.hit = SIMD.Bool32x4.or(cond2, isectA.hit);
+
+      isectB.p.x = SIMD.Float32x4.select(cond2, SIMD.Float32x4.add(orgx, 
SIMD.Float32x4.mul(dirx, isectA.t)), isectB.p.x);
+      isectB.p.y = SIMD.Float32x4.select(cond2, SIMD.Float32x4.add(orgy, 
SIMD.Float32x4.mul(diry, isectA.t)), isectB.p.y);
+      isectB.p.z = SIMD.Float32x4.select(cond2, SIMD.Float32x4.add(orgz, 
SIMD.Float32x4.mul(dirz, isectA.t)), isectB.p.z);
+
+      isectB.n.x = SIMD.Float32x4.select(cond2, Float32x4.splat(plane.n.x), 
isectB.n.x);
+      isectB.n.y = SIMD.Float32x4.select(cond2, Float32x4.splat(plane.n.y), 
isectB.n.y);
+      isectB.n.z = SIMD.Float32x4.select(cond2, Float32x4.splat(plane.n.z), 
isectB.n.z);
     }
   }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/test.simdjs.data-00/src/benchmarks/index.html 
new/test.simdjs.data-00/src/benchmarks/index.html
--- old/test.simdjs.data-00/src/benchmarks/index.html   2015-12-02 
20:07:58.000000000 +0100
+++ new/test.simdjs.data-00/src/benchmarks/index.html   2016-04-25 
18:45:39.000000000 +0200
@@ -16,8 +16,6 @@
   <script src='averageFloat32x4LoadX.js'></script>
   <script src='averageFloat32x4LoadXY.js'></script>
   <script src='averageFloat32x4LoadXYZ.js'></script>
-  <script src='averageFloat64x2.js'></script>
-  <script src='averageFloat64x2Load.js'></script>
   <script src='averageInt32x4Load.js'></script>
   <script src='mandelbrot.js'></script>
   <script src='matrix-multiplication.js'></script>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/test.simdjs.data-00/src/benchmarks/mandelbrot.js 
new/test.simdjs.data-00/src/benchmarks/mandelbrot.js
--- old/test.simdjs.data-00/src/benchmarks/mandelbrot.js        2015-12-02 
20:07:58.000000000 +0100
+++ new/test.simdjs.data-00/src/benchmarks/mandelbrot.js        2016-04-25 
18:45:39.000000000 +0200
@@ -53,15 +53,16 @@
     var four4  = SIMD.Float32x4.splat (4.0);
     var two4   = SIMD.Float32x4.splat (2.0);
     var count4 = SIMD.Int32x4.splat (0);
+    var zero4  = SIMD.Int32x4.splat (0);
     var one4   = SIMD.Int32x4.splat (1);
 
     for (var i = 0; i < max_iterations; ++i) {
       var z_re24 = SIMD.Float32x4.mul (z_re4, z_re4);
       var z_im24 = SIMD.Float32x4.mul (z_im4, z_im4);
 
-      var mi4    = SIMD.Float32x4.lessThanOrEqual (SIMD.Float32x4.add (z_re24, 
z_im24), four4);
+      var mb4    = SIMD.Float32x4.lessThanOrEqual (SIMD.Float32x4.add (z_re24, 
z_im24), four4);
       // if all 4 values are greater than 4.0, there's no reason to continue
-      if (mi4.signMask === 0x00) {
+      if (!SIMD.Bool32x4.allTrue(mb4)) {
         break;
       }
 
@@ -69,7 +70,7 @@
       var new_im4 = SIMD.Float32x4.mul(SIMD.Float32x4.mul (two4, z_re4), 
z_im4);
       z_re4       = SIMD.Float32x4.add(c_re4, new_re4);
       z_im4       = SIMD.Float32x4.add(c_im4, new_im4);
-      count4      = SIMD.Int32x4.add(count4, SIMD.Int32x4.and (mi4, one4));
+      count4      = SIMD.Int32x4.add(count4, SIMD.Int32x4.select(mb4, one4, 
zero4));
     }
     return count4;
   }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/test.simdjs.data-00/src/benchmarks/run.js 
new/test.simdjs.data-00/src/benchmarks/run.js
--- old/test.simdjs.data-00/src/benchmarks/run.js       2015-12-02 
20:07:58.000000000 +0100
+++ new/test.simdjs.data-00/src/benchmarks/run.js       2016-04-25 
18:45:39.000000000 +0200
@@ -11,8 +11,7 @@
 load ('averageFloat32x4LoadX.js');
 load ('averageFloat32x4LoadXY.js');
 load ('averageFloat32x4LoadXYZ.js');
-load ('averageFloat64x2.js');
-load ('averageFloat64x2Load.js');
+load ('averageInt32x4Load.js');
 load ('mandelbrot.js');
 load ('matrix-multiplication.js');
 load ('transform.js');
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/test.simdjs.data-00/src/benchmarks/sinx4.js 
new/test.simdjs.data-00/src/benchmarks/sinx4.js
--- old/test.simdjs.data-00/src/benchmarks/sinx4.js     2015-12-02 
20:07:58.000000000 +0100
+++ new/test.simdjs.data-00/src/benchmarks/sinx4.js     2016-04-25 
18:45:39.000000000 +0200
@@ -117,6 +117,7 @@
 
     var emm0;
     var emm2;
+    var emm2mask;
 
     sign_bit = x;
     x        = 
SIMD.Float32x4.fromInt32x4Bits(SIMD.Int32x4.and(SIMD.Int32x4.fromFloat32x4Bits(x),
 _ps_inv_sign_mask));
@@ -133,7 +134,8 @@
     emm0     = SIMD.Int32x4.shiftLeftByScalar(emm0, 29);
 
     emm2     = SIMD.Int32x4.and(emm2, _pi32_2);
-    emm2     = SIMD.Int32x4.equal(emm2, SIMD.Int32x4.splat(0));
+    emm2mask = SIMD.Int32x4.equal(emm2, SIMD.Int32x4.splat(0));
+    emm2     = SIMD.Int32x4.select(emm2mask, SIMD.Int32x4.splat(-1), 
SIMD.Int32x4.splat(0));
 
     swap_sign_bit = SIMD.Float32x4.fromInt32x4Bits(emm0);
     poly_mask     = SIMD.Float32x4.fromInt32x4Bits(emm2);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/test.simdjs.data-00/src/ecmascript_simd.js 
new/test.simdjs.data-00/src/ecmascript_simd.js
--- old/test.simdjs.data-00/src/ecmascript_simd.js      2015-12-02 
20:07:58.000000000 +0100
+++ new/test.simdjs.data-00/src/ecmascript_simd.js      2016-04-25 
18:45:39.000000000 +0200
@@ -106,6 +106,13 @@
 
 // SIMD implementation functions
 
+function simdCoerceIndex(index) {
+    index = +index;
+    if (index != Math.floor(index))
+        throw new RangeError("SIMD index must be an integer");
+    return index;
+}
+
 function simdCheckLaneIndex(index, lanes) {
   if (!isInt32(index))
     throw new TypeError('Lane index must be an int32');
@@ -158,9 +165,9 @@
 function simdFrom(toType, fromType, a) {
   a = fromType.fn.check(a);
   for (var i = 0; i < fromType.lanes; i++) {
-    var v = fromType.fn.extractLane(a, i);
+    var v = Math.trunc(fromType.fn.extractLane(a, i));
     if (toType.minVal !== undefined &&
-        (v < toType.minVal || v > toType.maxVal)) {
+        !(toType.minVal <= v && v <= toType.maxVal)) {
       throw new RangeError("Can't convert value");
     }
     lanes[i] = v;
@@ -170,11 +177,9 @@
 
 function simdFromBits(toType, fromType, a) {
   a = fromType.fn.check(a);
-  for (var i = 0; i < fromType.lanes; i++)
-    fromType.buffer[i] = fromType.fn.extractLane(a, i);
-  for (var i = 0; i < toType.lanes; i++)
-    lanes[i] = toType.buffer[i];
-  return simdCreate(toType);
+  var newValue = new toType.fn();
+  newValue.s_ = new toType.view(a.s_.buffer);
+  return newValue;
 }
 
 function simdSelect(type, selector, a, b) {
@@ -251,15 +256,6 @@
   return simdCreate(type);
 }
 
-function simdWideningBinaryOp(type, op, a, b) {
-  a = type.fn.check(a);
-  b = type.fn.check(b);
-  for (var i = 0; i < type.wideType.lanes; i++)
-    lanes[i] = op(type.fn.extractLane(a, i),
-                  type.fn.extractLane(b, i));
-  return simdCreate(type.wideType);
-}
-
 function binaryEqual(a, b) { return a == b; }
 function binaryNotEqual(a, b) { return a != b; }
 function binaryLess(a, b) { return a < b; }
@@ -303,54 +299,43 @@
 function simdLoad(type, tarray, index, count) {
   if (!isTypedArray(tarray))
     throw new TypeError("The 1st argument must be a typed array.");
-  if (!isInt32(index))
-    throw new TypeError("The 2nd argument must be an Int32.");
+  index = simdCoerceIndex(index);
   var bpe = tarray.BYTES_PER_ELEMENT;
   var bytes = count * type.laneSize;
   if (index < 0 || (index * bpe + bytes) > tarray.byteLength)
     throw new RangeError("The value of index is invalid.");
 
-  var buf = type.buffer;
-  var array = bpe == 1 ? _i8x16 :
-              bpe == 2 ? _i16x8 :
-              bpe == 4 ? (tarray instanceof Float32Array ? _f32x4 : _i32x4) :
-              _f64x2;
-  var n = bytes / bpe;
-  for (var i = 0; i < n; i++)
-    array[i] = tarray[index + i];
-  for (i = 0; i < count; i++) lanes[i] = buf[i];
-  for (; i < type.lanes; i++) lanes[i] = 0;
-  return simdCreate(type);
+  var newValue = type.fn();
+  var dst = new Uint8Array(newValue.s_.buffer);
+  var src = new Uint8Array(tarray.buffer, tarray.byteOffset + index * bpe, 
bytes);
+
+  for (var i = 0; i < bytes; i++) {
+    dst[i] = src[i];
+  }
+  var typeBytes = type.lanes * type.laneSize;
+  for (var i = bytes; i < typeBytes; i++) {
+    dst[i] = 0;
+  }
+  return newValue;
 }
 
 function simdStore(type, tarray, index, a, count) {
   if (!isTypedArray(tarray))
     throw new TypeError("The 1st argument must be a typed array.");
-  if (!isInt32(index))
-    throw new TypeError("The 2nd argument must be an Int32.");
+  index = simdCoerceIndex(index);
   var bpe = tarray.BYTES_PER_ELEMENT;
   var bytes = count * type.laneSize;
   if (index < 0 || (index * bpe + bytes) > tarray.byteLength)
     throw new RangeError("The value of index is invalid.");
 
   a = type.fn.check(a);
-  // If count is odd and tarray's elements are 8 bytes wide, we have to create
-  // a new view.
-  if ((count % 2 != 0) && bpe == 8) {
-    var view = new type.view(tarray.buffer,
-                             tarray.byteOffset + index * 8, count);
-    for (var i = 0; i < count; i++)
-      view[i] = type.fn.extractLane(a, i);
-  } else {
-    for (var i = 0; i < count; i++)
-      type.buffer[i] = type.fn.extractLane(a, i);
-    var array = bpe == 1 ? _i8x16 :
-                bpe == 2 ? _i16x8 :
-                bpe == 4 ? (tarray instanceof Float32Array ? _f32x4 : _i32x4) :
-                _f64x2;
-    var n = bytes / bpe;
-    for (var i = 0; i < n; i++)
-      tarray[index + i] = array[i];
+
+  // The underlying buffers are copied byte by byte, to avoid float
+  // canonicalization.
+  var src = new Uint8Array(a.s_.buffer);
+  var dst = new Uint8Array(tarray.buffer, tarray.byteOffset + index * bpe, 
bytes);
+  for (var i = 0; i < bytes; i++) {
+    dst[i] = src[i];
   }
   return a;
 }
@@ -365,7 +350,7 @@
     if (!(this instanceof SIMD.Float32x4)) {
       return new SIMD.Float32x4(s0, s1, s2, s3);
     }
-    this.s_ = convertArray(_f32x4, [s0, s1, s2, s3]);
+    this.s_ = convertArray(_f32x4, new Float32Array([s0, s1, s2, s3]));
   }
 
   SIMD.Float32x4.extractLane = function(v, i) {
@@ -396,7 +381,7 @@
     if (!(this instanceof SIMD.Int32x4)) {
       return new SIMD.Int32x4(s0, s1, s2, s3);
     }
-    this.s_ = convertArray(_i32x4, [s0, s1, s2, s3]);
+    this.s_ = convertArray(_i32x4, new Int32Array([s0, s1, s2, s3]));
   }
 
   SIMD.Int32x4.extractLane = function(v, i) {
@@ -425,7 +410,7 @@
     if (!(this instanceof SIMD.Int16x8)) {
       return new SIMD.Int16x8(s0, s1, s2, s3, s4, s5, s6, s7);
     }
-    this.s_ = convertArray(_i16x8, [s0, s1, s2, s3, s4, s5, s6, s7]);
+    this.s_ = convertArray(_i16x8, new Int16Array([s0, s1, s2, s3, s4, s5, s6, 
s7]));
   }
 
   SIMD.Int16x8.extractLane = function(v, i) {
@@ -456,8 +441,8 @@
       return new SIMD.Int8x16(s0, s1, s2, s3, s4, s5, s6, s7,
                               s8, s9, s10, s11, s12, s13, s14, s15);
     }
-    this.s_ = convertArray(_i8x16, [s0, s1, s2, s3, s4, s5, s6, s7,
-                                    s8, s9, s10, s11, s12, s13, s14, s15]);
+    this.s_ = convertArray(_i8x16, new Int8Array([s0, s1, s2, s3, s4, s5, s6, 
s7,
+                                    s8, s9, s10, s11, s12, s13, s14, s15]));
   }
 
   SIMD.Int8x16.extractLane = function(v, i) {
@@ -490,7 +475,7 @@
     if (!(this instanceof SIMD.Uint32x4)) {
       return new SIMD.Uint32x4(s0, s1, s2, s3);
     }
-    this.s_ = convertArray(_ui32x4, [s0, s1, s2, s3]);
+    this.s_ = convertArray(_ui32x4, new Uint32Array([s0, s1, s2, s3]));
   }
 
   SIMD.Uint32x4.extractLane = function(v, i) {
@@ -519,7 +504,7 @@
     if (!(this instanceof SIMD.Uint16x8)) {
       return new SIMD.Uint16x8(s0, s1, s2, s3, s4, s5, s6, s7);
     }
-    this.s_ = convertArray(_ui16x8, [s0, s1, s2, s3, s4, s5, s6, s7]);
+    this.s_ = convertArray(_ui16x8, new Uint16Array([s0, s1, s2, s3, s4, s5, 
s6, s7]));
   }
 
   SIMD.Uint16x8.extractLane = function(v, i) {
@@ -550,8 +535,8 @@
       return new SIMD.Uint8x16(s0, s1, s2, s3, s4, s5, s6, s7,
                                s8, s9, s10, s11, s12, s13, s14, s15);
     }
-    this.s_ = convertArray(_ui8x16, [s0, s1, s2, s3, s4, s5, s6, s7,
-                                     s8, s9, s10, s11, s12, s13, s14, s15]);
+    this.s_ = convertArray(_ui8x16, new Uint8Array([s0, s1, s2, s3, s4, s5, 
s6, s7,
+                                     s8, s9, s10, s11, s12, s13, s14, s15]));
   }
 
   SIMD.Uint8x16.extractLane = function(v, i) {
@@ -662,7 +647,7 @@
   fns: ["check", "splat", "replaceLane", "select",
         "equal", "notEqual", "lessThan", "lessThanOrEqual", "greaterThan", 
"greaterThanOrEqual",
         "and", "or", "xor", "not",
-        "add", "sub", "mul", "neg", "min", "max",
+        "add", "sub", "mul", "neg",
         "shiftLeftByScalar", "shiftRightByScalar",
         "load", "load1", "load2", "load3", "store", "store1", "store2", 
"store3"],
 }
@@ -681,7 +666,7 @@
   fns: ["check", "splat", "replaceLane", "select",
         "equal", "notEqual", "lessThan", "lessThanOrEqual", "greaterThan", 
"greaterThanOrEqual",
         "and", "or", "xor", "not",
-        "add", "sub", "mul", "neg", "min", "max",
+        "add", "sub", "mul", "neg",
         "shiftLeftByScalar", "shiftRightByScalar",
         "addSaturate", "subSaturate",
         "load", "store"],
@@ -701,7 +686,7 @@
   fns: ["check", "splat", "replaceLane", "select",
         "equal", "notEqual", "lessThan", "lessThanOrEqual", "greaterThan", 
"greaterThanOrEqual",
         "and", "or", "xor", "not",
-        "add", "sub", "mul", "neg", "min", "max",
+        "add", "sub", "mul", "neg",
         "shiftLeftByScalar", "shiftRightByScalar",
         "addSaturate", "subSaturate",
         "load", "store"],
@@ -722,7 +707,7 @@
   fns: ["check", "splat", "replaceLane", "select",
         "equal", "notEqual", "lessThan", "lessThanOrEqual", "greaterThan", 
"greaterThanOrEqual",
         "and", "or", "xor", "not",
-        "add", "sub", "mul", "min", "max",
+        "add", "sub", "mul",
         "shiftLeftByScalar", "shiftRightByScalar",
         "load", "load1", "load2", "load3", "store", "store1", "store2", 
"store3"],
 }
@@ -742,7 +727,7 @@
   fns: ["check", "splat", "replaceLane", "select",
         "equal", "notEqual", "lessThan", "lessThanOrEqual", "greaterThan", 
"greaterThanOrEqual",
         "and", "or", "xor", "not",
-        "add", "sub", "mul", "min", "max",
+        "add", "sub", "mul",
         "shiftLeftByScalar", "shiftRightByScalar",
         "addSaturate", "subSaturate",
         "load", "store"],
@@ -763,7 +748,7 @@
   fns: ["check", "splat", "replaceLane", "select",
         "equal", "notEqual", "lessThan", "lessThanOrEqual", "greaterThan", 
"greaterThanOrEqual",
         "and", "or", "xor", "not",
-        "add", "sub", "mul", "min", "max",
+        "add", "sub", "mul",
         "shiftLeftByScalar", "shiftRightByScalar",
         "addSaturate", "subSaturate",
         "load", "store"],
@@ -823,10 +808,6 @@
 uint16x8.fromBits = [float32x4, int32x4, int16x8, int8x16, uint32x4, uint8x16];
 uint8x16.fromBits = [float32x4, int32x4, int16x8, int8x16, uint32x4, uint16x8];
 
-// SIMD widening types.
-uint16x8.wideType = uint32x4;
-uint8x16.wideType = uint16x8;
-
 var simdTypes = [float32x4,
                  int32x4, int16x8, int8x16,
                  uint32x4, uint16x8, uint8x16,
@@ -842,7 +823,7 @@
       if (!(this instanceof SIMD.Float64x2)) {
         return new SIMD.Float64x2(s0, s1);
       }
-      this.s_ = convertArray(_f64x2, [s0, s1]);
+      this.s_ = convertArray(_f64x2, new Float64Array([s0, s1]));
     }
 
     SIMD.Float64x2.extractLane = function(v, i) {
@@ -919,13 +900,6 @@
   float64x2.fromBits = [float32x4, int32x4, int16x8, int8x16,
                         uint32x4, uint16x8, uint8x16];
 
-  int32x4.fromBits = [float32x4, int16x8, int8x16, uint32x4, uint16x8, 
uint8x16];
-  int16x8.fromBits = [float32x4, int32x4, int8x16, uint32x4, uint16x8, 
uint8x16];
-  int8x16.fromBits = [float32x4, int32x4, int16x8, uint32x4, uint16x8, 
uint8x16];
-  uint32x4.fromBits = [float32x4, int32x4, int16x8, int8x16, uint16x8, 
uint8x16];
-  uint16x8.fromBits = [float32x4, int32x4, int16x8, int8x16, uint32x4, 
uint8x16];
-  uint8x16.fromBits = [float32x4, int32x4, int16x8, int8x16, uint32x4, 
uint16x8];
-
   simdTypes.push(float64x2);
   simdTypes.push(bool64x2);
 }
@@ -1217,8 +1191,7 @@
   shiftLeftByScalar:
     function(type) {
       return function(a, bits) {
-        if (bits>>>0 >= type.laneSize * 8)
-          return type.fn.splat(0);
+        bits &= type.laneSize * 8 - 1;
         return simdShiftOp(type, binaryShiftLeft, a, bits);
       }
     },
@@ -1227,14 +1200,12 @@
     function(type) {
       if (type.unsigned) {
         return function(a, bits) {
-          if (bits>>>0 >= type.laneSize * 8)
-            return type.fn.splat(0);
+          bits &= type.laneSize * 8 - 1;
           return simdShiftOp(type, binaryShiftRightLogical, a, bits);
         }
       } else {
         return function(a, bits) {
-          if (bits>>>0 >= type.laneSize * 8)
-            bits = type.laneSize * 8 - 1;
+          bits &= type.laneSize * 8 - 1;
           return simdShiftOp(type, binaryShiftRightArithmetic, a, bits);
         }
       }
@@ -1297,11 +1268,14 @@
 });
 
 // If we're in a browser, the global namespace is named 'window'. If we're
-// in node, it's named 'global'. If we're in a shell, 'this' might work.
+// in node, it's named 'global'. If we're in a web worker, it's named
+// 'self'. If we're in a shell, 'this' might work.
 })(typeof window !== "undefined"
    ? window
    : (typeof process === 'object' &&
       typeof require === 'function' &&
       typeof global === 'object')
      ? global
-     : this);
+     : typeof self === 'object'
+       ? self
+       : this);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/test.simdjs.data-00/src/ecmascript_simd_tests.js 
new/test.simdjs.data-00/src/ecmascript_simd_tests.js
--- old/test.simdjs.data-00/src/ecmascript_simd_tests.js        2015-12-02 
20:07:58.000000000 +0100
+++ new/test.simdjs.data-00/src/ecmascript_simd_tests.js        2016-04-25 
18:45:39.000000000 +0200
@@ -75,7 +75,7 @@
   numerical: true,
   lanes: 4,
   laneSize: 4,
-  interestingValues: [0, -0, 1, -1, 1.414, 0x7F, -0x80, -0x8000, -0x80000000, 
0x7FFF, 0x7FFFFFFF, Infinity, -Infinity, NaN],
+  interestingValues: [0, -0, 1, -1, 0.9, -0.9, 1.414, 0x7F, -0x80, -0x8000, 
-0x80000000, 0x7FFF, 0x7FFFFFFF, Infinity, -Infinity, NaN],
   view: Float32Array,
   buffer: _f32x4,
   mulFn: binaryMul,
@@ -191,6 +191,7 @@
   name: "Bool32x4",
   fn: SIMD.Bool32x4,
   boolLane: true,
+  logical: true,
   lanes: 4,
   laneSize: 4,
   interestingValues: [true, false],
@@ -200,6 +201,7 @@
   name: "Bool16x8",
   fn: SIMD.Bool16x8,
   boolLane: true,
+  logical: true,
   lanes: 8,
   laneSize: 2,
   interestingValues: [true, false],
@@ -209,6 +211,7 @@
   name: "Bool8x16",
   fn: SIMD.Bool8x16,
   boolLane: true,
+  logical: true,
   lanes: 16,
   laneSize: 1,
   interestingValues: [true, false],
@@ -390,10 +393,12 @@
   // Other SIMD types shouldn't check for this type.
   var a = type.fn();
   for (var otherType of simdTypes) {
-    if (otherType === type)
-      equal(a, type.fn.check(a));
-    else
+    if (otherType === type) {
+      var result = type.fn.check(a);
+      checkValue(type, result, function(index) { return type.fn.extractLane(a, 
index); });
+    } else {
       throws(function() { otherType.check(a); });
+    }
   }
   // Neither should other types.
   for (var x of [ {}, "", 0, 1, true, false, undefined, null, NaN, Infinity]) {
@@ -403,7 +408,7 @@
 
 function testReplaceLane(type) {
   equal('function', typeof type.fn.replaceLane);
-  a = createTestValue(type);
+  var a = createTestValue(type);
   for (var v of type.interestingValues) {
     var expected = simdConvert(type, v);
     for (var i = 0; i < type.lanes; i++) {
@@ -491,9 +496,9 @@
   equal('function', typeof toType.fn[name]);
   for (var v of fromType.interestingValues) {
     var fromValue = createSplatValue(fromType, v);
-    v = simdConvert(fromType, v);
+    v = Math.trunc(simdConvert(fromType, v));
     if (toType.minVal !== undefined &&
-        (v < toType.minVal || v > toType.maxVal)) {
+        !(toType.minVal <= v && v <= toType.maxVal)) {
       throws(function() { toType.fn[name](fromValue) });
     } else {
       v = simdConvert(toType, v);
@@ -647,6 +652,18 @@
     var a = loadFn(buf, i);
     checkValue(type, a, function(index) { return index < count ? i + index : 
0; });
   }
+
+  // Test index coercions.
+  // Unlike typedArray[index], non-canonical strings are allowed here.
+  checkValue(type, loadFn(buf, "0"),      function(index) { return index < 
count ? index : 0; });
+  checkValue(type, loadFn(buf, " -0.0 "), function(index) { return index < 
count ? index : 0; });
+  checkValue(type, loadFn(buf, "00"),     function(index) { return index < 
count ? index : 0; });
+  checkValue(type, loadFn(buf, false),    function(index) { return index < 
count ? index : 0; });
+  checkValue(type, loadFn(buf, null),     function(index) { return index < 
count ? index : 0; });
+  checkValue(type, loadFn(buf, "01"),     function(index) { return index < 
count ? 1 + index : 0; });
+  checkValue(type, loadFn(buf, " +1e0"),  function(index) { return index < 
count ? 1 + index : 0; });
+  checkValue(type, loadFn(buf, true),     function(index) { return index < 
count ? 1 + index : 0; });
+
   // Test the 2 possible over-alignments.
   var f64 = new Float64Array(ab);
   var stride = 8 / type.laneSize;
@@ -668,6 +685,9 @@
     throws(function () { loadFn(buf, index); });
   }
   testIndexCheck(buf, -1);
+  testIndexCheck(buf, 0.7);
+  testIndexCheck(buf, -0.1);
+  testIndexCheck(buf, NaN);
   testIndexCheck(buf, bufSize / type.laneSize - count + 1);
   testIndexCheck(buf.buffer, 1);
   testIndexCheck(buf, "a");
@@ -691,6 +711,16 @@
     storeFn(buf, i, a);
     ok(checkBuffer(i));
   }
+
+  // Test index coercions.
+  storeFn(buf, "0", a);      ok(checkBuffer(0));
+  storeFn(buf, "01", a);     ok(checkBuffer(1));
+  storeFn(buf, " -0.0 ", a); ok(checkBuffer(0));
+  storeFn(buf, " +1e0", a);  ok(checkBuffer(1));
+  storeFn(buf, false, a);    ok(checkBuffer(0));
+  storeFn(buf, true, a);     ok(checkBuffer(1));
+  storeFn(buf, null, a);     ok(checkBuffer(0));
+
   // Test the 2 over-alignments.
   var f64 = new Float64Array(ab);
   var stride = 8 / type.laneSize;
@@ -844,12 +874,6 @@
   test(type.name + ' mul', function() {
     testBinaryOp(type, 'mul', type.mulFn);
   });
-  test(type.name + ' min', function() {
-    testBinaryOp(type, 'min', Math.min);
-  });
-  test(type.name + ' max', function() {
-    testBinaryOp(type, 'max', Math.max);
-  });
   test(type.name + ' select', function() {
     testSelect(type);
   });
@@ -911,7 +935,13 @@
     testBinaryOp(type, 'div', function(a, b) { return a / b; });
   });
   test(type.name + ' abs', function() {
-    testBinaryOp(type, 'abs', Math.abs);
+    testUnaryOp(type, 'abs', Math.abs);
+  });
+  test(type.name + ' min', function() {
+    testBinaryOp(type, 'min', Math.min);
+  });
+  test(type.name + ' max', function() {
+    testBinaryOp(type, 'max', Math.max);
   });
   test(type.name + ' minNum', function() {
     testBinaryOp(type, 'minNum', minNum);
@@ -936,7 +966,7 @@
   });
   test(type.name + ' shiftLeftByScalar', function() {
     function shift(a, bits) {
-      if (bits>>>0 >= type.laneSize * 8) return 0;
+      bits &= type.laneSize * 8 - 1;
       return a << bits;
     }
     testShiftOp(type, 'shiftLeftByScalar', shift);
@@ -946,8 +976,7 @@
 simdTypes.filter(isSignedIntType).forEach(function(type) {
   test(type.name + ' shiftRightByScalar', function() {
     function shift(a, bits) {
-      if (bits>>>0 >= type.laneSize * 8)
-        bits = type.laneSize * 8 - 1;
+      bits &= type.laneSize * 8 - 1;
       return a >> bits;
     }
     testShiftOp(type, 'shiftRightByScalar', shift);
@@ -957,7 +986,7 @@
 simdTypes.filter(isUnsignedIntType).forEach(function(type) {
   test(type.name + ' shiftRightByScalar', function() {
     function shift(a, bits) {
-      if (bits>>>0 >= type.laneSize * 8) return 0;
+      bits &= type.laneSize * 8 - 1;
       if (type.laneMask)
         a &= type.laneMask;
       return a >>> bits;
@@ -1048,11 +1077,35 @@
   equal(12.0, SIMD.Float32x4.extractLane(n, 3));
 });
 
+function equalInt32x4(a, b) {
+  equal(SIMD.Int32x4.extractLane(a, 0), SIMD.Int32x4.extractLane(b, 0));
+  equal(SIMD.Int32x4.extractLane(a, 1), SIMD.Int32x4.extractLane(b, 1));
+  equal(SIMD.Int32x4.extractLane(a, 2), SIMD.Int32x4.extractLane(b, 2));
+  equal(SIMD.Int32x4.extractLane(a, 3), SIMD.Int32x4.extractLane(b, 3));
+}
+
 test('Float32x4 Int32x4 round trip', function() {
   // NaNs should stay unmodified across bit conversions
-  m = SIMD.Int32x4(0xFFFFFFFF, 0xFFFF0000, 0x80000000, 0x0);
+  var m = SIMD.Int32x4(0xFFFFFFFF, 0xFFFF0000, 0x80000000, 0x0);
   var m2 = SIMD.Int32x4.fromFloat32x4Bits(SIMD.Float32x4.fromInt32x4Bits(m));
   // NaNs may be canonicalized, so these tests may fail in some 
implementations.
-  equal(SIMD.Int32x4.extractLane(m, 0), SIMD.Int32x4.extractLane(m2, 0));
-  equal(SIMD.Int32x4.extractLane(m, 1), SIMD.Int32x4.extractLane(m2, 1));
+  equalInt32x4(m, m2);
+});
+
+test('Float32x4 Int32x4 load/store bit preservation', function() {
+   // NaNs should stay unmodified when storing and loading to Float32Array
+  var taf32 = new Float32Array(4);
+  var tai32 = new Int32Array(4);
+  var i4a, i4b;
+  i4a = SIMD.Int32x4(0x7fc00000,0x7fe00000,0x7ff00000,0x7ff80000);
+  SIMD.Int32x4.store(taf32, 0, i4a);
+  i4b = SIMD.Int32x4.load(taf32, 0);
+  equalInt32x4(i4a, i4b);
+
+  // NaNs should stay unmodified when loading as Float32x4 and storing as 
Int32x4
+  SIMD.Int32x4.store(taf32, 0, i4a);
+  var f4 = SIMD.Float32x4.load(taf32, 0);
+  SIMD.Float32x4.store(tai32, 0, f4);
+  i4b = SIMD.Int32x4.load(tai32, 0);
+  equalInt32x4(i4a, i4b);
 });
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/test.simdjs.data-00/src/shell_test_runner.js 
new/test.simdjs.data-00/src/shell_test_runner.js
--- old/test.simdjs.data-00/src/shell_test_runner.js    2015-12-02 
20:07:58.000000000 +0100
+++ new/test.simdjs.data-00/src/shell_test_runner.js    2016-04-25 
18:45:39.000000000 +0200
@@ -26,8 +26,6 @@
   currentName = name;
   if (typeof skipValueTests !== 'undefined' && skipValueTests &&
       name.indexOf('value semantics') != -1) return;
-  if (typeof skipRoundTripTests !== 'undefined' && skipRoundTripTests &&
-      name.indexOf('Float32x4 Int32x4 round trip') != -1) return;
   try {
     func();
   } catch (e) {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/test.simdjs.data-00/tc39/spec.html 
new/test.simdjs.data-00/tc39/spec.html
--- old/test.simdjs.data-00/tc39/spec.html      2015-12-02 20:07:58.000000000 
+0100
+++ new/test.simdjs.data-00/tc39/spec.html      2016-04-25 18:45:39.000000000 
+0200
@@ -61,6 +61,8 @@
 <li>v0.8.3: Better explanations and changes based on editor review</li>
 <li>v0.8.4: Merge signed and unsigned shifts into one function name</li>
 <li>v0.9: Remove horizontalSum/absoluteDifference; improve phrasing based on 
reviews</li>
+<li>v0.9.1: Throw on NaN in logical conversion. Limit logical conversion to be 
between Integer and Float types only</li>
+<li>v0.9.2: Changed the *shiftByScalar semantics to used the same masked 
semantics that the scalar shifts are using</li>
 </ul>
 </emu-intro>
 
@@ -281,7 +283,7 @@
 
 <emu-clause id="simd-types">
 <h1>SIMD types</h1>
-A SIMD value is a homogeneous vector of a Numbers or Booleans, possibly from a 
restricted range. Each SIMD value is represented as a record with the following 
immutable fields:
+A SIMD value is a homogeneous vector of Numbers or Booleans, possibly from a 
restricted range. Each SIMD value is represented as a record with the following 
immutable fields:
 
 <ul>
 <li>[[SIMDTypeDescriptor]], which refers to the type descriptor for the 
type.</li>
@@ -289,6 +291,7 @@
 </ul>
 <emu-note>The [[SIMDTypeDescriptor]] field effectively determines its type. 
The SIMD type descriptors are defined in <a href="#simd-descriptor-table">a 
table</a>.</emu-note>
 <emu-note>A list which is in the [[SIMDElements]] of a SIMD value field is 
never modified.</emu-note>
+<emu-note>[[SIMDElements]] is a list of Number values for integer and floating 
point SIMD types, and Boolean values for boolean SIMD types.</emu-note>
 
 SIMD type descriptors are records with the following fields:
 <ul>
@@ -795,8 +798,10 @@
 </emu-clause>
 
 <emu-clause id="fround" aoid="ToFloat32">
-<h1>ToFloat32( x )</h1>
+<h1>ToFloat32( argument )</h1>
 <emu-alg>
+1. Let x be ToNumber(argument).
+1. ReturnIfAbrupt(x).
 1. If x is NaN, return NaN.
 1. If x is one of +0, −0, +∞, −∞, return x.
 1. Let x32 be the result of converting x to a value in IEEE 754-2008 binary32 
format using roundTiesToEven.
@@ -820,8 +825,8 @@
 <emu-clause id="imul" aoid="MathImul">
 <h1>MathImul(n, m)</h1>
 <emu-alg>
-1. Let _a_ be ToUint32(_x_).
-1. Let _b_ be ToUint32(_y_).
+1. Let _a_ be ToUint32(_n_).
+1. Let _b_ be ToUint32(_m_).
 1. Let _product_ be (_a_ × b) modulo 2<sup>32</sup>.
 1. If _product_ ≥ 2<sup>31</sup>, return _product_ − 2<sup>32</sup>, otherwise 
return _product_.
 </emu-alg>
@@ -1124,7 +1129,7 @@
 </emu-clause>
 
 <emu-clause id="simd-reciprocal-approximation">
-<h1>_SIMD_Constructor.reciprocalApproximation(a, b)</h1>
+<h1>_SIMD_Constructor.reciprocalApproximation(a)</h1>
 This operation is only defined on <a href="#simd-floating-point-type">floating 
point</a> SIMD types.
 <emu-alg>
 1. If _a_.[[SIMDTypeDescriptor]] is not _SIMD_Descriptor, throw a TypeError 
exception.
@@ -1222,7 +1227,7 @@
 <h1>_SIMD_Constructor.lessThanOrEqual(a, b)</h1>
 <p>This definition uses `<=` to refer to the abstract operation defined by <a 
href="http://www.ecma-international.org/ecma-262/6.0/#sec-abstract-relational-comparison";>ES2015
 7.2.11 (Abstract Relational Comparison)</a>.</p>
 
-This operation exists only on integer and floating point SIMD types.
+This operation exists only on <a href="#simd-integer-type">integer</a> and <a 
href="#simd-floating-point-type">floating point</a> SIMD types.
 
 <emu-alg>
 1. If _a_.[[SIMDTypeDescriptor]] is not _SIMD_Descriptor or 
_b_.[[SIMDTypeDescriptor]] is not _SIMD_Descriptor, throw a TypeError exception.
@@ -1358,28 +1363,24 @@
 <emu-alg>
 1. If _a_.[[SIMDTypeDescriptor]] is not _SIMD_Descriptor, throw a TypeError 
exception.
 1. Let _scalar_ be ToUint32(_bits_).
-1. If _scalar_ &ge; _SIMD_Descriptor.[[ElementSize]] &times; 8, then
-  1. Let _list_ be a list of length _SIMD_Descriptor.[[VectorLength]], filled 
with 0.
-  1. return SIMDCreate(_SIMD_Descriptor, _list_).
-1. Let _result_ be SIMDScalarOp(_a_, _scalar_, `<<`).
+1. Let _shiftCount_ be _scalar_ modulo (_SIMD_Descriptor.[[ElementSize]] 
&times; 8)
+1. Let _result_ be SIMDScalarOp(_a_, _shiftCount_, `<<`).
 1. ReturnIfAbrupt(_result_).
 1. Return _result_.
 </emu-alg>
-<emu-note>Unlike ECMAScript scalar shift, there is no "wrap-around" 
behavior.</emu-note>
+<emu-note>The "masked" shift count semantics matches the ECMAScript scalar 
shift semantics.</emu-note>
 </emu-clause>
 
 <emu-clause id="simd-shift-right-by-scalar">
 <h1>_SIMD_Constructor.shiftRightByScalar( a, bits )</h1>
-This operation is only defined on <a href="#simd-integer-type">integer</a> 
SIMD types. 
+This operation is only defined on <a href="#simd-integer-type">integer</a> 
SIMD types.
 
 On <a href="#simd-unsigned-integer-type">unsigned</a> SIMD types, the 
following definition is used. This definition uses `>>>` to refer to the 
abstract operation defined by <a 
href="http://www.ecma-international.org/ecma-262/6.0/#sec-unsigned-right-shift-operator";>ES2015
 12.8.5 (The Unsigned Right Shift Operator ( >>> ))</a>.
 <emu-alg>
 1. If _a_.[[SIMDTypeDescriptor]] is not _SIMD_Descriptor, throw a TypeError 
exception.
 1. Let _scalar_ be ToUint32(_bits_).
-1. If _scalar_ &ge; _SIMD_Descriptor.[[ElementSize]] &times; 8, then
-  1. Let _list_ be a list of length _SIMD_Descriptor.[[VectorLength]], filled 
with 0.
-  1. return SIMDCreate(_SIMD_Descriptor, _list_).
-1. Let _result_ be SIMDScalarOp(_a_, _scalar_, `>>>`).
+1. Let _shiftCount_ be _scalar_ modulo (_SIMD_Descriptor.[[ElementSize]] 
&times; 8)
+1. Let _result_ be SIMDScalarOp(_a_, _shiftCount_, `>>>`).
 1. ReturnIfAbrupt(_result_).
 1. Return _result_.
 </emu-alg>
@@ -1387,13 +1388,12 @@
 <emu-alg>
 1. If _a_.[[SIMDTypeDescriptor]] is not _SIMD_Descriptor, throw a TypeError 
exception.
 1. Let _scalar_ be ToUint32(_bits_).
-1. If _scalar_ &ge; _SIMD_Descriptor.[[ElementSize]] &times; 8, then
-  1. Let _scalar_ be _SIMD_Descriptor.[[ElementSize]] &times; 8 - 1.
-1. Let _result_ be SIMDScalarOp(_a_, _scalar_, `>>`).
+1. Let _shiftCount_ be _scalar_ modulo (_SIMD_Descriptor.[[ElementSize]] 
&times; 8)
+1. Let _result_ be SIMDScalarOp(_a_, _shiftCount_, `>>`).
 1. ReturnIfAbrupt(_result_).
 1. Return _result_.
 </emu-alg>
-<emu-note>In both definitions, unlike ECMAScript scalar shift, there is no 
"wrap-around" behavior.</emu-note>
+<emu-note>The "masked" shift count semantics matches the ECMAScript scalar 
shift semantics.</emu-note>
 </emu-clause>
 
 <emu-clause id="simd-extract-lane">
@@ -1416,7 +1416,7 @@
 <h1>_SIMD_Constructor.store( tarray, index, simd )</h1>
 <p>This is defined when _SIMD_Descriptor has a [[SerializeElement]] field.</p>
 
-This operation exists only on integer and floating point SIMD types.
+This operation exists only on <a href="#simd-integer-type">integer</a> and <a 
href="#simd-floating-point-type">floating point</a> SIMD types.
 
 <emu-alg>
 1. Return SIMDStoreInTypedArray(_tarray_, _index_, _SIMD_Descriptor, _simd_).
@@ -1427,7 +1427,7 @@
 <h1>_SIMD_Constructor.store1( tarray, index, simd )</h1>
 <p>This function is defined only on SIMD types where 
_SIMD_Descriptor.[[VectorLength]] = 4, and when _SIMD_Descriptor has a 
[[SerializeElement]] field.</p>
 
-This operation exists only on integer and floating point SIMD types.
+This operation exists only on <a href="#simd-integer-type">integer</a> and <a 
href="#simd-floating-point-type">floating point</a> SIMD types.
 
 <emu-alg>
 1. Return SIMDStoreInTypedArray(_tarray_, _index_, _SIMD_Descriptor, _simd_, 
1).
@@ -1438,7 +1438,7 @@
 <h1>_SIMD_Constructor.store2( tarray, index, simd )</h1>
 <p>This function is defined only on SIMD types where 
_SIMD_Descriptor.[[VectorLength]] = 4, and when _SIMD_Descriptor has a 
[[SerializeElement]] field.</p>
 
-This operation exists only on integer and floating point SIMD types.
+This operation exists only on <a href="#simd-integer-type">integer</a> and <a 
href="#simd-floating-point-type">floating point</a> SIMD types.
 <emu-alg>
 1. Return SIMDStoreInTypedArray(_tarray_, _index_, _SIMD_Descriptor, _simd_, 
2).
 </emu-alg>
@@ -1448,7 +1448,7 @@
 <h1>_SIMD_Constructor.store3( tarray, index, simd )</h1>
 <p>This function is defined only on SIMD types where 
_SIMD_Descriptor.[[VectorLength]] = 4, and when _SIMD_Descriptor has a 
[[SerializeElement]] field.</p>
 
-This operation exists only on integer and floating point SIMD types.
+This operation exists only on <a href="#simd-integer-type">integer</a> and <a 
href="#simd-floating-point-type">floating point</a> SIMD types.
 <emu-alg>
 1. Return SIMDStoreInTypedArray(_tarray_, _index_, _SIMD_Descriptor, _simd_, 
3).
 </emu-alg>
@@ -1458,7 +1458,7 @@
 <h1>_SIMD_Constructor.load( tarray, index )</h1>
 <p>This function is defined only on SIMD types where _SIMD_Descriptor has a 
[[DeserializeElement]] field.</p>
 
-This operation exists only on integer and floating point SIMD types.
+This operation exists only on <a href="#simd-integer-type">integer</a> and <a 
href="#simd-floating-point-type">floating point</a> SIMD types.
 
 <emu-note>`load` takes a TypedArray of any element type as an argument. One 
way to use it is to pass in a `Uint8Array` regardless of SIMD type, which is 
useful because it allows the compiler to eliminate the shift in going from the 
index to the pointer offset. Other options considered were to use an 
ArrayBuffer (but this is not idiomatic, to take an ArrayBuffer directly as an 
argument to read off of) or a DataView (but DataViews don't tend to expose 
platform-dependent endianness, which is important here, and they tend to use 
methods on `DataView.prototype`, which are harder to optimize in an asm.js 
context).</emu-note>
 <emu-alg>
@@ -1470,7 +1470,7 @@
 <h1>_SIMD_Constructor.load1(tarray, index)</h1>
 <p>This function is defined only on SIMD types where 
_SIMD_Descriptor.[[VectorLength]] = 4 and _SIMD_Descriptor has a 
[[DeserializeElement]] field.</p>
 
-This operation exists only on integer and floating point SIMD types.
+This operation exists only on <a href="#simd-integer-type">integer</a> and <a 
href="#simd-floating-point-type">floating point</a> SIMD types.
 <emu-alg>
 1. Return SIMDLoadFromTypedArray(_tarray_, _index_, _SIMD_Descriptor, 1).
 </emu-alg>
@@ -1480,7 +1480,7 @@
 <h1>_SIMD_Constructor.load2(tarray, index)</h1>
 <p>This function is defined only on SIMD types where 
_SIMD_Descriptor.[[VectorLength]] = 4 and _SIMD_Descriptor has a 
[[DeserializeElement]] field.</p>
 
-This operation exists only on integer and floating point SIMD types.
+This operation exists only on <a href="#simd-integer-type">integer</a> and <a 
href="#simd-floating-point-type">floating point</a> SIMD types.
 <emu-alg>
 1. Return SIMDLoadFromTypedArray(_tarray_, _index_, _SIMD_Descriptor, 2).
 </emu-alg>
@@ -1490,7 +1490,7 @@
 <h1>_SIMD_Constructor.load3(tarray, index)</h1>
 <p>This function is defined only on SIMD types where 
_SIMD_Descriptor.[[VectorLength]] = 4 and _SIMD_Descriptor has a 
[[DeserializeElement]] field.</p>
 
-This operation exists only on integer and floating point SIMD types.
+This operation exists only on <a href="#simd-integer-type">integer</a> and <a 
href="#simd-floating-point-type">floating point</a> SIMD types.
 <emu-alg>
 1. Return SIMDLoadFromTypedArray(_tarray_, _index_, _SIMD_Descriptor, 3).
 </emu-alg>
@@ -1498,7 +1498,7 @@
 
 <emu-clause id="simd-to-timd">
 <h1><var>SIMD</var>Constructor.from<var>TIMD</var>Bits( value )</h1>
-In this definition, _TIMD_ ranges over all SIMD types for which 
_SIMD_Descriptor.[[ElementSize]] &times; _SIMD_Descriptor.[[VectorLength]] = 
_TIMD_Descriptor.[[ElementSize]] &times; _TIMD_Descriptor.[[VectorLength]], 
unless one descriptor does not have a [[SerializeElement]] field.
+In this definition, _TIMD_ is not _SIMD_, and _TIMD_ ranges over all SIMD 
types for which _SIMD_Descriptor.[[ElementSize]] &times; 
_SIMD_Descriptor.[[VectorLength]] = _TIMD_Descriptor.[[ElementSize]] &times; 
_TIMD_Descriptor.[[VectorLength]], unless one descriptor does not have a 
[[SerializeElement]] field.
 <emu-note>All of the SIMD types described in this spec are 16 bytes, but 
Booleans have no serialization, so all pairs of types which do not include 
Booleans are included.</emu-note>
 <emu-alg>
 1. If _value_.[[SIMDTypeDescriptor]] is not _TIMD_Descriptor, throw a 
TypeError exception.
@@ -1508,19 +1508,25 @@
 
 <emu-clause id="simd-to-timd-logical">
 <h1><var>SIMD</var>Constructor.from<var>TIMD</var>( value )</h1>
-In this definition, _TIMD_ ranges over all SIMD types for which 
_SIMD_Descriptor.[[VectorLength]] = _TIMD_Descriptor.[[VectorLength]], and 
where _SIMD_ and _TIMD_ are not boolean types.
+In this definition, _TIMD_ is not _SIMD_, _TIMD_ ranges over all SIMD types 
for which _SIMD_Descriptor.[[VectorLength]] = 
_TIMD_Descriptor.[[VectorLength]], neither of _SIMD_ and _TIMD_ are of boolean 
type, and _SIMD_ and _TIMD_ are not both integer types.
 <emu-alg>
 1. If _value_.[[SIMDTypeDescriptor]] is not _TIMD_Descriptor, throw a 
TypeError exception.
 1. Let _list_ be a copy of _value_.[[SIMDElements]].
-1. For _element_ in _list_,
-  1. If _SIMD_ is an integer type and _TIMD_ is a floating point type, and 
_element_ is greater than the maximum value or less than the minimum value of 
_SIMD_, throw a *RangeError* exception.
+1. If _SIMD_ is an integer type and _TIMD_ is a floating point type,
+  1. For _element_ in _list_,
+    1. If _element_ is *NaN*, throw a *RangeError* exception.
+    1. Let _intElement_ be ToInteger(_element_).
+    1. If _intElement_ `>` _SIMD_Descriptor.[[ElementMax]] or _intElement_ `<` 
_SIMD_Descriptor.[[ElementMin]], throw a *RangeError* exception.
 1. Return SIMDCreate(_SIMD_Descriptor, _list_).
 </emu-alg>
+<emu-note>
+This definition uses `<` and `>` to refer to the abstract operation defined by 
<a 
href="http://www.ecma-international.org/ecma-262/6.0/#sec-abstract-relational-comparison";>ES2015
 7.2.11 (Abstract Relational Comparison)</a>
+</emu-note>
 </emu-clause>
 
 <emu-clause id="swizzle">
 <h1>_SIMD_Constructor.swizzle( a, ...lanes )</h1>
-This operation exists only on integer and floating point SIMD types.
+This operation exists only on <a href="#simd-integer-type">integer</a> and <a 
href="#simd-floating-point-type">floating point</a> SIMD types.
 
 <emu-alg>
 1. If _a_.[[SIMDTypeDescriptor]] is not _SIMD_Descriptor, throw a *TypeError* 
exception.
@@ -1540,7 +1546,7 @@
 
 <emu-clause id="shuffle">
 <h1>_SIMD_Constructor.shuffle( a, b, ...lanes )</h1>
-This operation exists only on integer and floating point SIMD types.
+This operation exists only on <a href="#simd-integer-type">integer</a> and <a 
href="#simd-floating-point-type">floating point</a> SIMD types.
 
 <emu-alg>
 1. If _a_.[[SIMDTypeDescriptor]] is not _SIMD_Descriptor, or if 
_b_.[[SIMDTypeDescriptor]] is not _SIMD_Descriptor, throw a *TypeError* 
exception.
@@ -1751,69 +1757,69 @@
 <tr>
 <td>Int16x8</td>
 <td><a href="#simd-signed-integer-type">signed integer</a></td>
-<td>8</li>
-<td>2</li>
-<td>ToInt16</li>
+<td>8</td>
+<td>2</td>
+<td>ToInt16</td>
 <td>SerializeInt(Int16x8Descriptor)</td>
 <td>DeserializeInt(Int16x8Descriptor)</td>
-<td>2<sup>15</sup>-1</li>
-<td>-2<sup>15</sup></li>
+<td>2<sup>15</sup>-1</td>
+<td>-2<sup>15</sup></td>
 </tr>
 
 <tr>
 <td>Int8x16</td>
 <td><a href="#simd-signed-integer-type">signed integer</a></td>
-<td>16</li>
-<td>1</li>
-<td>ToInt8</li>
+<td>16</td>
+<td>1</td>
+<td>ToInt8</td>
 <td>SerializeInt(Int8x16Descriptor)</td>
 <td>DeserializeInt(Int8x16Descriptor)</td>
-<td>127</li>
-<td>-128</li>
+<td>127</td>
+<td>-128</td>
 </tr>
 
 <tr>
 <td>Uint32x4</td>
 <td><a href="#simd-unsigned-integer-type">unsigned integer</a></td>
-<td>4</li>
-<td>4</li>
-<td>ToUint32</li>
+<td>4</td>
+<td>4</td>
+<td>ToUint32</td>
 <td>SerializeInt(Uint32x4Descriptor)</td>
 <td>DeserializeInt(Uint32x4Descriptor)</td>
-<td>2<sup>32</sup>-1</li>
-<td>0</li>
+<td>2<sup>32</sup>-1</td>
+<td>0</td>
 </tr>
 
 <tr>
 <td>Uint16x8</td>
 <td><a href="#simd-unsigned-integer-type">unsigned integer</a></td>
-<td>8</li>
-<td>2</li>
-<td>ToUint16</li>
+<td>8</td>
+<td>2</td>
+<td>ToUint16</td>
 <td>SerializeInt(Uint16x8Descriptor)</td>
 <td>DeserializeInt(Uint16x8Descriptor)</td>
-<td>2<sup>16</sup>-1</li>
-<td>0</li>
+<td>2<sup>16</sup>-1</td>
+<td>0</td>
 </tr>
 
 <tr>
 <td>Uint8x16</td>
 <td><a href="#simd-unsigned-integer-type">unsigned integer</a></td>
-<td>16</li>
-<td>1</li>
-<td>ToUint8</li>
+<td>16</td>
+<td>1</td>
+<td>ToUint8</td>
 <td>SerializeInt(Uint8x16Descriptor)</td>
 <td>DeserializeInt(Uint8x16Descriptor)</td>
-<td>255</li>
-<td>0</li>
+<td>255</td>
+<td>0</td>
 </tr>
 
 <tr>
 <td>Bool32x4</td>
 <td><a href="#simd-boolean-type">boolean</a></td>
-<td>4</li>
+<td>4</td>
 <td></td>
-<td>ToBoolean</li>
+<td>ToBoolean</td>
 <td></td>
 <td></td>
 <td></td>
@@ -1823,9 +1829,9 @@
 <tr>
 <td>Bool16x8</td>
 <td><a href="#simd-boolean-type">boolean</a></td>
-<td>8</li>
+<td>8</td>
 <td></td>
-<td>ToBoolean</li>
+<td>ToBoolean</td>
 <td></td>
 <td></td>
 <td></td>
@@ -1835,9 +1841,9 @@
 <tr>
 <td>Bool8x16</td>
 <td><a href="#simd-boolean-type">boolean</a></td>
-<td>16</li>
+<td>16</td>
 <td></td>
-<td>ToBoolean</li>
+<td>ToBoolean</td>
 <td></td>
 <td></td>
 <td></td>

++++++ test.test262.data-00.tar.bz2 ++++++
++++ 367077 lines of diff (skipped)

++++++ third_party.icu-46.tar.bz2 ++++++
/work/SRC/openSUSE:Factory/v8/third_party.icu-46.tar.bz2 
/work/SRC/openSUSE:Factory/.v8.new/third_party.icu-46.tar.bz2 differ: char 11, 
line 1

++++++ tools.swarming_client-00.tar.bz2 ++++++
++++ 57889 lines of diff (skipped)

++++++ trace_event-00.tar.bz2 ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/trace_event-00/trace_event_common.h 
new/trace_event-00/trace_event_common.h
--- old/trace_event-00/trace_event_common.h     2016-07-21 18:23:10.000000000 
+0200
+++ new/trace_event-00/trace_event_common.h     2016-05-13 22:36:53.000000000 
+0200
@@ -612,13 +612,6 @@
       TRACE_EVENT_PHASE_ASYNC_BEGIN, category_group, name, id,             \
       TRACE_EVENT_API_CURRENT_THREAD_ID, timestamp, TRACE_EVENT_FLAG_NONE, \
       arg1_name, arg1_val)
-#define TRACE_EVENT_ASYNC_BEGIN_WITH_TIMESTAMP2(category_group, name, id,      
\
-                                                timestamp, arg1_name,          
\
-                                                arg1_val, arg2_name, arg2_val) 
\
-  INTERNAL_TRACE_EVENT_ADD_WITH_ID_TID_AND_TIMESTAMP(                          
\
-      TRACE_EVENT_PHASE_ASYNC_BEGIN, category_group, name, id,                 
\
-      TRACE_EVENT_API_CURRENT_THREAD_ID, timestamp, TRACE_EVENT_FLAG_NONE,     
\
-      arg1_name, arg1_val, arg2_name, arg2_val)
 #define TRACE_EVENT_COPY_ASYNC_BEGIN_WITH_TIMESTAMP0(category_group, name, id, 
\
                                                      timestamp)                
\
   INTERNAL_TRACE_EVENT_ADD_WITH_ID_TID_AND_TIMESTAMP(                          
\
@@ -708,13 +701,6 @@
       TRACE_EVENT_PHASE_ASYNC_END, category_group, name, id,                  \
       TRACE_EVENT_API_CURRENT_THREAD_ID, timestamp, TRACE_EVENT_FLAG_NONE,    \
       arg1_name, arg1_val)
-#define TRACE_EVENT_ASYNC_END_WITH_TIMESTAMP2(category_group, name, id,       \
-                                              timestamp, arg1_name, arg1_val, \
-                                              arg2_name, arg2_val)            \
-  INTERNAL_TRACE_EVENT_ADD_WITH_ID_TID_AND_TIMESTAMP(                         \
-      TRACE_EVENT_PHASE_ASYNC_END, category_group, name, id,                  \
-      TRACE_EVENT_API_CURRENT_THREAD_ID, timestamp, TRACE_EVENT_FLAG_NONE,    \
-      arg1_name, arg1_val, arg2_name, arg2_val)
 
 // NESTABLE_ASYNC_* APIs are used to describe an async operation, which can
 // be nested within a NESTABLE_ASYNC event and/or have inner NESTABLE_ASYNC
@@ -1001,17 +987,6 @@
   INTERNAL_TRACE_EVENT_SCOPED_CONTEXT(category_group, name,       \
                                       TRACE_ID_DONT_MANGLE(context))
 
-// Macro to specify that two trace IDs are identical. For example,
-// TRACE_BIND_IDS(
-//     "category", "name",
-//     TRACE_ID_WITH_SCOPE("net::URLRequest", 0x1000),
-//     TRACE_ID_WITH_SCOPE("blink::ResourceFetcher::FetchRequest", 0x2000))
-// tells the trace consumer that events with ID ("net::URLRequest", 0x1000) 
from
-// the current process have the same ID as events with ID
-// ("blink::ResourceFetcher::FetchRequest", 0x2000).
-#define TRACE_BIND_IDS(category_group, name, id, bind_id) \
-  INTERNAL_TRACE_EVENT_ADD_BIND_IDS(category_group, name, id, bind_id);
-
 // Macro to efficiently determine if a given category group is enabled.
 #define TRACE_EVENT_CATEGORY_GROUP_ENABLED(category_group, ret)             \
   do {                                                                      \
@@ -1077,7 +1052,6 @@
 #define TRACE_EVENT_PHASE_CLOCK_SYNC ('c')
 #define TRACE_EVENT_PHASE_ENTER_CONTEXT ('(')
 #define TRACE_EVENT_PHASE_LEAVE_CONTEXT (')')
-#define TRACE_EVENT_PHASE_BIND_IDS ('=')
 
 // Flags for changing the behavior of TRACE_EVENT_API_ADD_TRACE_EVENT.
 #define TRACE_EVENT_FLAG_NONE (static_cast<unsigned int>(0))

++++++ v8_deprecated_readdir_r.patch ++++++
>From 38c57c5ddb34581370279f13ecf131247b4357d0 Mon Sep 17 00:00:00 2001
From: rmcilroy <rmcil...@chromium.org>
Date: Fri, 30 Sep 2016 04:05:17 -0700
Subject: [PATCH] [Test] Don't call deprecated readdir_r in
 generate-bytecode-expectations.

Review-Url: https://codereview.chromium.org/2385653002
Cr-Commit-Position: refs/heads/master@{#39911}

---
 test/cctest/interpreter/generate-bytecode-expectations.cc |    7 +++----
 1 file changed, 3 insertions(+), 4 deletions(-)

Index: v8-5.3.332.47/test/cctest/interpreter/generate-bytecode-expectations.cc
===================================================================
--- v8-5.3.332.47.orig/test/cctest/interpreter/generate-bytecode-expectations.cc
+++ v8-5.3.332.47/test/cctest/interpreter/generate-bytecode-expectations.cc
@@ -174,15 +174,14 @@ bool CollectGoldenFiles(std::vector<std:
   DIR* directory = opendir(directory_path);
   if (!directory) return false;
 
-  dirent entry_buffer;
-  dirent* entry;
-
-  while (readdir_r(directory, &entry_buffer, &entry) == 0 && entry) {
+  dirent* entry = readdir(directory);
+  while (entry) {
     if (StrEndsWith(entry->d_name, ".golden")) {
       std::string golden_filename(kGoldenFilesPath);
       golden_filename += entry->d_name;
       golden_file_list->push_back(golden_filename);
     }
+    entry = readdir(directory);
   }
 
   closedir(directory);

Reply via email to