diff --git a/src/builtins.ts b/src/builtins.ts index 7360edef..ee94c16a 100644 --- a/src/builtins.ts +++ b/src/builtins.ts @@ -61,7 +61,8 @@ import { Field, Global, DecoratorFlags, - Local + Local, + Program } from "./program"; import { @@ -4084,8 +4085,8 @@ export function compileIterateRoots(compiler: Compiler): void { ); } -function typedArraySymbolToType(symbol: string): Type | null { - switch (symbol) { +function determineTypedArrayType(target: Class, program: Program): Type | null { + switch (target.internalName) { case BuiltinSymbols.Int8Array: return Type.i8; case BuiltinSymbols.Uint8ClampedArray: case BuiltinSymbols.Uint8Array: return Type.u8; @@ -4098,32 +4099,21 @@ function typedArraySymbolToType(symbol: string): Type | null { case BuiltinSymbols.Float32Array: return Type.f32; case BuiltinSymbols.Float64Array: return Type.f64; } + var typeArguments = target.typeArguments; + if (typeArguments && typeArguments.length == 1) { + return typeArguments[0]; // Array, TypedArray + } return null; } -export function compileArrayGet( +export function compileBuiltinArrayGet( compiler: Compiler, target: Class, thisExpression: Expression, elementExpression: Expression, contextualType: Type ): ExpressionRef { - var type = typedArraySymbolToType(target.internalName); - if (!type) { - assert(target.prototype == compiler.program.arrayPrototype); - type = assert(target.typeArguments)[0]; - } - return compileTypedArrayGet(compiler, target, type, thisExpression, elementExpression, contextualType); -} - -function compileTypedArrayGet( - compiler: Compiler, - target: Class, - type: Type, - thisExpression: Expression, - elementExpression: Expression, - contextualType: Type -): ExpressionRef { + var type = assert(determineTypedArrayType(target, compiler.program)); var module = compiler.module; var outType = ( type.is(TypeFlags.INTEGER) && @@ -4133,80 +4123,134 @@ function compileTypedArrayGet( var dataStart = assert(target.lookupInSelf("dataStart")); assert(dataStart.kind == ElementKind.FIELD); - var dataEnd = assert(target.lookupInSelf("dataEnd")); - assert(dataEnd.kind == ElementKind.FIELD); + var dataLength = assert(target.lookupInSelf("dataLength")); + assert(dataLength.kind == ElementKind.FIELD); - var constantOffset: i32 = 0; - var dynamicOffset = module.precomputeExpression(compiler.compileExpression( + // compile the index expression and shift it to become the actual byteOffset + var dynamicOffset = compiler.compileExpression( elementExpression, Type.i32, ConversionKind.IMPLICIT, WrapMode.NONE - )); - if (getExpressionId(dynamicOffset) == ExpressionId.Const) { - constantOffset = getConstValueI32(dynamicOffset); - dynamicOffset = 0; - } else if (getExpressionId(dynamicOffset) == ExpressionId.Binary) { - if (getBinaryOp(dynamicOffset) == BinaryOp.AddI32) { - let left = getBinaryLeft(dynamicOffset); - let right = getBinaryRight(dynamicOffset); - if (getExpressionId(left) == ExpressionId.Const) { - constantOffset = getConstValueI32(left); - dynamicOffset = right; - } else if (getExpressionId(right) == ExpressionId.Const) { - constantOffset = getConstValueI32(right); - dynamicOffset = left; - } - } + ); + var alignLog2 = type.alignLog2; + if (alignLog2) { + dynamicOffset = module.createBinary(BinaryOp.ShlI32, + dynamicOffset, + module.createI32(alignLog2) + ); } + var flow = compiler.currentFlow; var usizeType = compiler.options.usizeType; var nativeSizeType = compiler.options.nativeSizeType; - var dataStartExpr = module.createLoad(usizeType.byteSize, true, - compiler.compileExpression( - thisExpression, - target.type, - ConversionKind.IMPLICIT, - WrapMode.NONE - ), - nativeSizeType, (dataStart).memoryOffset - ); + var isUnchecked = flow.is(FlowFlags.UNCHECKED_CONTEXT); + var ptrExpr: ExpressionRef; + var constantOffset: i32 = 0; - var typeAlignLog2 = type.alignLog2; - constantOffset <<= typeAlignLog2; - if (dynamicOffset) { - if (typeAlignLog2) { - dynamicOffset = module.createBinary(BinaryOp.ShlI32, - dynamicOffset, - module.createI32(typeAlignLog2) - ); + if (isUnchecked) { + // precompute byteOffset into a constant and a dynamic part + dynamicOffset = module.precomputeExpression(dynamicOffset); + if (getExpressionId(dynamicOffset) == ExpressionId.Const) { + constantOffset = getConstValueI32(dynamicOffset); + dynamicOffset = 0; + } else if (getExpressionId(dynamicOffset) == ExpressionId.Binary) { + if (getBinaryOp(dynamicOffset) == BinaryOp.AddI32) { + let left = getBinaryLeft(dynamicOffset); + let right = getBinaryRight(dynamicOffset); + if (getExpressionId(left) == ExpressionId.Const) { + constantOffset = getConstValueI32(left); + dynamicOffset = right; + } else if (getExpressionId(right) == ExpressionId.Const) { + constantOffset = getConstValueI32(right); + dynamicOffset = left; + } + } } + // ptr = this.dataStart + ptrExpr = module.createLoad(usizeType.byteSize, true, + compiler.compileExpression( + thisExpression, + target.type, + ConversionKind.IMPLICIT, + WrapMode.NONE + ), + nativeSizeType, (dataStart).memoryOffset + ); + // ptr = ptr + dynamicOffset + if (dynamicOffset) { + if (nativeSizeType == NativeType.I64) { + ptrExpr = module.createBinary(BinaryOp.AddI64, + ptrExpr, + module.createUnary(UnaryOp.ExtendU32, dynamicOffset) + ); + } else { + ptrExpr = module.createBinary(BinaryOp.AddI32, + ptrExpr, + dynamicOffset + ); + } + } + + } else /* checked */ { + let tempThis = flow.getTempLocal(usizeType, false); + let tempOffset = flow.getAndFreeTempLocal(Type.i32, false); + flow.freeTempLocal(tempThis); + + // ptr = (tempThis = this).dataStart + ptrExpr = module.createLoad(usizeType.byteSize, true, + module.createTeeLocal(tempThis.index, + compiler.compileExpression( + thisExpression, + target.type, + ConversionKind.IMPLICIT, + WrapMode.NONE + ) + ), + nativeSizeType, (dataStart).memoryOffset + ); + + // ptr = ptr + (tempOffset = dynamicOffset) if (nativeSizeType == NativeType.I64) { - dataStartExpr = module.createBinary(BinaryOp.AddI64, - dataStartExpr, - module.createUnary(UnaryOp.ExtendU32, dynamicOffset) + ptrExpr = module.createBinary(BinaryOp.AddI64, + ptrExpr, + module.createUnary(UnaryOp.ExtendU32, + module.createTeeLocal(tempOffset.index, dynamicOffset) + ) ); } else { - dataStartExpr = module.createBinary(BinaryOp.AddI32, - dataStartExpr, - dynamicOffset + ptrExpr = module.createBinary(BinaryOp.AddI32, + ptrExpr, + module.createTeeLocal(tempOffset.index, dynamicOffset) ); } - } - // TODO: check offset + // ptr = select(ptr, -1, tempOffset < tempThis.dataLength) + // triggers "RuntimeError: memory access out of bounds" if OOB + ptrExpr = module.createSelect( + ptrExpr, + usizeType.toNativeNegOne(module), + module.createBinary(BinaryOp.LtU32, + module.createGetLocal(tempOffset.index, NativeType.I32), + module.createLoad(4, false, + module.createGetLocal(tempThis.index, nativeSizeType), + NativeType.I32, (dataLength).memoryOffset + ) + ) + ); + } compiler.currentType = outType; return module.createLoad( type.byteSize, type.is(TypeFlags.SIGNED), - dataStartExpr, + ptrExpr, outType.toNativeType(), constantOffset ); } -export function compileArraySet( +export function compileBuiltinArraySet( compiler: Compiler, target: Class, thisExpression: Expression, @@ -4214,38 +4258,49 @@ export function compileArraySet( valueExpression: Expression, contextualType: Type ): ExpressionRef { - var program = compiler.program; - var type = typedArraySymbolToType(target.internalName); - if (!type) { - assert(target.prototype == program.arrayPrototype); - type = assert(target.typeArguments)[0]; - } - return compileTypedArraySet( + var type = assert(determineTypedArrayType(target, compiler.program)); + return compileBuiltinArraySetWithValue( compiler, target, - type, thisExpression, elementExpression, - valueExpression, - contextualType + compiler.compileExpression( + valueExpression, + type.is(TypeFlags.INTEGER | TypeFlags.VALUE) + ? type.is(TypeFlags.LONG) + ? type.is(TypeFlags.SIGNED) + ? Type.i64 + : Type.u64 + : type.is(TypeFlags.SIGNED) + ? Type.i32 + : Type.u32 + : type, + ConversionKind.IMPLICIT, + WrapMode.NONE + ), + contextualType != Type.void ); } -function compileTypedArraySet( +export function compileBuiltinArraySetWithValue( compiler: Compiler, target: Class, - type: Type, thisExpression: Expression, elementExpression: Expression, - valueExpression: Expression, - contextualType: Type + valueExpr: ExpressionRef, + tee: bool ): ExpressionRef { + + // TODO: check offset + + var program = compiler.program; + var type = assert(determineTypedArrayType(target, compiler.program)); var module = compiler.module; var dataStart = assert(target.lookupInSelf("dataStart")); assert(dataStart.kind == ElementKind.FIELD); - var dataEnd = assert(target.lookupInSelf("dataEnd")); - assert(dataEnd.kind == ElementKind.FIELD); + var dataLength = assert(target.lookupInSelf("dataLength")); + assert(dataLength.kind == ElementKind.FIELD); var constantOffset: i32 = 0; var dynamicOffset = module.precomputeExpression( @@ -4313,21 +4368,6 @@ function compileTypedArraySet( } } - var valueExpr = compiler.compileExpression( - valueExpression, - type.is(TypeFlags.INTEGER | TypeFlags.VALUE) - ? type.is(TypeFlags.LONG) - ? type.is(TypeFlags.SIGNED) - ? Type.i64 - : Type.u64 - : type.is(TypeFlags.SIGNED) - ? Type.i32 - : Type.u32 - : type, - ConversionKind.IMPLICIT, - WrapMode.NONE - ); - // handle Array: value = LINK(value, this), value if (typeIsManaged) { let program = compiler.program; @@ -4379,9 +4419,7 @@ function compileTypedArraySet( var nativeType = type.toNativeType(); - // TODO: check offset - - if (contextualType == Type.void) { + if (!tee) { compiler.currentType = Type.void; return module.createStore( type.byteSize, diff --git a/src/compiler.ts b/src/compiler.ts index b70a19ee..37f48f14 100644 --- a/src/compiler.ts +++ b/src/compiler.ts @@ -9,8 +9,9 @@ import { compileIterateRoots, ensureGCHook, BuiltinSymbols, - compileArrayGet, - compileArraySet + compileBuiltinArrayGet, + compileBuiltinArraySet, + compileBuiltinArraySetWithValue } from "./builtins"; import { @@ -4706,7 +4707,7 @@ export class Compiler extends DiagnosticEmitter { let arrayBufferView = this.program.arrayBufferViewInstance; if (arrayBufferView) { if ((target).prototype.extends(arrayBufferView.prototype)) { - return compileArraySet( + return compileBuiltinArraySet( this, target, assert(this.resolver.currentThisExpression), @@ -4939,6 +4940,19 @@ export class Compiler extends DiagnosticEmitter { case ElementKind.CLASS: { let elementExpression = this.resolver.currentElementExpression; if (elementExpression) { + let arrayBufferView = this.program.arrayBufferViewInstance; + if (arrayBufferView) { + if ((target).prototype.extends(arrayBufferView.prototype)) { + return compileBuiltinArraySetWithValue( + this, + target, + assert(this.resolver.currentThisExpression), + elementExpression, + valueWithCorrectType, + tee + ); + } + } let isUnchecked = flow.is(FlowFlags.UNCHECKED_CONTEXT); let indexedGet = (target).lookupOverload(OperatorKind.INDEXED_GET, isUnchecked); if (!indexedGet) { @@ -5946,21 +5960,21 @@ export class Compiler extends DiagnosticEmitter { if (!target) return this.module.createUnreachable(); switch (target.kind) { case ElementKind.CLASS: { + let arrayBufferView = this.program.arrayBufferViewInstance; + if (arrayBufferView) { + if ((target).prototype.extends(arrayBufferView.prototype)) { + return compileBuiltinArrayGet( + this, + target, + expression.expression, + expression.elementExpression, + contextualType + ); + } + } let isUnchecked = this.currentFlow.is(FlowFlags.UNCHECKED_CONTEXT); let indexedGet = (target).lookupOverload(OperatorKind.INDEXED_GET, isUnchecked); if (!indexedGet) { - let arrayBufferView = this.program.arrayBufferViewInstance; - if (arrayBufferView) { - if ((target).prototype.extends(arrayBufferView.prototype)) { - return compileArrayGet( - this, - target, - expression.expression, - expression.elementExpression, - contextualType - ); - } - } this.error( DiagnosticCode.Index_signature_is_missing_in_type_0, expression.expression.range, (target).internalName @@ -6570,7 +6584,7 @@ export class Compiler extends DiagnosticEmitter { assert(!program.options.isWasm64); // TODO assert(arrayInstance.writeField("data", bufferAddress32, buf, runtimeHeaderSize)); assert(arrayInstance.writeField("dataStart", bufferAddress32, buf, runtimeHeaderSize)); - assert(arrayInstance.writeField("dataEnd", bufferAddress32 + bufferLength, buf, runtimeHeaderSize)); + assert(arrayInstance.writeField("dataLength", bufferLength, buf, runtimeHeaderSize)); assert(arrayInstance.writeField("length_", arrayLength, buf, runtimeHeaderSize)); return this.addMemorySegment(buf); diff --git a/std/assembly/array.ts b/std/assembly/array.ts index 975065de..f878692e 100644 --- a/std/assembly/array.ts +++ b/std/assembly/array.ts @@ -4,6 +4,22 @@ import { COMPARATOR, SORT } from "./util/sort"; import { itoa, dtoa, itoa_stream, dtoa_stream, MAX_DOUBLE_LENGTH } from "./util/number"; import { isArray as builtin_isArray } from "./builtins"; +/** Ensures that the given array has _at least_ the specified length. */ +function ensureLength(array: ArrayBufferView, length: i32, alignLog2: u32): void { + var oldData = array.data; + var oldCapacity = oldData.byteLength >>> alignLog2; + if (length > oldCapacity) { + if (length > (MAX_BYTELENGTH >>> alignLog2)) throw new RangeError("Invalid array length"); + let newByteLength = length << alignLog2; + let newData = REALLOCATE(changetype(oldData), newByteLength); // registers on move + if (newData !== changetype(oldData)) { + array.data = changetype(newData); // links + array.dataStart = newData; + array.dataLength = newByteLength; + } + } +} + export class Array extends ArrayBufferView { private length_: i32; @@ -25,26 +41,10 @@ export class Array extends ArrayBufferView { } set length(length: i32) { - this.resize(length); + ensureLength(changetype(this), length, alignof()); this.length_ = length; } - private resize(length: i32): void { - var oldData = this.data; - var oldCapacity = oldData.byteLength >>> alignof(); - if (length > oldCapacity) { - const MAX_LENGTH = MAX_BYTELENGTH >>> alignof(); - if (length > MAX_LENGTH) throw new RangeError("Invalid array length"); - let newCapacity = length << alignof(); - let newData = REALLOCATE(changetype(oldData), newCapacity); // registers on move - if (newData !== changetype(oldData)) { - this.data = changetype(newData); // links - this.dataStart = newData; - this.dataEnd = newData + newCapacity; - } - } - } - every(callbackfn: (element: T, index: i32, array: Array) => bool): bool { for (let index = 0, length = this.length_; index < min(length, this.length_); ++index) { if (!callbackfn(load(this.dataStart + (index << alignof())), index, this)) return false; @@ -59,33 +59,14 @@ export class Array extends ArrayBufferView { return -1; } - // @operator("[]") - // private __get(index: i32): T { - // var buffer = this.buffer_; - // return index < (buffer.byteLength >>> alignof()) - // ? LOAD(buffer, index) - // : unreachable(); - // } - - // @operator("{}") - // private __unchecked_get(index: i32): T { - // return LOAD(this.buffer_, index); - // } - @operator("[]=") - private __set(index: i32, value: T): void { - this.resize(index + 1); + private __set(index: i32, value: T): void { // unchecked is built-in + ensureLength(changetype(this), index + 1, alignof()); store(this.dataStart + (index << alignof()), value); if (isManaged()) LINK(value, this); if (index >= this.length_) this.length_ = index + 1; } - // @operator("{}=") - // private __unchecked_set(index: i32, value: T): void { - // STORE(this.buffer_, index, value); - // if (isManaged()) __gc_link(changetype(this), changetype(value)); // tslint:disable-line - // } - fill(value: T, start: i32 = 0, end: i32 = i32.MAX_VALUE): this { var dataStart = this.dataStart; var length = this.length_; @@ -138,7 +119,7 @@ export class Array extends ArrayBufferView { push(element: T): i32 { var newLength = this.length_ + 1; - this.resize(newLength); + ensureLength(changetype(this), newLength, alignof()); this.length_ = newLength; store(this.dataStart + ((newLength - 1) << alignof()), element); if (isManaged()) LINK(element, this); @@ -285,7 +266,7 @@ export class Array extends ArrayBufferView { unshift(element: T): i32 { var newLength = this.length_; - this.resize(newLength); + ensureLength(changetype(this), newLength, alignof()); var base = this.dataStart; memory.copy( base + sizeof(), @@ -347,7 +328,7 @@ export class Array extends ArrayBufferView { reverse(): Array { var front = this.dataStart; - var back = this.dataEnd - sizeof(); + var back = this.dataStart + this.dataLength - sizeof(); while (front < back) { let temp = load(front); store(front, load(back)); diff --git a/std/assembly/dataview.ts b/std/assembly/dataview.ts index bf44d415..4c44e944 100644 --- a/std/assembly/dataview.ts +++ b/std/assembly/dataview.ts @@ -5,7 +5,7 @@ export class DataView { private data: ArrayBuffer; private dataStart: usize; - private dataEnd: usize; + private dataLength: u32; constructor( buffer: ArrayBuffer, @@ -18,7 +18,7 @@ export class DataView { this.data = buffer; // links var dataStart = changetype(buffer) + byteOffset; this.dataStart = dataStart; - this.dataEnd = dataStart + byteLength; + this.dataLength = byteLength; } get buffer(): ArrayBuffer { @@ -30,169 +30,129 @@ export class DataView { } get byteLength(): i32 { - return (this.dataEnd - this.dataStart); + return this.dataLength; } getFloat32(byteOffset: i32, littleEndian: boolean = false): f32 { - var dataStart = this.dataStart; - var dataOffset = dataStart + byteOffset; - if (dataOffset + 4 > this.dataEnd) throw new Error("Offset out of bounds"); + if (byteOffset + 4 > this.dataLength) throw new Error("Offset out of bounds"); return littleEndian - ? load(dataOffset) + ? load(this.dataStart + byteOffset) : reinterpret( bswap( - load(dataOffset) + load(this.dataStart + byteOffset) ) ); } getFloat64(byteOffset: i32, littleEndian: boolean = false): f64 { - var dataStart = this.dataStart; - var dataOffset = dataStart + byteOffset; - if (dataOffset + 4 > this.dataEnd) throw new Error("Offset out of bounds"); + if (byteOffset + 4 > this.dataLength) throw new Error("Offset out of bounds"); return littleEndian - ? load(dataOffset) + ? load(this.dataStart + byteOffset) : reinterpret( bswap( - load(dataOffset) + load(this.dataStart + byteOffset) ) ); } getInt8(byteOffset: i32): i8 { - var dataStart = this.dataStart; - var dataOffset = dataStart + byteOffset; - if (dataOffset >= this.dataEnd) throw new Error("Offset out of bounds"); - return load(dataOffset); + if (byteOffset >= this.dataLength) throw new Error("Offset out of bounds"); + return load(this.dataStart + byteOffset); } getInt16(byteOffset: i32, littleEndian: boolean = false): i16 { - var dataStart = this.dataStart; - var dataOffset = dataStart + byteOffset; - if (dataOffset + 2 > this.dataEnd) throw new Error("Offset out of bounds"); - var result: i16 = load(dataOffset); + if (byteOffset + 2 > this.dataLength) throw new Error("Offset out of bounds"); + var result: i16 = load(this.dataStart + byteOffset); return littleEndian ? result : bswap(result); } getInt32(byteOffset: i32, littleEndian: boolean = false): i32 { - var dataStart = this.dataStart; - var dataOffset = dataStart + byteOffset; - if (dataOffset + 4 > this.dataEnd) throw new Error("Offset out of bounds"); - var result: i32 = load(dataOffset); + if (byteOffset + 4 > this.dataLength) throw new Error("Offset out of bounds"); + var result: i32 = load(this.dataStart + byteOffset); return littleEndian ? result : bswap(result); } getUint8(byteOffset: i32): u8 { - var dataStart = this.dataStart; - var dataOffset = dataStart + byteOffset; - if (dataOffset >= this.dataEnd) throw new Error("Offset out of bounds"); - return load(dataOffset); + if (byteOffset >= this.dataLength) throw new Error("Offset out of bounds"); + return load(this.dataStart + byteOffset); } getUint16(byteOffset: i32, littleEndian: boolean = false): u16 { - var dataStart = this.dataStart; - var dataOffset = dataStart + byteOffset; - if (dataOffset + 2 > this.dataEnd) throw new Error("Offset out of bounds"); - var result: u16 = load(dataOffset); + if (byteOffset + 2 > this.dataLength) throw new Error("Offset out of bounds"); + var result: u16 = load(this.dataStart + byteOffset); return littleEndian ? result : bswap(result); } getUint32(byteOffset: i32, littleEndian: boolean = false): u32 { - var dataStart = this.dataStart; - var dataOffset = dataStart + byteOffset; - if (dataOffset + 2 > this.dataEnd) throw new Error("Offset out of bounds"); - var result: u32 = load(dataOffset); + if (byteOffset + 2 > this.dataLength) throw new Error("Offset out of bounds"); + var result: u32 = load(this.dataStart + byteOffset); return littleEndian ? result : bswap(result); } setFloat32(byteOffset: i32, value: f32, littleEndian: boolean = false): void { - var dataStart = this.dataStart; - var dataOffset = dataStart + byteOffset; - if (dataOffset + 4 > this.dataEnd) throw new Error("Offset out of bounds"); - if (littleEndian) store(dataOffset, value); - else store(dataOffset, bswap(reinterpret(value))); + if (byteOffset + 4 > this.dataLength) throw new Error("Offset out of bounds"); + if (littleEndian) store(this.dataStart + byteOffset, value); + else store(this.dataStart + byteOffset, bswap(reinterpret(value))); } setFloat64(byteOffset: i32, value: f64, littleEndian: boolean = false): void { - var dataStart = this.dataStart; - var dataOffset = dataStart + byteOffset; - if (dataOffset + 4 > this.dataEnd) throw new Error("Offset out of bounds"); - if (littleEndian) store(dataOffset, value); - else store(dataOffset, bswap(reinterpret(value))); + if (byteOffset + 8 > this.dataLength) throw new Error("Offset out of bounds"); + if (littleEndian) store(this.dataStart + byteOffset, value); + else store(this.dataStart + byteOffset, bswap(reinterpret(value))); } setInt8(byteOffset: i32, value: i8): void { - var dataStart = this.dataStart; - var dataOffset = dataStart + byteOffset; - if (dataOffset >= this.dataEnd) throw new Error("Offset out of bounds"); - store(dataOffset, value); + if (byteOffset >= this.dataLength) throw new Error("Offset out of bounds"); + store(this.dataStart + byteOffset, value); } setInt16(byteOffset: i32, value: i16, littleEndian: boolean = false): void { - var dataStart = this.dataStart; - var dataOffset = dataStart + byteOffset; - if (dataOffset + 2 > this.dataEnd) throw new Error("Offset out of bounds"); - store(dataOffset, littleEndian ? value : bswap(value)); + if (byteOffset + 2 > this.dataLength) throw new Error("Offset out of bounds"); + store(this.dataStart + byteOffset, littleEndian ? value : bswap(value)); } setInt32(byteOffset: i32, value: i32, littleEndian: boolean = false): void { - var dataStart = this.dataStart; - var dataOffset = dataStart + byteOffset; - if (dataOffset + 4 > this.dataEnd) throw new Error("Offset out of bounds"); - store(dataOffset, littleEndian ? value : bswap(value)); + if (byteOffset + 4 > this.dataLength) throw new Error("Offset out of bounds"); + store(this.dataStart + byteOffset, littleEndian ? value : bswap(value)); } setUint8(byteOffset: i32, value: u8): void { - var dataStart = this.dataStart; - var dataOffset = dataStart + byteOffset; - if (dataOffset >= this.dataEnd) throw new Error("Offset out of bounds"); - store(dataOffset, value); + if (byteOffset >= this.dataLength) throw new Error("Offset out of bounds"); + store(this.dataStart + byteOffset, value); } setUint16(byteOffset: i32, value: u16, littleEndian: boolean = false): void { - var dataStart = this.dataStart; - var dataOffset = dataStart + byteOffset; - if (dataOffset + 2 > this.dataEnd) throw new Error("Offset out of bounds"); - store(dataOffset, littleEndian ? value : bswap(value)); + if (byteOffset + 2 > this.dataLength) throw new Error("Offset out of bounds"); + store(this.dataStart + byteOffset, littleEndian ? value : bswap(value)); } setUint32(byteOffset: i32, value: u32, littleEndian: boolean = false): void { - var dataStart = this.dataStart; - var dataOffset = dataStart + byteOffset; - if (dataOffset + 4 > this.dataEnd) throw new Error("Offset out of bounds"); - store(dataOffset, littleEndian ? value : bswap(value)); + if (byteOffset + 4 > this.dataLength) throw new Error("Offset out of bounds"); + store(this.dataStart + byteOffset, littleEndian ? value : bswap(value)); } // Non-standard additions that make sense in WebAssembly, but won't work in JS: getInt64(byteOffset: i32, littleEndian: boolean = false): i64 { - var dataStart = this.dataStart; - var dataOffset = dataStart + byteOffset; - if (dataOffset + 8 > this.dataEnd) throw new Error("Offset out of bounds"); - var result: i64 = load(dataOffset); - return littleEndian ? result : bswap(result); + if (byteOffset + 8 > this.dataLength) throw new Error("Offset out of bounds"); + var result: i64 = load(this.dataStart + byteOffset); + return littleEndian ? result : bswap(result); } getUint64(byteOffset: i32, littleEndian: boolean = false): u64 { - var dataStart = this.dataStart; - var dataOffset = dataStart + byteOffset; - if (dataOffset + 8 > this.dataEnd) throw new Error("Offset out of bounds"); - var result = load(dataOffset); - return littleEndian ? result : bswap(result); + if (byteOffset + 8 > this.dataLength) throw new Error("Offset out of bounds"); + var result = load(this.dataStart + byteOffset); + return littleEndian ? result : bswap(result); } setInt64(byteOffset: i32, value: i64, littleEndian: boolean = false): void { - var dataStart = this.dataStart; - var dataOffset = dataStart + byteOffset; - if (dataOffset + 8 > this.dataEnd) throw new Error("Offset out of bounds"); - store(dataOffset, littleEndian ? value : bswap(value)); + if (byteOffset + 8 > this.dataLength) throw new Error("Offset out of bounds"); + store(this.dataStart + byteOffset, littleEndian ? value : bswap(value)); } setUint64(byteOffset: i32, value: u64, littleEndian: boolean = false): void { - var dataStart = this.dataStart; - var dataOffset = dataStart + byteOffset; - if (dataOffset + 8 > this.dataEnd) throw new Error("Offset out of bounds"); - store(dataOffset, littleEndian ? value : bswap(value)); + if (byteOffset + 8 > this.dataLength) throw new Error("Offset out of bounds"); + store(this.dataStart + byteOffset, littleEndian ? value : bswap(value)); } toString(): string { diff --git a/std/assembly/runtime.ts b/std/assembly/runtime.ts index d8fea919..c9326230 100644 --- a/std/assembly/runtime.ts +++ b/std/assembly/runtime.ts @@ -122,6 +122,7 @@ function doReallocate(ref: usize, newPayloadSize: usize): usize { // @ts-ignore: decorator @unsafe @inline export function REGISTER(ref: usize): T { + if (!isReference()) ERROR("reference expected"); return changetype(doRegister(ref, CLASSID())); } @@ -137,6 +138,8 @@ function doRegister(ref: usize, classId: u32): usize { // @ts-ignore: decorator @unsafe @inline export function LINK(ref: T, parentRef: TParent): void { + if (!isReference()) ERROR("reference expected"); + if (!isReference()) ERROR("reference expected"); doLink(changetype(ref), changetype(parentRef)); } @@ -174,7 +177,7 @@ function doWrapArray(buffer: ArrayBuffer, classId: u32, alignLog2: usize): usize var newBuffer = doRegister(doAllocate(bufferSize), classId); changetype(array).data = changetype(newBuffer); // links changetype(array).dataStart = changetype(newBuffer); - changetype(array).dataEnd = changetype(newBuffer) + bufferSize; + changetype(array).dataLength = bufferSize; store(changetype(array), (bufferSize >>> alignLog2), offsetof("length_")); memory.copy(changetype(newBuffer), changetype(buffer), bufferSize); return changetype(array); @@ -217,14 +220,14 @@ export abstract class ArrayBufferView { // @ts-ignore: decorator @unsafe - dataEnd: usize; + dataLength: u32; protected constructor(length: i32, alignLog2: i32) { if (length > MAX_BYTELENGTH >>> alignLog2) throw new RangeError("Invalid length"); var buffer = new ArrayBuffer(length = length << alignLog2); this.data = buffer; this.dataStart = changetype(buffer); - this.dataEnd = changetype(buffer) + length; + this.dataLength = length; } get byteOffset(): i32 { @@ -232,7 +235,7 @@ export abstract class ArrayBufferView { } get byteLength(): i32 { - return (this.dataEnd - this.dataStart); + return this.dataLength; } get length(): i32 { diff --git a/std/assembly/string.ts b/std/assembly/string.ts index 6c242fbc..13ec83c9 100644 --- a/std/assembly/string.ts +++ b/std/assembly/string.ts @@ -366,8 +366,8 @@ import { compareImpl, parse, CharCode, isWhiteSpaceOrLineTerminator } from "./ut charStr, load(changetype(this) + (i << 1)) ); - store(resultStart + (i << alignof()), REGISTER(charStr)); - LINK(charStr, result); + store(resultStart + (i << alignof()), charStr); // result[i] = charStr + LINK(REGISTER(charStr), result); } return result; } else if (!length) { diff --git a/std/assembly/typedarray.ts b/std/assembly/typedarray.ts index ff6170ec..9eb2bead 100644 --- a/std/assembly/typedarray.ts +++ b/std/assembly/typedarray.ts @@ -1,9 +1,9 @@ import { ALLOCATE, REGISTER, LINK, ArrayBufferView } from "./runtime"; import { COMPARATOR, SORT as SORT_IMPL } from "./util/sort"; -function clampToByte(value: i32): i32 { - return ~(value >> 31) & (((255 - value) >> 31) | value); // & 255 -} +// function clampToByte(value: i32): i32 { +// return ~(value >> 31) & (((255 - value) >> 31) | value); // & 255 +// } export class Int8Array extends ArrayBufferView { @@ -809,7 +809,7 @@ function SUBARRAY( var dataStart = array.dataStart; changetype(out).data = data; // links changetype(out).dataStart = dataStart + (begin << alignof()); - changetype(out).dataEnd = dataStart + (end << alignof()); + changetype(out).dataLength = (end - begin) << alignof(); return out; } diff --git a/tests/compiler/std/map.optimized.wat b/tests/compiler/std/map.optimized.wat index 3cefcded..f9cc0a7c 100644 --- a/tests/compiler/std/map.optimized.wat +++ b/tests/compiler/std/map.optimized.wat @@ -123,7 +123,7 @@ if i32.const 0 i32.const 16 - i32.const 188 + i32.const 191 i32.const 2 call $~lib/env/abort unreachable @@ -137,7 +137,7 @@ if i32.const 0 i32.const 16 - i32.const 189 + i32.const 192 i32.const 2 call $~lib/env/abort unreachable diff --git a/tests/compiler/std/map.untouched.wat b/tests/compiler/std/map.untouched.wat index b535ebdd..deb133fb 100644 --- a/tests/compiler/std/map.untouched.wat +++ b/tests/compiler/std/map.untouched.wat @@ -160,7 +160,7 @@ if i32.const 0 i32.const 16 - i32.const 188 + i32.const 191 i32.const 2 call $~lib/env/abort unreachable @@ -175,7 +175,7 @@ if i32.const 0 i32.const 16 - i32.const 189 + i32.const 192 i32.const 2 call $~lib/env/abort unreachable diff --git a/tests/compiler/std/math.optimized.wat b/tests/compiler/std/math.optimized.wat index 0496a5f2..b223702c 100644 --- a/tests/compiler/std/math.optimized.wat +++ b/tests/compiler/std/math.optimized.wat @@ -62,7 +62,7 @@ (memory $0 1) (data (i32.const 8) "\01\00\00\00\16\00\00\00s\00t\00d\00/\00m\00a\00t\00h\00.\00t\00s") (data (i32.const 40) "\02\00\00\00 \00\00\00)\15DNn\83\f9\a2\c0\dd4\f5\d1W\'\fcA\90C<\99\95b\dba\c5\bb\de\abcQ\fe") - (data (i32.const 80) "\03\00\00\00\10\00\00\000\00\00\000\00\00\00P\00\00\00\04") + (data (i32.const 80) "\03\00\00\00\10\00\00\000\00\00\000\00\00\00 \00\00\00\04") (data (i32.const 104) "\01\00\00\00\18\00\00\00~\00l\00i\00b\00/\00m\00a\00t\00h\00.\00t\00s") (table $0 1 funcref) (elem (i32.const 0) $null) @@ -3489,8 +3489,7 @@ (local $7 i32) (local $8 i64) (local $9 i32) - (local $10 i32) - (local $11 i64) + (local $10 i64) local.get $0 i32.reinterpret_f32 local.tee $3 @@ -3782,6 +3781,8 @@ i32.trunc_f64_s br $~lib/math/rempio2f|inlined.0 end + i32.const 92 + i32.load local.get $3 i32.const 23 i32.shr_s @@ -3793,17 +3794,18 @@ local.tee $9 i32.const 3 i32.shl - local.tee $10 - i32.const 92 - i32.load i32.add i64.load - local.set $11 + local.set $10 i32.const 92 i32.load - local.get $10 + local.get $9 + i32.const 1 i32.add - i64.load offset=8 + i32.const 3 + i32.shl + i32.add + i64.load local.set $5 local.get $6 i32.const 63 @@ -3821,10 +3823,12 @@ i32.const 92 i32.load local.get $9 + i32.const 2 + i32.add i32.const 3 i32.shl i32.add - i64.load offset=16 + i64.load i64.const 96 local.get $6 i64.extend_i32_s @@ -3851,7 +3855,7 @@ local.tee $5 i64.sub i64.shr_u - local.get $11 + local.get $10 local.get $5 i64.shl i64.or @@ -9282,8 +9286,7 @@ (local $7 i32) (local $8 i64) (local $9 i32) - (local $10 i32) - (local $11 i64) + (local $10 i64) local.get $0 i32.reinterpret_f32 local.tee $3 @@ -9608,6 +9611,8 @@ i32.trunc_f64_s br $~lib/math/rempio2f|inlined.1 end + i32.const 92 + i32.load local.get $3 i32.const 23 i32.shr_s @@ -9619,17 +9624,18 @@ local.tee $9 i32.const 3 i32.shl - local.tee $10 - i32.const 92 - i32.load i32.add i64.load - local.set $11 + local.set $10 i32.const 92 i32.load - local.get $10 + local.get $9 + i32.const 1 i32.add - i64.load offset=8 + i32.const 3 + i32.shl + i32.add + i64.load local.set $5 local.get $6 i32.const 63 @@ -9647,10 +9653,12 @@ i32.const 92 i32.load local.get $9 + i32.const 2 + i32.add i32.const 3 i32.shl i32.add - i64.load offset=16 + i64.load i64.const 96 local.get $6 i64.extend_i32_s @@ -9677,7 +9685,7 @@ local.tee $5 i64.sub i64.shr_u - local.get $11 + local.get $10 local.get $5 i64.shl i64.or @@ -10008,8 +10016,7 @@ (local $7 i32) (local $8 i64) (local $9 i32) - (local $10 i32) - (local $11 i64) + (local $10 i64) local.get $0 i32.reinterpret_f32 local.tee $4 @@ -10327,6 +10334,8 @@ i32.trunc_f64_s br $~lib/math/rempio2f|inlined.2 end + i32.const 92 + i32.load local.get $4 i32.const 23 i32.shr_s @@ -10338,17 +10347,18 @@ local.tee $9 i32.const 3 i32.shl - local.tee $10 - i32.const 92 - i32.load i32.add i64.load - local.set $11 + local.set $10 i32.const 92 i32.load - local.get $10 + local.get $9 + i32.const 1 i32.add - i64.load offset=8 + i32.const 3 + i32.shl + i32.add + i64.load local.set $5 local.get $6 i32.const 63 @@ -10366,10 +10376,12 @@ i32.const 92 i32.load local.get $9 + i32.const 2 + i32.add i32.const 3 i32.shl i32.add - i64.load offset=16 + i64.load i64.const 96 local.get $6 i64.extend_i32_s @@ -10396,7 +10408,7 @@ local.tee $5 i64.sub i64.shr_u - local.get $11 + local.get $10 local.get $5 i64.shl i64.or diff --git a/tests/compiler/std/math.untouched.wat b/tests/compiler/std/math.untouched.wat index 7b3a2546..64ab9025 100644 --- a/tests/compiler/std/math.untouched.wat +++ b/tests/compiler/std/math.untouched.wat @@ -63,7 +63,7 @@ (memory $0 1) (data (i32.const 8) "\01\00\00\00\16\00\00\00s\00t\00d\00/\00m\00a\00t\00h\00.\00t\00s\00") (data (i32.const 40) "\02\00\00\00 \00\00\00)\15DNn\83\f9\a2\c0\dd4\f5\d1W\'\fcA\90C<\99\95b\dba\c5\bb\de\abcQ\fe") - (data (i32.const 80) "\03\00\00\00\10\00\00\000\00\00\000\00\00\00P\00\00\00\04\00\00\00") + (data (i32.const 80) "\03\00\00\00\10\00\00\000\00\00\000\00\00\00 \00\00\00\04\00\00\00") (data (i32.const 104) "\01\00\00\00\18\00\00\00~\00l\00i\00b\00/\00m\00a\00t\00h\00.\00t\00s\00") (table $0 1 funcref) (elem (i32.const 0) $null) @@ -4746,6 +4746,8 @@ i32.const 88 i32.load offset=4 local.get $14 + i32.const 0 + i32.add i32.const 3 i32.shl i32.add @@ -4754,10 +4756,12 @@ i32.const 88 i32.load offset=4 local.get $14 + i32.const 1 + i32.add i32.const 3 i32.shl i32.add - i64.load offset=8 + i64.load local.set $17 local.get $15 i32.const 32 @@ -4766,10 +4770,12 @@ i32.const 88 i32.load offset=4 local.get $14 + i32.const 2 + i32.add i32.const 3 i32.shl i32.add - i64.load offset=16 + i64.load local.set $19 local.get $19 i64.const 96 @@ -11762,6 +11768,8 @@ i32.const 88 i32.load offset=4 local.get $14 + i32.const 0 + i32.add i32.const 3 i32.shl i32.add @@ -11770,10 +11778,12 @@ i32.const 88 i32.load offset=4 local.get $14 + i32.const 1 + i32.add i32.const 3 i32.shl i32.add - i64.load offset=8 + i64.load local.set $17 local.get $15 i32.const 32 @@ -11782,10 +11792,12 @@ i32.const 88 i32.load offset=4 local.get $14 + i32.const 2 + i32.add i32.const 3 i32.shl i32.add - i64.load offset=16 + i64.load local.set $19 local.get $19 i64.const 96 @@ -12748,6 +12760,8 @@ i32.const 88 i32.load offset=4 local.get $16 + i32.const 0 + i32.add i32.const 3 i32.shl i32.add @@ -12756,10 +12770,12 @@ i32.const 88 i32.load offset=4 local.get $16 + i32.const 1 + i32.add i32.const 3 i32.shl i32.add - i64.load offset=8 + i64.load local.set $19 local.get $17 i32.const 32 @@ -12768,10 +12784,12 @@ i32.const 88 i32.load offset=4 local.get $16 + i32.const 2 + i32.add i32.const 3 i32.shl i32.add - i64.load offset=16 + i64.load local.set $21 local.get $21 i64.const 96 diff --git a/tests/compiler/std/set.optimized.wat b/tests/compiler/std/set.optimized.wat index b1834c3e..08556684 100644 --- a/tests/compiler/std/set.optimized.wat +++ b/tests/compiler/std/set.optimized.wat @@ -121,7 +121,7 @@ if i32.const 0 i32.const 16 - i32.const 188 + i32.const 191 i32.const 2 call $~lib/env/abort unreachable @@ -135,7 +135,7 @@ if i32.const 0 i32.const 16 - i32.const 189 + i32.const 192 i32.const 2 call $~lib/env/abort unreachable diff --git a/tests/compiler/std/set.untouched.wat b/tests/compiler/std/set.untouched.wat index 0eb8eb6a..48697734 100644 --- a/tests/compiler/std/set.untouched.wat +++ b/tests/compiler/std/set.untouched.wat @@ -162,7 +162,7 @@ if i32.const 0 i32.const 16 - i32.const 188 + i32.const 191 i32.const 2 call $~lib/env/abort unreachable @@ -177,7 +177,7 @@ if i32.const 0 i32.const 16 - i32.const 189 + i32.const 192 i32.const 2 call $~lib/env/abort unreachable diff --git a/tests/compiler/std/static-array.optimized.wat b/tests/compiler/std/static-array.optimized.wat index 3286fc68..4dc4e80b 100644 --- a/tests/compiler/std/static-array.optimized.wat +++ b/tests/compiler/std/static-array.optimized.wat @@ -4,14 +4,14 @@ (import "env" "abort" (func $~lib/env/abort (param i32 i32 i32 i32))) (memory $0 1) (data (i32.const 8) "\01\00\00\00\08\00\00\00\01\00\00\00\02") - (data (i32.const 24) "\02\00\00\00\10\00\00\00\10\00\00\00\10\00\00\00\18\00\00\00\02") + (data (i32.const 24) "\02\00\00\00\10\00\00\00\10\00\00\00\10\00\00\00\08\00\00\00\02") (data (i32.const 48) "\01\00\00\00\10\00\00\00\03\00\00\00\00\00\00\00\04") - (data (i32.const 72) "\03\00\00\00\10\00\00\008\00\00\008\00\00\00H\00\00\00\02") + (data (i32.const 72) "\03\00\00\00\10\00\00\008\00\00\008\00\00\00\10\00\00\00\02") (data (i32.const 96) "\01\00\00\00\08\00\00\00\00\00\c0?\00\00 @") - (data (i32.const 112) "\04\00\00\00\10\00\00\00h\00\00\00h\00\00\00p\00\00\00\02") + (data (i32.const 112) "\04\00\00\00\10\00\00\00h\00\00\00h\00\00\00\08\00\00\00\02") (data (i32.const 136) "\01\00\00\00\10") (data (i32.const 150) "\f4?\00\00\00\00\00\00\02@") - (data (i32.const 160) "\05\00\00\00\10\00\00\00\90\00\00\00\90\00\00\00\a0\00\00\00\02") + (data (i32.const 160) "\05\00\00\00\10\00\00\00\90\00\00\00\90\00\00\00\10\00\00\00\02") (data (i32.const 184) "\06\00\00\00&\00\00\00s\00t\00d\00/\00s\00t\00a\00t\00i\00c\00-\00a\00r\00r\00a\00y\00.\00t\00s") (table $0 1 funcref) (elem (i32.const 0) $null) @@ -26,33 +26,47 @@ if i32.const 0 i32.const 192 - i32.const 8 + i32.const 6 i32.const 0 call $~lib/env/abort unreachable end i32.const 36 i32.load + i32.const -1 + i32.const 0 + i32.const 40 + i32.load + i32.lt_u + select i32.load i32.const 1 i32.ne if i32.const 0 i32.const 192 - i32.const 9 + i32.const 7 i32.const 0 call $~lib/env/abort unreachable end i32.const 36 i32.load - i32.load offset=4 + i32.const 4 + i32.add + i32.const -1 + i32.const 4 + i32.const 40 + i32.load + i32.lt_u + select + i32.load i32.const 2 i32.ne if i32.const 0 i32.const 192 - i32.const 10 + i32.const 8 i32.const 0 call $~lib/env/abort unreachable @@ -63,13 +77,19 @@ i32.store i32.const 36 i32.load + i32.const -1 + i32.const 0 + i32.const 40 + i32.load + i32.lt_u + select i32.load i32.const 2 i32.ne if i32.const 0 i32.const 192 - i32.const 12 + i32.const 10 i32.const 0 call $~lib/env/abort unreachable @@ -81,33 +101,47 @@ if i32.const 0 i32.const 192 - i32.const 14 + i32.const 12 i32.const 0 call $~lib/env/abort unreachable end i32.const 84 i32.load + i32.const -1 + i32.const 0 + i32.const 88 + i32.load + i32.lt_u + select i64.load i64.const 3 i64.ne if i32.const 0 i32.const 192 - i32.const 15 + i32.const 13 i32.const 0 call $~lib/env/abort unreachable end i32.const 84 i32.load - i64.load offset=8 + i32.const 8 + i32.add + i32.const -1 + i32.const 8 + i32.const 88 + i32.load + i32.lt_u + select + i64.load i64.const 4 i64.ne if i32.const 0 i32.const 192 - i32.const 16 + i32.const 14 i32.const 0 call $~lib/env/abort unreachable @@ -118,13 +152,19 @@ i64.store i32.const 84 i32.load + i32.const -1 + i32.const 0 + i32.const 88 + i32.load + i32.lt_u + select i64.load i64.const 4 i64.ne if i32.const 0 i32.const 192 - i32.const 18 + i32.const 16 i32.const 0 call $~lib/env/abort unreachable @@ -136,33 +176,47 @@ if i32.const 0 i32.const 192 - i32.const 20 + i32.const 18 i32.const 0 call $~lib/env/abort unreachable end i32.const 124 i32.load + i32.const -1 + i32.const 0 + i32.const 128 + i32.load + i32.lt_u + select f32.load f32.const 1.5 f32.ne if i32.const 0 i32.const 192 - i32.const 21 + i32.const 19 i32.const 0 call $~lib/env/abort unreachable end i32.const 124 i32.load - f32.load offset=4 + i32.const 4 + i32.add + i32.const -1 + i32.const 4 + i32.const 128 + i32.load + i32.lt_u + select + f32.load f32.const 2.5 f32.ne if i32.const 0 i32.const 192 - i32.const 22 + i32.const 20 i32.const 0 call $~lib/env/abort unreachable @@ -173,13 +227,19 @@ f32.store i32.const 124 i32.load + i32.const -1 + i32.const 0 + i32.const 128 + i32.load + i32.lt_u + select f32.load f32.const 2.5 f32.ne if i32.const 0 i32.const 192 - i32.const 24 + i32.const 22 i32.const 0 call $~lib/env/abort unreachable @@ -191,33 +251,47 @@ if i32.const 0 i32.const 192 - i32.const 26 + i32.const 24 i32.const 0 call $~lib/env/abort unreachable end i32.const 172 i32.load + i32.const -1 + i32.const 0 + i32.const 176 + i32.load + i32.lt_u + select f64.load f64.const 1.25 f64.ne if i32.const 0 i32.const 192 - i32.const 27 + i32.const 25 i32.const 0 call $~lib/env/abort unreachable end i32.const 172 i32.load - f64.load offset=8 + i32.const 8 + i32.add + i32.const -1 + i32.const 8 + i32.const 176 + i32.load + i32.lt_u + select + f64.load f64.const 2.25 f64.ne if i32.const 0 i32.const 192 - i32.const 28 + i32.const 26 i32.const 0 call $~lib/env/abort unreachable @@ -228,13 +302,19 @@ f64.store i32.const 172 i32.load + i32.const -1 + i32.const 0 + i32.const 176 + i32.load + i32.lt_u + select f64.load f64.const 2.25 f64.ne if i32.const 0 i32.const 192 - i32.const 30 + i32.const 28 i32.const 0 call $~lib/env/abort unreachable diff --git a/tests/compiler/std/static-array.ts b/tests/compiler/std/static-array.ts index 535d3d8a..4fee0db3 100644 --- a/tests/compiler/std/static-array.ts +++ b/tests/compiler/std/static-array.ts @@ -1,5 +1,3 @@ -import "allocator/arena"; // needed just because std/Array#[]= calls __grow conditionally - const i: i32[] = [1, 2]; const I: i64[] = [3, 4]; const f: f32[] = [1.5, 2.5]; diff --git a/tests/compiler/std/static-array.untouched.wat b/tests/compiler/std/static-array.untouched.wat index 9a06134c..24b6ac34 100644 --- a/tests/compiler/std/static-array.untouched.wat +++ b/tests/compiler/std/static-array.untouched.wat @@ -5,13 +5,13 @@ (import "env" "abort" (func $~lib/env/abort (param i32 i32 i32 i32))) (memory $0 1) (data (i32.const 8) "\01\00\00\00\08\00\00\00\01\00\00\00\02\00\00\00") - (data (i32.const 24) "\02\00\00\00\10\00\00\00\10\00\00\00\10\00\00\00\18\00\00\00\02\00\00\00") + (data (i32.const 24) "\02\00\00\00\10\00\00\00\10\00\00\00\10\00\00\00\08\00\00\00\02\00\00\00") (data (i32.const 48) "\01\00\00\00\10\00\00\00\03\00\00\00\00\00\00\00\04\00\00\00\00\00\00\00") - (data (i32.const 72) "\03\00\00\00\10\00\00\008\00\00\008\00\00\00H\00\00\00\02\00\00\00") + (data (i32.const 72) "\03\00\00\00\10\00\00\008\00\00\008\00\00\00\10\00\00\00\02\00\00\00") (data (i32.const 96) "\01\00\00\00\08\00\00\00\00\00\c0?\00\00 @") - (data (i32.const 112) "\04\00\00\00\10\00\00\00h\00\00\00h\00\00\00p\00\00\00\02\00\00\00") + (data (i32.const 112) "\04\00\00\00\10\00\00\00h\00\00\00h\00\00\00\08\00\00\00\02\00\00\00") (data (i32.const 136) "\01\00\00\00\10\00\00\00\00\00\00\00\00\00\f4?\00\00\00\00\00\00\02@") - (data (i32.const 160) "\05\00\00\00\10\00\00\00\90\00\00\00\90\00\00\00\a0\00\00\00\02\00\00\00") + (data (i32.const 160) "\05\00\00\00\10\00\00\00\90\00\00\00\90\00\00\00\10\00\00\00\02\00\00\00") (data (i32.const 184) "\06\00\00\00&\00\00\00s\00t\00d\00/\00s\00t\00a\00t\00i\00c\00-\00a\00r\00r\00a\00y\00.\00t\00s\00") (table $0 1 funcref) (elem (i32.const 0) $null) @@ -43,11 +43,65 @@ i32.load offset=12 ) (func $start:std/static-array (; 5 ;) (type $FUNCSIG$v) + (local $0 i32) + (local $1 i32) global.get $std/static-array/i call $~lib/array/Array#get:length i32.const 2 i32.eq i32.eqz + if + i32.const 0 + i32.const 192 + i32.const 6 + i32.const 0 + call $~lib/env/abort + unreachable + end + global.get $std/static-array/i + local.tee $0 + i32.load offset=4 + i32.const 0 + i32.const 2 + i32.shl + local.tee $1 + i32.add + i32.const -1 + local.get $1 + local.get $0 + i32.load offset=8 + i32.lt_u + select + i32.load + i32.const 1 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 192 + i32.const 7 + i32.const 0 + call $~lib/env/abort + unreachable + end + global.get $std/static-array/i + local.tee $0 + i32.load offset=4 + i32.const 1 + i32.const 2 + i32.shl + local.tee $1 + i32.add + i32.const -1 + local.get $1 + local.get $0 + i32.load offset=8 + i32.lt_u + select + i32.load + i32.const 2 + i32.eq + i32.eqz if i32.const 0 i32.const 192 @@ -58,21 +112,23 @@ end global.get $std/static-array/i i32.load offset=4 - i32.load - i32.const 1 - i32.eq - i32.eqz - if - i32.const 0 - i32.const 192 - i32.const 9 - i32.const 0 - call $~lib/env/abort - unreachable - end + i32.const 2 + i32.store global.get $std/static-array/i + local.tee $0 i32.load offset=4 - i32.load offset=4 + i32.const 0 + i32.const 2 + i32.shl + local.tee $1 + i32.add + i32.const -1 + local.get $1 + local.get $0 + i32.load offset=8 + i32.lt_u + select + i32.load i32.const 2 i32.eq i32.eqz @@ -84,24 +140,6 @@ call $~lib/env/abort unreachable end - global.get $std/static-array/i - i32.load offset=4 - i32.const 2 - i32.store - global.get $std/static-array/i - i32.load offset=4 - i32.load - i32.const 2 - i32.eq - i32.eqz - if - i32.const 0 - i32.const 192 - i32.const 12 - i32.const 0 - call $~lib/env/abort - unreachable - end global.get $std/static-array/I call $~lib/array/Array#get:length i32.const 2 @@ -110,13 +148,25 @@ if i32.const 0 i32.const 192 - i32.const 14 + i32.const 12 i32.const 0 call $~lib/env/abort unreachable end global.get $std/static-array/I + local.tee $0 i32.load offset=4 + i32.const 0 + i32.const 3 + i32.shl + local.tee $1 + i32.add + i32.const -1 + local.get $1 + local.get $0 + i32.load offset=8 + i32.lt_u + select i64.load i64.const 3 i64.eq @@ -124,21 +174,33 @@ if i32.const 0 i32.const 192 - i32.const 15 + i32.const 13 i32.const 0 call $~lib/env/abort unreachable end global.get $std/static-array/I + local.tee $0 i32.load offset=4 - i64.load offset=8 + i32.const 1 + i32.const 3 + i32.shl + local.tee $1 + i32.add + i32.const -1 + local.get $1 + local.get $0 + i32.load offset=8 + i32.lt_u + select + i64.load i64.const 4 i64.eq i32.eqz if i32.const 0 i32.const 192 - i32.const 16 + i32.const 14 i32.const 0 call $~lib/env/abort unreachable @@ -148,7 +210,19 @@ i64.const 4 i64.store global.get $std/static-array/I + local.tee $0 i32.load offset=4 + i32.const 0 + i32.const 3 + i32.shl + local.tee $1 + i32.add + i32.const -1 + local.get $1 + local.get $0 + i32.load offset=8 + i32.lt_u + select i64.load i64.const 4 i64.eq @@ -156,7 +230,7 @@ if i32.const 0 i32.const 192 - i32.const 18 + i32.const 16 i32.const 0 call $~lib/env/abort unreachable @@ -169,13 +243,25 @@ if i32.const 0 i32.const 192 - i32.const 20 + i32.const 18 i32.const 0 call $~lib/env/abort unreachable end global.get $std/static-array/f + local.tee $0 i32.load offset=4 + i32.const 0 + i32.const 2 + i32.shl + local.tee $1 + i32.add + i32.const -1 + local.get $1 + local.get $0 + i32.load offset=8 + i32.lt_u + select f32.load f32.const 1.5 f32.eq @@ -183,21 +269,33 @@ if i32.const 0 i32.const 192 - i32.const 21 + i32.const 19 i32.const 0 call $~lib/env/abort unreachable end global.get $std/static-array/f + local.tee $0 i32.load offset=4 - f32.load offset=4 + i32.const 1 + i32.const 2 + i32.shl + local.tee $1 + i32.add + i32.const -1 + local.get $1 + local.get $0 + i32.load offset=8 + i32.lt_u + select + f32.load f32.const 2.5 f32.eq i32.eqz if i32.const 0 i32.const 192 - i32.const 22 + i32.const 20 i32.const 0 call $~lib/env/abort unreachable @@ -207,7 +305,19 @@ f32.const 2.5 f32.store global.get $std/static-array/f + local.tee $0 i32.load offset=4 + i32.const 0 + i32.const 2 + i32.shl + local.tee $1 + i32.add + i32.const -1 + local.get $1 + local.get $0 + i32.load offset=8 + i32.lt_u + select f32.load f32.const 2.5 f32.eq @@ -215,7 +325,7 @@ if i32.const 0 i32.const 192 - i32.const 24 + i32.const 22 i32.const 0 call $~lib/env/abort unreachable @@ -228,13 +338,25 @@ if i32.const 0 i32.const 192 - i32.const 26 + i32.const 24 i32.const 0 call $~lib/env/abort unreachable end global.get $std/static-array/F + local.tee $0 i32.load offset=4 + i32.const 0 + i32.const 3 + i32.shl + local.tee $1 + i32.add + i32.const -1 + local.get $1 + local.get $0 + i32.load offset=8 + i32.lt_u + select f64.load f64.const 1.25 f64.eq @@ -242,14 +364,56 @@ if i32.const 0 i32.const 192 - i32.const 27 + i32.const 25 + i32.const 0 + call $~lib/env/abort + unreachable + end + global.get $std/static-array/F + local.tee $0 + i32.load offset=4 + i32.const 1 + i32.const 3 + i32.shl + local.tee $1 + i32.add + i32.const -1 + local.get $1 + local.get $0 + i32.load offset=8 + i32.lt_u + select + f64.load + f64.const 2.25 + f64.eq + i32.eqz + if + i32.const 0 + i32.const 192 + i32.const 26 i32.const 0 call $~lib/env/abort unreachable end global.get $std/static-array/F i32.load offset=4 - f64.load offset=8 + f64.const 2.25 + f64.store + global.get $std/static-array/F + local.tee $0 + i32.load offset=4 + i32.const 0 + i32.const 3 + i32.shl + local.tee $1 + i32.add + i32.const -1 + local.get $1 + local.get $0 + i32.load offset=8 + i32.lt_u + select + f64.load f64.const 2.25 f64.eq i32.eqz @@ -261,24 +425,6 @@ call $~lib/env/abort unreachable end - global.get $std/static-array/F - i32.load offset=4 - f64.const 2.25 - f64.store - global.get $std/static-array/F - i32.load offset=4 - f64.load - f64.const 2.25 - f64.eq - i32.eqz - if - i32.const 0 - i32.const 192 - i32.const 30 - i32.const 0 - call $~lib/env/abort - unreachable - end ) (func $start (; 6 ;) (type $FUNCSIG$v) call $start:std/static-array diff --git a/tests/compiler/std/string.optimized.wat b/tests/compiler/std/string.optimized.wat index 5c97af7e..4e3a90ec 100644 --- a/tests/compiler/std/string.optimized.wat +++ b/tests/compiler/std/string.optimized.wat @@ -309,7 +309,7 @@ if i32.const 0 i32.const 136 - i32.const 188 + i32.const 191 i32.const 2 call $~lib/env/abort unreachable @@ -323,7 +323,7 @@ if i32.const 0 i32.const 136 - i32.const 189 + i32.const 192 i32.const 2 call $~lib/env/abort unreachable @@ -3088,7 +3088,7 @@ if i32.const 0 i32.const 136 - i32.const 223 + i32.const 226 i32.const 57 call $~lib/env/abort unreachable @@ -3240,7 +3240,7 @@ i32.store offset=4 local.get $0 ) - (func $~lib/array/Array#resize (; 35 ;) (type $FUNCSIG$vii) (param $0 i32) (param $1 i32) + (func $~lib/array/ensureLength (; 35 ;) (type $FUNCSIG$vii) (param $0 i32) (param $1 i32) (local $2 i32) (local $3 i32) local.get $1 @@ -3260,20 +3260,19 @@ if i32.const 0 i32.const 1440 - i32.const 37 - i32.const 41 + i32.const 12 + i32.const 59 call $~lib/env/abort unreachable end local.get $2 - local.tee $3 + local.get $2 local.get $1 i32.const 2 i32.shl - local.tee $2 + local.tee $3 call $~lib/runtime/doReallocate local.tee $1 - local.get $3 i32.ne if local.get $0 @@ -3284,7 +3283,7 @@ i32.store offset=4 local.get $0 local.get $1 - local.get $2 + local.get $3 i32.add i32.store offset=8 end @@ -3293,7 +3292,7 @@ (func $~lib/array/Array#__set (; 36 ;) (type $FUNCSIG$vii) (param $0 i32) (param $1 i32) local.get $0 i32.const 1 - call $~lib/array/Array#resize + call $~lib/array/ensureLength local.get $0 i32.load offset=4 local.get $1 @@ -3318,7 +3317,7 @@ if i32.const 0 i32.const 136 - i32.const 196 + i32.const 199 i32.const 2 call $~lib/env/abort unreachable @@ -3338,7 +3337,7 @@ i32.const 1 i32.add local.tee $2 - call $~lib/array/Array#resize + call $~lib/array/ensureLength local.get $0 local.get $2 i32.store offset=12 @@ -3467,10 +3466,10 @@ local.get $5 i32.add local.get $1 - i32.const 1 - call $~lib/runtime/doRegister i32.store local.get $1 + i32.const 1 + call $~lib/runtime/doRegister local.get $3 call $~lib/runtime/doLink local.get $4 diff --git a/tests/compiler/std/string.untouched.wat b/tests/compiler/std/string.untouched.wat index 149ed9b6..683f6bce 100644 --- a/tests/compiler/std/string.untouched.wat +++ b/tests/compiler/std/string.untouched.wat @@ -366,7 +366,7 @@ if i32.const 0 i32.const 136 - i32.const 188 + i32.const 191 i32.const 2 call $~lib/env/abort unreachable @@ -381,7 +381,7 @@ if i32.const 0 i32.const 136 - i32.const 189 + i32.const 192 i32.const 2 call $~lib/env/abort unreachable @@ -3807,7 +3807,7 @@ if i32.const 0 i32.const 136 - i32.const 223 + i32.const 226 i32.const 57 call $~lib/env/abort unreachable @@ -3989,62 +3989,64 @@ i32.store offset=4 local.get $0 ) - (func $~lib/array/Array#resize (; 41 ;) (type $FUNCSIG$vii) (param $0 i32) (param $1 i32) - (local $2 i32) + (func $~lib/array/ensureLength (; 41 ;) (type $FUNCSIG$viii) (param $0 i32) (param $1 i32) (param $2 i32) (local $3 i32) (local $4 i32) (local $5 i32) (local $6 i32) + (local $7 i32) local.get $0 i32.load - local.set $2 - local.get $2 - call $~lib/arraybuffer/ArrayBuffer#get:byteLength - i32.const 2 - i32.shr_u local.set $3 - local.get $1 local.get $3 + call $~lib/arraybuffer/ArrayBuffer#get:byteLength + local.get $2 + i32.shr_u + local.set $4 + local.get $1 + local.get $4 i32.gt_u if local.get $1 - i32.const 268435454 + global.get $~lib/runtime/MAX_BYTELENGTH + local.get $2 + i32.shr_u i32.gt_u if i32.const 0 i32.const 1440 - i32.const 37 - i32.const 41 + i32.const 12 + i32.const 59 call $~lib/env/abort unreachable end local.get $1 - i32.const 2 + local.get $2 i32.shl - local.set $4 + local.set $5 block $~lib/runtime/REALLOCATE|inlined.0 (result i32) - local.get $2 - local.set $5 - local.get $4 + local.get $3 local.set $6 local.get $5 + local.set $7 local.get $6 + local.get $7 call $~lib/runtime/doReallocate end - local.set $6 - local.get $6 - local.get $2 + local.set $7 + local.get $7 + local.get $3 i32.ne if local.get $0 - local.get $6 + local.get $7 i32.store local.get $0 - local.get $6 + local.get $7 i32.store offset=4 local.get $0 - local.get $6 - local.get $4 + local.get $7 + local.get $5 i32.add i32.store offset=8 end @@ -4055,7 +4057,8 @@ local.get $1 i32.const 1 i32.add - call $~lib/array/Array#resize + i32.const 2 + call $~lib/array/ensureLength local.get $0 i32.load offset=4 local.get $1 @@ -4087,7 +4090,7 @@ if i32.const 0 i32.const 136 - i32.const 196 + i32.const 199 i32.const 2 call $~lib/env/abort unreachable @@ -4099,7 +4102,7 @@ local.get $1 call $~lib/runtime/assertRegistered ) - (func $~lib/runtime/LINK> (; 45 ;) (type $FUNCSIG$vii) (param $0 i32) (param $1 i32) + (func $~lib/runtime/LINK> (; 45 ;) (type $FUNCSIG$vii) (param $0 i32) (param $1 i32) local.get $0 local.get $1 call $~lib/runtime/doLink @@ -4113,7 +4116,8 @@ local.set $2 local.get $0 local.get $2 - call $~lib/array/Array#resize + i32.const 2 + call $~lib/array/ensureLength local.get $0 local.get $2 i32.store offset=12 @@ -4249,6 +4253,8 @@ i32.const 2 i32.shl i32.add + local.get $8 + i32.store block $~lib/runtime/REGISTER|inlined.7 (result i32) local.get $8 local.set $9 @@ -4256,10 +4262,8 @@ i32.const 1 call $~lib/runtime/doRegister end - i32.store - local.get $8 local.get $3 - call $~lib/runtime/LINK> + call $~lib/runtime/LINK> end local.get $7 i32.const 1 diff --git a/tests/compiler/std/typedarray.optimized.wat b/tests/compiler/std/typedarray.optimized.wat index 14eb1234..8a1e5dc1 100644 --- a/tests/compiler/std/typedarray.optimized.wat +++ b/tests/compiler/std/typedarray.optimized.wat @@ -49,13 +49,13 @@ (data (i32.const 472) "\01\00\00\00\1e\00\00\00r\00e\00s\00u\00l\00t\00 \00m\00i\00s\00m\00a\00t\00c\00h") (data (i32.const 512) "\01\00\00\00(\00\00\00f\00a\00i\00l\00 \00r\00e\00s\00u\00l\00t\00 \00m\00i\00s\00m\00a\00t\00c\00h") (data (i32.const 560) "\02\00\00\00\0c\00\00\00\n\00\00\00\0c\00\00\00\0e") - (data (i32.const 584) "\10\00\00\00\10\00\00\008\02\00\008\02\00\00D\02\00\00\03") + (data (i32.const 584) "\10\00\00\00\10\00\00\008\02\00\008\02\00\00\0c\00\00\00\03") (data (i32.const 608) "\01\00\00\00,\00\00\00f\00o\00r\00E\00a\00c\00h\00 \00v\00a\00l\00u\00e\00 \00m\00i\00s\00m\00a\00t\00c\00h") (data (i32.const 664) "\01\00\00\00,\00\00\00f\00o\00r\00E\00a\00c\00h\00 \00i\00n\00d\00e\00x\00 \00m\00i\00s\00m\00a\00t\00c\00h") (data (i32.const 720) "\01\00\00\00>\00\00\00f\00o\00r\00E\00a\00c\00h\00 \00s\00e\00l\00f\00 \00p\00a\00r\00a\00m\00e\00t\00e\00r\00 \00m\00i\00s\00m\00a\00t\00c\00h") (data (i32.const 792) "\01\00\00\006\00\00\00f\00o\00r\00E\00a\00c\00h\00 \00c\00a\00l\00l\00 \00c\00o\00u\00n\00t\00 \00m\00i\00s\00m\00a\00t\00c\00h") (data (i32.const 856) "\02\00\00\00$\00\00\00\01\00\00\00\02\00\00\00\03\00\00\00\04\00\00\00\05\00\00\00\06\00\00\00\07\00\00\00\08\00\00\00\t") - (data (i32.const 904) "\10\00\00\00\10\00\00\00`\03\00\00`\03\00\00\84\03\00\00\t") + (data (i32.const 904) "\10\00\00\00\10\00\00\00`\03\00\00`\03\00\00$\00\00\00\t") (data (i32.const 928) "\01\00\00\00B\00\00\00T\00y\00p\00e\00d\00A\00r\00r\00a\00y\00 \00r\00e\00v\00e\00r\00s\00e\00 \00v\00a\00l\00u\00e\00 \00m\00i\00s\00m\00a\00t\00c\00h") (data (i32.const 1008) "\01\00\00\00V\00\00\00T\00y\00p\00e\00d\00A\00r\00r\00a\00y\00 \00r\00e\00v\00e\00r\00s\00e\00 \00w\00i\00t\00h\00 \00b\00y\00t\00e\00O\00f\00f\00s\00e\00t\00 \00m\00i\00s\00m\00a\00t\00c\00h") (table $0 112 funcref) @@ -396,7 +396,7 @@ if i32.const 0 i32.const 64 - i32.const 188 + i32.const 191 i32.const 2 call $~lib/env/abort unreachable @@ -410,7 +410,7 @@ if i32.const 0 i32.const 64 - i32.const 189 + i32.const 192 i32.const 2 call $~lib/env/abort unreachable @@ -458,7 +458,7 @@ if i32.const 0 i32.const 64 - i32.const 223 + i32.const 226 i32.const 57 call $~lib/env/abort unreachable @@ -495,8 +495,6 @@ i32.store offset=4 local.get $0 local.get $1 - local.get $2 - i32.add i32.store offset=8 local.get $0 ) @@ -622,9 +620,6 @@ end local.get $1 i32.load offset=8 - local.get $1 - i32.load offset=4 - i32.sub local.get $0 i32.ne if @@ -637,9 +632,6 @@ end local.get $1 i32.load offset=8 - local.get $1 - i32.load offset=4 - i32.sub local.get $0 i32.ne if @@ -668,9 +660,6 @@ end local.get $1 i32.load offset=8 - local.get $1 - i32.load offset=4 - i32.sub local.get $0 i32.ne if @@ -683,9 +672,6 @@ end local.get $1 i32.load offset=8 - local.get $1 - i32.load offset=4 - i32.sub local.get $0 i32.ne if @@ -713,9 +699,6 @@ end local.get $1 i32.load offset=8 - local.get $1 - i32.load offset=4 - i32.sub local.get $0 i32.ne if @@ -728,9 +711,6 @@ end local.get $1 i32.load offset=8 - local.get $1 - i32.load offset=4 - i32.sub local.get $0 i32.ne if @@ -758,9 +738,6 @@ end local.get $1 i32.load offset=8 - local.get $1 - i32.load offset=4 - i32.sub local.get $0 i32.const 1 i32.shl @@ -775,9 +752,6 @@ end local.get $1 i32.load offset=8 - local.get $1 - i32.load offset=4 - i32.sub i32.const 1 i32.shr_u local.get $0 @@ -807,9 +781,6 @@ end local.get $1 i32.load offset=8 - local.get $1 - i32.load offset=4 - i32.sub local.get $0 i32.const 1 i32.shl @@ -824,9 +795,6 @@ end local.get $1 i32.load offset=8 - local.get $1 - i32.load offset=4 - i32.sub i32.const 1 i32.shr_u local.get $0 @@ -856,9 +824,6 @@ end local.get $1 i32.load offset=8 - local.get $1 - i32.load offset=4 - i32.sub local.get $0 i32.const 2 i32.shl @@ -873,9 +838,6 @@ end local.get $1 i32.load offset=8 - local.get $1 - i32.load offset=4 - i32.sub i32.const 2 i32.shr_u local.get $0 @@ -905,9 +867,6 @@ end local.get $1 i32.load offset=8 - local.get $1 - i32.load offset=4 - i32.sub local.get $0 i32.const 2 i32.shl @@ -922,9 +881,6 @@ end local.get $1 i32.load offset=8 - local.get $1 - i32.load offset=4 - i32.sub i32.const 2 i32.shr_u local.get $0 @@ -954,9 +910,6 @@ end local.get $1 i32.load offset=8 - local.get $1 - i32.load offset=4 - i32.sub local.get $0 i32.const 3 i32.shl @@ -971,9 +924,6 @@ end local.get $1 i32.load offset=8 - local.get $1 - i32.load offset=4 - i32.sub i32.const 3 i32.shr_u local.get $0 @@ -1003,9 +953,6 @@ end local.get $1 i32.load offset=8 - local.get $1 - i32.load offset=4 - i32.sub local.get $0 i32.const 3 i32.shl @@ -1020,9 +967,6 @@ end local.get $1 i32.load offset=8 - local.get $1 - i32.load offset=4 - i32.sub i32.const 3 i32.shr_u local.get $0 @@ -1052,9 +996,6 @@ end local.get $1 i32.load offset=8 - local.get $1 - i32.load offset=4 - i32.sub local.get $0 i32.const 2 i32.shl @@ -1069,9 +1010,6 @@ end local.get $1 i32.load offset=8 - local.get $1 - i32.load offset=4 - i32.sub i32.const 2 i32.shr_u local.get $0 @@ -1101,9 +1039,6 @@ end local.get $1 i32.load offset=8 - local.get $1 - i32.load offset=4 - i32.sub local.get $0 i32.const 3 i32.shl @@ -1118,9 +1053,6 @@ end local.get $1 i32.load offset=8 - local.get $1 - i32.load offset=4 - i32.sub i32.const 3 i32.shr_u local.get $0 @@ -1140,9 +1072,6 @@ local.get $0 local.tee $4 i32.load offset=8 - local.get $0 - i32.load offset=4 - i32.sub i32.const 2 i32.shr_u local.set $3 @@ -1161,9 +1090,8 @@ select else local.get $1 - local.tee $0 local.get $3 - local.get $0 + local.get $1 local.get $3 i32.lt_s select @@ -1218,10 +1146,10 @@ i32.store offset=4 local.get $0 local.get $2 + local.get $1 + i32.sub i32.const 2 i32.shl - local.get $3 - i32.add i32.store offset=8 local.get $0 ) @@ -1231,9 +1159,6 @@ local.get $0 local.tee $4 i32.load offset=8 - local.get $0 - i32.load offset=4 - i32.sub i32.const 3 i32.shr_u local.set $3 @@ -1252,9 +1177,8 @@ select else local.get $1 - local.tee $0 local.get $3 - local.get $0 + local.get $1 local.get $3 i32.lt_s select @@ -1309,10 +1233,10 @@ i32.store offset=4 local.get $0 local.get $2 + local.get $1 + i32.sub i32.const 3 i32.shl - local.get $3 - i32.add i32.store offset=8 local.get $0 ) @@ -1661,9 +1585,6 @@ block $~lib/typedarray/SORT|inlined.0 local.get $0 i32.load offset=8 - local.get $0 - i32.load offset=4 - i32.sub i32.const 3 i32.shr_u local.tee $2 @@ -1754,9 +1675,6 @@ local.set $5 local.get $0 i32.load offset=8 - local.get $0 - i32.load offset=4 - i32.sub local.set $4 local.get $2 i32.const 0 @@ -2929,9 +2847,7 @@ local.get $1 i32.store offset=4 local.get $3 - local.get $1 local.get $4 - i32.add i32.store offset=8 local.get $3 local.get $4 @@ -2947,13 +2863,10 @@ (func $std/typedarray/isInt8ArrayEqual (; 30 ;) (type $FUNCSIG$iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) - local.get $1 - i32.load offset=12 local.get $0 i32.load offset=8 - local.get $0 - i32.load offset=4 - i32.sub + local.get $1 + i32.load offset=12 i32.ne if i32.const 0 @@ -2961,9 +2874,6 @@ end local.get $0 i32.load offset=8 - local.get $0 - i32.load offset=4 - i32.sub local.set $3 loop $repeat|0 local.get $2 @@ -2974,11 +2884,23 @@ i32.load offset=4 local.get $2 i32.add + i32.const -1 + local.get $2 + local.get $0 + i32.load offset=8 + i32.lt_u + select i32.load8_s local.get $1 i32.load offset=4 local.get $2 i32.add + i32.const -1 + local.get $2 + local.get $1 + i32.load offset=8 + i32.lt_u + select i32.load8_s i32.ne if @@ -3002,9 +2924,6 @@ local.get $0 local.tee $4 i32.load offset=8 - local.get $0 - i32.load offset=4 - i32.sub local.set $3 local.get $1 i32.const 0 @@ -3021,9 +2940,8 @@ select else local.get $1 - local.tee $0 local.get $3 - local.get $0 + local.get $1 local.get $3 i32.lt_s select @@ -3076,8 +2994,8 @@ i32.store offset=4 local.get $0 local.get $2 - local.get $3 - i32.add + local.get $1 + i32.sub i32.store offset=8 local.get $0 ) @@ -3089,9 +3007,6 @@ local.set $5 local.get $0 i32.load offset=8 - local.get $0 - i32.load offset=4 - i32.sub i32.const 2 i32.shr_u local.set $4 @@ -3168,9 +3083,6 @@ i32.load offset=12 local.get $0 i32.load offset=8 - local.get $0 - i32.load offset=4 - i32.sub i32.const 2 i32.shr_u i32.ne @@ -3180,29 +3092,38 @@ end local.get $0 i32.load offset=8 - local.get $0 - i32.load offset=4 - i32.sub i32.const 2 i32.shr_u - local.set $3 + local.set $4 loop $repeat|0 local.get $2 - local.get $3 + local.get $4 i32.lt_s if local.get $2 i32.const 2 i32.shl - local.tee $4 + local.tee $3 local.get $0 i32.load offset=4 i32.add + i32.const -1 + local.get $3 + local.get $0 + i32.load offset=8 + i32.lt_u + select i32.load local.get $1 i32.load offset=4 - local.get $4 + local.get $3 i32.add + i32.const -1 + local.get $3 + local.get $1 + i32.load offset=8 + i32.lt_u + select i32.load i32.ne if @@ -3235,9 +3156,6 @@ local.set $3 local.get $0 i32.load offset=8 - local.get $0 - i32.load offset=4 - i32.sub local.set $4 loop $repeat|0 local.get $1 @@ -3306,9 +3224,6 @@ local.set $4 local.get $0 i32.load offset=8 - local.get $0 - i32.load offset=4 - i32.sub local.set $5 loop $repeat|0 local.get $2 @@ -3411,9 +3326,6 @@ local.set $3 local.get $0 i32.load offset=8 - local.get $0 - i32.load offset=4 - i32.sub i32.const 1 i32.shr_u local.set $4 @@ -3486,9 +3398,6 @@ local.set $3 local.get $0 i32.load offset=8 - local.get $0 - i32.load offset=4 - i32.sub i32.const 1 i32.shr_u local.set $4 @@ -3561,9 +3470,6 @@ local.set $4 local.get $0 i32.load offset=8 - local.get $0 - i32.load offset=4 - i32.sub i32.const 2 i32.shr_u local.set $5 @@ -3670,9 +3576,6 @@ local.set $4 local.get $0 i32.load offset=8 - local.get $0 - i32.load offset=4 - i32.sub i32.const 3 i32.shr_u local.set $5 @@ -3779,9 +3682,6 @@ local.set $3 local.get $0 i32.load offset=8 - local.get $0 - i32.load offset=4 - i32.sub i32.const 2 i32.shr_u local.set $4 @@ -3857,9 +3757,6 @@ local.set $3 local.get $0 i32.load offset=8 - local.get $0 - i32.load offset=4 - i32.sub i32.const 3 i32.shr_u local.set $4 @@ -3929,9 +3826,6 @@ local.set $3 local.get $0 i32.load offset=8 - local.get $0 - i32.load offset=4 - i32.sub i32.const 1 i32.sub local.set $1 @@ -4001,9 +3895,6 @@ local.set $4 local.get $0 i32.load offset=8 - local.get $0 - i32.load offset=4 - i32.sub i32.const 1 i32.sub local.set $2 @@ -4107,9 +3998,6 @@ local.set $3 local.get $0 i32.load offset=8 - local.get $0 - i32.load offset=4 - i32.sub i32.const 1 i32.shr_u i32.const 1 @@ -4183,9 +4071,6 @@ local.set $3 local.get $0 i32.load offset=8 - local.get $0 - i32.load offset=4 - i32.sub i32.const 1 i32.shr_u i32.const 1 @@ -4259,9 +4144,6 @@ local.set $4 local.get $0 i32.load offset=8 - local.get $0 - i32.load offset=4 - i32.sub i32.const 2 i32.shr_u i32.const 1 @@ -4364,9 +4246,6 @@ local.set $4 local.get $0 i32.load offset=8 - local.get $0 - i32.load offset=4 - i32.sub i32.const 3 i32.shr_u i32.const 1 @@ -4469,9 +4348,6 @@ local.set $3 local.get $0 i32.load offset=8 - local.get $0 - i32.load offset=4 - i32.sub i32.const 2 i32.shr_u i32.const 1 @@ -4543,9 +4419,6 @@ local.set $3 local.get $0 i32.load offset=8 - local.get $0 - i32.load offset=4 - i32.sub i32.const 3 i32.shr_u i32.const 1 @@ -4624,9 +4497,6 @@ local.set $3 local.get $0 i32.load offset=8 - local.get $0 - i32.load offset=4 - i32.sub local.tee $2 local.set $4 local.get $2 @@ -4682,6 +4552,12 @@ call $~lib/typedarray/Int8Array#map local.tee $0 i32.load offset=4 + i32.const -1 + i32.const 0 + local.get $0 + i32.load offset=8 + i32.lt_u + select i32.load8_s i32.const 1 i32.ne @@ -4695,7 +4571,15 @@ end local.get $0 i32.load offset=4 - i32.load8_s offset=1 + i32.const 1 + i32.add + i32.const -1 + i32.const 1 + local.get $0 + i32.load offset=8 + i32.lt_u + select + i32.load8_s i32.const 4 i32.ne if @@ -4708,7 +4592,15 @@ end local.get $0 i32.load offset=4 - i32.load8_s offset=2 + i32.const 2 + i32.add + i32.const -1 + i32.const 2 + local.get $0 + i32.load offset=8 + i32.lt_u + select + i32.load8_s i32.const 9 i32.ne if @@ -4731,9 +4623,6 @@ local.set $3 local.get $0 i32.load offset=8 - local.get $0 - i32.load offset=4 - i32.sub local.tee $2 local.set $4 i32.const 0 @@ -4791,6 +4680,12 @@ call $~lib/typedarray/Uint8Array#map local.tee $0 i32.load offset=4 + i32.const -1 + i32.const 0 + local.get $0 + i32.load offset=8 + i32.lt_u + select i32.load8_u i32.const 1 i32.ne @@ -4804,7 +4699,15 @@ end local.get $0 i32.load offset=4 - i32.load8_u offset=1 + i32.const 1 + i32.add + i32.const -1 + i32.const 1 + local.get $0 + i32.load offset=8 + i32.lt_u + select + i32.load8_u i32.const 4 i32.ne if @@ -4817,7 +4720,15 @@ end local.get $0 i32.load offset=4 - i32.load8_u offset=2 + i32.const 2 + i32.add + i32.const -1 + i32.const 2 + local.get $0 + i32.load offset=8 + i32.lt_u + select + i32.load8_u i32.const 9 i32.ne if @@ -4840,9 +4751,6 @@ local.set $3 local.get $0 i32.load offset=8 - local.get $0 - i32.load offset=4 - i32.sub local.tee $2 local.set $4 local.get $2 @@ -4880,6 +4788,7 @@ ) (func $std/typedarray/testArrayMap (; 82 ;) (type $FUNCSIG$v) (local $0 i32) + (local $1 i32) i32.const 3 call $~lib/typedarray/Uint8ClampedArray#constructor local.tee $0 @@ -4896,8 +4805,15 @@ i32.store8 offset=2 local.get $0 call $~lib/typedarray/Uint8ClampedArray#map + local.tee $1 local.tee $0 i32.load offset=4 + i32.const -1 + i32.const 0 + local.get $0 + i32.load offset=8 + i32.lt_u + select i32.load8_u i32.const 1 i32.ne @@ -4909,9 +4825,18 @@ call $~lib/env/abort unreachable end - local.get $0 + local.get $1 + local.tee $0 i32.load offset=4 - i32.load8_u offset=1 + i32.const 1 + i32.add + i32.const -1 + i32.const 1 + local.get $0 + i32.load offset=8 + i32.lt_u + select + i32.load8_u i32.const 4 i32.ne if @@ -4924,7 +4849,15 @@ end local.get $0 i32.load offset=4 - i32.load8_u offset=2 + i32.const 2 + i32.add + i32.const -1 + i32.const 2 + local.get $0 + i32.load offset=8 + i32.lt_u + select + i32.load8_u i32.const 9 i32.ne if @@ -4949,9 +4882,6 @@ local.set $3 local.get $0 i32.load offset=8 - local.get $0 - i32.load offset=4 - i32.sub i32.const 1 i32.shr_u local.tee $2 @@ -5014,6 +4944,12 @@ call $~lib/typedarray/Int16Array#map local.tee $0 i32.load offset=4 + i32.const -1 + i32.const 0 + local.get $0 + i32.load offset=8 + i32.lt_u + select i32.load16_s i32.const 1 i32.ne @@ -5027,7 +4963,15 @@ end local.get $0 i32.load offset=4 - i32.load16_s offset=2 + i32.const 2 + i32.add + i32.const -1 + i32.const 2 + local.get $0 + i32.load offset=8 + i32.lt_u + select + i32.load16_s i32.const 4 i32.ne if @@ -5040,7 +4984,15 @@ end local.get $0 i32.load offset=4 - i32.load16_s offset=4 + i32.const 4 + i32.add + i32.const -1 + i32.const 4 + local.get $0 + i32.load offset=8 + i32.lt_u + select + i32.load16_s i32.const 9 i32.ne if @@ -5065,9 +5017,6 @@ local.set $3 local.get $0 i32.load offset=8 - local.get $0 - i32.load offset=4 - i32.sub i32.const 1 i32.shr_u local.tee $2 @@ -5130,6 +5079,12 @@ call $~lib/typedarray/Uint16Array#map local.tee $0 i32.load offset=4 + i32.const -1 + i32.const 0 + local.get $0 + i32.load offset=8 + i32.lt_u + select i32.load16_u i32.const 1 i32.ne @@ -5143,7 +5098,15 @@ end local.get $0 i32.load offset=4 - i32.load16_u offset=2 + i32.const 2 + i32.add + i32.const -1 + i32.const 2 + local.get $0 + i32.load offset=8 + i32.lt_u + select + i32.load16_u i32.const 4 i32.ne if @@ -5156,7 +5119,15 @@ end local.get $0 i32.load offset=4 - i32.load16_u offset=4 + i32.const 4 + i32.add + i32.const -1 + i32.const 4 + local.get $0 + i32.load offset=8 + i32.lt_u + select + i32.load16_u i32.const 9 i32.ne if @@ -5181,9 +5152,6 @@ local.set $3 local.get $0 i32.load offset=8 - local.get $0 - i32.load offset=4 - i32.sub i32.const 2 i32.shr_u local.tee $2 @@ -5246,6 +5214,12 @@ call $~lib/typedarray/Int32Array#map local.tee $0 i32.load offset=4 + i32.const -1 + i32.const 0 + local.get $0 + i32.load offset=8 + i32.lt_u + select i32.load i32.const 1 i32.ne @@ -5259,7 +5233,15 @@ end local.get $0 i32.load offset=4 - i32.load offset=4 + i32.const 4 + i32.add + i32.const -1 + i32.const 4 + local.get $0 + i32.load offset=8 + i32.lt_u + select + i32.load i32.const 4 i32.ne if @@ -5272,7 +5254,15 @@ end local.get $0 i32.load offset=4 + i32.const 8 + i32.add + i32.const -1 + i32.const 8 + local.get $0 i32.load offset=8 + i32.lt_u + select + i32.load i32.const 9 i32.ne if @@ -5297,9 +5287,6 @@ local.set $3 local.get $0 i32.load offset=8 - local.get $0 - i32.load offset=4 - i32.sub i32.const 2 i32.shr_u local.tee $2 @@ -5362,6 +5349,12 @@ call $~lib/typedarray/Uint32Array#map local.tee $0 i32.load offset=4 + i32.const -1 + i32.const 0 + local.get $0 + i32.load offset=8 + i32.lt_u + select i32.load i32.const 1 i32.ne @@ -5375,7 +5368,15 @@ end local.get $0 i32.load offset=4 - i32.load offset=4 + i32.const 4 + i32.add + i32.const -1 + i32.const 4 + local.get $0 + i32.load offset=8 + i32.lt_u + select + i32.load i32.const 4 i32.ne if @@ -5388,7 +5389,15 @@ end local.get $0 i32.load offset=4 + i32.const 8 + i32.add + i32.const -1 + i32.const 8 + local.get $0 i32.load offset=8 + i32.lt_u + select + i32.load i32.const 9 i32.ne if @@ -5418,9 +5427,6 @@ local.set $3 local.get $0 i32.load offset=8 - local.get $0 - i32.load offset=4 - i32.sub i32.const 3 i32.shr_u local.tee $2 @@ -5483,6 +5489,12 @@ call $~lib/typedarray/Int64Array#map local.tee $0 i32.load offset=4 + i32.const -1 + i32.const 0 + local.get $0 + i32.load offset=8 + i32.lt_u + select i64.load i64.const 1 i64.ne @@ -5496,7 +5508,15 @@ end local.get $0 i32.load offset=4 - i64.load offset=8 + i32.const 8 + i32.add + i32.const -1 + i32.const 8 + local.get $0 + i32.load offset=8 + i32.lt_u + select + i64.load i64.const 4 i64.ne if @@ -5509,7 +5529,15 @@ end local.get $0 i32.load offset=4 - i64.load offset=16 + i32.const 16 + i32.add + i32.const -1 + i32.const 16 + local.get $0 + i32.load offset=8 + i32.lt_u + select + i64.load i64.const 9 i64.ne if @@ -5534,9 +5562,6 @@ local.set $3 local.get $0 i32.load offset=8 - local.get $0 - i32.load offset=4 - i32.sub i32.const 3 i32.shr_u local.tee $2 @@ -5599,6 +5624,12 @@ call $~lib/typedarray/Uint64Array#map local.tee $0 i32.load offset=4 + i32.const -1 + i32.const 0 + local.get $0 + i32.load offset=8 + i32.lt_u + select i64.load i64.const 1 i64.ne @@ -5612,7 +5643,15 @@ end local.get $0 i32.load offset=4 - i64.load offset=8 + i32.const 8 + i32.add + i32.const -1 + i32.const 8 + local.get $0 + i32.load offset=8 + i32.lt_u + select + i64.load i64.const 4 i64.ne if @@ -5625,7 +5664,15 @@ end local.get $0 i32.load offset=4 - i64.load offset=16 + i32.const 16 + i32.add + i32.const -1 + i32.const 16 + local.get $0 + i32.load offset=8 + i32.lt_u + select + i64.load i64.const 9 i64.ne if @@ -5655,9 +5702,6 @@ local.set $3 local.get $0 i32.load offset=8 - local.get $0 - i32.load offset=4 - i32.sub i32.const 2 i32.shr_u local.tee $2 @@ -5720,6 +5764,12 @@ call $~lib/typedarray/Float32Array#map local.tee $0 i32.load offset=4 + i32.const -1 + i32.const 0 + local.get $0 + i32.load offset=8 + i32.lt_u + select f32.load f32.const 1 f32.ne @@ -5733,7 +5783,15 @@ end local.get $0 i32.load offset=4 - f32.load offset=4 + i32.const 4 + i32.add + i32.const -1 + i32.const 4 + local.get $0 + i32.load offset=8 + i32.lt_u + select + f32.load f32.const 4 f32.ne if @@ -5746,7 +5804,15 @@ end local.get $0 i32.load offset=4 - f32.load offset=8 + i32.const 8 + i32.add + i32.const -1 + i32.const 8 + local.get $0 + i32.load offset=8 + i32.lt_u + select + f32.load f32.const 9 f32.ne if @@ -5776,9 +5842,6 @@ local.set $3 local.get $0 i32.load offset=8 - local.get $0 - i32.load offset=4 - i32.sub i32.const 3 i32.shr_u local.tee $2 @@ -5841,6 +5904,12 @@ call $~lib/typedarray/Float64Array#map local.tee $0 i32.load offset=4 + i32.const -1 + i32.const 0 + local.get $0 + i32.load offset=8 + i32.lt_u + select f64.load f64.const 1 f64.ne @@ -5854,7 +5923,15 @@ end local.get $0 i32.load offset=4 - f64.load offset=8 + i32.const 8 + i32.add + i32.const -1 + i32.const 8 + local.get $0 + i32.load offset=8 + i32.lt_u + select + f64.load f64.const 4 f64.ne if @@ -5867,7 +5944,15 @@ end local.get $0 i32.load offset=4 - f64.load offset=16 + i32.const 16 + i32.add + i32.const -1 + i32.const 16 + local.get $0 + i32.load offset=8 + i32.lt_u + select + f64.load f64.const 9 f64.ne if @@ -5896,9 +5981,6 @@ local.set $3 local.get $0 i32.load offset=8 - local.get $0 - i32.load offset=4 - i32.sub local.set $4 loop $repeat|0 local.get $2 @@ -5984,9 +6066,6 @@ local.set $3 local.get $0 i32.load offset=8 - local.get $0 - i32.load offset=4 - i32.sub local.set $4 loop $repeat|0 local.get $2 @@ -6114,9 +6193,6 @@ local.set $3 local.get $0 i32.load offset=8 - local.get $0 - i32.load offset=4 - i32.sub i32.const 1 i32.shr_u local.set $4 @@ -6206,9 +6282,6 @@ local.set $3 local.get $0 i32.load offset=8 - local.get $0 - i32.load offset=4 - i32.sub i32.const 1 i32.shr_u local.set $4 @@ -6297,9 +6370,6 @@ local.set $3 local.get $0 i32.load offset=8 - local.get $0 - i32.load offset=4 - i32.sub i32.const 2 i32.shr_u local.set $4 @@ -6432,9 +6502,6 @@ local.set $3 local.get $0 i32.load offset=8 - local.get $0 - i32.load offset=4 - i32.sub i32.const 3 i32.shr_u local.set $4 @@ -6568,9 +6635,6 @@ local.set $3 local.get $0 i32.load offset=8 - local.get $0 - i32.load offset=4 - i32.sub i32.const 2 i32.shr_u local.set $4 @@ -6664,9 +6728,6 @@ local.set $3 local.get $0 i32.load offset=8 - local.get $0 - i32.load offset=4 - i32.sub i32.const 3 i32.shr_u local.set $4 @@ -6757,9 +6818,6 @@ local.set $0 local.get $2 i32.load offset=8 - local.get $2 - i32.load offset=4 - i32.sub local.set $4 block $~lib/typedarray/FIND_INDEX|inlined.0 loop $repeat|0 @@ -6852,9 +6910,6 @@ local.set $0 local.get $2 i32.load offset=8 - local.get $2 - i32.load offset=4 - i32.sub local.set $4 block $~lib/typedarray/FIND_INDEX|inlined.0 loop $repeat|0 @@ -6984,9 +7039,6 @@ local.set $0 local.get $2 i32.load offset=8 - local.get $2 - i32.load offset=4 - i32.sub i32.const 1 i32.shr_u local.set $4 @@ -7083,9 +7135,6 @@ local.set $0 local.get $2 i32.load offset=8 - local.get $2 - i32.load offset=4 - i32.sub i32.const 1 i32.shr_u local.set $4 @@ -7175,9 +7224,6 @@ local.set $0 local.get $2 i32.load offset=8 - local.get $2 - i32.load offset=4 - i32.sub i32.const 2 i32.shr_u local.set $4 @@ -7315,9 +7361,6 @@ local.set $0 local.get $2 i32.load offset=8 - local.get $2 - i32.load offset=4 - i32.sub i32.const 3 i32.shr_u local.set $4 @@ -7455,9 +7498,6 @@ local.set $0 local.get $2 i32.load offset=8 - local.get $2 - i32.load offset=4 - i32.sub i32.const 2 i32.shr_u local.set $4 @@ -7552,9 +7592,6 @@ local.set $0 local.get $2 i32.load offset=8 - local.get $2 - i32.load offset=4 - i32.sub i32.const 3 i32.shr_u local.set $4 @@ -7657,9 +7694,6 @@ local.set $3 local.get $0 i32.load offset=8 - local.get $0 - i32.load offset=4 - i32.sub local.set $4 loop $repeat|0 local.get $2 @@ -7746,9 +7780,6 @@ local.set $3 local.get $0 i32.load offset=8 - local.get $0 - i32.load offset=4 - i32.sub local.set $4 loop $repeat|0 local.get $2 @@ -7880,9 +7911,6 @@ local.set $3 local.get $0 i32.load offset=8 - local.get $0 - i32.load offset=4 - i32.sub i32.const 1 i32.shr_u local.set $4 @@ -7967,9 +7995,6 @@ local.set $3 local.get $0 i32.load offset=8 - local.get $0 - i32.load offset=4 - i32.sub i32.const 1 i32.shr_u local.set $4 @@ -8060,9 +8085,6 @@ local.set $3 local.get $0 i32.load offset=8 - local.get $0 - i32.load offset=4 - i32.sub i32.const 2 i32.shr_u local.set $4 @@ -8194,9 +8216,6 @@ local.set $3 local.get $0 i32.load offset=8 - local.get $0 - i32.load offset=4 - i32.sub i32.const 3 i32.shr_u local.set $4 @@ -8485,9 +8504,6 @@ local.set $3 local.get $0 i32.load offset=8 - local.get $0 - i32.load offset=4 - i32.sub i32.const 2 i32.shr_u local.set $4 @@ -8737,9 +8753,6 @@ local.set $3 local.get $0 i32.load offset=8 - local.get $0 - i32.load offset=4 - i32.sub i32.const 3 i32.shr_u local.set $4 @@ -8815,15 +8828,24 @@ end ) (func $std/typedarray/testArrayForEach~anonymous|0 (; 187 ;) (type $FUNCSIG$viii) (param $0 i32) (param $1 i32) (param $2 i32) + (local $3 i32) local.get $0 i32.const 255 i32.and - global.get $std/typedarray/forEachValues - i32.load offset=4 local.get $1 i32.const 2 i32.shl + local.tee $0 + global.get $std/typedarray/forEachValues + local.tee $3 + i32.load offset=4 i32.add + i32.const -1 + local.get $0 + local.get $3 + i32.load offset=8 + i32.lt_u + select i32.load i32.const 255 i32.and @@ -8872,9 +8894,6 @@ local.set $2 local.get $0 i32.load offset=8 - local.get $0 - i32.load offset=4 - i32.sub local.set $3 loop $repeat|0 local.get $1 @@ -8902,32 +8921,57 @@ (func $std/typedarray/testArrayForEach (; 189 ;) (type $FUNCSIG$v) (local $0 i32) (local $1 i32) + (local $2 i32) i32.const 0 global.set $std/typedarray/forEachCallCount i32.const 3 call $~lib/typedarray/Int8Array#constructor - local.tee $0 + local.tee $1 global.set $std/typedarray/forEachSelf - local.get $0 + local.get $1 i32.load offset=4 global.get $std/typedarray/forEachValues - local.tee $1 + local.tee $2 + local.tee $0 i32.load offset=4 + i32.const -1 + i32.const 0 + local.get $0 + i32.load offset=8 + i32.lt_u + select i32.load i32.store8 - local.get $0 - i32.load offset=4 local.get $1 i32.load offset=4 - i32.load offset=4 - i32.store8 offset=1 local.get $0 i32.load offset=4 - local.get $1 - i32.load offset=4 + i32.const 4 + i32.add + i32.const -1 + i32.const 4 + local.get $0 i32.load offset=8 - i32.store8 offset=2 + i32.lt_u + select + i32.load + i32.store8 offset=1 + local.get $1 + i32.load offset=4 + local.get $2 + local.tee $0 + i32.load offset=4 + i32.const 8 + i32.add + i32.const -1 + i32.const 8 local.get $0 + i32.load offset=8 + i32.lt_u + select + i32.load + i32.store8 offset=2 + local.get $1 call $~lib/typedarray/Int8Array#forEach global.get $std/typedarray/forEachCallCount i32.const 3 @@ -8950,9 +8994,6 @@ local.set $3 local.get $0 i32.load offset=8 - local.get $0 - i32.load offset=4 - i32.sub local.set $4 loop $repeat|0 local.get $2 @@ -8980,33 +9021,58 @@ (func $std/typedarray/testArrayForEach (; 191 ;) (type $FUNCSIG$v) (local $0 i32) (local $1 i32) + (local $2 i32) i32.const 0 global.set $std/typedarray/forEachCallCount i32.const 0 i32.const 3 call $~lib/typedarray/Uint8Array#constructor - local.tee $0 + local.tee $1 global.set $std/typedarray/forEachSelf - local.get $0 + local.get $1 i32.load offset=4 global.get $std/typedarray/forEachValues - local.tee $1 + local.tee $2 + local.tee $0 i32.load offset=4 + i32.const -1 + i32.const 0 + local.get $0 + i32.load offset=8 + i32.lt_u + select i32.load i32.store8 - local.get $0 - i32.load offset=4 local.get $1 i32.load offset=4 - i32.load offset=4 - i32.store8 offset=1 local.get $0 i32.load offset=4 - local.get $1 - i32.load offset=4 + i32.const 4 + i32.add + i32.const -1 + i32.const 4 + local.get $0 i32.load offset=8 - i32.store8 offset=2 + i32.lt_u + select + i32.load + i32.store8 offset=1 + local.get $1 + i32.load offset=4 + local.get $2 + local.tee $0 + i32.load offset=4 + i32.const 8 + i32.add + i32.const -1 + i32.const 8 local.get $0 + i32.load offset=8 + i32.lt_u + select + i32.load + i32.store8 offset=2 + local.get $1 i32.const 102 call $~lib/typedarray/Uint8Array#forEach global.get $std/typedarray/forEachCallCount @@ -9035,7 +9101,14 @@ i32.load offset=4 global.get $std/typedarray/forEachValues local.tee $2 + local.tee $0 i32.load offset=4 + i32.const -1 + i32.const 0 + local.get $0 + i32.load offset=8 + i32.lt_u + select i32.load i32.const 255 i32.and @@ -9056,8 +9129,17 @@ local.get $1 i32.load offset=4 local.get $2 + local.tee $0 i32.load offset=4 - i32.load offset=4 + i32.const 4 + i32.add + i32.const -1 + i32.const 4 + local.get $0 + i32.load offset=8 + i32.lt_u + select + i32.load i32.const 255 i32.and local.tee $0 @@ -9077,8 +9159,17 @@ local.get $1 i32.load offset=4 local.get $2 + local.tee $0 i32.load offset=4 + i32.const 8 + i32.add + i32.const -1 + i32.const 8 + local.get $0 i32.load offset=8 + i32.lt_u + select + i32.load i32.const 255 i32.and local.tee $0 @@ -9111,15 +9202,24 @@ end ) (func $std/typedarray/testArrayForEach~anonymous|0 (; 193 ;) (type $FUNCSIG$viii) (param $0 i32) (param $1 i32) (param $2 i32) + (local $3 i32) local.get $0 i32.const 65535 i32.and - global.get $std/typedarray/forEachValues - i32.load offset=4 local.get $1 i32.const 2 i32.shl + local.tee $0 + global.get $std/typedarray/forEachValues + local.tee $3 + i32.load offset=4 i32.add + i32.const -1 + local.get $0 + local.get $3 + i32.load offset=8 + i32.lt_u + select i32.load i32.const 65535 i32.and @@ -9168,9 +9268,6 @@ local.set $2 local.get $0 i32.load offset=8 - local.get $0 - i32.load offset=4 - i32.sub i32.const 1 i32.shr_u local.set $3 @@ -9202,32 +9299,57 @@ (func $std/typedarray/testArrayForEach (; 195 ;) (type $FUNCSIG$v) (local $0 i32) (local $1 i32) + (local $2 i32) i32.const 0 global.set $std/typedarray/forEachCallCount i32.const 3 call $~lib/typedarray/Int16Array#constructor - local.tee $0 + local.tee $1 global.set $std/typedarray/forEachSelf - local.get $0 + local.get $1 i32.load offset=4 global.get $std/typedarray/forEachValues - local.tee $1 + local.tee $2 + local.tee $0 i32.load offset=4 + i32.const -1 + i32.const 0 + local.get $0 + i32.load offset=8 + i32.lt_u + select i32.load i32.store16 - local.get $0 - i32.load offset=4 local.get $1 i32.load offset=4 - i32.load offset=4 - i32.store16 offset=2 local.get $0 i32.load offset=4 - local.get $1 - i32.load offset=4 + i32.const 4 + i32.add + i32.const -1 + i32.const 4 + local.get $0 i32.load offset=8 - i32.store16 offset=4 + i32.lt_u + select + i32.load + i32.store16 offset=2 + local.get $1 + i32.load offset=4 + local.get $2 + local.tee $0 + i32.load offset=4 + i32.const 8 + i32.add + i32.const -1 + i32.const 8 local.get $0 + i32.load offset=8 + i32.lt_u + select + i32.load + i32.store16 offset=4 + local.get $1 call $~lib/typedarray/Int16Array#forEach global.get $std/typedarray/forEachCallCount i32.const 3 @@ -9250,9 +9372,6 @@ local.set $2 local.get $0 i32.load offset=8 - local.get $0 - i32.load offset=4 - i32.sub i32.const 1 i32.shr_u local.set $3 @@ -9284,32 +9403,57 @@ (func $std/typedarray/testArrayForEach (; 197 ;) (type $FUNCSIG$v) (local $0 i32) (local $1 i32) + (local $2 i32) i32.const 0 global.set $std/typedarray/forEachCallCount i32.const 3 call $~lib/typedarray/Uint16Array#constructor - local.tee $0 + local.tee $1 global.set $std/typedarray/forEachSelf - local.get $0 + local.get $1 i32.load offset=4 global.get $std/typedarray/forEachValues - local.tee $1 + local.tee $2 + local.tee $0 i32.load offset=4 + i32.const -1 + i32.const 0 + local.get $0 + i32.load offset=8 + i32.lt_u + select i32.load i32.store16 - local.get $0 - i32.load offset=4 local.get $1 i32.load offset=4 - i32.load offset=4 - i32.store16 offset=2 local.get $0 i32.load offset=4 - local.get $1 - i32.load offset=4 + i32.const 4 + i32.add + i32.const -1 + i32.const 4 + local.get $0 i32.load offset=8 - i32.store16 offset=4 + i32.lt_u + select + i32.load + i32.store16 offset=2 + local.get $1 + i32.load offset=4 + local.get $2 + local.tee $0 + i32.load offset=4 + i32.const 8 + i32.add + i32.const -1 + i32.const 8 local.get $0 + i32.load offset=8 + i32.lt_u + select + i32.load + i32.store16 offset=4 + local.get $1 call $~lib/typedarray/Uint16Array#forEach global.get $std/typedarray/forEachCallCount i32.const 3 @@ -9324,13 +9468,22 @@ end ) (func $std/typedarray/testArrayForEach~anonymous|0 (; 198 ;) (type $FUNCSIG$viii) (param $0 i32) (param $1 i32) (param $2 i32) + (local $3 i32) local.get $0 - global.get $std/typedarray/forEachValues - i32.load offset=4 local.get $1 i32.const 2 i32.shl + local.tee $0 + global.get $std/typedarray/forEachValues + local.tee $3 + i32.load offset=4 i32.add + i32.const -1 + local.get $0 + local.get $3 + i32.load offset=8 + i32.lt_u + select i32.load i32.ne if @@ -9377,9 +9530,6 @@ local.set $3 local.get $0 i32.load offset=8 - local.get $0 - i32.load offset=4 - i32.sub i32.const 2 i32.shr_u local.set $4 @@ -9411,32 +9561,57 @@ (func $std/typedarray/testArrayForEach (; 200 ;) (type $FUNCSIG$v) (local $0 i32) (local $1 i32) + (local $2 i32) i32.const 0 global.set $std/typedarray/forEachCallCount i32.const 3 call $~lib/typedarray/Int32Array#constructor - local.tee $0 + local.tee $1 global.set $std/typedarray/forEachSelf - local.get $0 + local.get $1 i32.load offset=4 global.get $std/typedarray/forEachValues - local.tee $1 + local.tee $2 + local.tee $0 i32.load offset=4 + i32.const -1 + i32.const 0 + local.get $0 + i32.load offset=8 + i32.lt_u + select i32.load i32.store - local.get $0 - i32.load offset=4 local.get $1 i32.load offset=4 - i32.load offset=4 - i32.store offset=4 local.get $0 i32.load offset=4 - local.get $1 - i32.load offset=4 + i32.const 4 + i32.add + i32.const -1 + i32.const 4 + local.get $0 i32.load offset=8 - i32.store offset=8 + i32.lt_u + select + i32.load + i32.store offset=4 + local.get $1 + i32.load offset=4 + local.get $2 + local.tee $0 + i32.load offset=4 + i32.const 8 + i32.add + i32.const -1 + i32.const 8 local.get $0 + i32.load offset=8 + i32.lt_u + select + i32.load + i32.store offset=8 + local.get $1 i32.const 106 call $~lib/typedarray/Int32Array#forEach global.get $std/typedarray/forEachCallCount @@ -9454,32 +9629,57 @@ (func $std/typedarray/testArrayForEach (; 201 ;) (type $FUNCSIG$v) (local $0 i32) (local $1 i32) + (local $2 i32) i32.const 0 global.set $std/typedarray/forEachCallCount i32.const 3 call $~lib/typedarray/Uint32Array#constructor - local.tee $0 + local.tee $1 global.set $std/typedarray/forEachSelf - local.get $0 + local.get $1 i32.load offset=4 global.get $std/typedarray/forEachValues - local.tee $1 + local.tee $2 + local.tee $0 i32.load offset=4 + i32.const -1 + i32.const 0 + local.get $0 + i32.load offset=8 + i32.lt_u + select i32.load i32.store - local.get $0 - i32.load offset=4 local.get $1 i32.load offset=4 - i32.load offset=4 - i32.store offset=4 local.get $0 i32.load offset=4 - local.get $1 - i32.load offset=4 + i32.const 4 + i32.add + i32.const -1 + i32.const 4 + local.get $0 i32.load offset=8 - i32.store offset=8 + i32.lt_u + select + i32.load + i32.store offset=4 + local.get $1 + i32.load offset=4 + local.get $2 + local.tee $0 + i32.load offset=4 + i32.const 8 + i32.add + i32.const -1 + i32.const 8 local.get $0 + i32.load offset=8 + i32.lt_u + select + i32.load + i32.store offset=8 + local.get $1 i32.const 107 call $~lib/typedarray/Int32Array#forEach global.get $std/typedarray/forEachCallCount @@ -9495,13 +9695,23 @@ end ) (func $std/typedarray/testArrayForEach~anonymous|0 (; 202 ;) (type $FUNCSIG$vjii) (param $0 i64) (param $1 i32) (param $2 i32) + (local $3 i32) + (local $4 i32) local.get $0 - global.get $std/typedarray/forEachValues - i32.load offset=4 local.get $1 i32.const 2 i32.shl + local.tee $3 + global.get $std/typedarray/forEachValues + local.tee $4 + i32.load offset=4 i32.add + i32.const -1 + local.get $3 + local.get $4 + i32.load offset=8 + i32.lt_u + select i32.load i64.extend_i32_s i64.ne @@ -9549,9 +9759,6 @@ local.set $3 local.get $0 i32.load offset=8 - local.get $0 - i32.load offset=4 - i32.sub i32.const 3 i32.shr_u local.set $4 @@ -9583,32 +9790,57 @@ (func $std/typedarray/testArrayForEach (; 204 ;) (type $FUNCSIG$v) (local $0 i32) (local $1 i32) + (local $2 i32) i32.const 0 global.set $std/typedarray/forEachCallCount i32.const 3 call $~lib/typedarray/Int64Array#constructor - local.tee $0 + local.tee $1 global.set $std/typedarray/forEachSelf - local.get $0 + local.get $1 i32.load offset=4 global.get $std/typedarray/forEachValues - local.tee $1 + local.tee $2 + local.tee $0 i32.load offset=4 + i32.const -1 + i32.const 0 + local.get $0 + i32.load offset=8 + i32.lt_u + select i64.load32_s i64.store - local.get $0 - i32.load offset=4 local.get $1 i32.load offset=4 - i64.load32_s offset=4 + local.get $0 + i32.load offset=4 + i32.const 4 + i32.add + i32.const -1 + i32.const 4 + local.get $0 + i32.load offset=8 + i32.lt_u + select + i64.load32_s i64.store offset=8 - local.get $0 - i32.load offset=4 local.get $1 i32.load offset=4 - i64.load32_s offset=8 - i64.store offset=16 + local.get $2 + local.tee $0 + i32.load offset=4 + i32.const 8 + i32.add + i32.const -1 + i32.const 8 local.get $0 + i32.load offset=8 + i32.lt_u + select + i64.load32_s + i64.store offset=16 + local.get $1 i32.const 108 call $~lib/typedarray/Int64Array#forEach global.get $std/typedarray/forEachCallCount @@ -9626,32 +9858,57 @@ (func $std/typedarray/testArrayForEach (; 205 ;) (type $FUNCSIG$v) (local $0 i32) (local $1 i32) + (local $2 i32) i32.const 0 global.set $std/typedarray/forEachCallCount i32.const 3 call $~lib/typedarray/Uint64Array#constructor - local.tee $0 + local.tee $1 global.set $std/typedarray/forEachSelf - local.get $0 + local.get $1 i32.load offset=4 global.get $std/typedarray/forEachValues - local.tee $1 + local.tee $2 + local.tee $0 i32.load offset=4 + i32.const -1 + i32.const 0 + local.get $0 + i32.load offset=8 + i32.lt_u + select i64.load32_s i64.store - local.get $0 - i32.load offset=4 local.get $1 i32.load offset=4 - i64.load32_s offset=4 + local.get $0 + i32.load offset=4 + i32.const 4 + i32.add + i32.const -1 + i32.const 4 + local.get $0 + i32.load offset=8 + i32.lt_u + select + i64.load32_s i64.store offset=8 - local.get $0 - i32.load offset=4 local.get $1 i32.load offset=4 - i64.load32_s offset=8 - i64.store offset=16 + local.get $2 + local.tee $0 + i32.load offset=4 + i32.const 8 + i32.add + i32.const -1 + i32.const 8 local.get $0 + i32.load offset=8 + i32.lt_u + select + i64.load32_s + i64.store offset=16 + local.get $1 i32.const 109 call $~lib/typedarray/Int64Array#forEach global.get $std/typedarray/forEachCallCount @@ -9667,13 +9924,23 @@ end ) (func $std/typedarray/testArrayForEach~anonymous|0 (; 206 ;) (type $FUNCSIG$vfii) (param $0 f32) (param $1 i32) (param $2 i32) + (local $3 i32) + (local $4 i32) local.get $0 - global.get $std/typedarray/forEachValues - i32.load offset=4 local.get $1 i32.const 2 i32.shl + local.tee $3 + global.get $std/typedarray/forEachValues + local.tee $4 + i32.load offset=4 i32.add + i32.const -1 + local.get $3 + local.get $4 + i32.load offset=8 + i32.lt_u + select i32.load f32.convert_i32_s f32.ne @@ -9721,9 +9988,6 @@ local.set $2 local.get $0 i32.load offset=8 - local.get $0 - i32.load offset=4 - i32.sub i32.const 2 i32.shr_u local.set $3 @@ -9755,35 +10019,60 @@ (func $std/typedarray/testArrayForEach (; 208 ;) (type $FUNCSIG$v) (local $0 i32) (local $1 i32) + (local $2 i32) i32.const 0 global.set $std/typedarray/forEachCallCount i32.const 3 call $~lib/typedarray/Float32Array#constructor - local.tee $0 + local.tee $1 global.set $std/typedarray/forEachSelf - local.get $0 + local.get $1 i32.load offset=4 global.get $std/typedarray/forEachValues - local.tee $1 + local.tee $2 + local.tee $0 i32.load offset=4 + i32.const -1 + i32.const 0 + local.get $0 + i32.load offset=8 + i32.lt_u + select i32.load f32.convert_i32_s f32.store - local.get $0 - i32.load offset=4 local.get $1 i32.load offset=4 + local.get $0 i32.load offset=4 + i32.const 4 + i32.add + i32.const -1 + i32.const 4 + local.get $0 + i32.load offset=8 + i32.lt_u + select + i32.load f32.convert_i32_s f32.store offset=4 - local.get $0 - i32.load offset=4 local.get $1 i32.load offset=4 + local.get $2 + local.tee $0 + i32.load offset=4 + i32.const 8 + i32.add + i32.const -1 + i32.const 8 + local.get $0 i32.load offset=8 + i32.lt_u + select + i32.load f32.convert_i32_s f32.store offset=8 - local.get $0 + local.get $1 call $~lib/typedarray/Float32Array#forEach global.get $std/typedarray/forEachCallCount i32.const 3 @@ -9798,13 +10087,23 @@ end ) (func $std/typedarray/testArrayForEach~anonymous|0 (; 209 ;) (type $FUNCSIG$vdii) (param $0 f64) (param $1 i32) (param $2 i32) + (local $3 i32) + (local $4 i32) local.get $0 - global.get $std/typedarray/forEachValues - i32.load offset=4 local.get $1 i32.const 2 i32.shl + local.tee $3 + global.get $std/typedarray/forEachValues + local.tee $4 + i32.load offset=4 i32.add + i32.const -1 + local.get $3 + local.get $4 + i32.load offset=8 + i32.lt_u + select i32.load f64.convert_i32_s f64.ne @@ -9852,9 +10151,6 @@ local.set $2 local.get $0 i32.load offset=8 - local.get $0 - i32.load offset=4 - i32.sub i32.const 3 i32.shr_u local.set $3 @@ -9886,35 +10182,60 @@ (func $std/typedarray/testArrayForEach (; 211 ;) (type $FUNCSIG$v) (local $0 i32) (local $1 i32) + (local $2 i32) i32.const 0 global.set $std/typedarray/forEachCallCount i32.const 3 call $~lib/typedarray/Float64Array#constructor - local.tee $0 + local.tee $1 global.set $std/typedarray/forEachSelf - local.get $0 + local.get $1 i32.load offset=4 global.get $std/typedarray/forEachValues - local.tee $1 + local.tee $2 + local.tee $0 i32.load offset=4 + i32.const -1 + i32.const 0 + local.get $0 + i32.load offset=8 + i32.lt_u + select i32.load f64.convert_i32_s f64.store - local.get $0 - i32.load offset=4 local.get $1 i32.load offset=4 + local.get $0 i32.load offset=4 + i32.const 4 + i32.add + i32.const -1 + i32.const 4 + local.get $0 + i32.load offset=8 + i32.lt_u + select + i32.load f64.convert_i32_s f64.store offset=8 - local.get $0 - i32.load offset=4 local.get $1 i32.load offset=4 + local.get $2 + local.tee $0 + i32.load offset=4 + i32.const 8 + i32.add + i32.const -1 + i32.const 8 + local.get $0 i32.load offset=8 + i32.lt_u + select + i32.load f64.convert_i32_s f64.store offset=16 - local.get $0 + local.get $1 call $~lib/typedarray/Float64Array#forEach global.get $std/typedarray/forEachCallCount i32.const 3 @@ -9939,9 +10260,6 @@ local.set $4 local.get $0 i32.load offset=8 - local.get $0 - i32.load offset=4 - i32.sub i32.const 1 i32.sub local.set $1 @@ -9989,37 +10307,49 @@ local.set $1 i32.const 9 call $~lib/typedarray/Int8Array#constructor - local.set $2 + local.set $3 i32.const 9 call $~lib/typedarray/Int8Array#constructor - local.set $3 + local.set $4 loop $repeat|0 block $break|0 local.get $0 i32.const 9 i32.ge_s br_if $break|0 - local.get $2 + local.get $3 i32.load offset=4 local.get $0 i32.add local.get $0 i32.const 2 i32.shl - local.tee $4 + local.tee $2 local.get $1 i32.load offset=4 i32.add + i32.const -1 + local.get $2 + local.get $1 + i32.load offset=8 + i32.lt_u + select i32.load i32.store8 - local.get $3 + local.get $4 i32.load offset=4 local.get $0 i32.add local.get $1 i32.load offset=4 - local.get $4 + local.get $2 i32.add + i32.const -1 + local.get $2 + local.get $1 + i32.load offset=8 + i32.lt_u + select i32.load i32.store8 local.get $0 @@ -10029,7 +10359,7 @@ br $repeat|0 end end - local.get $2 + local.get $3 call $~lib/typedarray/Int8Array#reverse drop i32.const 0 @@ -10040,19 +10370,32 @@ i32.const 9 i32.ge_s br_if $break|1 - local.get $2 + local.get $3 i32.load offset=4 local.get $0 i32.add + i32.const -1 + local.get $0 + local.get $3 + i32.load offset=8 + i32.lt_u + select i32.load8_u - local.get $1 - i32.load offset=4 i32.const 8 local.get $0 i32.sub i32.const 2 i32.shl + local.tee $2 + local.get $1 + i32.load offset=4 i32.add + i32.const -1 + local.get $2 + local.get $1 + i32.load offset=8 + i32.lt_u + select i32.load i32.const 255 i32.and @@ -10074,13 +10417,20 @@ unreachable end end - local.get $3 + local.get $4 i32.const 4 i32.const 8 call $~lib/typedarray/Int8Array#subarray call $~lib/typedarray/Int8Array#reverse local.tee $0 + local.tee $1 i32.load offset=4 + i32.const -1 + i32.const 0 + local.get $1 + i32.load offset=8 + i32.lt_u + select i32.load8_s i32.const 8 i32.ne @@ -10093,8 +10443,17 @@ unreachable end local.get $0 + local.tee $1 i32.load offset=4 - i32.load8_s offset=1 + i32.const 1 + i32.add + i32.const -1 + i32.const 1 + local.get $1 + i32.load offset=8 + i32.lt_u + select + i32.load8_s i32.const 7 i32.ne if @@ -10105,9 +10464,17 @@ call $~lib/env/abort unreachable end - local.get $0 + local.get $1 i32.load offset=4 - i32.load8_s offset=2 + i32.const 2 + i32.add + i32.const -1 + i32.const 2 + local.get $1 + i32.load offset=8 + i32.lt_u + select + i32.load8_s i32.const 6 i32.ne if @@ -10118,9 +10485,17 @@ call $~lib/env/abort unreachable end - local.get $0 + local.get $1 i32.load offset=4 - i32.load8_s offset=3 + i32.const 3 + i32.add + i32.const -1 + i32.const 3 + local.get $1 + i32.load offset=8 + i32.lt_u + select + i32.load8_s i32.const 5 i32.ne if @@ -10143,9 +10518,6 @@ local.set $4 local.get $0 i32.load offset=8 - local.get $0 - i32.load offset=4 - i32.sub i32.const 1 i32.sub local.set $1 @@ -10190,11 +10562,8 @@ (local $4 i32) i32.const 8 local.get $0 - local.tee $2 + local.tee $3 i32.load offset=8 - local.get $0 - i32.load offset=4 - i32.sub local.tee $1 i32.const 8 local.get $1 @@ -10207,9 +10576,9 @@ local.get $1 i32.lt_s select - local.tee $3 + local.tee $2 local.get $0 - local.get $3 + local.get $2 i32.gt_s select local.set $4 @@ -10218,22 +10587,22 @@ i32.const 5 call $~lib/runtime/doRegister local.set $0 - local.get $2 + local.get $3 i32.load offset=4 local.set $1 local.get $0 - local.get $2 + local.get $3 i32.load i32.store local.get $0 local.get $1 - local.get $3 + local.get $2 i32.add i32.store offset=4 local.get $0 - local.get $1 local.get $4 - i32.add + local.get $2 + i32.sub i32.store offset=8 local.get $0 ) @@ -10248,38 +10617,50 @@ i32.const 0 i32.const 9 call $~lib/typedarray/Uint8Array#constructor - local.set $2 + local.set $3 i32.const 0 i32.const 9 call $~lib/typedarray/Uint8Array#constructor - local.set $3 + local.set $4 loop $repeat|0 block $break|0 local.get $0 i32.const 9 i32.ge_s br_if $break|0 - local.get $2 + local.get $3 i32.load offset=4 local.get $0 i32.add local.get $0 i32.const 2 i32.shl - local.tee $4 + local.tee $2 local.get $1 i32.load offset=4 i32.add + i32.const -1 + local.get $2 + local.get $1 + i32.load offset=8 + i32.lt_u + select i32.load i32.store8 - local.get $3 + local.get $4 i32.load offset=4 local.get $0 i32.add local.get $1 i32.load offset=4 - local.get $4 + local.get $2 i32.add + i32.const -1 + local.get $2 + local.get $1 + i32.load offset=8 + i32.lt_u + select i32.load i32.store8 local.get $0 @@ -10289,7 +10670,7 @@ br $repeat|0 end end - local.get $2 + local.get $3 call $~lib/typedarray/Uint8Array#reverse drop i32.const 0 @@ -10300,19 +10681,32 @@ i32.const 9 i32.ge_s br_if $break|1 - local.get $2 + local.get $3 i32.load offset=4 local.get $0 i32.add + i32.const -1 + local.get $0 + local.get $3 + i32.load offset=8 + i32.lt_u + select i32.load8_u - local.get $1 - i32.load offset=4 i32.const 8 local.get $0 i32.sub i32.const 2 i32.shl + local.tee $2 + local.get $1 + i32.load offset=4 i32.add + i32.const -1 + local.get $2 + local.get $1 + i32.load offset=8 + i32.lt_u + select i32.load i32.const 255 i32.and @@ -10334,11 +10728,18 @@ unreachable end end - local.get $3 + local.get $4 call $~lib/typedarray/Uint8Array#subarray call $~lib/typedarray/Uint8Array#reverse local.tee $0 + local.tee $1 i32.load offset=4 + i32.const -1 + i32.const 0 + local.get $1 + i32.load offset=8 + i32.lt_u + select i32.load8_u i32.const 8 i32.ne @@ -10351,8 +10752,17 @@ unreachable end local.get $0 + local.tee $1 i32.load offset=4 - i32.load8_u offset=1 + i32.const 1 + i32.add + i32.const -1 + i32.const 1 + local.get $1 + i32.load offset=8 + i32.lt_u + select + i32.load8_u i32.const 7 i32.ne if @@ -10363,9 +10773,17 @@ call $~lib/env/abort unreachable end - local.get $0 + local.get $1 i32.load offset=4 - i32.load8_u offset=2 + i32.const 2 + i32.add + i32.const -1 + i32.const 2 + local.get $1 + i32.load offset=8 + i32.lt_u + select + i32.load8_u i32.const 6 i32.ne if @@ -10376,9 +10794,17 @@ call $~lib/env/abort unreachable end - local.get $0 + local.get $1 i32.load offset=4 - i32.load8_u offset=3 + i32.const 3 + i32.add + i32.const -1 + i32.const 3 + local.get $1 + i32.load offset=8 + i32.lt_u + select + i32.load8_u i32.const 5 i32.ne if @@ -10397,11 +10823,8 @@ (local $4 i32) i32.const 8 local.get $0 - local.tee $2 + local.tee $3 i32.load offset=8 - local.get $0 - i32.load offset=4 - i32.sub local.tee $1 i32.const 8 local.get $1 @@ -10414,9 +10837,9 @@ local.get $1 i32.lt_s select - local.tee $3 + local.tee $2 local.get $0 - local.get $3 + local.get $2 i32.gt_s select local.set $4 @@ -10425,22 +10848,22 @@ i32.const 6 call $~lib/runtime/doRegister local.set $0 - local.get $2 + local.get $3 i32.load offset=4 local.set $1 local.get $0 - local.get $2 + local.get $3 i32.load i32.store local.get $0 local.get $1 - local.get $3 + local.get $2 i32.add i32.store offset=4 local.get $0 - local.get $1 local.get $4 - i32.add + local.get $2 + i32.sub i32.store offset=8 local.get $0 ) @@ -10455,27 +10878,33 @@ local.set $2 i32.const 9 call $~lib/typedarray/Uint8ClampedArray#constructor - local.set $3 + local.set $4 i32.const 9 call $~lib/typedarray/Uint8ClampedArray#constructor - local.set $4 + local.set $5 loop $repeat|0 block $break|0 local.get $0 i32.const 9 i32.ge_s br_if $break|0 - local.get $3 + local.get $4 i32.load offset=4 local.get $0 i32.add local.get $0 i32.const 2 i32.shl - local.tee $5 + local.tee $3 local.get $2 i32.load offset=4 i32.add + i32.const -1 + local.get $3 + local.get $2 + i32.load offset=8 + i32.lt_u + select i32.load i32.const 255 i32.and @@ -10493,14 +10922,20 @@ i32.or i32.and i32.store8 - local.get $4 + local.get $5 i32.load offset=4 local.get $0 i32.add local.get $2 i32.load offset=4 - local.get $5 + local.get $3 i32.add + i32.const -1 + local.get $3 + local.get $2 + i32.load offset=8 + i32.lt_u + select i32.load i32.const 255 i32.and @@ -10525,7 +10960,7 @@ br $repeat|0 end end - local.get $3 + local.get $4 call $~lib/typedarray/Uint8Array#reverse drop i32.const 0 @@ -10536,19 +10971,32 @@ i32.const 9 i32.ge_s br_if $break|1 - local.get $3 + local.get $4 i32.load offset=4 local.get $0 i32.add + i32.const -1 + local.get $0 + local.get $4 + i32.load offset=8 + i32.lt_u + select i32.load8_u - local.get $2 - i32.load offset=4 i32.const 8 local.get $0 i32.sub i32.const 2 i32.shl + local.tee $3 + local.get $2 + i32.load offset=4 i32.add + i32.const -1 + local.get $3 + local.get $2 + i32.load offset=8 + i32.lt_u + select i32.load i32.const 255 i32.and @@ -10570,11 +11018,18 @@ unreachable end end - local.get $4 + local.get $5 call $~lib/typedarray/Uint8ClampedArray#subarray call $~lib/typedarray/Uint8Array#reverse - local.tee $0 + local.tee $2 + local.tee $1 i32.load offset=4 + i32.const -1 + i32.const 0 + local.get $1 + i32.load offset=8 + i32.lt_u + select i32.load8_u i32.const 8 i32.ne @@ -10586,9 +11041,18 @@ call $~lib/env/abort unreachable end - local.get $0 + local.get $2 + local.tee $1 i32.load offset=4 - i32.load8_u offset=1 + i32.const 1 + i32.add + i32.const -1 + i32.const 1 + local.get $1 + i32.load offset=8 + i32.lt_u + select + i32.load8_u i32.const 7 i32.ne if @@ -10599,9 +11063,17 @@ call $~lib/env/abort unreachable end - local.get $0 + local.get $1 i32.load offset=4 - i32.load8_u offset=2 + i32.const 2 + i32.add + i32.const -1 + i32.const 2 + local.get $1 + i32.load offset=8 + i32.lt_u + select + i32.load8_u i32.const 6 i32.ne if @@ -10612,9 +11084,17 @@ call $~lib/env/abort unreachable end - local.get $0 + local.get $1 i32.load offset=4 - i32.load8_u offset=3 + i32.const 3 + i32.add + i32.const -1 + i32.const 3 + local.get $1 + i32.load offset=8 + i32.lt_u + select + i32.load8_u i32.const 5 i32.ne if @@ -10637,9 +11117,6 @@ local.set $4 local.get $0 i32.load offset=8 - local.get $0 - i32.load offset=4 - i32.sub i32.const 1 i32.shr_u i32.const 1 @@ -10690,11 +11167,8 @@ (local $4 i32) i32.const 8 local.get $0 - local.tee $2 + local.tee $3 i32.load offset=8 - local.get $0 - i32.load offset=4 - i32.sub i32.const 1 i32.shr_u local.tee $1 @@ -10709,9 +11183,9 @@ local.get $1 i32.lt_s select - local.tee $3 + local.tee $2 local.get $0 - local.get $3 + local.get $2 i32.gt_s select local.set $4 @@ -10720,15 +11194,15 @@ i32.const 7 call $~lib/runtime/doRegister local.set $0 - local.get $2 + local.get $3 i32.load offset=4 local.set $1 local.get $0 - local.get $2 + local.get $3 i32.load i32.store local.get $0 - local.get $3 + local.get $2 i32.const 1 i32.shl local.get $1 @@ -10736,10 +11210,10 @@ i32.store offset=4 local.get $0 local.get $4 + local.get $2 + i32.sub i32.const 1 i32.shl - local.get $1 - i32.add i32.store offset=8 local.get $0 ) @@ -10751,78 +11225,104 @@ (local $4 i32) (local $5 i32) global.get $std/typedarray/testArrayReverseValues - local.set $1 - i32.const 9 - call $~lib/typedarray/Int16Array#constructor - local.set $2 + local.set $0 i32.const 9 call $~lib/typedarray/Int16Array#constructor local.set $3 + i32.const 9 + call $~lib/typedarray/Int16Array#constructor + local.set $4 loop $repeat|0 block $break|0 - local.get $0 + local.get $1 i32.const 9 i32.ge_s br_if $break|0 - local.get $0 + local.get $1 i32.const 1 i32.shl - local.tee $4 - local.get $2 - i32.load offset=4 - i32.add - local.get $0 - i32.const 2 - i32.shl local.tee $5 - local.get $1 - i32.load offset=4 - i32.add - i32.load - i32.store16 local.get $3 i32.load offset=4 - local.get $4 i32.add local.get $1 + i32.const 2 + i32.shl + local.tee $2 + local.get $0 + i32.load offset=4 + i32.add + i32.const -1 + local.get $2 + local.get $0 + i32.load offset=8 + i32.lt_u + select + i32.load + i32.store16 + local.get $4 i32.load offset=4 local.get $5 i32.add + local.get $0 + i32.load offset=4 + local.get $2 + i32.add + i32.const -1 + local.get $2 + local.get $0 + i32.load offset=8 + i32.lt_u + select i32.load i32.store16 - local.get $0 + local.get $1 i32.const 1 i32.add - local.set $0 + local.set $1 br $repeat|0 end end - local.get $2 + local.get $3 call $~lib/typedarray/Int16Array#reverse drop i32.const 0 - local.set $0 + local.set $1 loop $repeat|1 block $break|1 - local.get $0 + local.get $1 i32.const 9 i32.ge_s br_if $break|1 - local.get $2 - i32.load offset=4 - local.get $0 + local.get $1 i32.const 1 i32.shl - i32.add - i32.load16_u - local.get $1 + local.tee $2 + local.get $3 i32.load offset=4 + i32.add + i32.const -1 + local.get $2 + local.get $3 + i32.load offset=8 + i32.lt_u + select + i32.load16_u i32.const 8 - local.get $0 + local.get $1 i32.sub i32.const 2 i32.shl + local.tee $2 + local.get $0 + i32.load offset=4 i32.add + i32.const -1 + local.get $2 + local.get $0 + i32.load offset=8 + i32.lt_u + select i32.load i32.const 65535 i32.and @@ -10835,20 +11335,27 @@ call $~lib/env/abort unreachable else - local.get $0 + local.get $1 i32.const 1 i32.add - local.set $0 + local.set $1 br $repeat|1 end unreachable end end - local.get $3 + local.get $4 call $~lib/typedarray/Int16Array#subarray call $~lib/typedarray/Int16Array#reverse + local.tee $1 local.tee $0 i32.load offset=4 + i32.const -1 + i32.const 0 + local.get $0 + i32.load offset=8 + i32.lt_u + select i32.load16_s i32.const 8 i32.ne @@ -10860,9 +11367,18 @@ call $~lib/env/abort unreachable end - local.get $0 + local.get $1 + local.tee $0 i32.load offset=4 - i32.load16_s offset=2 + i32.const 2 + i32.add + i32.const -1 + i32.const 2 + local.get $0 + i32.load offset=8 + i32.lt_u + select + i32.load16_s i32.const 7 i32.ne if @@ -10875,7 +11391,15 @@ end local.get $0 i32.load offset=4 - i32.load16_s offset=4 + i32.const 4 + i32.add + i32.const -1 + i32.const 4 + local.get $0 + i32.load offset=8 + i32.lt_u + select + i32.load16_s i32.const 6 i32.ne if @@ -10888,7 +11412,15 @@ end local.get $0 i32.load offset=4 - i32.load16_s offset=6 + i32.const 6 + i32.add + i32.const -1 + i32.const 6 + local.get $0 + i32.load offset=8 + i32.lt_u + select + i32.load16_s i32.const 5 i32.ne if @@ -10911,9 +11443,6 @@ local.set $4 local.get $0 i32.load offset=8 - local.get $0 - i32.load offset=4 - i32.sub i32.const 1 i32.shr_u i32.const 1 @@ -10964,11 +11493,8 @@ (local $4 i32) i32.const 8 local.get $0 - local.tee $2 + local.tee $3 i32.load offset=8 - local.get $0 - i32.load offset=4 - i32.sub i32.const 1 i32.shr_u local.tee $1 @@ -10983,9 +11509,9 @@ local.get $1 i32.lt_s select - local.tee $3 + local.tee $2 local.get $0 - local.get $3 + local.get $2 i32.gt_s select local.set $4 @@ -10994,15 +11520,15 @@ i32.const 8 call $~lib/runtime/doRegister local.set $0 - local.get $2 + local.get $3 i32.load offset=4 local.set $1 local.get $0 - local.get $2 + local.get $3 i32.load i32.store local.get $0 - local.get $3 + local.get $2 i32.const 1 i32.shl local.get $1 @@ -11010,10 +11536,10 @@ i32.store offset=4 local.get $0 local.get $4 + local.get $2 + i32.sub i32.const 1 i32.shl - local.get $1 - i32.add i32.store offset=8 local.get $0 ) @@ -11025,78 +11551,104 @@ (local $4 i32) (local $5 i32) global.get $std/typedarray/testArrayReverseValues - local.set $1 - i32.const 9 - call $~lib/typedarray/Uint16Array#constructor - local.set $2 + local.set $0 i32.const 9 call $~lib/typedarray/Uint16Array#constructor local.set $3 + i32.const 9 + call $~lib/typedarray/Uint16Array#constructor + local.set $4 loop $repeat|0 block $break|0 - local.get $0 + local.get $1 i32.const 9 i32.ge_s br_if $break|0 - local.get $0 + local.get $1 i32.const 1 i32.shl - local.tee $4 - local.get $2 - i32.load offset=4 - i32.add - local.get $0 - i32.const 2 - i32.shl local.tee $5 - local.get $1 - i32.load offset=4 - i32.add - i32.load - i32.store16 local.get $3 i32.load offset=4 - local.get $4 i32.add local.get $1 + i32.const 2 + i32.shl + local.tee $2 + local.get $0 + i32.load offset=4 + i32.add + i32.const -1 + local.get $2 + local.get $0 + i32.load offset=8 + i32.lt_u + select + i32.load + i32.store16 + local.get $4 i32.load offset=4 local.get $5 i32.add + local.get $0 + i32.load offset=4 + local.get $2 + i32.add + i32.const -1 + local.get $2 + local.get $0 + i32.load offset=8 + i32.lt_u + select i32.load i32.store16 - local.get $0 + local.get $1 i32.const 1 i32.add - local.set $0 + local.set $1 br $repeat|0 end end - local.get $2 + local.get $3 call $~lib/typedarray/Uint16Array#reverse drop i32.const 0 - local.set $0 + local.set $1 loop $repeat|1 block $break|1 - local.get $0 + local.get $1 i32.const 9 i32.ge_s br_if $break|1 - local.get $2 - i32.load offset=4 - local.get $0 + local.get $1 i32.const 1 i32.shl - i32.add - i32.load16_u - local.get $1 + local.tee $2 + local.get $3 i32.load offset=4 + i32.add + i32.const -1 + local.get $2 + local.get $3 + i32.load offset=8 + i32.lt_u + select + i32.load16_u i32.const 8 - local.get $0 + local.get $1 i32.sub i32.const 2 i32.shl + local.tee $2 + local.get $0 + i32.load offset=4 i32.add + i32.const -1 + local.get $2 + local.get $0 + i32.load offset=8 + i32.lt_u + select i32.load i32.const 65535 i32.and @@ -11109,20 +11661,27 @@ call $~lib/env/abort unreachable else - local.get $0 + local.get $1 i32.const 1 i32.add - local.set $0 + local.set $1 br $repeat|1 end unreachable end end - local.get $3 + local.get $4 call $~lib/typedarray/Uint16Array#subarray call $~lib/typedarray/Uint16Array#reverse + local.tee $1 local.tee $0 i32.load offset=4 + i32.const -1 + i32.const 0 + local.get $0 + i32.load offset=8 + i32.lt_u + select i32.load16_u i32.const 8 i32.ne @@ -11134,9 +11693,18 @@ call $~lib/env/abort unreachable end - local.get $0 + local.get $1 + local.tee $0 i32.load offset=4 - i32.load16_u offset=2 + i32.const 2 + i32.add + i32.const -1 + i32.const 2 + local.get $0 + i32.load offset=8 + i32.lt_u + select + i32.load16_u i32.const 7 i32.ne if @@ -11149,7 +11717,15 @@ end local.get $0 i32.load offset=4 - i32.load16_u offset=4 + i32.const 4 + i32.add + i32.const -1 + i32.const 4 + local.get $0 + i32.load offset=8 + i32.lt_u + select + i32.load16_u i32.const 6 i32.ne if @@ -11162,7 +11738,15 @@ end local.get $0 i32.load offset=4 - i32.load16_u offset=6 + i32.const 6 + i32.add + i32.const -1 + i32.const 6 + local.get $0 + i32.load offset=8 + i32.lt_u + select + i32.load16_u i32.const 5 i32.ne if @@ -11185,9 +11769,6 @@ local.set $4 local.get $0 i32.load offset=8 - local.get $0 - i32.load offset=4 - i32.sub i32.const 2 i32.shr_u i32.const 1 @@ -11238,75 +11819,101 @@ (local $3 i32) (local $4 i32) global.get $std/typedarray/testArrayReverseValues - local.set $1 + local.set $0 i32.const 9 call $~lib/typedarray/Int32Array#constructor - local.set $2 + local.set $3 i32.const 9 call $~lib/typedarray/Int32Array#constructor local.set $4 loop $repeat|0 block $break|0 - local.get $0 + local.get $2 i32.const 9 i32.ge_s br_if $break|0 - local.get $0 + local.get $2 i32.const 2 i32.shl - local.tee $3 - local.get $2 - i32.load offset=4 - i32.add - local.get $1 - i32.load offset=4 + local.tee $1 local.get $3 + i32.load offset=4 i32.add + local.get $0 + i32.load offset=4 + local.get $1 + i32.add + i32.const -1 + local.get $1 + local.get $0 + i32.load offset=8 + i32.lt_u + select i32.load i32.store local.get $4 i32.load offset=4 - local.get $3 - i32.add local.get $1 - i32.load offset=4 - local.get $3 i32.add + local.get $0 + i32.load offset=4 + local.get $1 + i32.add + i32.const -1 + local.get $1 + local.get $0 + i32.load offset=8 + i32.lt_u + select i32.load i32.store - local.get $0 + local.get $2 i32.const 1 i32.add - local.set $0 + local.set $2 br $repeat|0 end end - local.get $2 + local.get $3 call $~lib/typedarray/Int32Array#reverse drop i32.const 0 - local.set $0 + local.set $2 loop $repeat|1 block $break|1 - local.get $0 + local.get $2 i32.const 9 i32.ge_s br_if $break|1 local.get $2 - i32.load offset=4 - local.get $0 i32.const 2 i32.shl - i32.add - i32.load - local.get $1 + local.tee $1 + local.get $3 i32.load offset=4 + i32.add + i32.const -1 + local.get $1 + local.get $3 + i32.load offset=8 + i32.lt_u + select + i32.load i32.const 8 - local.get $0 + local.get $2 i32.sub i32.const 2 i32.shl + local.tee $1 + local.get $0 + i32.load offset=4 i32.add + i32.const -1 + local.get $1 + local.get $0 + i32.load offset=8 + i32.lt_u + select i32.load i32.ne if @@ -11317,10 +11924,10 @@ call $~lib/env/abort unreachable else - local.get $0 + local.get $2 i32.const 1 i32.add - local.set $0 + local.set $2 br $repeat|1 end unreachable @@ -11331,8 +11938,15 @@ i32.const 8 call $~lib/typedarray/Int32Array#subarray call $~lib/typedarray/Int32Array#reverse + local.tee $1 local.tee $0 i32.load offset=4 + i32.const -1 + i32.const 0 + local.get $0 + i32.load offset=8 + i32.lt_u + select i32.load i32.const 8 i32.ne @@ -11344,9 +11958,18 @@ call $~lib/env/abort unreachable end + local.get $1 + local.tee $0 + i32.load offset=4 + i32.const 4 + i32.add + i32.const -1 + i32.const 4 local.get $0 - i32.load offset=4 - i32.load offset=4 + i32.load offset=8 + i32.lt_u + select + i32.load i32.const 7 i32.ne if @@ -11359,7 +11982,15 @@ end local.get $0 i32.load offset=4 + i32.const 8 + i32.add + i32.const -1 + i32.const 8 + local.get $0 i32.load offset=8 + i32.lt_u + select + i32.load i32.const 6 i32.ne if @@ -11372,7 +12003,15 @@ end local.get $0 i32.load offset=4 - i32.load offset=12 + i32.const 12 + i32.add + i32.const -1 + i32.const 12 + local.get $0 + i32.load offset=8 + i32.lt_u + select + i32.load i32.const 5 i32.ne if @@ -11391,11 +12030,8 @@ (local $4 i32) i32.const 8 local.get $0 - local.tee $2 + local.tee $3 i32.load offset=8 - local.get $0 - i32.load offset=4 - i32.sub i32.const 2 i32.shr_u local.tee $1 @@ -11410,9 +12046,9 @@ local.get $1 i32.lt_s select - local.tee $3 + local.tee $2 local.get $0 - local.get $3 + local.get $2 i32.gt_s select local.set $4 @@ -11421,15 +12057,15 @@ i32.const 10 call $~lib/runtime/doRegister local.set $0 - local.get $2 + local.get $3 i32.load offset=4 local.set $1 local.get $0 - local.get $2 + local.get $3 i32.load i32.store local.get $0 - local.get $3 + local.get $2 i32.const 2 i32.shl local.get $1 @@ -11437,10 +12073,10 @@ i32.store offset=4 local.get $0 local.get $4 + local.get $2 + i32.sub i32.const 2 i32.shl - local.get $1 - i32.add i32.store offset=8 local.get $0 ) @@ -11451,75 +12087,101 @@ (local $3 i32) (local $4 i32) global.get $std/typedarray/testArrayReverseValues - local.set $1 + local.set $0 i32.const 9 call $~lib/typedarray/Uint32Array#constructor - local.set $2 + local.set $3 i32.const 9 call $~lib/typedarray/Uint32Array#constructor local.set $4 loop $repeat|0 block $break|0 - local.get $0 + local.get $2 i32.const 9 i32.ge_s br_if $break|0 - local.get $0 + local.get $2 i32.const 2 i32.shl - local.tee $3 - local.get $2 - i32.load offset=4 - i32.add - local.get $1 - i32.load offset=4 + local.tee $1 local.get $3 + i32.load offset=4 i32.add + local.get $0 + i32.load offset=4 + local.get $1 + i32.add + i32.const -1 + local.get $1 + local.get $0 + i32.load offset=8 + i32.lt_u + select i32.load i32.store local.get $4 i32.load offset=4 - local.get $3 - i32.add local.get $1 - i32.load offset=4 - local.get $3 i32.add + local.get $0 + i32.load offset=4 + local.get $1 + i32.add + i32.const -1 + local.get $1 + local.get $0 + i32.load offset=8 + i32.lt_u + select i32.load i32.store - local.get $0 + local.get $2 i32.const 1 i32.add - local.set $0 + local.set $2 br $repeat|0 end end - local.get $2 + local.get $3 call $~lib/typedarray/Int32Array#reverse drop i32.const 0 - local.set $0 + local.set $2 loop $repeat|1 block $break|1 - local.get $0 + local.get $2 i32.const 9 i32.ge_s br_if $break|1 local.get $2 - i32.load offset=4 - local.get $0 i32.const 2 i32.shl - i32.add - i32.load - local.get $1 + local.tee $1 + local.get $3 i32.load offset=4 + i32.add + i32.const -1 + local.get $1 + local.get $3 + i32.load offset=8 + i32.lt_u + select + i32.load i32.const 8 - local.get $0 + local.get $2 i32.sub i32.const 2 i32.shl + local.tee $1 + local.get $0 + i32.load offset=4 i32.add + i32.const -1 + local.get $1 + local.get $0 + i32.load offset=8 + i32.lt_u + select i32.load i32.ne if @@ -11530,10 +12192,10 @@ call $~lib/env/abort unreachable else - local.get $0 + local.get $2 i32.const 1 i32.add - local.set $0 + local.set $2 br $repeat|1 end unreachable @@ -11542,8 +12204,15 @@ local.get $4 call $~lib/typedarray/Uint32Array#subarray call $~lib/typedarray/Int32Array#reverse + local.tee $1 local.tee $0 i32.load offset=4 + i32.const -1 + i32.const 0 + local.get $0 + i32.load offset=8 + i32.lt_u + select i32.load i32.const 8 i32.ne @@ -11555,9 +12224,18 @@ call $~lib/env/abort unreachable end + local.get $1 + local.tee $0 + i32.load offset=4 + i32.const 4 + i32.add + i32.const -1 + i32.const 4 local.get $0 - i32.load offset=4 - i32.load offset=4 + i32.load offset=8 + i32.lt_u + select + i32.load i32.const 7 i32.ne if @@ -11570,7 +12248,15 @@ end local.get $0 i32.load offset=4 + i32.const 8 + i32.add + i32.const -1 + i32.const 8 + local.get $0 i32.load offset=8 + i32.lt_u + select + i32.load i32.const 6 i32.ne if @@ -11583,7 +12269,15 @@ end local.get $0 i32.load offset=4 - i32.load offset=12 + i32.const 12 + i32.add + i32.const -1 + i32.const 12 + local.get $0 + i32.load offset=8 + i32.lt_u + select + i32.load i32.const 5 i32.ne if @@ -11606,9 +12300,6 @@ local.set $4 local.get $0 i32.load offset=8 - local.get $0 - i32.load offset=4 - i32.sub i32.const 3 i32.shr_u i32.const 1 @@ -11659,11 +12350,8 @@ (local $4 i32) i32.const 8 local.get $0 - local.tee $2 + local.tee $3 i32.load offset=8 - local.get $0 - i32.load offset=4 - i32.sub i32.const 3 i32.shr_u local.tee $1 @@ -11678,9 +12366,9 @@ local.get $1 i32.lt_s select - local.tee $3 + local.tee $2 local.get $0 - local.get $3 + local.get $2 i32.gt_s select local.set $4 @@ -11689,15 +12377,15 @@ i32.const 11 call $~lib/runtime/doRegister local.set $0 - local.get $2 + local.get $3 i32.load offset=4 local.set $1 local.get $0 - local.get $2 + local.get $3 i32.load i32.store local.get $0 - local.get $3 + local.get $2 i32.const 3 i32.shl local.get $1 @@ -11705,10 +12393,10 @@ i32.store offset=4 local.get $0 local.get $4 + local.get $2 + i32.sub i32.const 3 i32.shl - local.get $1 - i32.add i32.store offset=8 local.get $0 ) @@ -11720,78 +12408,104 @@ (local $4 i32) (local $5 i32) global.get $std/typedarray/testArrayReverseValues - local.set $1 - i32.const 9 - call $~lib/typedarray/Int64Array#constructor - local.set $2 + local.set $0 i32.const 9 call $~lib/typedarray/Int64Array#constructor local.set $3 + i32.const 9 + call $~lib/typedarray/Int64Array#constructor + local.set $4 loop $repeat|0 block $break|0 - local.get $0 + local.get $1 i32.const 9 i32.ge_s br_if $break|0 - local.get $0 + local.get $1 i32.const 3 i32.shl - local.tee $4 - local.get $2 - i32.load offset=4 - i32.add - local.get $0 - i32.const 2 - i32.shl local.tee $5 - local.get $1 - i32.load offset=4 - i32.add - i64.load32_s - i64.store local.get $3 i32.load offset=4 - local.get $4 i32.add local.get $1 + i32.const 2 + i32.shl + local.tee $2 + local.get $0 + i32.load offset=4 + i32.add + i32.const -1 + local.get $2 + local.get $0 + i32.load offset=8 + i32.lt_u + select + i64.load32_s + i64.store + local.get $4 i32.load offset=4 local.get $5 i32.add + local.get $0 + i32.load offset=4 + local.get $2 + i32.add + i32.const -1 + local.get $2 + local.get $0 + i32.load offset=8 + i32.lt_u + select i64.load32_s i64.store - local.get $0 + local.get $1 i32.const 1 i32.add - local.set $0 + local.set $1 br $repeat|0 end end - local.get $2 + local.get $3 call $~lib/typedarray/Int64Array#reverse drop i32.const 0 - local.set $0 + local.set $1 loop $repeat|1 block $break|1 - local.get $0 + local.get $1 i32.const 9 i32.ge_s br_if $break|1 - local.get $2 - i32.load offset=4 - local.get $0 + local.get $1 i32.const 3 i32.shl - i32.add - i64.load - local.get $1 + local.tee $2 + local.get $3 i32.load offset=4 + i32.add + i32.const -1 + local.get $2 + local.get $3 + i32.load offset=8 + i32.lt_u + select + i64.load i32.const 8 - local.get $0 + local.get $1 i32.sub i32.const 2 i32.shl + local.tee $2 + local.get $0 + i32.load offset=4 i32.add + i32.const -1 + local.get $2 + local.get $0 + i32.load offset=8 + i32.lt_u + select i64.load32_s i64.ne if @@ -11802,20 +12516,27 @@ call $~lib/env/abort unreachable else - local.get $0 + local.get $1 i32.const 1 i32.add - local.set $0 + local.set $1 br $repeat|1 end unreachable end end - local.get $3 + local.get $4 call $~lib/typedarray/Int64Array#subarray call $~lib/typedarray/Int64Array#reverse + local.tee $1 local.tee $0 i32.load offset=4 + i32.const -1 + i32.const 0 + local.get $0 + i32.load offset=8 + i32.lt_u + select i64.load i64.const 8 i64.ne @@ -11827,9 +12548,18 @@ call $~lib/env/abort unreachable end - local.get $0 + local.get $1 + local.tee $0 i32.load offset=4 - i64.load offset=8 + i32.const 8 + i32.add + i32.const -1 + i32.const 8 + local.get $0 + i32.load offset=8 + i32.lt_u + select + i64.load i64.const 7 i64.ne if @@ -11842,7 +12572,15 @@ end local.get $0 i32.load offset=4 - i64.load offset=16 + i32.const 16 + i32.add + i32.const -1 + i32.const 16 + local.get $0 + i32.load offset=8 + i32.lt_u + select + i64.load i64.const 6 i64.ne if @@ -11855,7 +12593,15 @@ end local.get $0 i32.load offset=4 - i64.load offset=24 + i32.const 24 + i32.add + i32.const -1 + i32.const 24 + local.get $0 + i32.load offset=8 + i32.lt_u + select + i64.load i64.const 5 i64.ne if @@ -11874,11 +12620,8 @@ (local $4 i32) i32.const 8 local.get $0 - local.tee $2 + local.tee $3 i32.load offset=8 - local.get $0 - i32.load offset=4 - i32.sub i32.const 3 i32.shr_u local.tee $1 @@ -11893,9 +12636,9 @@ local.get $1 i32.lt_s select - local.tee $3 + local.tee $2 local.get $0 - local.get $3 + local.get $2 i32.gt_s select local.set $4 @@ -11904,15 +12647,15 @@ i32.const 12 call $~lib/runtime/doRegister local.set $0 - local.get $2 + local.get $3 i32.load offset=4 local.set $1 local.get $0 - local.get $2 + local.get $3 i32.load i32.store local.get $0 - local.get $3 + local.get $2 i32.const 3 i32.shl local.get $1 @@ -11920,10 +12663,10 @@ i32.store offset=4 local.get $0 local.get $4 + local.get $2 + i32.sub i32.const 3 i32.shl - local.get $1 - i32.add i32.store offset=8 local.get $0 ) @@ -11935,78 +12678,104 @@ (local $4 i32) (local $5 i32) global.get $std/typedarray/testArrayReverseValues - local.set $1 - i32.const 9 - call $~lib/typedarray/Uint64Array#constructor - local.set $2 + local.set $0 i32.const 9 call $~lib/typedarray/Uint64Array#constructor local.set $3 + i32.const 9 + call $~lib/typedarray/Uint64Array#constructor + local.set $4 loop $repeat|0 block $break|0 - local.get $0 + local.get $1 i32.const 9 i32.ge_s br_if $break|0 - local.get $0 + local.get $1 i32.const 3 i32.shl - local.tee $4 - local.get $2 - i32.load offset=4 - i32.add - local.get $0 - i32.const 2 - i32.shl local.tee $5 - local.get $1 - i32.load offset=4 - i32.add - i64.load32_s - i64.store local.get $3 i32.load offset=4 - local.get $4 i32.add local.get $1 + i32.const 2 + i32.shl + local.tee $2 + local.get $0 + i32.load offset=4 + i32.add + i32.const -1 + local.get $2 + local.get $0 + i32.load offset=8 + i32.lt_u + select + i64.load32_s + i64.store + local.get $4 i32.load offset=4 local.get $5 i32.add + local.get $0 + i32.load offset=4 + local.get $2 + i32.add + i32.const -1 + local.get $2 + local.get $0 + i32.load offset=8 + i32.lt_u + select i64.load32_s i64.store - local.get $0 + local.get $1 i32.const 1 i32.add - local.set $0 + local.set $1 br $repeat|0 end end - local.get $2 + local.get $3 call $~lib/typedarray/Int64Array#reverse drop i32.const 0 - local.set $0 + local.set $1 loop $repeat|1 block $break|1 - local.get $0 + local.get $1 i32.const 9 i32.ge_s br_if $break|1 - local.get $2 - i32.load offset=4 - local.get $0 + local.get $1 i32.const 3 i32.shl - i32.add - i64.load - local.get $1 + local.tee $2 + local.get $3 i32.load offset=4 + i32.add + i32.const -1 + local.get $2 + local.get $3 + i32.load offset=8 + i32.lt_u + select + i64.load i32.const 8 - local.get $0 + local.get $1 i32.sub i32.const 2 i32.shl + local.tee $2 + local.get $0 + i32.load offset=4 i32.add + i32.const -1 + local.get $2 + local.get $0 + i32.load offset=8 + i32.lt_u + select i64.load32_s i64.ne if @@ -12017,20 +12786,27 @@ call $~lib/env/abort unreachable else - local.get $0 + local.get $1 i32.const 1 i32.add - local.set $0 + local.set $1 br $repeat|1 end unreachable end end - local.get $3 + local.get $4 call $~lib/typedarray/Uint64Array#subarray call $~lib/typedarray/Int64Array#reverse + local.tee $1 local.tee $0 i32.load offset=4 + i32.const -1 + i32.const 0 + local.get $0 + i32.load offset=8 + i32.lt_u + select i64.load i64.const 8 i64.ne @@ -12042,9 +12818,18 @@ call $~lib/env/abort unreachable end - local.get $0 + local.get $1 + local.tee $0 i32.load offset=4 - i64.load offset=8 + i32.const 8 + i32.add + i32.const -1 + i32.const 8 + local.get $0 + i32.load offset=8 + i32.lt_u + select + i64.load i64.const 7 i64.ne if @@ -12057,7 +12842,15 @@ end local.get $0 i32.load offset=4 - i64.load offset=16 + i32.const 16 + i32.add + i32.const -1 + i32.const 16 + local.get $0 + i32.load offset=8 + i32.lt_u + select + i64.load i64.const 6 i64.ne if @@ -12070,7 +12863,15 @@ end local.get $0 i32.load offset=4 - i64.load offset=24 + i32.const 24 + i32.add + i32.const -1 + i32.const 24 + local.get $0 + i32.load offset=8 + i32.lt_u + select + i64.load i64.const 5 i64.ne if @@ -12093,9 +12894,6 @@ local.set $4 local.get $0 i32.load offset=8 - local.get $0 - i32.load offset=4 - i32.sub i32.const 2 i32.shr_u i32.const 1 @@ -12146,11 +12944,8 @@ (local $4 i32) i32.const 8 local.get $0 - local.tee $2 + local.tee $3 i32.load offset=8 - local.get $0 - i32.load offset=4 - i32.sub i32.const 2 i32.shr_u local.tee $1 @@ -12165,9 +12960,9 @@ local.get $1 i32.lt_s select - local.tee $3 + local.tee $2 local.get $0 - local.get $3 + local.get $2 i32.gt_s select local.set $4 @@ -12176,15 +12971,15 @@ i32.const 13 call $~lib/runtime/doRegister local.set $0 - local.get $2 + local.get $3 i32.load offset=4 local.set $1 local.get $0 - local.get $2 + local.get $3 i32.load i32.store local.get $0 - local.get $3 + local.get $2 i32.const 2 i32.shl local.get $1 @@ -12192,10 +12987,10 @@ i32.store offset=4 local.get $0 local.get $4 + local.get $2 + i32.sub i32.const 2 i32.shl - local.get $1 - i32.add i32.store offset=8 local.get $0 ) @@ -12206,77 +13001,103 @@ (local $3 i32) (local $4 i32) global.get $std/typedarray/testArrayReverseValues - local.set $1 + local.set $0 i32.const 9 call $~lib/typedarray/Float32Array#constructor - local.set $2 + local.set $3 i32.const 9 call $~lib/typedarray/Float32Array#constructor local.set $4 loop $repeat|0 block $break|0 - local.get $0 + local.get $2 i32.const 9 i32.ge_s br_if $break|0 - local.get $0 + local.get $2 i32.const 2 i32.shl - local.tee $3 - local.get $2 - i32.load offset=4 - i32.add - local.get $1 - i32.load offset=4 + local.tee $1 local.get $3 + i32.load offset=4 i32.add + local.get $0 + i32.load offset=4 + local.get $1 + i32.add + i32.const -1 + local.get $1 + local.get $0 + i32.load offset=8 + i32.lt_u + select i32.load f32.convert_i32_s f32.store local.get $4 i32.load offset=4 - local.get $3 - i32.add local.get $1 - i32.load offset=4 - local.get $3 i32.add + local.get $0 + i32.load offset=4 + local.get $1 + i32.add + i32.const -1 + local.get $1 + local.get $0 + i32.load offset=8 + i32.lt_u + select i32.load f32.convert_i32_s f32.store - local.get $0 + local.get $2 i32.const 1 i32.add - local.set $0 + local.set $2 br $repeat|0 end end - local.get $2 + local.get $3 call $~lib/typedarray/Float32Array#reverse drop i32.const 0 - local.set $0 + local.set $2 loop $repeat|1 block $break|1 - local.get $0 + local.get $2 i32.const 9 i32.ge_s br_if $break|1 local.get $2 - i32.load offset=4 - local.get $0 i32.const 2 i32.shl - i32.add - f32.load - local.get $1 + local.tee $1 + local.get $3 i32.load offset=4 + i32.add + i32.const -1 + local.get $1 + local.get $3 + i32.load offset=8 + i32.lt_u + select + f32.load i32.const 8 - local.get $0 + local.get $2 i32.sub i32.const 2 i32.shl + local.tee $1 + local.get $0 + i32.load offset=4 i32.add + i32.const -1 + local.get $1 + local.get $0 + i32.load offset=8 + i32.lt_u + select i32.load f32.convert_i32_s f32.ne @@ -12288,10 +13109,10 @@ call $~lib/env/abort unreachable else - local.get $0 + local.get $2 i32.const 1 i32.add - local.set $0 + local.set $2 br $repeat|1 end unreachable @@ -12300,8 +13121,15 @@ local.get $4 call $~lib/typedarray/Float32Array#subarray call $~lib/typedarray/Float32Array#reverse + local.tee $1 local.tee $0 i32.load offset=4 + i32.const -1 + i32.const 0 + local.get $0 + i32.load offset=8 + i32.lt_u + select f32.load f32.const 8 f32.ne @@ -12313,9 +13141,18 @@ call $~lib/env/abort unreachable end - local.get $0 + local.get $1 + local.tee $0 i32.load offset=4 - f32.load offset=4 + i32.const 4 + i32.add + i32.const -1 + i32.const 4 + local.get $0 + i32.load offset=8 + i32.lt_u + select + f32.load f32.const 7 f32.ne if @@ -12328,7 +13165,15 @@ end local.get $0 i32.load offset=4 - f32.load offset=8 + i32.const 8 + i32.add + i32.const -1 + i32.const 8 + local.get $0 + i32.load offset=8 + i32.lt_u + select + f32.load f32.const 6 f32.ne if @@ -12341,7 +13186,15 @@ end local.get $0 i32.load offset=4 - f32.load offset=12 + i32.const 12 + i32.add + i32.const -1 + i32.const 12 + local.get $0 + i32.load offset=8 + i32.lt_u + select + f32.load f32.const 5 f32.ne if @@ -12364,9 +13217,6 @@ local.set $4 local.get $0 i32.load offset=8 - local.get $0 - i32.load offset=4 - i32.sub i32.const 3 i32.shr_u i32.const 1 @@ -12418,80 +13268,106 @@ (local $4 i32) (local $5 i32) global.get $std/typedarray/testArrayReverseValues - local.set $1 - i32.const 9 - call $~lib/typedarray/Float64Array#constructor - local.set $2 + local.set $0 i32.const 9 call $~lib/typedarray/Float64Array#constructor local.set $3 + i32.const 9 + call $~lib/typedarray/Float64Array#constructor + local.set $4 loop $repeat|0 block $break|0 - local.get $0 + local.get $1 i32.const 9 i32.ge_s br_if $break|0 - local.get $0 + local.get $1 i32.const 3 i32.shl - local.tee $4 - local.get $2 + local.tee $5 + local.get $3 i32.load offset=4 i32.add - local.get $0 + local.get $1 i32.const 2 i32.shl - local.tee $5 - local.get $1 + local.tee $2 + local.get $0 i32.load offset=4 i32.add + i32.const -1 + local.get $2 + local.get $0 + i32.load offset=8 + i32.lt_u + select i32.load f64.convert_i32_s f64.store - local.get $3 - i32.load offset=4 local.get $4 - i32.add - local.get $1 i32.load offset=4 local.get $5 i32.add + local.get $0 + i32.load offset=4 + local.get $2 + i32.add + i32.const -1 + local.get $2 + local.get $0 + i32.load offset=8 + i32.lt_u + select i32.load f64.convert_i32_s f64.store - local.get $0 + local.get $1 i32.const 1 i32.add - local.set $0 + local.set $1 br $repeat|0 end end - local.get $2 + local.get $3 call $~lib/typedarray/Float64Array#reverse drop i32.const 0 - local.set $0 + local.set $1 loop $repeat|1 block $break|1 - local.get $0 + local.get $1 i32.const 9 i32.ge_s br_if $break|1 - local.get $2 - i32.load offset=4 - local.get $0 + local.get $1 i32.const 3 i32.shl - i32.add - f64.load - local.get $1 + local.tee $2 + local.get $3 i32.load offset=4 + i32.add + i32.const -1 + local.get $2 + local.get $3 + i32.load offset=8 + i32.lt_u + select + f64.load i32.const 8 - local.get $0 + local.get $1 i32.sub i32.const 2 i32.shl + local.tee $2 + local.get $0 + i32.load offset=4 i32.add + i32.const -1 + local.get $2 + local.get $0 + i32.load offset=8 + i32.lt_u + select i32.load f64.convert_i32_s f64.ne @@ -12503,22 +13379,29 @@ call $~lib/env/abort unreachable else - local.get $0 + local.get $1 i32.const 1 i32.add - local.set $0 + local.set $1 br $repeat|1 end unreachable end end - local.get $3 + local.get $4 i32.const 4 i32.const 8 call $~lib/typedarray/Float64Array#subarray call $~lib/typedarray/Float64Array#reverse + local.tee $1 local.tee $0 i32.load offset=4 + i32.const -1 + i32.const 0 + local.get $0 + i32.load offset=8 + i32.lt_u + select f64.load f64.const 8 f64.ne @@ -12530,9 +13413,18 @@ call $~lib/env/abort unreachable end - local.get $0 + local.get $1 + local.tee $0 i32.load offset=4 - f64.load offset=8 + i32.const 8 + i32.add + i32.const -1 + i32.const 8 + local.get $0 + i32.load offset=8 + i32.lt_u + select + f64.load f64.const 7 f64.ne if @@ -12545,7 +13437,15 @@ end local.get $0 i32.load offset=4 - f64.load offset=16 + i32.const 16 + i32.add + i32.const -1 + i32.const 16 + local.get $0 + i32.load offset=8 + i32.lt_u + select + f64.load f64.const 6 f64.ne if @@ -12558,7 +13458,15 @@ end local.get $0 i32.load offset=4 - f64.load offset=24 + i32.const 24 + i32.add + i32.const -1 + i32.const 24 + local.get $0 + i32.load offset=8 + i32.lt_u + select + f64.load f64.const 5 f64.ne if @@ -12599,9 +13507,6 @@ i32.store offset=8 local.get $0 i32.load offset=8 - local.get $0 - i32.load offset=4 - i32.sub i32.const 2 i32.shr_u i32.const 3 @@ -12629,11 +13534,7 @@ unreachable end global.get $std/typedarray/arr - local.tee $0 i32.load offset=8 - local.get $0 - i32.load offset=4 - i32.sub i32.const 12 i32.ne if @@ -12645,7 +13546,14 @@ unreachable end global.get $std/typedarray/arr + local.tee $0 i32.load offset=4 + i32.const -1 + i32.const 0 + local.get $0 + i32.load offset=8 + i32.lt_u + select i32.load i32.const 1 i32.ne @@ -12658,8 +13566,17 @@ unreachable end global.get $std/typedarray/arr + local.tee $0 i32.load offset=4 - i32.load offset=4 + i32.const 4 + i32.add + i32.const -1 + i32.const 4 + local.get $0 + i32.load offset=8 + i32.lt_u + select + i32.load i32.const 2 i32.ne if @@ -12671,8 +13588,17 @@ unreachable end global.get $std/typedarray/arr + local.tee $0 i32.load offset=4 + i32.const 8 + i32.add + i32.const -1 + i32.const 8 + local.get $0 i32.load offset=8 + i32.lt_u + select + i32.load i32.const 3 i32.ne if @@ -12689,11 +13615,7 @@ call $~lib/typedarray/Int32Array#subarray global.set $std/typedarray/arr global.get $std/typedarray/arr - local.tee $0 i32.load offset=8 - local.get $0 - i32.load offset=4 - i32.sub i32.const 2 i32.shr_u i32.const 1 @@ -12723,11 +13645,7 @@ unreachable end global.get $std/typedarray/arr - local.tee $0 i32.load offset=8 - local.get $0 - i32.load offset=4 - i32.sub i32.const 4 i32.ne if @@ -12739,7 +13657,14 @@ unreachable end global.get $std/typedarray/arr + local.tee $0 i32.load offset=4 + i32.const -1 + i32.const 0 + local.get $0 + i32.load offset=8 + i32.lt_u + select i32.load i32.const 2 i32.ne @@ -12793,11 +13718,7 @@ call $~lib/typedarray/Float64Array#subarray global.set $std/typedarray/af64 global.get $std/typedarray/af64 - local.tee $0 i32.load offset=8 - local.get $0 - i32.load offset=4 - i32.sub i32.const 3 i32.shr_u i32.const 4 @@ -12827,11 +13748,7 @@ unreachable end global.get $std/typedarray/af64 - local.tee $0 i32.load offset=8 - local.get $0 - i32.load offset=4 - i32.sub i32.const 32 i32.ne if @@ -12865,15 +13782,31 @@ block (result i32) block (result i32) global.get $std/typedarray/af64 + local.tee $0 i32.load offset=4 + i32.const -1 + i32.const 0 + local.get $0 + i32.load offset=8 + i32.lt_u + select f64.load f64.const 4 f64.eq local.tee $0 if global.get $std/typedarray/af64 + local.tee $0 i32.load offset=4 - f64.load offset=8 + i32.const 8 + i32.add + i32.const -1 + i32.const 8 + local.get $0 + i32.load offset=8 + i32.lt_u + select + f64.load f64.const 5 f64.eq local.set $0 @@ -12882,8 +13815,17 @@ end if global.get $std/typedarray/af64 + local.tee $0 i32.load offset=4 - f64.load offset=16 + i32.const 16 + i32.add + i32.const -1 + i32.const 16 + local.get $0 + i32.load offset=8 + i32.lt_u + select + f64.load f64.const 6 f64.eq local.set $0 @@ -12892,8 +13834,17 @@ end if global.get $std/typedarray/af64 + local.tee $0 i32.load offset=4 - f64.load offset=24 + i32.const 24 + i32.add + i32.const -1 + i32.const 24 + local.get $0 + i32.load offset=8 + i32.lt_u + select + f64.load f64.const 7 f64.eq local.set $0 @@ -12926,6 +13877,12 @@ i32.store8 offset=2 local.get $0 i32.load offset=4 + i32.const -1 + i32.const 0 + local.get $0 + i32.load offset=8 + i32.lt_u + select i32.load8_u if i32.const 0 @@ -12936,8 +13893,17 @@ unreachable end global.get $std/typedarray/clampedArr + local.tee $0 i32.load offset=4 - i32.load8_u offset=1 + i32.const 1 + i32.add + i32.const -1 + i32.const 1 + local.get $0 + i32.load offset=8 + i32.lt_u + select + i32.load8_u i32.const 2 i32.ne if @@ -12949,8 +13915,17 @@ unreachable end global.get $std/typedarray/clampedArr + local.tee $0 i32.load offset=4 - i32.load8_u offset=2 + i32.const 2 + i32.add + i32.const -1 + i32.const 2 + local.get $0 + i32.load offset=8 + i32.lt_u + select + i32.load8_u i32.const 255 i32.ne if @@ -13096,11 +14071,7 @@ i32.const 2147483647 call $~lib/typedarray/Int8Array#fill global.get $std/typedarray/sub8 - local.tee $0 i32.load offset=8 - local.get $0 - i32.load offset=4 - i32.sub i32.const 3 i32.ne if @@ -13128,11 +14099,7 @@ unreachable end global.get $std/typedarray/sub8 - local.tee $0 i32.load offset=8 - local.get $0 - i32.load offset=4 - i32.sub i32.const 3 i32.ne if @@ -13308,11 +14275,7 @@ i32.const 2147483647 call $~lib/typedarray/Int32Array#fill global.get $std/typedarray/sub32 - local.tee $0 i32.load offset=8 - local.get $0 - i32.load offset=4 - i32.sub i32.const 2 i32.shr_u i32.const 3 @@ -13342,11 +14305,7 @@ unreachable end global.get $std/typedarray/sub32 - local.tee $0 i32.load offset=8 - local.get $0 - i32.load offset=4 - i32.sub i32.const 12 i32.ne if @@ -13424,7 +14383,14 @@ call $~lib/typedarray/Int8Array#subarray global.set $std/typedarray/multisubarr1 global.get $std/typedarray/multisubarr1 + local.tee $0 i32.load offset=4 + i32.const -1 + i32.const 0 + local.get $0 + i32.load offset=8 + i32.lt_u + select i32.load8_s i32.const 2 i32.ne @@ -13437,11 +14403,7 @@ unreachable end global.get $std/typedarray/multisubarr1 - local.tee $0 i32.load offset=8 - local.get $0 - i32.load offset=4 - i32.sub i32.const 5 i32.ne if @@ -13469,11 +14431,7 @@ unreachable end global.get $std/typedarray/multisubarr1 - local.tee $0 i32.load offset=8 - local.get $0 - i32.load offset=4 - i32.sub i32.const 5 i32.ne if @@ -13490,7 +14448,14 @@ call $~lib/typedarray/Int8Array#subarray global.set $std/typedarray/multisubarr2 global.get $std/typedarray/multisubarr2 + local.tee $0 i32.load offset=4 + i32.const -1 + i32.const 0 + local.get $0 + i32.load offset=8 + i32.lt_u + select i32.load8_s i32.const 3 i32.ne @@ -13503,11 +14468,7 @@ unreachable end global.get $std/typedarray/multisubarr2 - local.tee $0 i32.load offset=8 - local.get $0 - i32.load offset=4 - i32.sub i32.const 4 i32.ne if @@ -13535,11 +14496,7 @@ unreachable end global.get $std/typedarray/multisubarr2 - local.tee $0 i32.load offset=8 - local.get $0 - i32.load offset=4 - i32.sub i32.const 4 i32.ne if @@ -13556,7 +14513,14 @@ call $~lib/typedarray/Int8Array#subarray global.set $std/typedarray/multisubarr3 global.get $std/typedarray/multisubarr3 + local.tee $0 i32.load offset=4 + i32.const -1 + i32.const 0 + local.get $0 + i32.load offset=8 + i32.lt_u + select i32.load8_s i32.const 4 i32.ne @@ -13569,11 +14533,7 @@ unreachable end global.get $std/typedarray/multisubarr3 - local.tee $0 i32.load offset=8 - local.get $0 - i32.load offset=4 - i32.sub i32.const 3 i32.ne if @@ -13601,11 +14561,7 @@ unreachable end global.get $std/typedarray/multisubarr3 - local.tee $0 i32.load offset=8 - local.get $0 - i32.load offset=4 - i32.sub i32.const 3 i32.ne if diff --git a/tests/compiler/std/typedarray.untouched.wat b/tests/compiler/std/typedarray.untouched.wat index 7aca6ab8..e7a38fc9 100644 --- a/tests/compiler/std/typedarray.untouched.wat +++ b/tests/compiler/std/typedarray.untouched.wat @@ -48,13 +48,13 @@ (data (i32.const 472) "\01\00\00\00\1e\00\00\00r\00e\00s\00u\00l\00t\00 \00m\00i\00s\00m\00a\00t\00c\00h\00") (data (i32.const 512) "\01\00\00\00(\00\00\00f\00a\00i\00l\00 \00r\00e\00s\00u\00l\00t\00 \00m\00i\00s\00m\00a\00t\00c\00h\00") (data (i32.const 560) "\02\00\00\00\0c\00\00\00\n\00\00\00\0c\00\00\00\0e\00\00\00") - (data (i32.const 584) "\10\00\00\00\10\00\00\008\02\00\008\02\00\00D\02\00\00\03\00\00\00") + (data (i32.const 584) "\10\00\00\00\10\00\00\008\02\00\008\02\00\00\0c\00\00\00\03\00\00\00") (data (i32.const 608) "\01\00\00\00,\00\00\00f\00o\00r\00E\00a\00c\00h\00 \00v\00a\00l\00u\00e\00 \00m\00i\00s\00m\00a\00t\00c\00h\00") (data (i32.const 664) "\01\00\00\00,\00\00\00f\00o\00r\00E\00a\00c\00h\00 \00i\00n\00d\00e\00x\00 \00m\00i\00s\00m\00a\00t\00c\00h\00") (data (i32.const 720) "\01\00\00\00>\00\00\00f\00o\00r\00E\00a\00c\00h\00 \00s\00e\00l\00f\00 \00p\00a\00r\00a\00m\00e\00t\00e\00r\00 \00m\00i\00s\00m\00a\00t\00c\00h\00") (data (i32.const 792) "\01\00\00\006\00\00\00f\00o\00r\00E\00a\00c\00h\00 \00c\00a\00l\00l\00 \00c\00o\00u\00n\00t\00 \00m\00i\00s\00m\00a\00t\00c\00h\00") (data (i32.const 856) "\02\00\00\00$\00\00\00\01\00\00\00\02\00\00\00\03\00\00\00\04\00\00\00\05\00\00\00\06\00\00\00\07\00\00\00\08\00\00\00\t\00\00\00") - (data (i32.const 904) "\10\00\00\00\10\00\00\00`\03\00\00`\03\00\00\84\03\00\00\t\00\00\00") + (data (i32.const 904) "\10\00\00\00\10\00\00\00`\03\00\00`\03\00\00$\00\00\00\t\00\00\00") (data (i32.const 928) "\01\00\00\00B\00\00\00T\00y\00p\00e\00d\00A\00r\00r\00a\00y\00 \00r\00e\00v\00e\00r\00s\00e\00 \00v\00a\00l\00u\00e\00 \00m\00i\00s\00m\00a\00t\00c\00h\00") (data (i32.const 1008) "\01\00\00\00V\00\00\00T\00y\00p\00e\00d\00A\00r\00r\00a\00y\00 \00r\00e\00v\00e\00r\00s\00e\00 \00w\00i\00t\00h\00 \00b\00y\00t\00e\00O\00f\00f\00s\00e\00t\00 \00m\00i\00s\00m\00a\00t\00c\00h\00") (table $0 112 funcref) @@ -476,7 +476,7 @@ if i32.const 0 i32.const 64 - i32.const 188 + i32.const 191 i32.const 2 call $~lib/env/abort unreachable @@ -491,7 +491,7 @@ if i32.const 0 i32.const 64 - i32.const 189 + i32.const 192 i32.const 2 call $~lib/env/abort unreachable @@ -555,7 +555,7 @@ if i32.const 0 i32.const 64 - i32.const 223 + i32.const 226 i32.const 57 call $~lib/env/abort unreachable @@ -598,9 +598,7 @@ local.get $3 i32.store offset=4 local.get $0 - local.get $3 local.get $1 - i32.add i32.store offset=8 local.get $0 ) @@ -633,9 +631,6 @@ (func $~lib/runtime/ArrayBufferView#get:byteLength (; 12 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) local.get $0 i32.load offset=8 - local.get $0 - i32.load offset=4 - i32.sub ) (func $~lib/typedarray/Int8Array#get:length (; 13 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) local.get $0 @@ -1499,11 +1494,11 @@ i32.add i32.store offset=4 local.get $7 - local.get $9 local.get $5 + local.get $4 + i32.sub i32.const 2 i32.shl - i32.add i32.store offset=8 local.get $7 ) @@ -1613,11 +1608,11 @@ i32.add i32.store offset=4 local.get $7 - local.get $9 local.get $5 + local.get $4 + i32.sub i32.const 3 i32.shl - i32.add i32.store offset=8 local.get $7 ) @@ -3706,9 +3701,7 @@ local.get $5 i32.store offset=4 local.get $3 - local.get $5 local.get $4 - i32.add i32.store offset=8 local.get $3 local.get $4 @@ -3728,6 +3721,8 @@ (func $std/typedarray/isInt8ArrayEqual (; 48 ;) (type $FUNCSIG$iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) + (local $4 i32) + (local $5 i32) local.get $0 call $~lib/typedarray/Int8Array#get:length local.get $1 @@ -3752,14 +3747,30 @@ i32.eqz br_if $break|0 local.get $0 + local.tee $4 i32.load offset=4 local.get $2 + local.tee $5 i32.add + i32.const -1 + local.get $5 + local.get $4 + i32.load offset=8 + i32.lt_u + select i32.load8_s local.get $1 + local.tee $4 i32.load offset=4 local.get $2 + local.tee $5 i32.add + i32.const -1 + local.get $5 + local.get $4 + i32.load offset=8 + i32.lt_u + select i32.load8_s i32.ne if @@ -3883,11 +3894,11 @@ i32.add i32.store offset=4 local.get $7 - local.get $9 local.get $5 + local.get $4 + i32.sub i32.const 0 i32.shl - i32.add i32.store offset=8 local.get $7 ) @@ -3996,6 +4007,8 @@ (func $std/typedarray/isInt32ArrayEqual (; 52 ;) (type $FUNCSIG$iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) + (local $4 i32) + (local $5 i32) local.get $0 call $~lib/typedarray/Int32Array#get:length local.get $1 @@ -4020,18 +4033,34 @@ i32.eqz br_if $break|0 local.get $0 + local.tee $4 i32.load offset=4 local.get $2 i32.const 2 i32.shl + local.tee $5 i32.add + i32.const -1 + local.get $5 + local.get $4 + i32.load offset=8 + i32.lt_u + select i32.load local.get $1 + local.tee $4 i32.load offset=4 local.get $2 i32.const 2 i32.shl + local.tee $5 i32.add + i32.const -1 + local.get $5 + local.get $4 + i32.load offset=8 + i32.lt_u + select i32.load i32.ne if @@ -6375,6 +6404,8 @@ (func $std/typedarray/testArrayMap (; 121 ;) (type $FUNCSIG$v) (local $0 i32) (local $1 i32) + (local $2 i32) + (local $3 i32) i32.const 0 i32.const 3 call $~lib/typedarray/Int8Array#constructor @@ -6396,7 +6427,17 @@ call $~lib/typedarray/Int8Array#map local.set $1 local.get $1 + local.tee $2 i32.load offset=4 + i32.const 0 + local.tee $3 + i32.add + i32.const -1 + local.get $3 + local.get $2 + i32.load offset=8 + i32.lt_u + select i32.load8_s i32.const 1 i32.eq @@ -6410,8 +6451,18 @@ unreachable end local.get $1 + local.tee $2 i32.load offset=4 - i32.load8_s offset=1 + i32.const 1 + local.tee $3 + i32.add + i32.const -1 + local.get $3 + local.get $2 + i32.load offset=8 + i32.lt_u + select + i32.load8_s i32.const 4 i32.eq i32.eqz @@ -6424,8 +6475,18 @@ unreachable end local.get $1 + local.tee $2 i32.load offset=4 - i32.load8_s offset=2 + i32.const 2 + local.tee $3 + i32.add + i32.const -1 + local.get $3 + local.get $2 + i32.load offset=8 + i32.lt_u + select + i32.load8_s i32.const 9 i32.eq i32.eqz @@ -6511,6 +6572,8 @@ (func $std/typedarray/testArrayMap (; 124 ;) (type $FUNCSIG$v) (local $0 i32) (local $1 i32) + (local $2 i32) + (local $3 i32) i32.const 0 i32.const 3 call $~lib/typedarray/Uint8Array#constructor @@ -6532,7 +6595,17 @@ call $~lib/typedarray/Uint8Array#map local.set $1 local.get $1 + local.tee $2 i32.load offset=4 + i32.const 0 + local.tee $3 + i32.add + i32.const -1 + local.get $3 + local.get $2 + i32.load offset=8 + i32.lt_u + select i32.load8_u i32.const 1 i32.eq @@ -6546,8 +6619,18 @@ unreachable end local.get $1 + local.tee $2 i32.load offset=4 - i32.load8_u offset=1 + i32.const 1 + local.tee $3 + i32.add + i32.const -1 + local.get $3 + local.get $2 + i32.load offset=8 + i32.lt_u + select + i32.load8_u i32.const 4 i32.eq i32.eqz @@ -6560,8 +6643,18 @@ unreachable end local.get $1 + local.tee $2 i32.load offset=4 - i32.load8_u offset=2 + i32.const 2 + local.tee $3 + i32.add + i32.const -1 + local.get $3 + local.get $2 + i32.load offset=8 + i32.lt_u + select + i32.load8_u i32.const 9 i32.eq i32.eqz @@ -6648,6 +6741,7 @@ (local $0 i32) (local $1 i32) (local $2 i32) + (local $3 i32) i32.const 0 i32.const 3 call $~lib/typedarray/Uint8ClampedArray#constructor @@ -6708,7 +6802,17 @@ call $~lib/typedarray/Uint8ClampedArray#map local.set $2 local.get $2 + local.tee $1 i32.load offset=4 + i32.const 0 + local.tee $3 + i32.add + i32.const -1 + local.get $3 + local.get $1 + i32.load offset=8 + i32.lt_u + select i32.load8_u i32.const 1 i32.eq @@ -6722,8 +6826,18 @@ unreachable end local.get $2 + local.tee $1 i32.load offset=4 - i32.load8_u offset=1 + i32.const 1 + local.tee $3 + i32.add + i32.const -1 + local.get $3 + local.get $1 + i32.load offset=8 + i32.lt_u + select + i32.load8_u i32.const 4 i32.eq i32.eqz @@ -6736,8 +6850,18 @@ unreachable end local.get $2 + local.tee $1 i32.load offset=4 - i32.load8_u offset=2 + i32.const 2 + local.tee $3 + i32.add + i32.const -1 + local.get $3 + local.get $1 + i32.load offset=8 + i32.lt_u + select + i32.load8_u i32.const 9 i32.eq i32.eqz @@ -6823,6 +6947,8 @@ (func $std/typedarray/testArrayMap (; 130 ;) (type $FUNCSIG$v) (local $0 i32) (local $1 i32) + (local $2 i32) + (local $3 i32) i32.const 0 i32.const 3 call $~lib/typedarray/Int16Array#constructor @@ -6844,7 +6970,19 @@ call $~lib/typedarray/Int16Array#map local.set $1 local.get $1 + local.tee $2 i32.load offset=4 + i32.const 0 + i32.const 1 + i32.shl + local.tee $3 + i32.add + i32.const -1 + local.get $3 + local.get $2 + i32.load offset=8 + i32.lt_u + select i32.load16_s i32.const 1 i32.eq @@ -6858,8 +6996,20 @@ unreachable end local.get $1 + local.tee $2 i32.load offset=4 - i32.load16_s offset=2 + i32.const 1 + i32.const 1 + i32.shl + local.tee $3 + i32.add + i32.const -1 + local.get $3 + local.get $2 + i32.load offset=8 + i32.lt_u + select + i32.load16_s i32.const 4 i32.eq i32.eqz @@ -6872,8 +7022,20 @@ unreachable end local.get $1 + local.tee $2 i32.load offset=4 - i32.load16_s offset=4 + i32.const 2 + i32.const 1 + i32.shl + local.tee $3 + i32.add + i32.const -1 + local.get $3 + local.get $2 + i32.load offset=8 + i32.lt_u + select + i32.load16_s i32.const 9 i32.eq i32.eqz @@ -6959,6 +7121,8 @@ (func $std/typedarray/testArrayMap (; 133 ;) (type $FUNCSIG$v) (local $0 i32) (local $1 i32) + (local $2 i32) + (local $3 i32) i32.const 0 i32.const 3 call $~lib/typedarray/Uint16Array#constructor @@ -6980,7 +7144,19 @@ call $~lib/typedarray/Uint16Array#map local.set $1 local.get $1 + local.tee $2 i32.load offset=4 + i32.const 0 + i32.const 1 + i32.shl + local.tee $3 + i32.add + i32.const -1 + local.get $3 + local.get $2 + i32.load offset=8 + i32.lt_u + select i32.load16_u i32.const 1 i32.eq @@ -6994,8 +7170,20 @@ unreachable end local.get $1 + local.tee $2 i32.load offset=4 - i32.load16_u offset=2 + i32.const 1 + i32.const 1 + i32.shl + local.tee $3 + i32.add + i32.const -1 + local.get $3 + local.get $2 + i32.load offset=8 + i32.lt_u + select + i32.load16_u i32.const 4 i32.eq i32.eqz @@ -7008,8 +7196,20 @@ unreachable end local.get $1 + local.tee $2 i32.load offset=4 - i32.load16_u offset=4 + i32.const 2 + i32.const 1 + i32.shl + local.tee $3 + i32.add + i32.const -1 + local.get $3 + local.get $2 + i32.load offset=8 + i32.lt_u + select + i32.load16_u i32.const 9 i32.eq i32.eqz @@ -7095,6 +7295,8 @@ (func $std/typedarray/testArrayMap (; 136 ;) (type $FUNCSIG$v) (local $0 i32) (local $1 i32) + (local $2 i32) + (local $3 i32) i32.const 0 i32.const 3 call $~lib/typedarray/Int32Array#constructor @@ -7116,7 +7318,19 @@ call $~lib/typedarray/Int32Array#map local.set $1 local.get $1 + local.tee $2 i32.load offset=4 + i32.const 0 + i32.const 2 + i32.shl + local.tee $3 + i32.add + i32.const -1 + local.get $3 + local.get $2 + i32.load offset=8 + i32.lt_u + select i32.load i32.const 1 i32.eq @@ -7130,8 +7344,20 @@ unreachable end local.get $1 + local.tee $2 i32.load offset=4 - i32.load offset=4 + i32.const 1 + i32.const 2 + i32.shl + local.tee $3 + i32.add + i32.const -1 + local.get $3 + local.get $2 + i32.load offset=8 + i32.lt_u + select + i32.load i32.const 4 i32.eq i32.eqz @@ -7144,8 +7370,20 @@ unreachable end local.get $1 + local.tee $2 i32.load offset=4 + i32.const 2 + i32.const 2 + i32.shl + local.tee $3 + i32.add + i32.const -1 + local.get $3 + local.get $2 i32.load offset=8 + i32.lt_u + select + i32.load i32.const 9 i32.eq i32.eqz @@ -7231,6 +7469,8 @@ (func $std/typedarray/testArrayMap (; 139 ;) (type $FUNCSIG$v) (local $0 i32) (local $1 i32) + (local $2 i32) + (local $3 i32) i32.const 0 i32.const 3 call $~lib/typedarray/Uint32Array#constructor @@ -7252,7 +7492,19 @@ call $~lib/typedarray/Uint32Array#map local.set $1 local.get $1 + local.tee $2 i32.load offset=4 + i32.const 0 + i32.const 2 + i32.shl + local.tee $3 + i32.add + i32.const -1 + local.get $3 + local.get $2 + i32.load offset=8 + i32.lt_u + select i32.load i32.const 1 i32.eq @@ -7266,8 +7518,20 @@ unreachable end local.get $1 + local.tee $2 i32.load offset=4 - i32.load offset=4 + i32.const 1 + i32.const 2 + i32.shl + local.tee $3 + i32.add + i32.const -1 + local.get $3 + local.get $2 + i32.load offset=8 + i32.lt_u + select + i32.load i32.const 4 i32.eq i32.eqz @@ -7280,8 +7544,20 @@ unreachable end local.get $1 + local.tee $2 i32.load offset=4 + i32.const 2 + i32.const 2 + i32.shl + local.tee $3 + i32.add + i32.const -1 + local.get $3 + local.get $2 i32.load offset=8 + i32.lt_u + select + i32.load i32.const 9 i32.eq i32.eqz @@ -7367,6 +7643,8 @@ (func $std/typedarray/testArrayMap (; 142 ;) (type $FUNCSIG$v) (local $0 i32) (local $1 i32) + (local $2 i32) + (local $3 i32) i32.const 0 i32.const 3 call $~lib/typedarray/Int64Array#constructor @@ -7388,7 +7666,19 @@ call $~lib/typedarray/Int64Array#map local.set $1 local.get $1 + local.tee $2 i32.load offset=4 + i32.const 0 + i32.const 3 + i32.shl + local.tee $3 + i32.add + i32.const -1 + local.get $3 + local.get $2 + i32.load offset=8 + i32.lt_u + select i64.load i64.const 1 i64.eq @@ -7402,8 +7692,20 @@ unreachable end local.get $1 + local.tee $2 i32.load offset=4 - i64.load offset=8 + i32.const 1 + i32.const 3 + i32.shl + local.tee $3 + i32.add + i32.const -1 + local.get $3 + local.get $2 + i32.load offset=8 + i32.lt_u + select + i64.load i64.const 4 i64.eq i32.eqz @@ -7416,8 +7718,20 @@ unreachable end local.get $1 + local.tee $2 i32.load offset=4 - i64.load offset=16 + i32.const 2 + i32.const 3 + i32.shl + local.tee $3 + i32.add + i32.const -1 + local.get $3 + local.get $2 + i32.load offset=8 + i32.lt_u + select + i64.load i64.const 9 i64.eq i32.eqz @@ -7503,6 +7817,8 @@ (func $std/typedarray/testArrayMap (; 145 ;) (type $FUNCSIG$v) (local $0 i32) (local $1 i32) + (local $2 i32) + (local $3 i32) i32.const 0 i32.const 3 call $~lib/typedarray/Uint64Array#constructor @@ -7524,7 +7840,19 @@ call $~lib/typedarray/Uint64Array#map local.set $1 local.get $1 + local.tee $2 i32.load offset=4 + i32.const 0 + i32.const 3 + i32.shl + local.tee $3 + i32.add + i32.const -1 + local.get $3 + local.get $2 + i32.load offset=8 + i32.lt_u + select i64.load i64.const 1 i64.eq @@ -7538,8 +7866,20 @@ unreachable end local.get $1 + local.tee $2 i32.load offset=4 - i64.load offset=8 + i32.const 1 + i32.const 3 + i32.shl + local.tee $3 + i32.add + i32.const -1 + local.get $3 + local.get $2 + i32.load offset=8 + i32.lt_u + select + i64.load i64.const 4 i64.eq i32.eqz @@ -7552,8 +7892,20 @@ unreachable end local.get $1 + local.tee $2 i32.load offset=4 - i64.load offset=16 + i32.const 2 + i32.const 3 + i32.shl + local.tee $3 + i32.add + i32.const -1 + local.get $3 + local.get $2 + i32.load offset=8 + i32.lt_u + select + i64.load i64.const 9 i64.eq i32.eqz @@ -7639,6 +7991,8 @@ (func $std/typedarray/testArrayMap (; 148 ;) (type $FUNCSIG$v) (local $0 i32) (local $1 i32) + (local $2 i32) + (local $3 i32) i32.const 0 i32.const 3 call $~lib/typedarray/Float32Array#constructor @@ -7660,7 +8014,19 @@ call $~lib/typedarray/Float32Array#map local.set $1 local.get $1 + local.tee $2 i32.load offset=4 + i32.const 0 + i32.const 2 + i32.shl + local.tee $3 + i32.add + i32.const -1 + local.get $3 + local.get $2 + i32.load offset=8 + i32.lt_u + select f32.load f32.const 1 f32.eq @@ -7674,8 +8040,20 @@ unreachable end local.get $1 + local.tee $2 i32.load offset=4 - f32.load offset=4 + i32.const 1 + i32.const 2 + i32.shl + local.tee $3 + i32.add + i32.const -1 + local.get $3 + local.get $2 + i32.load offset=8 + i32.lt_u + select + f32.load f32.const 4 f32.eq i32.eqz @@ -7688,8 +8066,20 @@ unreachable end local.get $1 + local.tee $2 i32.load offset=4 - f32.load offset=8 + i32.const 2 + i32.const 2 + i32.shl + local.tee $3 + i32.add + i32.const -1 + local.get $3 + local.get $2 + i32.load offset=8 + i32.lt_u + select + f32.load f32.const 9 f32.eq i32.eqz @@ -7775,6 +8165,8 @@ (func $std/typedarray/testArrayMap (; 151 ;) (type $FUNCSIG$v) (local $0 i32) (local $1 i32) + (local $2 i32) + (local $3 i32) i32.const 0 i32.const 3 call $~lib/typedarray/Float64Array#constructor @@ -7796,7 +8188,19 @@ call $~lib/typedarray/Float64Array#map local.set $1 local.get $1 + local.tee $2 i32.load offset=4 + i32.const 0 + i32.const 3 + i32.shl + local.tee $3 + i32.add + i32.const -1 + local.get $3 + local.get $2 + i32.load offset=8 + i32.lt_u + select f64.load f64.const 1 f64.eq @@ -7810,8 +8214,20 @@ unreachable end local.get $1 + local.tee $2 i32.load offset=4 - f64.load offset=8 + i32.const 1 + i32.const 3 + i32.shl + local.tee $3 + i32.add + i32.const -1 + local.get $3 + local.get $2 + i32.load offset=8 + i32.lt_u + select + f64.load f64.const 4 f64.eq i32.eqz @@ -7824,8 +8240,20 @@ unreachable end local.get $1 + local.tee $2 i32.load offset=4 - f64.load offset=16 + i32.const 2 + i32.const 3 + i32.shl + local.tee $3 + i32.add + i32.const -1 + local.get $3 + local.get $2 + i32.load offset=8 + i32.lt_u + select + f64.load f64.const 9 f64.eq i32.eqz @@ -12738,20 +13166,30 @@ ) (func $std/typedarray/testArrayForEach~anonymous|0 (; 286 ;) (type $FUNCSIG$viii) (param $0 i32) (param $1 i32) (param $2 i32) (local $3 i32) + (local $4 i32) + (local $5 i32) global.get $std/typedarray/forEachValues + local.tee $3 i32.load offset=4 local.get $1 i32.const 2 i32.shl + local.tee $4 i32.add + i32.const -1 + local.get $4 + local.get $3 + i32.load offset=8 + i32.lt_u + select i32.load - local.set $3 + local.set $5 local.get $0 i32.const 24 i32.shl i32.const 24 i32.shr_s - local.get $3 + local.get $5 i32.const 24 i32.shl i32.const 24 @@ -12842,6 +13280,8 @@ ) (func $std/typedarray/testArrayForEach (; 288 ;) (type $FUNCSIG$v) (local $0 i32) + (local $1 i32) + (local $2 i32) i32.const 0 global.set $std/typedarray/forEachCallCount i32.const 0 @@ -12853,7 +13293,19 @@ local.get $0 i32.load offset=4 global.get $std/typedarray/forEachValues + local.tee $1 i32.load offset=4 + i32.const 0 + i32.const 2 + i32.shl + local.tee $2 + i32.add + i32.const -1 + local.get $2 + local.get $1 + i32.load offset=8 + i32.lt_u + select i32.load i32.const 24 i32.shl @@ -12863,8 +13315,20 @@ local.get $0 i32.load offset=4 global.get $std/typedarray/forEachValues + local.tee $1 i32.load offset=4 - i32.load offset=4 + i32.const 1 + i32.const 2 + i32.shl + local.tee $2 + i32.add + i32.const -1 + local.get $2 + local.get $1 + i32.load offset=8 + i32.lt_u + select + i32.load i32.const 24 i32.shl i32.const 24 @@ -12873,8 +13337,20 @@ local.get $0 i32.load offset=4 global.get $std/typedarray/forEachValues + local.tee $1 i32.load offset=4 + i32.const 2 + i32.const 2 + i32.shl + local.tee $2 + i32.add + i32.const -1 + local.get $2 + local.get $1 i32.load offset=8 + i32.lt_u + select + i32.load i32.const 24 i32.shl i32.const 24 @@ -12898,18 +13374,28 @@ ) (func $std/typedarray/testArrayForEach~anonymous|0 (; 289 ;) (type $FUNCSIG$viii) (param $0 i32) (param $1 i32) (param $2 i32) (local $3 i32) + (local $4 i32) + (local $5 i32) global.get $std/typedarray/forEachValues + local.tee $3 i32.load offset=4 local.get $1 i32.const 2 i32.shl + local.tee $4 i32.add + i32.const -1 + local.get $4 + local.get $3 + i32.load offset=8 + i32.lt_u + select i32.load - local.set $3 + local.set $5 local.get $0 i32.const 255 i32.and - local.get $3 + local.get $5 i32.const 255 i32.and i32.eq @@ -12998,6 +13484,8 @@ ) (func $std/typedarray/testArrayForEach (; 291 ;) (type $FUNCSIG$v) (local $0 i32) + (local $1 i32) + (local $2 i32) i32.const 0 global.set $std/typedarray/forEachCallCount i32.const 0 @@ -13009,7 +13497,19 @@ local.get $0 i32.load offset=4 global.get $std/typedarray/forEachValues + local.tee $1 i32.load offset=4 + i32.const 0 + i32.const 2 + i32.shl + local.tee $2 + i32.add + i32.const -1 + local.get $2 + local.get $1 + i32.load offset=8 + i32.lt_u + select i32.load i32.const 255 i32.and @@ -13017,16 +13517,40 @@ local.get $0 i32.load offset=4 global.get $std/typedarray/forEachValues + local.tee $1 i32.load offset=4 - i32.load offset=4 + i32.const 1 + i32.const 2 + i32.shl + local.tee $2 + i32.add + i32.const -1 + local.get $2 + local.get $1 + i32.load offset=8 + i32.lt_u + select + i32.load i32.const 255 i32.and i32.store8 offset=1 local.get $0 i32.load offset=4 global.get $std/typedarray/forEachValues + local.tee $1 i32.load offset=4 + i32.const 2 + i32.const 2 + i32.shl + local.tee $2 + i32.add + i32.const -1 + local.get $2 + local.get $1 i32.load offset=8 + i32.lt_u + select + i32.load i32.const 255 i32.and i32.store8 offset=2 @@ -13048,18 +13572,28 @@ ) (func $std/typedarray/testArrayForEach~anonymous|0 (; 292 ;) (type $FUNCSIG$viii) (param $0 i32) (param $1 i32) (param $2 i32) (local $3 i32) + (local $4 i32) + (local $5 i32) global.get $std/typedarray/forEachValues + local.tee $3 i32.load offset=4 local.get $1 i32.const 2 i32.shl + local.tee $4 i32.add + i32.const -1 + local.get $4 + local.get $3 + i32.load offset=8 + i32.lt_u + select i32.load - local.set $3 + local.set $5 local.get $0 i32.const 255 i32.and - local.get $3 + local.get $5 i32.const 255 i32.and i32.eq @@ -13149,6 +13683,7 @@ (func $std/typedarray/testArrayForEach (; 294 ;) (type $FUNCSIG$v) (local $0 i32) (local $1 i32) + (local $2 i32) i32.const 0 global.set $std/typedarray/forEachCallCount i32.const 0 @@ -13160,7 +13695,19 @@ local.get $0 i32.load offset=4 global.get $std/typedarray/forEachValues + local.tee $1 i32.load offset=4 + i32.const 0 + i32.const 2 + i32.shl + local.tee $2 + i32.add + i32.const -1 + local.get $2 + local.get $1 + i32.load offset=8 + i32.lt_u + select i32.load i32.const 255 i32.and @@ -13181,8 +13728,20 @@ local.get $0 i32.load offset=4 global.get $std/typedarray/forEachValues + local.tee $1 i32.load offset=4 - i32.load offset=4 + i32.const 1 + i32.const 2 + i32.shl + local.tee $2 + i32.add + i32.const -1 + local.get $2 + local.get $1 + i32.load offset=8 + i32.lt_u + select + i32.load i32.const 255 i32.and local.tee $1 @@ -13202,8 +13761,20 @@ local.get $0 i32.load offset=4 global.get $std/typedarray/forEachValues + local.tee $1 i32.load offset=4 + i32.const 2 + i32.const 2 + i32.shl + local.tee $2 + i32.add + i32.const -1 + local.get $2 + local.get $1 i32.load offset=8 + i32.lt_u + select + i32.load i32.const 255 i32.and local.tee $1 @@ -13238,20 +13809,30 @@ ) (func $std/typedarray/testArrayForEach~anonymous|0 (; 295 ;) (type $FUNCSIG$viii) (param $0 i32) (param $1 i32) (param $2 i32) (local $3 i32) + (local $4 i32) + (local $5 i32) global.get $std/typedarray/forEachValues + local.tee $3 i32.load offset=4 local.get $1 i32.const 2 i32.shl + local.tee $4 i32.add + i32.const -1 + local.get $4 + local.get $3 + i32.load offset=8 + i32.lt_u + select i32.load - local.set $3 + local.set $5 local.get $0 i32.const 16 i32.shl i32.const 16 i32.shr_s - local.get $3 + local.get $5 i32.const 16 i32.shl i32.const 16 @@ -13342,6 +13923,8 @@ ) (func $std/typedarray/testArrayForEach (; 297 ;) (type $FUNCSIG$v) (local $0 i32) + (local $1 i32) + (local $2 i32) i32.const 0 global.set $std/typedarray/forEachCallCount i32.const 0 @@ -13353,7 +13936,19 @@ local.get $0 i32.load offset=4 global.get $std/typedarray/forEachValues + local.tee $1 i32.load offset=4 + i32.const 0 + i32.const 2 + i32.shl + local.tee $2 + i32.add + i32.const -1 + local.get $2 + local.get $1 + i32.load offset=8 + i32.lt_u + select i32.load i32.const 16 i32.shl @@ -13363,8 +13958,20 @@ local.get $0 i32.load offset=4 global.get $std/typedarray/forEachValues + local.tee $1 i32.load offset=4 - i32.load offset=4 + i32.const 1 + i32.const 2 + i32.shl + local.tee $2 + i32.add + i32.const -1 + local.get $2 + local.get $1 + i32.load offset=8 + i32.lt_u + select + i32.load i32.const 16 i32.shl i32.const 16 @@ -13373,8 +13980,20 @@ local.get $0 i32.load offset=4 global.get $std/typedarray/forEachValues + local.tee $1 i32.load offset=4 + i32.const 2 + i32.const 2 + i32.shl + local.tee $2 + i32.add + i32.const -1 + local.get $2 + local.get $1 i32.load offset=8 + i32.lt_u + select + i32.load i32.const 16 i32.shl i32.const 16 @@ -13398,18 +14017,28 @@ ) (func $std/typedarray/testArrayForEach~anonymous|0 (; 298 ;) (type $FUNCSIG$viii) (param $0 i32) (param $1 i32) (param $2 i32) (local $3 i32) + (local $4 i32) + (local $5 i32) global.get $std/typedarray/forEachValues + local.tee $3 i32.load offset=4 local.get $1 i32.const 2 i32.shl + local.tee $4 i32.add + i32.const -1 + local.get $4 + local.get $3 + i32.load offset=8 + i32.lt_u + select i32.load - local.set $3 + local.set $5 local.get $0 i32.const 65535 i32.and - local.get $3 + local.get $5 i32.const 65535 i32.and i32.eq @@ -13498,6 +14127,8 @@ ) (func $std/typedarray/testArrayForEach (; 300 ;) (type $FUNCSIG$v) (local $0 i32) + (local $1 i32) + (local $2 i32) i32.const 0 global.set $std/typedarray/forEachCallCount i32.const 0 @@ -13509,7 +14140,19 @@ local.get $0 i32.load offset=4 global.get $std/typedarray/forEachValues + local.tee $1 i32.load offset=4 + i32.const 0 + i32.const 2 + i32.shl + local.tee $2 + i32.add + i32.const -1 + local.get $2 + local.get $1 + i32.load offset=8 + i32.lt_u + select i32.load i32.const 65535 i32.and @@ -13517,16 +14160,40 @@ local.get $0 i32.load offset=4 global.get $std/typedarray/forEachValues + local.tee $1 i32.load offset=4 - i32.load offset=4 + i32.const 1 + i32.const 2 + i32.shl + local.tee $2 + i32.add + i32.const -1 + local.get $2 + local.get $1 + i32.load offset=8 + i32.lt_u + select + i32.load i32.const 65535 i32.and i32.store16 offset=2 local.get $0 i32.load offset=4 global.get $std/typedarray/forEachValues + local.tee $1 i32.load offset=4 + i32.const 2 + i32.const 2 + i32.shl + local.tee $2 + i32.add + i32.const -1 + local.get $2 + local.get $1 i32.load offset=8 + i32.lt_u + select + i32.load i32.const 65535 i32.and i32.store16 offset=4 @@ -13548,16 +14215,26 @@ ) (func $std/typedarray/testArrayForEach~anonymous|0 (; 301 ;) (type $FUNCSIG$viii) (param $0 i32) (param $1 i32) (param $2 i32) (local $3 i32) + (local $4 i32) + (local $5 i32) global.get $std/typedarray/forEachValues + local.tee $3 i32.load offset=4 local.get $1 i32.const 2 i32.shl + local.tee $4 i32.add - i32.load - local.set $3 - local.get $0 + i32.const -1 + local.get $4 local.get $3 + i32.load offset=8 + i32.lt_u + select + i32.load + local.set $5 + local.get $0 + local.get $5 i32.eq i32.eqz if @@ -13644,6 +14321,8 @@ ) (func $std/typedarray/testArrayForEach (; 303 ;) (type $FUNCSIG$v) (local $0 i32) + (local $1 i32) + (local $2 i32) i32.const 0 global.set $std/typedarray/forEachCallCount i32.const 0 @@ -13655,20 +14334,56 @@ local.get $0 i32.load offset=4 global.get $std/typedarray/forEachValues + local.tee $1 i32.load offset=4 + i32.const 0 + i32.const 2 + i32.shl + local.tee $2 + i32.add + i32.const -1 + local.get $2 + local.get $1 + i32.load offset=8 + i32.lt_u + select i32.load i32.store local.get $0 i32.load offset=4 global.get $std/typedarray/forEachValues + local.tee $1 i32.load offset=4 - i32.load offset=4 + i32.const 1 + i32.const 2 + i32.shl + local.tee $2 + i32.add + i32.const -1 + local.get $2 + local.get $1 + i32.load offset=8 + i32.lt_u + select + i32.load i32.store offset=4 local.get $0 i32.load offset=4 global.get $std/typedarray/forEachValues + local.tee $1 i32.load offset=4 + i32.const 2 + i32.const 2 + i32.shl + local.tee $2 + i32.add + i32.const -1 + local.get $2 + local.get $1 i32.load offset=8 + i32.lt_u + select + i32.load i32.store offset=8 local.get $0 i32.const 106 @@ -13688,16 +14403,26 @@ ) (func $std/typedarray/testArrayForEach~anonymous|0 (; 304 ;) (type $FUNCSIG$viii) (param $0 i32) (param $1 i32) (param $2 i32) (local $3 i32) + (local $4 i32) + (local $5 i32) global.get $std/typedarray/forEachValues + local.tee $3 i32.load offset=4 local.get $1 i32.const 2 i32.shl + local.tee $4 i32.add - i32.load - local.set $3 - local.get $0 + i32.const -1 + local.get $4 local.get $3 + i32.load offset=8 + i32.lt_u + select + i32.load + local.set $5 + local.get $0 + local.get $5 i32.eq i32.eqz if @@ -13784,6 +14509,8 @@ ) (func $std/typedarray/testArrayForEach (; 306 ;) (type $FUNCSIG$v) (local $0 i32) + (local $1 i32) + (local $2 i32) i32.const 0 global.set $std/typedarray/forEachCallCount i32.const 0 @@ -13795,20 +14522,56 @@ local.get $0 i32.load offset=4 global.get $std/typedarray/forEachValues + local.tee $1 i32.load offset=4 + i32.const 0 + i32.const 2 + i32.shl + local.tee $2 + i32.add + i32.const -1 + local.get $2 + local.get $1 + i32.load offset=8 + i32.lt_u + select i32.load i32.store local.get $0 i32.load offset=4 global.get $std/typedarray/forEachValues + local.tee $1 i32.load offset=4 - i32.load offset=4 + i32.const 1 + i32.const 2 + i32.shl + local.tee $2 + i32.add + i32.const -1 + local.get $2 + local.get $1 + i32.load offset=8 + i32.lt_u + select + i32.load i32.store offset=4 local.get $0 i32.load offset=4 global.get $std/typedarray/forEachValues + local.tee $1 i32.load offset=4 + i32.const 2 + i32.const 2 + i32.shl + local.tee $2 + i32.add + i32.const -1 + local.get $2 + local.get $1 i32.load offset=8 + i32.lt_u + select + i32.load i32.store offset=8 local.get $0 i32.const 107 @@ -13828,16 +14591,26 @@ ) (func $std/typedarray/testArrayForEach~anonymous|0 (; 307 ;) (type $FUNCSIG$vjii) (param $0 i64) (param $1 i32) (param $2 i32) (local $3 i32) + (local $4 i32) + (local $5 i32) global.get $std/typedarray/forEachValues + local.tee $3 i32.load offset=4 local.get $1 i32.const 2 i32.shl + local.tee $4 i32.add - i32.load - local.set $3 - local.get $0 + i32.const -1 + local.get $4 local.get $3 + i32.load offset=8 + i32.lt_u + select + i32.load + local.set $5 + local.get $0 + local.get $5 i64.extend_i32_s i64.eq i32.eqz @@ -13925,6 +14698,8 @@ ) (func $std/typedarray/testArrayForEach (; 309 ;) (type $FUNCSIG$v) (local $0 i32) + (local $1 i32) + (local $2 i32) i32.const 0 global.set $std/typedarray/forEachCallCount i32.const 0 @@ -13936,20 +14711,56 @@ local.get $0 i32.load offset=4 global.get $std/typedarray/forEachValues + local.tee $1 i32.load offset=4 + i32.const 0 + i32.const 2 + i32.shl + local.tee $2 + i32.add + i32.const -1 + local.get $2 + local.get $1 + i32.load offset=8 + i32.lt_u + select i64.load32_s i64.store local.get $0 i32.load offset=4 global.get $std/typedarray/forEachValues + local.tee $1 i32.load offset=4 - i64.load32_s offset=4 + i32.const 1 + i32.const 2 + i32.shl + local.tee $2 + i32.add + i32.const -1 + local.get $2 + local.get $1 + i32.load offset=8 + i32.lt_u + select + i64.load32_s i64.store offset=8 local.get $0 i32.load offset=4 global.get $std/typedarray/forEachValues + local.tee $1 i32.load offset=4 - i64.load32_s offset=8 + i32.const 2 + i32.const 2 + i32.shl + local.tee $2 + i32.add + i32.const -1 + local.get $2 + local.get $1 + i32.load offset=8 + i32.lt_u + select + i64.load32_s i64.store offset=16 local.get $0 i32.const 108 @@ -13969,16 +14780,26 @@ ) (func $std/typedarray/testArrayForEach~anonymous|0 (; 310 ;) (type $FUNCSIG$vjii) (param $0 i64) (param $1 i32) (param $2 i32) (local $3 i32) + (local $4 i32) + (local $5 i32) global.get $std/typedarray/forEachValues + local.tee $3 i32.load offset=4 local.get $1 i32.const 2 i32.shl + local.tee $4 i32.add - i32.load - local.set $3 - local.get $0 + i32.const -1 + local.get $4 local.get $3 + i32.load offset=8 + i32.lt_u + select + i32.load + local.set $5 + local.get $0 + local.get $5 i64.extend_i32_s i64.eq i32.eqz @@ -14066,6 +14887,8 @@ ) (func $std/typedarray/testArrayForEach (; 312 ;) (type $FUNCSIG$v) (local $0 i32) + (local $1 i32) + (local $2 i32) i32.const 0 global.set $std/typedarray/forEachCallCount i32.const 0 @@ -14077,20 +14900,56 @@ local.get $0 i32.load offset=4 global.get $std/typedarray/forEachValues + local.tee $1 i32.load offset=4 + i32.const 0 + i32.const 2 + i32.shl + local.tee $2 + i32.add + i32.const -1 + local.get $2 + local.get $1 + i32.load offset=8 + i32.lt_u + select i64.load32_s i64.store local.get $0 i32.load offset=4 global.get $std/typedarray/forEachValues + local.tee $1 i32.load offset=4 - i64.load32_s offset=4 + i32.const 1 + i32.const 2 + i32.shl + local.tee $2 + i32.add + i32.const -1 + local.get $2 + local.get $1 + i32.load offset=8 + i32.lt_u + select + i64.load32_s i64.store offset=8 local.get $0 i32.load offset=4 global.get $std/typedarray/forEachValues + local.tee $1 i32.load offset=4 - i64.load32_s offset=8 + i32.const 2 + i32.const 2 + i32.shl + local.tee $2 + i32.add + i32.const -1 + local.get $2 + local.get $1 + i32.load offset=8 + i32.lt_u + select + i64.load32_s i64.store offset=16 local.get $0 i32.const 109 @@ -14110,16 +14969,26 @@ ) (func $std/typedarray/testArrayForEach~anonymous|0 (; 313 ;) (type $FUNCSIG$vfii) (param $0 f32) (param $1 i32) (param $2 i32) (local $3 i32) + (local $4 i32) + (local $5 i32) global.get $std/typedarray/forEachValues + local.tee $3 i32.load offset=4 local.get $1 i32.const 2 i32.shl + local.tee $4 i32.add - i32.load - local.set $3 - local.get $0 + i32.const -1 + local.get $4 local.get $3 + i32.load offset=8 + i32.lt_u + select + i32.load + local.set $5 + local.get $0 + local.get $5 f32.convert_i32_s f32.eq i32.eqz @@ -14207,6 +15076,8 @@ ) (func $std/typedarray/testArrayForEach (; 315 ;) (type $FUNCSIG$v) (local $0 i32) + (local $1 i32) + (local $2 i32) i32.const 0 global.set $std/typedarray/forEachCallCount i32.const 0 @@ -14218,22 +15089,58 @@ local.get $0 i32.load offset=4 global.get $std/typedarray/forEachValues + local.tee $1 i32.load offset=4 + i32.const 0 + i32.const 2 + i32.shl + local.tee $2 + i32.add + i32.const -1 + local.get $2 + local.get $1 + i32.load offset=8 + i32.lt_u + select i32.load f32.convert_i32_s f32.store local.get $0 i32.load offset=4 global.get $std/typedarray/forEachValues + local.tee $1 i32.load offset=4 - i32.load offset=4 + i32.const 1 + i32.const 2 + i32.shl + local.tee $2 + i32.add + i32.const -1 + local.get $2 + local.get $1 + i32.load offset=8 + i32.lt_u + select + i32.load f32.convert_i32_s f32.store offset=4 local.get $0 i32.load offset=4 global.get $std/typedarray/forEachValues + local.tee $1 i32.load offset=4 + i32.const 2 + i32.const 2 + i32.shl + local.tee $2 + i32.add + i32.const -1 + local.get $2 + local.get $1 i32.load offset=8 + i32.lt_u + select + i32.load f32.convert_i32_s f32.store offset=8 local.get $0 @@ -14254,16 +15161,26 @@ ) (func $std/typedarray/testArrayForEach~anonymous|0 (; 316 ;) (type $FUNCSIG$vdii) (param $0 f64) (param $1 i32) (param $2 i32) (local $3 i32) + (local $4 i32) + (local $5 i32) global.get $std/typedarray/forEachValues + local.tee $3 i32.load offset=4 local.get $1 i32.const 2 i32.shl + local.tee $4 i32.add - i32.load - local.set $3 - local.get $0 + i32.const -1 + local.get $4 local.get $3 + i32.load offset=8 + i32.lt_u + select + i32.load + local.set $5 + local.get $0 + local.get $5 f64.convert_i32_s f64.eq i32.eqz @@ -14351,6 +15268,8 @@ ) (func $std/typedarray/testArrayForEach (; 318 ;) (type $FUNCSIG$v) (local $0 i32) + (local $1 i32) + (local $2 i32) i32.const 0 global.set $std/typedarray/forEachCallCount i32.const 0 @@ -14362,22 +15281,58 @@ local.get $0 i32.load offset=4 global.get $std/typedarray/forEachValues + local.tee $1 i32.load offset=4 + i32.const 0 + i32.const 2 + i32.shl + local.tee $2 + i32.add + i32.const -1 + local.get $2 + local.get $1 + i32.load offset=8 + i32.lt_u + select i32.load f64.convert_i32_s f64.store local.get $0 i32.load offset=4 global.get $std/typedarray/forEachValues + local.tee $1 i32.load offset=4 - i32.load offset=4 + i32.const 1 + i32.const 2 + i32.shl + local.tee $2 + i32.add + i32.const -1 + local.get $2 + local.get $1 + i32.load offset=8 + i32.lt_u + select + i32.load f64.convert_i32_s f64.store offset=8 local.get $0 i32.load offset=4 global.get $std/typedarray/forEachValues + local.tee $1 i32.load offset=4 + i32.const 2 + i32.const 2 + i32.shl + local.tee $2 + i32.add + i32.const -1 + local.get $2 + local.get $1 i32.load offset=8 + i32.lt_u + select + i32.load f64.convert_i32_s f64.store offset=16 local.get $0 @@ -14472,6 +15427,8 @@ (local $2 i32) (local $3 i32) (local $4 i32) + (local $5 i32) + (local $6 i32) global.get $std/typedarray/testArrayReverseValues local.set $0 i32.const 0 @@ -14499,11 +15456,19 @@ local.get $3 i32.add local.get $0 + local.tee $4 i32.load offset=4 local.get $3 i32.const 2 i32.shl + local.tee $5 i32.add + i32.const -1 + local.get $5 + local.get $4 + i32.load offset=8 + i32.lt_u + select i32.load i32.const 24 i32.shl @@ -14515,11 +15480,19 @@ local.get $3 i32.add local.get $0 + local.tee $4 i32.load offset=4 local.get $3 i32.const 2 i32.shl + local.tee $5 i32.add + i32.const -1 + local.get $5 + local.get $4 + i32.load offset=8 + i32.lt_u + select i32.load i32.const 24 i32.shl @@ -14549,18 +15522,34 @@ i32.eqz br_if $break|1 local.get $1 + local.tee $4 i32.load offset=4 local.get $3 + local.tee $5 i32.add + i32.const -1 + local.get $5 + local.get $4 + i32.load offset=8 + i32.lt_u + select i32.load8_s local.get $0 + local.tee $4 i32.load offset=4 i32.const 8 local.get $3 i32.sub i32.const 2 i32.shl + local.tee $5 i32.add + i32.const -1 + local.get $5 + local.get $4 + i32.load offset=8 + i32.lt_u + select i32.load i32.const 24 i32.shl @@ -14590,9 +15579,19 @@ i32.const 8 call $~lib/typedarray/Int8Array#subarray call $~lib/typedarray/Int8Array#reverse - local.set $4 - local.get $4 + local.set $6 + local.get $6 + local.tee $4 i32.load offset=4 + i32.const 0 + local.tee $5 + i32.add + i32.const -1 + local.get $5 + local.get $4 + i32.load offset=8 + i32.lt_u + select i32.load8_s i32.const 8 i32.eq @@ -14605,9 +15604,19 @@ call $~lib/env/abort unreachable end - local.get $4 + local.get $6 + local.tee $4 i32.load offset=4 - i32.load8_s offset=1 + i32.const 1 + local.tee $5 + i32.add + i32.const -1 + local.get $5 + local.get $4 + i32.load offset=8 + i32.lt_u + select + i32.load8_s i32.const 7 i32.eq i32.eqz @@ -14619,9 +15628,19 @@ call $~lib/env/abort unreachable end - local.get $4 + local.get $6 + local.tee $4 i32.load offset=4 - i32.load8_s offset=2 + i32.const 2 + local.tee $5 + i32.add + i32.const -1 + local.get $5 + local.get $4 + i32.load offset=8 + i32.lt_u + select + i32.load8_s i32.const 6 i32.eq i32.eqz @@ -14633,9 +15652,19 @@ call $~lib/env/abort unreachable end - local.get $4 + local.get $6 + local.tee $4 i32.load offset=4 - i32.load8_s offset=3 + i32.const 3 + local.tee $5 + i32.add + i32.const -1 + local.get $5 + local.get $4 + i32.load offset=8 + i32.lt_u + select + i32.load8_s i32.const 5 i32.eq i32.eqz @@ -14824,11 +15853,11 @@ i32.add i32.store offset=4 local.get $7 - local.get $9 local.get $5 + local.get $4 + i32.sub i32.const 0 i32.shl - i32.add i32.store offset=8 local.get $7 ) @@ -14838,6 +15867,8 @@ (local $2 i32) (local $3 i32) (local $4 i32) + (local $5 i32) + (local $6 i32) global.get $std/typedarray/testArrayReverseValues local.set $0 i32.const 0 @@ -14865,11 +15896,19 @@ local.get $3 i32.add local.get $0 + local.tee $4 i32.load offset=4 local.get $3 i32.const 2 i32.shl + local.tee $5 i32.add + i32.const -1 + local.get $5 + local.get $4 + i32.load offset=8 + i32.lt_u + select i32.load i32.const 255 i32.and @@ -14879,11 +15918,19 @@ local.get $3 i32.add local.get $0 + local.tee $4 i32.load offset=4 local.get $3 i32.const 2 i32.shl + local.tee $5 i32.add + i32.const -1 + local.get $5 + local.get $4 + i32.load offset=8 + i32.lt_u + select i32.load i32.const 255 i32.and @@ -14911,18 +15958,34 @@ i32.eqz br_if $break|1 local.get $1 + local.tee $4 i32.load offset=4 local.get $3 + local.tee $5 i32.add + i32.const -1 + local.get $5 + local.get $4 + i32.load offset=8 + i32.lt_u + select i32.load8_u local.get $0 + local.tee $4 i32.load offset=4 i32.const 8 local.get $3 i32.sub i32.const 2 i32.shl + local.tee $5 i32.add + i32.const -1 + local.get $5 + local.get $4 + i32.load offset=8 + i32.lt_u + select i32.load i32.const 255 i32.and @@ -14950,9 +16013,19 @@ i32.const 8 call $~lib/typedarray/Uint8Array#subarray call $~lib/typedarray/Uint8Array#reverse - local.set $4 - local.get $4 + local.set $6 + local.get $6 + local.tee $4 i32.load offset=4 + i32.const 0 + local.tee $5 + i32.add + i32.const -1 + local.get $5 + local.get $4 + i32.load offset=8 + i32.lt_u + select i32.load8_u i32.const 8 i32.eq @@ -14965,9 +16038,19 @@ call $~lib/env/abort unreachable end - local.get $4 + local.get $6 + local.tee $4 i32.load offset=4 - i32.load8_u offset=1 + i32.const 1 + local.tee $5 + i32.add + i32.const -1 + local.get $5 + local.get $4 + i32.load offset=8 + i32.lt_u + select + i32.load8_u i32.const 7 i32.eq i32.eqz @@ -14979,9 +16062,19 @@ call $~lib/env/abort unreachable end - local.get $4 + local.get $6 + local.tee $4 i32.load offset=4 - i32.load8_u offset=2 + i32.const 2 + local.tee $5 + i32.add + i32.const -1 + local.get $5 + local.get $4 + i32.load offset=8 + i32.lt_u + select + i32.load8_u i32.const 6 i32.eq i32.eqz @@ -14993,9 +16086,19 @@ call $~lib/env/abort unreachable end - local.get $4 + local.get $6 + local.tee $4 i32.load offset=4 - i32.load8_u offset=3 + i32.const 3 + local.tee $5 + i32.add + i32.const -1 + local.get $5 + local.get $4 + i32.load offset=8 + i32.lt_u + select + i32.load8_u i32.const 5 i32.eq i32.eqz @@ -15184,11 +16287,11 @@ i32.add i32.store offset=4 local.get $7 - local.get $9 local.get $5 + local.get $4 + i32.sub i32.const 0 i32.shl - i32.add i32.store offset=8 local.get $7 ) @@ -15199,6 +16302,7 @@ (local $3 i32) (local $4 i32) (local $5 i32) + (local $6 i32) global.get $std/typedarray/testArrayReverseValues local.set $0 i32.const 0 @@ -15226,11 +16330,19 @@ local.get $3 i32.add local.get $0 + local.tee $4 i32.load offset=4 local.get $3 i32.const 2 i32.shl + local.tee $5 i32.add + i32.const -1 + local.get $5 + local.get $4 + i32.load offset=8 + i32.lt_u + select i32.load i32.const 255 i32.and @@ -15253,11 +16365,19 @@ local.get $3 i32.add local.get $0 + local.tee $4 i32.load offset=4 local.get $3 i32.const 2 i32.shl + local.tee $5 i32.add + i32.const -1 + local.get $5 + local.get $4 + i32.load offset=8 + i32.lt_u + select i32.load i32.const 255 i32.and @@ -15298,18 +16418,34 @@ i32.eqz br_if $break|1 local.get $1 + local.tee $4 i32.load offset=4 local.get $3 + local.tee $5 i32.add + i32.const -1 + local.get $5 + local.get $4 + i32.load offset=8 + i32.lt_u + select i32.load8_u local.get $0 + local.tee $4 i32.load offset=4 i32.const 8 local.get $3 i32.sub i32.const 2 i32.shl + local.tee $5 i32.add + i32.const -1 + local.get $5 + local.get $4 + i32.load offset=8 + i32.lt_u + select i32.load i32.const 255 i32.and @@ -15337,9 +16473,19 @@ i32.const 8 call $~lib/typedarray/Uint8ClampedArray#subarray call $~lib/typedarray/Uint8ClampedArray#reverse - local.set $5 - local.get $5 + local.set $6 + local.get $6 + local.tee $4 i32.load offset=4 + i32.const 0 + local.tee $5 + i32.add + i32.const -1 + local.get $5 + local.get $4 + i32.load offset=8 + i32.lt_u + select i32.load8_u i32.const 8 i32.eq @@ -15352,9 +16498,19 @@ call $~lib/env/abort unreachable end - local.get $5 + local.get $6 + local.tee $4 i32.load offset=4 - i32.load8_u offset=1 + i32.const 1 + local.tee $5 + i32.add + i32.const -1 + local.get $5 + local.get $4 + i32.load offset=8 + i32.lt_u + select + i32.load8_u i32.const 7 i32.eq i32.eqz @@ -15366,9 +16522,19 @@ call $~lib/env/abort unreachable end - local.get $5 + local.get $6 + local.tee $4 i32.load offset=4 - i32.load8_u offset=2 + i32.const 2 + local.tee $5 + i32.add + i32.const -1 + local.get $5 + local.get $4 + i32.load offset=8 + i32.lt_u + select + i32.load8_u i32.const 6 i32.eq i32.eqz @@ -15380,9 +16546,19 @@ call $~lib/env/abort unreachable end - local.get $5 + local.get $6 + local.tee $4 i32.load offset=4 - i32.load8_u offset=3 + i32.const 3 + local.tee $5 + i32.add + i32.const -1 + local.get $5 + local.get $4 + i32.load offset=8 + i32.lt_u + select + i32.load8_u i32.const 5 i32.eq i32.eqz @@ -15571,11 +16747,11 @@ i32.add i32.store offset=4 local.get $7 - local.get $9 local.get $5 + local.get $4 + i32.sub i32.const 1 i32.shl - i32.add i32.store offset=8 local.get $7 ) @@ -15585,6 +16761,8 @@ (local $2 i32) (local $3 i32) (local $4 i32) + (local $5 i32) + (local $6 i32) global.get $std/typedarray/testArrayReverseValues local.set $0 i32.const 0 @@ -15614,11 +16792,19 @@ i32.shl i32.add local.get $0 + local.tee $4 i32.load offset=4 local.get $3 i32.const 2 i32.shl + local.tee $5 i32.add + i32.const -1 + local.get $5 + local.get $4 + i32.load offset=8 + i32.lt_u + select i32.load i32.const 16 i32.shl @@ -15632,11 +16818,19 @@ i32.shl i32.add local.get $0 + local.tee $4 i32.load offset=4 local.get $3 i32.const 2 i32.shl + local.tee $5 i32.add + i32.const -1 + local.get $5 + local.get $4 + i32.load offset=8 + i32.lt_u + select i32.load i32.const 16 i32.shl @@ -15666,20 +16860,36 @@ i32.eqz br_if $break|1 local.get $1 + local.tee $4 i32.load offset=4 local.get $3 i32.const 1 i32.shl + local.tee $5 i32.add + i32.const -1 + local.get $5 + local.get $4 + i32.load offset=8 + i32.lt_u + select i32.load16_s local.get $0 + local.tee $4 i32.load offset=4 i32.const 8 local.get $3 i32.sub i32.const 2 i32.shl + local.tee $5 i32.add + i32.const -1 + local.get $5 + local.get $4 + i32.load offset=8 + i32.lt_u + select i32.load i32.const 16 i32.shl @@ -15709,9 +16919,21 @@ i32.const 8 call $~lib/typedarray/Int16Array#subarray call $~lib/typedarray/Int16Array#reverse - local.set $4 - local.get $4 + local.set $6 + local.get $6 + local.tee $4 i32.load offset=4 + i32.const 0 + i32.const 1 + i32.shl + local.tee $5 + i32.add + i32.const -1 + local.get $5 + local.get $4 + i32.load offset=8 + i32.lt_u + select i32.load16_s i32.const 8 i32.eq @@ -15724,9 +16946,21 @@ call $~lib/env/abort unreachable end - local.get $4 + local.get $6 + local.tee $4 i32.load offset=4 - i32.load16_s offset=2 + i32.const 1 + i32.const 1 + i32.shl + local.tee $5 + i32.add + i32.const -1 + local.get $5 + local.get $4 + i32.load offset=8 + i32.lt_u + select + i32.load16_s i32.const 7 i32.eq i32.eqz @@ -15738,9 +16972,21 @@ call $~lib/env/abort unreachable end - local.get $4 + local.get $6 + local.tee $4 i32.load offset=4 - i32.load16_s offset=4 + i32.const 2 + i32.const 1 + i32.shl + local.tee $5 + i32.add + i32.const -1 + local.get $5 + local.get $4 + i32.load offset=8 + i32.lt_u + select + i32.load16_s i32.const 6 i32.eq i32.eqz @@ -15752,9 +16998,21 @@ call $~lib/env/abort unreachable end - local.get $4 + local.get $6 + local.tee $4 i32.load offset=4 - i32.load16_s offset=6 + i32.const 3 + i32.const 1 + i32.shl + local.tee $5 + i32.add + i32.const -1 + local.get $5 + local.get $4 + i32.load offset=8 + i32.lt_u + select + i32.load16_s i32.const 5 i32.eq i32.eqz @@ -15943,11 +17201,11 @@ i32.add i32.store offset=4 local.get $7 - local.get $9 local.get $5 + local.get $4 + i32.sub i32.const 1 i32.shl - i32.add i32.store offset=8 local.get $7 ) @@ -15957,6 +17215,8 @@ (local $2 i32) (local $3 i32) (local $4 i32) + (local $5 i32) + (local $6 i32) global.get $std/typedarray/testArrayReverseValues local.set $0 i32.const 0 @@ -15986,11 +17246,19 @@ i32.shl i32.add local.get $0 + local.tee $4 i32.load offset=4 local.get $3 i32.const 2 i32.shl + local.tee $5 i32.add + i32.const -1 + local.get $5 + local.get $4 + i32.load offset=8 + i32.lt_u + select i32.load i32.const 65535 i32.and @@ -16002,11 +17270,19 @@ i32.shl i32.add local.get $0 + local.tee $4 i32.load offset=4 local.get $3 i32.const 2 i32.shl + local.tee $5 i32.add + i32.const -1 + local.get $5 + local.get $4 + i32.load offset=8 + i32.lt_u + select i32.load i32.const 65535 i32.and @@ -16034,20 +17310,36 @@ i32.eqz br_if $break|1 local.get $1 + local.tee $4 i32.load offset=4 local.get $3 i32.const 1 i32.shl + local.tee $5 i32.add + i32.const -1 + local.get $5 + local.get $4 + i32.load offset=8 + i32.lt_u + select i32.load16_u local.get $0 + local.tee $4 i32.load offset=4 i32.const 8 local.get $3 i32.sub i32.const 2 i32.shl + local.tee $5 i32.add + i32.const -1 + local.get $5 + local.get $4 + i32.load offset=8 + i32.lt_u + select i32.load i32.const 65535 i32.and @@ -16075,9 +17367,21 @@ i32.const 8 call $~lib/typedarray/Uint16Array#subarray call $~lib/typedarray/Uint16Array#reverse - local.set $4 - local.get $4 + local.set $6 + local.get $6 + local.tee $4 i32.load offset=4 + i32.const 0 + i32.const 1 + i32.shl + local.tee $5 + i32.add + i32.const -1 + local.get $5 + local.get $4 + i32.load offset=8 + i32.lt_u + select i32.load16_u i32.const 8 i32.eq @@ -16090,9 +17394,21 @@ call $~lib/env/abort unreachable end - local.get $4 + local.get $6 + local.tee $4 i32.load offset=4 - i32.load16_u offset=2 + i32.const 1 + i32.const 1 + i32.shl + local.tee $5 + i32.add + i32.const -1 + local.get $5 + local.get $4 + i32.load offset=8 + i32.lt_u + select + i32.load16_u i32.const 7 i32.eq i32.eqz @@ -16104,9 +17420,21 @@ call $~lib/env/abort unreachable end - local.get $4 + local.get $6 + local.tee $4 i32.load offset=4 - i32.load16_u offset=4 + i32.const 2 + i32.const 1 + i32.shl + local.tee $5 + i32.add + i32.const -1 + local.get $5 + local.get $4 + i32.load offset=8 + i32.lt_u + select + i32.load16_u i32.const 6 i32.eq i32.eqz @@ -16118,9 +17446,21 @@ call $~lib/env/abort unreachable end - local.get $4 + local.get $6 + local.tee $4 i32.load offset=4 - i32.load16_u offset=6 + i32.const 3 + i32.const 1 + i32.shl + local.tee $5 + i32.add + i32.const -1 + local.get $5 + local.get $4 + i32.load offset=8 + i32.lt_u + select + i32.load16_u i32.const 5 i32.eq i32.eqz @@ -16209,6 +17549,8 @@ (local $2 i32) (local $3 i32) (local $4 i32) + (local $5 i32) + (local $6 i32) global.get $std/typedarray/testArrayReverseValues local.set $0 i32.const 0 @@ -16238,11 +17580,19 @@ i32.shl i32.add local.get $0 + local.tee $4 i32.load offset=4 local.get $3 i32.const 2 i32.shl + local.tee $5 i32.add + i32.const -1 + local.get $5 + local.get $4 + i32.load offset=8 + i32.lt_u + select i32.load i32.store local.get $2 @@ -16252,11 +17602,19 @@ i32.shl i32.add local.get $0 + local.tee $4 i32.load offset=4 local.get $3 i32.const 2 i32.shl + local.tee $5 i32.add + i32.const -1 + local.get $5 + local.get $4 + i32.load offset=8 + i32.lt_u + select i32.load i32.store end @@ -16282,20 +17640,36 @@ i32.eqz br_if $break|1 local.get $1 + local.tee $4 i32.load offset=4 local.get $3 i32.const 2 i32.shl + local.tee $5 i32.add + i32.const -1 + local.get $5 + local.get $4 + i32.load offset=8 + i32.lt_u + select i32.load local.get $0 + local.tee $4 i32.load offset=4 i32.const 8 local.get $3 i32.sub i32.const 2 i32.shl + local.tee $5 i32.add + i32.const -1 + local.get $5 + local.get $4 + i32.load offset=8 + i32.lt_u + select i32.load i32.eq i32.eqz @@ -16321,9 +17695,21 @@ i32.const 8 call $~lib/typedarray/Int32Array#subarray call $~lib/typedarray/Int32Array#reverse - local.set $4 - local.get $4 + local.set $6 + local.get $6 + local.tee $4 i32.load offset=4 + i32.const 0 + i32.const 2 + i32.shl + local.tee $5 + i32.add + i32.const -1 + local.get $5 + local.get $4 + i32.load offset=8 + i32.lt_u + select i32.load i32.const 8 i32.eq @@ -16336,9 +17722,21 @@ call $~lib/env/abort unreachable end + local.get $6 + local.tee $4 + i32.load offset=4 + i32.const 1 + i32.const 2 + i32.shl + local.tee $5 + i32.add + i32.const -1 + local.get $5 local.get $4 - i32.load offset=4 - i32.load offset=4 + i32.load offset=8 + i32.lt_u + select + i32.load i32.const 7 i32.eq i32.eqz @@ -16350,9 +17748,21 @@ call $~lib/env/abort unreachable end - local.get $4 + local.get $6 + local.tee $4 i32.load offset=4 + i32.const 2 + i32.const 2 + i32.shl + local.tee $5 + i32.add + i32.const -1 + local.get $5 + local.get $4 i32.load offset=8 + i32.lt_u + select + i32.load i32.const 6 i32.eq i32.eqz @@ -16364,9 +17774,21 @@ call $~lib/env/abort unreachable end - local.get $4 + local.get $6 + local.tee $4 i32.load offset=4 - i32.load offset=12 + i32.const 3 + i32.const 2 + i32.shl + local.tee $5 + i32.add + i32.const -1 + local.get $5 + local.get $4 + i32.load offset=8 + i32.lt_u + select + i32.load i32.const 5 i32.eq i32.eqz @@ -16555,11 +17977,11 @@ i32.add i32.store offset=4 local.get $7 - local.get $9 local.get $5 + local.get $4 + i32.sub i32.const 2 i32.shl - i32.add i32.store offset=8 local.get $7 ) @@ -16569,6 +17991,8 @@ (local $2 i32) (local $3 i32) (local $4 i32) + (local $5 i32) + (local $6 i32) global.get $std/typedarray/testArrayReverseValues local.set $0 i32.const 0 @@ -16598,11 +18022,19 @@ i32.shl i32.add local.get $0 + local.tee $4 i32.load offset=4 local.get $3 i32.const 2 i32.shl + local.tee $5 i32.add + i32.const -1 + local.get $5 + local.get $4 + i32.load offset=8 + i32.lt_u + select i32.load i32.store local.get $2 @@ -16612,11 +18044,19 @@ i32.shl i32.add local.get $0 + local.tee $4 i32.load offset=4 local.get $3 i32.const 2 i32.shl + local.tee $5 i32.add + i32.const -1 + local.get $5 + local.get $4 + i32.load offset=8 + i32.lt_u + select i32.load i32.store end @@ -16642,20 +18082,36 @@ i32.eqz br_if $break|1 local.get $1 + local.tee $4 i32.load offset=4 local.get $3 i32.const 2 i32.shl + local.tee $5 i32.add + i32.const -1 + local.get $5 + local.get $4 + i32.load offset=8 + i32.lt_u + select i32.load local.get $0 + local.tee $4 i32.load offset=4 i32.const 8 local.get $3 i32.sub i32.const 2 i32.shl + local.tee $5 i32.add + i32.const -1 + local.get $5 + local.get $4 + i32.load offset=8 + i32.lt_u + select i32.load i32.eq i32.eqz @@ -16681,9 +18137,21 @@ i32.const 8 call $~lib/typedarray/Uint32Array#subarray call $~lib/typedarray/Uint32Array#reverse - local.set $4 - local.get $4 + local.set $6 + local.get $6 + local.tee $4 i32.load offset=4 + i32.const 0 + i32.const 2 + i32.shl + local.tee $5 + i32.add + i32.const -1 + local.get $5 + local.get $4 + i32.load offset=8 + i32.lt_u + select i32.load i32.const 8 i32.eq @@ -16696,9 +18164,21 @@ call $~lib/env/abort unreachable end + local.get $6 + local.tee $4 + i32.load offset=4 + i32.const 1 + i32.const 2 + i32.shl + local.tee $5 + i32.add + i32.const -1 + local.get $5 local.get $4 - i32.load offset=4 - i32.load offset=4 + i32.load offset=8 + i32.lt_u + select + i32.load i32.const 7 i32.eq i32.eqz @@ -16710,9 +18190,21 @@ call $~lib/env/abort unreachable end - local.get $4 + local.get $6 + local.tee $4 i32.load offset=4 + i32.const 2 + i32.const 2 + i32.shl + local.tee $5 + i32.add + i32.const -1 + local.get $5 + local.get $4 i32.load offset=8 + i32.lt_u + select + i32.load i32.const 6 i32.eq i32.eqz @@ -16724,9 +18216,21 @@ call $~lib/env/abort unreachable end - local.get $4 + local.get $6 + local.tee $4 i32.load offset=4 - i32.load offset=12 + i32.const 3 + i32.const 2 + i32.shl + local.tee $5 + i32.add + i32.const -1 + local.get $5 + local.get $4 + i32.load offset=8 + i32.lt_u + select + i32.load i32.const 5 i32.eq i32.eqz @@ -16915,11 +18419,11 @@ i32.add i32.store offset=4 local.get $7 - local.get $9 local.get $5 + local.get $4 + i32.sub i32.const 3 i32.shl - i32.add i32.store offset=8 local.get $7 ) @@ -16929,6 +18433,8 @@ (local $2 i32) (local $3 i32) (local $4 i32) + (local $5 i32) + (local $6 i32) global.get $std/typedarray/testArrayReverseValues local.set $0 i32.const 0 @@ -16958,11 +18464,19 @@ i32.shl i32.add local.get $0 + local.tee $4 i32.load offset=4 local.get $3 i32.const 2 i32.shl + local.tee $5 i32.add + i32.const -1 + local.get $5 + local.get $4 + i32.load offset=8 + i32.lt_u + select i64.load32_s i64.store local.get $2 @@ -16972,11 +18486,19 @@ i32.shl i32.add local.get $0 + local.tee $4 i32.load offset=4 local.get $3 i32.const 2 i32.shl + local.tee $5 i32.add + i32.const -1 + local.get $5 + local.get $4 + i32.load offset=8 + i32.lt_u + select i64.load32_s i64.store end @@ -17002,20 +18524,36 @@ i32.eqz br_if $break|1 local.get $1 + local.tee $4 i32.load offset=4 local.get $3 i32.const 3 i32.shl + local.tee $5 i32.add + i32.const -1 + local.get $5 + local.get $4 + i32.load offset=8 + i32.lt_u + select i64.load local.get $0 + local.tee $4 i32.load offset=4 i32.const 8 local.get $3 i32.sub i32.const 2 i32.shl + local.tee $5 i32.add + i32.const -1 + local.get $5 + local.get $4 + i32.load offset=8 + i32.lt_u + select i64.load32_s i64.eq i32.eqz @@ -17041,9 +18579,21 @@ i32.const 8 call $~lib/typedarray/Int64Array#subarray call $~lib/typedarray/Int64Array#reverse - local.set $4 - local.get $4 + local.set $6 + local.get $6 + local.tee $4 i32.load offset=4 + i32.const 0 + i32.const 3 + i32.shl + local.tee $5 + i32.add + i32.const -1 + local.get $5 + local.get $4 + i32.load offset=8 + i32.lt_u + select i64.load i64.const 8 i64.eq @@ -17056,9 +18606,21 @@ call $~lib/env/abort unreachable end - local.get $4 + local.get $6 + local.tee $4 i32.load offset=4 - i64.load offset=8 + i32.const 1 + i32.const 3 + i32.shl + local.tee $5 + i32.add + i32.const -1 + local.get $5 + local.get $4 + i32.load offset=8 + i32.lt_u + select + i64.load i64.const 7 i64.eq i32.eqz @@ -17070,9 +18632,21 @@ call $~lib/env/abort unreachable end - local.get $4 + local.get $6 + local.tee $4 i32.load offset=4 - i64.load offset=16 + i32.const 2 + i32.const 3 + i32.shl + local.tee $5 + i32.add + i32.const -1 + local.get $5 + local.get $4 + i32.load offset=8 + i32.lt_u + select + i64.load i64.const 6 i64.eq i32.eqz @@ -17084,9 +18658,21 @@ call $~lib/env/abort unreachable end - local.get $4 + local.get $6 + local.tee $4 i32.load offset=4 - i64.load offset=24 + i32.const 3 + i32.const 3 + i32.shl + local.tee $5 + i32.add + i32.const -1 + local.get $5 + local.get $4 + i32.load offset=8 + i32.lt_u + select + i64.load i64.const 5 i64.eq i32.eqz @@ -17275,11 +18861,11 @@ i32.add i32.store offset=4 local.get $7 - local.get $9 local.get $5 + local.get $4 + i32.sub i32.const 3 i32.shl - i32.add i32.store offset=8 local.get $7 ) @@ -17289,6 +18875,8 @@ (local $2 i32) (local $3 i32) (local $4 i32) + (local $5 i32) + (local $6 i32) global.get $std/typedarray/testArrayReverseValues local.set $0 i32.const 0 @@ -17318,11 +18906,19 @@ i32.shl i32.add local.get $0 + local.tee $4 i32.load offset=4 local.get $3 i32.const 2 i32.shl + local.tee $5 i32.add + i32.const -1 + local.get $5 + local.get $4 + i32.load offset=8 + i32.lt_u + select i64.load32_s i64.store local.get $2 @@ -17332,11 +18928,19 @@ i32.shl i32.add local.get $0 + local.tee $4 i32.load offset=4 local.get $3 i32.const 2 i32.shl + local.tee $5 i32.add + i32.const -1 + local.get $5 + local.get $4 + i32.load offset=8 + i32.lt_u + select i64.load32_s i64.store end @@ -17362,20 +18966,36 @@ i32.eqz br_if $break|1 local.get $1 + local.tee $4 i32.load offset=4 local.get $3 i32.const 3 i32.shl + local.tee $5 i32.add + i32.const -1 + local.get $5 + local.get $4 + i32.load offset=8 + i32.lt_u + select i64.load local.get $0 + local.tee $4 i32.load offset=4 i32.const 8 local.get $3 i32.sub i32.const 2 i32.shl + local.tee $5 i32.add + i32.const -1 + local.get $5 + local.get $4 + i32.load offset=8 + i32.lt_u + select i64.load32_s i64.eq i32.eqz @@ -17401,9 +19021,21 @@ i32.const 8 call $~lib/typedarray/Uint64Array#subarray call $~lib/typedarray/Uint64Array#reverse - local.set $4 - local.get $4 + local.set $6 + local.get $6 + local.tee $4 i32.load offset=4 + i32.const 0 + i32.const 3 + i32.shl + local.tee $5 + i32.add + i32.const -1 + local.get $5 + local.get $4 + i32.load offset=8 + i32.lt_u + select i64.load i64.const 8 i64.eq @@ -17416,9 +19048,21 @@ call $~lib/env/abort unreachable end - local.get $4 + local.get $6 + local.tee $4 i32.load offset=4 - i64.load offset=8 + i32.const 1 + i32.const 3 + i32.shl + local.tee $5 + i32.add + i32.const -1 + local.get $5 + local.get $4 + i32.load offset=8 + i32.lt_u + select + i64.load i64.const 7 i64.eq i32.eqz @@ -17430,9 +19074,21 @@ call $~lib/env/abort unreachable end - local.get $4 + local.get $6 + local.tee $4 i32.load offset=4 - i64.load offset=16 + i32.const 2 + i32.const 3 + i32.shl + local.tee $5 + i32.add + i32.const -1 + local.get $5 + local.get $4 + i32.load offset=8 + i32.lt_u + select + i64.load i64.const 6 i64.eq i32.eqz @@ -17444,9 +19100,21 @@ call $~lib/env/abort unreachable end - local.get $4 + local.get $6 + local.tee $4 i32.load offset=4 - i64.load offset=24 + i32.const 3 + i32.const 3 + i32.shl + local.tee $5 + i32.add + i32.const -1 + local.get $5 + local.get $4 + i32.load offset=8 + i32.lt_u + select + i64.load i64.const 5 i64.eq i32.eqz @@ -17635,11 +19303,11 @@ i32.add i32.store offset=4 local.get $7 - local.get $9 local.get $5 + local.get $4 + i32.sub i32.const 2 i32.shl - i32.add i32.store offset=8 local.get $7 ) @@ -17649,6 +19317,8 @@ (local $2 i32) (local $3 i32) (local $4 i32) + (local $5 i32) + (local $6 i32) global.get $std/typedarray/testArrayReverseValues local.set $0 i32.const 0 @@ -17678,11 +19348,19 @@ i32.shl i32.add local.get $0 + local.tee $4 i32.load offset=4 local.get $3 i32.const 2 i32.shl + local.tee $5 i32.add + i32.const -1 + local.get $5 + local.get $4 + i32.load offset=8 + i32.lt_u + select i32.load f32.convert_i32_s f32.store @@ -17693,11 +19371,19 @@ i32.shl i32.add local.get $0 + local.tee $4 i32.load offset=4 local.get $3 i32.const 2 i32.shl + local.tee $5 i32.add + i32.const -1 + local.get $5 + local.get $4 + i32.load offset=8 + i32.lt_u + select i32.load f32.convert_i32_s f32.store @@ -17724,20 +19410,36 @@ i32.eqz br_if $break|1 local.get $1 + local.tee $4 i32.load offset=4 local.get $3 i32.const 2 i32.shl + local.tee $5 i32.add + i32.const -1 + local.get $5 + local.get $4 + i32.load offset=8 + i32.lt_u + select f32.load local.get $0 + local.tee $4 i32.load offset=4 i32.const 8 local.get $3 i32.sub i32.const 2 i32.shl + local.tee $5 i32.add + i32.const -1 + local.get $5 + local.get $4 + i32.load offset=8 + i32.lt_u + select i32.load f32.convert_i32_s f32.eq @@ -17764,9 +19466,21 @@ i32.const 8 call $~lib/typedarray/Float32Array#subarray call $~lib/typedarray/Float32Array#reverse - local.set $4 - local.get $4 + local.set $6 + local.get $6 + local.tee $4 i32.load offset=4 + i32.const 0 + i32.const 2 + i32.shl + local.tee $5 + i32.add + i32.const -1 + local.get $5 + local.get $4 + i32.load offset=8 + i32.lt_u + select f32.load f32.const 8 f32.eq @@ -17779,9 +19493,21 @@ call $~lib/env/abort unreachable end - local.get $4 + local.get $6 + local.tee $4 i32.load offset=4 - f32.load offset=4 + i32.const 1 + i32.const 2 + i32.shl + local.tee $5 + i32.add + i32.const -1 + local.get $5 + local.get $4 + i32.load offset=8 + i32.lt_u + select + f32.load f32.const 7 f32.eq i32.eqz @@ -17793,9 +19519,21 @@ call $~lib/env/abort unreachable end - local.get $4 + local.get $6 + local.tee $4 i32.load offset=4 - f32.load offset=8 + i32.const 2 + i32.const 2 + i32.shl + local.tee $5 + i32.add + i32.const -1 + local.get $5 + local.get $4 + i32.load offset=8 + i32.lt_u + select + f32.load f32.const 6 f32.eq i32.eqz @@ -17807,9 +19545,21 @@ call $~lib/env/abort unreachable end - local.get $4 + local.get $6 + local.tee $4 i32.load offset=4 - f32.load offset=12 + i32.const 3 + i32.const 2 + i32.shl + local.tee $5 + i32.add + i32.const -1 + local.get $5 + local.get $4 + i32.load offset=8 + i32.lt_u + select + f32.load f32.const 5 f32.eq i32.eqz @@ -17898,6 +19648,8 @@ (local $2 i32) (local $3 i32) (local $4 i32) + (local $5 i32) + (local $6 i32) global.get $std/typedarray/testArrayReverseValues local.set $0 i32.const 0 @@ -17927,11 +19679,19 @@ i32.shl i32.add local.get $0 + local.tee $4 i32.load offset=4 local.get $3 i32.const 2 i32.shl + local.tee $5 i32.add + i32.const -1 + local.get $5 + local.get $4 + i32.load offset=8 + i32.lt_u + select i32.load f64.convert_i32_s f64.store @@ -17942,11 +19702,19 @@ i32.shl i32.add local.get $0 + local.tee $4 i32.load offset=4 local.get $3 i32.const 2 i32.shl + local.tee $5 i32.add + i32.const -1 + local.get $5 + local.get $4 + i32.load offset=8 + i32.lt_u + select i32.load f64.convert_i32_s f64.store @@ -17973,20 +19741,36 @@ i32.eqz br_if $break|1 local.get $1 + local.tee $4 i32.load offset=4 local.get $3 i32.const 3 i32.shl + local.tee $5 i32.add + i32.const -1 + local.get $5 + local.get $4 + i32.load offset=8 + i32.lt_u + select f64.load local.get $0 + local.tee $4 i32.load offset=4 i32.const 8 local.get $3 i32.sub i32.const 2 i32.shl + local.tee $5 i32.add + i32.const -1 + local.get $5 + local.get $4 + i32.load offset=8 + i32.lt_u + select i32.load f64.convert_i32_s f64.eq @@ -18013,9 +19797,21 @@ i32.const 8 call $~lib/typedarray/Float64Array#subarray call $~lib/typedarray/Float64Array#reverse - local.set $4 - local.get $4 + local.set $6 + local.get $6 + local.tee $4 i32.load offset=4 + i32.const 0 + i32.const 3 + i32.shl + local.tee $5 + i32.add + i32.const -1 + local.get $5 + local.get $4 + i32.load offset=8 + i32.lt_u + select f64.load f64.const 8 f64.eq @@ -18028,9 +19824,21 @@ call $~lib/env/abort unreachable end - local.get $4 + local.get $6 + local.tee $4 i32.load offset=4 - f64.load offset=8 + i32.const 1 + i32.const 3 + i32.shl + local.tee $5 + i32.add + i32.const -1 + local.get $5 + local.get $4 + i32.load offset=8 + i32.lt_u + select + f64.load f64.const 7 f64.eq i32.eqz @@ -18042,9 +19850,21 @@ call $~lib/env/abort unreachable end - local.get $4 + local.get $6 + local.tee $4 i32.load offset=4 - f64.load offset=16 + i32.const 2 + i32.const 3 + i32.shl + local.tee $5 + i32.add + i32.const -1 + local.get $5 + local.get $4 + i32.load offset=8 + i32.lt_u + select + f64.load f64.const 6 f64.eq i32.eqz @@ -18056,9 +19876,21 @@ call $~lib/env/abort unreachable end - local.get $4 + local.get $6 + local.tee $4 i32.load offset=4 - f64.load offset=24 + i32.const 3 + i32.const 3 + i32.shl + local.tee $5 + i32.add + i32.const -1 + local.get $5 + local.get $4 + i32.load offset=8 + i32.lt_u + select + f64.load f64.const 5 f64.eq i32.eqz @@ -18073,6 +19905,7 @@ ) (func $start:std/typedarray (; 349 ;) (type $FUNCSIG$v) (local $0 i32) + (local $1 i32) global.get $~lib/typedarray/Int8Array.BYTES_PER_ELEMENT i32.const 1 i32.eq @@ -18277,7 +20110,19 @@ unreachable end global.get $std/typedarray/arr + local.tee $0 i32.load offset=4 + i32.const 0 + i32.const 2 + i32.shl + local.tee $1 + i32.add + i32.const -1 + local.get $1 + local.get $0 + i32.load offset=8 + i32.lt_u + select i32.load i32.const 1 i32.eq @@ -18291,8 +20136,20 @@ unreachable end global.get $std/typedarray/arr + local.tee $0 i32.load offset=4 - i32.load offset=4 + i32.const 1 + i32.const 2 + i32.shl + local.tee $1 + i32.add + i32.const -1 + local.get $1 + local.get $0 + i32.load offset=8 + i32.lt_u + select + i32.load i32.const 2 i32.eq i32.eqz @@ -18305,8 +20162,20 @@ unreachable end global.get $std/typedarray/arr + local.tee $0 i32.load offset=4 + i32.const 2 + i32.const 2 + i32.shl + local.tee $1 + i32.add + i32.const -1 + local.get $1 + local.get $0 i32.load offset=8 + i32.lt_u + select + i32.load i32.const 3 i32.eq i32.eqz @@ -18367,7 +20236,19 @@ unreachable end global.get $std/typedarray/arr + local.tee $0 i32.load offset=4 + i32.const 0 + i32.const 2 + i32.shl + local.tee $1 + i32.add + i32.const -1 + local.get $1 + local.get $0 + i32.load offset=8 + i32.lt_u + select i32.load i32.const 2 i32.eq @@ -18473,40 +20354,94 @@ end drop global.get $std/typedarray/af64 + local.tee $0 i32.load offset=4 + i32.const 0 + i32.const 3 + i32.shl + local.tee $1 + i32.add + i32.const -1 + local.get $1 + local.get $0 + i32.load offset=8 + i32.lt_u + select f64.load f64.const 4 f64.eq local.tee $0 if (result i32) global.get $std/typedarray/af64 + local.tee $0 i32.load offset=4 - f64.load offset=8 + i32.const 1 + i32.const 3 + i32.shl + local.tee $1 + i32.add + i32.const -1 + local.get $1 + local.get $0 + i32.load offset=8 + i32.lt_u + select + f64.load f64.const 5 f64.eq else local.get $0 end local.tee $0 + i32.const 0 + i32.ne if (result i32) global.get $std/typedarray/af64 + local.tee $0 i32.load offset=4 - f64.load offset=16 + i32.const 2 + i32.const 3 + i32.shl + local.tee $1 + i32.add + i32.const -1 + local.get $1 + local.get $0 + i32.load offset=8 + i32.lt_u + select + f64.load f64.const 6 f64.eq else local.get $0 end local.tee $0 + i32.const 0 + i32.ne if (result i32) global.get $std/typedarray/af64 + local.tee $0 i32.load offset=4 - f64.load offset=24 + i32.const 3 + i32.const 3 + i32.shl + local.tee $1 + i32.add + i32.const -1 + local.get $1 + local.get $0 + i32.load offset=8 + i32.lt_u + select + f64.load f64.const 7 f64.eq else local.get $0 end + i32.const 0 + i32.ne i32.eqz if i32.const 0 @@ -18572,7 +20507,17 @@ i32.and i32.store8 offset=2 global.get $std/typedarray/clampedArr + local.tee $0 i32.load offset=4 + i32.const 0 + local.tee $1 + i32.add + i32.const -1 + local.get $1 + local.get $0 + i32.load offset=8 + i32.lt_u + select i32.load8_u i32.const 0 i32.eq @@ -18586,8 +20531,18 @@ unreachable end global.get $std/typedarray/clampedArr + local.tee $0 i32.load offset=4 - i32.load8_u offset=1 + i32.const 1 + local.tee $1 + i32.add + i32.const -1 + local.get $1 + local.get $0 + i32.load offset=8 + i32.lt_u + select + i32.load8_u i32.const 2 i32.eq i32.eqz @@ -18600,8 +20555,18 @@ unreachable end global.get $std/typedarray/clampedArr + local.tee $0 i32.load offset=4 - i32.load8_u offset=2 + i32.const 2 + local.tee $1 + i32.add + i32.const -1 + local.get $1 + local.get $0 + i32.load offset=8 + i32.lt_u + select + i32.load8_u i32.const 255 i32.eq i32.eqz @@ -19129,7 +21094,17 @@ call $~lib/typedarray/Int8Array#subarray global.set $std/typedarray/multisubarr1 global.get $std/typedarray/multisubarr1 + local.tee $0 i32.load offset=4 + i32.const 0 + local.tee $1 + i32.add + i32.const -1 + local.get $1 + local.get $0 + i32.load offset=8 + i32.lt_u + select i32.load8_s i32.const 2 i32.eq @@ -19187,7 +21162,17 @@ call $~lib/typedarray/Int8Array#subarray global.set $std/typedarray/multisubarr2 global.get $std/typedarray/multisubarr2 + local.tee $0 i32.load offset=4 + i32.const 0 + local.tee $1 + i32.add + i32.const -1 + local.get $1 + local.get $0 + i32.load offset=8 + i32.lt_u + select i32.load8_s i32.const 3 i32.eq @@ -19245,7 +21230,17 @@ call $~lib/typedarray/Int8Array#subarray global.set $std/typedarray/multisubarr3 global.get $std/typedarray/multisubarr3 + local.tee $0 i32.load offset=4 + i32.const 0 + local.tee $1 + i32.add + i32.const -1 + local.get $1 + local.get $0 + i32.load offset=8 + i32.lt_u + select i32.load8_s i32.const 4 i32.eq