aboutsummaryrefslogtreecommitdiff
path: root/tools
diff options
context:
space:
mode:
Diffstat (limited to 'tools')
-rw-r--r--tools/autodebugger.py65
-rw-r--r--tools/bisect_pair.py18
-rw-r--r--tools/clean_webconsole.py23
-rw-r--r--tools/eliminator/eliminator-test-output.js2722
-rw-r--r--tools/eliminator/eliminator-test.js3302
-rw-r--r--tools/eliminator/eliminator.coffee47
-rw-r--r--tools/js-optimizer.js177
-rw-r--r--tools/shared.py108
-rw-r--r--tools/test-js-optimizer-regs-output.js228
-rw-r--r--tools/test-js-optimizer-regs.js233
10 files changed, 6841 insertions, 82 deletions
diff --git a/tools/autodebugger.py b/tools/autodebugger.py
index 943ff043..3631548c 100644
--- a/tools/autodebugger.py
+++ b/tools/autodebugger.py
@@ -13,6 +13,7 @@ import os, sys, re
ALLOW_POINTERS = False
ALLOW_MISC = True
MEMCPY = False
+NO_DLMALLOC = True
POSTAMBLE = '''
@.emscripten.autodebug.str = private constant [10 x i8] c"AD:%d,%d\\0A\\00", align 1 ; [#uses=1]
@@ -206,6 +207,7 @@ for.end: ; preds = %for.body, %entry
lines_added = 0
lines = data.split('\n')
in_func = False
+added_entry = False
for i in range(len(lines)):
if MEMCPY:
if not lines[i].startswith('declare void'):
@@ -215,50 +217,55 @@ for i in range(len(lines)):
pre = ''
if lines[i].startswith('define '):
in_func = True
+ if NO_DLMALLOC and ('@malloc(' in lines[i] or '@free(' in lines[i] or '@sys_alloc(' in lines[i] or '@segment_holding(' in lines[i] or '@init_top(' in lines[i] or '@add_segment(' in lines[i] or '@tmalloc_small(' in lines[i]):
+ in_func = False
+ if in_func:
+ added_entry = False
elif lines[i].startswith('}'):
in_func = False
- elif in_func and ' = alloca' not in lines[i] and lines[i].startswith(' '):
+ elif in_func and not added_entry and ' = alloca' not in lines[i] and lines[i].startswith(' '):
# This is a good place to mark entry to this function
- in_func = False
+ added_entry = True
index = i+1+lines_added
pre = ' call void @emscripten_autodebug_i32(i32 -1, i32 %d)' % index
- elif lines[i].startswith(' ret '):
+ elif in_func and lines[i].startswith(' ret '):
# This is a good place to mark entry to this function
index = i+1+lines_added
pre = ' call void @emscripten_autodebug_i32(i32 -2, i32 %d)' % index
- m = re.match(' store (?P<type>i64|i32|i16|i8|float|double|%?[\w\.\*]+) (?P<var>%?[\w.+_]+), .*', lines[i])
- if m:
- index = i+1+lines_added
- if m.group('type') in ['i8', 'i16', 'i32', 'i64', 'float', 'double']:
- lines[i] += '\n call void @emscripten_autodebug_%s(i32 %d, %s %s)' % (m.group('type'), index, m.group('type'), m.group('var'))
- lines_added += 1
- elif ALLOW_POINTERS and m.group('type').endswith('*') and m.group('type').count('*') == 1:
- lines[i] += '\n %%ead.%d = ptrtoint %s %s to i32' % (index, m.group('type'), m.group('var'))
- lines[i] += '\n call void @emscripten_autodebug_i32(i32 %d, i32 %%ead.%d)' % (index, index)
- lines_added += 2
- continue
- m = re.match(' %(?P<var>[\w_.]+) = load (?P<type>i64|i32|i16|i8|float|double+)\* [^(].*.*', lines[i])
- if m:
- index = i+1+lines_added
- lines[i] += '\n call void @emscripten_autodebug_%s(i32 %d, %s %%%s)' % (m.group('type'), index, m.group('type'), m.group('var'))
- lines_added += 1
- continue
- if ALLOW_MISC:
- m = re.match(' %(?P<var>[\w_.]+) = (call|mul|add) (nsw )?(?P<type>i64|i32|i16|i8|float|double+) .*', lines[i])
+ if in_func:
+ m = re.match(' store (?P<type>i64|i32|i16|i8|float|double|%?[\w\.\*]+) (?P<var>%?[\w.+_]+), .*', lines[i])
if m:
index = i+1+lines_added
- lines[i] += '\n call void @emscripten_autodebug_%s(i32 %d, %s %%%s)' % (m.group('type'), index, m.group('type'), m.group('var'))
- lines_added += 1
+ if m.group('type') in ['i8', 'i16', 'i32', 'i64', 'float', 'double']:
+ lines[i] += '\n call void @emscripten_autodebug_%s(i32 %d, %s %s)' % (m.group('type'), index, m.group('type'), m.group('var'))
+ lines_added += 1
+ elif ALLOW_POINTERS and m.group('type').endswith('*') and m.group('type').count('*') == 1:
+ lines[i] += '\n %%ead.%d = ptrtoint %s %s to i32' % (index, m.group('type'), m.group('var'))
+ lines[i] += '\n call void @emscripten_autodebug_i32(i32 %d, i32 %%ead.%d)' % (index, index)
+ lines_added += 2
continue
- m = re.match(' call void @llvm\.memcpy\.p0i8\.p0i8\.i32\(i8\* %(?P<dst>[\w_.]+), i8\* %(?P<src>[\w_.]+), i32 8, i32 (?P<align>\d+),.*', lines[i])
+ m = re.match(' %(?P<var>[\w_.]+) = load (?P<type>i64|i32|i16|i8|float|double+)\* [^(].*.*', lines[i])
if m:
index = i+1+lines_added
- lines[i] += '\n %%adpretemp%d = bitcast i8* %%%s to i64*' % (index, m.group('src')) + \
- '\n %%adtemp%d = load i64* %%adpretemp%d, align %s' % (index, index, m.group('align')) + \
- '\n call void @emscripten_autodebug_%s(i32 %d, %s %%adtemp%d)' % ('i64', index, 'i64', index)
- lines_added += 3
+ lines[i] += '\n call void @emscripten_autodebug_%s(i32 %d, %s %%%s)' % (m.group('type'), index, m.group('type'), m.group('var'))
+ lines_added += 1
continue
+ if ALLOW_MISC:
+ m = re.match(' %(?P<var>[\w_.]+) = (call|mul|add) (nsw )?(?P<type>i64|i32|i16|i8|float|double+) .*', lines[i])
+ if m:
+ index = i+1+lines_added
+ lines[i] += '\n call void @emscripten_autodebug_%s(i32 %d, %s %%%s)' % (m.group('type'), index, m.group('type'), m.group('var'))
+ lines_added += 1
+ continue
+ m = re.match(' call void @llvm\.memcpy\.p0i8\.p0i8\.i32\(i8\* %(?P<dst>[\w_.]+), i8\* %(?P<src>[\w_.]+), i32 8, i32 (?P<align>\d+),.*', lines[i])
+ if m:
+ index = i+1+lines_added
+ lines[i] += '\n %%adpretemp%d = bitcast i8* %%%s to i64*' % (index, m.group('src')) + \
+ '\n %%adtemp%d = load i64* %%adpretemp%d, align %s' % (index, index, m.group('align')) + \
+ '\n call void @emscripten_autodebug_%s(i32 %d, %s %%adtemp%d)' % ('i64', index, 'i64', index)
+ lines_added += 3
+ continue
finally:
if len(pre) > 0:
diff --git a/tools/bisect_pair.py b/tools/bisect_pair.py
index 3b880b28..8eea0d61 100644
--- a/tools/bisect_pair.py
+++ b/tools/bisect_pair.py
@@ -47,14 +47,12 @@ if len(curr) > 0:
chunks.append(curr)
# Bisect both sides of the span, until we have a single chunk
-low = 0
high = len(chunks)
print 'beginning bisection, %d chunks' % high
-while high-low > 2:
- mid = (low + high)/2
- print ' current status: %d - %d - %d' % (low, mid, high)
+for mid in range(high):
+ print ' current: %d' % mid
# Take chunks from the middle and on. This is important because the eliminator removes variables, so starting from the beginning will add errors
curr_diff = '\n'.join(map(lambda parts: '\n'.join(parts), chunks[mid:])) + '\n'
difff = open('diff.diff', 'w')
@@ -64,11 +62,11 @@ while high-low > 2:
Popen(['patch', 'middle', 'diff.diff'], stdout=PIPE, stderr=PIPE).communicate()
result = run_js('middle', stderr=PIPE)
if result == left_result:
- high = mid+1
- else:
- low = mid
+ print 'found where it starts to work: %d' % mid
+ found = mid
+ break
-critical = '\n'.join(chunks[low]) + '\n'
+critical = '\n'.join(chunks[found-1]) + '\n'
c = open('critical.diff', 'w')
c.write(critical)
@@ -76,8 +74,8 @@ c.close()
print 'sanity check'
shutil.copy('middle', 'middle2')
Popen(['patch', 'middle2', 'critical.diff'], stdout=PIPE, stderr=PIPE).communicate()
-assert run_js('middle', stderr=PIPE) == left_result
-assert run_js('middle2', stderr=PIPE) != left_result
+assert run_js('middle', stderr=PIPE) == left_result, 'middle was expected %s' % left_result
+assert run_js('middle2', stderr=PIPE) != left_result, 'middle2 was expected NOT %s' % left_result
print 'middle is like left, middle2 is like right, critical.diff is the difference that matters,'
print critical
diff --git a/tools/clean_webconsole.py b/tools/clean_webconsole.py
index 56bd9e2b..43694179 100644
--- a/tools/clean_webconsole.py
+++ b/tools/clean_webconsole.py
@@ -2,7 +2,23 @@
Removes timestamp and line info from a webgl log
'''
-import os, sys
+import os, sys, re
+
+__rootpath__ = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
+def path_from_root(*pathelems):
+ return os.path.join(__rootpath__, *pathelems)
+
+def nice(x):
+ return '0x' + ('0' * (len(x)-6)) + x[2:].upper()
+
+repdata = open(path_from_root('system', 'include', 'GL', 'gl.h')).readlines() + ['\n'] + \
+ open(path_from_root('system', 'include', 'GL', 'glext.h')).readlines()
+reps = {}
+for rep in repdata:
+ rep = rep.replace('\t', ' ').replace('\n', '')
+ parts = filter(lambda part: part != '', rep.split(' '))
+ if len(parts) == 3 and parts[0] == '#define':
+ reps[nice(parts[2])] = '%s (%s)' % (parts[1], parts[2])
lines = sys.stdin.read().split('\n')
@@ -10,8 +26,9 @@ for line in lines:
if line.startswith('['):
line = line[15:]
line = line.split(' @ ')[0]
+ line = re.sub('(0x[\dabcdef]+)', lambda hexx: reps[nice(hexx.group(0))] if nice(hexx.group(0)) in reps else nice(hexx.group(0)), line)
print line
-for i in range(100):
- print
+#for i in range(100):
+# print
diff --git a/tools/eliminator/eliminator-test-output.js b/tools/eliminator/eliminator-test-output.js
index aac21e87..fd8036bf 100644
--- a/tools/eliminator/eliminator-test-output.js
+++ b/tools/eliminator/eliminator-test-output.js
@@ -126,4 +126,2724 @@ function llvm3_1() {
run($j_0 / 2);
}
}
-// EMSCRIPTEN_GENERATED_FUNCTIONS: ["f", "g", "h", "py", "r", "t", "f2", "f3", "llvm3_1"]
+function _inflate($strm, $flush) {
+ var __stackBase__ = STACKTOP;
+ STACKTOP += 4;
+ var __label__;
+ var $hbuf = __stackBase__;
+ var $cmp = ($strm | 0) == 0;
+ $_$2 : do {
+ if ($cmp) {
+ var $retval_0 = -2;
+ } else {
+ var $0 = HEAPU32[($strm + 28 | 0) >> 2];
+ if (($0 | 0) == 0) {
+ var $retval_0 = -2;
+ break;
+ }
+ var $next_out = $strm + 12 | 0;
+ var $1 = HEAP32[$next_out >> 2];
+ if (($1 | 0) == 0) {
+ var $retval_0 = -2;
+ break;
+ }
+ var $next_in = $strm | 0;
+ var $2 = HEAP32[$next_in >> 2];
+ if (($2 | 0) == 0) {
+ if (!((HEAP32[($strm + 4 | 0) >> 2] | 0) == 0)) {
+ var $retval_0 = -2;
+ break;
+ }
+ }
+ var $4 = $0;
+ var $mode = $0 | 0;
+ var $5 = HEAP32[$mode >> 2];
+ if (($5 | 0) == 11) {
+ HEAP32[$mode >> 2] = 12;
+ var $8 = HEAP32[$next_out >> 2];
+ var $7 = HEAP32[$next_in >> 2];
+ var $6 = 12;
+ } else {
+ var $8 = $1;
+ var $7 = $2;
+ var $6 = $5;
+ }
+ var $6;
+ var $7;
+ var $8;
+ var $avail_out = $strm + 16 | 0;
+ var $9 = HEAP32[$avail_out >> 2];
+ var $avail_in15 = $strm + 4 | 0;
+ var $10 = HEAPU32[$avail_in15 >> 2];
+ var $11 = $0 + 56 | 0;
+ var $13 = $0 + 60 | 0;
+ var $15 = $0 + 8 | 0;
+ var $16 = $0 + 24 | 0;
+ var $arrayidx = $hbuf | 0;
+ var $arrayidx40 = $hbuf + 1 | 0;
+ var $17 = $0 + 16 | 0;
+ var $18 = $0 + 32 | 0;
+ var $msg = $strm + 24 | 0;
+ var $19 = $0 + 36 | 0;
+ var $20 = $0 + 20 | 0;
+ var $adler = $strm + 48 | 0;
+ var $21 = $0 + 64 | 0;
+ var $22 = $0 + 12 | 0;
+ var $23 = ($flush - 5 | 0) >>> 0 < 2;
+ var $24 = $0 + 4 | 0;
+ var $cmp660 = ($flush | 0) == 6;
+ var $25 = $0 + 7108 | 0;
+ var $26 = $0 + 84 | 0;
+ var $27 = $0 + 76 | 0;
+ var $28 = $0 + 72 | 0;
+ var $29 = $0 + 7112 | 0;
+ var $30 = $0 + 68 | 0;
+ var $31 = $0 + 44 | 0;
+ var $32 = $0 + 7104 | 0;
+ var $33 = $0 + 48 | 0;
+ var $34 = $0 + 52 | 0;
+ var $35 = $0 + 40 | 0;
+ var $total_out = $strm + 20 | 0;
+ var $36 = $0 + 28 | 0;
+ var $arrayidx199 = $hbuf + 2 | 0;
+ var $arrayidx202 = $hbuf + 3 | 0;
+ var $37 = $0 + 96 | 0;
+ var $38 = $0 + 100 | 0;
+ var $39 = $0 + 92 | 0;
+ var $40 = $0 + 104 | 0;
+ var $lens = $0 + 112 | 0;
+ var $41 = $lens;
+ var $next861 = $0 + 108 | 0;
+ var $42 = $next861;
+ var $43 = $next861 | 0;
+ var $arraydecay860_c = $0 + 1328 | 0;
+ var $44 = $0 + 76 | 0;
+ var $arraydecay864 = $lens;
+ var $arraydecay867 = $0 + 752 | 0;
+ var $45 = $0 + 624 | 0;
+ var $46 = $0 + 80 | 0;
+ var $47 = $0 + 88 | 0;
+ var $48 = $0 + 80 | 0;
+ var $ret_0 = 0;
+ var $next_0 = $7;
+ var $put_0 = $8;
+ var $have_0 = $10;
+ var $left_0 = $9;
+ var $hold_0 = HEAP32[$11 >> 2];
+ var $bits_0 = HEAP32[$13 >> 2];
+ var $out_0 = $9;
+ var $49 = $6;
+ $_$12 : while (1) {
+ var $49;
+ var $out_0;
+ var $bits_0;
+ var $hold_0;
+ var $left_0;
+ var $have_0;
+ var $put_0;
+ var $next_0;
+ var $ret_0;
+ $_$14 : do {
+ if (($49 | 0) == 0) {
+ var $50 = HEAPU32[$15 >> 2];
+ if (($50 | 0) == 0) {
+ HEAP32[$mode >> 2] = 12;
+ var $ret_0_be = $ret_0;
+ var $next_0_be = $next_0;
+ var $put_0_be = $put_0;
+ var $have_0_be = $have_0;
+ var $left_0_be = $left_0;
+ var $hold_0_be = $hold_0;
+ var $bits_0_be = $bits_0;
+ var $out_0_be = $out_0;
+ __label__ = 268;
+ break;
+ }
+ var $next_1 = $next_0;
+ var $have_1 = $have_0;
+ var $hold_1 = $hold_0;
+ var $bits_1 = $bits_0;
+ while (1) {
+ var $bits_1;
+ var $hold_1;
+ var $have_1;
+ var $next_1;
+ if (!($bits_1 >>> 0 < 16)) {
+ break;
+ }
+ if (($have_1 | 0) == 0) {
+ var $ret_8 = $ret_0;
+ var $next_58 = $next_1;
+ var $have_58 = 0;
+ var $hold_54 = $hold_1;
+ var $bits_54 = $bits_1;
+ var $out_4 = $out_0;
+ break $_$12;
+ }
+ var $add = ((HEAPU8[$next_1] & 255) << $bits_1) + $hold_1 | 0;
+ var $next_1 = $next_1 + 1 | 0;
+ var $have_1 = $have_1 - 1 | 0;
+ var $hold_1 = $add;
+ var $bits_1 = $bits_1 + 8 | 0;
+ }
+ if (($50 & 2 | 0) != 0 & ($hold_1 | 0) == 35615) {
+ var $call = _crc32(0, 0, 0);
+ HEAP32[$16 >> 2] = $call;
+ HEAP8[$arrayidx] = 31;
+ HEAP8[$arrayidx40] = -117;
+ var $52 = HEAP32[$16 >> 2];
+ var $call42 = _crc32($52, $arrayidx, 2);
+ HEAP32[$16 >> 2] = $call42;
+ HEAP32[$mode >> 2] = 1;
+ var $ret_0_be = $ret_0;
+ var $next_0_be = $next_1;
+ var $put_0_be = $put_0;
+ var $have_0_be = $have_1;
+ var $left_0_be = $left_0;
+ var $hold_0_be = 0;
+ var $bits_0_be = 0;
+ var $out_0_be = $out_0;
+ __label__ = 268;
+ break;
+ }
+ HEAP32[$17 >> 2] = 0;
+ var $53 = HEAP32[$18 >> 2];
+ if (($53 | 0) == 0) {
+ var $54 = $50;
+ } else {
+ var $done = $53 + 48 | 0;
+ HEAP32[$done >> 2] = -1;
+ var $54 = HEAP32[$15 >> 2];
+ }
+ var $54;
+ var $tobool56 = ($54 & 1 | 0) == 0;
+ do {
+ if (!$tobool56) {
+ if (!((((($hold_1 << 8 & 65280) + ($hold_1 >>> 8) | 0) >>> 0) % 31 | 0) == 0)) {
+ break;
+ }
+ if (($hold_1 & 15 | 0) == 8) {
+ var $shr74 = $hold_1 >>> 4;
+ var $sub = $bits_1 - 4 | 0;
+ var $add77 = ($shr74 & 15) + 8 | 0;
+ var $55 = HEAPU32[$19 >> 2];
+ var $cmp78 = ($55 | 0) == 0;
+ do {
+ if (!$cmp78) {
+ if (!($add77 >>> 0 > $55 >>> 0)) {
+ break;
+ }
+ HEAP32[$msg >> 2] = STRING_TABLE.__str3100 | 0;
+ HEAP32[$mode >> 2] = 29;
+ var $ret_0_be = $ret_0;
+ var $next_0_be = $next_1;
+ var $put_0_be = $put_0;
+ var $have_0_be = $have_1;
+ var $left_0_be = $left_0;
+ var $hold_0_be = $shr74;
+ var $bits_0_be = $sub;
+ var $out_0_be = $out_0;
+ __label__ = 268;
+ break $_$14;
+ }
+ HEAP32[$19 >> 2] = $add77;
+ } while (0);
+ HEAP32[$20 >> 2] = 1 << $add77;
+ var $call91 = _adler32(0, 0, 0);
+ HEAP32[$16 >> 2] = $call91;
+ HEAP32[$adler >> 2] = $call91;
+ HEAP32[$mode >> 2] = $hold_1 >>> 12 & 2 ^ 11;
+ var $ret_0_be = $ret_0;
+ var $next_0_be = $next_1;
+ var $put_0_be = $put_0;
+ var $have_0_be = $have_1;
+ var $left_0_be = $left_0;
+ var $hold_0_be = 0;
+ var $bits_0_be = 0;
+ var $out_0_be = $out_0;
+ __label__ = 268;
+ break $_$14;
+ }
+ HEAP32[$msg >> 2] = STRING_TABLE.__str299 | 0;
+ HEAP32[$mode >> 2] = 29;
+ var $ret_0_be = $ret_0;
+ var $next_0_be = $next_1;
+ var $put_0_be = $put_0;
+ var $have_0_be = $have_1;
+ var $left_0_be = $left_0;
+ var $hold_0_be = $hold_1;
+ var $bits_0_be = $bits_1;
+ var $out_0_be = $out_0;
+ __label__ = 268;
+ break $_$14;
+ }
+ } while (0);
+ HEAP32[$msg >> 2] = STRING_TABLE.__str198 | 0;
+ HEAP32[$mode >> 2] = 29;
+ var $ret_0_be = $ret_0;
+ var $next_0_be = $next_1;
+ var $put_0_be = $put_0;
+ var $have_0_be = $have_1;
+ var $left_0_be = $left_0;
+ var $hold_0_be = $hold_1;
+ var $bits_0_be = $bits_1;
+ var $out_0_be = $out_0;
+ __label__ = 268;
+ break;
+ } else if (($49 | 0) == 1) {
+ var $next_2 = $next_0;
+ var $have_2 = $have_0;
+ var $hold_2 = $hold_0;
+ var $bits_2 = $bits_0;
+ while (1) {
+ var $bits_2;
+ var $hold_2;
+ var $have_2;
+ var $next_2;
+ if (!($bits_2 >>> 0 < 16)) {
+ break;
+ }
+ if (($have_2 | 0) == 0) {
+ var $ret_8 = $ret_0;
+ var $next_58 = $next_2;
+ var $have_58 = 0;
+ var $hold_54 = $hold_2;
+ var $bits_54 = $bits_2;
+ var $out_4 = $out_0;
+ break $_$12;
+ }
+ var $add113 = ((HEAPU8[$next_2] & 255) << $bits_2) + $hold_2 | 0;
+ var $next_2 = $next_2 + 1 | 0;
+ var $have_2 = $have_2 - 1 | 0;
+ var $hold_2 = $add113;
+ var $bits_2 = $bits_2 + 8 | 0;
+ }
+ HEAP32[$17 >> 2] = $hold_2;
+ if (!(($hold_2 & 255 | 0) == 8)) {
+ HEAP32[$msg >> 2] = STRING_TABLE.__str299 | 0;
+ HEAP32[$mode >> 2] = 29;
+ var $ret_0_be = $ret_0;
+ var $next_0_be = $next_2;
+ var $put_0_be = $put_0;
+ var $have_0_be = $have_2;
+ var $left_0_be = $left_0;
+ var $hold_0_be = $hold_2;
+ var $bits_0_be = $bits_2;
+ var $out_0_be = $out_0;
+ __label__ = 268;
+ break;
+ }
+ if (($hold_2 & 57344 | 0) == 0) {
+ var $59 = HEAPU32[$18 >> 2];
+ if (($59 | 0) == 0) {
+ var $60 = $hold_2;
+ } else {
+ HEAP32[($59 | 0) >> 2] = $hold_2 >>> 8 & 1;
+ var $60 = HEAP32[$17 >> 2];
+ }
+ var $60;
+ if (!(($60 & 512 | 0) == 0)) {
+ HEAP8[$arrayidx] = $hold_2 & 255;
+ HEAP8[$arrayidx40] = $hold_2 >>> 8 & 255;
+ var $61 = HEAP32[$16 >> 2];
+ var $call154 = _crc32($61, $arrayidx, 2);
+ HEAP32[$16 >> 2] = $call154;
+ }
+ HEAP32[$mode >> 2] = 2;
+ var $next_3 = $next_2;
+ var $have_3 = $have_2;
+ var $hold_3 = 0;
+ var $bits_3 = 0;
+ __label__ = 44;
+ break;
+ }
+ HEAP32[$msg >> 2] = STRING_TABLE.__str4101 | 0;
+ HEAP32[$mode >> 2] = 29;
+ var $ret_0_be = $ret_0;
+ var $next_0_be = $next_2;
+ var $put_0_be = $put_0;
+ var $have_0_be = $have_2;
+ var $left_0_be = $left_0;
+ var $hold_0_be = $hold_2;
+ var $bits_0_be = $bits_2;
+ var $out_0_be = $out_0;
+ __label__ = 268;
+ break;
+ } else if (($49 | 0) == 2) {
+ var $next_3 = $next_0;
+ var $have_3 = $have_0;
+ var $hold_3 = $hold_0;
+ var $bits_3 = $bits_0;
+ __label__ = 44;
+ } else if (($49 | 0) == 3) {
+ var $next_4 = $next_0;
+ var $have_4 = $have_0;
+ var $hold_4 = $hold_0;
+ var $bits_4 = $bits_0;
+ __label__ = 52;
+ } else if (($49 | 0) == 4) {
+ var $next_5 = $next_0;
+ var $have_5 = $have_0;
+ var $hold_5 = $hold_0;
+ var $bits_5 = $bits_0;
+ __label__ = 60;
+ } else if (($49 | 0) == 5) {
+ var $next_8 = $next_0;
+ var $have_8 = $have_0;
+ var $hold_8 = $hold_0;
+ var $bits_8 = $bits_0;
+ __label__ = 71;
+ } else if (($49 | 0) == 6) {
+ var $next_11 = $next_0;
+ var $have_11 = $have_0;
+ var $hold_9 = $hold_0;
+ var $bits_9 = $bits_0;
+ var $89 = HEAP32[$17 >> 2];
+ __label__ = 81;
+ break;
+ } else if (($49 | 0) == 7) {
+ var $next_13 = $next_0;
+ var $have_13 = $have_0;
+ var $hold_10 = $hold_0;
+ var $bits_10 = $bits_0;
+ __label__ = 94;
+ } else if (($49 | 0) == 8) {
+ var $next_15 = $next_0;
+ var $have_15 = $have_0;
+ var $hold_11 = $hold_0;
+ var $bits_11 = $bits_0;
+ __label__ = 107;
+ } else if (($49 | 0) == 9) {
+ var $next_18 = $next_0;
+ var $have_18 = $have_0;
+ var $hold_14 = $hold_0;
+ var $bits_14 = $bits_0;
+ while (1) {
+ var $bits_14;
+ var $hold_14;
+ var $have_18;
+ var $next_18;
+ if (!($bits_14 >>> 0 < 32)) {
+ break;
+ }
+ if (($have_18 | 0) == 0) {
+ var $ret_8 = $ret_0;
+ var $next_58 = $next_18;
+ var $have_58 = 0;
+ var $hold_54 = $hold_14;
+ var $bits_54 = $bits_14;
+ var $out_4 = $out_0;
+ break $_$12;
+ }
+ var $add564 = ((HEAPU8[$next_18] & 255) << $bits_14) + $hold_14 | 0;
+ var $next_18 = $next_18 + 1 | 0;
+ var $have_18 = $have_18 - 1 | 0;
+ var $hold_14 = $add564;
+ var $bits_14 = $bits_14 + 8 | 0;
+ }
+ var $add581 = _llvm_bswap_i32($hold_14);
+ HEAP32[$16 >> 2] = $add581;
+ HEAP32[$adler >> 2] = $add581;
+ HEAP32[$mode >> 2] = 10;
+ var $next_19 = $next_18;
+ var $have_19 = $have_18;
+ var $hold_15 = 0;
+ var $bits_15 = 0;
+ __label__ = 120;
+ break;
+ } else if (($49 | 0) == 10) {
+ var $next_19 = $next_0;
+ var $have_19 = $have_0;
+ var $hold_15 = $hold_0;
+ var $bits_15 = $bits_0;
+ __label__ = 120;
+ } else if (($49 | 0) == 11) {
+ var $next_20 = $next_0;
+ var $have_20 = $have_0;
+ var $hold_16 = $hold_0;
+ var $bits_16 = $bits_0;
+ __label__ = 123;
+ } else if (($49 | 0) == 12) {
+ var $next_21 = $next_0;
+ var $have_21 = $have_0;
+ var $hold_17 = $hold_0;
+ var $bits_17 = $bits_0;
+ __label__ = 124;
+ } else if (($49 | 0) == 13) {
+ var $and681 = $bits_0 & 7;
+ var $next_23 = $next_0;
+ var $have_23 = $have_0;
+ var $hold_19 = $hold_0 >>> ($and681 >>> 0);
+ var $bits_19 = $bits_0 - $and681 | 0;
+ while (1) {
+ var $bits_19;
+ var $hold_19;
+ var $have_23;
+ var $next_23;
+ if (!($bits_19 >>> 0 < 32)) {
+ break;
+ }
+ if (($have_23 | 0) == 0) {
+ var $ret_8 = $ret_0;
+ var $next_58 = $next_23;
+ var $have_58 = 0;
+ var $hold_54 = $hold_19;
+ var $bits_54 = $bits_19;
+ var $out_4 = $out_0;
+ break $_$12;
+ }
+ var $add701 = ((HEAPU8[$next_23] & 255) << $bits_19) + $hold_19 | 0;
+ var $next_23 = $next_23 + 1 | 0;
+ var $have_23 = $have_23 - 1 | 0;
+ var $hold_19 = $add701;
+ var $bits_19 = $bits_19 + 8 | 0;
+ }
+ var $and708 = $hold_19 & 65535;
+ if (!(($and708 | 0) == ($hold_19 >>> 16 ^ 65535 | 0))) {
+ HEAP32[$msg >> 2] = STRING_TABLE.__str7104 | 0;
+ HEAP32[$mode >> 2] = 29;
+ var $ret_0_be = $ret_0;
+ var $next_0_be = $next_23;
+ var $put_0_be = $put_0;
+ var $have_0_be = $have_23;
+ var $left_0_be = $left_0;
+ var $hold_0_be = $hold_19;
+ var $bits_0_be = $bits_19;
+ var $out_0_be = $out_0;
+ __label__ = 268;
+ break;
+ }
+ HEAP32[$21 >> 2] = $and708;
+ HEAP32[$mode >> 2] = 14;
+ if ($cmp660) {
+ var $ret_8 = $ret_0;
+ var $next_58 = $next_23;
+ var $have_58 = $have_23;
+ var $hold_54 = 0;
+ var $bits_54 = 0;
+ var $out_4 = $out_0;
+ break $_$12;
+ }
+ var $next_24 = $next_23;
+ var $have_24 = $have_23;
+ var $hold_20 = 0;
+ var $bits_20 = 0;
+ __label__ = 143;
+ break;
+ } else if (($49 | 0) == 14) {
+ var $next_24 = $next_0;
+ var $have_24 = $have_0;
+ var $hold_20 = $hold_0;
+ var $bits_20 = $bits_0;
+ __label__ = 143;
+ } else if (($49 | 0) == 15) {
+ var $next_25 = $next_0;
+ var $have_25 = $have_0;
+ var $hold_21 = $hold_0;
+ var $bits_21 = $bits_0;
+ __label__ = 144;
+ } else if (($49 | 0) == 16) {
+ var $next_26 = $next_0;
+ var $have_26 = $have_0;
+ var $hold_22 = $hold_0;
+ var $bits_22 = $bits_0;
+ while (1) {
+ var $bits_22;
+ var $hold_22;
+ var $have_26;
+ var $next_26;
+ if (!($bits_22 >>> 0 < 14)) {
+ break;
+ }
+ if (($have_26 | 0) == 0) {
+ var $ret_8 = $ret_0;
+ var $next_58 = $next_26;
+ var $have_58 = 0;
+ var $hold_54 = $hold_22;
+ var $bits_54 = $bits_22;
+ var $out_4 = $out_0;
+ break $_$12;
+ }
+ var $add767 = ((HEAPU8[$next_26] & 255) << $bits_22) + $hold_22 | 0;
+ var $next_26 = $next_26 + 1 | 0;
+ var $have_26 = $have_26 - 1 | 0;
+ var $hold_22 = $add767;
+ var $bits_22 = $bits_22 + 8 | 0;
+ }
+ var $add775 = ($hold_22 & 31) + 257 | 0;
+ HEAP32[$37 >> 2] = $add775;
+ var $add782 = ($hold_22 >>> 5 & 31) + 1 | 0;
+ HEAP32[$38 >> 2] = $add782;
+ HEAP32[$39 >> 2] = ($hold_22 >>> 10 & 15) + 4 | 0;
+ var $shr791 = $hold_22 >>> 14;
+ var $sub792 = $bits_22 - 14 | 0;
+ if ($add775 >>> 0 > 286 | $add782 >>> 0 > 30) {
+ HEAP32[$msg >> 2] = STRING_TABLE.__str8105 | 0;
+ HEAP32[$mode >> 2] = 29;
+ var $ret_0_be = $ret_0;
+ var $next_0_be = $next_26;
+ var $put_0_be = $put_0;
+ var $have_0_be = $have_26;
+ var $left_0_be = $left_0;
+ var $hold_0_be = $shr791;
+ var $bits_0_be = $sub792;
+ var $out_0_be = $out_0;
+ __label__ = 268;
+ break;
+ }
+ HEAP32[$40 >> 2] = 0;
+ HEAP32[$mode >> 2] = 17;
+ var $next_27 = $next_26;
+ var $have_27 = $have_26;
+ var $hold_23 = $shr791;
+ var $bits_23 = $sub792;
+ __label__ = 154;
+ break;
+ } else if (($49 | 0) == 17) {
+ var $next_27 = $next_0;
+ var $have_27 = $have_0;
+ var $hold_23 = $hold_0;
+ var $bits_23 = $bits_0;
+ __label__ = 154;
+ } else if (($49 | 0) == 18) {
+ var $ret_1_ph = $ret_0;
+ var $next_29_ph = $next_0;
+ var $have_29_ph = $have_0;
+ var $hold_25_ph = $hold_0;
+ var $bits_25_ph = $bits_0;
+ __label__ = 164;
+ } else if (($49 | 0) == 19) {
+ var $ret_2 = $ret_0;
+ var $next_37 = $next_0;
+ var $have_37 = $have_0;
+ var $hold_33 = $hold_0;
+ var $bits_33 = $bits_0;
+ __label__ = 205;
+ } else if (($49 | 0) == 20) {
+ var $ret_3 = $ret_0;
+ var $next_38 = $next_0;
+ var $have_38 = $have_0;
+ var $hold_34 = $hold_0;
+ var $bits_34 = $bits_0;
+ __label__ = 206;
+ } else if (($49 | 0) == 21) {
+ var $ret_4 = $ret_0;
+ var $next_42 = $next_0;
+ var $have_42 = $have_0;
+ var $hold_38 = $hold_0;
+ var $bits_38 = $bits_0;
+ var $156 = HEAP32[$28 >> 2];
+ __label__ = 227;
+ break;
+ } else if (($49 | 0) == 22) {
+ var $ret_5_ph = $ret_0;
+ var $next_45_ph = $next_0;
+ var $have_45_ph = $have_0;
+ var $hold_41_ph = $hold_0;
+ var $bits_41_ph = $bits_0;
+ __label__ = 234;
+ } else if (($49 | 0) == 23) {
+ var $ret_6 = $ret_0;
+ var $next_48 = $next_0;
+ var $have_48 = $have_0;
+ var $hold_44 = $hold_0;
+ var $bits_44 = $bits_0;
+ var $167 = HEAP32[$28 >> 2];
+ __label__ = 248;
+ break;
+ } else if (($49 | 0) == 24) {
+ var $ret_7 = $ret_0;
+ var $next_51 = $next_0;
+ var $have_51 = $have_0;
+ var $hold_47 = $hold_0;
+ var $bits_47 = $bits_0;
+ __label__ = 254;
+ } else if (($49 | 0) == 25) {
+ if (($left_0 | 0) == 0) {
+ var $ret_8 = $ret_0;
+ var $next_58 = $next_0;
+ var $have_58 = $have_0;
+ var $hold_54 = $hold_0;
+ var $bits_54 = $bits_0;
+ var $out_4 = $out_0;
+ break $_$12;
+ }
+ HEAP8[$put_0] = HEAP32[$21 >> 2] & 255;
+ HEAP32[$mode >> 2] = 20;
+ var $ret_0_be = $ret_0;
+ var $next_0_be = $next_0;
+ var $put_0_be = $put_0 + 1 | 0;
+ var $have_0_be = $have_0;
+ var $left_0_be = $left_0 - 1 | 0;
+ var $hold_0_be = $hold_0;
+ var $bits_0_be = $bits_0;
+ var $out_0_be = $out_0;
+ __label__ = 268;
+ break;
+ } else if (($49 | 0) == 26) {
+ var $tobool1626 = (HEAP32[$15 >> 2] | 0) == 0;
+ do {
+ if (!$tobool1626) {
+ var $next_52 = $next_0;
+ var $have_52 = $have_0;
+ var $hold_48 = $hold_0;
+ var $bits_48 = $bits_0;
+ while (1) {
+ var $bits_48;
+ var $hold_48;
+ var $have_52;
+ var $next_52;
+ if (!($bits_48 >>> 0 < 32)) {
+ break;
+ }
+ if (($have_52 | 0) == 0) {
+ var $ret_8 = $ret_0;
+ var $next_58 = $next_52;
+ var $have_58 = 0;
+ var $hold_54 = $hold_48;
+ var $bits_54 = $bits_48;
+ var $out_4 = $out_0;
+ break $_$12;
+ }
+ var $add1642 = ((HEAPU8[$next_52] & 255) << $bits_48) + $hold_48 | 0;
+ var $next_52 = $next_52 + 1 | 0;
+ var $have_52 = $have_52 - 1 | 0;
+ var $hold_48 = $add1642;
+ var $bits_48 = $bits_48 + 8 | 0;
+ }
+ var $sub1649 = $out_0 - $left_0 | 0;
+ var $add1650 = HEAP32[$total_out >> 2] + $sub1649 | 0;
+ HEAP32[$total_out >> 2] = $add1650;
+ var $add1651 = HEAP32[$36 >> 2] + $sub1649 | 0;
+ HEAP32[$36 >> 2] = $add1651;
+ if (!(($out_0 | 0) == ($left_0 | 0))) {
+ var $192 = HEAP32[$16 >> 2];
+ var $add_ptr1659 = $put_0 + (-$sub1649 | 0) | 0;
+ if ((HEAP32[$17 >> 2] | 0) == 0) {
+ var $call1665 = _adler32($192, $add_ptr1659, $sub1649);
+ var $cond1667 = $call1665;
+ } else {
+ var $call1660 = _crc32($192, $add_ptr1659, $sub1649);
+ var $cond1667 = $call1660;
+ }
+ var $cond1667;