aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2013-11-15 14:29:50 -0800
committerAlon Zakai <alonzakai@gmail.com>2013-11-15 14:33:37 -0800
commit4f3b5af14cf6bff389765d0f6dd2e5b6c3ba7161 (patch)
tree80e5ae6b19ec29a0453bd5d279d38929a07459fc
parent0c4d11f4caaa960cf283a4c2112cbdf6a175cadd (diff)
ignore llvm ir fast-math notation; fixes #1762
-rw-r--r--src/intertyper.js2
-rw-r--r--src/modules.js1
-rw-r--r--tests/test_core.py20
3 files changed, 22 insertions, 1 deletions
diff --git a/src/intertyper.js b/src/intertyper.js
index fa53c652..f92a04db 100644
--- a/src/intertyper.js
+++ b/src/intertyper.js
@@ -842,7 +842,7 @@ function intertyper(lines, sidePass, baseLineNums) {
item.variant = item.tokens[1].text;
item.tokens.splice(1, 1);
}
- if (item.tokens[1].text == 'exact') item.tokens.splice(1, 1); // TODO: Implement trap values
+ while (item.tokens[1].text in LLVM.MATHOP_IGNORABLES) item.tokens.splice(1, 1);
var segments = splitTokenList(item.tokens.slice(1));
item.params = [];
for (var i = 1; i <= 4; i++) {
diff --git a/src/modules.js b/src/modules.js
index 673e0662..5d48ede2 100644
--- a/src/modules.js
+++ b/src/modules.js
@@ -20,6 +20,7 @@ var LLVM = {
COMPS: set('icmp', 'fcmp'),
CONVERSIONS: set('inttoptr', 'ptrtoint', 'uitofp', 'sitofp', 'fptosi', 'fptoui', 'fpext', 'fptrunc'),
INTRINSICS_32: set('_llvm_memcpy_p0i8_p0i8_i64', '_llvm_memmove_p0i8_p0i8_i64', '_llvm_memset_p0i8_i64'), // intrinsics that need args converted to i32 in USE_TYPED_ARRAYS == 2
+ MATHOP_IGNORABLES: set('exact', 'nnan', 'ninf', 'nsz', 'arcp', 'fast'),
};
LLVM.GLOBAL_MODIFIERS = set(keys(LLVM.LINKAGES).concat(['constant', 'global', 'hidden']));
diff --git a/tests/test_core.py b/tests/test_core.py
index 481130c5..d7b6cf53 100644
--- a/tests/test_core.py
+++ b/tests/test_core.py
@@ -1408,6 +1408,26 @@ Succeeded!
'''
self.do_run(src, '*1,10,10.5,1,1.2340,0.00*\n0.50, 3.30, 3.30, 3.30\nsmall: 0.0000010000\n')
+ def test_fast_math(self):
+ if self.emcc_args is None: return self.skip('requires emcc')
+ Building.COMPILER_TEST_OPTS += ['-ffast-math']
+
+ self.do_run(r'''
+#include <stdio.h>
+#include <stdlib.h>
+
+int main(int argc, char** argv) {
+ char* endptr;
+ --argc, ++argv;
+ double total = 0.0;
+ for (; argc; argc--, argv++) {
+ total += strtod(*argv, &endptr);
+ }
+ printf("total: %g\n", total);
+ return 0;
+}
+''', 'total: 19', ['5', '6', '8'])
+
def test_zerodiv(self):
self.do_run(r'''
#include <stdio.h>