diff options
author | Alon Zakai <alonzakai@gmail.com> | 2013-11-15 14:29:50 -0800 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2013-11-15 14:33:37 -0800 |
commit | 4f3b5af14cf6bff389765d0f6dd2e5b6c3ba7161 (patch) | |
tree | 80e5ae6b19ec29a0453bd5d279d38929a07459fc | |
parent | 0c4d11f4caaa960cf283a4c2112cbdf6a175cadd (diff) |
ignore llvm ir fast-math notation; fixes #1762
-rw-r--r-- | src/intertyper.js | 2 | ||||
-rw-r--r-- | src/modules.js | 1 | ||||
-rw-r--r-- | tests/test_core.py | 20 |
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> |