optimize processing of things like false & constant, add getFastValue in makeSignOp, and add fuzz tests that now pass

This commit is contained in:
Alon Zakai 2013-03-01 21:47:02 -05:00
Родитель d8621333e6
Коммит 95a202de75
6 изменённых файлов: 3069 добавлений и 7 удалений

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

@ -1371,6 +1371,8 @@ var TWO_TWENTY = Math.pow(2, 20);
function getFastValue(a, op, b, type) {
a = a.toString();
b = b.toString();
a = a == 'true' ? '1' : (a == 'false' ? '0' : a);
b = b == 'true' ? '1' : (b == 'false' ? '0' : b);
if (isNumber(a) && isNumber(b)) {
if (op == 'pow') {
return Math.pow(a, b).toString();
@ -1838,9 +1840,10 @@ function makeSignOp(value, type, op, force, ignore) {
if (!CHECK_SIGNS || ignore) {
if (bits === 32) {
if (op === 're') {
return '((' + value + ')|0)';
return '(' + getFastValue(value, '|', '0') + ')';
} else {
return '((' + value + ')>>>0)';
return '(' + getFastValue(value, '>>>', '0') + ')';
// Alternatively, we can consider the lengthier
// return makeInlineCalculation('VALUE >= 0 ? VALUE : ' + Math.pow(2, bits) + ' + VALUE', value, 'tempBigInt');
// which does not always turn us into a 32-bit *un*signed value
@ -1849,7 +1852,7 @@ function makeSignOp(value, type, op, force, ignore) {
if (op === 're') {
return makeInlineCalculation('(VALUE << ' + (32-bits) + ') >> ' + (32-bits), value, 'tempInt');
} else {
return '((' + value + ')&' + (Math.pow(2, bits)-1) + ')';
return '(' + getFastValue(value, '&', Math.pow(2, bits)-1) + ')';
}
} else { // bits > 32
if (op === 're') {

2006
tests/fuzz/2.c Normal file

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

1
tests/fuzz/2.c.txt Normal file
Просмотреть файл

@ -0,0 +1 @@
checksum = E09CCEB0

1043
tests/fuzz/3.c Normal file

Разница между файлами не показана из-за своего большого размера Загрузить разницу

1
tests/fuzz/3.c.txt Normal file
Просмотреть файл

@ -0,0 +1 @@
checksum = EE4B2FFC

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

@ -7254,10 +7254,18 @@ def process(filename):
Building.COMPILER_TEST_OPTS += ['-I' + path_from_root('tests', 'fuzz')]
for name in glob.glob(path_from_root('tests', 'fuzz', '*.c')):
print name
self.do_run(open(path_from_root('tests', 'fuzz', name)).read(),
open(path_from_root('tests', 'fuzz', name + '.txt')).read(), force_c=True)
def run_all(x):
print x
for name in glob.glob(path_from_root('tests', 'fuzz', '*.c')):
print name
self.do_run(open(path_from_root('tests', 'fuzz', name)).read(),
open(path_from_root('tests', 'fuzz', name + '.txt')).read(), force_c=True)
run_all('normal')
self.emcc_args += ['--llvm-lto', '1']
run_all('lto')
# Autodebug the code
def do_autodebug(self, filename):