diff --git a/emscripten-version.txt b/emscripten-version.txt
index eaece033767..a9eeadaa597 100644
--- a/emscripten-version.txt
+++ b/emscripten-version.txt
@@ -1 +1 @@
-"1.36.14"
+"1.37.0"
diff --git a/lib/Target/JSBackend/CallHandlers.h b/lib/Target/JSBackend/CallHandlers.h
index 73e01c858c4..75725ddb29c 100644
--- a/lib/Target/JSBackend/CallHandlers.h
+++ b/lib/Target/JSBackend/CallHandlers.h
@@ -227,6 +227,8 @@ DEF_CALL_HANDLER(emscripten_check_longjmp, {
   std::string Threw = getValueAsStr(CI->getOperand(0));
   std::string Target = getJSName(CI);
   std::string Assign = getAssign(CI);
+  Declares.insert("testSetjmp");
+  Declares.insert("longjmp");
   return "if (((" + Threw + "|0) != 0) & ((threwValue|0) != 0)) { " +
            Assign + "_testSetjmp(HEAP32[" + Threw + ">>2]|0, _setjmpTable|0, _setjmpTableSize|0)|0; " +
            "if ((" + Target + "|0) == 0) { _longjmp(" + Threw + "|0, threwValue|0); } " + // rethrow
@@ -903,10 +905,12 @@ DEF_BUILTIN_HANDLER(llvm_fabs_f64, Math_abs);
 DEF_BUILTIN_HANDLER(ceil, Math_ceil);
 DEF_BUILTIN_HANDLER(ceilf, Math_ceil);
 DEF_BUILTIN_HANDLER(ceill, Math_ceil);
+DEF_BUILTIN_HANDLER(llvm_ceil_f32, Math_ceil);
 DEF_BUILTIN_HANDLER(llvm_ceil_f64, Math_ceil);
 DEF_BUILTIN_HANDLER(floor, Math_floor);
 DEF_BUILTIN_HANDLER(floorf, Math_floor);
 DEF_BUILTIN_HANDLER(floorl, Math_floor);
+DEF_BUILTIN_HANDLER(llvm_floor_f32, Math_floor);
 DEF_BUILTIN_HANDLER(llvm_floor_f64, Math_floor);
 DEF_MAYBE_BUILTIN_HANDLER(pow, Math_pow);
 DEF_MAYBE_BUILTIN_HANDLER(powf, Math_pow);
@@ -915,6 +919,8 @@ DEF_BUILTIN_HANDLER(llvm_sqrt_f32, Math_sqrt);
 DEF_BUILTIN_HANDLER(llvm_sqrt_f64, Math_sqrt);
 DEF_BUILTIN_HANDLER(llvm_pow_f32, Math_pow); // XXX these will be slow in wasm, but need to link in libc before getting here, or stop
 DEF_BUILTIN_HANDLER(llvm_pow_f64, Math_pow); //     LLVM from creating these intrinsics
+DEF_MAYBE_BUILTIN_HANDLER(llvm_cos_f32, Math_cos);
+DEF_MAYBE_BUILTIN_HANDLER(llvm_cos_f64, Math_cos);
 DEF_MAYBE_BUILTIN_HANDLER(llvm_sin_f32, Math_sin);
 DEF_MAYBE_BUILTIN_HANDLER(llvm_sin_f64, Math_sin);
 
@@ -2148,10 +2154,12 @@ void setupCallHandlers() {
   SETUP_CALL_HANDLER(ceil);
   SETUP_CALL_HANDLER(ceilf);
   SETUP_CALL_HANDLER(ceill);
+  SETUP_CALL_HANDLER(llvm_ceil_f32);
   SETUP_CALL_HANDLER(llvm_ceil_f64);
   SETUP_CALL_HANDLER(floor);
   SETUP_CALL_HANDLER(floorf);
   SETUP_CALL_HANDLER(floorl);
+  SETUP_CALL_HANDLER(llvm_floor_f32);
   SETUP_CALL_HANDLER(llvm_floor_f64);
   SETUP_CALL_HANDLER(pow);
   SETUP_CALL_HANDLER(powf);
@@ -2166,6 +2174,8 @@ void setupCallHandlers() {
   SETUP_CALL_HANDLER(llvm_log_f64);
   SETUP_CALL_HANDLER(llvm_exp_f32);
   SETUP_CALL_HANDLER(llvm_exp_f64);
+  SETUP_CALL_HANDLER(llvm_cos_f32);
+  SETUP_CALL_HANDLER(llvm_cos_f64);
   SETUP_CALL_HANDLER(llvm_sin_f32);
   SETUP_CALL_HANDLER(llvm_sin_f64);
 }
diff --git a/lib/Target/JSBackend/NaCl/ExpandI64.cpp b/lib/Target/JSBackend/NaCl/ExpandI64.cpp
index b403bc9b875..ff6ad62a79e 100644
--- a/lib/Target/JSBackend/NaCl/ExpandI64.cpp
+++ b/lib/Target/JSBackend/NaCl/ExpandI64.cpp
@@ -733,6 +733,10 @@ bool ExpandI64::splitInst(Instruction *I) {
       CallInst *CI = cast<CallInst>(I);
       Function *F = CI->getCalledFunction();
       if (F) {
+        // EM_ASMs should not have i64s as arguments
+        if (F->getName().startswith("emscripten_asm_const")) {
+          report_fatal_error("EM_ASM should not receive i64s as inputs, they are not valid in JS");
+        }
         assert(okToRemainIllegal(F));
         return false;
       }