Merge pull request #3384 from waywardmonkeys/excise-the-imprecise

Remove PRECISE_I32_MUL option.
This commit is contained in:
Alon Zakai 2015-04-22 17:00:13 -07:00
Родитель 712393dc28 cce64a788b
Коммит d4ea1ef2b2
6 изменённых файлов: 1 добавлений и 60 удалений

Просмотреть файл

@ -1360,7 +1360,6 @@ Module['writeAsciiToMemory'] = writeAsciiToMemory;
{{{ unSign }}} {{{ unSign }}}
{{{ reSign }}} {{{ reSign }}}
#if PRECISE_I32_MUL
// check for imul support, and also for correctness ( https://bugs.webkit.org/show_bug.cgi?id=126345 ) // check for imul support, and also for correctness ( https://bugs.webkit.org/show_bug.cgi?id=126345 )
if (!Math['imul'] || Math['imul'](0xffffffff, 5) !== -5) Math['imul'] = function imul(a, b) { if (!Math['imul'] || Math['imul'](0xffffffff, 5) !== -5) Math['imul'] = function imul(a, b) {
var ah = a >>> 16; var ah = a >>> 16;
@ -1369,11 +1368,6 @@ if (!Math['imul'] || Math['imul'](0xffffffff, 5) !== -5) Math['imul'] = function
var bl = b & 0xffff; var bl = b & 0xffff;
return (al*bl + ((ah*bl + al*bh) << 16))|0; return (al*bl + ((ah*bl + al*bh) << 16))|0;
}; };
#else
Math['imul'] = function imul(a, b) {
return (a*b)|0; // fast but imprecise
};
#endif
Math.imul = Math['imul']; Math.imul = Math['imul'];
#if PRECISE_F32 #if PRECISE_F32

Просмотреть файл

@ -100,16 +100,10 @@ var WARN_UNALIGNED = 0; // Warn at compile time about instructions that LLVM tel
// alignment. (this option is fastcomp-only) // alignment. (this option is fastcomp-only)
var PRECISE_I64_MATH = 1; // If enabled, i64 addition etc. is emulated - which is slow but precise. If disabled, var PRECISE_I64_MATH = 1; // If enabled, i64 addition etc. is emulated - which is slow but precise. If disabled,
// we use the 'double trick' which is fast but incurs rounding at high values. // we use the 'double trick' which is fast but incurs rounding at high values.
// Note that we do not catch 32-bit multiplication by default (which must be done in
// 64 bits for high values for full precision) - you must manually set PRECISE_I32_MUL
// for that.
// If set to 2, we always include the i64 math code, which is necessary in the case // If set to 2, we always include the i64 math code, which is necessary in the case
// that we can't know at compile time that 64-bit math is needed. For example, if you // that we can't know at compile time that 64-bit math is needed. For example, if you
// print 64-bit values with printf, but never add them, we can't know at compile time // print 64-bit values with printf, but never add them, we can't know at compile time
// and you need to set this to 2. // and you need to set this to 2.
var PRECISE_I32_MUL = 1; // If enabled, i32 multiplication is done with full precision, which means it is
// correct even if the value exceeds the JS double-integer limit of ~52 bits (otherwise,
// rounding will occur above that range).
var PRECISE_F32 = 0; // 0: Use JS numbers for floating-point values. These are 64-bit and do not model C++ var PRECISE_F32 = 0; // 0: Use JS numbers for floating-point values. These are 64-bit and do not model C++
// floats exactly, which are 32-bit. // floats exactly, which are 32-bit.
// 1: Model C++ floats precisely, using Math.fround, polyfilling when necessary. This // 1: Model C++ floats precisely, using Math.fround, polyfilling when necessary. This

Просмотреть файл

@ -1,26 +0,0 @@
#include <stdio.h>
typedef unsigned int uint;
// from cube2, zlib licensed
#define N (624)
#define M (397)
#define K (0x9908B0DFU)
static uint state[N];
static int next = N;
void seedMT(uint seed) {
state[0] = seed;
for (uint i = 1; i < N; i++) // if we do not do this precisely, at least we
// should coerce to int immediately, not wait
state[i] = seed = 1812433253U * (seed ^ (seed >> 30)) + i;
next = 0;
}
int main() {
seedMT(5497);
for (int i = 0; i < 10; i++) printf("%d: %u\n", i, state[i]);
return 0;
}

Просмотреть файл

@ -1,10 +0,0 @@
0: 5497
1: 2916432318
2: 2502517762
3: 3151524867
4: 2323729668
5: 2053478917
6: 2409490438
7: 848473607
8: 691103752
9: 3915535113

Просмотреть файл

@ -14,8 +14,7 @@ import shared, jsrun
# configuration options will have to be hardcoded. # configuration options will have to be hardcoded.
CSMITH_CFLAGS = ['-I', os.path.join(os.environ['CSMITH_PATH'], 'runtime')] CSMITH_CFLAGS = ['-I', os.path.join(os.environ['CSMITH_PATH'], 'runtime')]
ENGINE = shared.JS_ENGINES[0] ENGINE = shared.JS_ENGINES[0]
EMCC_ARGS = ['-O2', '-s', 'ASM_JS=1', '-s', 'PRECISE_I64_MATH=1', '-s', EMCC_ARGS = ['-O2', '-s', 'ASM_JS=1', '-s', 'PRECISE_I64_MATH=1']
'PRECISE_I32_MUL=1']
filename = sys.argv[1] filename = sys.argv[1]
obj_filename = os.path.splitext(filename)[0] obj_filename = os.path.splitext(filename)[0]

Просмотреть файл

@ -425,16 +425,6 @@ class T(RunnerCore): # Short name, to make it more fun to use manually on the co
self.do_run_from_file(src, output) self.do_run_from_file(src, output)
def test_i32_mul_semiprecise(self):
if Settings.ASM_JS: return self.skip('asm is always fully precise')
Settings.PRECISE_I32_MUL = 0 # we want semiprecise here
test_path = path_from_root('tests', 'core', 'test_i32_mul_semiprecise')
src, output = (test_path + s for s in ('.in', '.out'))
self.do_run_from_file(src, output)
def test_i16_emcc_intrinsic(self): def test_i16_emcc_intrinsic(self):
Settings.CORRECT_SIGNS = 1 # Relevant to this test Settings.CORRECT_SIGNS = 1 # Relevant to this test