Created
July 6, 2012 01:51
-
-
Save gatlin/3057551 to your computer and use it in GitHub Desktop.
Emscripten output for a simple Haskell program
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Note: Some Emscripten settings will significantly limit the speed of the generated code. | |
// Note: Some Emscripten settings may limit the speed of the generated code. | |
// TODO: " u s e s t r i c t "; | |
try { | |
this['Module'] = Module; | |
} catch(e) { | |
this['Module'] = Module = {}; | |
} | |
// The environment setup code below is customized to use Module. | |
// *** Environment setup code *** | |
var ENVIRONMENT_IS_NODE = typeof process === 'object'; | |
var ENVIRONMENT_IS_WEB = typeof window === 'object'; | |
var ENVIRONMENT_IS_WORKER = typeof importScripts === 'function'; | |
var ENVIRONMENT_IS_SHELL = !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_NODE && !ENVIRONMENT_IS_WORKER; | |
if (ENVIRONMENT_IS_NODE) { | |
// Expose functionality in the same simple way that the shells work | |
// Note that we pollute the global namespace here, otherwise we break in node | |
Module['print'] = function(x) { | |
process['stdout'].write(x + '\n'); | |
}; | |
Module['printErr'] = function(x) { | |
process['stderr'].write(x + '\n'); | |
}; | |
var nodeFS = require('fs'); | |
var nodePath = require('path'); | |
Module['read'] = function(filename) { | |
filename = nodePath['normalize'](filename); | |
var ret = nodeFS['readFileSync'](filename).toString(); | |
// The path is absolute if the normalized version is the same as the resolved. | |
if (!ret && filename != nodePath['resolve'](filename)) { | |
filename = path.join(__dirname, '..', 'src', filename); | |
ret = nodeFS['readFileSync'](filename).toString(); | |
} | |
return ret; | |
}; | |
Module['load'] = function(f) { | |
globalEval(read(f)); | |
}; | |
if (!Module['arguments']) { | |
Module['arguments'] = process['argv'].slice(2); | |
} | |
} else if (ENVIRONMENT_IS_SHELL) { | |
Module['print'] = print; | |
Module['printErr'] = printErr; | |
// Polyfill over SpiderMonkey/V8 differences | |
if (typeof read != 'undefined') { | |
Module['read'] = read; | |
} else { | |
Module['read'] = function(f) { snarf(f) }; | |
} | |
if (!Module['arguments']) { | |
if (typeof scriptArgs != 'undefined') { | |
Module['arguments'] = scriptArgs; | |
} else if (typeof arguments != 'undefined') { | |
Module['arguments'] = arguments; | |
} | |
} | |
} else if (ENVIRONMENT_IS_WEB) { | |
if (!Module['print']) { | |
Module['print'] = function(x) { | |
console.log(x); | |
}; | |
} | |
if (!Module['printErr']) { | |
Module['printErr'] = function(x) { | |
console.log(x); | |
}; | |
} | |
Module['read'] = function(url) { | |
var xhr = new XMLHttpRequest(); | |
xhr.open('GET', url, false); | |
xhr.send(null); | |
return xhr.responseText; | |
}; | |
if (!Module['arguments']) { | |
if (typeof arguments != 'undefined') { | |
Module['arguments'] = arguments; | |
} | |
} | |
} else if (ENVIRONMENT_IS_WORKER) { | |
// We can do very little here... | |
Module['load'] = importScripts; | |
} else { | |
throw 'Unknown runtime environment. Where are we?'; | |
} | |
function globalEval(x) { | |
eval.call(null, x); | |
} | |
if (!Module['load'] == 'undefined' && Module['read']) { | |
Module['load'] = function(f) { | |
globalEval(Module['read'](f)); | |
}; | |
} | |
if (!Module['printErr']) { | |
Module['printErr'] = function(){}; | |
} | |
if (!Module['print']) { | |
Module['print'] = Module['printErr']; | |
} | |
if (!Module['arguments']) { | |
Module['arguments'] = []; | |
} | |
// *** Environment setup code *** | |
// Closure helpers | |
Module.print = Module['print']; | |
Module.printErr = Module['printErr']; | |
// Callbacks | |
if (!Module['preRun']) Module['preRun'] = []; | |
if (!Module['postRun']) Module['postRun'] = []; | |
// === Auto-generated preamble library stuff === | |
//======================================== | |
// Runtime code shared with compiler | |
//======================================== | |
var Runtime = { | |
stackSave: function () { | |
return STACKTOP; | |
}, | |
stackRestore: function (stackTop) { | |
STACKTOP = stackTop; | |
}, | |
forceAlign: function (target, quantum) { | |
quantum = quantum || 4; | |
if (quantum == 1) return target; | |
if (isNumber(target) && isNumber(quantum)) { | |
return Math.ceil(target/quantum)*quantum; | |
} else if (isNumber(quantum) && isPowerOfTwo(quantum)) { | |
var logg = log2(quantum); | |
return '((((' +target + ')+' + (quantum-1) + ')>>' + logg + ')<<' + logg + ')'; | |
} | |
return 'Math.ceil((' + target + ')/' + quantum + ')*' + quantum; | |
}, | |
isNumberType: function (type) { | |
return type in Runtime.INT_TYPES || type in Runtime.FLOAT_TYPES; | |
}, | |
isPointerType: function isPointerType(type) { | |
return type[type.length-1] == '*'; | |
}, | |
isStructType: function isStructType(type) { | |
if (isPointerType(type)) return false; | |
if (/^\[\d+\ x\ (.*)\]/.test(type)) return true; // [15 x ?] blocks. Like structs | |
if (/<?{ ?[^}]* ?}>?/.test(type)) return true; // { i32, i8 } etc. - anonymous struct types | |
// See comment in isStructPointerType() | |
return type[0] == '%'; | |
}, | |
INT_TYPES: {"i1":0,"i8":0,"i16":0,"i32":0,"i64":0}, | |
FLOAT_TYPES: {"float":0,"double":0}, | |
bitshift64: function (low, high, op, bits) { | |
var ander = Math.pow(2, bits)-1; | |
if (bits < 32) { | |
switch (op) { | |
case 'shl': | |
return [low << bits, (high << bits) | ((low&(ander << (32 - bits))) >>> (32 - bits))]; | |
case 'ashr': | |
return [(((low >>> bits ) | ((high&ander) << (32 - bits))) >> 0) >>> 0, (high >> bits) >>> 0]; | |
case 'lshr': | |
return [((low >>> bits) | ((high&ander) << (32 - bits))) >>> 0, high >>> bits]; | |
} | |
} else if (bits == 32) { | |
switch (op) { | |
case 'shl': | |
return [0, low]; | |
case 'ashr': | |
return [high, (high|0) < 0 ? ander : 0]; | |
case 'lshr': | |
return [high, 0]; | |
} | |
} else { // bits > 32 | |
switch (op) { | |
case 'shl': | |
return [0, low << (bits - 32)]; | |
case 'ashr': | |
return [(high >> (bits - 32)) >>> 0, (high|0) < 0 ? ander : 0]; | |
case 'lshr': | |
return [high >>> (bits - 32) , 0]; | |
} | |
} | |
abort('unknown bitshift64 op: ' + [value, op, bits]); | |
}, | |
or64: function (x, y) { | |
var l = (x | 0) | (y | 0); | |
var h = (Math.round(x / 4294967296) | Math.round(y / 4294967296)) * 4294967296; | |
return l + h; | |
}, | |
and64: function (x, y) { | |
var l = (x | 0) & (y | 0); | |
var h = (Math.round(x / 4294967296) & Math.round(y / 4294967296)) * 4294967296; | |
return l + h; | |
}, | |
xor64: function (x, y) { | |
var l = (x | 0) ^ (y | 0); | |
var h = (Math.round(x / 4294967296) ^ Math.round(y / 4294967296)) * 4294967296; | |
return l + h; | |
}, | |
getNativeTypeSize: function (type, quantumSize) { | |
if (Runtime.QUANTUM_SIZE == 1) return 1; | |
var size = { | |
'%i1': 1, | |
'%i8': 1, | |
'%i16': 2, | |
'%i32': 4, | |
'%i64': 8, | |
"%float": 4, | |
"%double": 8 | |
}['%'+type]; // add '%' since float and double confuse Closure compiler as keys, and also spidermonkey as a compiler will remove 's from '_i8' etc | |
if (!size) { | |
if (type[type.length-1] == '*') { | |
size = Runtime.QUANTUM_SIZE; // A pointer | |
} else if (type[0] == 'i') { | |
var bits = parseInt(type.substr(1)); | |
assert(bits % 8 == 0); | |
size = bits/8; | |
} | |
} | |
return size; | |
}, | |
getNativeFieldSize: function (type) { | |
return Math.max(Runtime.getNativeTypeSize(type), Runtime.QUANTUM_SIZE); | |
}, | |
dedup: function dedup(items, ident) { | |
var seen = {}; | |
if (ident) { | |
return items.filter(function(item) { | |
if (seen[item[ident]]) return false; | |
seen[item[ident]] = true; | |
return true; | |
}); | |
} else { | |
return items.filter(function(item) { | |
if (seen[item]) return false; | |
seen[item] = true; | |
return true; | |
}); | |
} | |
}, | |
set: function set() { | |
var args = typeof arguments[0] === 'object' ? arguments[0] : arguments; | |
var ret = {}; | |
for (var i = 0; i < args.length; i++) { | |
ret[args[i]] = 0; | |
} | |
return ret; | |
}, | |
calculateStructAlignment: function calculateStructAlignment(type) { | |
type.flatSize = 0; | |
type.alignSize = 0; | |
var diffs = []; | |
var prev = -1; | |
type.flatIndexes = type.fields.map(function(field) { | |
var size, alignSize; | |
if (Runtime.isNumberType(field) || Runtime.isPointerType(field)) { | |
size = Runtime.getNativeTypeSize(field); // pack char; char; in structs, also char[X]s. | |
alignSize = size; | |
} else if (Runtime.isStructType(field)) { | |
size = Types.types[field].flatSize; | |
alignSize = Types.types[field].alignSize; | |
} else { | |
throw 'Unclear type in struct: ' + field + ', in ' + type.name_ + ' :: ' + dump(Types.types[type.name_]); | |
} | |
alignSize = type.packed ? 1 : Math.min(alignSize, Runtime.QUANTUM_SIZE); | |
type.alignSize = Math.max(type.alignSize, alignSize); | |
var curr = Runtime.alignMemory(type.flatSize, alignSize); // if necessary, place this on aligned memory | |
type.flatSize = curr + size; | |
if (prev >= 0) { | |
diffs.push(curr-prev); | |
} | |
prev = curr; | |
return curr; | |
}); | |
type.flatSize = Runtime.alignMemory(type.flatSize, type.alignSize); | |
if (diffs.length == 0) { | |
type.flatFactor = type.flatSize; | |
} else if (Runtime.dedup(diffs).length == 1) { | |
type.flatFactor = diffs[0]; | |
} | |
type.needsFlattening = (type.flatFactor != 1); | |
return type.flatIndexes; | |
}, | |
generateStructInfo: function (struct, typeName, offset) { | |
var type, alignment; | |
if (typeName) { | |
offset = offset || 0; | |
type = (typeof Types === 'undefined' ? Runtime.typeInfo : Types.types)[typeName]; | |
if (!type) return null; | |
assert(type.fields.length === struct.length, 'Number of named fields must match the type for ' + typeName); | |
alignment = type.flatIndexes; | |
} else { | |
var type = { fields: struct.map(function(item) { return item[0] }) }; | |
alignment = Runtime.calculateStructAlignment(type); | |
} | |
var ret = { | |
__size__: type.flatSize | |
}; | |
if (typeName) { | |
struct.forEach(function(item, i) { | |
if (typeof item === 'string') { | |
ret[item] = alignment[i] + offset; | |
} else { | |
// embedded struct | |
var key; | |
for (var k in item) key = k; | |
ret[key] = Runtime.generateStructInfo(item[key], type.fields[i], alignment[i]); | |
} | |
}); | |
} else { | |
struct.forEach(function(item, i) { | |
ret[item[1]] = alignment[i]; | |
}); | |
} | |
return ret; | |
}, | |
addFunction: function (func) { | |
var ret = FUNCTION_TABLE.length; | |
FUNCTION_TABLE.push(func); | |
FUNCTION_TABLE.push(0); | |
return ret; | |
}, | |
warnOnce: function (text) { | |
if (!Runtime.warnOnce.shown) Runtime.warnOnce.shown = {}; | |
if (!Runtime.warnOnce.shown[text]) { | |
Runtime.warnOnce.shown[text] = 1; | |
Module.printErr(text); | |
} | |
}, | |
funcWrappers: {}, | |
getFuncWrapper: function (func) { | |
if (!Runtime.funcWrappers[func]) { | |
Runtime.funcWrappers[func] = function() { | |
FUNCTION_TABLE[func].apply(null, arguments); | |
}; | |
} | |
return Runtime.funcWrappers[func]; | |
}, | |
stackAlloc: function stackAlloc(size) { var ret = STACKTOP;STACKTOP += size;STACKTOP = ((((STACKTOP)+3)>>2)<<2);assert(STACKTOP < STACK_ROOT + STACK_MAX, "Ran out of stack"); return ret; }, | |
staticAlloc: function staticAlloc(size) { var ret = STATICTOP;STATICTOP += size;STATICTOP = ((((STATICTOP)+3)>>2)<<2); if (STATICTOP >= TOTAL_MEMORY) enlargeMemory();; return ret; }, | |
alignMemory: function alignMemory(size,quantum) { var ret = size = Math.ceil((size)/(quantum ? quantum : 4))*(quantum ? quantum : 4); return ret; }, | |
makeBigInt: function makeBigInt(low,high,unsigned) { var ret = (unsigned ? (((low)>>>0)+(((high)>>>0)*4294967296)) : (((low)>>>0)+(((high)|0)*4294967296))); return ret; }, | |
QUANTUM_SIZE: 4, | |
__dummy__: 0 | |
} | |
var CorrectionsMonitor = { | |
MAX_ALLOWED: 0, // XXX | |
corrections: 0, | |
sigs: {}, | |
note: function(type, succeed, sig) { | |
if (!succeed) { | |
this.corrections++; | |
if (this.corrections >= this.MAX_ALLOWED) abort('\n\nToo many corrections!'); | |
} | |
}, | |
print: function() { | |
} | |
}; | |
//======================================== | |
// Runtime essentials | |
//======================================== | |
var __THREW__ = false; // Used in checking for thrown exceptions. | |
var ABORT = false; | |
var undef = 0; | |
// tempInt is used for 32-bit signed values or smaller. tempBigInt is used | |
// for 32-bit unsigned values or more than 32 bits. TODO: audit all uses of tempInt | |
var tempValue, tempInt, tempBigInt, tempInt2, tempBigInt2, tempPair, tempBigIntI, tempBigIntR, tempBigIntS, tempBigIntP, tempBigIntD; | |
var tempI64, tempI64b; | |
function abort(text) { | |
Module.print(text + ':\n' + (new Error).stack); | |
ABORT = true; | |
throw "Assertion: " + text; | |
} | |
function assert(condition, text) { | |
if (!condition) { | |
abort('Assertion failed: ' + text); | |
} | |
} | |
var globalScope = this; | |
// C calling interface. A convenient way to call C functions (in C files, or | |
// defined with extern "C"). | |
// | |
// Note: LLVM optimizations can inline and remove functions, after which you will not be | |
// able to call them. Adding | |
// | |
// __attribute__((used)) | |
// | |
// to the function definition will prevent that. | |
// | |
// Note: Closure optimizations will minify function names, making | |
// functions no longer callable. If you run closure (on by default | |
// in -O2 and above), you should export the functions you will call | |
// by calling emcc with something like | |
// | |
// -s EXPORTED_FUNCTIONS='["_func1","_func2"]' | |
// | |
// @param ident The name of the C function (note that C++ functions will be name-mangled - use extern "C") | |
// @param returnType The return type of the function, one of the JS types 'number', 'string' or 'array' (use 'number' for any C pointer, and | |
// 'array' for JavaScript arrays and typed arrays). | |
// @param argTypes An array of the types of arguments for the function (if there are no arguments, this can be ommitted). Types are as in returnType, | |
// except that 'array' is not possible (there is no way for us to know the length of the array) | |
// @param args An array of the arguments to the function, as native JS values (as in returnType) | |
// Note that string arguments will be stored on the stack (the JS string will become a C string on the stack). | |
// @return The return value, as a native JS value (as in returnType) | |
function ccall(ident, returnType, argTypes, args) { | |
var stack = 0; | |
function toC(value, type) { | |
if (type == 'string') { | |
if (value === null || value === undefined || value === 0) return 0; // null string | |
if (!stack) stack = Runtime.stackSave(); | |
var ret = Runtime.stackAlloc(value.length+1); | |
writeStringToMemory(value, ret); | |
return ret; | |
} else if (type == 'array') { | |
if (!stack) stack = Runtime.stackSave(); | |
var ret = Runtime.stackAlloc(value.length); | |
writeArrayToMemory(value, ret); | |
return ret; | |
} | |
return value; | |
} | |
function fromC(value, type) { | |
if (type == 'string') { | |
return Pointer_stringify(value); | |
} | |
assert(type != 'array'); | |
return value; | |
} | |
try { | |
var func = eval('_' + ident); | |
} catch(e) { | |
try { | |
func = globalScope['Module']['_' + ident]; // closure exported function | |
} catch(e) {} | |
} | |
assert(func, 'Cannot call unknown function ' + ident + ' (perhaps LLVM optimizations or closure removed it?)'); | |
var i = 0; | |
var cArgs = args ? args.map(function(arg) { | |
return toC(arg, argTypes[i++]); | |
}) : []; | |
var ret = fromC(func.apply(null, cArgs), returnType); | |
if (stack) Runtime.stackRestore(stack); | |
return ret; | |
} | |
Module["ccall"] = ccall; | |
// Returns a native JS wrapper for a C function. This is similar to ccall, but | |
// returns a function you can call repeatedly in a normal way. For example: | |
// | |
// var my_function = cwrap('my_c_function', 'number', ['number', 'number']); | |
// alert(my_function(5, 22)); | |
// alert(my_function(99, 12)); | |
// | |
function cwrap(ident, returnType, argTypes) { | |
// TODO: optimize this, eval the whole function once instead of going through ccall each time | |
return function() { | |
return ccall(ident, returnType, argTypes, Array.prototype.slice.call(arguments)); | |
} | |
} | |
Module["cwrap"] = cwrap; | |
// Sets a value in memory in a dynamic way at run-time. Uses the | |
// type data. This is the same as makeSetValue, except that | |
// makeSetValue is done at compile-time and generates the needed | |
// code then, whereas this function picks the right code at | |
// run-time. | |
// Note that setValue and getValue only do *aligned* writes and reads! | |
// Note that ccall uses JS types as for defining types, while setValue and | |
// getValue need LLVM types ('i8', 'i32') - this is a lower-level operation | |
function setValue(ptr, value, type, noSafe) { | |
type = type || 'i8'; | |
if (type[type.length-1] === '*') type = 'i32'; // pointers are 32-bit | |
switch(type) { | |
case 'i1': HEAP8[(ptr)]=value; break; | |
case 'i8': HEAP8[(ptr)]=value; break; | |
case 'i16': HEAP16[((ptr)>>1)]=value; break; | |
case 'i32': HEAP32[((ptr)>>2)]=value; break; | |
case 'i64': HEAP32[((ptr)>>2)]=value; break; | |
case 'float': HEAPF32[((ptr)>>2)]=value; break; | |
case 'double': (tempDoubleF64[0]=value,HEAP32[((ptr)>>2)]=tempDoubleI32[0],HEAP32[(((ptr)+(4))>>2)]=tempDoubleI32[1]); break; | |
default: abort('invalid type for setValue: ' + type); | |
} | |
} | |
Module['setValue'] = setValue; | |
// Parallel to setValue. | |
function getValue(ptr, type, noSafe) { | |
type = type || 'i8'; | |
if (type[type.length-1] === '*') type = 'i32'; // pointers are 32-bit | |
switch(type) { | |
case 'i1': return HEAP8[(ptr)]; | |
case 'i8': return HEAP8[(ptr)]; | |
case 'i16': return HEAP16[((ptr)>>1)]; | |
case 'i32': return HEAP32[((ptr)>>2)]; | |
case 'i64': return HEAP32[((ptr)>>2)]; | |
case 'float': return HEAPF32[((ptr)>>2)]; | |
case 'double': return (tempDoubleI32[0]=HEAP32[((ptr)>>2)],tempDoubleI32[1]=HEAP32[(((ptr)+(4))>>2)],tempDoubleF64[0]); | |
default: abort('invalid type for setValue: ' + type); | |
} | |
return null; | |
} | |
Module['getValue'] = getValue; | |
// Allocates memory for some data and initializes it properly. | |
var ALLOC_NORMAL = 0; // Tries to use _malloc() | |
var ALLOC_STACK = 1; // Lives for the duration of the current function call | |
var ALLOC_STATIC = 2; // Cannot be freed | |
Module['ALLOC_NORMAL'] = ALLOC_NORMAL; | |
Module['ALLOC_STACK'] = ALLOC_STACK; | |
Module['ALLOC_STATIC'] = ALLOC_STATIC; | |
function allocate(slab, types, allocator) { | |
var zeroinit, size; | |
if (typeof slab === 'number') { | |
zeroinit = true; | |
size = slab; | |
} else { | |
zeroinit = false; | |
size = slab.length; | |
} | |
var singleType = typeof types === 'string' ? types : null; | |
var ret = [_malloc, Runtime.stackAlloc, Runtime.staticAlloc][allocator === undefined ? ALLOC_STATIC : allocator](Math.max(size, singleType ? 1 : types.length)); | |
if (zeroinit) { | |
_memset(ret, 0, size); | |
return ret; | |
} | |
var i = 0, type; | |
while (i < size) { | |
var curr = slab[i]; | |
if (typeof curr === 'function') { | |
curr = Runtime.getFunctionIndex(curr); | |
} | |
type = singleType || types[i]; | |
if (type === 0) { | |
i++; | |
continue; | |
} | |
assert(type, 'Must know what type to store in allocate!'); | |
if (type == 'i64') type = 'i32'; // special case: we have one i32 here, and one i32 later | |
setValue(ret+i, curr, type); | |
i += Runtime.getNativeTypeSize(type); | |
} | |
return ret; | |
} | |
Module['allocate'] = allocate; | |
function Pointer_stringify(ptr, /* optional */ length) { | |
var nullTerminated = typeof(length) == "undefined"; | |
var ret = ""; | |
var i = 0; | |
var t; | |
var nullByte = String.fromCharCode(0); | |
while (1) { | |
t = String.fromCharCode(HEAPU8[((ptr)+(i))]); | |
if (nullTerminated && t == nullByte) { break; } else {} | |
ret += t; | |
i += 1; | |
if (!nullTerminated && i == length) { break; } | |
} | |
return ret; | |
} | |
Module['Pointer_stringify'] = Pointer_stringify; | |
function Array_stringify(array) { | |
var ret = ""; | |
for (var i = 0; i < array.length; i++) { | |
ret += String.fromCharCode(array[i]); | |
} | |
return ret; | |
} | |
Module['Array_stringify'] = Array_stringify; | |
// Memory management | |
var FUNCTION_TABLE; // XXX: In theory the indexes here can be equal to pointers to stacked or malloced memory. Such comparisons should | |
// be false, but can turn out true. We should probably set the top bit to prevent such issues. | |
var PAGE_SIZE = 4096; | |
function alignMemoryPage(x) { | |
return ((x+4095)>>12)<<12; | |
} | |
var HEAP; | |
var HEAP8, HEAPU8, HEAP16, HEAPU16, HEAP32, HEAPU32, HEAPF32, HEAPF64; | |
var STACK_ROOT, STACKTOP, STACK_MAX; | |
var STATICTOP; | |
function enlargeMemory() { | |
// TOTAL_MEMORY is the current size of the actual array, and STATICTOP is the new top. | |
Module.printErr('Warning: Enlarging memory arrays, this is not fast! ' + [STATICTOP, TOTAL_MEMORY]); | |
assert(STATICTOP >= TOTAL_MEMORY); | |
assert(TOTAL_MEMORY > 4); // So the loop below will not be infinite | |
while (TOTAL_MEMORY <= STATICTOP) { // Simple heuristic. Override enlargeMemory() if your program has something more optimal for it | |
TOTAL_MEMORY = alignMemoryPage(2*TOTAL_MEMORY); | |
} | |
var oldHEAP8 = HEAP8; | |
var buffer = new ArrayBuffer(TOTAL_MEMORY); | |
HEAP8 = new Int8Array(buffer); | |
HEAP16 = new Int16Array(buffer); | |
HEAP32 = new Int32Array(buffer); | |
HEAPU8 = new Uint8Array(buffer); | |
HEAPU16 = new Uint16Array(buffer); | |
HEAPU32 = new Uint32Array(buffer); | |
HEAPF32 = new Float32Array(buffer); | |
HEAPF64 = new Float64Array(buffer); | |
HEAP8.set(oldHEAP8); | |
} | |
var TOTAL_STACK = Module['TOTAL_STACK'] || 5242880; | |
var TOTAL_MEMORY = Module['TOTAL_MEMORY'] || 10485760; | |
var FAST_MEMORY = Module['FAST_MEMORY'] || 2097152; | |
// Initialize the runtime's memory | |
// check for full engine support (use string 'subarray' to avoid closure compiler confusion) | |
assert(!!Int32Array && !!Float64Array && !!(new Int32Array(1)['subarray']) && !!(new Int32Array(1)['set']), | |
'Cannot fallback to non-typed array case: Code is too specialized'); | |
var buffer = new ArrayBuffer(TOTAL_MEMORY); | |
HEAP8 = new Int8Array(buffer); | |
HEAP16 = new Int16Array(buffer); | |
HEAP32 = new Int32Array(buffer); | |
HEAPU8 = new Uint8Array(buffer); | |
HEAPU16 = new Uint16Array(buffer); | |
HEAPU32 = new Uint32Array(buffer); | |
HEAPF32 = new Float32Array(buffer); | |
HEAPF64 = new Float64Array(buffer); | |
// Endianness check (note: assumes compiler arch was little-endian) | |
HEAP32[0] = 255; | |
assert(HEAPU8[0] === 255 && HEAPU8[3] === 0, 'Typed arrays 2 must be run on a little-endian system'); | |
var base = intArrayFromString('(null)'); // So printing %s of NULL gives '(null)' | |
// Also this ensures we leave 0 as an invalid address, 'NULL' | |
STATICTOP = base.length; | |
for (var i = 0; i < base.length; i++) { | |
HEAP8[(i)]=base[i] | |
} | |
Module['HEAP'] = HEAP; | |
Module['HEAP8'] = HEAP8; | |
Module['HEAP16'] = HEAP16; | |
Module['HEAP32'] = HEAP32; | |
Module['HEAPU8'] = HEAPU8; | |
Module['HEAPU16'] = HEAPU16; | |
Module['HEAPU32'] = HEAPU32; | |
Module['HEAPF32'] = HEAPF32; | |
Module['HEAPF64'] = HEAPF64; | |
STACK_ROOT = STACKTOP = Runtime.alignMemory(STATICTOP); | |
STACK_MAX = STACK_ROOT + TOTAL_STACK; | |
var tempDoublePtr = Runtime.alignMemory(STACK_MAX, 8); | |
var tempDoubleI8 = HEAP8.subarray(tempDoublePtr); | |
var tempDoubleI32 = HEAP32.subarray(tempDoublePtr >> 2); | |
var tempDoubleF32 = HEAPF32.subarray(tempDoublePtr >> 2); | |
var tempDoubleF64 = HEAPF64.subarray(tempDoublePtr >> 3); | |
function copyTempFloat(ptr) { // functions, because inlining this code is increases code size too much | |
tempDoubleI8[0] = HEAP8[ptr]; | |
tempDoubleI8[1] = HEAP8[ptr+1]; | |
tempDoubleI8[2] = HEAP8[ptr+2]; | |
tempDoubleI8[3] = HEAP8[ptr+3]; | |
} | |
function copyTempDouble(ptr) { | |
tempDoubleI8[0] = HEAP8[ptr]; | |
tempDoubleI8[1] = HEAP8[ptr+1]; | |
tempDoubleI8[2] = HEAP8[ptr+2]; | |
tempDoubleI8[3] = HEAP8[ptr+3]; | |
tempDoubleI8[4] = HEAP8[ptr+4]; | |
tempDoubleI8[5] = HEAP8[ptr+5]; | |
tempDoubleI8[6] = HEAP8[ptr+6]; | |
tempDoubleI8[7] = HEAP8[ptr+7]; | |
} | |
STACK_MAX = tempDoublePtr + 8; | |
STATICTOP = alignMemoryPage(STACK_MAX); | |
function callRuntimeCallbacks(callbacks) { | |
while(callbacks.length > 0) { | |
var callback = callbacks.shift(); | |
var func = callback.func; | |
if (typeof func === 'number') { | |
func = FUNCTION_TABLE[func]; | |
} | |
func(callback.arg === undefined ? null : callback.arg); | |
} | |
} | |
var __ATINIT__ = []; // functions called during startup | |
var __ATMAIN__ = []; // functions called when main() is to be run | |
var __ATEXIT__ = []; // functions called during shutdown | |
function initRuntime() { | |
callRuntimeCallbacks(__ATINIT__); | |
} | |
function preMain() { | |
callRuntimeCallbacks(__ATMAIN__); | |
} | |
function exitRuntime() { | |
callRuntimeCallbacks(__ATEXIT__); | |
// Print summary of correction activity | |
CorrectionsMonitor.print(); | |
} | |
function String_len(ptr) { | |
var i = 0; | |
while (HEAP8[((ptr)+(i))]) i++; // Note: should be |!= 0|, technically. But this helps catch bugs with undefineds | |
return i; | |
} | |
Module['String_len'] = String_len; | |
// Tools | |
// This processes a JS string into a C-line array of numbers, 0-terminated. | |
// For LLVM-originating strings, see parser.js:parseLLVMString function | |
function intArrayFromString(stringy, dontAddNull, length /* optional */) { | |
var ret = []; | |
var t; | |
var i = 0; | |
if (length === undefined) { | |
length = stringy.length; | |
} | |
while (i < length) { | |
var chr = stringy.charCodeAt(i); | |
if (chr > 0xFF) { | |
assert(false, 'Character code ' + chr + ' (' + stringy[i] + ') at offset ' + i + ' not in 0x00-0xFF.'); | |
chr &= 0xFF; | |
} | |
ret.push(chr); | |
i = i + 1; | |
} | |
if (!dontAddNull) { | |
ret.push(0); | |
} | |
return ret; | |
} | |
Module['intArrayFromString'] = intArrayFromString; | |
function intArrayToString(array) { | |
var ret = []; | |
for (var i = 0; i < array.length; i++) { | |
var chr = array[i]; | |
if (chr > 0xFF) { | |
assert(false, 'Character code ' + chr + ' (' + String.fromCharCode(chr) + ') at offset ' + i + ' not in 0x00-0xFF.'); | |
chr &= 0xFF; | |
} | |
ret.push(String.fromCharCode(chr)); | |
} | |
return ret.join(''); | |
} | |
Module['intArrayToString'] = intArrayToString; | |
// Write a Javascript array to somewhere in the heap | |
function writeStringToMemory(string, buffer, dontAddNull) { | |
var i = 0; | |
while (i < string.length) { | |
var chr = string.charCodeAt(i); | |
if (chr > 0xFF) { | |
assert(false, 'Character code ' + chr + ' (' + string[i] + ') at offset ' + i + ' not in 0x00-0xFF.'); | |
chr &= 0xFF; | |
} | |
HEAP8[((buffer)+(i))]=chr | |
i = i + 1; | |
} | |
if (!dontAddNull) { | |
HEAP8[((buffer)+(i))]=0 | |
} | |
} | |
Module['writeStringToMemory'] = writeStringToMemory; | |
function writeArrayToMemory(array, buffer) { | |
for (var i = 0; i < array.length; i++) { | |
HEAP8[((buffer)+(i))]=array[i]; | |
} | |
} | |
Module['writeArrayToMemory'] = writeArrayToMemory; | |
var STRING_TABLE = []; | |
function unSign(value, bits, ignore, sig) { | |
if (value >= 0) { | |
return value; | |
} | |
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; | |
// TODO: clean up previous line | |
} | |
function reSign(value, bits, ignore, sig) { | |
if (value <= 0) { | |
return value; | |
} | |
var half = bits <= 32 ? Math.abs(1 << (bits-1)) // abs is needed if bits == 32 | |
: Math.pow(2, bits-1); | |
if (value >= half && (bits <= 32 || value > half)) { // for huge values, we can hit the precision limit and always get true here. so don't do that | |
// but, in general there is no perfect solution here. With 64-bit ints, we get rounding and errors | |
// TODO: In i64 mode 1, resign the two parts separately and safely | |
value = -2*half + value; // Cannot bitshift half, as it may be at the limit of the bits JS uses in bitshifts | |
} | |
return value; | |
} | |
// A counter of dependencies for calling run(). If we need to | |
// do asynchronous work before running, increment this and | |
// decrement it. Incrementing must happen in a place like | |
// PRE_RUN_ADDITIONS (used by emcc to add file preloading). | |
// Note that you can add dependencies in preRun, even though | |
// it happens right before run - run will be postponed until | |
// the dependencies are met. | |
var runDependencies = 0; | |
function addRunDependency() { | |
runDependencies++; | |
if (Module['monitorRunDependencies']) { | |
Module['monitorRunDependencies'](runDependencies); | |
} | |
} | |
Module['addRunDependency'] = addRunDependency; | |
function removeRunDependency() { | |
runDependencies--; | |
if (Module['monitorRunDependencies']) { | |
Module['monitorRunDependencies'](runDependencies); | |
} | |
if (runDependencies == 0) run(); | |
} | |
Module['removeRunDependency'] = removeRunDependency; | |
// === Body === | |
function _sfT_info($Base_Arg, $Sp_Arg, $Hp_Arg, $R1_Arg$0, $R1_Arg$1, $R2_Arg$0, $R2_Arg$1, $R3_Arg$0, $R3_Arg$1, $R4_Arg$0, $R4_Arg$1, $R5_Arg$0, $R5_Arg$1, $R6_Arg$0, $R6_Arg$1, $SpLim_Arg$0, $SpLim_Arg$1, $F1_Arg, $F2_Arg, $F3_Arg, $F4_Arg, $D1_Arg, $D2_Arg) { | |
var __stackBase__ = STACKTOP; assert(STACKTOP % 4 == 0, "Stack is unaligned"); assert(STACKTOP < STACK_MAX, "Ran out of stack"); | |
var __label__; | |
__label__ = 2; | |
while(1) switch(__label__) { | |
case 2: | |
var $Base_Var; | |
$Base_Var=$Base_Arg; | |
var $Sp_Var; | |
$Sp_Var=$Sp_Arg; | |
var $Hp_Var; | |
$Hp_Var=$Hp_Arg; | |
var $R1_Var=STACKTOP;STACKTOP += 8;assert(STACKTOP < STACK_ROOT + STACK_MAX, "Ran out of stack"); | |
var $st$7$0=(($R1_Var)|0); | |
HEAP32[(($st$7$0)>>2)]=$R1_Arg$0; | |
var $st$7$1=(($R1_Var+4)|0); | |
HEAP32[(($st$7$1)>>2)]=$R1_Arg$1; | |
var $R2_Var=STACKTOP;STACKTOP += 8;assert(STACKTOP < STACK_ROOT + STACK_MAX, "Ran out of stack"); | |
var $st$12$0=(($R2_Var)|0); | |
HEAP32[(($st$12$0)>>2)]=$R2_Arg$0; | |
var $st$12$1=(($R2_Var+4)|0); | |
HEAP32[(($st$12$1)>>2)]=$R2_Arg$1; | |
var $R3_Var=STACKTOP;STACKTOP += 8;assert(STACKTOP < STACK_ROOT + STACK_MAX, "Ran out of stack"); | |
var $st$17$0=(($R3_Var)|0); | |
HEAP32[(($st$17$0)>>2)]=$R3_Arg$0; | |
var $st$17$1=(($R3_Var+4)|0); | |
HEAP32[(($st$17$1)>>2)]=$R3_Arg$1; | |
var $R4_Var=STACKTOP;STACKTOP += 8;assert(STACKTOP < STACK_ROOT + STACK_MAX, "Ran out of stack"); | |
var $st$22$0=(($R4_Var)|0); | |
HEAP32[(($st$22$0)>>2)]=$R4_Arg$0; | |
var $st$22$1=(($R4_Var+4)|0); | |
HEAP32[(($st$22$1)>>2)]=$R4_Arg$1; | |
var $R5_Var=STACKTOP;STACKTOP += 8;assert(STACKTOP < STACK_ROOT + STACK_MAX, "Ran out of stack"); | |
var $st$27$0=(($R5_Var)|0); | |
HEAP32[(($st$27$0)>>2)]=$R5_Arg$0; | |
var $st$27$1=(($R5_Var+4)|0); | |
HEAP32[(($st$27$1)>>2)]=$R5_Arg$1; | |
var $R6_Var=STACKTOP;STACKTOP += 8;assert(STACKTOP < STACK_ROOT + STACK_MAX, "Ran out of stack"); | |
var $st$32$0=(($R6_Var)|0); | |
HEAP32[(($st$32$0)>>2)]=$R6_Arg$0; | |
var $st$32$1=(($R6_Var+4)|0); | |
HEAP32[(($st$32$1)>>2)]=$R6_Arg$1; | |
var $SpLim_Var=STACKTOP;STACKTOP += 8;assert(STACKTOP < STACK_ROOT + STACK_MAX, "Ran out of stack"); | |
var $st$37$0=(($SpLim_Var)|0); | |
HEAP32[(($st$37$0)>>2)]=$SpLim_Arg$0; | |
var $st$37$1=(($SpLim_Var+4)|0); | |
HEAP32[(($st$37$1)>>2)]=$SpLim_Arg$1; | |
var $F1_Var; | |
$F1_Var=$F1_Arg; | |
var $F2_Var; | |
$F2_Var=$F2_Arg; | |
var $F3_Var; | |
$F3_Var=$F3_Arg; | |
var $F4_Var; | |
$F4_Var=$F4_Arg; | |
var $D1_Var; | |
$D1_Var=$D1_Arg; | |
var $D2_Var; | |
$D2_Var=$D2_Arg; | |
var $lcgC=STACKTOP;STACKTOP += 8;assert(STACKTOP < STACK_ROOT + STACK_MAX, "Ran out of stack"); | |
var $lnhV=$Sp_Var; | |
var $lnhW=((($lnhV)-(16))|0); | |
var $lnhX$0=$lnhW; | |
var $lnhX$1=0; | |
var $st$58$0=(($SpLim_Var)|0); | |
var $lnhY$0=HEAP32[(($st$58$0)>>2)]; | |
var $st$58$1=(($SpLim_Var+4)|0); | |
var $lnhY$1=HEAP32[(($st$58$1)>>2)]; | |
var $lnhZ=($lnhX$1>>>0) < ($lnhY$1>>>0) || (($lnhX$1>>>0) == ($lnhY$1>>>0) && ($lnhX$0>>>0) < ($lnhY$0>>>0)); | |
if ($lnhZ) { __label__ = 6; break; } else { __label__ = 3; break; } | |
case 3: | |
var $lni3=$Hp_Var; | |
var $lni4=(($lni3+16)|0); | |
var $lni5$0=$lni4; | |
var $lni5$1=0; | |
var $lni6=$lni5; | |
$Hp_Var=$lni6; | |
var $lni7=$Hp_Var; | |
var $lni8$0=$lni7; | |
var $lni8$1=0; | |
var $lni9=$Base_Var; | |
var $lnia=(($lni9+144)|0); | |
var $lnib=$lnia; | |
var $st$12$0=(($lnib)|0); | |
var $lnic$0=HEAP32[(($st$12$0)>>2)]; | |
var $st$12$1=(($lnib+4)|0); | |
var $lnic$1=HEAP32[(($st$12$1)>>2)]; | |
var $lnid=($lni8$1>>>0) > ($lnic$1>>>0) || (($lni8$1>>>0) == ($lnic$1>>>0) && ($lni8$0>>>0) > ($lnic$0>>>0)); | |
if ($lnid) { __label__ = 7; break; } else { __label__ = 4; break; } | |
case 4: | |
var $lnih$0=_stg_CAF_BLACKHOLE_info; | |
var $lnih$1=0; | |
var $lnii=$Hp_Var; | |
var $lnij=((($lnii)-(8))|0); | |
var $st$4$0=(($lnij)|0); | |
HEAP32[(($st$4$0)>>2)]=$lnih$0; | |
var $st$4$1=(($lnij+4)|0); | |
HEAP32[(($st$4$1)>>2)]=$lnih$1; | |
var $lnik=$Base_Var; | |
var $lnil=(($lnik+160)|0); | |
var $lnim=$lnil; | |
var $st$11$0=(($lnim)|0); | |
var $lnin$0=HEAP32[(($st$11$0)>>2)]; | |
var $st$11$1=(($lnim+4)|0); | |
var $lnin$1=HEAP32[(($st$11$1)>>2)]; | |
var $lnio=$Hp_Var; | |
var $lnip=(($lnio)|0); | |
var $st$17$0=(($lnip)|0); | |
HEAP32[(($st$17$0)>>2)]=$lnin$0; | |
var $st$17$1=(($lnip+4)|0); | |
HEAP32[(($st$17$1)>>2)]=$lnin$1; | |
var $lniq=$Base_Var; | |
var $lnir$0=$lniq; | |
var $lnir$1=0; | |
var $lnis=$lnir; | |
var $st$25$0=(($R1_Var)|0); | |
var $lnit$0=HEAP32[(($st$25$0)>>2)]; | |
var $st$25$1=(($R1_Var+4)|0); | |
var $lnit$1=HEAP32[(($st$25$1)>>2)]; | |
var $lniu=$lnit; | |
var $lniv=$Hp_Var; | |
var $lniw=((($lniv)-(8))|0); | |
var $lnix$0=$lniw; | |
var $lnix$1=0; | |
var $lniy=$lnix; | |
var $st$35$0=(($R3_Var)|0); | |
HEAP32[(($st$35$0)>>2)]=undef$0; | |
var $st$35$1=(($R3_Var+4)|0); | |
HEAP32[(($st$35$1)>>2)]=undef$1; | |
var $st$39$0=(($R4_Var)|0); | |
HEAP32[(($st$39$0)>>2)]=undef$0; | |
var $st$39$1=(($R4_Var+4)|0); | |
HEAP32[(($st$39$1)>>2)]=undef$1; | |
var $st$43$0=(($R5_Var)|0); | |
HEAP32[(($st$43$0)>>2)]=undef$0; | |
var $st$43$1=(($R5_Var+4)|0); | |
HEAP32[(($st$43$1)>>2)]=undef$1; | |
var $st$47$0=(($R6_Var)|0); | |
HEAP32[(($st$47$0)>>2)]=undef$0; | |
var $st$47$1=(($R6_Var+4)|0); | |
HEAP32[(($st$47$1)>>2)]=undef$1; | |
$F1_Var=undef; | |
$F2_Var=undef; | |
$F3_Var=undef; | |
$F4_Var=undef; | |
$D1_Var=undef; | |
$D2_Var=undef; | |
var $lniz=_newCAF($lnis, $lniu, $lniy); | |
var $lniz$0=$lniz[0]; | |
var $lniz$1=$lniz[1]; | |
var $st$60$0=(($lcgC)|0); | |
HEAP32[(($st$60$0)>>2)]=$lniz$0; | |
var $st$60$1=(($lcgC+4)|0); | |
HEAP32[(($st$60$1)>>2)]=$lniz$1; | |
var $st$64$0=(($lcgC)|0); | |
var $lniA$0=HEAP32[(($st$64$0)>>2)]; | |
var $st$64$1=(($lcgC+4)|0); | |
var $lniA$1=HEAP32[(($st$64$1)>>2)]; | |
var $$emscripten$temp$0$0=0; | |
var $$emscripten$temp$0$1=0; | |
var $lniB=$lniA$0 == $$emscripten$temp$0$0 && $lniA$1 == $$emscripten$temp$0$1; | |
if ($lniB) { __label__ = 8; break; } else { __label__ = 5; break; } | |
case 5: | |
__label__ = 9; break; | |
case 6: | |
var $lniF=$Base_Var; | |
var $lniG=((($lniF)-(16))|0); | |
var $lniH=$lniG; | |
var $st$3$0=(($lniH)|0); | |
var $lniI$0=HEAP32[(($st$3$0)>>2)]; | |
var $st$3$1=(($lniH+4)|0); | |
var $lniI$1=HEAP32[(($st$3$1)>>2)]; | |
var $lniJ=$lniI; | |
var $lniK=$Base_Var; | |
var $lniL=$Sp_Var; | |
var $lniM=$Hp_Var; | |
var $st$11$0=(($R1_Var)|0); | |
var $lniN$0=HEAP32[(($st$11$0)>>2)]; | |
var $st$11$1=(($R1_Var+4)|0); | |
var $lniN$1=HEAP32[(($st$11$1)>>2)]; | |
var $st$15$0=(($R2_Var)|0); | |
var $lniO$0=HEAP32[(($st$15$0)>>2)]; | |
var $st$15$1=(($R2_Var+4)|0); | |
var $lniO$1=HEAP32[(($st$15$1)>>2)]; | |
var $st$19$0=(($R3_Var)|0); | |
var $lniP$0=HEAP32[(($st$19$0)>>2)]; | |
var $st$19$1=(($R3_Var+4)|0); | |
var $lniP$1=HEAP32[(($st$19$1)>>2)]; | |
var $st$23$0=(($R4_Var)|0); | |
var $lniQ$0=HEAP32[(($st$23$0)>>2)]; | |
var $st$23$1=(($R4_Var+4)|0); | |
var $lniQ$1=HEAP32[(($st$23$1)>>2)]; | |
var $st$27$0=(($R5_Var)|0); | |
var $lniR$0=HEAP32[(($st$27$0)>>2)]; | |
var $st$27$1=(($R5_Var+4)|0); | |
var $lniR$1=HEAP32[(($st$27$1)>>2)]; | |
var $st$31$0=(($R6_Var)|0); | |
var $lniS$0=HEAP32[(($st$31$0)>>2)]; | |
var $st$31$1=(($R6_Var+4)|0); | |
var $lniS$1=HEAP32[(($st$31$1)>>2)]; | |
var $st$35$0=(($SpLim_Var)|0); | |
var $lniT$0=HEAP32[(($st$35$0)>>2)]; | |
var $st$35$1=(($SpLim_Var+4)|0); | |
var $lniT$1=HEAP32[(($st$35$1)>>2)]; | |
var $lniU=$F1_Var; | |
var $lniV=$F2_Var; | |
var $lniW=$F3_Var; | |
var $lniX=$F4_Var; | |
var $lniY=$D1_Var; | |
var $lniZ=$D2_Var; | |
FUNCTION_TABLE[$lniJ]($lniK, $lniL, $lniM, $lniN$0, $lniN$1, $lniO$0, $lniO$1, $lniP$0, $lniP$1, $lniQ$0, $lniQ$1, $lniR$0, $lniR$1, $lniS$0, $lniS$1, $lniT$0, $lniT$1, $lniU, $lniV, $lniW, $lniX, $lniY, $lniZ); | |
STACKTOP = __stackBase__; | |
return; | |
case 7: | |
var $lnj0=$Base_Var; | |
var $lnj1=(($lnj0+192)|0); | |
var $$emscripten$temp$1$0=16; | |
var $$emscripten$temp$1$1=0; | |
var $st$4$0=(($lnj1)|0); | |
HEAP32[(($st$4$0)>>2)]=$$emscripten$temp$1$0; | |
var $st$4$1=(($lnj1+4)|0); | |
HEAP32[(($st$4$1)>>2)]=$$emscripten$temp$1$1; | |
__label__ = 6; break; | |
case 8: | |
var $st$0$0=(($R1_Var)|0); | |
var $lnj2$0=HEAP32[(($st$0$0)>>2)]; | |
var $st$0$1=(($R1_Var+4)|0); | |
var $lnj2$1=HEAP32[(($st$0$1)>>2)]; | |
var $lnj3=$lnj2; | |
var $st$5$0=(($lnj3)|0); | |
var $lnj4$0=HEAP32[(($st$5$0)>>2)]; | |
var $st$5$1=(($lnj3+4)|0); | |
var $lnj4$1=HEAP32[(($st$5$1)>>2)]; | |
var $lnj5=$lnj4; | |
var $lnj6=$Base_Var; | |
var $lnj7=$Sp_Var; | |
var $lnj8=$Hp_Var; | |
var $st$13$0=(($R1_Var)|0); | |
var $lnj9$0=HEAP32[(($st$13$0)>>2)]; | |
var $st$13$1=(($R1_Var+4)|0); | |
var $lnj9$1=HEAP32[(($st$13$1)>>2)]; | |
var $st$17$0=(($R2_Var)|0); | |
var $lnja$0=HEAP32[(($st$17$0)>>2)]; | |
var $st$17$1=(($R2_Var+4)|0); | |
var $lnja$1=HEAP32[(($st$17$1)>>2)]; | |
var $st$21$0=(($R3_Var)|0); | |
var $lnjb$0=HEAP32[(($st$21$0)>>2)]; | |
var $st$21$1=(($R3_Var+4)|0); | |
var $lnjb$1=HEAP32[(($st$21$1)>>2)]; | |
var $st$25$0=(($R4_Var)|0); | |
var $lnjc$0=HEAP32[(($st$25$0)>>2)]; | |
var $st$25$1=(($R4_Var+4)|0); | |
var $lnjc$1=HEAP32[(($st$25$1)>>2)]; | |
var $st$29$0=(($R5_Var)|0); | |
var $lnjd$0=HEAP32[(($st$29$0)>>2)]; | |
var $st$29$1=(($R5_Var+4)|0); | |
var $lnjd$1=HEAP32[(($st$29$1)>>2)]; | |
var $st$33$0=(($R6_Var)|0); | |
var $lnje$0=HEAP32[(($st$33$0)>>2)]; | |
var $st$33$1=(($R6_Var+4)|0); | |
var $lnje$1=HEAP32[(($st$33$1)>>2)]; | |
var $st$37$0=(($SpLim_Var)|0); | |
var $lnjf$0=HEAP32[(($st$37$0)>>2)]; | |
var $st$37$1=(($SpLim_Var+4)|0); | |
var $lnjf$1=HEAP32[(($st$37$1)>>2)]; | |
var $lnjg=$F1_Var; | |
var $lnjh=$F2_Var; | |
var $lnji=$F3_Var; | |
var $lnjj=$F4_Var; | |
var $lnjk=$D1_Var; | |
var $lnjl=$D2_Var; | |
FUNCTION_TABLE[$lnj5]($lnj6, $lnj7, $lnj8, $lnj9$0, $lnj9$1, $lnja$0, $lnja$1, $lnjb$0, $lnjb$1, $lnjc$0, $lnjc$1, $lnjd$0, $lnjd$1, $lnje$0, $lnje$1, $lnjf$0, $lnjf$1, $lnjg, $lnjh, $lnji, $lnjj, $lnjk, $lnjl); | |
STACKTOP = __stackBase__; | |
return; | |
case 9: | |
var $lnjm$0=_stg_bh_upd_frame_info; | |
var $lnjm$1=0; | |
var $lnjn=$Sp_Var; | |
var $lnjo=((($lnjn)-(16))|0); | |
var $st$4$0=(($lnjo)|0); | |
HEAP32[(($st$4$0)>>2)]=$lnjm$0; | |
var $st$4$1=(($lnjo+4)|0); | |
HEAP32[(($st$4$1)>>2)]=$lnjm$1; | |
var $lnjp=$Hp_Var; | |
var $lnjq=((($lnjp)-(8))|0); | |
var $lnjr$0=$lnjq; | |
var $lnjr$1=0; | |
var $lnjs=$Sp_Var; | |
var $lnjt=((($lnjs)-(8))|0); | |
var $st$14$0=(($lnjt)|0); | |
HEAP32[(($st$14$0)>>2)]=$lnjr$0; | |
var $st$14$1=(($lnjt+4)|0); | |
HEAP32[(($st$14$1)>>2)]=$lnjr$1; | |
var $lnju$0=_ghczmprim_GHCziCString_unpackCStringzh_closure; | |
var $lnju$1=0; | |
var $st$20$0=(($R1_Var)|0); | |
HEAP32[(($st$20$0)>>2)]=$lnju$0; | |
var $st$20$1=(($R1_Var+4)|0); | |
HEAP32[(($st$20$1)>>2)]=$lnju$1; | |
var $lnjv$0=_cg1_str; | |
var $lnjv$1=0; | |
var $st$26$0=(($R2_Var)|0); | |
HEAP32[(($st$26$0)>>2)]=$lnjv$0; | |
var $st$26$1=(($R2_Var+4)|0); | |
HEAP32[(($st$26$1)>>2)]=$lnjv$1; | |
var $lnjw=$Sp_Var; | |
var $lnjx=((($lnjw)-(16))|0); | |
var $lnjy$0=$lnjx; | |
var $lnjy$1=0; | |
var $lnjz=$lnjy; | |
$Sp_Var=$lnjz; | |
var $lnjA=$Base_Var; | |
var $lnjB=$Sp_Var; | |
var $lnjC=$Hp_Var; | |
var $st$39$0=(($R1_Var)|0); | |
var $lnjD$0=HEAP32[(($st$39$0)>>2)]; | |
var $st$39$1=(($R1_Var+4)|0); | |
var $lnjD$1=HEAP32[(($st$39$1)>>2)]; | |
var $st$43$0=(($R2_Var)|0); | |
var $lnjE$0=HEAP32[(($st$43$0)>>2)]; | |
var $st$43$1=(($R2_Var+4)|0); | |
var $lnjE$1=HEAP32[(($st$43$1)>>2)]; | |
var $st$47$0=(($R3_Var)|0); | |
var $lnjF$0=HEAP32[(($st$47$0)>>2)]; | |
var $st$47$1=(($R3_Var+4)|0); | |
var $lnjF$1=HEAP32[(($st$47$1)>>2)]; | |
var $st$51$0=(($R4_Var)|0); | |
var $lnjG$0=HEAP32[(($st$51$0)>>2)]; | |
var $st$51$1=(($R4_Var+4)|0); | |
var $lnjG$1=HEAP32[(($st$51$1)>>2)]; | |
var $st$55$0=(($R5_Var)|0); | |
var $lnjH$0=HEAP32[(($st$55$0)>>2)]; | |
var $st$55$1=(($R5_Var+4)|0); | |
var $lnjH$1=HEAP32[(($st$55$1)>>2)]; | |
var $st$59$0=(($R6_Var)|0); | |
var $lnjI$0=HEAP32[(($st$59$0)>>2)]; | |
var $st$59$1=(($R6_Var+4)|0); | |
var $lnjI$1=HEAP32[(($st$59$1)>>2)]; | |
var $st$63$0=(($SpLim_Var)|0); | |
var $lnjJ$0=HEAP32[(($st$63$0)>>2)]; | |
var $st$63$1=(($SpLim_Var+4)|0); | |
var $lnjJ$1=HEAP32[(($st$63$1)>>2)]; | |
var $lnjK=$F1_Var; | |
var $lnjL=$F2_Var; | |
var $lnjM=$F3_Var; | |
var $lnjN=$F4_Var; | |
var $lnjO=$D1_Var; | |
var $lnjP=$D2_Var; | |
_stg_ap_n_fast($lnjA, $lnjB, $lnjC, $lnjD$0, $lnjD$1, $lnjE$0, $lnjE$1, $lnjF$0, $lnjF$1, $lnjG$0, $lnjG$1, $lnjH$0, $lnjH$1, $lnjI$0, $lnjI$1, $lnjJ$0, $lnjJ$1, $lnjK, $lnjL, $lnjM, $lnjN, $lnjO, $lnjP); | |
STACKTOP = __stackBase__; | |
return; | |
default: assert(0, "bad label: " + __label__); | |
} | |
} | |
_sfT_info["X"]=1; | |
function _Main_main_info($Base_Arg, $Sp_Arg, $Hp_Arg, $R1_Arg$0, $R1_Arg$1, $R2_Arg$0, $R2_Arg$1, $R3_Arg$0, $R3_Arg$1, $R4_Arg$0, $R4_Arg$1, $R5_Arg$0, $R5_Arg$1, $R6_Arg$0, $R6_Arg$1, $SpLim_Arg$0, $SpLim_Arg$1, $F1_Arg, $F2_Arg, $F3_Arg, $F4_Arg, $D1_Arg, $D2_Arg) { | |
var __stackBase__ = STACKTOP; assert(STACKTOP % 4 == 0, "Stack is unaligned"); assert(STACKTOP < STACK_MAX, "Ran out of stack"); | |
var __label__; | |
__label__ = 2; | |
while(1) switch(__label__) { | |
case 2: | |
var $Base_Var; | |
$Base_Var=$Base_Arg; | |
var $Sp_Var; | |
$Sp_Var=$Sp_Arg; | |
var $Hp_Var; | |
$Hp_Var=$Hp_Arg; | |
var $R1_Var=STACKTOP;STACKTOP += 8;assert(STACKTOP < STACK_ROOT + STACK_MAX, "Ran out of stack"); | |
var $st$7$0=(($R1_Var)|0); | |
HEAP32[(($st$7$0)>>2)]=$R1_Arg$0; | |
var $st$7$1=(($R1_Var+4)|0); | |
HEAP32[(($st$7$1)>>2)]=$R1_Arg$1; | |
var $R2_Var=STACKTOP;STACKTOP += 8;assert(STACKTOP < STACK_ROOT + STACK_MAX, "Ran out of stack"); | |
var $st$12$0=(($R2_Var)|0); | |
HEAP32[(($st$12$0)>>2)]=$R2_Arg$0; | |
var $st$12$1=(($R2_Var+4)|0); | |
HEAP32[(($st$12$1)>>2)]=$R2_Arg$1; | |
var $R3_Var=STACKTOP;STACKTOP += 8;assert(STACKTOP < STACK_ROOT + STACK_MAX, "Ran out of stack"); | |
var $st$17$0=(($R3_Var)|0); | |
HEAP32[(($st$17$0)>>2)]=$R3_Arg$0; | |
var $st$17$1=(($R3_Var+4)|0); | |
HEAP32[(($st$17$1)>>2)]=$R3_Arg$1; | |
var $R4_Var=STACKTOP;STACKTOP += 8;assert(STACKTOP < STACK_ROOT + STACK_MAX, "Ran out of stack"); | |
var $st$22$0=(($R4_Var)|0); | |
HEAP32[(($st$22$0)>>2)]=$R4_Arg$0; | |
var $st$22$1=(($R4_Var+4)|0); | |
HEAP32[(($st$22$1)>>2)]=$R4_Arg$1; | |
var $R5_Var=STACKTOP;STACKTOP += 8;assert(STACKTOP < STACK_ROOT + STACK_MAX, "Ran out of stack"); | |
var $st$27$0=(($R5_Var)|0); | |
HEAP32[(($st$27$0)>>2)]=$R5_Arg$0; | |
var $st$27$1=(($R5_Var+4)|0); | |
HEAP32[(($st$27$1)>>2)]=$R5_Arg$1; | |
var $R6_Var=STACKTOP;STACKTOP += 8;assert(STACKTOP < STACK_ROOT + STACK_MAX, "Ran out of stack"); | |
var $st$32$0=(($R6_Var)|0); | |
HEAP32[(($st$32$0)>>2)]=$R6_Arg$0; | |
var $st$32$1=(($R6_Var+4)|0); | |
HEAP32[(($st$32$1)>>2)]=$R6_Arg$1; | |
var $SpLim_Var=STACKTOP;STACKTOP += 8;assert(STACKTOP < STACK_ROOT + STACK_MAX, "Ran out of stack"); | |
var $st$37$0=(($SpLim_Var)|0); | |
HEAP32[(($st$37$0)>>2)]=$SpLim_Arg$0; | |
var $st$37$1=(($SpLim_Var+4)|0); | |
HEAP32[(($st$37$1)>>2)]=$SpLim_Arg$1; | |
var $F1_Var; | |
$F1_Var=$F1_Arg; | |
var $F2_Var; | |
$F2_Var=$F2_Arg; | |
var $F3_Var; | |
$F3_Var=$F3_Arg; | |
var $F4_Var; | |
$F4_Var=$F4_Arg; | |
var $D1_Var; | |
$D1_Var=$D1_Arg; | |
var $D2_Var; | |
$D2_Var=$D2_Arg; | |
var $lcku=STACKTOP;STACKTOP += 8;assert(STACKTOP < STACK_ROOT + STACK_MAX, "Ran out of stack"); | |
var $lnlQ=$Sp_Var; | |
var $lnlR=((($lnlQ)-(16))|0); | |
var $lnlS$0=$lnlR; | |
var $lnlS$1=0; | |
var $st$58$0=(($SpLim_Var)|0); | |
var $lnlT$0=HEAP32[(($st$58$0)>>2)]; | |
var $st$58$1=(($SpLim_Var+4)|0); | |
var $lnlT$1=HEAP32[(($st$58$1)>>2)]; | |
var $lnlU=($lnlS$1>>>0) < ($lnlT$1>>>0) || (($lnlS$1>>>0) == ($lnlT$1>>>0) && ($lnlS$0>>>0) < ($lnlT$0>>>0)); | |
if ($lnlU) { __label__ = 6; break; } else { __label__ = 3; break; } | |
case 3: | |
var $lnlY=$Hp_Var; | |
var $lnlZ=(($lnlY+16)|0); | |
var $lnm0$0=$lnlZ; | |
var $lnm0$1=0; | |
var $lnm1=$lnm0; | |
$Hp_Var=$lnm1; | |
var $lnm2=$Hp_Var; | |
var $lnm3$0=$lnm2; | |
var $lnm3$1=0; | |
var $lnm4=$Base_Var; | |
var $lnm5=(($lnm4+144)|0); | |
var $lnm6=$lnm5; | |
var $st$12$0=(($lnm6)|0); | |
var $lnm7$0=HEAP32[(($st$12$0)>>2)]; | |
var $st$12$1=(($lnm6+4)|0); | |
var $lnm7$1=HEAP32[(($st$12$1)>>2)]; | |
var $lnm8=($lnm3$1>>>0) > ($lnm7$1>>>0) || (($lnm3$1>>>0) == ($lnm7$1>>>0) && ($lnm3$0>>>0) > ($lnm7$0>>>0)); | |
if ($lnm8) { __label__ = 7; break; } else { __label__ = 4; break; } | |
case 4: | |
var $lnmc$0=_stg_CAF_BLACKHOLE_info; | |
var $lnmc$1=0; | |
var $lnmd=$Hp_Var; | |
var $lnme=((($lnmd)-(8))|0); | |
var $st$4$0=(($lnme)|0); | |
HEAP32[(($st$4$0)>>2)]=$lnmc$0; | |
var $st$4$1=(($lnme+4)|0); | |
HEAP32[(($st$4$1)>>2)]=$lnmc$1; | |
var $lnmf=$Base_Var; | |
var $lnmg=(($lnmf+160)|0); | |
var $lnmh=$lnmg; | |
var $st$11$0=(($lnmh)|0); | |
var $lnmi$0=HEAP32[(($st$11$0)>>2)]; | |
var $st$11$1=(($lnmh+4)|0); | |
var $lnmi$1=HEAP32[(($st$11$1)>>2)]; | |
var $lnmj=$Hp_Var; | |
var $lnmk=(($lnmj)|0); | |
var $st$17$0=(($lnmk)|0); | |
HEAP32[(($st$17$0)>>2)]=$lnmi$0; | |
var $st$17$1=(($lnmk+4)|0); | |
HEAP32[(($st$17$1)>>2)]=$lnmi$1; | |
var $lnml=$Base_Var; | |
var $lnmm$0=$lnml; | |
var $lnmm$1=0; | |
var $lnmn=$lnmm; | |
var $st$25$0=(($R1_Var)|0); | |
var $lnmo$0=HEAP32[(($st$25$0)>>2)]; | |
var $st$25$1=(($R1_Var+4)|0); | |
var $lnmo$1=HEAP32[(($st$25$1)>>2)]; | |
var $lnmp=$lnmo; | |
var $lnmq=$Hp_Var; | |
var $lnmr=((($lnmq)-(8))|0); | |
var $lnms$0=$lnmr; | |
var $lnms$1=0; | |
var $lnmt=$lnms; | |
var $st$35$0=(($R3_Var)|0); | |
HEAP32[(($st$35$0)>>2)]=undef$0; | |
var $st$35$1=(($R3_Var+4)|0); | |
HEAP32[(($st$35$1)>>2)]=undef$1; | |
var $st$39$0=(($R4_Var)|0); | |
HEAP32[(($st$39$0)>>2)]=undef$0; | |
var $st$39$1=(($R4_Var+4)|0); | |
HEAP32[(($st$39$1)>>2)]=undef$1; | |
var $st$43$0=(($R5_Var)|0); | |
HEAP32[(($st$43$0)>>2)]=undef$0; | |
var $st$43$1=(($R5_Var+4)|0); | |
HEAP32[(($st$43$1)>>2)]=undef$1; | |
var $st$47$0=(($R6_Var)|0); | |
HEAP32[(($st$47$0)>>2)]=undef$0; | |
var $st$47$1=(($R6_Var+4)|0); | |
HEAP32[(($st$47$1)>>2)]=undef$1; | |
$F1_Var=undef; | |
$F2_Var=undef; | |
$F3_Var=undef; | |
$F4_Var=undef; | |
$D1_Var=undef; | |
$D2_Var=undef; | |
var $lnmu=_newCAF($lnmn, $lnmp, $lnmt); | |
var $lnmu$0=$lnmu[0]; | |
var $lnmu$1=$lnmu[1]; | |
var $st$60$0=(($lcku)|0); | |
HEAP32[(($st$60$0)>>2)]=$lnmu$0; | |
var $st$60$1=(($lcku+4)|0); | |
HEAP32[(($st$60$1)>>2)]=$lnmu$1; | |
var $st$64$0=(($lcku)|0); | |
var $lnmv$0=HEAP32[(($st$64$0)>>2)]; | |
var $st$64$1=(($lcku+4)|0); | |
var $lnmv$1=HEAP32[(($st$64$1)>>2)]; | |
var $$emscripten$temp$0$0=0; | |
var $$emscripten$temp$0$1=0; | |
var $lnmw=$lnmv$0 == $$emscripten$temp$0$0 && $lnmv$1 == $$emscripten$temp$0$1; | |
if ($lnmw) { __label__ = 8; break; } else { __label__ = 5; break; } | |
case 5: | |
__label__ = 9; break; | |
case 6: | |
var $lnmA=$Base_Var; | |
var $lnmB=((($lnmA)-(16))|0); | |
var $lnmC=$lnmB; | |
var $st$3$0=(($lnmC)|0); | |
var $lnmD$0=HEAP32[(($st$3$0)>>2)]; | |
var $st$3$1=(($lnmC+4)|0); | |
var $lnmD$1=HEAP32[(($st$3$1)>>2)]; | |
var $lnmE=$lnmD; | |
var $lnmF=$Base_Var; | |
var $lnmG=$Sp_Var; | |
var $lnmH=$Hp_Var; | |
var $st$11$0=(($R1_Var)|0); | |
var $lnmI$0=HEAP32[(($st$11$0)>>2)]; | |
var $st$11$1=(($R1_Var+4)|0); | |
var $lnmI$1=HEAP32[(($st$11$1)>>2)]; | |
var $st$15$0=(($R2_Var)|0); | |
var $lnmJ$0=HEAP32[(($st$15$0)>>2)]; | |
var $st$15$1=(($R2_Var+4)|0); | |
var $lnmJ$1=HEAP32[(($st$15$1)>>2)]; | |
var $st$19$0=(($R3_Var)|0); | |
var $lnmK$0=HEAP32[(($st$19$0)>>2)]; | |
var $st$19$1=(($R3_Var+4)|0); | |
var $lnmK$1=HEAP32[(($st$19$1)>>2)]; | |
var $st$23$0=(($R4_Var)|0); | |
var $lnmL$0=HEAP32[(($st$23$0)>>2)]; | |
var $st$23$1=(($R4_Var+4)|0); | |
var $lnmL$1=HEAP32[(($st$23$1)>>2)]; | |
var $st$27$0=(($R5_Var)|0); | |
var $lnmM$0=HEAP32[(($st$27$0)>>2)]; | |
var $st$27$1=(($R5_Var+4)|0); | |
var $lnmM$1=HEAP32[(($st$27$1)>>2)]; | |
var $st$31$0=(($R6_Var)|0); | |
var $lnmN$0=HEAP32[(($st$31$0)>>2)]; | |
var $st$31$1=(($R6_Var+4)|0); | |
var $lnmN$1=HEAP32[(($st$31$1)>>2)]; | |
var $st$35$0=(($SpLim_Var)|0); | |
var $lnmO$0=HEAP32[(($st$35$0)>>2)]; | |
var $st$35$1=(($SpLim_Var+4)|0); | |
var $lnmO$1=HEAP32[(($st$35$1)>>2)]; | |
var $lnmP=$F1_Var; | |
var $lnmQ=$F2_Var; | |
var $lnmR=$F3_Var; | |
var $lnmS=$F4_Var; | |
var $lnmT=$D1_Var; | |
var $lnmU=$D2_Var; | |
FUNCTION_TABLE[$lnmE]($lnmF, $lnmG, $lnmH, $lnmI$0, $lnmI$1, $lnmJ$0, $lnmJ$1, $lnmK$0, $lnmK$1, $lnmL$0, $lnmL$1, $lnmM$0, $lnmM$1, $lnmN$0, $lnmN$1, $lnmO$0, $lnmO$1, $lnmP, $lnmQ, $lnmR, $lnmS, $lnmT, $lnmU); | |
STACKTOP = __stackBase__; | |
return; | |
case 7: | |
var $lnmV=$Base_Var; | |
var $lnmW=(($lnmV+192)|0); | |
var $$emscripten$temp$1$0=16; | |
var $$emscripten$temp$1$1=0; | |
var $st$4$0=(($lnmW)|0); | |
HEAP32[(($st$4$0)>>2)]=$$emscripten$temp$1$0; | |
var $st$4$1=(($lnmW+4)|0); | |
HEAP32[(($st$4$1)>>2)]=$$emscripten$temp$1$1; | |
__label__ = 6; break; | |
case 8: | |
var $st$0$0=(($R1_Var)|0); | |
var $lnmX$0=HEAP32[(($st$0$0)>>2)]; | |
var $st$0$1=(($R1_Var+4)|0); | |
var $lnmX$1=HEAP32[(($st$0$1)>>2)]; | |
var $lnmY=$lnmX; | |
var $st$5$0=(($lnmY)|0); | |
var $lnmZ$0=HEAP32[(($st$5$0)>>2)]; | |
var $st$5$1=(($lnmY+4)|0); | |
var $lnmZ$1=HEAP32[(($st$5$1)>>2)]; | |
var $lnn0=$lnmZ; | |
var $lnn1=$Base_Var; | |
var $lnn2=$Sp_Var; | |
var $lnn3=$Hp_Var; | |
var $st$13$0=(($R1_Var)|0); | |
var $lnn4$0=HEAP32[(($st$13$0)>>2)]; | |
var $st$13$1=(($R1_Var+4)|0); | |
var $lnn4$1=HEAP32[(($st$13$1)>>2)]; | |
var $st$17$0=(($R2_Var)|0); | |
var $lnn5$0=HEAP32[(($st$17$0)>>2)]; | |
var $st$17$1=(($R2_Var+4)|0); | |
var $lnn5$1=HEAP32[(($st$17$1)>>2)]; | |
var $st$21$0=(($R3_Var)|0); | |
var $lnn6$0=HEAP32[(($st$21$0)>>2)]; | |
var $st$21$1=(($R3_Var+4)|0); | |
var $lnn6$1=HEAP32[(($st$21$1)>>2)]; | |
var $st$25$0=(($R4_Var)|0); | |
var $lnn7$0=HEAP32[(($st$25$0)>>2)]; | |
var $st$25$1=(($R4_Var+4)|0); | |
var $lnn7$1=HEAP32[(($st$25$1)>>2)]; | |
var $st$29$0=(($R5_Var)|0); | |
var $lnn8$0=HEAP32[(($st$29$0)>>2)]; | |
var $st$29$1=(($R5_Var+4)|0); | |
var $lnn8$1=HEAP32[(($st$29$1)>>2)]; | |
var $st$33$0=(($R6_Var)|0); | |
var $lnn9$0=HEAP32[(($st$33$0)>>2)]; | |
var $st$33$1=(($R6_Var+4)|0); | |
var $lnn9$1=HEAP32[(($st$33$1)>>2)]; | |
var $st$37$0=(($SpLim_Var)|0); | |
var $lnna$0=HEAP32[(($st$37$0)>>2)]; | |
var $st$37$1=(($SpLim_Var+4)|0); | |
var $lnna$1=HEAP32[(($st$37$1)>>2)]; | |
var $lnnb=$F1_Var; | |
var $lnnc=$F2_Var; | |
var $lnnd=$F3_Var; | |
var $lnne=$F4_Var; | |
var $lnnf=$D1_Var; | |
var $lnng=$D2_Var; | |
FUNCTION_TABLE[$lnn0]($lnn1, $lnn2, $lnn3, $lnn4$0, $lnn4$1, $lnn5$0, $lnn5$1, $lnn6$0, $lnn6$1, $lnn7$0, $lnn7$1, $lnn8$0, $lnn8$1, $lnn9$0, $lnn9$1, $lnna$0, $lnna$1, $lnnb, $lnnc, $lnnd, $lnne, $lnnf, $lnng); | |
STACKTOP = __stackBase__; | |
return; | |
case 9: | |
var $lnnh$0=_stg_bh_upd_frame_info; | |
var $lnnh$1=0; | |
var $lnni=$Sp_Var; | |
var $lnnj=((($lnni)-(16))|0); | |
var $st$4$0=(($lnnj)|0); | |
HEAP32[(($st$4$0)>>2)]=$lnnh$0; | |
var $st$4$1=(($lnnj+4)|0); | |
HEAP32[(($st$4$1)>>2)]=$lnnh$1; | |
var $lnnk=$Hp_Var; | |
var $lnnl=((($lnnk)-(8))|0); | |
var $lnnm$0=$lnnl; | |
var $lnnm$1=0; | |
var $lnnn=$Sp_Var; | |
var $lnno=((($lnnn)-(8))|0); | |
var $st$14$0=(($lnno)|0); | |
HEAP32[(($st$14$0)>>2)]=$lnnm$0; | |
var $st$14$1=(($lnno+4)|0); | |
HEAP32[(($st$14$1)>>2)]=$lnnm$1; | |
var $lnnp$0=_base_GHCziBase_zd_closure; | |
var $lnnp$1=0; | |
var $st$20$0=(($R1_Var)|0); | |
HEAP32[(($st$20$0)>>2)]=$lnnp$0; | |
var $st$20$1=(($R1_Var+4)|0); | |
HEAP32[(($st$20$1)>>2)]=$lnnp$1; | |
var $lnnq$0=_base_SystemziIO_putStrLn_closure; | |
var $lnnq$1=0; | |
var $st$26$0=(($R2_Var)|0); | |
HEAP32[(($st$26$0)>>2)]=$lnnq$0; | |
var $st$26$1=(($R2_Var+4)|0); | |
HEAP32[(($st$26$1)>>2)]=$lnnq$1; | |
var $lnnr$0=_sfT_closure; | |
var $lnnr$1=0; | |
var $st$32$0=(($R3_Var)|0); | |
HEAP32[(($st$32$0)>>2)]=$lnnr$0; | |
var $st$32$1=(($R3_Var+4)|0); | |
HEAP32[(($st$32$1)>>2)]=$lnnr$1; | |
var $lnns=$Sp_Var; | |
var $lnnt=((($lnns)-(16))|0); | |
var $lnnu$0=$lnnt; | |
var $lnnu$1=0; | |
var $lnnv=$lnnu; | |
$Sp_Var=$lnnv; | |
var $lnnw=$Base_Var; | |
var $lnnx=$Sp_Var; | |
var $lnny=$Hp_Var; | |
var $st$45$0=(($R1_Var)|0); | |
var $lnnz$0=HEAP32[(($st$45$0)>>2)]; | |
var $st$45$1=(($R1_Var+4)|0); | |
var $lnnz$1=HEAP32[(($st$45$1)>>2)]; | |
var $st$49$0=(($R2_Var)|0); | |
var $lnnA$0=HEAP32[(($st$49$0)>>2)]; | |
var $st$49$1=(($R2_Var+4)|0); | |
var $lnnA$1=HEAP32[(($st$49$1)>>2)]; | |
var $st$53$0=(($R3_Var)|0); | |
var $lnnB$0=HEAP32[(($st$53$0)>>2)]; | |
var $st$53$1=(($R3_Var+4)|0); | |
var $lnnB$1=HEAP32[(($st$53$1)>>2)]; | |
var $st$57$0=(($R4_Var)|0); | |
var $lnnC$0=HEAP32[(($st$57$0)>>2)]; | |
var $st$57$1=(($R4_Var+4)|0); | |
var $lnnC$1=HEAP32[(($st$57$1)>>2)]; | |
var $st$61$0=(($R5_Var)|0); | |
var $lnnD$0=HEAP32[(($st$61$0)>>2)]; | |
var $st$61$1=(($R5_Var+4)|0); | |
var $lnnD$1=HEAP32[(($st$61$1)>>2)]; | |
var $st$65$0=(($R6_Var)|0); | |
var $lnnE$0=HEAP32[(($st$65$0)>>2)]; | |
var $st$65$1=(($R6_Var+4)|0); | |
var $lnnE$1=HEAP32[(($st$65$1)>>2)]; | |
var $st$69$0=(($SpLim_Var)|0); | |
var $lnnF$0=HEAP32[(($st$69$0)>>2)]; | |
var $st$69$1=(($SpLim_Var+4)|0); | |
var $lnnF$1=HEAP32[(($st$69$1)>>2)]; | |
var $lnnG=$F1_Var; | |
var $lnnH=$F2_Var; | |
var $lnnI=$F3_Var; | |
var $lnnJ=$F4_Var; | |
var $lnnK=$D1_Var; | |
var $lnnL=$D2_Var; | |
_stg_ap_pp_fast($lnnw, $lnnx, $lnny, $lnnz$0, $lnnz$1, $lnnA$0, $lnnA$1, $lnnB$0, $lnnB$1, $lnnC$0, $lnnC$1, $lnnD$0, $lnnD$1, $lnnE$0, $lnnE$1, $lnnF$0, $lnnF$1, $lnnG, $lnnH, $lnnI, $lnnJ, $lnnK, $lnnL); | |
STACKTOP = __stackBase__; | |
return; | |
default: assert(0, "bad label: " + __label__); | |
} | |
} | |
_Main_main_info["X"]=1; | |
function _ZCMain_main_info($Base_Arg, $Sp_Arg, $Hp_Arg, $R1_Arg$0, $R1_Arg$1, $R2_Arg$0, $R2_Arg$1, $R3_Arg$0, $R3_Arg$1, $R4_Arg$0, $R4_Arg$1, $R5_Arg$0, $R5_Arg$1, $R6_Arg$0, $R6_Arg$1, $SpLim_Arg$0, $SpLim_Arg$1, $F1_Arg, $F2_Arg, $F3_Arg, $F4_Arg, $D1_Arg, $D2_Arg) { | |
var __stackBase__ = STACKTOP; assert(STACKTOP % 4 == 0, "Stack is unaligned"); assert(STACKTOP < STACK_MAX, "Ran out of stack"); | |
var __label__; | |
__label__ = 2; | |
while(1) switch(__label__) { | |
case 2: | |
var $Base_Var; | |
$Base_Var=$Base_Arg; | |
var $Sp_Var; | |
$Sp_Var=$Sp_Arg; | |
var $Hp_Var; | |
$Hp_Var=$Hp_Arg; | |
var $R1_Var=STACKTOP;STACKTOP += 8;assert(STACKTOP < STACK_ROOT + STACK_MAX, "Ran out of stack"); | |
var $st$7$0=(($R1_Var)|0); | |
HEAP32[(($st$7$0)>>2)]=$R1_Arg$0; | |
var $st$7$1=(($R1_Var+4)|0); | |
HEAP32[(($st$7$1)>>2)]=$R1_Arg$1; | |
var $R2_Var=STACKTOP;STACKTOP += 8;assert(STACKTOP < STACK_ROOT + STACK_MAX, "Ran out of stack"); | |
var $st$12$0=(($R2_Var)|0); | |
HEAP32[(($st$12$0)>>2)]=$R2_Arg$0; | |
var $st$12$1=(($R2_Var+4)|0); | |
HEAP32[(($st$12$1)>>2)]=$R2_Arg$1; | |
var $R3_Var=STACKTOP;STACKTOP += 8;assert(STACKTOP < STACK_ROOT + STACK_MAX, "Ran out of stack"); | |
var $st$17$0=(($R3_Var)|0); | |
HEAP32[(($st$17$0)>>2)]=$R3_Arg$0; | |
var $st$17$1=(($R3_Var+4)|0); | |
HEAP32[(($st$17$1)>>2)]=$R3_Arg$1; | |
var $R4_Var=STACKTOP;STACKTOP += 8;assert(STACKTOP < STACK_ROOT + STACK_MAX, "Ran out of stack"); | |
var $st$22$0=(($R4_Var)|0); | |
HEAP32[(($st$22$0)>>2)]=$R4_Arg$0; | |
var $st$22$1=(($R4_Var+4)|0); | |
HEAP32[(($st$22$1)>>2)]=$R4_Arg$1; | |
var $R5_Var=STACKTOP;STACKTOP += 8;assert(STACKTOP < STACK_ROOT + STACK_MAX, "Ran out of stack"); | |
var $st$27$0=(($R5_Var)|0); | |
HEAP32[(($st$27$0)>>2)]=$R5_Arg$0; | |
var $st$27$1=(($R5_Var+4)|0); | |
HEAP32[(($st$27$1)>>2)]=$R5_Arg$1; | |
var $R6_Var=STACKTOP;STACKTOP += 8;assert(STACKTOP < STACK_ROOT + STACK_MAX, "Ran out of stack"); | |
var $st$32$0=(($R6_Var)|0); | |
HEAP32[(($st$32$0)>>2)]=$R6_Arg$0; | |
var $st$32$1=(($R6_Var+4)|0); | |
HEAP32[(($st$32$1)>>2)]=$R6_Arg$1; | |
var $SpLim_Var=STACKTOP;STACKTOP += 8;assert(STACKTOP < STACK_ROOT + STACK_MAX, "Ran out of stack"); | |
var $st$37$0=(($SpLim_Var)|0); | |
HEAP32[(($st$37$0)>>2)]=$SpLim_Arg$0; | |
var $st$37$1=(($SpLim_Var+4)|0); | |
HEAP32[(($st$37$1)>>2)]=$SpLim_Arg$1; | |
var $F1_Var; | |
$F1_Var=$F1_Arg; | |
var $F2_Var; | |
$F2_Var=$F2_Arg; | |
var $F3_Var; | |
$F3_Var=$F3_Arg; | |
var $F4_Var; | |
$F4_Var=$F4_Arg; | |
var $D1_Var; | |
$D1_Var=$D1_Arg; | |
var $D2_Var; | |
$D2_Var=$D2_Arg; | |
var $lcoq=STACKTOP;STACKTOP += 8;assert(STACKTOP < STACK_ROOT + STACK_MAX, "Ran out of stack"); | |
var $lnpL=$Sp_Var; | |
var $lnpM=((($lnpL)-(16))|0); | |
var $lnpN$0=$lnpM; | |
var $lnpN$1=0; | |
var $st$58$0=(($SpLim_Var)|0); | |
var $lnpO$0=HEAP32[(($st$58$0)>>2)]; | |
var $st$58$1=(($SpLim_Var+4)|0); | |
var $lnpO$1=HEAP32[(($st$58$1)>>2)]; | |
var $lnpP=($lnpN$1>>>0) < ($lnpO$1>>>0) || (($lnpN$1>>>0) == ($lnpO$1>>>0) && ($lnpN$0>>>0) < ($lnpO$0>>>0)); | |
if ($lnpP) { __label__ = 6; break; } else { __label__ = 3; break; } | |
case 3: | |
var $lnpT=$Hp_Var; | |
var $lnpU=(($lnpT+16)|0); | |
var $lnpV$0=$lnpU; | |
var $lnpV$1=0; | |
var $lnpW=$lnpV; | |
$Hp_Var=$lnpW; | |
var $lnpX=$Hp_Var; | |
var $lnpY$0=$lnpX; | |
var $lnpY$1=0; | |
var $lnpZ=$Base_Var; | |
var $lnq0=(($lnpZ+144)|0); | |
var $lnq1=$lnq0; | |
var $st$12$0=(($lnq1)|0); | |
var $lnq2$0=HEAP32[(($st$12$0)>>2)]; | |
var $st$12$1=(($lnq1+4)|0); | |
var $lnq2$1=HEAP32[(($st$12$1)>>2)]; | |
var $lnq3=($lnpY$1>>>0) > ($lnq2$1>>>0) || (($lnpY$1>>>0) == ($lnq2$1>>>0) && ($lnpY$0>>>0) > ($lnq2$0>>>0)); | |
if ($lnq3) { __label__ = 7; break; } else { __label__ = 4; break; } | |
case 4: | |
var $lnq7$0=_stg_CAF_BLACKHOLE_info; | |
var $lnq7$1=0; | |
var $lnq8=$Hp_Var; | |
var $lnq9=((($lnq8)-(8))|0); | |
var $st$4$0=(($lnq9)|0); | |
HEAP32[(($st$4$0)>>2)]=$lnq7$0; | |
var $st$4$1=(($lnq9+4)|0); | |
HEAP32[(($st$4$1)>>2)]=$lnq7$1; | |
var $lnqa=$Base_Var; | |
var $lnqb=(($lnqa+160)|0); | |
var $lnqc=$lnqb; | |
var $st$11$0=(($lnqc)|0); | |
var $lnqd$0=HEAP32[(($st$11$0)>>2)]; | |
var $st$11$1=(($lnqc+4)|0); | |
var $lnqd$1=HEAP32[(($st$11$1)>>2)]; | |
var $lnqe=$Hp_Var; | |
var $lnqf=(($lnqe)|0); | |
var $st$17$0=(($lnqf)|0); | |
HEAP32[(($st$17$0)>>2)]=$lnqd$0; | |
var $st$17$1=(($lnqf+4)|0); | |
HEAP32[(($st$17$1)>>2)]=$lnqd$1; | |
var $lnqg=$Base_Var; | |
var $lnqh$0=$lnqg; | |
var $lnqh$1=0; | |
var $lnqi=$lnqh; | |
var $st$25$0=(($R1_Var)|0); | |
var $lnqj$0=HEAP32[(($st$25$0)>>2)]; | |
var $st$25$1=(($R1_Var+4)|0); | |
var $lnqj$1=HEAP32[(($st$25$1)>>2)]; | |
var $lnqk=$lnqj; | |
var $lnql=$Hp_Var; | |
var $lnqm=((($lnql)-(8))|0); | |
var $lnqn$0=$lnqm; | |
var $lnqn$1=0; | |
var $lnqo=$lnqn; | |
var $st$35$0=(($R3_Var)|0); | |
HEAP32[(($st$35$0)>>2)]=undef$0; | |
var $st$35$1=(($R3_Var+4)|0); | |
HEAP32[(($st$35$1)>>2)]=undef$1; | |
var $st$39$0=(($R4_Var)|0); | |
HEAP32[(($st$39$0)>>2)]=undef$0; | |
var $st$39$1=(($R4_Var+4)|0); | |
HEAP32[(($st$39$1)>>2)]=undef$1; | |
var $st$43$0=(($R5_Var)|0); | |
HEAP32[(($st$43$0)>>2)]=undef$0; | |
var $st$43$1=(($R5_Var+4)|0); | |
HEAP32[(($st$43$1)>>2)]=undef$1; | |
var $st$47$0=(($R6_Var)|0); | |
HEAP32[(($st$47$0)>>2)]=undef$0; | |
var $st$47$1=(($R6_Var+4)|0); | |
HEAP32[(($st$47$1)>>2)]=undef$1; | |
$F1_Var=undef; | |
$F2_Var=undef; | |
$F3_Var=undef; | |
$F4_Var=undef; | |
$D1_Var=undef; | |
$D2_Var=undef; | |
var $lnqp=_newCAF($lnqi, $lnqk, $lnqo); | |
var $lnqp$0=$lnqp[0]; | |
var $lnqp$1=$lnqp[1]; | |
var $st$60$0=(($lcoq)|0); | |
HEAP32[(($st$60$0)>>2)]=$lnqp$0; | |
var $st$60$1=(($lcoq+4)|0); | |
HEAP32[(($st$60$1)>>2)]=$lnqp$1; | |
var $st$64$0=(($lcoq)|0); | |
var $lnqq$0=HEAP32[(($st$64$0)>>2)]; | |
var $st$64$1=(($lcoq+4)|0); | |
var $lnqq$1=HEAP32[(($st$64$1)>>2)]; | |
var $$emscripten$temp$0$0=0; | |
var $$emscripten$temp$0$1=0; | |
var $lnqr=$lnqq$0 == $$emscripten$temp$0$0 && $lnqq$1 == $$emscripten$temp$0$1; | |
if ($lnqr) { __label__ = 8; break; } else { __label__ = 5; break; } | |
case 5: | |
__label__ = 9; break; | |
case 6: | |
var $lnqv=$Base_Var; | |
var $lnqw=((($lnqv)-(16))|0); | |
var $lnqx=$lnqw; | |
var $st$3$0=(($lnqx)|0); | |
var $lnqy$0=HEAP32[(($st$3$0)>>2)]; | |
var $st$3$1=(($lnqx+4)|0); | |
var $lnqy$1=HEAP32[(($st$3$1)>>2)]; | |
var $lnqz=$lnqy; | |
var $lnqA=$Base_Var; | |
var $lnqB=$Sp_Var; | |
var $lnqC=$Hp_Var; | |
var $st$11$0=(($R1_Var)|0); | |
var $lnqD$0=HEAP32[(($st$11$0)>>2)]; | |
var $st$11$1=(($R1_Var+4)|0); | |
var $lnqD$1=HEAP32[(($st$11$1)>>2)]; | |
var $st$15$0=(($R2_Var)|0); | |
var $lnqE$0=HEAP32[(($st$15$0)>>2)]; | |
var $st$15$1=(($R2_Var+4)|0); | |
var $lnqE$1=HEAP32[(($st$15$1)>>2)]; | |
var $st$19$0=(($R3_Var)|0); | |
var $lnqF$0=HEAP32[(($st$19$0)>>2)]; | |
var $st$19$1=(($R3_Var+4)|0); | |
var $lnqF$1=HEAP32[(($st$19$1)>>2)]; | |
var $st$23$0=(($R4_Var)|0); | |
var $lnqG$0=HEAP32[(($st$23$0)>>2)]; | |
var $st$23$1=(($R4_Var+4)|0); | |
var $lnqG$1=HEAP32[(($st$23$1)>>2)]; | |
var $st$27$0=(($R5_Var)|0); | |
var $lnqH$0=HEAP32[(($st$27$0)>>2)]; | |
var $st$27$1=(($R5_Var+4)|0); | |
var $lnqH$1=HEAP32[(($st$27$1)>>2)]; | |
var $st$31$0=(($R6_Var)|0); | |
var $lnqI$0=HEAP32[(($st$31$0)>>2)]; | |
var $st$31$1=(($R6_Var+4)|0); | |
var $lnqI$1=HEAP32[(($st$31$1)>>2)]; | |
var $st$35$0=(($SpLim_Var)|0); | |
var $lnqJ$0=HEAP32[(($st$35$0)>>2)]; | |
var $st$35$1=(($SpLim_Var+4)|0); | |
var $lnqJ$1=HEAP32[(($st$35$1)>>2)]; | |
var $lnqK=$F1_Var; | |
var $lnqL=$F2_Var; | |
var $lnqM=$F3_Var; | |
var $lnqN=$F4_Var; | |
var $lnqO=$D1_Var; | |
var $lnqP=$D2_Var; | |
FUNCTION_TABLE[$lnqz]($lnqA, $lnqB, $lnqC, $lnqD$0, $lnqD$1, $lnqE$0, $lnqE$1, $lnqF$0, $lnqF$1, $lnqG$0, $lnqG$1, $lnqH$0, $lnqH$1, $lnqI$0, $lnqI$1, $lnqJ$0, $lnqJ$1, $lnqK, $lnqL, $lnqM, $lnqN, $lnqO, $lnqP); | |
STACKTOP = __stackBase__; | |
return; | |
case 7: | |
var $lnqQ=$Base_Var; | |
var $lnqR=(($lnqQ+192)|0); | |
var $$emscripten$temp$1$0=16; | |
var $$emscripten$temp$1$1=0; | |
var $st$4$0=(($lnqR)|0); | |
HEAP32[(($st$4$0)>>2)]=$$emscripten$temp$1$0; | |
var $st$4$1=(($lnqR+4)|0); | |
HEAP32[(($st$4$1)>>2)]=$$emscripten$temp$1$1; | |
__label__ = 6; break; | |
case 8: | |
var $st$0$0=(($R1_Var)|0); | |
var $lnqS$0=HEAP32[(($st$0$0)>>2)]; | |
var $st$0$1=(($R1_Var+4)|0); | |
var $lnqS$1=HEAP32[(($st$0$1)>>2)]; | |
var $lnqT=$lnqS; | |
var $st$5$0=(($lnqT)|0); | |
var $lnqU$0=HEAP32[(($st$5$0)>>2)]; | |
var $st$5$1=(($lnqT+4)|0); | |
var $lnqU$1=HEAP32[(($st$5$1)>>2)]; | |
var $lnqV=$lnqU; | |
var $lnqW=$Base_Var; | |
var $lnqX=$Sp_Var; | |
var $lnqY=$Hp_Var; | |
var $st$13$0=(($R1_Var)|0); | |
var $lnqZ$0=HEAP32[(($st$13$0)>>2)]; | |
var $st$13$1=(($R1_Var+4)|0); | |
var $lnqZ$1=HEAP32[(($st$13$1)>>2)]; | |
var $st$17$0=(($R2_Var)|0); | |
var $lnr0$0=HEAP32[(($st$17$0)>>2)]; | |
var $st$17$1=(($R2_Var+4)|0); | |
var $lnr0$1=HEAP32[(($st$17$1)>>2)]; | |
var $st$21$0=(($R3_Var)|0); | |
var $lnr1$0=HEAP32[(($st$21$0)>>2)]; | |
var $st$21$1=(($R3_Var+4)|0); | |
var $lnr1$1=HEAP32[(($st$21$1)>>2)]; | |
var $st$25$0=(($R4_Var)|0); | |
var $lnr2$0=HEAP32[(($st$25$0)>>2)]; | |
var $st$25$1=(($R4_Var+4)|0); | |
var $lnr2$1=HEAP32[(($st$25$1)>>2)]; | |
var $st$29$0=(($R5_Var)|0); | |
var $lnr3$0=HEAP32[(($st$29$0)>>2)]; | |
var $st$29$1=(($R5_Var+4)|0); | |
var $lnr3$1=HEAP32[(($st$29$1)>>2)]; | |
var $st$33$0=(($R6_Var)|0); | |
var $lnr4$0=HEAP32[(($st$33$0)>>2)]; | |
var $st$33$1=(($R6_Var+4)|0); | |
var $lnr4$1=HEAP32[(($st$33$1)>>2)]; | |
var $st$37$0=(($SpLim_Var)|0); | |
var $lnr5$0=HEAP32[(($st$37$0)>>2)]; | |
var $st$37$1=(($SpLim_Var+4)|0); | |
var $lnr5$1=HEAP32[(($st$37$1)>>2)]; | |
var $lnr6=$F1_Var; | |
var $lnr7=$F2_Var; | |
var $lnr8=$F3_Var; | |
var $lnr9=$F4_Var; | |
var $lnra=$D1_Var; | |
var $lnrb=$D2_Var; | |
FUNCTION_TABLE[$lnqV]($lnqW, $lnqX, $lnqY, $lnqZ$0, $lnqZ$1, $lnr0$0, $lnr0$1, $lnr1$0, $lnr1$1, $lnr2$0, $lnr2$1, $lnr3$0, $lnr3$1, $lnr4$0, $lnr4$1, $lnr5$0, $lnr5$1, $lnr6, $lnr7, $lnr8, $lnr9, $lnra, $lnrb); | |
STACKTOP = __stackBase__; | |
return; | |
case 9: | |
var $lnrc$0=_stg_bh_upd_frame_info; | |
var $lnrc$1=0; | |
var $lnrd=$Sp_Var; | |
var $lnre=((($lnrd)-(16))|0); | |
var $st$4$0=(($lnre)|0); | |
HEAP32[(($st$4$0)>>2)]=$lnrc$0; | |
var $st$4$1=(($lnre+4)|0); | |
HEAP32[(($st$4$1)>>2)]=$lnrc$1; | |
var $lnrf=$Hp_Var; | |
var $lnrg=((($lnrf)-(8))|0); | |
var $lnrh$0=$lnrg; | |
var $lnrh$1=0; | |
var $lnri=$Sp_Var; | |
var $lnrj=((($lnri)-(8))|0); | |
var $st$14$0=(($lnrj)|0); | |
HEAP32[(($st$14$0)>>2)]=$lnrh$0; | |
var $st$14$1=(($lnrj+4)|0); | |
HEAP32[(($st$14$1)>>2)]=$lnrh$1; | |
var $lnrk$0=_base_GHCziTopHandler_runMainIO_closure; | |
var $lnrk$1=0; | |
var $st$20$0=(($R1_Var)|0); | |
HEAP32[(($st$20$0)>>2)]=$lnrk$0; | |
var $st$20$1=(($R1_Var+4)|0); | |
HEAP32[(($st$20$1)>>2)]=$lnrk$1; | |
var $lnrl$0=_Main_main_closure; | |
var $lnrl$1=0; | |
var $st$26$0=(($R2_Var)|0); | |
HEAP32[(($st$26$0)>>2)]=$lnrl$0; | |
var $st$26$1=(($R2_Var+4)|0); | |
HEAP32[(($st$26$1)>>2)]=$lnrl$1; | |
var $lnrm=$Sp_Var; | |
var $lnrn=((($lnrm)-(16))|0); | |
var $lnro$0=$lnrn; | |
var $lnro$1=0; | |
var $lnrp=$lnro; | |
$Sp_Var=$lnrp; | |
var $lnrq=$Base_Var; | |
var $lnrr=$Sp_Var; | |
var $lnrs=$Hp_Var; | |
var $st$39$0=(($R1_Var)|0); | |
var $lnrt$0=HEAP32[(($st$39$0)>>2)]; | |
var $st$39$1=(($R1_Var+4)|0); | |
var $lnrt$1=HEAP32[(($st$39$1)>>2)]; | |
var $st$43$0=(($R2_Var)|0); | |
var $lnru$0=HEAP32[(($st$43$0)>>2)]; | |
var $st$43$1=(($R2_Var+4)|0); | |
var $lnru$1=HEAP32[(($st$43$1)>>2)]; | |
var $st$47$0=(($R3_Var)|0); | |
var $lnrv$0=HEAP32[(($st$47$0)>>2)]; | |
var $st$47$1=(($R3_Var+4)|0); | |
var $lnrv$1=HEAP32[(($st$47$1)>>2)]; | |
var $st$51$0=(($R4_Var)|0); | |
var $lnrw$0=HEAP32[(($st$51$0)>>2)]; | |
var $st$51$1=(($R4_Var+4)|0); | |
var $lnrw$1=HEAP32[(($st$51$1)>>2)]; | |
var $st$55$0=(($R5_Var)|0); | |
var $lnrx$0=HEAP32[(($st$55$0)>>2)]; | |
var $st$55$1=(($R5_Var+4)|0); | |
var $lnrx$1=HEAP32[(($st$55$1)>>2)]; | |
var $st$59$0=(($R6_Var)|0); | |
var $lnry$0=HEAP32[(($st$59$0)>>2)]; | |
var $st$59$1=(($R6_Var+4)|0); | |
var $lnry$1=HEAP32[(($st$59$1)>>2)]; | |
var $st$63$0=(($SpLim_Var)|0); | |
var $lnrz$0=HEAP32[(($st$63$0)>>2)]; | |
var $st$63$1=(($SpLim_Var+4)|0); | |
var $lnrz$1=HEAP32[(($st$63$1)>>2)]; | |
var $lnrA=$F1_Var; | |
var $lnrB=$F2_Var; | |
var $lnrC=$F3_Var; | |
var $lnrD=$F4_Var; | |
var $lnrE=$D1_Var; | |
var $lnrF=$D2_Var; | |
_stg_ap_p_fast($lnrq, $lnrr, $lnrs, $lnrt$0, $lnrt$1, $lnru$0, $lnru$1, $lnrv$0, $lnrv$1, $lnrw$0, $lnrw$1, $lnrx$0, $lnrx$1, $lnry$0, $lnry$1, $lnrz$0, $lnrz$1, $lnrA, $lnrB, $lnrC, $lnrD, $lnrE, $lnrF); | |
STACKTOP = __stackBase__; | |
return; | |
default: assert(0, "bad label: " + __label__); | |
} | |
} | |
_ZCMain_main_info["X"]=1; | |
// Warning: printing of i64 values may be slightly rounded! No deep i64 math used, so precise i64 code not included | |
var i64Math = null; | |
var _newCAF; // stub for _newCAF | |
var _stg_ap_n_fast; // stub for _stg_ap_n_fast | |
var _stg_ap_pp_fast; // stub for _stg_ap_pp_fast | |
var _stg_ap_p_fast; // stub for _stg_ap_p_fast | |
function _memcpy(dest, src, num, align) { | |
assert(num % 1 === 0, 'memcpy given ' + num + ' bytes to copy. Problem with quantum=1 corrections perhaps?'); | |
if (num >= 20 && src % 2 == dest % 2) { | |
// This is unaligned, but quite large, and potentially alignable, so work hard to get to aligned settings | |
if (src % 4 == dest % 4) { | |
var stop = src + num; | |
while (src % 4) { // no need to check for stop, since we have large num | |
HEAP8[dest++] = HEAP8[src++]; | |
} | |
var src4 = src >> 2, dest4 = dest >> 2, stop4 = stop >> 2; | |
while (src4 < stop4) { | |
HEAP32[dest4++] = HEAP32[src4++]; | |
} | |
src = src4 << 2; | |
dest = dest4 << 2; | |
while (src < stop) { | |
HEAP8[dest++] = HEAP8[src++]; | |
} | |
} else { | |
var stop = src + num; | |
if (src % 2) { // no need to check for stop, since we have large num | |
HEAP8[dest++] = HEAP8[src++]; | |
} | |
var src2 = src >> 1, dest2 = dest >> 1, stop2 = stop >> 1; | |
while (src2 < stop2) { | |
HEAP16[dest2++] = HEAP16[src2++]; | |
} | |
src = src2 << 1; | |
dest = dest2 << 1; | |
if (src < stop) { | |
HEAP8[dest++] = HEAP8[src++]; | |
} | |
} | |
} else { | |
while (num--) { | |
HEAP8[dest++] = HEAP8[src++]; | |
} | |
} | |
} | |
function _memset(ptr, value, num, align) { | |
// TODO: make these settings, and in memcpy, {{'s | |
if (num >= 20) { | |
// This is unaligned, but quite large, so work hard to get to aligned settings | |
var stop = ptr + num; | |
while (ptr % 4) { // no need to check for stop, since we have large num | |
HEAP8[ptr++] = value; | |
} | |
if (value < 0) value += 256; // make it unsigned | |
var ptr4 = ptr >> 2, stop4 = stop >> 2, value4 = value | (value << 8) | (value << 16) | (value << 24); | |
while (ptr4 < stop4) { | |
HEAP32[ptr4++] = value4; | |
} | |
ptr = ptr4 << 2; | |
while (ptr < stop) { | |
HEAP8[ptr++] = value; | |
} | |
} else { | |
while (num--) { | |
HEAP8[ptr++] = value; | |
} | |
} | |
} | |
function _malloc(bytes) { | |
/* Over-allocate to make sure it is byte-aligned by 8. | |
* This will leak memory, but this is only the dummy | |
* implementation (replaced by dlmalloc normally) so | |
* not an issue. | |
*/ | |
ptr = Runtime.staticAlloc(bytes + 8); | |
return (ptr+8) & 0xFFFFFFF8; | |
} | |
Module["_malloc"] = _malloc; | |
function _free(){} | |
Module["_free"] = _free; | |
var Browser={mainLoop:{scheduler:null,shouldPause:false,paused:false},pointerLock:false,moduleContextCreatedCallbacks:[],createContext:function (canvas, useWebGL, setInModule) { | |
try { | |
var ctx = canvas.getContext(useWebGL ? 'experimental-webgl' : '2d'); | |
if (!ctx) throw ':('; | |
} catch (e) { | |
Module.print('Could not create canvas - ' + e); | |
return null; | |
} | |
if (useWebGL) { | |
// Set the background of the WebGL canvas to black | |
canvas.style.backgroundColor = "black"; | |
// Warn on context loss | |
canvas.addEventListener('webglcontextlost', function(event) { | |
alert('WebGL context lost. You will need to reload the page.'); | |
}, false); | |
} | |
if (setInModule) { | |
Module.ctx = ctx; | |
Module.useWebGL = useWebGL; | |
Browser.moduleContextCreatedCallbacks.forEach(function(callback) { callback() }); | |
} | |
return ctx; | |
},requestFullScreen:function () { | |
var canvas = Module.canvas; | |
function fullScreenChange() { | |
if (Module['onFullScreen']) Module['onFullScreen'](); | |
if (document['webkitFullScreenElement'] === canvas || | |
document['mozFullScreenElement'] === canvas || | |
document['fullScreenElement'] === canvas) { | |
canvas.requestPointerLock = canvas['requestPointerLock'] || | |
canvas['mozRequestPointerLock'] || | |
canvas['webkitRequestPointerLock']; | |
canvas.requestPointerLock(); | |
} | |
} | |
document.addEventListener('fullscreenchange', fullScreenChange, false); | |
document.addEventListener('mozfullscreenchange', fullScreenChange, false); | |
document.addEventListener('webkitfullscreenchange', fullScreenChange, false); | |
function pointerLockChange() { | |
Browser.pointerLock = document['pointerLockElement'] === canvas || | |
document['mozPointerLockElement'] === canvas || | |
document['webkitPointerLockElement'] === canvas; | |
} | |
document.addEventListener('pointerlockchange', pointerLockChange, false); | |
document.addEventListener('mozpointerlockchange', pointerLockChange, false); | |
document.addEventListener('webkitpointerlockchange', pointerLockChange, false); | |
canvas.requestFullScreen = canvas['requestFullScreen'] || | |
canvas['mozRequestFullScreen'] || | |
(canvas['webkitRequestFullScreen'] ? function() { canvas['webkitRequestFullScreen'](Element['ALLOW_KEYBOARD_INPUT']) } : null); | |
canvas.requestFullScreen(); | |
},requestAnimationFrame:function (func) { | |
if (!window.requestAnimationFrame) { | |
window.requestAnimationFrame = window['requestAnimationFrame'] || | |
window['mozRequestAnimationFrame'] || | |
window['webkitRequestAnimationFrame'] || | |
window['msRequestAnimationFrame'] || | |
window['oRequestAnimationFrame'] || | |
window['setTimeout']; | |
} | |
window.requestAnimationFrame(func); | |
},getMovementX:function (event) { | |
return event['movementX'] || | |
event['mozMovementX'] || | |
event['webkitMovementX'] || | |
0; | |
},getMovementY:function (event) { | |
return event['movementY'] || | |
event['mozMovementY'] || | |
event['webkitMovementY'] || | |
0; | |
},xhrLoad:function (url, onload, onerror) { | |
var xhr = new XMLHttpRequest(); | |
xhr.open('GET', url, true); | |
xhr.responseType = 'arraybuffer'; | |
xhr.onload = function() { | |
if (xhr.status == 200) { | |
onload(xhr.response); | |
} else { | |
onerror(); | |
} | |
}; | |
xhr.onerror = onerror; | |
xhr.send(null); | |
},asyncLoad:function (url, callback) { | |
Browser.xhrLoad(url, function(arrayBuffer) { | |
assert(arrayBuffer, 'Loading data file "' + url + '" failed (no arrayBuffer).'); | |
callback(new Uint8Array(arrayBuffer)); | |
removeRunDependency(); | |
}, function(event) { | |
throw 'Loading data file "' + url + '" failed.'; | |
}); | |
addRunDependency(); | |
}}; | |
Module["requestFullScreen"] = function() { Browser.requestFullScreen() }; | |
// === Auto-generated postamble setup entry stuff === | |
Module.callMain = function callMain(args) { | |
var argc = args.length+1; | |
function pad() { | |
for (var i = 0; i < 4-1; i++) { | |
argv.push(0); | |
} | |
} | |
var argv = [allocate(intArrayFromString("/bin/this.program"), 'i8', ALLOC_STATIC) ]; | |
pad(); | |
for (var i = 0; i < argc-1; i = i + 1) { | |
argv.push(allocate(intArrayFromString(args[i]), 'i8', ALLOC_STATIC)); | |
pad(); | |
} | |
argv.push(0); | |
argv = allocate(argv, 'i32', ALLOC_STATIC); | |
return _main(argc, argv, 0); | |
} | |
var ___stginit_Main; | |
var _sfT_srt; | |
var _ghczmprim_GHCziCString_unpackCStringzh_closure; | |
var _sfT_closure; | |
var _cg1_str; | |
var _Main_main_srt; | |
var _base_GHCziBase_zd_closure; | |
var _base_SystemziIO_putStrLn_closure; | |
var _Main_main_closure; | |
var _ZCMain_main_srt; | |
var _base_GHCziTopHandler_runMainIO_closure; | |
var _ZCMain_main_closure; | |
var _sfT_info_itable; | |
var _stg_CAF_BLACKHOLE_info; | |
var _stg_bh_upd_frame_info; | |
var _Main_main_info_itable; | |
var _ZCMain_main_info_itable; | |
var _llvm_used; | |
___stginit_Main=allocate([], [], ALLOC_STATIC); | |
_sfT_srt=allocate([[, 0, 0, 0, 0, 0, 0, 0], ["i64",0,0,0,"i32",0,0,0], ALLOC_STATIC); | |
_sfT_closure=allocate([[, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], ["i64",0,0,0,"i32",0,0,0,"i64",0,0,0,"i32",0,0,0,"i64",0,0,0,"i32",0,0,0,"i64",0,0,0,"i32",0,0,0], ALLOC_STATIC); | |
_cg1_str=allocate([72, 101, 108, 108, 111, 44, 32, 87, 111, 114, 108, 100, 33, 0], "i8", ALLOC_STATIC); | |
_Main_main_srt=allocate([[, 0, 0, 0, 0, 0, 0, 0, [, 0, 0, 0, 0, 0, 0, 0, [, 0, 0, 0, 0, 0, 0, 0], ["i64",0,0,0,"i32",0,0,0,"i64",0,0,0,"i32",0,0,0,"i64",0,0,0,"i32",0,0,0], ALLOC_STATIC); | |
_Main_main_closure=allocate([[, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], ["i64",0,0,0,"i32",0,0,0,"i64",0,0,0,"i32",0,0,0,"i64",0,0,0,"i32",0,0,0,"i64",0,0,0,"i32",0,0,0], ALLOC_STATIC); | |
_ZCMain_main_srt=allocate([[, 0, 0, 0, 0, 0, 0, 0, [, 0, 0, 0, 0, 0, 0, 0], ["i64",0,0,0,"i32",0,0,0,"i64",0,0,0,"i32",0,0,0], ALLOC_STATIC); | |
_ZCMain_main_closure=allocate([[, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], ["i64",0,0,0,"i32",0,0,0,"i64",0,0,0,"i32",0,0,0,"i64",0,0,0,"i32",0,0,0,"i64",0,0,0,"i32",0,0,0], ALLOC_STATIC); | |
_sfT_info_itable=allocate([0, 0, 0, 0, i, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 0, 0, 0, 1, 0, 0, 0], ["i64",0,0,0,"i32",0,0,0,"i64",0,0,0,"i32",0,0,0,"i64",0,0,0,"i32",0,0,0], ALLOC_STATIC); | |
_Main_main_info_itable=allocate([0, 0, 0, 0, i, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 0, 0, 0, 7, 0, 0, 0], ["i64",0,0,0,"i32",0,0,0,"i64",0,0,0,"i32",0,0,0,"i64",0,0,0,"i32",0,0,0], ALLOC_STATIC); | |
_ZCMain_main_info_itable=allocate([0, 0, 0, 0, i, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 0, 0, 0, 3, 0, 0, 0], ["i64",0,0,0,"i32",0,0,0,"i64",0,0,0,"i32",0,0,0,"i64",0,0,0,"i32",0,0,0], ALLOC_STATIC); | |
_llvm_used=allocate(4, "*", ALLOC_STATIC); | |
HEAP32[(((_sfT_srt)+(4))>>2)]=(; | |
HEAP32[(((_Main_main_srt)+(4))>>2)]=(; | |
HEAP32[(((_Main_main_srt)+(12))>>2)]=(; | |
HEAP32[(((_Main_main_srt)+(20))>>2)]=(; | |
HEAP32[(((_ZCMain_main_srt)+(4))>>2)]=(; | |
HEAP32[(((_ZCMain_main_srt)+(12))>>2)]=(; | |
HEAP32[((_sfT_info_itable)>>2)]=(; | |
HEAP32[((_Main_main_info_itable)>>2)]=(; | |
HEAP32[((_ZCMain_main_info_itable)>>2)]=(; | |
HEAP32[((_llvm_used)>>2)]=_sfT_info_itable; | |
FUNCTION_TABLE = [0,0,_sfT_info,0,_Main_main_info,0,_ZCMain_main_info,0]; Module["FUNCTION_TABLE"] = FUNCTION_TABLE; | |
function run(args) { | |
args = args || Module['arguments']; | |
if (Module['preRun']) { | |
if (typeof Module['preRun'] == 'function') Module['preRun'] = [Module['preRun']]; | |
while (Module['preRun'].length > 0) { | |
Module['preRun'].pop()(); | |
if (runDependencies > 0) { | |
// preRun added a dependency, run will be called later | |
return 0; | |
} | |
} | |
} | |
function doRun() { | |
var ret = 0; | |
if (Module['_main']) { | |
preMain(); | |
ret = Module.callMain(args); | |
if (!Module['noExitRuntime']) { | |
exitRuntime(); | |
} | |
} | |
if (Module['postRun']) { | |
if (typeof Module['postRun'] == 'function') Module['postRun'] = [Module['postRun']]; | |
while (Module['postRun'].length > 0) { | |
Module['postRun'].pop()(); | |
} | |
} | |
return ret; | |
} | |
if (Module['setStatus']) { | |
Module['setStatus']('Running...'); | |
setTimeout(function() { | |
setTimeout(function() { | |
Module['setStatus'](''); | |
}, 1); | |
doRun(); | |
}, 1); | |
return 0; | |
} else { | |
return doRun(); | |
} | |
} | |
Module['run'] = run; | |
// {{PRE_RUN_ADDITIONS}} | |
initRuntime(); | |
if (Module['noInitialRun']) { | |
addRunDependency(); | |
} | |
if (runDependencies == 0) { | |
var ret = run(); | |
} | |
// {{POST_RUN_ADDITIONS}} | |
// {{MODULE_ADDITIONS}} | |
// EMSCRIPTEN_GENERATED_FUNCTIONS: ["_sfT_info","_Main_main_info","_ZCMain_main_info"] |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment