blob: 7600f61f11820158c76efe8473dd8ee4cfa3368f [file] [log] [blame]
// export friendly API methods
function preserveStack(func) {
try {
var stack = Runtime.stackSave();
return func();
} finally {
Runtime.stackRestore(stack);
}
}
function strToStack(str) {
if (!str) return 0;
return allocate(intArrayFromString(str), 'i8', ALLOC_STACK);
}
function i32sToStack(i32s) {
var ret = Runtime.stackAlloc(i32s.length << 2);
for (var i = 0; i < i32s.length; i++) {
HEAP32[ret + (i << 2) >> 2] = i32s[i];
}
return ret;
}
// Types
Module['none'] = Module['_BinaryenTypeNone']();
Module['i32'] = Module['_BinaryenTypeInt32']();
Module['i64'] = Module['_BinaryenTypeInt64']();
Module['f32'] = Module['_BinaryenTypeFloat32']();
Module['f64'] = Module['_BinaryenTypeFloat64']();
Module['unreachable'] = Module['_BinaryenTypeUnreachable']();
Module['auto'] = /* deprecated */ Module['undefined'] = Module['_BinaryenTypeAuto']();
// Expression ids
Module['InvalidId'] = Module['_BinaryenInvalidId']();
Module['BlockId'] = Module['_BinaryenBlockId']();
Module['IfId'] = Module['_BinaryenIfId']();
Module['LoopId'] = Module['_BinaryenLoopId']();
Module['BreakId'] = Module['_BinaryenBreakId']();
Module['SwitchId'] = Module['_BinaryenSwitchId']();
Module['CallId'] = Module['_BinaryenCallId']();
Module['CallImportId'] = Module['_BinaryenCallImportId']();
Module['CallIndirectId'] = Module['_BinaryenCallIndirectId']();
Module['GetLocalId'] = Module['_BinaryenGetLocalId']();
Module['SetLocalId'] = Module['_BinaryenSetLocalId']();
Module['GetGlobalId'] = Module['_BinaryenGetGlobalId']();
Module['SetGlobalId'] = Module['_BinaryenSetGlobalId']();
Module['LoadId'] = Module['_BinaryenLoadId']();
Module['StoreId'] = Module['_BinaryenStoreId']();
Module['ConstId'] = Module['_BinaryenConstId']();
Module['UnaryId'] = Module['_BinaryenUnaryId']();
Module['BinaryId'] = Module['_BinaryenBinaryId']();
Module['SelectId'] = Module['_BinaryenSelectId']();
Module['DropId'] = Module['_BinaryenDropId']();
Module['ReturnId'] = Module['_BinaryenReturnId']();
Module['HostId'] = Module['_BinaryenHostId']();
Module['NopId'] = Module['_BinaryenNopId']();
Module['UnreachableId'] = Module['_BinaryenUnreachableId']();
Module['AtomicCmpxchgId'] = Module['_BinaryenAtomicCmpxchgId']();
Module['AtomicRMWId'] = Module['_BinaryenAtomicRMWId']();
Module['AtomicWaitId'] = Module['_BinaryenAtomicWaitId']();
Module['AtomicWakeId'] = Module['_BinaryenAtomicWakeId']();
// External kinds
Module['ExternalFunction'] = Module['_BinaryenExternalFunction']();
Module['ExternalTable'] = Module['_BinaryenExternalTable']();
Module['ExternalMemory'] = Module['_BinaryenExternalMemory']();
Module['ExternalGlobal'] = Module['_BinaryenExternalGlobal']();
// Operations
Module['ClzInt32'] = Module['_BinaryenClzInt32']();
Module['CtzInt32'] = Module['_BinaryenCtzInt32']();
Module['PopcntInt32'] = Module['_BinaryenPopcntInt32']();
Module['NegFloat32'] = Module['_BinaryenNegFloat32']();
Module['AbsFloat32'] = Module['_BinaryenAbsFloat32']();
Module['CeilFloat32'] = Module['_BinaryenCeilFloat32']();
Module['FloorFloat32'] = Module['_BinaryenFloorFloat32']();
Module['TruncFloat32'] = Module['_BinaryenTruncFloat32']();
Module['NearestFloat32'] = Module['_BinaryenNearestFloat32']();
Module['SqrtFloat32'] = Module['_BinaryenSqrtFloat32']();
Module['EqZInt32'] = Module['_BinaryenEqZInt32']();
Module['ClzInt64'] = Module['_BinaryenClzInt64']();
Module['CtzInt64'] = Module['_BinaryenCtzInt64']();
Module['PopcntInt64'] = Module['_BinaryenPopcntInt64']();
Module['NegFloat64'] = Module['_BinaryenNegFloat64']();
Module['AbsFloat64'] = Module['_BinaryenAbsFloat64']();
Module['CeilFloat64'] = Module['_BinaryenCeilFloat64']();
Module['FloorFloat64'] = Module['_BinaryenFloorFloat64']();
Module['TruncFloat64'] = Module['_BinaryenTruncFloat64']();
Module['NearestFloat64'] = Module['_BinaryenNearestFloat64']();
Module['SqrtFloat64'] = Module['_BinaryenSqrtFloat64']();
Module['EqZInt64'] = Module['_BinaryenEqZInt64']();
Module['ExtendSInt32'] = Module['_BinaryenExtendSInt32']();
Module['ExtendUInt32'] = Module['_BinaryenExtendUInt32']();
Module['WrapInt64'] = Module['_BinaryenWrapInt64']();
Module['TruncSFloat32ToInt32'] = Module['_BinaryenTruncSFloat32ToInt32']();
Module['TruncSFloat32ToInt64'] = Module['_BinaryenTruncSFloat32ToInt64']();
Module['TruncUFloat32ToInt32'] = Module['_BinaryenTruncUFloat32ToInt32']();
Module['TruncUFloat32ToInt64'] = Module['_BinaryenTruncUFloat32ToInt64']();
Module['TruncSFloat64ToInt32'] = Module['_BinaryenTruncSFloat64ToInt32']();
Module['TruncSFloat64ToInt64'] = Module['_BinaryenTruncSFloat64ToInt64']();
Module['TruncUFloat64ToInt32'] = Module['_BinaryenTruncUFloat64ToInt32']();
Module['TruncUFloat64ToInt64'] = Module['_BinaryenTruncUFloat64ToInt64']();
Module['ReinterpretFloat32'] = Module['_BinaryenReinterpretFloat32']();
Module['ReinterpretFloat64'] = Module['_BinaryenReinterpretFloat64']();
Module['ConvertSInt32ToFloat32'] = Module['_BinaryenConvertSInt32ToFloat32']();
Module['ConvertSInt32ToFloat64'] = Module['_BinaryenConvertSInt32ToFloat64']();
Module['ConvertUInt32ToFloat32'] = Module['_BinaryenConvertUInt32ToFloat32']();
Module['ConvertUInt32ToFloat64'] = Module['_BinaryenConvertUInt32ToFloat64']();
Module['ConvertSInt64ToFloat32'] = Module['_BinaryenConvertSInt64ToFloat32']();
Module['ConvertSInt64ToFloat64'] = Module['_BinaryenConvertSInt64ToFloat64']();
Module['ConvertUInt64ToFloat32'] = Module['_BinaryenConvertUInt64ToFloat32']();
Module['ConvertUInt64ToFloat64'] = Module['_BinaryenConvertUInt64ToFloat64']();
Module['PromoteFloat32'] = Module['_BinaryenPromoteFloat32']();
Module['DemoteFloat64'] = Module['_BinaryenDemoteFloat64']();
Module['ReinterpretInt32'] = Module['_BinaryenReinterpretInt32']();
Module['ReinterpretInt64'] = Module['_BinaryenReinterpretInt64']();
Module['AddInt32'] = Module['_BinaryenAddInt32']();
Module['SubInt32'] = Module['_BinaryenSubInt32']();
Module['MulInt32'] = Module['_BinaryenMulInt32']();
Module['DivSInt32'] = Module['_BinaryenDivSInt32']();
Module['DivUInt32'] = Module['_BinaryenDivUInt32']();
Module['RemSInt32'] = Module['_BinaryenRemSInt32']();
Module['RemUInt32'] = Module['_BinaryenRemUInt32']();
Module['AndInt32'] = Module['_BinaryenAndInt32']();
Module['OrInt32'] = Module['_BinaryenOrInt32']();
Module['XorInt32'] = Module['_BinaryenXorInt32']();
Module['ShlInt32'] = Module['_BinaryenShlInt32']();
Module['ShrUInt32'] = Module['_BinaryenShrUInt32']();
Module['ShrSInt32'] = Module['_BinaryenShrSInt32']();
Module['RotLInt32'] = Module['_BinaryenRotLInt32']();
Module['RotRInt32'] = Module['_BinaryenRotRInt32']();
Module['EqInt32'] = Module['_BinaryenEqInt32']();
Module['NeInt32'] = Module['_BinaryenNeInt32']();
Module['LtSInt32'] = Module['_BinaryenLtSInt32']();
Module['LtUInt32'] = Module['_BinaryenLtUInt32']();
Module['LeSInt32'] = Module['_BinaryenLeSInt32']();
Module['LeUInt32'] = Module['_BinaryenLeUInt32']();
Module['GtSInt32'] = Module['_BinaryenGtSInt32']();
Module['GtUInt32'] = Module['_BinaryenGtUInt32']();
Module['GeSInt32'] = Module['_BinaryenGeSInt32']();
Module['GeUInt32'] = Module['_BinaryenGeUInt32']();
Module['AddInt64'] = Module['_BinaryenAddInt64']();
Module['SubInt64'] = Module['_BinaryenSubInt64']();
Module['MulInt64'] = Module['_BinaryenMulInt64']();
Module['DivSInt64'] = Module['_BinaryenDivSInt64']();
Module['DivUInt64'] = Module['_BinaryenDivUInt64']();
Module['RemSInt64'] = Module['_BinaryenRemSInt64']();
Module['RemUInt64'] = Module['_BinaryenRemUInt64']();
Module['AndInt64'] = Module['_BinaryenAndInt64']();
Module['OrInt64'] = Module['_BinaryenOrInt64']();
Module['XorInt64'] = Module['_BinaryenXorInt64']();
Module['ShlInt64'] = Module['_BinaryenShlInt64']();
Module['ShrUInt64'] = Module['_BinaryenShrUInt64']();
Module['ShrSInt64'] = Module['_BinaryenShrSInt64']();
Module['RotLInt64'] = Module['_BinaryenRotLInt64']();
Module['RotRInt64'] = Module['_BinaryenRotRInt64']();
Module['EqInt64'] = Module['_BinaryenEqInt64']();
Module['NeInt64'] = Module['_BinaryenNeInt64']();
Module['LtSInt64'] = Module['_BinaryenLtSInt64']();
Module['LtUInt64'] = Module['_BinaryenLtUInt64']();
Module['LeSInt64'] = Module['_BinaryenLeSInt64']();
Module['LeUInt64'] = Module['_BinaryenLeUInt64']();
Module['GtSInt64'] = Module['_BinaryenGtSInt64']();
Module['GtUInt64'] = Module['_BinaryenGtUInt64']();
Module['GeSInt64'] = Module['_BinaryenGeSInt64']();
Module['GeUInt64'] = Module['_BinaryenGeUInt64']();
Module['AddFloat32'] = Module['_BinaryenAddFloat32']();
Module['SubFloat32'] = Module['_BinaryenSubFloat32']();
Module['MulFloat32'] = Module['_BinaryenMulFloat32']();
Module['DivFloat32'] = Module['_BinaryenDivFloat32']();
Module['CopySignFloat32'] = Module['_BinaryenCopySignFloat32']();
Module['MinFloat32'] = Module['_BinaryenMinFloat32']();
Module['MaxFloat32'] = Module['_BinaryenMaxFloat32']();
Module['EqFloat32'] = Module['_BinaryenEqFloat32']();
Module['NeFloat32'] = Module['_BinaryenNeFloat32']();
Module['LtFloat32'] = Module['_BinaryenLtFloat32']();
Module['LeFloat32'] = Module['_BinaryenLeFloat32']();
Module['GtFloat32'] = Module['_BinaryenGtFloat32']();
Module['GeFloat32'] = Module['_BinaryenGeFloat32']();
Module['AddFloat64'] = Module['_BinaryenAddFloat64']();
Module['SubFloat64'] = Module['_BinaryenSubFloat64']();
Module['MulFloat64'] = Module['_BinaryenMulFloat64']();
Module['DivFloat64'] = Module['_BinaryenDivFloat64']();
Module['CopySignFloat64'] = Module['_BinaryenCopySignFloat64']();
Module['MinFloat64'] = Module['_BinaryenMinFloat64']();
Module['MaxFloat64'] = Module['_BinaryenMaxFloat64']();
Module['EqFloat64'] = Module['_BinaryenEqFloat64']();
Module['NeFloat64'] = Module['_BinaryenNeFloat64']();
Module['LtFloat64'] = Module['_BinaryenLtFloat64']();
Module['LeFloat64'] = Module['_BinaryenLeFloat64']();
Module['GtFloat64'] = Module['_BinaryenGtFloat64']();
Module['GeFloat64'] = Module['_BinaryenGeFloat64']();
Module['PageSize'] = Module['_BinaryenPageSize']();
Module['CurrentMemory'] = Module['_BinaryenCurrentMemory']();
Module['GrowMemory'] = Module['_BinaryenGrowMemory']();
Module['HasFeature'] = Module['_BinaryenHasFeature']();
Module['AtomicRMWAdd'] = Module['_BinaryenAtomicRMWAdd']();
Module['AtomicRMWSub'] = Module['_BinaryenAtomicRMWSub']();
Module['AtomicRMWAnd'] = Module['_BinaryenAtomicRMWAnd']();
Module['AtomicRMWOr'] = Module['_BinaryenAtomicRMWOr']();
Module['AtomicRMWXor'] = Module['_BinaryenAtomicRMWXor']();
Module['AtomicRMWXchg'] = Module['_BinaryenAtomicRMWXchg']();
// 'Module' interface
Module['Module'] = function(module) {
if (!module) module = Module['_BinaryenModuleCreate']();
this['ptr'] = module;
// 'Expression' creation
this['block'] = function(name, children, type) {
return preserveStack(function() {
return Module['_BinaryenBlock'](module, name ? strToStack(name) : 0,
i32sToStack(children), children.length,
typeof type !== 'undefined' ? type : Module['none']);
});
};
this['if'] = function(condition, ifTrue, ifFalse) {
return Module['_BinaryenIf'](module, condition, ifTrue, ifFalse);
};
this['loop'] = function(label, body) {
return preserveStack(function() {
return Module['_BinaryenLoop'](module, strToStack(label), body);
});
};
this['break'] = this['br'] = function(label, condition, value) {
return preserveStack(function() {
return Module['_BinaryenBreak'](module, strToStack(label), condition, value);
});
};
this['br_if'] = function(label, condition, value) {
assert(condition);
return this['br'](label, condition, value);
};
this['switch'] = function(names, defaultName, condition, value) {
return preserveStack(function() {
var namei32s = [];
names.forEach(function(name) {
namei32s.push(strToStack(name));
});
return Module['_BinaryenSwitch'](module, i32sToStack(namei32s), namei32s.length,
strToStack(defaultName), condition, value);
});
};
this['call'] = function(name, operands, type) {
return preserveStack(function() {
return Module['_BinaryenCall'](module, strToStack(name), i32sToStack(operands), operands.length, type);
});
};
this['callImport'] = this['call_import'] = function(name, operands, type) {
return preserveStack(function() {
return Module['_BinaryenCallImport'](module, strToStack(name), i32sToStack(operands), operands.length, type);
});
};
this['callIndirect'] = this['call_indirect'] = function(target, operands, type) {
return preserveStack(function() {
return Module['_BinaryenCallIndirect'](module, target, i32sToStack(operands), operands.length, strToStack(type));
});
};
this['getLocal'] = this['get_local'] = function(index, type) {
return Module['_BinaryenGetLocal'](module, index, type);
};
this['setLocal'] = this['set_local'] = this['set_local'] = function(index, value) {
return Module['_BinaryenSetLocal'](module, index, value);
};
this['teeLocal'] = this['tee_local'] = function(index, value) {
return Module['_BinaryenTeeLocal'](module, index, value);
};
this['getGlobal'] = this['get_global'] = function(name, type) {
return Module['_BinaryenGetGlobal'](module, strToStack(name), type);
}
this['setGlobal'] = this['set_global'] = function(name, value) {
return Module['_BinaryenSetGlobal'](module, strToStack(name), value);
}
this['currentMemory'] = this['current_memory'] = function() {
return Module['_BinaryenHost'](module, Module['CurrentMemory']);
}
this['growMemory'] = this['grow_memory'] = function(value) {
return Module['_BinaryenHost'](module, Module['GrowMemory'], null, i32sToStack([value]), 1);
}
this['hasFeature'] = this['has_feature'] = function(name) {
return Module['_BinaryenHost'](module, Module['HasFeature'], strToStack(name));
}
// The Const creation API is a little different: we don't want users to
// need to make their own Literals, as the C API handles them by value,
// which means we would leak them. Instead, this is the only API that
// accepts Literals, so fuse it with Literal creation
var literal = _malloc(16); // a single literal in memory. the LLVM C ABI
// makes us pass pointers to this.
this['i32'] = {
'load': function(offset, align, ptr) {
return Module['_BinaryenLoad'](module, 4, true, offset, align, Module['i32'], ptr);
},
'load8_s': function(offset, align, ptr) {
return Module['_BinaryenLoad'](module, 1, true, offset, align, Module['i32'], ptr);
},
'load8_u': function(offset, align, ptr) {
return Module['_BinaryenLoad'](module, 1, false, offset, align, Module['i32'], ptr);
},
'load16_s': function(offset, align, ptr) {
return Module['_BinaryenLoad'](module, 2, true, offset, align, Module['i32'], ptr);
},
'load16_u': function(offset, align, ptr) {
return Module['_BinaryenLoad'](module, 2, false, offset, align, Module['i32'], ptr);
},
'store': function(offset, align, ptr, value) {
return Module['_BinaryenStore'](module, 4, offset, align, ptr, value, Module['i32']);
},
'store8': function(offset, align, ptr, value) {
return Module['_BinaryenStore'](module, 1, offset, align, ptr, value, Module['i32']);
},
'store16': function(offset, align, ptr, value) {
return Module['_BinaryenStore'](module, 2, offset, align, ptr, value, Module['i32']);
},
'const': function(x) {
Module['_BinaryenLiteralInt32'](literal, x);
return Module['_BinaryenConst'](module, literal);
},
'clz': function(value) {
return Module['_BinaryenUnary'](module, Module['ClzInt32'], value);
},
'ctz': function(value) {
return Module['_BinaryenUnary'](module, Module['CtzInt32'], value);
},
'popcnt': function(value) {
return Module['_BinaryenUnary'](module, Module['PopcntInt32'], value);
},
'eqz': function(value) {
return Module['_BinaryenUnary'](module, Module['EqZInt32'], value);
},
'trunc_s': {
'f32': function(value) {
return Module['_BinaryenUnary'](module, Module['TruncSFloat32ToInt32'], value);
},
'f64': function(value) {
return Module['_BinaryenUnary'](module, Module['TruncSFloat64ToInt32'], value);
},
},
'trunc_u': {
'f32': function(value) {
return Module['_BinaryenUnary'](module, Module['TruncUFloat32ToInt32'], value);
},
'f64': function(value) {
return Module['_BinaryenUnary'](module, Module['TruncUFloat64ToInt32'], value);
},
},
'reinterpret': function(value) {
return Module['_BinaryenUnary'](module, Module['ReinterpretFloat32'], value);
},
'wrap': function(value) {
return Module['_BinaryenUnary'](module, Module['WrapInt64'], value);
},
'add': function(left, right) {
return Module['_BinaryenBinary'](module, Module['AddInt32'], left, right);
},
'sub': function(left, right) {
return Module['_BinaryenBinary'](module, Module['SubInt32'], left, right);
},
'mul': function(left, right) {
return Module['_BinaryenBinary'](module, Module['MulInt32'], left, right);
},
'div_s': function(left, right) {
return Module['_BinaryenBinary'](module, Module['DivSInt32'], left, right);
},
'div_u': function(left, right) {
return Module['_BinaryenBinary'](module, Module['DivUInt32'], left, right);
},
'rem_s': function(left, right) {
return Module['_BinaryenBinary'](module, Module['RemSInt32'], left, right);
},
'rem_u': function(left, right) {
return Module['_BinaryenBinary'](module, Module['RemUInt32'], left, right);
},
'and': function(left, right) {
return Module['_BinaryenBinary'](module, Module['AndInt32'], left, right);
},
'or': function(left, right) {
return Module['_BinaryenBinary'](module, Module['OrInt32'], left, right);
},
'xor': function(left, right) {
return Module['_BinaryenBinary'](module, Module['XorInt32'], left, right);
},
'shl': function(left, right) {
return Module['_BinaryenBinary'](module, Module['ShlInt32'], left, right);
},
'shr_u': function(left, right) {
return Module['_BinaryenBinary'](module, Module['ShrUInt32'], left, right);
},
'shr_s': function(left, right) {
return Module['_BinaryenBinary'](module, Module['ShrSInt32'], left, right);
},
'rotl': function(left, right) {
return Module['_BinaryenBinary'](module, Module['RotLInt32'], left, right);
},
'rotr': function(left, right) {
return Module['_BinaryenBinary'](module, Module['RotRInt32'], left, right);
},
'eq': function(left, right) {
return Module['_BinaryenBinary'](module, Module['EqInt32'], left, right);
},
'ne': function(left, right) {
return Module['_BinaryenBinary'](module, Module['NeInt32'], left, right);
},
'lt_s': function(left, right) {
return Module['_BinaryenBinary'](module, Module['LtSInt32'], left, right);
},
'lt_u': function(left, right) {
return Module['_BinaryenBinary'](module, Module['LtUInt32'], left, right);
},
'le_s': function(left, right) {
return Module['_BinaryenBinary'](module, Module['LeSInt32'], left, right);
},
'le_u': function(left, right) {
return Module['_BinaryenBinary'](module, Module['LeUInt32'], left, right);
},
'gt_s': function(left, right) {
return Module['_BinaryenBinary'](module, Module['GtSInt32'], left, right);
},
'gt_u': function(left, right) {
return Module['_BinaryenBinary'](module, Module['GtUInt32'], left, right);
},
'ge_s': function(left, right) {
return Module['_BinaryenBinary'](module, Module['GeSInt32'], left, right);
},
'ge_u': function(left, right) {
return Module['_BinaryenBinary'](module, Module['GeUInt32'], left, right);
},
'atomic':{
'load': function(offset, ptr) {
return Module['_BinaryenAtomicLoad'](module, 4, offset, Module['i32'], ptr);
},
'load8_u': function(offset, ptr) {
return Module['_BinaryenAtomicLoad'](module, 1, offset, Module['i32'], ptr);
},
'load16_u': function(offset, ptr) {
return Module['_BinaryenAtomicLoad'](module, 2, offset, Module['i32'], ptr);
},
'store': function(offset, ptr, value) {
return Module['_BinaryenAtomicStore'](module, 4, offset, ptr, value, Module['i32']);
},
'store8': function(offset, ptr, value) {
return Module['_BinaryenAtomicStore'](module, 1, offset, ptr, value, Module['i32']);
},
'store16': function(offset, ptr, value) {
return Module['_BinaryenAtomicStore'](module, 2, offset, ptr, value, Module['i32']);
},
'rmw': {
'add': function(offset, ptr, value) {
return Module['_BinaryenAtomicRMW'](module, Module['AtomicRMWAdd'], 4, offset, ptr, value, Module['i32']);
},
'sub': function(offset, ptr, value) {
return Module['_BinaryenAtomicRMW'](module, Module['AtomicRMWSub'], 4, offset, ptr, value, Module['i32']);
},
'and': function(offset, ptr, value) {
return Module['_BinaryenAtomicRMW'](module, Module['AtomicRMWAnd'], 4, offset, ptr, value, Module['i32']);
},
'or': function(offset, ptr, value) {
return Module['_BinaryenAtomicRMW'](module, Module['AtomicRMWOr'], 4, offset, ptr, value, Module['i32']);
},
'xor': function(offset, ptr, value) {
return Module['_BinaryenAtomicRMW'](module, Module['AtomicRMWXor'], 4, offset, ptr, value, Module['i32']);
},
'xchg': function(offset, ptr, value) {
return Module['_BinaryenAtomicRMW'](module, Module['AtomicRMWXchg'], 4, offset, ptr, value, Module['i32']);
},
'cmpxchg': function(offset, ptr, expected, replacement) {
return Module['_BinaryenAtomicCmpxchg'](module, 4, offset, ptr, expected, replacement, Module['i32'])
},
},
'rmw8_u': {
'add': function(offset, ptr, value) {
return Module['_BinaryenAtomicRMW'](module, Module['AtomicRMWAdd'], 1, offset, ptr, value, Module['i32']);
},
'sub': function(offset, ptr, value) {
return Module['_BinaryenAtomicRMW'](module, Module['AtomicRMWSub'], 1, offset, ptr, value, Module['i32']);
},
'and': function(offset, ptr, value) {
return Module['_BinaryenAtomicRMW'](module, Module['AtomicRMWAnd'], 1, offset, ptr, value, Module['i32']);
},
'or': function(offset, ptr, value) {
return Module['_BinaryenAtomicRMW'](module, Module['AtomicRMWOr'], 1, offset, ptr, value, Module['i32']);
},
'xor': function(offset, ptr, value) {
return Module['_BinaryenAtomicRMW'](module, Module['AtomicRMWXor'], 1, offset, ptr, value, Module['i32']);
},
'xchg': function(offset, ptr, value) {
return Module['_BinaryenAtomicRMW'](module, Module['AtomicRMWXchg'], 1, offset, ptr, value, Module['i32']);
},
'cmpxchg': function(offset, ptr, expected, replacement) {
return Module['_BinaryenAtomicCmpxchg'](module, 1, offset, ptr, expected, replacement, Module['i32'])
},
},
'rmw16_u': {
'add': function(offset, ptr, value) {
return Module['_BinaryenAtomicRMW'](module, Module['AtomicRMWAdd'], 2, offset, ptr, value, Module['i32']);
},
'sub': function(offset, ptr, value) {
return Module['_BinaryenAtomicRMW'](module, Module['AtomicRMWSub'], 2, offset, ptr, value, Module['i32']);
},
'and': function(offset, ptr, value) {
return Module['_BinaryenAtomicRMW'](module, Module['AtomicRMWAnd'], 2, offset, ptr, value, Module['i32']);
},
'or': function(offset, ptr, value) {
return Module['_BinaryenAtomicRMW'](module, Module['AtomicRMWOr'], 2, offset, ptr, value, Module['i32']);
},
'xor': function(offset, ptr, value) {
return Module['_BinaryenAtomicRMW'](module, Module['AtomicRMWXor'], 2, offset, ptr, value, Module['i32']);
},
'xchg': function(offset, ptr, value) {
return Module['_BinaryenAtomicRMW'](module, Module['AtomicRMWXchg'], 2, offset, ptr, value, Module['i32']);
},
'cmpxchg': function(offset, ptr, expected, replacement) {
return Module['_BinaryenAtomicCmpxchg'](module, 2, offset, ptr, expected, replacement, Module['i32'])
},
},
},
'wait': function(ptr, expected, timeout) {
return Module['_BinaryenAtomicWait'](module, ptr, expected, timeout, Module['i32']);
},
};
this['i64'] = {
'load': function(offset, align, ptr) {
return Module['_BinaryenLoad'](module, 8, true, offset, align, Module['i64'], ptr);
},
'load8_s': function(offset, align, ptr) {
return Module['_BinaryenLoad'](module, 1, true, offset, align, Module['i64'], ptr);
},
'load8_u': function(offset, align, ptr) {
return Module['_BinaryenLoad'](module, 1, false, offset, align, Module['i64'], ptr);
},
'load16_s': function(offset, align, ptr) {
return Module['_BinaryenLoad'](module, 2, true, offset, align, Module['i64'], ptr);
},
'load16_u': function(offset, align, ptr) {
return Module['_BinaryenLoad'](module, 2, false, offset, align, Module['i64'], ptr);
},
'load32_s': function(offset, align, ptr) {
return Module['_BinaryenLoad'](module, 4, true, offset, align, Module['i64'], ptr);
},
'load32_u': function(offset, align, ptr) {
return Module['_BinaryenLoad'](module, 4, false, offset, align, Module['i64'], ptr);
},
'store': function(offset, align, ptr, value) {
return Module['_BinaryenStore'](module, 8, offset, align, ptr, value, Module['i64']);
},
'store8': function(offset, align, ptr, value) {
return Module['_BinaryenStore'](module, 1, offset, align, ptr, value, Module['i64']);
},
'store16': function(offset, align, ptr, value) {
return Module['_BinaryenStore'](module, 2, offset, align, ptr, value, Module['i64']);
},
'store32': function(offset, align, ptr, value) {
return Module['_BinaryenStore'](module, 4, offset, align, ptr, value, Module['i64']);
},
'const': function(x, y) {
Module['_BinaryenLiteralInt64'](literal, x, y);
return Module['_BinaryenConst'](module, literal);
},
'clz': function(value) {
return Module['_BinaryenUnary'](module, Module['ClzInt64'], value);
},
'ctz': function(value) {
return Module['_BinaryenUnary'](module, Module['CtzInt64'], value);
},
'popcnt': function(value) {
return Module['_BinaryenUnary'](module, Module['PopcntInt64'], value);
},
'eqz': function(value) {
return Module['_BinaryenUnary'](module, Module['EqZInt64'], value);
},
'trunc_s': {
'f32': function(value) {
return Module['_BinaryenUnary'](module, Module['TruncSFloat32ToInt64'], value);
},
'f64': function(value) {
return Module['_BinaryenUnary'](module, Module['TruncSFloat64ToInt64'], value);
},
},
'trunc_u': {
'f32': function(value) {
return Module['_BinaryenUnary'](module, Module['TruncUFloat32ToInt64'], value);
},
'f64': function(value) {
return Module['_BinaryenUnary'](module, Module['TruncUFloat64ToInt64'], value);
},
},
'reinterpret': function(value) {
return Module['_BinaryenUnary'](module, Module['ReinterpretFloat64'], value);
},
'extend_s': function(value) {
return Module['_BinaryenUnary'](module, Module['ExtendSInt32'], value);
},
'extend_u': function(value) {
return Module['_BinaryenUnary'](module, Module['ExtendUInt32'], value);
},
'add': function(left, right) {
return Module['_BinaryenBinary'](module, Module['AddInt64'], left, right);
},
'sub': function(left, right) {
return Module['_BinaryenBinary'](module, Module['SubInt64'], left, right);
},
'mul': function(left, right) {
return Module['_BinaryenBinary'](module, Module['MulInt64'], left, right);
},
'div_s': function(left, right) {
return Module['_BinaryenBinary'](module, Module['DivSInt64'], left, right);
},
'div_u': function(left, right) {
return Module['_BinaryenBinary'](module, Module['DivUInt64'], left, right);
},
'rem_s': function(left, right) {
return Module['_BinaryenBinary'](module, Module['RemSInt64'], left, right);
},
'rem_u': function(left, right) {
return Module['_BinaryenBinary'](module, Module['RemUInt64'], left, right);
},
'and': function(left, right) {
return Module['_BinaryenBinary'](module, Module['AndInt64'], left, right);
},
'or': function(left, right) {
return Module['_BinaryenBinary'](module, Module['OrInt64'], left, right);
},
'xor': function(left, right) {
return Module['_BinaryenBinary'](module, Module['XorInt64'], left, right);
},
'shl': function(left, right) {
return Module['_BinaryenBinary'](module, Module['ShlInt64'], left, right);
},
'shr_u': function(left, right) {
return Module['_BinaryenBinary'](module, Module['ShrUInt64'], left, right);
},
'shr_s': function(left, right) {
return Module['_BinaryenBinary'](module, Module['ShrSInt64'], left, right);
},
'rotl': function(left, right) {
return Module['_BinaryenBinary'](module, Module['RotLInt64'], left, right);
},
'rotr': function(left, right) {
return Module['_BinaryenBinary'](module, Module['RotRInt64'], left, right);
},
'eq': function(left, right) {
return Module['_BinaryenBinary'](module, Module['EqInt64'], left, right);
},
'ne': function(left, right) {
return Module['_BinaryenBinary'](module, Module['NeInt64'], left, right);
},
'lt_s': function(left, right) {
return Module['_BinaryenBinary'](module, Module['LtSInt64'], left, right);
},
'lt_u': function(left, right) {
return Module['_BinaryenBinary'](module, Module['LtUInt64'], left, right);
},
'le_s': function(left, right) {
return Module['_BinaryenBinary'](module, Module['LeSInt64'], left, right);
},
'le_u': function(left, right) {
return Module['_BinaryenBinary'](module, Module['LeUInt64'], left, right);
},
'gt_s': function(left, right) {
return Module['_BinaryenBinary'](module, Module['GtSInt64'], left, right);
},
'gt_u': function(left, right) {
return Module['_BinaryenBinary'](module, Module['GtUInt64'], left, right);
},
'ge_s': function(left, right) {
return Module['_BinaryenBinary'](module, Module['GeSInt64'], left, right);
},
'ge_u': function(left, right) {
return Module['_BinaryenBinary'](module, Module['GeUInt64'], left, right);
},
'atomic':{
'load': function(offset, ptr) {
return Module['_BinaryenAtomicLoad'](module, 8, offset, Module['i64'], ptr);
},
'load8_u': function(offset, ptr) {
return Module['_BinaryenAtomicLoad'](module, 1, offset, Module['i64'], ptr);
},
'load16_u': function(offset, ptr) {
return Module['_BinaryenAtomicLoad'](module, 2, offset, Module['i64'], ptr);
},
'load32_u': function(offset, ptr) {
return Module['_BinaryenAtomicLoad'](module, 4, offset, Module['i64'], ptr);
},
'store': function(offset, ptr, value) {
return Module['_BinaryenAtomicStore'](module, 8, offset, ptr, value, Module['i64']);
},
'store8': function(offset, ptr, value) {
return Module['_BinaryenAtomicStore'](module, 1, offset, ptr, value, Module['i64']);
},
'store16': function(offset, ptr, value) {
return Module['_BinaryenAtomicStore'](module, 2, offset, ptr, value, Module['i64']);
},
'store32': function(offset, ptr, value) {
return Module['_BinaryenAtomicStore'](module, 4, offset, ptr, value, Module['i64']);
},
'rmw': {
'add': function(offset, ptr, value) {
return Module['_BinaryenAtomicRMW'](module, Module['AtomicRMWAdd'], 8, offset, ptr, value, Module['i64']);
},
'sub': function(offset, ptr, value) {
return Module['_BinaryenAtomicRMW'](module, Module['AtomicRMWSub'], 8, offset, ptr, value, Module['i64']);
},
'and': function(offset, ptr, value) {
return Module['_BinaryenAtomicRMW'](module, Module['AtomicRMWAnd'], 8, offset, ptr, value, Module['i64']);
},
'or': function(offset, ptr, value) {
return Module['_BinaryenAtomicRMW'](module, Module['AtomicRMWOr'], 8, offset, ptr, value, Module['i64']);
},
'xor': function(offset, ptr, value) {
return Module['_BinaryenAtomicRMW'](module, Module['AtomicRMWXor'], 8, offset, ptr, value, Module['i64']);
},
'xchg': function(offset, ptr, value) {
return Module['_BinaryenAtomicRMW'](module, Module['AtomicRMWXchg'], 8, offset, ptr, value, Module['i64']);
},
'cmpxchg': function(offset, ptr, expected, replacement) {
return Module['_BinaryenAtomicCmpxchg'](module, 8, offset, ptr, expected, replacement, Module['i64'])
},
},
'rmw8_u': {
'add': function(offset, ptr, value) {
return Module['_BinaryenAtomicRMW'](module, Module['AtomicRMWAdd'], 1, offset, ptr, value, Module['i64']);
},
'sub': function(offset, ptr, value) {
return Module['_BinaryenAtomicRMW'](module, Module['AtomicRMWSub'], 1, offset, ptr, value, Module['i64']);
},
'and': function(offset, ptr, value) {
return Module['_BinaryenAtomicRMW'](module, Module['AtomicRMWAnd'], 1, offset, ptr, value, Module['i64']);
},
'or': function(offset, ptr, value) {
return Module['_BinaryenAtomicRMW'](module, Module['AtomicRMWOr'], 1, offset, ptr, value, Module['i64']);
},
'xor': function(offset, ptr, value) {
return Module['_BinaryenAtomicRMW'](module, Module['AtomicRMWXor'], 1, offset, ptr, value, Module['i64']);
},
'xchg': function(offset, ptr, value) {
return Module['_BinaryenAtomicRMW'](module, Module['AtomicRMWXchg'], 1, offset, ptr, value, Module['i64']);
},
'cmpxchg': function(offset, ptr, expected, replacement) {
return Module['_BinaryenAtomicCmpxchg'](module, 1, offset, ptr, expected, replacement, Module['i64'])
},
},
'rmw16_u': {
'add': function(offset, ptr, value) {
return Module['_BinaryenAtomicRMW'](module, Module['AtomicRMWAdd'], 2, offset, ptr, value, Module['i64']);
},
'sub': function(offset, ptr, value) {
return Module['_BinaryenAtomicRMW'](module, Module['AtomicRMWSub'], 2, offset, ptr, value, Module['i64']);
},
'and': function(offset, ptr, value) {
return Module['_BinaryenAtomicRMW'](module, Module['AtomicRMWAnd'], 2, offset, ptr, value, Module['i64']);
},
'or': function(offset, ptr, value) {
return Module['_BinaryenAtomicRMW'](module, Module['AtomicRMWOr'], 2, offset, ptr, value, Module['i64']);
},
'xor': function(offset, ptr, value) {
return Module['_BinaryenAtomicRMW'](module, Module['AtomicRMWXor'], 2, offset, ptr, value, Module['i64']);
},
'xchg': function(offset, ptr, value) {
return Module['_BinaryenAtomicRMW'](module, Module['AtomicRMWXchg'], 2, offset, ptr, value, Module['i64']);
},
'cmpxchg': function(offset, ptr, expected, replacement) {
return Module['_BinaryenAtomicCmpxchg'](module, 2, offset, ptr, expected, replacement, Module['i64'])
},
},
'rmw32_u': {
'add': function(offset, ptr, value) {
return Module['_BinaryenAtomicRMW'](module, Module['AtomicRMWAdd'], 4, offset, ptr, value, Module['i64']);
},
'sub': function(offset, ptr, value) {
return Module['_BinaryenAtomicRMW'](module, Module['AtomicRMWSub'], 4, offset, ptr, value, Module['i64']);
},
'and': function(offset, ptr, value) {
return Module['_BinaryenAtomicRMW'](module, Module['AtomicRMWAnd'], 4, offset, ptr, value, Module['i64']);
},
'or': function(offset, ptr, value) {
return Module['_BinaryenAtomicRMW'](module, Module['AtomicRMWOr'], 4, offset, ptr, value, Module['i64']);
},
'xor': function(offset, ptr, value) {
return Module['_BinaryenAtomicRMW'](module, Module['AtomicRMWXor'], 4, offset, ptr, value, Module['i64']);
},
'xchg': function(offset, ptr, value) {
return Module['_BinaryenAtomicRMW'](module, Module['AtomicRMWXchg'], 4, offset, ptr, value, Module['i64']);
},
'cmpxchg': function(offset, ptr, expected, replacement) {
return Module['_BinaryenAtomicCmpxchg'](module, 4, offset, ptr, expected, replacement, Module['i64'])
},
},
},
'wait': function(ptr, expected, timeout) {
return Module['_BinaryenAtomicWait'](module, ptr, expected, timeout, Module['i64']);
},
};
this['f32'] = {
'load': function(offset, align, ptr) {
return Module['_BinaryenLoad'](module, 4, true, offset, align, Module['f32'], ptr);
},
'store': function(offset, align, ptr, value) {
return Module['_BinaryenStore'](module, 4, offset, align, ptr, value, Module['f32']);
},
'const': function(x) {
Module['_BinaryenLiteralFloat32'](literal, x);
return Module['_BinaryenConst'](module, literal);
},
'const_bits': function(x) {
Module['_BinaryenLiteralFloat32Bits'](literal, x);
return Module['_BinaryenConst'](module, literal);
},
'neg': function(value) {
return Module['_BinaryenUnary'](module, Module['NegFloat32'], value);
},
'abs': function(value) {
return Module['_BinaryenUnary'](module, Module['AbsFloat32'], value);
},
'ceil': function(value) {
return Module['_BinaryenUnary'](module, Module['CeilFloat32'], value);
},
'floor': function(value) {
return Module['_BinaryenUnary'](module, Module['FloorFloat32'], value);
},
'trunc': function(value) {
return Module['_BinaryenUnary'](module, Module['TruncFloat32'], value);
},
'nearest': function(value) {
return Module['_BinaryenUnary'](module, Module['NearestFloat32'], value);
},
'sqrt': function(value) {
return Module['_BinaryenUnary'](module, Module['SqrtFloat32'], value);
},
'reinterpret': function(value) {
return Module['_BinaryenUnary'](module, Module['ReinterpretInt32'], value);
},
'convert_s': {
'i32': function(value) {
return Module['_BinaryenUnary'](module, Module['ConvertSInt32ToFloat32'], value);
},
'i64': function(value) {
return Module['_BinaryenUnary'](module, Module['ConvertSInt64ToFloat32'], value);
},
},
'convert_u': {
'i32': function(value) {
return Module['_BinaryenUnary'](module, Module['ConvertUInt32ToFloat32'], value);
},
'i64': function(value) {
return Module['_BinaryenUnary'](module, Module['ConvertUInt64ToFloat32'], value);
},
},
'demote': function(value) {
return Module['_BinaryenUnary'](module, Module['DemoteFloat64'], value);
},
'add': function(left, right) {
return Module['_BinaryenBinary'](module, Module['AddFloat32'], left, right);
},
'sub': function(left, right) {
return Module['_BinaryenBinary'](module, Module['SubFloat32'], left, right);
},
'mul': function(left, right) {
return Module['_BinaryenBinary'](module, Module['MulFloat32'], left, right);
},
'div': function(left, right) {
return Module['_BinaryenBinary'](module, Module['DivFloat32'], left, right);
},
'copysign': function(left, right) {
return Module['_BinaryenBinary'](module, Module['CopySignFloat32'], left, right);
},
'min': function(left, right) {
return Module['_BinaryenBinary'](module, Module['MinFloat32'], left, right);
},
'max': function(left, right) {
return Module['_BinaryenBinary'](module, Module['MaxFloat32'], left, right);
},
'eq': function(left, right) {
return Module['_BinaryenBinary'](module, Module['EqFloat32'], left, right);
},
'ne': function(left, right) {
return Module['_BinaryenBinary'](module, Module['NeFloat32'], left, right);
},
'lt': function(left, right) {
return Module['_BinaryenBinary'](module, Module['LtFloat32'], left, right);
},
'le': function(left, right) {
return Module['_BinaryenBinary'](module, Module['LeFloat32'], left, right);
},
'gt': function(left, right) {
return Module['_BinaryenBinary'](module, Module['GtFloat32'], left, right);
},
'ge': function(left, right) {
return Module['_BinaryenBinary'](module, Module['GeFloat32'], left, right);
},
};
this['f64'] = {
'load': function(offset, align, ptr) {
return Module['_BinaryenLoad'](module, 8, true, offset, align, Module['f64'], ptr);
},
'store': function(offset, align, ptr, value) {
return Module['_BinaryenStore'](module, 8, offset, align, ptr, value, Module['f64']);
},
'const': function(x) {
Module['_BinaryenLiteralFloat64'](literal, x);
return Module['_BinaryenConst'](module, literal);
},
'const_bits': function(x, y) {
Module['_BinaryenLiteralFloat64Bits'](literal, x, y);
return Module['_BinaryenConst'](module, literal);
},
'neg': function(value) {
return Module['_BinaryenUnary'](module, Module['NegFloat64'], value);
},
'abs': function(value) {
return Module['_BinaryenUnary'](module, Module['AbsFloat64'], value);
},
'ceil': function(value) {
return Module['_BinaryenUnary'](module, Module['CeilFloat64'], value);
},
'floor': function(value) {
return Module['_BinaryenUnary'](module, Module['FloorFloat64'], value);
},
'trunc': function(value) {
return Module['_BinaryenUnary'](module, Module['TruncFloat64'], value);
},
'nearest': function(value) {
return Module['_BinaryenUnary'](module, Module['NearestFloat64'], value);
},
'sqrt': function(value) {
return Module['_BinaryenUnary'](module, Module['SqrtFloat64'], value);
},
'reinterpret': function(value) {
return Module['_BinaryenUnary'](module, Module['ReinterpretInt64'], value);
},
'convert_s': {
'i32': function(value) {
return Module['_BinaryenUnary'](module, Module['ConvertSInt32ToFloat64'], value);
},
'i64': function(value) {
return Module['_BinaryenUnary'](module, Module['ConvertSInt64ToFloat64'], value);
},
},
'convert_u': {
'i32': function(value) {
return Module['_BinaryenUnary'](module, Module['ConvertUInt32ToFloat64'], value);
},
'i64': function(value) {
return Module['_BinaryenUnary'](module, Module['ConvertUInt64ToFloat64'], value);
},
},
'promote': function(value) {
return Module['_BinaryenUnary'](module, Module['PromoteFloat32'], value);
},
'add': function(left, right) {
return Module['_BinaryenBinary'](module, Module['AddFloat64'], left, right);
},
'sub': function(left, right) {
return Module['_BinaryenBinary'](module, Module['SubFloat64'], left, right);
},
'mul': function(left, right) {
return Module['_BinaryenBinary'](module, Module['MulFloat64'], left, right);
},
'div': function(left, right) {
return Module['_BinaryenBinary'](module, Module['DivFloat64'], left, right);
},
'copysign': function(left, right) {
return Module['_BinaryenBinary'](module, Module['CopySignFloat64'], left, right);
},
'min': function(left, right) {
return Module['_BinaryenBinary'](module, Module['MinFloat64'], left, right);
},
'max': function(left, right) {
return Module['_BinaryenBinary'](module, Module['MaxFloat64'], left, right);
},
'eq': function(left, right) {
return Module['_BinaryenBinary'](module, Module['EqFloat64'], left, right);
},
'ne': function(left, right) {
return Module['_BinaryenBinary'](module, Module['NeFloat64'], left, right);
},
'lt': function(left, right) {
return Module['_BinaryenBinary'](module, Module['LtFloat64'], left, right);
},
'le': function(left, right) {
return Module['_BinaryenBinary'](module, Module['LeFloat64'], left, right);
},
'gt': function(left, right) {
return Module['_BinaryenBinary'](module, Module['GtFloat64'], left, right);
},
'ge': function(left, right) {
return Module['_BinaryenBinary'](module, Module['GeFloat64'], left, right);
},
};
this['select'] = function(condition, ifTrue, ifFalse) {
return Module['_BinaryenSelect'](module, condition, ifTrue, ifFalse);
};
this['drop'] = function(value) {
return Module['_BinaryenDrop'](module, value);
};
this['return'] = function(value) {
return Module['_BinaryenReturn'](module, value);
};
this['host'] = function(op, name, operands) {
if (!operands) operands = [];
return preserveStack(function() {
return Module['_BinaryenHost'](module, op, strToStack(name), i32sToStack(operands), operands.length);
});
};
this['nop'] = function() {
return Module['_BinaryenNop'](module);
};
this['unreachable'] = function() {
return Module['_BinaryenUnreachable'](module);
};
this['wake'] = function(ptr, wakeCount) {
return Module['_BinaryenAtomicWake'](module, ptr, wakeCount);
};
// 'Module' operations
this['addFunctionType'] = function(name, result, paramTypes) {
if (!paramTypes) paramTypes = [];
return preserveStack(function() {
return Module['_BinaryenAddFunctionType'](module, strToStack(name), result,
i32sToStack(paramTypes), paramTypes.length);
});
};
this['getFunctionTypeBySignature'] = function(result, paramTypes) {
if (!paramTypes) paramTypes = [];
return preserveStack(function() {
return Module['_BinaryenGetFunctionTypeBySignature'](module, result,
i32sToStack(paramTypes), paramTypes.length);
});
};
this['addFunction'] = function(name, functionType, varTypes, body) {
return preserveStack(function() {
return Module['_BinaryenAddFunction'](module, strToStack(name), functionType, i32sToStack(varTypes), varTypes.length, body);
});
};
this['getFunction'] = function(name) {
return preserveStack(function() {
return Module['_BinaryenGetFunction'](module, strToStack(name));
});
};
this['removeFunction'] = function(name) {
return preserveStack(function() {
return Module['_BinaryenRemoveFunction'](module, strToStack(name));
});
};
this['addGlobal'] = function(name, type, mutable, init) {
return preserveStack(function() {
return Module['_BinaryenAddGlobal'](module, strToStack(name), type, mutable, init);
});
}
this['addImport'] = // deprecated
this['addFunctionImport'] = function(internalName, externalModuleName, externalBaseName, functionType) {
return preserveStack(function() {
return Module['_BinaryenAddFunctionImport'](module, strToStack(internalName), strToStack(externalModuleName), strToStack(externalBaseName), functionType);
});
};
this['addTableImport'] = function(internalName, externalModuleName, externalBaseName) {
return preserveStack(function() {
return Module['_BinaryenAddTableImport'](module, strToStack(internalName), strToStack(externalModuleName), strToStack(externalBaseName));
});
};
this['addMemoryImport'] = function(internalName, externalModuleName, externalBaseName) {
return preserveStack(function() {
return Module['_BinaryenAddMemoryImport'](module, strToStack(internalName), strToStack(externalModuleName), strToStack(externalBaseName));
});
};
this['addGlobalImport'] = function(internalName, externalModuleName, externalBaseName, globalType) {
return preserveStack(function() {
return Module['_BinaryenAddGlobalImport'](module, strToStack(internalName), strToStack(externalModuleName), strToStack(externalBaseName), globalType);
});
};
this['removeImport'] = function(internalName) {
return preserveStack(function() {
return Module['_BinaryenRemoveImport'](module, strToStack(internalName));
});
};
this['addExport'] = // deprecated
this['addFunctionExport'] = function(internalName, externalName) {
return preserveStack(function() {
return Module['_BinaryenAddFunctionExport'](module, strToStack(internalName), strToStack(externalName));
});
};
this['addTableExport'] = function(internalName, externalName) {
return preserveStack(function() {
return Module['_BinaryenAddTableExport'](module, strToStack(internalName), strToStack(externalName));
});
};
this['addMemoryExport'] = function(internalName, externalName) {
return preserveStack(function() {
return Module['_BinaryenAddMemoryExport'](module, strToStack(internalName), strToStack(externalName));
});
};
this['addGlobalExport'] = function(internalName, externalName) {
return preserveStack(function() {
return Module['_BinaryenAddGlobalExport'](module, strToStack(internalName), strToStack(externalName));
});
};
this['removeExport'] = function(externalName) {
return preserveStack(function() {
return Module['_BinaryenRemoveExport'](module, strToStack(externalName));
});
};
this['setFunctionTable'] = function(funcs) {
return preserveStack(function() {
return Module['_BinaryenSetFunctionTable'](module, i32sToStack(funcs), funcs.length);
});
};
this['setMemory'] = function(initial, maximum, exportName, segments) {
// segments are assumed to be { offset: expression ref, data: array of 8-bit data }
if (!segments) segments = [];
return preserveStack(function() {
return Module['_BinaryenSetMemory'](
module, initial, maximum, strToStack(exportName),
i32sToStack(
segments.map(function(segment) {
return allocate(segment.data, 'i8', ALLOC_STACK);
})
),
i32sToStack(
segments.map(function(segment) {
return segment.offset;
})
),
i32sToStack(
segments.map(function(segment) {
return segment.data.length;
})
),
segments.length
);
});
};
this['setStart'] = function(start) {
return Module['_BinaryenSetStart'](module, start);
};
this['emitText'] = function() {
var old = Module['print'];
var ret = '';
Module['print'] = function(x) { ret += x + '\n' };
Module['_BinaryenModulePrint'](module);
Module['print'] = old;
return ret;
};
this['emitAsmjs'] = function() {
var old = Module['print'];
var ret = '';
Module['print'] = function(x) { ret += x + '\n' };
Module['_BinaryenModulePrintAsmjs'](module);
Module['print'] = old;
return ret;
};
this['validate'] = function() {
return Module['_BinaryenModuleValidate'](module);
};
this['optimize'] = function() {
return Module['_BinaryenModuleOptimize'](module);
};
this['optimizeFunction'] = function(func) {
if (typeof func === "string") func = this['getFunction'](func);
return Module['_BinaryenFunctionOptimize'](func, module);
};
this['runPasses'] = function(passes) {
return preserveStack(function() {
return Module['_BinaryenModuleRunPasses'](module, i32sToStack(
passes.map(strToStack)
), passes.length);
});
};
this['runPassesOnFunction'] = function(func, passes) {
if (typeof func === "string") func = this['getFunction'](func);
return preserveStack(function() {
return Module['_BinaryenFunctionRunPasses'](func, module, i32sToStack(
passes.map(strToStack)
), passes.length);
});
};
this['autoDrop'] = function() {
return Module['_BinaryenModuleAutoDrop'](module);
};
this['dispose'] = function() {
Module['_BinaryenModuleDispose'](module);
};
var MAX = 1024*1024; // TODO: fix this hard-wired limit
var writeBuffer = null;
this['emitBinary'] = function() {
if (!writeBuffer) writeBuffer = _malloc(MAX);
var bytes = Module['_BinaryenModuleWrite'](module, writeBuffer, MAX);
assert(bytes < MAX, 'FIXME: hardcoded limit on module size'); // we should not use the whole buffer
return new Uint8Array(HEAPU8.subarray(writeBuffer, writeBuffer + bytes));
};
this['interpret'] = function() {
return Module['_BinaryenModuleInterpret'](module);
};
};
// 'Relooper' interface
Module['Relooper'] = function(relooper) {
if (!relooper) relooper = Module['_RelooperCreate']();
this.ptr = relooper;
this['addBlock'] = function(code) {
return Module['_RelooperAddBlock'](relooper, code);
};
this['addBranch'] = function(from, to, condition, code) {
return Module['_RelooperAddBranch'](from, to, condition, code);
};
this['addBlockWithSwitch'] = function(code, condition) {
return Module['_RelooperAddBlockWithSwitch'](relooper, code, condition);
};
this['addBranchForSwitch'] = function(from, to, indexes, code) {
return preserveStack(function() {
return Module['_RelooperAddBranchForSwitch'](from, to, i32sToStack(indexes), indexes.length, code);
});
};
this['renderAndDispose'] = function(entry, labelHelper, module) {
return Module['_RelooperRenderAndDispose'](relooper, entry, labelHelper, module['ptr']);
};
};
function getAllNested(ref, numFn, getFn) {
var num = numFn(ref);
var ret = new Array(num);
for (var i = 0; i < num; ++i) ret[i] = getFn(ref, i);
return ret;
}
// Gets the specific id of an 'Expression'
Module['getExpressionId'] = function(expr) {
return Module['_BinaryenExpressionGetId'](expr);
};
// Gets the result type of an 'Expression'
Module['getExpressionType'] = function(expr) {
return Module['_BinaryenExpressionGetType'](expr);
};
// Obtains information about an 'Expression'
Module['getExpressionInfo'] = function(expr) {
var id = Module['_BinaryenExpressionGetId'](expr);
var type = Module['_BinaryenExpressionGetType'](expr);
switch (id) {
case Module['BlockId']:
return {
'id': id,
'type': type,
'name': Pointer_stringify(Module['_BinaryenBlockGetName'](expr)),
'children': getAllNested(expr, Module['_BinaryenBlockGetNumChildren'], Module['_BinaryenBlockGetChild'])
};
case Module['IfId']:
return {
'id': id,
'type': type,
'condition': Module['_BinaryenIfGetCondition'](expr),
'ifTrue': Module['_BinaryenIfGetIfTrue'](expr),
'ifFalse': Module['_BinaryenIfGetIfFalse'](expr)
};
case Module['LoopId']:
return {
'id': id,
'type': type,
'name': Pointer_stringify(Module['_BinaryenLoopGetName'](expr)),
'body': Module['_BinaryenLoopGetBody'](expr)
};
case Module['BreakId']:
return {
'id': id,
'type': type,
'name': Pointer_stringify(Module['_BinaryenBreakGetName'](expr)),
'condition': Module['_BinaryenBreakGetCondition'](expr),
'value': Module['_BinaryenBreakGetValue'](expr)
};
case Module['SwitchId']:
return {
'id': id,
'type': type,
'names': getAllNested(expr, Module['_BinaryenSwitchGetNumNames'], Module['_BinaryenSwitchGetName']).map(Pointer_stringify),
'defaultName': Pointer_stringify(Module['_BinaryenSwitchGetDefaultName'](expr)),
'condition': Module['_BinaryenSwitchGetCondition'](expr),
'value': Module['_BinaryenSwitchGetValue'](expr)
};
case Module['CallId']:
return {
'id': id,
'type': type,
'target': Pointer_stringify(Module['_BinaryenCallGetTarget'](expr)),
'operands': getAllNested(expr, Module[ '_BinaryenCallGetNumOperands'], Module['_BinaryenCallGetOperand'])
};
case Module['CallImportId']:
return {
'id': id,
'type': type,
'target': Pointer_stringify(Module['_BinaryenCallImportGetTarget'](expr)),
'operands': getAllNested(expr, Module['_BinaryenCallImportGetNumOperands'], Module['_BinaryenCallImportGetOperand']),
};
case Module['CallIndirectId']:
return {
'id': id,
'type': type,
'target': Module['_BinaryenCallIndirectGetTarget'](expr),
'operands': getAllNested(expr, Module['_BinaryenCallIndirectGetNumOperands'], Module['_BinaryenCallIndirectGetOperand'])
};
case Module['GetLocalId']:
return {
'id': id,
'type': type,
'index': Module['_BinaryenGetLocalGetIndex'](expr)
};
case Module['SetLocalId']:
return {
'id': id,
'type': type,
'isTee': Boolean(Module['_BinaryenSetLocalIsTee'](expr)),
'index': Module['_BinaryenSetLocalGetIndex'](expr),
'value': Module['_BinaryenSetLocalGetValue'](expr)
};
case Module['GetGlobalId']:
return {
'id': id,
'type': type,
'name': Pointer_stringify(Module['_BinaryenGetGlobalGetName'](expr))
};
case Module['SetGlobalId']:
return {
'id': id,
'type': type,
'name': Pointer_stringify(Module['_BinaryenSetGlobalGetName'](expr)),
'value': Module['_BinaryenSetGlobalGetValue'](expr)
};
case Module['LoadId']:
return {
'id': id,
'type': type,
'isAtomic': Boolean(Module['_BinaryenLoadIsAtomic'](expr)),
'isSigned': Boolean(Module['_BinaryenLoadIsSigned'](expr)),
'offset': Module['_BinaryenLoadGetOffset'](expr),
'bytes': Module['_BinaryenLoadGetBytes'](expr),
'align': Module['_BinaryenLoadGetAlign'](expr),
'ptr': Module['_BinaryenLoadGetPtr'](expr)
};
case Module['StoreId']:
return {
'id': id,
'type': type,
'isAtomic': Boolean(Module['_BinaryenStoreIsAtomic'](expr)),
'offset': Module['_BinaryenStoreGetOffset'](expr),
'bytes': Module['_BinaryenStoreGetBytes'](expr),
'align': Module['_BinaryenStoreGetAlign'](expr),
'ptr': Module['_BinaryenStoreGetPtr'](expr),
'value': Module['_BinaryenStoreGetValue'](expr)
};
case Module['ConstId']: {
var value;
switch (type) {
case Module['i32']: value = Module['_BinaryenConstGetValueI32'](expr); break;
case Module['i64']: value = { 'low': Module['_BinaryenConstGetValueI64Low'](expr), 'high': Module['_BinaryenConstGetValueI64High'](expr) }; break;
case Module['f32']: value = Module['_BinaryenConstGetValueF32'](expr); break;
case Module['f64']: value = Module['_BinaryenConstGetValueF64'](expr); break;
default: throw Error('unexpected type: ' + type);
}
return {
'id': id,
'type': type,
'value': value
};
}
case Module['UnaryId']:
return {
'id': id,
'type': type,
'op': Module['_BinaryenUnaryGetOp'](expr),
'value': Module['_BinaryenUnaryGetValue'](expr)
};
case Module['BinaryId']:
return {
'id': id,
'type': type,
'op': Module['_BinaryenBinaryGetOp'](expr),
'left': Module['_BinaryenBinaryGetLeft'](expr),
'right': Module['_BinaryenBinaryGetRight'](expr)
};
case Module['SelectId']:
return {
'id': id,
'type': type,
'ifTrue': Module['_BinaryenSelectGetIfTrue'](expr),
'ifFalse': Module['_BinaryenSelectGetIfFalse'](expr),
'condition': Module['_BinaryenSelectGetCondition'](expr)
};
case Module['DropId']:
return {
'id': id,
'type': type,
'value': Module['_BinaryenDropGetValue'](expr)
};
case Module['ReturnId']:
return {
'id': id,
'type': type,
'value': Module['_BinaryenReturnGetValue'](expr)
};
case Module['NopId']:
case Module['UnreachableId']:
return {
'id': id,
'type': type
};
case Module['HostId']:
return {
'id': id,
'type': type,
'op': Module['_BinaryenHostGetOp'](expr),
'nameOperand': Pointer_stringify(Module['_BinaryenHostGetNameOperand'](expr)),
'operands': getAllNested(expr, Module['_BinaryenHostGetNumOperands'], Module['_BinaryenHostGetOperand'])
};
case Module['AtomicRMWId']:
return {
'id': id,
'type': type,
'op': Module['_BinaryenAtomicRMWGetOp'](expr),
'bytes': Module['_BinaryenAtomicRMWGetBytes'](expr),
'offset': Module['_BinaryenAtomicRMWGetOffset'](expr),
'ptr': Module['_BinaryenAtomicRMWGetPtr'](expr),
'value': Module['_BinaryenAtomicRMWGetValue'](expr)
};
case Module['AtomicCmpxchgId']:
return {
'id': id,
'type': type,
'bytes': Module['_BinaryenAtomicCmpxchgGetBytes'](expr),
'offset': Module['_BinaryenAtomicCmpxchgGetOffset'](expr),
'ptr': Module['_BinaryenAtomicCmpxchgGetPtr'](expr),
'expected': Module['_BinaryenAtomicCmpxchgGetExpected'](expr),
'replacement': Module['_BinaryenAtomicCmpxchgGetReplacement'](expr)
};
case Module['AtomicWaitId']:
return {
'id': id,
'type': type,
'ptr': Module['_BinaryenAtomicWaitGetPtr'](expr),
'expected': Module['_BinaryenAtomicWaitGetExpected'](expr),
'timeout': Module['_BinaryenAtomicWaitGetTimeout'](expr),
'expectedType': Module['_BinaryenAtomicWaitGetExpectedType'](expr)
};
case Module['AtomicWakeId']:
return {
'id': id,
'type': type,
'ptr': Module['_BinaryenAtomicWakeGetPtr'](expr),
'wakeCount': Module['_BinaryenAtomicWakeGetWakeCount'](expr)
};
default:
throw Error('unexpected id: ' + id);
}
};
// Obtains information about a 'FunctionType'
Module['getFunctionTypeInfo'] = function(func) {
return {
'name': Module['_BinaryenFunctionTypeGetName'](func),
'params': getAllNested(func, Module['_BinaryenFunctionTypeGetNumParams'], Module['_BinaryenFunctionTypeGetParam']),
'result': Module['_BinaryenFunctionTypeGetResult'](func)
};
};
// Obtains information about a 'Function'
Module['getFunctionInfo'] = function(func) {
return {
'name': Module['_BinaryenFunctionGetName'](func),
'type': Module['_BinaryenFunctionGetType'](func),
'params': getAllNested(func, Module['_BinaryenFunctionGetNumParams'], Module['_BinaryenFunctionGetParam']),
'result': Module['_BinaryenFunctionGetResult'](func),
'vars': getAllNested(func, Module['_BinaryenFunctionGetNumVars'], Module['_BinaryenFunctionGetVar']),
'body': Module['_BinaryenFunctionGetBody'](func)
};
};
// Obtains information about an 'Import'
Module['getImportInfo'] = function(import_) {
return {
'kind': Module['_BinaryenImportGetKind'](import_),
'module': Pointer_stringify(Module['_BinaryenImportGetModule'](import_)),
'base': Pointer_stringify(Module['_BinaryenImportGetBase'](import_)),
'name': Pointer_stringify(Module['_BinaryenImportGetName'](import_)),
'globalType': Module['_BinaryenImportGetGlobalType'](import_),
'functionType': Pointer_stringify(Module['_BinaryenImportGetFunctionType'](import_))
};
};
// Obtains information about an 'Export'
Module['getExportInfo'] = function(export_) {
return {
'kind': Module['_BinaryenExportGetKind'](export_),
'name': Pointer_stringify(Module['_BinaryenExportGetName'](export_)),
'value': Pointer_stringify(Module['_BinaryenExportGetValue'](export_))
};
};
// Emits text format of an expression or a module
Module['emitText'] = function(expr) {
if (typeof expr === 'object') {
return expr.emitText();
}
var old = Module['print'];
var ret = '';
Module['print'] = function(x) { ret += x + '\n' };
Module['_BinaryenExpressionPrint'](expr);
Module['print'] = old;
return ret;
};
// Parses a binary to a module
Module['readBinary'] = function(data) {
var buffer = allocate(data, 'i8', ALLOC_NORMAL);
var ptr = Module['_BinaryenModuleRead'](buffer, data.length);
_free(buffer);
return new Module['Module'](ptr);
};
// Parses text format to a module
Module['parseText'] = function(text) {
var buffer = _malloc(text.length + 1);
writeAsciiToMemory(text, buffer);
var ptr = Module['_BinaryenModuleParse'](buffer);
_free(buffer);
return new Module['Module'](ptr);
};
// Enables or disables C-API tracing
Module['setAPITracing'] = function(on) {
return Module['_BinaryenSetAPITracing'](on);
};
// Support AMD-compatible loaders by defining a factory function that returns 'Module'
if (typeof define === 'function' && define['amd'])
define(function() { return Module; });
// Support CommonJS-compatible loaders by checking for 'require' and 'module.exports'
else if (typeof require === 'function' && typeof module !== 'undefined' && module && module.exports)
module.exports = Module;
// Otherwise expose as 'Binaryen' globally checking for common names of the global object
// first (namely 'global' and 'window') and fall back to 'this' (i.e. within web workers).
else
(typeof global !== 'undefined' && global ||
typeof window !== 'undefined' && window ||
this)['Binaryen'] = Module;
})();