improve AUTO_OPTIMIZE
This commit is contained in:
Родитель
78ee9a8f64
Коммит
196cc4113a
|
@ -1281,10 +1281,15 @@ var Library = {
|
|||
|
||||
// Converts a value we have as signed, into an unsigned value. For
|
||||
// example, -1 in int32 would be a very large number as unsigned.
|
||||
function unSign(value, bits, ignore) {
|
||||
if (value >= 0) return value;
|
||||
function unSign(value, bits, ignore, sig) {
|
||||
if (value >= 0) {
|
||||
#if CHECK_SIGNS
|
||||
if (!ignore) CorrectionsMonitor.note('UnSign');
|
||||
if (!ignore) CorrectionsMonitor.note('UnSign', 1, sig);
|
||||
#endif
|
||||
return value;
|
||||
}
|
||||
#if CHECK_SIGNS
|
||||
if (!ignore) CorrectionsMonitor.note('UnSign', 0, sig);
|
||||
#endif
|
||||
return bits <= 32 ? 2*Math.abs(1 << (bits-1)) + value // Need some trickery, since if bits == 32, we are right at the limit of the bits JS uses in bitshifts
|
||||
: Math.pow(2, bits) + value;
|
||||
|
@ -1293,8 +1298,13 @@ function unSign(value, bits, ignore) {
|
|||
|
||||
// Converts a value we have as unsigned, into a signed value. For
|
||||
// example, 200 in a uint8 would be a negative number.
|
||||
function reSign(value, bits, ignore) {
|
||||
if (value <= 0) return value;
|
||||
function reSign(value, bits, ignore, sig) {
|
||||
if (value <= 0) {
|
||||
#if CHECK_SIGNS
|
||||
if (!ignore) CorrectionsMonitor.note('ReSign', 1, sig);
|
||||
#endif
|
||||
return value;
|
||||
}
|
||||
var half = bits <= 32 ? Math.abs(1 << (bits-1)) // abs is needed if bits == 32
|
||||
: Math.pow(2, bits-1);
|
||||
#if CHECK_SIGNS
|
||||
|
@ -1303,7 +1313,7 @@ function reSign(value, bits, ignore) {
|
|||
if (value >= half) {
|
||||
#if CHECK_SIGNS
|
||||
if (!ignore) {
|
||||
CorrectionsMonitor.note('ReSign');
|
||||
CorrectionsMonitor.note('ReSign', 0, sig);
|
||||
noted = true;
|
||||
}
|
||||
#endif
|
||||
|
@ -1315,11 +1325,11 @@ function reSign(value, bits, ignore) {
|
|||
// would indeed give the exact same result.
|
||||
if (bits === 32 && (value|0) !== value && typeof value !== 'boolean') {
|
||||
if (!ignore) {
|
||||
CorrectionsMonitor.note('ReSign');
|
||||
CorrectionsMonitor.note('ReSign', 0, sig);
|
||||
noted = true;
|
||||
}
|
||||
}
|
||||
if (!noted) CorrectionsMonitor.note('ReSign', true);
|
||||
if (!noted) CorrectionsMonitor.note('ReSign', 1, sig);
|
||||
#endif
|
||||
return value;
|
||||
}
|
||||
|
|
|
@ -170,6 +170,7 @@ mergeInto(Library, {
|
|||
}
|
||||
surfData.ctx.putImageData(surfData.image, 0, 0);
|
||||
}
|
||||
__shutdownRuntime__();
|
||||
throw 'SDL_Quit!';
|
||||
},
|
||||
|
||||
|
|
|
@ -850,7 +850,9 @@ function handleOverflow(text, bits) {
|
|||
if (!bits) return text;
|
||||
var correct = correctOverflows();
|
||||
warn(!correct || bits <= 32, 'Cannot correct overflows of this many bits: ' + bits);
|
||||
if (CHECK_OVERFLOWS) return 'CHECK_OVERFLOW(' + text + ', ' + bits + ')';
|
||||
if (CHECK_OVERFLOWS) return 'CHECK_OVERFLOW(' + text + ', ' + bits + ', ' + Math.floor(correctSpecificOverflow() && !AUTO_OPTIMIZE) + (
|
||||
AUTO_OPTIMIZE ? ', "' + Debugging.getIdentifier(Framework.currItem.lineNum) + '"' : ''
|
||||
) + ')';
|
||||
if (!correct) return text;
|
||||
if (bits <= 32) {
|
||||
return '(' + text + ')&' + (Math.pow(2, bits) - 1);
|
||||
|
@ -897,7 +899,9 @@ function makeSignOp(value, type, op) {
|
|||
}
|
||||
}
|
||||
}
|
||||
return op + 'Sign(' + value + ', ' + bits + ', ' + Math.floor(correctSpecificSign()) + ')'; // If we are correcting a specific sign here, do not check for it
|
||||
return op + 'Sign(' + value + ', ' + bits + ', ' + Math.floor(correctSpecificSign() && !AUTO_OPTIMIZE) + (
|
||||
AUTO_OPTIMIZE ? ', "' + Debugging.getIdentifier(Framework.currItem.lineNum) + '"' : ''
|
||||
) + ')'; // If we are correcting a specific sign here, do not check for it
|
||||
} else {
|
||||
return value;
|
||||
}
|
||||
|
|
|
@ -117,7 +117,6 @@ var CorrectionsMonitor = {
|
|||
if (this.corrections >= this.MAX_ALLOWED) abort('\n\nToo many corrections!');
|
||||
}
|
||||
#if AUTO_OPTIMIZE
|
||||
if (succeed) return; // XXX - enable this later on, as a profiling tool
|
||||
if (!sig)
|
||||
sig = (new Error().stack).toString().split('\n')[2].split(':').slice(-1)[0]; // Spidermonkey-specific FIXME
|
||||
sig = type + '|' + sig;
|
||||
|
@ -157,18 +156,18 @@ function cRound(x) {
|
|||
//========================================
|
||||
// Debugging tools - Mathop overflows
|
||||
//========================================
|
||||
function CHECK_OVERFLOW(value, bits, ignore) {
|
||||
function CHECK_OVERFLOW(value, bits, ignore, sig) {
|
||||
if (ignore) return value;
|
||||
var twopbits = Math.pow(2, bits);
|
||||
var twopbits1 = Math.pow(2, bits-1);
|
||||
// For signedness issue here, see settings.js, CHECK_SIGNED_OVERFLOWS
|
||||
#if CHECK_SIGNED_OVERFLOWS
|
||||
if (value === Infinity || value === -Infinity || value >= twopbits1 || value < -twopbits1) {
|
||||
CorrectionsMonitor.note('SignedOverflow');
|
||||
CorrectionsMonitor.note('SignedOverflow', 0, sig);
|
||||
if (value === Infinity || value === -Infinity || Math.abs(value) >= twopbits) CorrectionsMonitor.note('Overflow');
|
||||
#else
|
||||
if (value === Infinity || value === -Infinity || Math.abs(value) >= twopbits) {
|
||||
CorrectionsMonitor.note('Overflow');
|
||||
CorrectionsMonitor.note('Overflow', 0, sig);
|
||||
#endif
|
||||
#if CORRECT_OVERFLOWS
|
||||
// Fail on >32 bits - we warned at compile time
|
||||
|
@ -178,9 +177,9 @@ function CHECK_OVERFLOW(value, bits, ignore) {
|
|||
#endif
|
||||
} else {
|
||||
#if CHECK_SIGNED_OVERFLOWS
|
||||
CorrectionsMonitor.note('SignedOverflow', 1);
|
||||
CorrectionsMonitor.note('SignedOverflow', 1, sig);
|
||||
#endif
|
||||
CorrectionsMonitor.note('Overflow', 1);
|
||||
CorrectionsMonitor.note('Overflow', 1, sig);
|
||||
}
|
||||
return value;
|
||||
}
|
||||
|
|
|
@ -2429,11 +2429,10 @@ if 'benchmark' not in sys.argv:
|
|||
self.do_test(src.replace('TYPE', 'int'), '*-2**2**-5**5*')
|
||||
|
||||
def test_autooptimize(self):
|
||||
global CHECK_OVERFLOWS, CORRECT_OVERFLOWS, AUTO_OPTIMIZE
|
||||
global CHECK_OVERFLOWS, CORRECT_OVERFLOWS, CHECK_SIGNS, CORRECT_SIGNS, AUTO_OPTIMIZE
|
||||
global COMPILER_TEST_OPTS; COMPILER_TEST_OPTS = ['-g']
|
||||
|
||||
AUTO_OPTIMIZE = 1
|
||||
CHECK_OVERFLOWS = 1
|
||||
CORRECT_OVERFLOWS = 1
|
||||
AUTO_OPTIMIZE = CHECK_OVERFLOWS = CORRECT_OVERFLOWS = CHECK_SIGNS = CORRECT_SIGNS = 1
|
||||
|
||||
src = '''
|
||||
#include<stdio.h>
|
||||
|
@ -2443,17 +2442,24 @@ if 'benchmark' not in sys.argv:
|
|||
t = t*5 + 1;
|
||||
}
|
||||
printf("*%d,%d*\\n", t, t & 127);
|
||||
|
||||
int varey = 100;
|
||||
unsigned int MAXEY = -1;
|
||||
for (int j = 0; j < 2; j++) {
|
||||
printf("*%d*\\n", varey >= MAXEY); // 100 >= -1? not in unsigned!
|
||||
MAXEY = 1; // So we succeed the second time around
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
'''
|
||||
|
||||
def check(output):
|
||||
# TODO: check the line #
|
||||
assert 'Overflow' in output, 'no indication of Overflow corrections'
|
||||
assert '12 hits, %100 failures' in output, 'no notice of the amount of hits and failures'
|
||||
assert 'Overflow|src.cpp:6 : 60 hits, %20 failures' in output, 'no indication of Overflow corrections'
|
||||
assert 'UnSign|src.cpp:13 : 6 hits, %16 failures' in output, 'no indication of Sign corrections'
|
||||
return output
|
||||
|
||||
self.do_test(src, '*186854335,63*', output_nicerizer=check)
|
||||
self.do_test(src, '*186854335,63*\n', output_nicerizer=check)
|
||||
|
||||
|
||||
# Generate tests for all our compilers
|
||||
|
|
Загрузка…
Ссылка в новой задаче