From cc9a94c464e78a8b671f578d58655f5149bd2e89 Mon Sep 17 00:00:00 2001
From: Alon Zakai <alonzakai@gmail.com>
Date: Thu, 7 Jul 2016 16:02:51 -0700
Subject: [PATCH 01/10] better error reporting in openjpeg test

---
 tests/test_core.py | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/tests/test_core.py b/tests/test_core.py
index 02b3cf1c0e9a3..a2f7a02109185 100644
--- a/tests/test_core.py
+++ b/tests/test_core.py
@@ -6506,9 +6506,9 @@ def image_compare(output, err):
 
       image_mean = 83.265
       #print '[image stats:', js_mean, image_mean, true_mean, diff_mean, num, ']'
-      assert abs(js_mean - image_mean) < 0.01
-      assert abs(true_mean - image_mean) < 0.01
-      assert diff_mean < 0.01
+      assert abs(js_mean - image_mean) < 0.01, [js_mean, image_mean]
+      assert abs(true_mean - image_mean) < 0.01, [true_mean, image_mean]
+      assert diff_mean < 0.01, diff_mean
 
       return output
 

From 5357d7dfde85072cfa14a2190e86ea5cf19225e0 Mon Sep 17 00:00:00 2001
From: Alon Zakai <alonzakai@gmail.com>
Date: Thu, 7 Jul 2016 17:17:12 -0700
Subject: [PATCH 02/10] fix an incorrect part of test_ssr

---
 tests/test_core.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/tests/test_core.py b/tests/test_core.py
index a2f7a02109185..b32e758c17724 100644
--- a/tests/test_core.py
+++ b/tests/test_core.py
@@ -2424,7 +2424,7 @@ def test_ssr(self): # struct self-ref
           struct opj_mqc_state *nlps;
         } opj_mqc_state_t;
 
-        static opj_mqc_state_t mqc_states[2] = {
+        static opj_mqc_state_t mqc_states[4] = {
           {0x5600, 0, &mqc_states[2], &mqc_states[3]},
           {0x5602, 1, &mqc_states[3], &mqc_states[2]},
         };

From 8c290277c3f634b6a767b073f6a2bc33b2bc6849 Mon Sep 17 00:00:00 2001
From: Alon Zakai <alonzakai@gmail.com>
Date: Thu, 14 Jul 2016 13:57:59 -0700
Subject: [PATCH 03/10] ignore nans in some simd tests due to an upstream llvm
 regression

---
 tests/test_core.py | 11 +++++++++--
 1 file changed, 9 insertions(+), 2 deletions(-)

diff --git a/tests/test_core.py b/tests/test_core.py
index b32e758c17724..cb8a59af95f17 100644
--- a/tests/test_core.py
+++ b/tests/test_core.py
@@ -5970,6 +5970,13 @@ def test_sse1(self):
       self.emcc_args = orig_args + mode + ['-msse']
       self.do_run(open(path_from_root('tests', 'test_sse1.cpp'), 'r').read(), 'Success!')
 
+  # ignore nans in some simd tests due to an LLVM regression still being investigated,
+  # https://github.com/kripken/emscripten/issues/4435
+  # https://llvm.org/bugs/show_bug.cgi?id=28510
+  @staticmethod
+  def ignore_nans(out, err = ''):
+    return '\n'.join(filter(lambda x: 'NaN' not in x, (out + '\n' + err).split('\n')))
+
   # Tests the full SSE1 API.
   @SIMD
   def test_sse1_full(self):
@@ -5981,7 +5988,7 @@ def test_sse1_full(self):
     orig_args = self.emcc_args
     for mode in [[], ['-s', 'SIMD=1']]:
       self.emcc_args = orig_args + mode + ['-I' + path_from_root('tests'), '-msse']
-      self.do_run(open(path_from_root('tests', 'test_sse1_full.cpp'), 'r').read(), native_result)
+      self.do_run(open(path_from_root('tests', 'test_sse1_full.cpp'), 'r').read(), self.ignore_nans(native_result), output_nicerizer=self.ignore_nans)
 
   # Tests the full SSE2 API.
   @SIMD
@@ -6001,7 +6008,7 @@ def test_sse2_full(self):
     orig_args = self.emcc_args
     for mode in [[], ['-s', 'SIMD=1']]:
       self.emcc_args = orig_args + mode + ['-I' + path_from_root('tests'), '-msse2'] + args
-      self.do_run(open(path_from_root('tests', 'test_sse2_full.cpp'), 'r').read(), native_result)
+      self.do_run(open(path_from_root('tests', 'test_sse2_full.cpp'), 'r').read(), self.ignore_nans(native_result), output_nicerizer=self.ignore_nans)
 
   # Tests the full SSE3 API.
   @SIMD

From 7543d073fc64e5c3ebe89688b98a586b0a9ddff9 Mon Sep 17 00:00:00 2001
From: Alon Zakai <alonzakai@gmail.com>
Date: Thu, 14 Jul 2016 17:40:01 -0700
Subject: [PATCH 04/10] update some tests for binaryen

---
 tests/test_core.py | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/tests/test_core.py b/tests/test_core.py
index cb8a59af95f17..01f6c5c685291 100644
--- a/tests/test_core.py
+++ b/tests/test_core.py
@@ -5344,6 +5344,7 @@ def test_istream(self):
 
   @no_wasm
   def test_fs_base(self):
+    if self.is_wasm(): return self.skip('wasm libc overlaps js lib, so no INCLUDE_FULL_LIBRARY')
     Settings.INCLUDE_FULL_LIBRARY = 1
     try:
       addJS = '''
@@ -6677,6 +6678,7 @@ def test_cases(self):
 
   def test_fuzz(self):
     Building.COMPILER_TEST_OPTS += ['-I' + path_from_root('tests', 'fuzz', 'include'), '-w']
+    Settings.BINARYEN_IMPRECISE = 0 # some of these tests - 2.c', '9.c', '19.c', '21.c', '20.cpp' - div or rem i32 by 0, which traps in wasm
 
     def run_all(x):
       print x

From f405d251adf7d594a13f05e99f6733f70ba95c85 Mon Sep 17 00:00:00 2001
From: Alon Zakai <alonzakai@gmail.com>
Date: Tue, 2 Aug 2016 16:38:33 -0700
Subject: [PATCH 05/10] import Math_max into asm.js scope

---
 emscripten.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/emscripten.py b/emscripten.py
index 7575cdf7ab291..a4d030a8bd23c 100755
--- a/emscripten.py
+++ b/emscripten.py
@@ -554,7 +554,7 @@ def make_emulated_param(i):
       for sig in last_forwarded_json['Functions']['tables']:
         asm_setup += '\nvar debug_table_' + sig + ' = ' + json.dumps(debug_tables[sig]) + ';'
 
-    maths = ['Math.' + func for func in ['floor', 'abs', 'sqrt', 'pow', 'cos', 'sin', 'tan', 'acos', 'asin', 'atan', 'atan2', 'exp', 'log', 'ceil', 'imul', 'min', 'clz32']]
+    maths = ['Math.' + func for func in ['floor', 'abs', 'sqrt', 'pow', 'cos', 'sin', 'tan', 'acos', 'asin', 'atan', 'atan2', 'exp', 'log', 'ceil', 'imul', 'min', 'max', 'clz32']]
     simdfloattypes = []
     simdinttypes = []
     simdbooltypes = []

From 78ef848e55483a827c6dc0d6d83629eb040bf062 Mon Sep 17 00:00:00 2001
From: Alon Zakai <alonzakai@gmail.com>
Date: Tue, 2 Aug 2016 16:38:44 -0700
Subject: [PATCH 06/10] support llvm.maxnum.* and llvm.copysign.*

---
 src/library.js | 10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/src/library.js b/src/library.js
index 6970ebfb9a7d3..93996aa20ac28 100644
--- a/src/library.js
+++ b/src/library.js
@@ -1374,6 +1374,14 @@ LibraryManager.library = {
   llvm_floor_f32: 'Math_floor',
   llvm_floor_f64: 'Math_floor',
 
+  llvm_copysign_f32: function(x, y) {
+    return y < 0 ? -Math_abs(x) : Math_abs(x);
+  },
+
+  llvm_copysign_f64: function(x, y) {
+    return y < 0 ? -Math_abs(x) : Math_abs(x);
+  },
+
   round__asm: true,
   round__sig: 'dd',
   round: function(d) {
@@ -4062,6 +4070,8 @@ LibraryManager.library = {
   llvm_dbg_value: true,
   llvm_debugtrap: true,
   llvm_ctlz_i32: true,
+  llvm_maxnum_f32: true,
+  llvm_maxnum_f64: true,
   emscripten_asm_const: true,
   emscripten_asm_const_int: true,
   emscripten_asm_const_double: true,

From 989e8ddcc0600f53a1cb2bae8ec4dc34647771ed Mon Sep 17 00:00:00 2001
From: Alon Zakai <alonzakai@gmail.com>
Date: Fri, 5 Aug 2016 14:09:16 -0700
Subject: [PATCH 07/10] handle negative zero in copysign

---
 src/library.js | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/library.js b/src/library.js
index 93996aa20ac28..38f6a05a6e60b 100644
--- a/src/library.js
+++ b/src/library.js
@@ -1375,11 +1375,11 @@ LibraryManager.library = {
   llvm_floor_f64: 'Math_floor',
 
   llvm_copysign_f32: function(x, y) {
-    return y < 0 ? -Math_abs(x) : Math_abs(x);
+    return y < 0 || (y === 0 && 1/y < 0) ? -Math_abs(x) : Math_abs(x);
   },
 
   llvm_copysign_f64: function(x, y) {
-    return y < 0 ? -Math_abs(x) : Math_abs(x);
+    return y < 0 || (y === 0 && 1/y < 0) ? -Math_abs(x) : Math_abs(x);
   },
 
   round__asm: true,

From e4c23d1b6a22f9bbd8d354c766418d5d659f319f Mon Sep 17 00:00:00 2001
From: Alon Zakai <alonzakai@gmail.com>
Date: Fri, 5 Aug 2016 14:12:26 -0700
Subject: [PATCH 08/10] add test for copysign of negative zero

---
 tests/core/test_negative_zero.in  | 23 +++++++++++++++++++++++
 tests/core/test_negative_zero.out |  2 ++
 2 files changed, 25 insertions(+)

diff --git a/tests/core/test_negative_zero.in b/tests/core/test_negative_zero.in
index 395f84ce5ec00..045bd2f709a66 100644
--- a/tests/core/test_negative_zero.in
+++ b/tests/core/test_negative_zero.in
@@ -1,6 +1,24 @@
 #include <stdio.h>
 #include <math.h>
 
+// test copysign of 0
+int __attribute__((noinline,noclone))
+copysign_bug (double x)
+{
+  if (x != 0.0 && (x * 0.5 == x)) {
+    printf("1\n");
+    return 1;
+  }
+  printf("f: %f\n", x);
+  if (__builtin_copysign(1.0, x) < 0.0) {
+    printf("2\n");
+    return 2;
+  } else {
+    printf("3\n");
+    return 3;
+  }
+}
+
 int main() {
 #define TEST(x, y) printf("%.2f, %.2f ==> %.2f\n", x, y, copysign(x, y));
   TEST(5.0f, 5.0f);
@@ -23,5 +41,10 @@ int main() {
   TEST(0.0f, -0.0f);
   TEST(-0.0f, 0.0f);
   TEST(-0.0f, -0.0f);
+
+  double x = -0.0;
+  if (copysign_bug (x) != 2)
+    __builtin_abort ();
+
   return 0;
 }
diff --git a/tests/core/test_negative_zero.out b/tests/core/test_negative_zero.out
index 5d792ffbea992..71ac79b2883a9 100644
--- a/tests/core/test_negative_zero.out
+++ b/tests/core/test_negative_zero.out
@@ -18,3 +18,5 @@
 0.00, -0.00 ==> -0.00
 -0.00, 0.00 ==> 0.00
 -0.00, -0.00 ==> -0.00
+f: -0.000000
+2

From 71ce76bb55a2873fc4899093445e422cac9aadf4 Mon Sep 17 00:00:00 2001
From: Alon Zakai <alonzakai@gmail.com>
Date: Fri, 5 Aug 2016 17:07:24 -0700
Subject: [PATCH 09/10] add a test for small structs passed in sequence in
 varargs

---
 tests/core/test_struct_varargs.c   | 41 ++++++++++++++++++++++++++++--
 tests/core/test_struct_varargs.out |  5 ++++
 2 files changed, 44 insertions(+), 2 deletions(-)

diff --git a/tests/core/test_struct_varargs.c b/tests/core/test_struct_varargs.c
index a1fd3bff7a333..2e2a56247cda4 100644
--- a/tests/core/test_struct_varargs.c
+++ b/tests/core/test_struct_varargs.c
@@ -1,5 +1,6 @@
 #include <stdio.h>
 #include <stdarg.h>
+#include <stdlib.h>
 
 struct A {
   int x;
@@ -21,7 +22,7 @@ void foo(int unused, ...)
   printf("%f\n", b.x);
 }
 
-int main() {
+void a() {
   struct A a = {
     .x = 42,
   };
@@ -29,6 +30,42 @@ int main() {
     .x = 42.314,
   };
   foo(0, a, b);
-  return 0;
+}
+
+struct tiny
+{
+  short c;
+};
+
+void f (int n, ...)
+{
+  struct tiny x;
+  int i;
+  va_list ap;
+  va_start (ap,n);  
+  for (i = 0; i < n; i++)
+  {
+    x = va_arg (ap,struct tiny);
+    printf("%d : %d\n", i, x.c);
+    if (x.c != i + 10) abort();
+  }
+  va_end (ap);
+}
+
+void b ()
+{
+  struct tiny x[3];
+  struct tiny y;
+  printf("sizeof tiny: %d (3 of them: %d)\n", sizeof(y), sizeof(x));
+  x[0].c = 10;
+  x[1].c = 11;
+  x[2].c = 12;
+  f (3, x[0], x[1], x[2]);
+}
+
+int main() {
+  a();
+  b();
+  printf("ok.\n");
 }
 
diff --git a/tests/core/test_struct_varargs.out b/tests/core/test_struct_varargs.out
index 7cd08beb34c25..f6214ba1c9a8e 100644
--- a/tests/core/test_struct_varargs.out
+++ b/tests/core/test_struct_varargs.out
@@ -1,2 +1,7 @@
 42
 42.314000
+sizeof tiny: 2 (3 of them: 6)
+0 : 10
+1 : 11
+2 : 12
+ok.

From e2f653737930b9ae17eae80c8e7b18ae137a50e6 Mon Sep 17 00:00:00 2001
From: Alon Zakai <alonzakai@gmail.com>
Date: Mon, 8 Aug 2016 20:56:54 -0700
Subject: [PATCH 10/10] 1.36.7

---
 emscripten-version.txt | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/emscripten-version.txt b/emscripten-version.txt
index 29eea1738741e..dc4e162b4c020 100644
--- a/emscripten-version.txt
+++ b/emscripten-version.txt
@@ -1,2 +1,2 @@
-"1.36.6"
+"1.36.7"