diff options
author | Alon Zakai <alonzakai@gmail.com> | 2013-07-17 17:27:35 -0700 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2013-07-17 17:27:35 -0700 |
commit | 7e8bd8bc10fa0d70913c21dd914c70db0bbc2523 (patch) | |
tree | 5cd200db647eed1b6f5c0d83c7cb0461ec1c4dba | |
parent | 3a1a48bb749e7001b8f3eb6bff0f486a4d03a040 (diff) |
add asm coercion when outlining
-rw-r--r-- | tools/js-optimizer.js | 28 | ||||
-rw-r--r-- | tools/test-js-optimizer-asm-outline1-output.js | 66 | ||||
-rw-r--r-- | tools/test-js-optimizer-asm-outline2-output.js | 192 |
3 files changed, 142 insertions, 144 deletions
diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index a3b7db53..9de40d20 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -1540,24 +1540,22 @@ function detectAsmCoercion(node, asmInfo) { // for params, +x vs x|0, for vars, 0.0 vs 0 if (node[0] === 'num' && node[1].toString().indexOf('.') >= 0) return ASM_DOUBLE; if (node[0] === 'unary-prefix') return ASM_DOUBLE; - if (asmInfo && node[0] == 'name') { - if (node[1] in asmInfo.vars) return asmInfo.vars[node[1]]; - if (node[1] in asmInfo.params) return asmInfo.params[node[1]]; - } + if (asmInfo && node[0] == 'name') return getAsmType(node[1], asmInfo); return ASM_INT; } -function makeAsmParamCoercion(param, type) { - return type === ASM_INT ? ['binary', '|', ['name', param], ['num', 0]] : ['unary-prefix', '+', ['name', param]]; +function makeAsmCoercion(node, type) { + return type === ASM_INT ? ['binary', '|', node, ['num', 0]] : ['unary-prefix', '+', node]; } function makeAsmVarDef(v, type) { return [v, type === ASM_INT ? ['num', 0] : ['unary-prefix', '+', ['num', 0]]]; } -function getAsmType(asmInfo, name) { +function getAsmType(name, asmInfo) { if (name in asmInfo.vars) return asmInfo.vars[name]; - return asmInfo.params[name]; + if (name in asmInfo.params) return asmInfo.params[name]; + assert(false, 'unknown var ' + name); } function normalizeAsm(func) { @@ -1658,7 +1656,7 @@ function denormalizeAsm(func, data) { // add param coercions var next = 0; func[2].forEach(function(param) { - stats[next++] = ['stat', ['assign', true, ['name', param], makeAsmParamCoercion(param, data.params[param])]]; + stats[next++] = ['stat', ['assign', true, ['name', param], makeAsmCoercion(['name', param], data.params[param])]]; }); // add variable definitions var varDefs = []; @@ -3125,12 +3123,12 @@ function outline(ast) { var reps = []; for (var v in codeInfo.reads) { if (v != 'sp') { - reps.push(['stat', ['assign', true, ['sub', ['name', getAsmType(asmData, v) == ASM_INT ? 'HEAP32' : 'HEAPF32'], ['binary', '>>', ['binary', '+', ['name', 'sp'], ['num', asmData.stackPos[v]]], ['num', '2']]], ['name', v]]]); + reps.push(['stat', ['assign', true, ['sub', ['name', getAsmType(v, asmData) == ASM_INT ? 'HEAP32' : 'HEAPF32'], ['binary', '>>', ['binary', '+', ['name', 'sp'], ['num', asmData.stackPos[v]]], ['num', '2']]], ['name', v]]]); } } reps.push(['stat', ['call', ['name', newIdent], [['name', 'sp']]]]); for (var v in codeInfo.writes) { - reps.push(['stat', ['assign', true, ['name', v], ['sub', ['name', getAsmType(asmData, v) == ASM_INT ? 'HEAP32' : 'HEAPF32'], ['binary', '>>', ['binary', '+', ['name', 'sp'], ['num', asmData.stackPos[v]]], ['num', '2']]]]]); + reps.push(['stat', ['assign', true, ['name', v], makeAsmCoercion(['sub', ['name', getAsmType(v, asmData) == ASM_INT ? 'HEAP32' : 'HEAPF32'], ['binary', '>>', ['binary', '+', ['name', 'sp'], ['num', asmData.stackPos[v]]], ['num', '2']]], getAsmType(v, asmData))]]); } // Generate new function if (codeInfo.hasReturn || codeInfo.hasBreak || codeInfo.hasContinue) { @@ -3247,21 +3245,21 @@ function outline(ast) { // add spills and unspills in outlined code outside the OL loop for (var v in codeInfo.reads) { if (v != 'sp') { - code.unshift(['stat', ['assign', true, ['name', v], ['sub', ['name', getAsmType(asmData, v) == ASM_INT ? 'HEAP32' : 'HEAPF32'], ['binary', '>>', ['binary', '+', ['name', 'sp'], ['num', asmData.stackPos[v]]], ['num', '2']]]]]); + code.unshift(['stat', ['assign', true, ['name', v], makeAsmCoercion(['sub', ['name', getAsmType(v, asmData) == ASM_INT ? 'HEAP32' : 'HEAPF32'], ['binary', '>>', ['binary', '+', ['name', 'sp'], ['num', asmData.stackPos[v]]], ['num', '2']]], getAsmType(v, asmData))]]); } } for (var v in codeInfo.writes) { - code.push(['stat', ['assign', true, ['sub', ['name', getAsmType(asmData, v) == ASM_INT ? 'HEAP32' : 'HEAPF32'], ['binary', '>>', ['binary', '+', ['name', 'sp'], ['num', asmData.stackPos[v]]], ['num', '2']]], ['name', v]]]); + code.push(['stat', ['assign', true, ['sub', ['name', getAsmType(v, asmData) == ASM_INT ? 'HEAP32' : 'HEAPF32'], ['binary', '>>', ['binary', '+', ['name', 'sp'], ['num', asmData.stackPos[v]]], ['num', '2']]], ['name', v]]]); } // finalize var newFunc = ['defun', newIdent, ['sp'], code]; var newAsmData = { params: { sp: ASM_INT }, vars: {} }; for (var v in codeInfo.reads) { - if (v != 'sp') newAsmData.vars[v] = getAsmType(asmData, v); + if (v != 'sp') newAsmData.vars[v] = getAsmType(v, asmData); } for (var v in codeInfo.writes) { assert(v != 'sp'); - newAsmData.vars[v] = getAsmType(asmData, v); + newAsmData.vars[v] = getAsmType(v, asmData); } denormalizeAsm(newFunc, newAsmData); // replace in stats diff --git a/tools/test-js-optimizer-asm-outline1-output.js b/tools/test-js-optimizer-asm-outline1-output.js index b61dcf25..ea447ac1 100644 --- a/tools/test-js-optimizer-asm-outline1-output.js +++ b/tools/test-js-optimizer-asm-outline1-output.js @@ -151,8 +151,8 @@ function vars2(x, y) { HEAP32[sp + 16 >> 2] = a; HEAPF32[sp + 24 >> 2] = b; vars2$0(sp); - a = HEAP32[sp + 16 >> 2]; - b = HEAPF32[sp + 24 >> 2]; + a = HEAP32[sp + 16 >> 2] | 0; + b = +HEAPF32[sp + 24 >> 2]; STACKTOP = sp; } function vars3(x, y) { @@ -165,12 +165,12 @@ function vars3(x, y) { HEAP32[sp + 0 >> 2] = x; HEAPF32[sp + 8 >> 2] = y; vars3$1(sp); - a = HEAP32[sp + 16 >> 2]; + a = HEAP32[sp + 16 >> 2] | 0; HEAP32[sp + 16 >> 2] = a; HEAPF32[sp + 8 >> 2] = y; HEAP32[sp + 0 >> 2] = x; vars3$0(sp); - a = HEAP32[sp + 16 >> 2]; + a = HEAP32[sp + 16 >> 2] | 0; STACKTOP = sp; } function vars4(x, y) { @@ -184,13 +184,13 @@ function vars4(x, y) { HEAP32[sp + 0 >> 2] = x; HEAP32[sp + 16 >> 2] = a; vars4$1(sp); - b = HEAPF32[sp + 24 >> 2]; - a = HEAP32[sp + 16 >> 2]; + b = +HEAPF32[sp + 24 >> 2]; + a = HEAP32[sp + 16 >> 2] | 0; HEAP32[sp + 16 >> 2] = a; HEAP32[sp + 0 >> 2] = x; vars4$0(sp); - a = HEAP32[sp + 16 >> 2]; - b = HEAPF32[sp + 24 >> 2]; + a = HEAP32[sp + 16 >> 2] | 0; + b = +HEAPF32[sp + 24 >> 2]; STACKTOP = sp; } function vars_w_stack(x, y) { @@ -204,12 +204,12 @@ function vars_w_stack(x, y) { HEAP32[sp + 16 >> 2] = x; HEAP32[sp + 32 >> 2] = a; vars_w_stack$1(sp); - b = HEAPF32[sp + 40 >> 2]; - a = HEAP32[sp + 32 >> 2]; + b = +HEAPF32[sp + 40 >> 2]; + a = HEAP32[sp + 32 >> 2] | 0; HEAP32[sp + 32 >> 2] = a; vars_w_stack$0(sp); - a = HEAP32[sp + 32 >> 2]; - b = HEAPF32[sp + 40 >> 2]; + a = HEAP32[sp + 32 >> 2] | 0; + b = +HEAPF32[sp + 40 >> 2]; } function lin$0(sp) { sp = sp | 0; @@ -373,8 +373,8 @@ function mix$1(sp) { function vars$0(sp) { sp = sp | 0; var x = 0, y = +0; - y = HEAPF32[sp + 8 >> 2]; - x = HEAP32[sp + 0 >> 2]; + y = +HEAPF32[sp + 8 >> 2]; + x = HEAP32[sp + 0 >> 2] | 0; c(5 + (x + y)); c(6 + y * x); c(7 + (x + y)); @@ -383,8 +383,8 @@ function vars$0(sp) { function vars$1(sp) { sp = sp | 0; var x = 0, y = +0; - y = HEAPF32[sp + 8 >> 2]; - x = HEAP32[sp + 0 >> 2]; + y = +HEAPF32[sp + 8 >> 2]; + x = HEAP32[sp + 0 >> 2] | 0; c(1 + (x + y)); c(2 + y * x); c(3 + (x + y)); @@ -393,8 +393,8 @@ function vars$1(sp) { function vars2$0(sp) { sp = sp | 0; var a = 0, b = +0; - b = HEAPF32[sp + 24 >> 2]; - a = HEAP32[sp + 16 >> 2]; + b = +HEAPF32[sp + 24 >> 2]; + a = HEAP32[sp + 16 >> 2] | 0; a = c(3 + a); b = c(4 + b); a = c(5 + a); @@ -405,9 +405,9 @@ function vars2$0(sp) { function vars3$0(sp) { sp = sp | 0; var a = 0, y = +0, x = 0; - x = HEAP32[sp + 0 >> 2]; - y = HEAPF32[sp + 8 >> 2]; - a = HEAP32[sp + 16 >> 2]; + x = HEAP32[sp + 0 >> 2] | 0; + y = +HEAPF32[sp + 8 >> 2]; + a = HEAP32[sp + 16 >> 2] | 0; a = c(4 + y * x); a = c(5 + a); a = c(6 + y * x); @@ -417,9 +417,9 @@ function vars3$0(sp) { function vars3$1(sp) { sp = sp | 0; var a = 0, x = 0, y = +0; - y = HEAPF32[sp + 8 >> 2]; - x = HEAP32[sp + 0 >> 2]; - a = HEAP32[sp + 16 >> 2]; + y = +HEAPF32[sp + 8 >> 2]; + x = HEAP32[sp + 0 >> 2] | 0; + a = HEAP32[sp + 16 >> 2] | 0; a = x + y; a = c(1 + a); a = c(2 + y * x); @@ -429,8 +429,8 @@ function vars3$1(sp) { function vars4$0(sp) { sp = sp | 0; var a = 0, x = 0, b = +0; - x = HEAP32[sp + 0 >> 2]; - a = HEAP32[sp + 16 >> 2]; + x = HEAP32[sp + 0 >> 2] | 0; + a = HEAP32[sp + 16 >> 2] | 0; a = c(4 + a); a = c(5 + a); a = c(6 + a); @@ -441,9 +441,9 @@ function vars4$0(sp) { function vars4$1(sp) { sp = sp | 0; var y = +0, x = 0, a = 0; - a = HEAP32[sp + 16 >> 2]; - x = HEAP32[sp + 0 >> 2]; - y = HEAPF32[sp + 8 >> 2]; + a = HEAP32[sp + 16 >> 2] | 0; + x = HEAP32[sp + 0 >> 2] | 0; + y = +HEAPF32[sp + 8 >> 2]; a = c(1 + a); a = c(2 + a); a = c(3 + a); @@ -453,7 +453,7 @@ function vars4$1(sp) { function vars_w_stack$0(sp) { sp = sp | 0; var a = 0, b = +0; - a = HEAP32[sp + 32 >> 2]; + a = HEAP32[sp + 32 >> 2] | 0; a = c(4 + a); a = c(5 + a); a = c(6 + a); @@ -465,9 +465,9 @@ function vars_w_stack$0(sp) { function vars_w_stack$1(sp) { sp = sp | 0; var y = +0, x = 0, a = 0; - a = HEAP32[sp + 32 >> 2]; - x = HEAP32[sp + 16 >> 2]; - y = HEAPF32[sp + 24 >> 2]; + a = HEAP32[sp + 32 >> 2] | 0; + x = HEAP32[sp + 16 >> 2] | 0; + y = +HEAPF32[sp + 24 >> 2]; a = c(1 + a); a = c(2 + a); a = c(3 + a); diff --git a/tools/test-js-optimizer-asm-outline2-output.js b/tools/test-js-optimizer-asm-outline2-output.js index 349246ab..e8877937 100644 --- a/tools/test-js-optimizer-asm-outline2-output.js +++ b/tools/test-js-optimizer-asm-outline2-output.js @@ -69,27 +69,27 @@ function _free($mem) { HEAP32[sp + 192 >> 2] = $151; HEAP32[sp + 200 >> 2] = $164; _free$1(sp); - $p_0 = HEAP32[sp + 216 >> 2]; - $psize_0 = HEAP32[sp + 208 >> 2]; - $37 = HEAP32[sp + 56 >> 2]; - $40 = HEAP32[sp + 64 >> 2]; - $_pre_phi307 = HEAP32[sp + 72 >> 2]; - $69 = HEAP32[sp + 80 >> 2]; - $72 = HEAP32[sp + 88 >> 2]; - $75 = HEAP32[sp + 96 >> 2]; - $95 = HEAP32[sp + 112 >> 2]; - $100 = HEAP32[sp + 120 >> 2]; - $R_1 = HEAP32[sp + 176 >> 2]; - $R_0 = HEAP32[sp + 136 >> 2]; - $RP_0 = HEAP32[sp + 128 >> 2]; - $102 = HEAP32[sp + 144 >> 2]; - $103 = HEAP32[sp + 152 >> 2]; - $106 = HEAP32[sp + 160 >> 2]; - $107 = HEAP32[sp + 168 >> 2]; - $80 = HEAP32[sp + 104 >> 2]; - $120 = HEAP32[sp + 184 >> 2]; - $151 = HEAP32[sp + 192 >> 2]; - $164 = HEAP32[sp + 200 >> 2]; + $p_0 = HEAP32[sp + 216 >> 2] | 0; + $psize_0 = HEAP32[sp + 208 >> 2] | 0; + $37 = HEAP32[sp + 56 >> 2] | 0; + $40 = HEAP32[sp + 64 >> 2] | 0; + $_pre_phi307 = HEAP32[sp + 72 >> 2] | 0; + $69 = HEAP32[sp + 80 >> 2] | 0; + $72 = HEAP32[sp + 88 >> 2] | 0; + $75 = HEAP32[sp + 96 >> 2] | 0; + $95 = HEAP32[sp + 112 >> 2] | 0; + $100 = HEAP32[sp + 120 >> 2] | 0; + $R_1 = HEAP32[sp + 176 >> 2] | 0; + $R_0 = HEAP32[sp + 136 >> 2] | 0; + $RP_0 = HEAP32[sp + 128 >> 2] | 0; + $102 = HEAP32[sp + 144 >> 2] | 0; + $103 = HEAP32[sp + 152 >> 2] | 0; + $106 = HEAP32[sp + 160 >> 2] | 0; + $107 = HEAP32[sp + 168 >> 2] | 0; + $80 = HEAP32[sp + 104 >> 2] | 0; + $120 = HEAP32[sp + 184 >> 2] | 0; + $151 = HEAP32[sp + 192 >> 2] | 0; + $164 = HEAP32[sp + 200 >> 2] | 0; if (HEAP32[sp + 632 >> 2] == 5) { return; } @@ -167,28 +167,28 @@ function _free($mem) { HEAP32[sp + 400 >> 2] = $351; HEAP32[sp + 408 >> 2] = $364; _free$0(sp); - $220 = HEAP32[sp + 248 >> 2]; - $227 = HEAP32[sp + 256 >> 2]; - $233 = HEAP32[sp + 264 >> 2]; - $236 = HEAP32[sp + 272 >> 2]; - $_pre_phi305 = HEAP32[sp + 280 >> 2]; - $267 = HEAP32[sp + 288 >> 2]; - $270 = HEAP32[sp + 296 >> 2]; - $273 = HEAP32[sp + 304 >> 2]; - $294 = HEAP32[sp + 320 >> 2]; - $299 = HEAP32[sp + 328 >> 2]; - $R7_1 = HEAP32[sp + 384 >> 2]; - $R7_0 = HEAP32[sp + 344 >> 2]; - $RP9_0 = HEAP32[sp + 336 >> 2]; - $301 = HEAP32[sp + 352 >> 2]; - $302 = HEAP32[sp + 360 >> 2]; - $305 = HEAP32[sp + 368 >> 2]; - $306 = HEAP32[sp + 376 >> 2]; - $278 = HEAP32[sp + 312 >> 2]; - $320 = HEAP32[sp + 392 >> 2]; - $351 = HEAP32[sp + 400 >> 2]; - $364 = HEAP32[sp + 408 >> 2]; - $psize_1 = HEAP32[sp + 416 >> 2]; + $220 = HEAP32[sp + 248 >> 2] | 0; + $227 = HEAP32[sp + 256 >> 2] | 0; + $233 = HEAP32[sp + 264 >> 2] | 0; + $236 = HEAP32[sp + 272 >> 2] | 0; + $_pre_phi305 = HEAP32[sp + 280 >> 2] | 0; + $267 = HEAP32[sp + 288 >> 2] | 0; + $270 = HEAP32[sp + 296 >> 2] | 0; + $273 = HEAP32[sp + 304 >> 2] | 0; + $294 = HEAP32[sp + 320 >> 2] | 0; + $299 = HEAP32[sp + 328 >> 2] | 0; + $R7_1 = HEAP32[sp + 384 >> 2] | 0; + $R7_0 = HEAP32[sp + 344 >> 2] | 0; + $RP9_0 = HEAP32[sp + 336 >> 2] | 0; + $301 = HEAP32[sp + 352 >> 2] | 0; + $302 = HEAP32[sp + 360 >> 2] | 0; + $305 = HEAP32[sp + 368 >> 2] | 0; + $306 = HEAP32[sp + 376 >> 2] | 0; + $278 = HEAP32[sp + 312 >> 2] | 0; + $320 = HEAP32[sp + 392 >> 2] | 0; + $351 = HEAP32[sp + 400 >> 2] | 0; + $364 = HEAP32[sp + 408 >> 2] | 0; + $psize_1 = HEAP32[sp + 416 >> 2] | 0; if (HEAP32[sp + 632 >> 2] == 5) { return; } @@ -365,34 +365,34 @@ function linear$1(sp) { function _free$0(sp) { sp = sp | 0; var $16 = 0, $220 = 0, $psize_0 = 0, $p_0 = 0, $189 = 0, $227 = 0, $194 = 0, $233 = 0, $mem = 0, $10 = 0, $236 = 0, $_pre_phi305 = 0, $267 = 0, $270 = 0, $273 = 0, $294 = 0, $299 = 0, $R7_1 = 0, $R7_0 = 0, $RP9_0 = 0, $301 = 0, $302 = 0, $305 = 0, $306 = 0, $278 = 0, $320 = 0, $351 = 0, $364 = 0, $psize_1 = 0; - $364 = HEAP32[sp + 408 >> 2]; - $351 = HEAP32[sp + 400 >> 2]; - $320 = HEAP32[sp + 392 >> 2]; - $278 = HEAP32[sp + 312 >> 2]; - $306 = HEAP32[sp + 376 >> 2]; - $305 = HEAP32[sp + 368 >> 2]; - $302 = HEAP32[sp + 360 >> 2]; - $301 = HEAP32[sp + 352 >> 2]; - $RP9_0 = HEAP32[sp + 336 >> 2]; - $R7_0 = HEAP32[sp + 344 >> 2]; - $R7_1 = HEAP32[sp + 384 >> 2]; - $299 = HEAP32[sp + 328 >> 2]; - $294 = HEAP32[sp + 320 >> 2]; - $273 = HEAP32[sp + 304 >> 2]; - $270 = HEAP32[sp + 296 >> 2]; - $267 = HEAP32[sp + 288 >> 2]; - $_pre_phi305 = HEAP32[sp + 280 >> 2]; - $236 = HEAP32[sp + 272 >> 2]; - $10 = HEAP32[sp + 16 >> 2]; - $mem = HEAP32[sp + 0 >> 2]; - $233 = HEAP32[sp + 264 >> 2]; - $194 = HEAP32[sp + 232 >> 2]; - $227 = HEAP32[sp + 256 >> 2]; - $189 = HEAP32[sp + 224 >> 2]; - $p_0 = HEAP32[sp + 216 >> 2]; - $psize_0 = HEAP32[sp + 208 >> 2]; - $220 = HEAP32[sp + 248 >> 2]; - $16 = HEAP32[sp + 24 >> 2]; + $364 = HEAP32[sp + 408 >> 2] | 0; + $351 = HEAP32[sp + 400 >> 2] | 0; + $320 = HEAP32[sp + 392 >> 2] | 0; + $278 = HEAP32[sp + 312 >> 2] | 0; + $306 = HEAP32[sp + 376 >> 2] | 0; + $305 = HEAP32[sp + 368 >> 2] | 0; + $302 = HEAP32[sp + 360 >> 2] | 0; + $301 = HEAP32[sp + 352 >> 2] | 0; + $RP9_0 = HEAP32[sp + 336 >> 2] | 0; + $R7_0 = HEAP32[sp + 344 >> 2] | 0; + $R7_1 = HEAP32[sp + 384 >> 2] | 0; + $299 = HEAP32[sp + 328 >> 2] | 0; + $294 = HEAP32[sp + 320 >> 2] | 0; + $273 = HEAP32[sp + 304 >> 2] | 0; + $270 = HEAP32[sp + 296 >> 2] | 0; + $267 = HEAP32[sp + 288 >> 2] | 0; + $_pre_phi305 = HEAP32[sp + 280 >> 2] | 0; + $236 = HEAP32[sp + 272 >> 2] | 0; + $10 = HEAP32[sp + 16 >> 2] | 0; + $mem = HEAP32[sp + 0 >> 2] | 0; + $233 = HEAP32[sp + 264 >> 2] | 0; + $194 = HEAP32[sp + 232 >> 2] | 0; + $227 = HEAP32[sp + 256 >> 2] | 0; + $189 = HEAP32[sp + 224 >> 2] | 0; + $p_0 = HEAP32[sp + 216 >> 2] | 0; + $psize_0 = HEAP32[sp + 208 >> 2] | 0; + $220 = HEAP32[sp + 248 >> 2] | 0; + $16 = HEAP32[sp + 24 >> 2] | 0; OL : do { if (($16 | 0) == (HEAP32[25] | 0)) { $220 = (HEAP32[22] | 0) + $psize_0 | 0; @@ -593,31 +593,31 @@ function _free$0(sp) { function _free$1(sp) { sp = sp | 0; var $25 = 0, $mem = 0, $10 = 0, $26 = 0, $21 = 0, $37 = 0, $40 = 0, $5 = 0, $_pre_phi307 = 0, $69 = 0, $72 = 0, $75 = 0, $95 = 0, $100 = 0, $R_1 = 0, $R_0 = 0, $RP_0 = 0, $102 = 0, $103 = 0, $106 = 0, $107 = 0, $80 = 0, $120 = 0, $151 = 0, $164 = 0, $p_0 = 0, $psize_0 = 0; - $164 = HEAP32[sp + 200 >> 2]; - $151 = HEAP32[sp + 192 >> 2]; - $120 = HEAP32[sp + 184 >> 2]; - $80 = HEAP32[sp + 104 >> 2]; - $107 = HEAP32[sp + 168 >> 2]; - $106 = HEAP32[sp + 160 >> 2]; - $103 = HEAP32[sp + 152 >> 2]; - $102 = HEAP32[sp + 144 >> 2]; - $RP_0 = HEAP32[sp + 128 >> 2]; - $R_0 = HEAP32[sp + 136 >> 2]; - $R_1 = HEAP32[sp + 176 >> 2]; - $100 = HEAP32[sp + 120 >> 2]; - $95 = HEAP32[sp + 112 >> 2]; - $75 = HEAP32[sp + 96 >> 2]; - $72 = HEAP32[sp + 88 >> 2]; - $69 = HEAP32[sp + 80 >> 2]; - $_pre_phi307 = HEAP32[sp + 72 >> 2]; - $5 = HEAP32[sp + 8 >> 2]; - $40 = HEAP32[sp + 64 >> 2]; - $37 = HEAP32[sp + 56 >> 2]; - $21 = HEAP32[sp + 32 >> 2]; - $26 = HEAP32[sp + 48 >> 2]; - $10 = HEAP32[sp + 16 >> 2]; - $mem = HEAP32[sp + 0 >> 2]; - $25 = HEAP32[sp + 40 >> 2]; + $164 = HEAP32[sp + 200 >> 2] | 0; + $151 = HEAP32[sp + 192 >> 2] | 0; + $120 = HEAP32[sp + 184 >> 2] | 0; + $80 = HEAP32[sp + 104 >> 2] | 0; + $107 = HEAP32[sp + 168 >> 2] | 0; + $106 = HEAP32[sp + 160 >> 2] | 0; + $103 = HEAP32[sp + 152 >> 2] | 0; + $102 = HEAP32[sp + 144 >> 2] | 0; + $RP_0 = HEAP32[sp + 128 >> 2] | 0; + $R_0 = HEAP32[sp + 136 >> 2] | 0; + $R_1 = HEAP32[sp + 176 >> 2] | 0; + $100 = HEAP32[sp + 120 >> 2] | 0; + $95 = HEAP32[sp + 112 >> 2] | 0; + $75 = HEAP32[sp + 96 >> 2] | 0; + $72 = HEAP32[sp + 88 >> 2] | 0; + $69 = HEAP32[sp + 80 >> 2] | 0; + $_pre_phi307 = HEAP32[sp + 72 >> 2] | 0; + $5 = HEAP32[sp + 8 >> 2] | 0; + $40 = HEAP32[sp + 64 >> 2] | 0; + $37 = HEAP32[sp + 56 >> 2] | 0; + $21 = HEAP32[sp + 32 >> 2] | 0; + $26 = HEAP32[sp + 48 >> 2] | 0; + $10 = HEAP32[sp + 16 >> 2] | 0; + $mem = HEAP32[sp + 0 >> 2] | 0; + $25 = HEAP32[sp + 40 >> 2] | 0; OL : do { if (($25 | 0) == (HEAP32[25] | 0)) { if ((HEAP32[($mem + (($10 & -8) - 4) | 0) >> 2] & 3 | 0) != 3) { |