From a34d6b3aa975b726dd1cf8dddf78003d157b9f6b Mon Sep 17 00:00:00 2001 From: Max Desiatov Date: Thu, 26 Feb 2026 11:38:24 +0000 Subject: [PATCH 1/4] Add support for Exceptions Handling proposal --- .../FuzzDifferential/FuzzDifferential.swift | 2 + .../Sources/FuzzExecute/FuzzExecute.swift | 2 + .../WasmKitFuzzing/WasmKitFuzzing.swift | 4 + README.md | 2 +- .../BinaryInstructionEncoder.swift | 11 + Sources/WAT/BinaryEncoding/Encoder.swift | 52 ++++ Sources/WAT/ParseTextInstruction.swift | 7 + Sources/WAT/Parser/ExpressionParser.swift | 47 +++- Sources/WAT/Parser/WastParser.swift | 6 + Sources/WAT/Parser/WatParser.swift | 45 +++ Sources/WAT/WAT.swift | 18 ++ Sources/WasmKit/CMakeLists.txt | 1 + .../ComponentModel/ComponentLoader.swift | 2 + .../WasmKit/Execution/ConstEvaluation.swift | 3 + Sources/WasmKit/Execution/Debugger.swift | 13 + .../Execution/DispatchInstruction.swift | 33 +++ Sources/WasmKit/Execution/Errors.swift | 27 ++ Sources/WasmKit/Execution/Execution.swift | 99 +++++-- Sources/WasmKit/Execution/Function.swift | 3 +- Sources/WasmKit/Execution/Instances.swift | 49 +++- .../Instructions/ExceptionHandling.swift | 133 +++++++++ .../Execution/Instructions/Instruction.swift | 90 ++++++ .../Instructions/InstructionSupport.swift | 54 ++++ .../WasmKit/Execution/Instructions/Misc.swift | 2 + .../WasmKit/Execution/StoreAllocator.swift | 35 +++ Sources/WasmKit/Execution/UntypedValue.swift | 6 +- Sources/WasmKit/Imports.swift | 4 + Sources/WasmKit/Module.swift | 20 +- Sources/WasmKit/ModuleParser.swift | 4 + Sources/WasmKit/Translator.swift | 258 ++++++++++++++++-- Sources/WasmKit/Validator.swift | 8 + Sources/WasmKit/WasmKitError.swift | 8 + .../WasmParser/BinaryInstructionDecoder.swift | 12 + Sources/WasmParser/ComponentParser.swift | 1 + Sources/WasmParser/InstructionVisitor.swift | 18 ++ Sources/WasmParser/WasmParser.swift | 69 ++++- Sources/WasmParser/WasmParserError.swift | 10 + Sources/WasmParser/WasmTypes.swift | 41 +++ Sources/WasmTypes/WasmTypes.swift | 15 + .../_CWasmKit/include/DirectThreadedCode.inc | 30 ++ Tests/WasmKitTests/Spectest/TestCase.swift | 16 +- Tests/WasmKitTests/SpectestTests.swift | 1 + Utilities/Instructions.json | 3 + Utilities/Sources/VMSpec/Instruction.swift | 24 ++ 44 files changed, 1217 insertions(+), 71 deletions(-) create mode 100644 Sources/WasmKit/Execution/Instructions/ExceptionHandling.swift diff --git a/FuzzTesting/Sources/FuzzDifferential/FuzzDifferential.swift b/FuzzTesting/Sources/FuzzDifferential/FuzzDifferential.swift index 1367c997..aa349b34 100644 --- a/FuzzTesting/Sources/FuzzDifferential/FuzzDifferential.swift +++ b/FuzzTesting/Sources/FuzzDifferential/FuzzDifferential.swift @@ -79,6 +79,8 @@ extension ValueType { return .ref(.function(nil)) case .abstract(.externRef): return .ref(.extern(nil)) + case .abstract(.exnRef): + return .ref(.exception(nil)) case .concrete: // We don't model GC reference heap types yet; use a null externref. return .ref(.extern(nil)) diff --git a/FuzzTesting/Sources/FuzzExecute/FuzzExecute.swift b/FuzzTesting/Sources/FuzzExecute/FuzzExecute.swift index 28d01577..28d52c5d 100644 --- a/FuzzTesting/Sources/FuzzExecute/FuzzExecute.swift +++ b/FuzzTesting/Sources/FuzzExecute/FuzzExecute.swift @@ -39,6 +39,8 @@ extension ValueType { return .ref(.function(nil)) case .abstract(.externRef): return .ref(.extern(nil)) + case .abstract(.exnRef): + return .ref(.exception(nil)) case .concrete: // We don't model GC reference heap types yet; use a null externref. return .ref(.extern(nil)) diff --git a/FuzzTesting/Sources/WasmKitFuzzing/WasmKitFuzzing.swift b/FuzzTesting/Sources/WasmKitFuzzing/WasmKitFuzzing.swift index 899e1758..164030f5 100644 --- a/FuzzTesting/Sources/WasmKitFuzzing/WasmKitFuzzing.swift +++ b/FuzzTesting/Sources/WasmKitFuzzing/WasmKitFuzzing.swift @@ -45,6 +45,10 @@ public func fuzzInstantiation(bytes: [UInt8]) throws { value = try Memory(store: store, type: memoryType) case .table(let tableType): value = try Table(store: store, type: tableType) + case .tag(let typeIndex): + guard typeIndex < module.types.count else { return } + let type = module.types[Int(typeIndex)] + value = Tag(store: store, type: type) } imports.define(module: importEntry.module, name: importEntry.name, value.externalValue) } diff --git a/README.md b/README.md index 7c374a44..1aceb113 100644 --- a/README.md +++ b/README.md @@ -91,6 +91,7 @@ Proposals are grouped by their [phase](https://github.com/WebAssembly/meetings/b | Proposal | Status | WasmKit version | |----------|--------|-----------------| | [Bulk Memory Operations](https://github.com/WebAssembly/bulk-memory-operations) | ✅ Implemented | [0.0.2] | +| [Exception Handling](https://github.com/WebAssembly/exception-handling) | ✅ Implemented | `main` branch | | [Fixed-width SIMD](https://github.com/webassembly/simd) | ✅ Implemented | `main` branch | | [Import/Export of Mutable Globals](https://github.com/WebAssembly/mutable-global) | ✅ Implemented | [0.0.2] | | [Memory64](https://github.com/WebAssembly/memory64) | ✅ Implemented | [0.0.2] | @@ -102,7 +103,6 @@ Proposals are grouped by their [phase](https://github.com/WebAssembly/meetings/b | [Typed Function References](https://github.com/WebAssembly/function-references) | 🚧 Parser implemented | [0.2.0] | | [Branch Hinting](https://github.com/WebAssembly/branch-hinting) | ❌ Not implemented | | | [Custom Annotation Syntax in the Text Format](https://github.com/WebAssembly/annotations) | ❌ Not implemented | | -| [Exception Handling](https://github.com/WebAssembly/exception-handling) | ❌ Not implemented | | | [Extended Constant Expressions](https://github.com/WebAssembly/extended-const) | ❌ Not implemented | | | [Garbage Collection](https://github.com/WebAssembly/gc) | ❌ Not implemented | | | [Multiple Memories](https://github.com/WebAssembly/multi-memory) | ❌ Not implemented | | diff --git a/Sources/WAT/BinaryEncoding/BinaryInstructionEncoder.swift b/Sources/WAT/BinaryEncoding/BinaryInstructionEncoder.swift index 8c5b7e61..6a682599 100644 --- a/Sources/WAT/BinaryEncoding/BinaryInstructionEncoder.swift +++ b/Sources/WAT/BinaryEncoding/BinaryInstructionEncoder.swift @@ -24,6 +24,7 @@ protocol BinaryInstructionEncoder: InstructionVisitor { mutating func encodeImmediates(memory: UInt32) throws(VisitorError) mutating func encodeImmediates(relativeDepth: UInt32) throws(VisitorError) mutating func encodeImmediates(table: UInt32) throws(VisitorError) + mutating func encodeImmediates(tagIndex: UInt32) throws(VisitorError) mutating func encodeImmediates(targets: BrTable) throws(VisitorError) mutating func encodeImmediates(type: HeapType) throws(VisitorError) mutating func encodeImmediates(type: ValueType) throws(VisitorError) @@ -33,6 +34,7 @@ protocol BinaryInstructionEncoder: InstructionVisitor { mutating func encodeImmediates(value: Int32) throws(VisitorError) mutating func encodeImmediates(value: Int64) throws(VisitorError) mutating func encodeImmediates(value: V128) throws(VisitorError) + mutating func encodeImmediates(blockType: BlockType, tryCatch: TryCatch) throws(VisitorError) mutating func encodeImmediates(dstMem: UInt32, srcMem: UInt32) throws(VisitorError) mutating func encodeImmediates(dstTable: UInt32, srcTable: UInt32) throws(VisitorError) mutating func encodeImmediates(elemIndex: UInt32, table: UInt32) throws(VisitorError) @@ -57,6 +59,11 @@ extension BinaryInstructionEncoder { try encodeImmediates(blockType: blockType) } mutating func visitElse() throws(VisitorError) { try encodeInstruction([0x05]) } + mutating func visitThrow(tagIndex: UInt32) throws(VisitorError) { + try encodeInstruction([0x08]) + try encodeImmediates(tagIndex: tagIndex) + } + mutating func visitThrowRef() throws(VisitorError) { try encodeInstruction([0x0A]) } mutating func visitEnd() throws(VisitorError) { try encodeInstruction([0x0B]) } mutating func visitBr(relativeDepth: UInt32) throws(VisitorError) { try encodeInstruction([0x0C]) @@ -95,6 +102,10 @@ extension BinaryInstructionEncoder { try encodeInstruction([0x15]) try encodeImmediates(typeIndex: typeIndex) } + mutating func visitTryTable(blockType: BlockType, tryCatch: TryCatch) throws(VisitorError) { + try encodeInstruction([0x1F]) + try encodeImmediates(blockType: blockType, tryCatch: tryCatch) + } mutating func visitDrop() throws(VisitorError) { try encodeInstruction([0x1A]) } mutating func visitSelect() throws(VisitorError) { try encodeInstruction([0x1B]) } mutating func visitTypedSelect(type: ValueType) throws(VisitorError) { diff --git a/Sources/WAT/BinaryEncoding/Encoder.swift b/Sources/WAT/BinaryEncoding/Encoder.swift index 47a037cb..2fad3eb6 100644 --- a/Sources/WAT/BinaryEncoding/Encoder.swift +++ b/Sources/WAT/BinaryEncoding/Encoder.swift @@ -141,6 +141,7 @@ extension ReferenceType: WasmEncodable { // Use short form when available case (true, .externRef): encoder.output.append(0x6F) case (true, .funcRef): encoder.output.append(0x70) + case (true, .exnRef): encoder.output.append(0x69) default: encoder.output.append(isNullable ? 0x63 : 0x64) encoder.encode(heapType) @@ -153,6 +154,7 @@ extension HeapType: WasmEncodable { switch self { case .abstract(.externRef): encoder.output.append(0x6F) case .abstract(.funcRef): encoder.output.append(0x70) + case .abstract(.exnRef): encoder.output.append(0x69) case .concrete(let typeIndex): // Note that the typeIndex is decoded as s33, // so we need to encode it as signed. @@ -346,6 +348,9 @@ extension Export: WasmEncodable { case .global(let index): encoder.output.append(0x03) encoder.writeUnsignedLEB128(UInt32(index)) + case .tag(let index): + encoder.output.append(0x04) + encoder.writeUnsignedLEB128(UInt32(index)) } } } @@ -417,6 +422,10 @@ extension Import: WasmEncodable { case .global(let globalType): encoder.output.append(0x03) globalType.encode(to: &encoder) + case .tag(let typeIndex): + encoder.output.append(0x04) + encoder.output.append(0x00) // attribute: exception + encoder.writeUnsignedLEB128(UInt32(typeIndex)) } } } @@ -556,6 +565,29 @@ struct ExpressionEncoder: BinaryInstructionEncoder { mutating func encodeImmediates(value: WasmTypes.V128) { encoder.output.append(contentsOf: value.bytes) } mutating func encodeImmediates(value: WasmParser.IEEE754.Float32) { encodeFixedWidth(value.bitPattern) } mutating func encodeImmediates(value: WasmParser.IEEE754.Float64) { encodeFixedWidth(value.bitPattern) } + mutating func encodeImmediates(tagIndex: UInt32) { encodeUnsigned(tagIndex) } + mutating func encodeImmediates(blockType: WasmParser.BlockType, tryCatch: WasmParser.TryCatch) { + encodeImmediates(blockType: blockType) + encoder.writeUnsignedLEB128(UInt32(tryCatch.catches.count)) + for clause in tryCatch.catches { + switch clause { + case .catch(let tagIndex, let labelIndex): + encoder.output.append(0x00) + encoder.writeUnsignedLEB128(tagIndex) + encoder.writeUnsignedLEB128(labelIndex) + case .catchRef(let tagIndex, let labelIndex): + encoder.output.append(0x01) + encoder.writeUnsignedLEB128(tagIndex) + encoder.writeUnsignedLEB128(labelIndex) + case .catchAll(let labelIndex): + encoder.output.append(0x02) + encoder.writeUnsignedLEB128(labelIndex) + case .catchAllRef(let labelIndex): + encoder.output.append(0x03) + encoder.writeUnsignedLEB128(labelIndex) + } + } + } mutating func encodeImmediates(dstMem: UInt32, srcMem: UInt32) { encodeUnsigned(dstMem) encodeUnsigned(srcMem) @@ -586,6 +618,7 @@ func encode(module: inout Wat, options: EncodeOptions) throws(WatParserError) -> return (locals, function) } var functionSection: [UInt32] = [] + var tagSection: [UInt32] = [] var hasDataSegmentInstruction = false var functionLabelNames: [[(Int, String)]] = [] @@ -622,6 +655,13 @@ func encode(module: inout Wat, options: EncodeOptions) throws(WatParserError) -> } } + // Pre-resolve tag type indices so their types are in the type section. + let tagDefinitions = module.tagsMap.definitions() + for tag in tagDefinitions { + let typeIndex = try module.types.resolveIndex(use: tag.typeUse) + tagSection.append(UInt32(typeIndex)) + } + // Section 1: Type section if !module.types.isEmpty { encoder.section(id: 0x01) { encoder in @@ -663,6 +703,18 @@ func encode(module: inout Wat, options: EncodeOptions) throws(WatParserError) -> } } + // Section 13: Tag section + // Note: tagsec is placed between memsec and globalsec in the module grammar. + // https://webassembly.github.io/exception-handling/core/binary/modules.html#binary-module + if !tagSection.isEmpty { + encoder.section(id: 0x0D) { encoder in + encoder.encodeVector(tagSection) { typeIndex, encoder in + encoder.output.append(0x00) // attribute: exception + encoder.writeUnsignedLEB128(typeIndex) + } + } + } + // Section 6: Global section let globals = module.globals.definitions() if !globals.isEmpty { diff --git a/Sources/WAT/ParseTextInstruction.swift b/Sources/WAT/ParseTextInstruction.swift index 0f463bf4..cb4fa568 100644 --- a/Sources/WAT/ParseTextInstruction.swift +++ b/Sources/WAT/ParseTextInstruction.swift @@ -30,6 +30,10 @@ func parseTextInstruction( let (blockType) = try expressionParser.visitIf(wat: &wat) return { visitor throws(V.VisitorError) in return try visitor.visitIf(blockType: blockType) } case "else": return { visitor throws(V.VisitorError) in return try visitor.visitElse() } + case "throw": + let (tagIndex) = try expressionParser.visitThrow(wat: &wat) + return { visitor throws(V.VisitorError) in return try visitor.visitThrow(tagIndex: tagIndex) } + case "throw_ref": return { visitor throws(V.VisitorError) in return try visitor.visitThrowRef() } case "end": return { visitor throws(V.VisitorError) in return try visitor.visitEnd() } case "br": let (relativeDepth) = try expressionParser.visitBr(wat: &wat) @@ -59,6 +63,9 @@ func parseTextInstruction( case "return_call_ref": let (typeIndex) = try expressionParser.visitReturnCallRef(wat: &wat) return { visitor throws(V.VisitorError) in return try visitor.visitReturnCallRef(typeIndex: typeIndex) } + case "try_table": + let (blockType, tryCatch) = try expressionParser.visitTryTable(wat: &wat) + return { visitor throws(V.VisitorError) in return try visitor.visitTryTable(blockType: blockType, tryCatch: tryCatch) } case "drop": return { visitor throws(V.VisitorError) in return try visitor.visitDrop() } case "select": return { visitor throws(V.VisitorError) in return try visitor.visitSelect() } case "local.get": diff --git a/Sources/WAT/Parser/ExpressionParser.swift b/Sources/WAT/Parser/ExpressionParser.swift index 85ada776..09872d2f 100644 --- a/Sources/WAT/Parser/ExpressionParser.swift +++ b/Sources/WAT/Parser/ExpressionParser.swift @@ -331,10 +331,10 @@ struct ExpressionParser where Visitor.VisitorError this.labelStack.pop() return try visitor.visitEnd() }) - case "block", "loop": + case "block", "loop", "try_table": // Visit the block instruction itself _ = try visit(&visitor) - // Visit child expr here because folded "block" and "loop" + // Visit child expr here because folded "block", "loop", and "try_table" // allows unfolded child instructions unlike others. try parse(visitor: &visitor, wat: &wat) suspense = Suspense(visit: { visitor, this throws(WatParserError) in @@ -468,11 +468,13 @@ struct ExpressionParser where Visitor.VisitorError return .funcRef } else if try parser.takeKeyword("extern") { return .externRef + } else if try parser.takeKeyword("exn") { + return .exnRef } else if let id = try parser.takeIndexOrId() { let (_, index) = try wat.types.resolve(use: id) return .concrete(typeIndex: UInt32(index)) } - throw WatParserError("expected \"func\", \"extern\" or type index", location: parser.lexer.location()) + throw WatParserError("expected \"func\", \"extern\", \"exn\" or type index", location: parser.lexer.location()) } private mutating func memArg(defaultAlign: UInt32) throws(WatParserError) -> MemArg { @@ -566,6 +568,45 @@ extension ExpressionParser { mutating func visitReturnCallRef(wat: inout Wat) throws(WatParserError) -> UInt32 { return try visitCallRef(wat: &wat) } + mutating func visitThrow(wat: inout Wat) throws(WatParserError) -> UInt32 { + let use = try parser.expectIndexOrId() + return UInt32(try wat.tagsMap.resolve(use: use).index) + } + mutating func visitTryTable(wat: inout Wat) throws(WatParserError) -> (blockType: BlockType, tryCatch: TryCatch) { + let label = try parser.takeId() + let bt = try blockType(wat: &wat) + var catches: [CatchClause] = [] + while true { + if try parser.takeParenBlockStart("catch") { + let tagUse = try parser.expectIndexOrId() + let tagIndex = UInt32(try wat.tagsMap.resolve(use: tagUse).index) + let label = try labelIndex() + try parser.expect(.rightParen) + catches.append(.catch(tagIndex: tagIndex, labelIndex: label)) + } else if try parser.takeParenBlockStart("catch_ref") { + let tagUse = try parser.expectIndexOrId() + let tagIndex = UInt32(try wat.tagsMap.resolve(use: tagUse).index) + let label = try labelIndex() + try parser.expect(.rightParen) + catches.append(.catchRef(tagIndex: tagIndex, labelIndex: label)) + } else if try parser.takeParenBlockStart("catch_all") { + let label = try labelIndex() + try parser.expect(.rightParen) + catches.append(.catchAll(labelIndex: label)) + } else if try parser.takeParenBlockStart("catch_all_ref") { + let label = try labelIndex() + try parser.expect(.rightParen) + catches.append(.catchAllRef(labelIndex: label)) + } else { + break + } + } + // Push the try_table's label AFTER parsing catch clauses, since catch clause + // labels are resolved from the enclosing scope (the try_table's own label + // is only in scope for the body instructions). + self.labelStack.push(label) + return (bt, TryCatch(catches: catches)) + } mutating func visitBrOnNull(wat: inout Wat) throws(WatParserError) -> UInt32 { return try labelIndex() } diff --git a/Sources/WAT/Parser/WastParser.swift b/Sources/WAT/Parser/WastParser.swift index 9640fda2..3fe2445f 100644 --- a/Sources/WAT/Parser/WastParser.swift +++ b/Sources/WAT/Parser/WastParser.swift @@ -232,6 +232,7 @@ public enum WastDirective { case assertReturn(execute: WastExecute, results: [WastExpectValue]) case assertTrap(execute: WastExecute, message: String) case assertExhaustion(call: WastInvoke, message: String) + case assertException(execute: WastExecute) case assertUnlinkable(module: Wat, message: String) case register(name: String, moduleId: String?) case invoke(WastInvoke) @@ -278,6 +279,11 @@ public enum WastDirective { let message = try wastParser.parser.expectString() try wastParser.parser.expect(.rightParen) return .assertExhaustion(call: call, message: message) + case "assert_exception": + try wastParser.parser.consume() + let execute = try wastParser.parens { wastParser throws(WatParserError) in try WastExecute.parse(wastParser: &wastParser) } + try wastParser.parser.expect(.rightParen) + return .assertException(execute: execute) case "assert_unlinkable": try wastParser.parser.consume() let features = wastParser.features diff --git a/Sources/WAT/Parser/WatParser.swift b/Sources/WAT/Parser/WatParser.swift index dea6dd4f..e9f4c575 100644 --- a/Sources/WAT/Parser/WatParser.swift +++ b/Sources/WAT/Parser/WatParser.swift @@ -28,11 +28,17 @@ struct WatParser { case imported(ImportNames) } + enum TagKind { + case definition + case imported(ImportNames) + } + enum ExternalKind { case function case table case memory case global + case tag } struct UnresolvedType { @@ -193,6 +199,20 @@ struct WatParser { } } + struct TagDecl: NamedFieldDecl, ImportableModuleFieldDecl { + var id: Name? + var exports: [String] + var typeUse: TypeUse + var kind: TagKind + + var importNames: WatParser.ImportNames? { + switch kind { + case .definition: return nil + case .imported(let importNames): return importNames + } + } + } + struct MemoryDecl: NamedFieldDecl, ImportableModuleFieldDecl { var id: Name? var exports: [String] @@ -218,6 +238,7 @@ struct WatParser { case table(TableDecl) case memory(MemoryDecl) case global(GlobalDecl) + case tag(TagDecl) case export(ExportDecl) case start(id: Parser.IndexOrId) case element(ElementDecl) @@ -252,6 +273,9 @@ struct WatParser { } else if try parser.takeParenBlockStart("global") { let id = try parser.takeId() kind = .global(GlobalDecl(id: id, exports: [], type: try globalType(), kind: .imported(importNames))) + } else if try parser.takeParenBlockStart("tag") { + let id = try parser.takeId() + kind = .tag(TagDecl(id: id, exports: [], typeUse: try typeUse(mayHaveName: false), kind: .imported(importNames))) } else { throw WatParserError("unexpected token", location: parser.lexer.location()) } @@ -379,6 +403,19 @@ struct WatParser { try parser.skipParenBlock() } kind = .global(GlobalDecl(id: id, exports: exports, type: type, kind: globalKind)) + case "tag": + let id = try parser.takeId() + let exports = try inlineExports() + let importNames = try inlineImport() + let tagTypeUse = try typeUse(mayHaveName: false) + let tagKind: TagKind + if let importNames { + tagKind = .imported(importNames) + } else { + tagKind = .definition + } + kind = .tag(TagDecl(id: id, exports: exports, typeUse: tagTypeUse, kind: tagKind)) + try parser.expect(.rightParen) case "export": let name = try parser.expectString() let decl: ExportDecl @@ -398,6 +435,10 @@ struct WatParser { let index = try parser.expectIndexOrId() try parser.expect(.rightParen) decl = ExportDecl(name: name, id: index, kind: .global) + } else if try parser.takeParenBlockStart("tag") { + let index = try parser.expectIndexOrId() + try parser.expect(.rightParen) + decl = ExportDecl(name: name, id: index, kind: .tag) } else { throw WatParserError("unexpected token", location: parser.lexer.location()) } @@ -727,6 +768,8 @@ struct WatParser { return UnresolvedType(.funcRef) } else if try parser.takeKeyword("externref") { return UnresolvedType(.externRef) + } else if try parser.takeKeyword("exnref") { + return UnresolvedType(.exnRef) } else if try parser.takeParenBlockStart("ref") { let isNullable = try parser.takeKeyword("null") let heapType = try heapType() @@ -745,6 +788,8 @@ struct WatParser { return UnresolvedType(.abstract(.funcRef)) } else if try parser.takeKeyword("extern") { return UnresolvedType(.abstract(.externRef)) + } else if try parser.takeKeyword("exn") { + return UnresolvedType(.abstract(.exnRef)) } else if let id = try parser.takeIndexOrId() { return UnresolvedType(make: { resolver in Result { () throws(WatParserError) in try .concrete(typeIndex: UInt32(resolver.resolveIndex(use: id))) } diff --git a/Sources/WAT/WAT.swift b/Sources/WAT/WAT.swift index 7e8a54d3..a8cb37ce 100644 --- a/Sources/WAT/WAT.swift +++ b/Sources/WAT/WAT.swift @@ -76,6 +76,7 @@ public struct Wat { let tables: [Table] let memories: NameMapping let globals: NameMapping + let tagsMap: NameMapping let elementsMap: NameMapping let data: NameMapping let start: FunctionIndex? @@ -94,6 +95,7 @@ public struct Wat { tables: [], memories: NameMapping(), globals: NameMapping(), + tagsMap: NameMapping(), elementsMap: NameMapping(), data: NameMapping(), start: nil, @@ -299,6 +301,7 @@ func parseWAT(_ parser: inout Parser, features: WasmFeatureSet) throws(WatParser var elementSegmentsMap = NameMapping() var dataSegmentsMap = NameMapping() var globalsMap = NameMapping() + var tagsMap = NameMapping() var start: Parser.IndexOrId? var exportDecls: [WatParser.ExportDecl] = [] @@ -387,6 +390,18 @@ func parseWAT(_ parser: inout Parser, features: WasmFeatureSet) throws(WatParser case .imported(let importNames): addImport(importNames) { () throws(WatParserError) in try .global(decl.type.resolve(typesMap)) } } + case .tag(let decl): + try checkImportOrder(decl.importNames) + let index = try tagsMap.add(decl) + addExports(decl.exports, index: index, kind: .tag) + switch decl.kind { + case .definition: break + case .imported(let importNames): + addImport(importNames) { () throws(WatParserError) in + let typeIndex = try typesMap.resolveIndex(use: decl.typeUse) + return .tag(TypeIndex(typeIndex)) + } + } case .element(let decl): try elementSegmentsMap.add(decl) case .export(let decl): @@ -420,6 +435,8 @@ func parseWAT(_ parser: inout Parser, features: WasmFeatureSet) throws(WatParser descriptor = try .memory(MemoryIndex(memoriesMap.resolveIndex(use: decl.id))) case .global: descriptor = try .global(GlobalIndex(globalsMap.resolveIndex(use: decl.id))) + case .tag: + descriptor = try .tag(TagIndex(tagsMap.resolveIndex(use: decl.id))) } return Export(name: decl.name, descriptor: descriptor) } @@ -438,6 +455,7 @@ func parseWAT(_ parser: inout Parser, features: WasmFeatureSet) throws(WatParser }, memories: memoriesMap, globals: globalsMap, + tagsMap: tagsMap, elementsMap: elementSegmentsMap, data: dataSegmentsMap, start: startIndex, diff --git a/Sources/WasmKit/CMakeLists.txt b/Sources/WasmKit/CMakeLists.txt index 79ddf906..2f1e4cc1 100644 --- a/Sources/WasmKit/CMakeLists.txt +++ b/Sources/WasmKit/CMakeLists.txt @@ -16,6 +16,7 @@ add_wasmkit_library(WasmKit Execution/AtomicParkingLot.swift Execution/DebuggerInstructionMapping.swift Execution/Instructions/Control.swift + Execution/Instructions/ExceptionHandling.swift Execution/Instructions/Instruction.swift Execution/Instructions/Table.swift Execution/Instructions/Memory.swift diff --git a/Sources/WasmKit/Execution/ComponentModel/ComponentLoader.swift b/Sources/WasmKit/Execution/ComponentModel/ComponentLoader.swift index 22b928e1..901747a9 100644 --- a/Sources/WasmKit/Execution/ComponentModel/ComponentLoader.swift +++ b/Sources/WasmKit/Execution/ComponentModel/ComponentLoader.swift @@ -804,6 +804,8 @@ internalExports[name] = .memory(memory.handle) case .global(let global): internalExports[name] = .global(global.handle) + case .tag(let tag): + internalExports[name] = .tag(tag.handle) } } diff --git a/Sources/WasmKit/Execution/ConstEvaluation.swift b/Sources/WasmKit/Execution/ConstEvaluation.swift index 88ffb9df..d8df0a68 100644 --- a/Sources/WasmKit/Execution/ConstEvaluation.swift +++ b/Sources/WasmKit/Execution/ConstEvaluation.swift @@ -65,6 +65,7 @@ extension ConstExpression { switch type { case .externRef: return .ref(.extern(nil)) case .funcRef: return .ref(.function(nil)) + case .exnRef: return .ref(.exception(nil)) default: throw WasmKitError(message: .illegalConstExpressionInstruction(constInst)) } @@ -94,6 +95,8 @@ extension WasmParser.ElementSegment { return .function(nil) case .refNull(.externRef): return .extern(nil) + case .refNull(.exnRef): + return .exception(nil) case .globalGet(let index): let value = try context.globalValue(index) switch value { diff --git a/Sources/WasmKit/Execution/Debugger.swift b/Sources/WasmKit/Execution/Debugger.swift index c4d80175..211317f0 100644 --- a/Sources/WasmKit/Execution/Debugger.swift +++ b/Sources/WasmKit/Execution/Debugger.swift @@ -490,6 +490,19 @@ mutating func predictNext_unreachable(operandPc: Pc, sp: Sp) -> [Pc] { [] } mutating func predictNext_endOfExecution(operandPc: Pc, sp: Sp) -> [Pc] { [] } mutating func predictNext_breakpoint(operandPc: Pc, sp: Sp) -> [Pc] { [] } + + // Exception-handling instructions — destination depends on which handler + // catches at runtime, so static prediction is not possible. + mutating func predictNext_throwTag(operandPc: Pc, sp: Sp) -> [Pc] { [] } + mutating func predictNext_throwRef(operandPc: Pc, sp: Sp) -> [Pc] { [] } + + // `catchHandlers` registers exception handlers and falls through to the + // immediately-following instruction. + mutating func predictNext_catchHandlers(operandPc: Pc, sp: Sp) -> [Pc] { + var pc = operandPc + _ = Instruction.CatchHandlersOperand.load(from: &pc) + return [pc] + } } #endif diff --git a/Sources/WasmKit/Execution/DispatchInstruction.swift b/Sources/WasmKit/Execution/DispatchInstruction.swift index 739d129f..af2168fa 100644 --- a/Sources/WasmKit/Execution/DispatchInstruction.swift +++ b/Sources/WasmKit/Execution/DispatchInstruction.swift @@ -283,6 +283,10 @@ extension Execution { case 267: return try self.execute_memoryAtomicWait64(sp: &sp, pc: &pc, md: &md, ms: &ms) case 268: return try self.execute_memoryAtomicNotify(sp: &sp, pc: &pc, md: &md, ms: &ms) case 269: return self.execute_atomicFence(sp: &sp, pc: &pc, md: &md, ms: &ms) + case 270: return try self.execute_throwTag(sp: &sp, pc: &pc, md: &md, ms: &ms) + case 271: return try self.execute_throwRef(sp: &sp, pc: &pc, md: &md, ms: &ms) + case 272: return self.execute_catchHandlers(sp: &sp, pc: &pc, md: &md, ms: &ms) + case 273: return self.execute_catchHandlersEnd(sp: &sp, pc: &pc, md: &md, ms: &ms) default: preconditionFailure("Unknown instruction!?") } @@ -2431,6 +2435,35 @@ extension Execution { pc.pointee = pc.pointee.advanced(by: 1) return next } + @_silgen_name("wasmkit_execute_throwTag") @inline(__always) + mutating func execute_throwTag(sp: UnsafeMutablePointer, pc: UnsafeMutablePointer, md: UnsafeMutablePointer, ms: UnsafeMutablePointer) throws -> CodeSlot { + let immediate = Instruction.ThrowTagOperand.load(from: &pc.pointee) + let next: CodeSlot + (pc.pointee, next) = try self.throwTag(sp: sp.pointee, pc: pc.pointee, immediate: immediate) + return next + } + @_silgen_name("wasmkit_execute_throwRef") @inline(__always) + mutating func execute_throwRef(sp: UnsafeMutablePointer, pc: UnsafeMutablePointer, md: UnsafeMutablePointer, ms: UnsafeMutablePointer) throws -> CodeSlot { + let immediate = Instruction.ThrowRefOperand.load(from: &pc.pointee) + let next: CodeSlot + (pc.pointee, next) = try self.throwRef(sp: sp.pointee, pc: pc.pointee, immediate: immediate) + return next + } + @_silgen_name("wasmkit_execute_catchHandlers") @inline(__always) + mutating func execute_catchHandlers(sp: UnsafeMutablePointer, pc: UnsafeMutablePointer, md: UnsafeMutablePointer, ms: UnsafeMutablePointer) -> CodeSlot { + let immediate = Instruction.CatchHandlersOperand.load(from: &pc.pointee) + let next: CodeSlot + (pc.pointee, next) = self.catchHandlers(sp: sp.pointee, pc: pc.pointee, immediate: immediate) + return next + } + @_silgen_name("wasmkit_execute_catchHandlersEnd") @inline(__always) + mutating func execute_catchHandlersEnd(sp: UnsafeMutablePointer, pc: UnsafeMutablePointer, md: UnsafeMutablePointer, ms: UnsafeMutablePointer) -> CodeSlot { + let immediate = Instruction.CatchHandlersEndOperand.load(from: &pc.pointee) + self.catchHandlersEnd(sp: sp.pointee, immediate: immediate) + let next = pc.pointee.pointee + pc.pointee = pc.pointee.advanced(by: 1) + return next + } } extension Instruction { diff --git a/Sources/WasmKit/Execution/Errors.swift b/Sources/WasmKit/Execution/Errors.swift index f7448e02..6478d3fc 100644 --- a/Sources/WasmKit/Execution/Errors.swift +++ b/Sources/WasmKit/Execution/Errors.swift @@ -56,6 +56,29 @@ public struct Trap: Error, CustomStringConvertible { } } +/// An uncaught WebAssembly exception that propagated out of a module. +public struct WasmKitException: Error, CustomStringConvertible { + /// The tag identity, stored as the bit pattern of the tag handle pointer. + /// Used only for equality comparison when matching catch clauses. + let tagIdentity: Int + /// The exception payload values. + let payload: [Value] + + init(tag: InternalTag, payload: [Value]) { + self.tagIdentity = tag.bitPattern + self.payload = payload + } + + public var description: String { + "wasm exception (payload: \(payload))" + } + + /// Returns true if this exception's tag matches the given tag handle. + func hasTag(_ tag: InternalTag) -> Bool { + tagIdentity == tag.bitPattern + } +} + /// A reason for a trap that occurred during execution of a WebAssembly module. package enum TrapReason: Error, CustomStringConvertible { package struct Message { @@ -177,6 +200,8 @@ extension ImportError.Message { expected = "memory" case .table: expected = "table" + case .tag: + expected = "tag" } let got: String switch entity { @@ -188,6 +213,8 @@ extension ImportError.Message { got = "memory" case .table: got = "table" + case .tag: + got = "tag" } return Self("incompatible import type for \(importEntry.module).\(importEntry.name), expected \(expected), got \(got)") } diff --git a/Sources/WasmKit/Execution/Execution.swift b/Sources/WasmKit/Execution/Execution.swift index bad23514..75be5576 100644 --- a/Sources/WasmKit/Execution/Execution.swift +++ b/Sources/WasmKit/Execution/Execution.swift @@ -15,6 +15,26 @@ struct Execution: ~Copyable { /// - Note: If the trap is set, it must be released manually. private var trap: (error: UnsafeRawPointer, sp: Sp)? = nil + /// The stack of active exception handlers for `try_table` blocks. + var exceptionHandlers: [ExceptionHandler] = [] + + /// Storage for caught exceptions that may be referenced via `exnref`. + var storedExceptions: [WasmKitException] = [] + + /// An active exception handler entry registered by a `try_table` block. + struct ExceptionHandler { + /// The tag to match, `nil` for `catch_all`/`catch_all_ref`. + let tag: InternalTag? + /// Whether this handler pushes an `exnref` (`catch_ref`/`catch_all_ref`). + let isRef: Bool + /// The `sp` to restore when this handler catches. + let sp: Sp + /// The `pc` to jump to when this handler catches. + let targetPC: Pc + /// The register offset where payload values should be written (relative to `sp`). + let payloadRegBase: VReg + } + #if WasmDebuggingSupport package init(store: StoreRef, stackEnd: UnsafeMutablePointer) { self.store = store @@ -489,37 +509,48 @@ extension Execution { #if os(WASI) fatalError("Direct threading is not supported on WASI") #else + var sp = sp var pc = pc - let handler = pc.read(wasmkit_tc_exec.self) - let storeValue = store.value + var md = md + var ms = ms let shouldUseMprotectTrapGuards = store.value.engine.configuration.memoryBoundsChecking == .mprotect - try withUnsafeMutablePointer(to: &self) { execution in - if shouldUseMprotectTrapGuards { - let trapped: Bool = { - let statePtr = UnsafeMutableRawPointer(execution) - var context = WasmKitDirectThreadedTrapGuardContext( - exec: handler, - sp: sp, - pc: pc, - md: md, - ms: ms, - state: statePtr - ) - return wasmkit_trap_guard_run(wasmkit_direct_threaded_trap_guard_entry, &context) - }() - if trapped { - throw Trap(.memoryOutOfBounds).withBacktrace(Self.captureBacktrace(sp: sp, store: storeValue)) + let storeValue = store.value + while true { + let handler = pc.read(wasmkit_tc_exec.self) + try withUnsafeMutablePointer(to: &self) { execution in + if shouldUseMprotectTrapGuards { + let trapped: Bool = { + let statePtr = UnsafeMutableRawPointer(execution) + var context = WasmKitDirectThreadedTrapGuardContext( + exec: handler, + sp: sp, + pc: pc, + md: md, + ms: ms, + state: statePtr + ) + return wasmkit_trap_guard_run(wasmkit_direct_threaded_trap_guard_entry, &context) + }() + if trapped { + throw Trap(.memoryOutOfBounds).withBacktrace(Self.captureBacktrace(sp: sp, store: storeValue)) + } + } else { + wasmkit_tc_start(handler, sp, pc, md, ms, execution) } - } else { - wasmkit_tc_start(handler, sp, pc, md, ms, execution) } - } - if let (rawError, trappingSp) = self.trap { + guard let (rawError, trappingSp) = self.trap else { return } let error = unsafeBitCast(rawError, to: Error.self) // Manually release the error object because the trap is caught in C and // held as a raw pointer. wasmkit_swift_errorRelease(rawError) + self.resetError() + if let exception = error as? WasmKitException { + if handleException(exception, sp: &sp, pc: &pc, md: &md, ms: &ms) { + continue + } + throw exception + } guard let trap = error as? Trap else { throw error } @@ -601,15 +632,23 @@ extension Execution { defer { stats.dump() } #endif var opcode = pc.read(OpcodeID.self) - do { - while true { - #if EngineStats - stats.track(inst) - #endif - opcode = try doExecute(opcode, sp: &sp, pc: &pc, md: &md, ms: &ms) + while true { + do { + while true { + #if EngineStats + stats.track(inst) + #endif + opcode = try doExecute(opcode, sp: &sp, pc: &pc, md: &md, ms: &ms) + } + } catch let exception as WasmKitException { + if handleException(exception, sp: &sp, pc: &pc, md: &md, ms: &ms) { + opcode = pc.read(OpcodeID.self) + continue + } + throw exception + } catch let trap as Trap { + throw trap.withBacktrace(Self.captureBacktrace(sp: sp, store: store.value)) } - } catch let trap as Trap { - throw trap.withBacktrace(Self.captureBacktrace(sp: sp, store: store.value)) } } diff --git a/Sources/WasmKit/Execution/Function.swift b/Sources/WasmKit/Execution/Function.swift index 3b37aac7..b41bc2c4 100644 --- a/Sources/WasmKit/Execution/Function.swift +++ b/Sources/WasmKit/Execution/Function.swift @@ -193,7 +193,8 @@ extension InternalFunction { for (expected, value) in zip(expectedTypes, values) { switch (expected, value) { case (.i32, .i32), (.i64, .i64), (.f32, .f32), (.f64, .f64), (.v128, .v128), - (.ref(.funcRef), .ref(.function)), (.ref(.externRef), .ref(.extern)): + (.ref(.funcRef), .ref(.function)), (.ref(.externRef), .ref(.extern)), + (.ref(.exnRef), .ref(.exception)): break default: return false } diff --git a/Sources/WasmKit/Execution/Instances.swift b/Sources/WasmKit/Execution/Instances.swift index 45c1ec42..17ad1a97 100644 --- a/Sources/WasmKit/Execution/Instances.swift +++ b/Sources/WasmKit/Execution/Instances.swift @@ -78,6 +78,7 @@ package struct InstanceEntity /* : ~Copyable */ { var tables: ImmutableArray var memories: ImmutableArray var globals: ImmutableArray + var tags: ImmutableArray var elementSegments: ImmutableArray var dataSegments: ImmutableArray var exports: [String: InternalExternalValue] @@ -95,6 +96,7 @@ package struct InstanceEntity /* : ~Copyable */ { tables: ImmutableArray(), memories: ImmutableArray(), globals: ImmutableArray(), + tags: ImmutableArray(), elementSegments: ImmutableArray(), dataSegments: ImmutableArray(), exports: [:], @@ -286,8 +288,10 @@ struct TableEntity /* : ~Copyable */ { emptyElement = .function(nil) case .abstract(.externRef): emptyElement = .extern(nil) + case .abstract(.exnRef): + emptyElement = .exception(nil) case .concrete: - throw Trap(.unimplemented(feature: "heap type other than `func` and `extern`")) + throw Trap(.unimplemented(feature: "heap type other than `func`, `extern`, and `exn`")) } let numberOfElements = Int(tableType.limits.min) @@ -920,6 +924,29 @@ public struct Global: Equatable { } } +/// A WebAssembly `tag` instance. +/// > Note: +/// +public struct Tag: Equatable { + let handle: InternalTag + let allocator: StoreAllocator + + init(handle: InternalTag, allocator: StoreAllocator) { + self.handle = handle + self.allocator = allocator + } + + /// Create a new WebAssembly `tag` instance. + /// + /// - Parameters: + /// - store: The store to allocate the tag instance in. + /// - type: The function type describing the tag's parameters. + public init(store: Store, type: FunctionType) { + let handle = store.allocator.allocate(tagType: type, engine: store.engine) + self.init(handle: handle, allocator: store.allocator) + } +} + /// > Note: /// struct ElementSegmentEntity { @@ -952,6 +979,20 @@ struct DataSegmentEntity { typealias InternalDataSegment = EntityHandle +/// > Note: +/// +struct TagEntity { + let type: InternedFuncType +} + +extension TagEntity: ValidatableEntity { + static func createOutOfBoundsError(index: Int, count: Int) -> WasmKitError { + WasmKitError(message: .indexOutOfBounds("tag", index, max: count)) + } +} + +typealias InternalTag = EntityHandle + /// > Note: /// public enum ExternalValue: Equatable { @@ -959,6 +1000,7 @@ public enum ExternalValue: Equatable { case table(Table) case memory(Memory) case global(Global) + case tag(Tag) init(handle: InternalExternalValue, store: Store) { switch handle { @@ -970,6 +1012,8 @@ public enum ExternalValue: Equatable { self = .memory(Memory(handle: memory, allocator: store.allocator)) case .global(let global): self = .global(Global(handle: global, allocator: store.allocator)) + case .tag(let tag): + self = .tag(Tag(handle: tag, allocator: store.allocator)) } } @@ -983,6 +1027,8 @@ public enum ExternalValue: Equatable { return (.memory(memory.handle), memory.allocator) case .global(let global): return (.global(global.handle), global.allocator) + case .tag(let tag): + return (.tag(tag.handle), tag.allocator) } } } @@ -992,4 +1038,5 @@ enum InternalExternalValue { case table(InternalTable) case memory(InternalMemory) case global(InternalGlobal) + case tag(InternalTag) } diff --git a/Sources/WasmKit/Execution/Instructions/ExceptionHandling.swift b/Sources/WasmKit/Execution/Instructions/ExceptionHandling.swift new file mode 100644 index 00000000..67d8c539 --- /dev/null +++ b/Sources/WasmKit/Execution/Instructions/ExceptionHandling.swift @@ -0,0 +1,133 @@ +/// > Note: +/// +extension Execution { + + /// Throw a new exception with the given tag. + /// + /// This instruction reads the tag's parameter values from the stack, + /// constructs a `WasmKitException`, and throws it as a Swift error. + @inline(never) + func throwTag(sp: Sp, pc: Pc, immediate: Instruction.ThrowTagOperand) throws -> (Pc, CodeSlot) { + let instance = currentInstance(sp: sp) + let tag = instance.tags[Int(immediate.tagIndex)] + let tagType = store.value.engine.resolveType(tag.type) + var payload: [Value] = [] + payload.reserveCapacity(tagType.parameters.count) + var slotOffset: VReg = 0 + for paramType in tagType.parameters { + let value = UntypedValue(storage: sp[i64: immediate.payloadBase + slotOffset]) + payload.append(value.cast(to: paramType)) + slotOffset += VReg(paramType.stackSlotCount) + } + throw WasmKitException(tag: tag, payload: payload) + } + + /// Rethrow an exception from an `exnref` value. + @inline(never) + func throwRef(sp: Sp, pc: Pc, immediate: Instruction.ThrowRefOperand) throws -> (Pc, CodeSlot) { + let ref = UntypedValue(storage: sp[i64: immediate.exnRef]) + if ref.isNullRef { + throw Trap(.message(.init("null exception reference"))) + } + let exception = getException(at: Int(ref.i64)) + throw exception + } + + /// Register exception handlers for a `try_table` block. + /// + /// `pc` points past the `catchHandlers` instruction at this point. + /// The `pcOffset` in each `CatchTableEntry` is relative to this `pc`. + mutating func catchHandlers(sp: Sp, pc: Pc, immediate: Instruction.CatchHandlersOperand) -> (Pc, CodeSlot) { + for i in 0.. Bool { + // Search from the top of the handler stack (most recently registered) + while let handler = exceptionHandlers.last { + exceptionHandlers.removeLast() + + let isMatch: Bool + if let handlerTag = handler.tag { + // catch / catch_ref: match by tag identity + isMatch = exception.hasTag(handlerTag) + } else { + // catch_all / catch_all_ref: always match + isMatch = true + } + + guard isMatch else { continue } + + // Unwind call stack to the handler's frame + sp = handler.sp + pc = handler.targetPC + + // Update memory cache for the restored instance + let restoredInstance = currentInstance(sp: sp) + CurrentMemory.mayUpdateCurrentInstance( + instance: restoredInstance, + from: nil, + md: &md, ms: &ms + ) + + // Write exception payload to the handler's target stack slots + if let handlerTag = handler.tag { + let tagType = store.value.engine.resolveType(handlerTag.type) + var slotOffset: VReg = 0 + for (i, paramType) in tagType.parameters.enumerated() { + sp[i64: handler.payloadRegBase + slotOffset] = UntypedValue(exception.payload[i]).storage + slotOffset += VReg(paramType.stackSlotCount) + } + // For catch_ref, also write the exnref after the payload + if handler.isRef { + let exnAddr = storeException(exception) + sp[i64: handler.payloadRegBase + slotOffset] = UntypedValue(.ref(.exception(exnAddr))).storage + } + } else if handler.isRef { + // catch_all_ref: write exnref at the base + let exnAddr = storeException(exception) + sp[i64: handler.payloadRegBase] = UntypedValue(.ref(.exception(exnAddr))).storage + } + // catch_all without ref: nothing to write + + return true + } + return false + } + + /// Store an exception and return its address for use as an `exnref`. + private mutating func storeException(_ exception: WasmKitException) -> ExceptionAddress { + let addr = storedExceptions.count + storedExceptions.append(exception) + return addr + } + + /// Get a stored exception by its address. + func getException(at address: Int) -> WasmKitException { + return storedExceptions[address] + } +} diff --git a/Sources/WasmKit/Execution/Instructions/Instruction.swift b/Sources/WasmKit/Execution/Instructions/Instruction.swift index 87d431ea..1a9d2c68 100644 --- a/Sources/WasmKit/Execution/Instructions/Instruction.swift +++ b/Sources/WasmKit/Execution/Instructions/Instruction.swift @@ -557,6 +557,14 @@ enum Instruction: Equatable { case memoryAtomicNotify(Instruction.AtomicNotifyOperand) /// WebAssembly Core Instruction `atomic.fence` case atomicFence + /// WebAssembly Exception Handling `throw` + case throwTag(Instruction.ThrowTagOperand) + /// WebAssembly Exception Handling `throw_ref` + case throwRef(Instruction.ThrowRefOperand) + /// Register exception handlers for a `try_table` block + case catchHandlers(Instruction.CatchHandlersOperand) + /// Unregister exception handlers for a `try_table` block + case catchHandlersEnd(Instruction.CatchHandlersEndOperand) } extension Instruction { @@ -1144,6 +1152,54 @@ extension Instruction { emitSlot { unsafeBitCast(($0.pointer, $0.count, $0.result, 0, 0) as (VReg, VReg, VReg, UInt8, UInt8), to: CodeSlot.self) } } } + + struct ThrowTagOperand: Equatable, InstructionImmediate { + var tagIndex: UInt32 + var payloadBase: VReg + @inline(__always) static func load(from pc: inout Pc) -> Self { + let (tagIndex, payloadBase, _, _) = pc.read((UInt32, VReg, UInt8, UInt8).self) + return Self(tagIndex: tagIndex, payloadBase: payloadBase) + } + @inline(__always) static func emit(to emitSlot: ((Self) -> CodeSlot) -> Void) { + emitSlot { unsafeBitCast(($0.tagIndex, $0.payloadBase, 0, 0) as (UInt32, VReg, UInt8, UInt8), to: CodeSlot.self) } + } + } + + struct ThrowRefOperand: Equatable, InstructionImmediate { + var exnRef: VReg + @inline(__always) static func load(from pc: inout Pc) -> Self { + let (exnRef, _, _, _, _, _, _) = pc.read((VReg, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8).self) + return Self(exnRef: exnRef) + } + @inline(__always) static func emit(to emitSlot: ((Self) -> CodeSlot) -> Void) { + emitSlot { unsafeBitCast(($0.exnRef, 0, 0, 0, 0, 0, 0) as (VReg, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8), to: CodeSlot.self) } + } + } + + struct CatchHandlersOperand: Equatable, InstructionImmediate { + var rawBaseAddress: UInt64 + var count: UInt16 + @inline(__always) static func load(from pc: inout Pc) -> Self { + let (rawBaseAddress) = pc.read((UInt64).self) + let (count, _, _, _, _, _, _) = pc.read((UInt16, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8).self) + return Self(rawBaseAddress: rawBaseAddress, count: count) + } + @inline(__always) static func emit(to emitSlot: ((Self) -> CodeSlot) -> Void) { + emitSlot { $0.rawBaseAddress } + emitSlot { unsafeBitCast(($0.count, 0, 0, 0, 0, 0, 0) as (UInt16, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8), to: CodeSlot.self) } + } + } + + struct CatchHandlersEndOperand: Equatable, InstructionImmediate { + var count: UInt16 + @inline(__always) static func load(from pc: inout Pc) -> Self { + let (count, _, _, _, _, _, _) = pc.read((UInt16, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8).self) + return Self(count: count) + } + @inline(__always) static func emit(to emitSlot: ((Self) -> CodeSlot) -> Void) { + emitSlot { unsafeBitCast(($0.count, 0, 0, 0, 0, 0, 0) as (UInt16, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8), to: CodeSlot.self) } + } + } } extension Instruction { @@ -1413,6 +1469,10 @@ extension Instruction { case .memoryAtomicWait32(let immediate): return immediate case .memoryAtomicWait64(let immediate): return immediate case .memoryAtomicNotify(let immediate): return immediate + case .throwTag(let immediate): return immediate + case .throwRef(let immediate): return immediate + case .catchHandlers(let immediate): return immediate + case .catchHandlersEnd(let immediate): return immediate default: return nil } } @@ -1693,6 +1753,10 @@ extension Instruction { case .memoryAtomicWait64: return 267 case .memoryAtomicNotify: return 268 case .atomicFence: return 269 + case .throwTag: return 270 + case .throwRef: return 271 + case .catchHandlers: return 272 + case .catchHandlersEnd: return 273 } } } @@ -1974,6 +2038,10 @@ extension Instruction { case 267: return .memoryAtomicWait64(Instruction.AtomicWaitOperand.load(from: &pc)) case 268: return .memoryAtomicNotify(Instruction.AtomicNotifyOperand.load(from: &pc)) case 269: return .atomicFence + case 270: return .throwTag(Instruction.ThrowTagOperand.load(from: &pc)) + case 271: return .throwRef(Instruction.ThrowRefOperand.load(from: &pc)) + case 272: return .catchHandlers(Instruction.CatchHandlersOperand.load(from: &pc)) + case 273: return .catchHandlersEnd(Instruction.CatchHandlersEndOperand.load(from: &pc)) default: fatalError("Unknown instruction opcode: \(opcode)") } } @@ -2258,6 +2326,10 @@ extension Instruction { case 267: return "memoryAtomicWait64" case 268: return "memoryAtomicNotify" case 269: return "atomicFence" + case 270: return "throwTag" + case 271: return "throwRef" + case 272: return "catchHandlers" + case 273: return "catchHandlersEnd" default: fatalError("Unknown instruction index: \(opcode)") } } @@ -2286,6 +2358,9 @@ protocol NextInstructionPredictor: ~Copyable { mutating func predictNext__return(operandPc: Pc, sp: Sp) -> [Pc] mutating func predictNext_endOfExecution(operandPc: Pc, sp: Sp) -> [Pc] mutating func predictNext_breakpoint(operandPc: Pc, sp: Sp) -> [Pc] + mutating func predictNext_throwTag(operandPc: Pc, sp: Sp) -> [Pc] + mutating func predictNext_throwRef(operandPc: Pc, sp: Sp) -> [Pc] + mutating func predictNext_catchHandlers(operandPc: Pc, sp: Sp) -> [Pc] } extension Instruction { @@ -2310,6 +2385,9 @@ extension Instruction { case 16: return predictor.predictNext__return(operandPc: operandPc, sp: sp) case 17: return predictor.predictNext_endOfExecution(operandPc: operandPc, sp: sp) case 202: return predictor.predictNext_breakpoint(operandPc: operandPc, sp: sp) + case 270: return predictor.predictNext_throwTag(operandPc: operandPc, sp: sp) + case 271: return predictor.predictNext_throwRef(operandPc: operandPc, sp: sp) + case 272: return predictor.predictNext_catchHandlers(operandPc: operandPc, sp: sp) default: return nil } } @@ -2378,6 +2456,18 @@ extension Instruction { let inst = Instruction.breakpoint map[inst.headSlot(threadingModel: threadingModel)] = inst.opcodeID } + do { + let inst = Instruction.throwTag(.init(tagIndex: UInt32(0), payloadBase: VReg(0))) + map[inst.headSlot(threadingModel: threadingModel)] = inst.opcodeID + } + do { + let inst = Instruction.throwRef(.init(exnRef: VReg(0))) + map[inst.headSlot(threadingModel: threadingModel)] = inst.opcodeID + } + do { + let inst = Instruction.catchHandlers(.init(rawBaseAddress: UInt64(0), count: UInt16(0))) + map[inst.headSlot(threadingModel: threadingModel)] = inst.opcodeID + } return map } } diff --git a/Sources/WasmKit/Execution/Instructions/InstructionSupport.swift b/Sources/WasmKit/Execution/Instructions/InstructionSupport.swift index 7830463a..6bca9a67 100644 --- a/Sources/WasmKit/Execution/Instructions/InstructionSupport.swift +++ b/Sources/WasmKit/Execution/Instructions/InstructionSupport.swift @@ -136,6 +136,60 @@ extension Instruction.BrTableOperand { } } +/// An entry in the catch table for a `try_table` block. +/// +/// A Wasm `try_table` instruction declares inline catch clauses (`catch`, `catch_ref`, +/// `catch_all`, `catch_all_ref`). During translation, the translator compiles these clauses +/// into an array of `CatchTableEntry` values — the "catch table" — which is the runtime +/// representation used for exception dispatch. +/// +/// The pipeline: +/// 1. **Parse**: `try_table` is decoded into a `TryCatch` with an array of `CatchClause` values. +/// 2. **Translate** (`visitTryTable`): Allocates a `CatchTableEntry` array, resolves tags to +/// `InternalTag` handles, computes `payloadRegBase`, and schedules `pcOffset` fixups for +/// when target labels are pinned. Catch clause label depths are resolved relative to the +/// *enclosing* scope (the `try_table`'s own label is not yet in scope), so clauses are +/// processed before pushing the `try_table` control frame. +/// 3. **Execute**: The `catchHandlers` instruction registers entries as `ExceptionHandler` +/// values on a handler stack. On `throw`, `handleException` walks the stack top-down to +/// find a matching handler (by tag identity, or `catch_all`), unwinds `sp`, writes the +/// exception payload into the target registers, and jumps to the handler `pc`. +/// `catchHandlersEnd` pops handlers when control exits the `try_table` normally or via branch. +struct CatchTableEntry { + /// The tag to match, as a raw `InternalTag` bit pattern. `0` for `catch_all`/`catch_all_ref`. + var rawTag: UInt64 + /// Non-zero if this is a `catch_all` or `catch_all_ref` clause. + var isCatchAll: UInt8 + /// Non-zero if this is a `catch_ref` or `catch_all_ref` clause (pushes `exnref`). + var isRef: UInt8 + /// `pc` offset from the `catchHandlers` instruction to the handler's target. + var pcOffset: Int32 + /// Register offset where payload values should be written (relative to `sp`). + var payloadRegBase: VReg + + init(tag: InternalTag?, isRef: Bool, pcOffset: Int32, payloadRegBase: VReg) { + self.rawTag = tag.map { UInt64(UInt(bitPattern: $0.bitPattern)) } ?? 0 + self.isCatchAll = tag == nil ? 1 : 0 + self.isRef = isRef ? 1 : 0 + self.pcOffset = pcOffset + self.payloadRegBase = payloadRegBase + } + + var tag: InternalTag? { + isCatchAll != 0 ? nil : InternalTag(bitPattern: UInt(rawTag)) + } +} + +extension Instruction.CatchHandlersOperand { + init(baseAddress: UnsafePointer, count: UInt16) { + self.init(rawBaseAddress: UInt64(UInt(bitPattern: baseAddress)), count: count) + } + + var baseAddress: UnsafePointer { + UnsafePointer(bitPattern: UInt(rawBaseAddress)).unsafelyUnwrapped + } +} + extension Instruction.CallOperand { init(callee: InternalFunction, spAddend: VReg) { self.init(rawCallee: UInt64(UInt(bitPattern: callee.bitPattern)), spAddend: spAddend) diff --git a/Sources/WasmKit/Execution/Instructions/Misc.swift b/Sources/WasmKit/Execution/Instructions/Misc.swift index a1f12a1b..e8310fe8 100644 --- a/Sources/WasmKit/Execution/Instructions/Misc.swift +++ b/Sources/WasmKit/Execution/Instructions/Misc.swift @@ -43,6 +43,8 @@ extension Execution { value = .ref(.extern(nil)) case .funcRef: value = .ref(.function(nil)) + case .exnRef: + value = .ref(.exception(nil)) } sp[immediate.result] = UntypedValue(value) } diff --git a/Sources/WasmKit/Execution/StoreAllocator.swift b/Sources/WasmKit/Execution/StoreAllocator.swift index 5d1d36ab..eda7dd26 100644 --- a/Sources/WasmKit/Execution/StoreAllocator.swift +++ b/Sources/WasmKit/Execution/StoreAllocator.swift @@ -212,6 +212,7 @@ class StoreAllocator { private var tables: BumpAllocator private var memories: BumpAllocator private var globals: BumpAllocator + private var tags: BumpAllocator private var elements: BumpAllocator private var datas: BumpAllocator private var codes: BumpAllocator @@ -234,6 +235,7 @@ class StoreAllocator { tables = BumpAllocator(initialCapacity: 2) memories = BumpAllocator(initialCapacity: 2) globals = BumpAllocator(initialCapacity: 256) + tags = BumpAllocator(initialCapacity: 2) elements = BumpAllocator(initialCapacity: 2) datas = BumpAllocator(initialCapacity: 64) arrayAllocator = ImmutableArrayAllocator() @@ -271,6 +273,7 @@ extension StoreAllocator { var importedTables: [InternalTable] = [] var importedMemories: [InternalMemory] = [] var importedGlobals: [InternalGlobal] = [] + var importedTags: [InternalTag] = [] // External values imported in this module should be included in corresponding index spaces before definitions // local to to the module are added. @@ -332,6 +335,16 @@ extension StoreAllocator { } importedGlobals.append(global) + case (.tag(let typeIndex), .tag(let tag)): + guard typeIndex < module.types.count else { + throw WasmKitError(message: .indexOutOfBounds("type", typeIndex, max: module.types.count)) + } + let expected = module.types[Int(typeIndex)] + guard engine.internType(expected) == tag.type else { + throw ImportError(.incompatibleFunctionType(importEntry, actual: engine.resolveType(tag.type), expected: expected)) + } + importedTags.append(tag) + default: throw ImportError(.incompatibleType(importEntry, entity: external)) } @@ -411,6 +424,16 @@ extension StoreAllocator { } ) + // Allocate tags. + let tags = try allocateEntities( + imports: importedTags, + internals: module.tagTypes[module.moduleImports.numberOfTags...], + allocateHandle: { typeIndex, _ in + let funcType = try Module.resolveType(typeIndex, typeSection: module.types) + return allocate(tagType: funcType, engine: engine) + } + ) + // Step 6. let elements = try ImmutableArray(allocator: arrayAllocator, count: module.elements.count) { buffer in for (index, element) in module.elements.enumerated() { @@ -458,6 +481,9 @@ extension StoreAllocator { case .global(let index): let handle = try globals[validating: Int(index)] return .global(handle) + case .tag(let index): + let handle = try tags[validating: Int(index)] + return .tag(handle) } } @@ -475,6 +501,7 @@ extension StoreAllocator { tables: tables, memories: memories, globals: globals, + tags: tags, elementSegments: elements, dataSegments: dataSegments, exports: exports, @@ -542,6 +569,13 @@ extension StoreAllocator { return InternalGlobal(unsafe: pointer) } + /// > Note: + /// + func allocate(tagType: FunctionType, engine: Engine) -> InternalTag { + let pointer = tags.allocate(initializing: TagEntity(type: engine.internType(tagType))) + return InternalTag(unsafe: pointer) + } + /// > Note: /// private func allocate(elementType: ReferenceType, references: [Reference]) -> InternalElementSegment { @@ -584,6 +618,7 @@ extension StoreAllocator { tables: ImmutableArray(), memories: ImmutableArray(), globals: ImmutableArray(), + tags: ImmutableArray(), elementSegments: ImmutableArray(), dataSegments: ImmutableArray(), exports: exports, diff --git a/Sources/WasmKit/Execution/UntypedValue.swift b/Sources/WasmKit/Execution/UntypedValue.swift index 8f622d6b..f32bc8c8 100644 --- a/Sources/WasmKit/Execution/UntypedValue.swift +++ b/Sources/WasmKit/Execution/UntypedValue.swift @@ -76,7 +76,7 @@ struct UntypedValue: Equatable, Hashable { case .v128: assertionFailure("v128 cannot be represented in UntypedValue; use stack-slot based storage") storage = 0 - case .ref(.function(let value)), .ref(.extern(let value)): + case .ref(.function(let value)), .ref(.extern(let value)), .ref(.exception(let value)): storage = encodeOptionalInt(value) } } @@ -122,8 +122,10 @@ struct UntypedValue: Equatable, Hashable { return .function(decodeOptionalInt()) case .abstract(.externRef): return .extern(decodeOptionalInt()) + case .abstract(.exnRef): + return .exception(decodeOptionalInt()) case .concrete: - fatalError("heap type other than `func` and `extern` is not implemented yet") + fatalError("heap type other than `func`, `extern`, and `exn` is not implemented yet") } } diff --git a/Sources/WasmKit/Imports.swift b/Sources/WasmKit/Imports.swift index aa14ca84..cfae6207 100644 --- a/Sources/WasmKit/Imports.swift +++ b/Sources/WasmKit/Imports.swift @@ -77,6 +77,10 @@ extension Function: ExternalValueConvertible { public var externalValue: ExternalValue { .function(self) } } +extension Tag: ExternalValueConvertible { + public var externalValue: ExternalValue { .tag(self) } +} + extension Imports: ExpressibleByDictionaryLiteral { public typealias Key = String public struct Value: ExpressibleByDictionaryLiteral { diff --git a/Sources/WasmKit/Module.swift b/Sources/WasmKit/Module.swift index 64ab670f..d8876f75 100644 --- a/Sources/WasmKit/Module.swift +++ b/Sources/WasmKit/Module.swift @@ -5,18 +5,21 @@ struct ModuleImports { let numberOfGlobals: Int let numberOfMemories: Int let numberOfTables: Int + let numberOfTags: Int static func build( from imports: [Import], functionTypeIndices: inout [TypeIndex], globalTypes: inout [GlobalType], memoryTypes: inout [MemoryType], - tableTypes: inout [TableType] + tableTypes: inout [TableType], + tagTypes: inout [TypeIndex] ) -> ModuleImports { var numberOfFunctions: Int = 0 var numberOfGlobals: Int = 0 var numberOfMemories: Int = 0 var numberOfTables: Int = 0 + var numberOfTags: Int = 0 for item in imports { switch item.descriptor { case .function(let typeIndex): @@ -31,13 +34,17 @@ struct ModuleImports { case .global(let globalType): numberOfGlobals += 1 globalTypes.append(globalType) + case .tag(let typeIndex): + numberOfTags += 1 + tagTypes.append(typeIndex) } } return ModuleImports( numberOfFunctions: numberOfFunctions, numberOfGlobals: numberOfGlobals, numberOfMemories: numberOfMemories, - numberOfTables: numberOfTables + numberOfTables: numberOfTables, + numberOfTags: numberOfTags ) } } @@ -52,6 +59,7 @@ public struct Module { let data: [DataSegment] let start: FunctionIndex? let globals: [WasmParser.Global] + let tags: [WasmParser.Tag] public let imports: [Import] public let exports: [Export] public let customSections: [CustomSection] @@ -61,6 +69,7 @@ public struct Module { let importedFunctionTypes: [TypeIndex] let memoryTypes: [MemoryType] let tableTypes: [TableType] + let tagTypes: [TypeIndex] let features: WasmFeatureSet let dataCount: UInt32? @@ -75,6 +84,7 @@ public struct Module { globals: [WasmParser.Global], memories: [MemoryType], tables: [TableType], + tags: [WasmParser.Tag] = [], customSections: [CustomSection], features: WasmFeatureSet, dataCount: UInt32? @@ -86,6 +96,7 @@ public struct Module { self.imports = imports self.exports = exports self.globals = globals + self.tags = tags self.customSections = customSections self.features = features self.dataCount = dataCount @@ -94,18 +105,21 @@ public struct Module { var globalTypes: [GlobalType] = [] var memoryTypes: [MemoryType] = [] var tableTypes: [TableType] = [] + var tagTypes: [TypeIndex] = [] self.moduleImports = ModuleImports.build( from: imports, functionTypeIndices: &importedFunctionTypes, globalTypes: &globalTypes, memoryTypes: &memoryTypes, - tableTypes: &tableTypes + tableTypes: &tableTypes, + tagTypes: &tagTypes ) self.types = types self.importedFunctionTypes = importedFunctionTypes self.memoryTypes = memoryTypes + memories self.tableTypes = tableTypes + tables + self.tagTypes = tagTypes + tags.map(\.type) } static func resolveType(_ index: TypeIndex, typeSection: [FunctionType]) throws(WasmKitError) -> FunctionType { diff --git a/Sources/WasmKit/ModuleParser.swift b/Sources/WasmKit/ModuleParser.swift index 035ae2d6..310cfe17 100644 --- a/Sources/WasmKit/ModuleParser.swift +++ b/Sources/WasmKit/ModuleParser.swift @@ -48,6 +48,7 @@ func parseModule(stream: Stream, features: WasmFeatureSet = var tables: [TableType] = [] var memories: [MemoryType] = [] var globals: [WasmParser.Global] = [] + var tags: [WasmParser.Tag] = [] var elements: [ElementSegment] = [] var data: [DataSegment] = [] var start: FunctionIndex? @@ -77,6 +78,8 @@ func parseModule(stream: Stream, features: WasmFeatureSet = memories = memorySection.map(\.type) case .globalSection(let globalSection): globals = globalSection + case .tagSection(let tagSection): + tags = tagSection case .exportSection(let exportSection): exports = exportSection case .startSection(let functionIndex): @@ -135,6 +138,7 @@ func parseModule(stream: Stream, features: WasmFeatureSet = globals: globals, memories: memories, tables: tables, + tags: tags, customSections: customSections, features: features, dataCount: dataCount diff --git a/Sources/WasmKit/Translator.swift b/Sources/WasmKit/Translator.swift index 5308be66..7267c379 100644 --- a/Sources/WasmKit/Translator.swift +++ b/Sources/WasmKit/Translator.swift @@ -12,6 +12,13 @@ class ISeqAllocator { return buffer } + func allocateCatchTable(capacity: Int) -> UnsafeMutableBufferPointer { + assert(_isPOD(CatchTableEntry.self), "CatchTableEntry must be POD") + let buffer = UnsafeMutableBufferPointer.allocate(capacity: capacity) + self.buffers.append(UnsafeMutableRawBufferPointer(buffer)) + return buffer + } + func allocateConstants(_ slots: [UntypedValue]) -> UnsafeBufferPointer { let buffer = UnsafeMutableBufferPointer.allocate(capacity: slots.count) _ = buffer.initialize(fromContentsOf: slots) @@ -351,6 +358,7 @@ struct InstructionTranslator: InstructionVisitor { case block(root: Bool) case loop case `if`(elseLabel: LabelRef, endLabel: LabelRef, isElse: Bool) + case tryTable(catchCount: UInt16) static var block: Kind { .block(root: false) } } @@ -366,7 +374,7 @@ struct InstructionTranslator: InstructionVisitor { var copyTypes: [ValueType] { switch self.kind { - case .block, .if: + case .block, .if, .tryTable: return blockType.results case .loop: return blockType.parameters @@ -417,6 +425,19 @@ struct InstructionTranslator: InstructionVisitor { } return frames[index] } + + /// Count the total number of catch handlers that would be exited when + /// branching to the given relative depth. + func catchHandlersToUnwind(relativeDepth: UInt32) -> UInt16 { + var count: UInt16 = 0 + let targetIndex = frames.count - 1 - Int(relativeDepth) + for i in (targetIndex.. (WasmKit.Instruction) typealias BrTableEntryFactory = (ISeqBuilder, MetaProgramCounter) -> Instruction.BrTableOperand.Entry typealias BuildingBrTable = UnsafeMutableBufferPointer + typealias BuildingCatchTable = UnsafeMutableBufferPointer enum OnPinAction { case emitInstruction( @@ -620,6 +642,12 @@ struct InstructionTranslator: InstructionVisitor { buildingTable: BuildingBrTable, index: Int, make: BrTableEntryFactory ) + case fillCatchTableEntry( + buildingTable: BuildingCatchTable, + index: Int, + /// The position of the `catchHandlers` instruction (used to compute relative offset) + catchHandlersPC: MetaProgramCounter + ) } struct LabelUser: CustomStringConvertible { let action: OnPinAction @@ -761,6 +789,9 @@ struct InstructionTranslator: InstructionVisitor { assign(at: insertAt.offsetFromHead, make(self, source, pc)) case .fillBrTableEntry(let brTable, let index, let make): brTable[index] = make(self, pc) + case .fillCatchTableEntry(let catchTable, let index, let catchHandlersPC): + // pcOffset is relative to the PC position after the catchHandlers instruction + catchTable[index].pcOffset = Int32(pc.offsetFromHead - catchHandlersPC.offsetFromHead) } } } @@ -841,6 +872,27 @@ struct InstructionTranslator: InstructionVisitor { self.labels[ref] = .unpinned(users: users) } } + + /// Schedule to fill a catch table entry with the resolved label position. + mutating func fillCatchTableEntry( + _ ref: LabelRef, + table: BuildingCatchTable, + index: Int, + catchHandlersPC: MetaProgramCounter, + line: UInt = #line + ) { + switch self.labels[ref] { + case .pinned(let pc): + table[index].pcOffset = Int32(pc.offsetFromHead - catchHandlersPC.offsetFromHead) + case .unpinned(var users): + users.append( + LabelUser( + action: .fillCatchTableEntry(buildingTable: table, index: index, catchHandlersPC: catchHandlersPC), + sourceLine: line + )) + self.labels[ref] = .unpinned(users: users) + } + } } struct Locals { @@ -1187,6 +1239,13 @@ struct InstructionTranslator: InstructionVisitor { // Emit `onExit` instruction before every `return` instruction emit(.onExit(functionIndex)) } + // Clean up all exception handlers before returning from the function + let handlersToUnwind = controlStack.catchHandlersToUnwind( + relativeDepth: UInt32(controlStack.numberOfFrames - 1) + ) + if handlersToUnwind > 0 { + emit(.catchHandlersEnd(Instruction.CatchHandlersEndOperand(count: handlersToUnwind))) + } try visitReturnLike() self.updateInstructionMapping() iseqBuilder.emit(._return) @@ -1412,6 +1471,9 @@ struct InstructionTranslator: InstructionVisitor { case .loop: break case .if: try iseqBuilder.pinLabelHere(toBePopped.continuation) + case .tryTable(let catchCount): + emit(.catchHandlersEnd(Instruction.CatchHandlersEndOperand(count: catchCount))) + try iseqBuilder.pinLabelHere(toBePopped.continuation) } for result in toBePopped.blockType.results.reversed() { guard try checkBeforePop(typeHint: result, controlFrame: toBePopped) else { continue } @@ -1468,6 +1530,15 @@ struct InstructionTranslator: InstructionVisitor { return make(Int32(relativeOffset), UInt32(copyCount), popCount) } } + /// Emit `catchHandlersEnd` instructions for any `try_table` blocks that + /// would be exited by branching to the given relative depth. + private mutating func emitCatchHandlersUnwind(relativeDepth: UInt32) { + let count = controlStack.catchHandlersToUnwind(relativeDepth: relativeDepth) + if count > 0 { + emit(.catchHandlersEnd(Instruction.CatchHandlersEndOperand(count: count))) + } + } + mutating func visitBr(relativeDepth: UInt32) throws(WasmKitError) -> Output { let frame = try controlStack.branchTarget(relativeDepth: relativeDepth) @@ -1480,6 +1551,7 @@ struct InstructionTranslator: InstructionVisitor { // +---[ i32 ]<--+ copy [2] // [ i64 ]---+ try copyOnBranch(targetFrame: frame) + emitCatchHandlersUnwind(relativeDepth: relativeDepth) try emitBranch(Instruction.br, relativeDepth: relativeDepth) { offset, copyCount, popCount in return offset } @@ -1492,10 +1564,12 @@ struct InstructionTranslator: InstructionVisitor { mutating func visitBrIf(relativeDepth: UInt32) throws(WasmKitError) -> Output { let frame = try controlStack.branchTarget(relativeDepth: relativeDepth) let condition = try popVRegOperand(.i32) + let handlersToUnwind = controlStack.catchHandlersToUnwind(relativeDepth: relativeDepth) - if frame.copySlotCount == 0 { + if frame.copySlotCount == 0 && handlersToUnwind == 0 { guard let condition else { return } // Optimization where we don't need copying values when the branch taken + // and no exception handlers need unwinding. self.updateInstructionMapping() iseqBuilder.emitWithLabel(Instruction.brIf, frame.continuation) { _, selfPC, continuation in let relativeOffset = continuation.offsetFromHead - selfPC.offsetFromHead @@ -1508,26 +1582,9 @@ struct InstructionTranslator: InstructionVisitor { preserveOnStack(depth: valueStack.valueHeight - frame.valueStackHeight) if let condition { - // If branch taken, fallthrough to landing pad, copy stack values - // then branch to the actual place - // If branch not taken, branch to the next of the landing pad - // - // (block (result i32) - // (i32.const 42) - // (i32.const 24) - // (local.get 0) - // (br_if 0) ------+ - // (local.get 1) | - // ) <-------+ - // - // [0x00] (i32.const 42 reg:0) - // [0x01] (i32.const 24 reg:1) - // [0x02] (local.get 0 result=reg:2) - // [0x03] (br_if_z offset=+0x3 cond=reg:2) --+ - // [0x04] (stack.copy reg:1 -> reg:0) | - // [0x05] (br offset=+0x2) --------+ | - // [0x06] (local.get 1 reg:2) <----|---------+ - // [0x07] ... <-------+ + // If branch taken, fallthrough to landing pad, copy stack values, + // clean up exception handlers, then branch to the actual place. + // If branch not taken, branch to the next of the landing pad. let onBranchNotTaken = iseqBuilder.allocLabel() self.updateInstructionMapping() iseqBuilder.emitWithLabel(Instruction.brIfNot, onBranchNotTaken) { _, conditionCheckAt, continuation in @@ -1535,6 +1592,9 @@ struct InstructionTranslator: InstructionVisitor { return Instruction.BrIfOperand(condition: LVReg(condition), offset: Int32(relativeOffset)) } try copyOnBranch(targetFrame: frame) + if handlersToUnwind > 0 { + emit(.catchHandlersEnd(Instruction.CatchHandlersEndOperand(count: handlersToUnwind))) + } self.updateInstructionMapping() try emitBranch(Instruction.br, relativeDepth: relativeDepth) { offset, copyCount, popCount in return offset @@ -1610,6 +1670,8 @@ struct InstructionTranslator: InstructionVisitor { } try checkStackTop(frame.copyTypes) + let handlersToUnwind = controlStack.catchHandlersToUnwind(relativeDepth: labelIndex) + do { let relativeOffset = iseqBuilder.insertingPC.offsetFromHead - brTableAt.offsetFromHead tableBuffer[entryIndex] = Instruction.BrTableOperand.Entry( @@ -1617,14 +1679,18 @@ struct InstructionTranslator: InstructionVisitor { ) } let emittedCopy = try copyOnBranch(targetFrame: frame) - if emittedCopy { + if emittedCopy || handlersToUnwind > 0 { + if handlersToUnwind > 0 { + emit(.catchHandlersEnd(Instruction.CatchHandlersEndOperand(count: handlersToUnwind))) + } self.updateInstructionMapping() iseqBuilder.emitWithLabel(Instruction.br, frame.continuation) { _, brAt, continuation in let relativeOffset = continuation.offsetFromHead - brAt.offsetFromHead return Int32(relativeOffset) } } else { - // Optimization: If no value is copied, we can directly jump to the target + // Optimization: If no value is copied and no handlers to unwind, + // we can directly jump to the target iseqBuilder.fillBrTableEntry(frame.continuation, table: tableBuffer, index: entryIndex) { _, continuation in return Instruction.BrTableOperand.Entry(offset: Int32(continuation.offsetFromHead - brTableAt.offsetFromHead)) } @@ -1724,6 +1790,13 @@ struct InstructionTranslator: InstructionVisitor { // Skip actual code emission if validation-only mode return } + // Clean up all exception handlers before the tail call + let handlersToUnwind = controlStack.catchHandlersToUnwind( + relativeDepth: UInt32(controlStack.numberOfFrames - 1) + ) + if handlersToUnwind > 0 { + emit(.catchHandlersEnd(Instruction.CatchHandlersEndOperand(count: handlersToUnwind))) + } try prepareFrameHeaderForReturnCall(calleeType: calleeType, stackTopHeightToCopy: valueStack.slotHeight) emit(.returnCall(Instruction.ReturnCallOperand(callee: callee))) try markUnreachable() @@ -1739,6 +1812,13 @@ struct InstructionTranslator: InstructionVisitor { let calleeType = try self.module.resolveType(typeIndex) let internType = funcTypeInterner.intern(calleeType) + // Clean up all exception handlers before the tail call + let handlersToUnwind = controlStack.catchHandlersToUnwind( + relativeDepth: UInt32(controlStack.numberOfFrames - 1) + ) + if handlersToUnwind > 0 { + emit(.catchHandlersEnd(Instruction.CatchHandlersEndOperand(count: handlersToUnwind))) + } try prepareFrameHeaderForReturnCall( calleeType: calleeType, // Keep the stack space including the function index slot to be @@ -1755,6 +1835,136 @@ struct InstructionTranslator: InstructionVisitor { try markUnreachable() } + // MARK: - Exception handling + + mutating func visitThrow(tagIndex: UInt32) throws(WasmKitError) -> Output { + let tag = try module.tags[validating: Int(tagIndex)] + let tagType = funcTypeInterner.resolve(tag.type) + // Pop tag parameter values and ensure they're on the physical stack + for param in tagType.parameters.reversed() { + guard (try popOnStackOperand(param)) != nil else { return } + } + let payloadBase = valueStack.stackRegBase + VReg(valueStack.slotHeight) + // Push the parameter values back (they've been popped for on-stack guarantee) + for param in tagType.parameters { + _ = valueStack.push(param) + } + emit(.throwTag(Instruction.ThrowTagOperand(tagIndex: tagIndex, payloadBase: payloadBase))) + try markUnreachable() + } + + mutating func visitThrowRef() throws(WasmKitError) -> Output { + guard let exnRef = try popVRegOperand(.ref(.init(isNullable: true, heapType: .abstract(.exnRef)))) else { return } + emit(.throwRef(Instruction.ThrowRefOperand(exnRef: exnRef))) + try markUnreachable() + } + + mutating func visitTryTable(blockType: WasmParser.BlockType, tryCatch: WasmParser.TryCatch) throws(WasmKitError) -> Output { + let blockType = try module.resolveBlockType(blockType) + let endLabel = iseqBuilder.allocLabel() + + self.preserveLocalsOnStack(depth: self.valueStack.valueHeight) + let stackHeight = try popPushValues(blockType.parameters) + + let catchCount = UInt16(tryCatch.catches.count) + + // Allocate the catch table + let catchTable = allocator.allocateCatchTable(capacity: tryCatch.catches.count) + + // Emit the catchHandlers instruction first so we know its PC position. + self.updateInstructionMapping() + let operand = Instruction.CatchHandlersOperand( + baseAddress: UnsafePointer(catchTable.baseAddress!), + count: catchCount + ) + emit(.catchHandlers(operand)) + + // After emission, insertingPC points past the catchHandlers instruction. + // This is the reference point for pcOffset values. + let catchHandlersEndPC = iseqBuilder.insertingPC + + // Process catch clauses BEFORE pushing the try_table frame, because + // catch clause label depths are relative to the enclosing scope + // (the try_table's own label is not in scope for catch clauses per spec). + for (i, clause) in tryCatch.catches.enumerated() { + let tagIndex: UInt32? + let labelDepth: UInt32 + let isRef: Bool + + switch clause { + case .catch(let tIdx, let lIdx): + tagIndex = tIdx + labelDepth = lIdx + isRef = false + case .catchRef(let tIdx, let lIdx): + tagIndex = tIdx + labelDepth = lIdx + isRef = true + case .catchAll(let lIdx): + tagIndex = nil + labelDepth = lIdx + isRef = false + case .catchAllRef(let lIdx): + tagIndex = nil + labelDepth = lIdx + isRef = true + } + + let targetFrame = try controlStack.branchTarget(relativeDepth: labelDepth) + + // Resolve the tag to get the InternalTag handle + let tag: InternalTag? + var catchTypes: [ValueType] + if let tagIndex { + tag = try module.tags[validating: Int(tagIndex)] + let tagType = funcTypeInterner.resolve(tag!.type) + catchTypes = tagType.parameters + } else { + tag = nil + catchTypes = [] + } + if isRef { + catchTypes.append(.ref(.init(isNullable: true, heapType: .abstract(.exnRef)))) + } + + // Validate that the caught value types match the target label's copy types + guard catchTypes == targetFrame.copyTypes else { + throw WasmKitError(message: .catchTypeMismatch) + } + + // The payload register base is where the handler will write values. + // This is at the target frame's stack base. + let payloadRegBase = valueStack.stackRegBase + VReg(targetFrame.slotStackHeight) + + // Initialize the entry with a placeholder pcOffset (will be resolved) + catchTable[i] = CatchTableEntry( + tag: tag, + isRef: isRef, + pcOffset: 0, // placeholder + payloadRegBase: payloadRegBase + ) + + // Schedule the pcOffset to be filled when the target label is resolved. + // The offset is relative to catchHandlersEndPC. + iseqBuilder.fillCatchTableEntry( + targetFrame.continuation, table: catchTable, index: i, + catchHandlersPC: catchHandlersEndPC + ) + } + + // Push the try_table frame AFTER processing catch clauses. + // The try_table's own label is only in scope for the body instructions. + controlStack.pushFrame( + ControlStack.ControlFrame( + blockType: blockType, + valueStackHeight: stackHeight.valueHeight, + slotStackHeight: stackHeight.slotHeight, + continuation: endLabel, + kind: .tryTable(catchCount: catchCount) + ) + ) + } + mutating func visitDrop() throws(WasmKitError) -> Output { _ = try popAnyOperand() iseqBuilder.resetLastEmission() diff --git a/Sources/WasmKit/Validator.swift b/Sources/WasmKit/Validator.swift index 16af0eb0..be8598c0 100644 --- a/Sources/WasmKit/Validator.swift +++ b/Sources/WasmKit/Validator.swift @@ -86,6 +86,12 @@ struct ModuleValidator { for tableType in module.tableTypes { try Self.checkTableType(tableType, features: module.features) } + for tagTypeIndex in module.tagTypes { + let tagType = try Module.resolveType(tagTypeIndex, typeSection: module.types) + guard tagType.results.isEmpty else { + throw WasmKitError(message: .nonEmptyTagResultType) + } + } try checkStartFunction() } @@ -166,6 +172,8 @@ extension WasmTypes.Reference { case (.function(nil), .funcRef, true): return case (.extern(_?), .externRef, _): return case (.extern(nil), .externRef, true): return + case (.exception(_?), .exnRef, _): return + case (.exception(nil), .exnRef, true): return default: throw WasmKitError(message: .expectTypeButGot(expected: "\(type)", got: "\(self)")) } diff --git a/Sources/WasmKit/WasmKitError.swift b/Sources/WasmKit/WasmKitError.swift index 9e427419..d9c260c4 100644 --- a/Sources/WasmKit/WasmKitError.swift +++ b/Sources/WasmKit/WasmKitError.swift @@ -106,6 +106,14 @@ extension WasmKitError.Message { Self("start function must have no parameters and no results") } + static var nonEmptyTagResultType: Self { + Self("non-empty tag result type") + } + + static var catchTypeMismatch: Self { + Self("type mismatch") + } + static var memory64FeatureRequired: Self { Self("memory64 feature is required for 64-bit memories") } diff --git a/Sources/WasmParser/BinaryInstructionDecoder.swift b/Sources/WasmParser/BinaryInstructionDecoder.swift index 830e72c0..11e2f945 100644 --- a/Sources/WasmParser/BinaryInstructionDecoder.swift +++ b/Sources/WasmParser/BinaryInstructionDecoder.swift @@ -20,6 +20,8 @@ protocol BinaryInstructionDecoder { @inlinable mutating func visitLoop() throws(WasmParserError) -> BlockType /// Decode `if` immediates @inlinable mutating func visitIf() throws(WasmParserError) -> BlockType + /// Decode `throw` immediates + @inlinable mutating func visitThrow() throws(WasmParserError) -> UInt32 /// Decode `br` immediates @inlinable mutating func visitBr() throws(WasmParserError) -> UInt32 /// Decode `br_if` immediates @@ -38,6 +40,8 @@ protocol BinaryInstructionDecoder { @inlinable mutating func visitCallRef() throws(WasmParserError) -> UInt32 /// Decode `return_call_ref` immediates @inlinable mutating func visitReturnCallRef() throws(WasmParserError) -> UInt32 + /// Decode `try_table` immediates + @inlinable mutating func visitTryTable() throws(WasmParserError) -> (blockType: BlockType, tryCatch: TryCatch) /// Decode `typedSelect` immediates @inlinable mutating func visitTypedSelect() throws(WasmParserError) -> ValueType /// Decode `local.get` immediates @@ -233,6 +237,11 @@ func parseBinaryInstruction( return .if(blockType: blockType) case 0x05: return .else + case 0x08: + let (tagIndex) = try decoder.visitThrow() + return .throw(tagIndex: tagIndex) + case 0x0A: + return .throwRef case 0x0B: return .end case 0x0C: @@ -271,6 +280,9 @@ func parseBinaryInstruction( case 0x1C: let (type) = try decoder.visitTypedSelect() return .typedSelect(type: type) + case 0x1F: + let (blockType, tryCatch) = try decoder.visitTryTable() + return .tryTable(blockType: blockType, tryCatch: tryCatch) case 0x20: let (localIndex) = try decoder.visitLocalGet() return .localGet(localIndex: localIndex) diff --git a/Sources/WasmParser/ComponentParser.swift b/Sources/WasmParser/ComponentParser.swift index 23be6188..c9c975d8 100644 --- a/Sources/WasmParser/ComponentParser.swift +++ b/Sources/WasmParser/ComponentParser.swift @@ -791,6 +791,7 @@ func parseReferenceType() throws(WasmParserError) -> ReferenceType { let byte = try stream.consumeAny() switch byte { + case 0x69: return .exnRef case 0x70: return .funcRef case 0x6F: return .externRef default: diff --git a/Sources/WasmParser/InstructionVisitor.swift b/Sources/WasmParser/InstructionVisitor.swift index 9d21775b..cbb3e574 100644 --- a/Sources/WasmParser/InstructionVisitor.swift +++ b/Sources/WasmParser/InstructionVisitor.swift @@ -434,6 +434,8 @@ public enum Instruction: Equatable { case `loop`(blockType: BlockType) case `if`(blockType: BlockType) case `else` + case `throw`(tagIndex: UInt32) + case `throwRef` case `end` case `br`(relativeDepth: UInt32) case `brIf`(relativeDepth: UInt32) @@ -445,6 +447,7 @@ public enum Instruction: Equatable { case `returnCallIndirect`(typeIndex: UInt32, tableIndex: UInt32) case `callRef`(typeIndex: UInt32) case `returnCallRef`(typeIndex: UInt32) + case `tryTable`(blockType: BlockType, tryCatch: TryCatch) case `drop` case `select` case `typedSelect`(type: ValueType) @@ -558,6 +561,8 @@ extension AnyInstructionVisitor { public mutating func visitLoop(blockType: BlockType) throws(VisitorError) { return try self.visit(.loop(blockType: blockType)) } public mutating func visitIf(blockType: BlockType) throws(VisitorError) { return try self.visit(.if(blockType: blockType)) } public mutating func visitElse() throws(VisitorError) { return try self.visit(.else) } + public mutating func visitThrow(tagIndex: UInt32) throws(VisitorError) { return try self.visit(.throw(tagIndex: tagIndex)) } + public mutating func visitThrowRef() throws(VisitorError) { return try self.visit(.throwRef) } public mutating func visitEnd() throws(VisitorError) { return try self.visit(.end) } public mutating func visitBr(relativeDepth: UInt32) throws(VisitorError) { return try self.visit(.br(relativeDepth: relativeDepth)) } public mutating func visitBrIf(relativeDepth: UInt32) throws(VisitorError) { return try self.visit(.brIf(relativeDepth: relativeDepth)) } @@ -569,6 +574,7 @@ extension AnyInstructionVisitor { public mutating func visitReturnCallIndirect(typeIndex: UInt32, tableIndex: UInt32) throws(VisitorError) { return try self.visit(.returnCallIndirect(typeIndex: typeIndex, tableIndex: tableIndex)) } public mutating func visitCallRef(typeIndex: UInt32) throws(VisitorError) { return try self.visit(.callRef(typeIndex: typeIndex)) } public mutating func visitReturnCallRef(typeIndex: UInt32) throws(VisitorError) { return try self.visit(.returnCallRef(typeIndex: typeIndex)) } + public mutating func visitTryTable(blockType: BlockType, tryCatch: TryCatch) throws(VisitorError) { return try self.visit(.tryTable(blockType: blockType, tryCatch: tryCatch)) } public mutating func visitDrop() throws(VisitorError) { return try self.visit(.drop) } public mutating func visitSelect() throws(VisitorError) { return try self.visit(.select) } public mutating func visitTypedSelect(type: ValueType) throws(VisitorError) { return try self.visit(.typedSelect(type: type)) } @@ -691,6 +697,10 @@ public protocol InstructionVisitor: ~Copyable { mutating func visitIf(blockType: BlockType) throws(VisitorError) /// Visiting `else` instruction. mutating func visitElse() throws(VisitorError) + /// Visiting `throw` instruction. + mutating func visitThrow(tagIndex: UInt32) throws(VisitorError) + /// Visiting `throw_ref` instruction. + mutating func visitThrowRef() throws(VisitorError) /// Visiting `end` instruction. mutating func visitEnd() throws(VisitorError) /// Visiting `br` instruction. @@ -713,6 +723,8 @@ public protocol InstructionVisitor: ~Copyable { mutating func visitCallRef(typeIndex: UInt32) throws(VisitorError) /// Visiting `return_call_ref` instruction. mutating func visitReturnCallRef(typeIndex: UInt32) throws(VisitorError) + /// Visiting `try_table` instruction. + mutating func visitTryTable(blockType: BlockType, tryCatch: TryCatch) throws(VisitorError) /// Visiting `drop` instruction. mutating func visitDrop() throws(VisitorError) /// Visiting `select` instruction. @@ -923,6 +935,8 @@ extension InstructionVisitor where Self: ~Copyable { case let .loop(blockType): return try visitLoop(blockType: blockType) case let .if(blockType): return try visitIf(blockType: blockType) case .else: return try visitElse() + case let .throw(tagIndex): return try visitThrow(tagIndex: tagIndex) + case .throwRef: return try visitThrowRef() case .end: return try visitEnd() case let .br(relativeDepth): return try visitBr(relativeDepth: relativeDepth) case let .brIf(relativeDepth): return try visitBrIf(relativeDepth: relativeDepth) @@ -934,6 +948,7 @@ extension InstructionVisitor where Self: ~Copyable { case let .returnCallIndirect(typeIndex, tableIndex): return try visitReturnCallIndirect(typeIndex: typeIndex, tableIndex: tableIndex) case let .callRef(typeIndex): return try visitCallRef(typeIndex: typeIndex) case let .returnCallRef(typeIndex): return try visitReturnCallRef(typeIndex: typeIndex) + case let .tryTable(blockType, tryCatch): return try visitTryTable(blockType: blockType, tryCatch: tryCatch) case .drop: return try visitDrop() case .select: return try visitSelect() case let .typedSelect(type): return try visitTypedSelect(type: type) @@ -1044,6 +1059,8 @@ extension InstructionVisitor where Self: ~Copyable { public mutating func visitLoop(blockType: BlockType) throws(VisitorError) {} public mutating func visitIf(blockType: BlockType) throws(VisitorError) {} public mutating func visitElse() throws(VisitorError) {} + public mutating func visitThrow(tagIndex: UInt32) throws(VisitorError) {} + public mutating func visitThrowRef() throws(VisitorError) {} public mutating func visitEnd() throws(VisitorError) {} public mutating func visitBr(relativeDepth: UInt32) throws(VisitorError) {} public mutating func visitBrIf(relativeDepth: UInt32) throws(VisitorError) {} @@ -1055,6 +1072,7 @@ extension InstructionVisitor where Self: ~Copyable { public mutating func visitReturnCallIndirect(typeIndex: UInt32, tableIndex: UInt32) throws(VisitorError) {} public mutating func visitCallRef(typeIndex: UInt32) throws(VisitorError) {} public mutating func visitReturnCallRef(typeIndex: UInt32) throws(VisitorError) {} + public mutating func visitTryTable(blockType: BlockType, tryCatch: TryCatch) throws(VisitorError) {} public mutating func visitDrop() throws(VisitorError) {} public mutating func visitSelect() throws(VisitorError) {} public mutating func visitTypedSelect(type: ValueType) throws(VisitorError) {} diff --git a/Sources/WasmParser/WasmParser.swift b/Sources/WasmParser/WasmParser.swift index ad964e08..6daa82b0 100644 --- a/Sources/WasmParser/WasmParser.swift +++ b/Sources/WasmParser/WasmParser.swift @@ -177,11 +177,14 @@ public struct WasmFeatureSet: OptionSet, Sendable { /// The WebAssembly SIMD proposal @_alwaysEmitIntoClient public static var simd: WasmFeatureSet { WasmFeatureSet(rawValue: 1 << 4) } + /// The WebAssembly exception handling proposal + @_alwaysEmitIntoClient + public static var exceptionHandling: WasmFeatureSet { WasmFeatureSet(rawValue: 1 << 5) } /// The default feature set - public static let `default`: WasmFeatureSet = [.referenceTypes] + public static let `default`: WasmFeatureSet = [.referenceTypes, .exceptionHandling] /// The feature set with all features enabled - public static let all: WasmFeatureSet = [.memory64, .referenceTypes, .threads, .tailCall, .simd] + public static let all: WasmFeatureSet = [.memory64, .referenceTypes, .threads, .tailCall, .simd, .exceptionHandling] } /// > Note: @@ -318,6 +321,9 @@ extension Parser { switch byte { case 0x63: return try ReferenceType(isNullable: true, heapType: parseHeapType()) case 0x64: return try ReferenceType(isNullable: false, heapType: parseHeapType()) + case 0x69: + guard features.contains(.exceptionHandling) else { return nil } + return .exnRef case 0x6F: return .externRef case 0x70: return .funcRef default: return nil // invalid discriminator @@ -330,6 +336,9 @@ extension Parser { func parseHeapType() throws(WasmParserError) -> HeapType { let b = try stream.peek() switch b { + case 0x69: + _ = try stream.consumeAny() + return .exnRef case 0x6F: _ = try stream.consumeAny() return .externRef @@ -356,7 +365,7 @@ extension Parser { case 0x40: _ = try stream.consumeAny() return .empty - case 0x7B...0x7F, 0x70, 0x6F: + case 0x7B...0x7F, 0x70, 0x6F, 0x69, 0x63, 0x64: return try .type(parseValueType()) default: let rawIndex = try stream.parseVarSigned33() @@ -522,6 +531,33 @@ extension Parser: BinaryInstructionDecoder { let labelIndex: UInt32 = try parseUnsigned() return BrTable(labelIndices: labelIndices, defaultIndex: labelIndex) } + @inlinable mutating func visitThrow() throws(WasmParserError) -> UInt32 { try parseUnsigned() } + @inlinable mutating func visitThrowRef() throws(WasmParserError) { /* no immediates */ } + @inlinable mutating func visitTryTable() throws(WasmParserError) -> (blockType: BlockType, tryCatch: TryCatch) { + let blockType = try parseResultType() + let catches: [CatchClause] = try parseVector { () throws(WasmParserError) in + let clauseId: UInt8 = try parseUnsigned() + switch clauseId { + case 0x00: + let tagIndex: UInt32 = try parseUnsigned() + let label: UInt32 = try parseUnsigned() + return .catch(tagIndex: tagIndex, labelIndex: label) + case 0x01: + let tagIndex: UInt32 = try parseUnsigned() + let label: UInt32 = try parseUnsigned() + return .catchRef(tagIndex: tagIndex, labelIndex: label) + case 0x02: + let label: UInt32 = try parseUnsigned() + return .catchAll(labelIndex: label) + case 0x03: + let label: UInt32 = try parseUnsigned() + return .catchAllRef(labelIndex: label) + default: + throw makeError(.invalidCatchClauseId(clauseId)) + } + } + return (blockType, TryCatch(catches: catches)) + } @inlinable mutating func visitCall() throws(WasmParserError) -> UInt32 { try parseUnsigned() } @inlinable mutating func visitCallRef() throws(WasmParserError) -> UInt32 { // TODO reference types checks @@ -787,12 +823,17 @@ extension Parser { /// > Note: /// func parseImportDescriptor() throws(WasmParserError) -> ImportDescriptor { - let b = try stream.consume(Set(0x00...0x03)) + let maxKind: UInt8 = features.contains(.exceptionHandling) ? 0x04 : 0x03 + let b = try stream.consume(Set(0x00...maxKind)) switch b { case 0x00: return try .function(parseUnsigned()) case 0x01: return try .table(parseTableType()) case 0x02: return try .memory(parseMemoryType()) case 0x03: return try .global(parseGlobalType()) + case 0x04: + let attribute: UInt8 = try parseUnsigned() + guard attribute == 0 else { throw makeError(.invalidTagAttribute(attribute)) } + return try .tag(parseUnsigned()) default: preconditionFailure("should never reach here") } @@ -830,6 +871,18 @@ extension Parser { } } + /// > Note: + /// + @usableFromInline + func parseTagSection() throws(WasmParserError) -> [Tag] { + return try parseVector { () throws(WasmParserError) in + let attribute: UInt8 = try parseUnsigned() + guard attribute == 0 else { throw makeError(.invalidTagAttribute(attribute)) } + let typeIndex: TypeIndex = try parseUnsigned() + return Tag(type: typeIndex) + } + } + /// > Note: /// @usableFromInline @@ -844,12 +897,14 @@ extension Parser { /// > Note: /// func parseExportDescriptor() throws(WasmParserError) -> ExportDescriptor { - let b = try stream.consume(Set(0x00...0x03)) + let maxKind: UInt8 = features.contains(.exceptionHandling) ? 0x04 : 0x03 + let b = try stream.consume(Set(0x00...maxKind)) switch b { case 0x00: return try .function(parseUnsigned()) case 0x01: return try .table(parseUnsigned()) case 0x02: return try .memory(parseUnsigned()) case 0x03: return try .global(parseUnsigned()) + case 0x04: return try .tag(parseUnsigned()) default: preconditionFailure("should never reach here") } @@ -998,6 +1053,7 @@ public enum ParsingPayload { case tableSection([Table]) case memorySection([Memory]) case globalSection([Global]) + case tagSection([Tag]) case exportSection([Export]) case startSection(FunctionIndex) case elementSection([ElementSegment]) @@ -1148,6 +1204,9 @@ extension Parser { case 12: order = .dataCount payload = .dataCount(try parseDataCountSection()) + case 13 where features.contains(.exceptionHandling): + order = .tag + payload = .tagSection(try parseTagSection()) default: throw makeError(.malformedSectionID(sectionID)) } diff --git a/Sources/WasmParser/WasmParserError.swift b/Sources/WasmParser/WasmParserError.swift index 4ef32f4d..b83a1756 100644 --- a/Sources/WasmParser/WasmParserError.swift +++ b/Sources/WasmParser/WasmParserError.swift @@ -189,4 +189,14 @@ extension WasmParserError.Message { @usableFromInline static func invalidFunctionType(_ index: Int64) -> Self { Self("invalid function type index: \(index), expected a unsigned 32-bit integer") } + + @usableFromInline + static func invalidTagAttribute(_ attribute: UInt8) -> Self { + Self("Invalid tag attribute: \(attribute) (expected 0)") + } + + @usableFromInline + static func invalidCatchClauseId(_ id: UInt8) -> Self { + Self("Invalid catch clause id: \(id)") + } } diff --git a/Sources/WasmParser/WasmTypes.swift b/Sources/WasmParser/WasmTypes.swift index 597257c2..5a73a57d 100644 --- a/Sources/WasmParser/WasmTypes.swift +++ b/Sources/WasmParser/WasmTypes.swift @@ -160,6 +160,8 @@ public typealias GlobalIndex = UInt32 public typealias ElementIndex = UInt32 /// Index type for data segments within a module public typealias DataIndex = UInt32 +/// Index type for tags within a module +public typealias TagIndex = UInt32 public typealias ConstExpression = [Instruction] @@ -188,6 +190,41 @@ public struct Global: Equatable { public let initializer: ConstExpression } +/// Tag entry in a module +/// > Note: +/// +public struct Tag: Equatable { + /// The type index of the tag's function type (parameters = exception payload, results must be empty). + public let type: TypeIndex + + public init(type: TypeIndex) { + self.type = type + } +} + +/// Catch clause within a `try_table` instruction. +/// > Note: +/// +public enum CatchClause: Equatable { + /// Catches an exception matching the given tag and branches with payload values. + case `catch`(tagIndex: TagIndex, labelIndex: UInt32) + /// Like `catch`, but also passes an `exnref`. + case catchRef(tagIndex: TagIndex, labelIndex: UInt32) + /// Catches any exception and branches with no extra values. + case catchAll(labelIndex: UInt32) + /// Like `catchAll`, but also passes an `exnref`. + case catchAllRef(labelIndex: UInt32) +} + +/// The catch clauses of a `try_table` instruction. +public struct TryCatch: Equatable { + public let catches: [CatchClause] + + public init(catches: [CatchClause]) { + self.catches = catches + } +} + /// Segment of elements that are initialized in a table /// > Note: /// @@ -277,6 +314,8 @@ public enum ExportDescriptor: Equatable { case memory(MemoryIndex) /// Global export case global(GlobalIndex) + /// Tag export + case tag(TagIndex) } /// Import entity in a module @@ -307,6 +346,8 @@ public enum ImportDescriptor: Equatable { case memory(MemoryType) /// Global import case global(GlobalType) + /// Tag import + case tag(TypeIndex) } @usableFromInline diff --git a/Sources/WasmTypes/WasmTypes.swift b/Sources/WasmTypes/WasmTypes.swift index 72ca2a58..92cc1cb2 100644 --- a/Sources/WasmTypes/WasmTypes.swift +++ b/Sources/WasmTypes/WasmTypes.swift @@ -20,6 +20,9 @@ public enum AbstractHeapType: UInt8, Equatable, Hashable, Sendable { /// An external host data. case externRef // -> to be renamed extern + + /// A reference to an exception. + case exnRef } public enum HeapType: Equatable, Hashable, Sendable { @@ -33,6 +36,10 @@ public enum HeapType: Equatable, Hashable, Sendable { public static var externRef: HeapType { return .abstract(.externRef) } + + public static var exnRef: HeapType { + return .abstract(.exnRef) + } } /// Reference types @@ -48,6 +55,10 @@ public struct ReferenceType: Equatable, Hashable, Sendable { ReferenceType(isNullable: true, heapType: .externRef) } + public static var exnRef: ReferenceType { + ReferenceType(isNullable: true, heapType: .exnRef) + } + public init(isNullable: Bool, heapType: HeapType) { self.isNullable = isNullable self.heapType = heapType @@ -97,6 +108,8 @@ public struct V128ShuffleMask: Equatable, Hashable, Sendable { public typealias FunctionAddress = Int /// Runtime representation of an external entity reference. public typealias ExternAddress = Int +/// Runtime representation of an exception reference. +public typealias ExceptionAddress = Int @available(*, unavailable, message: "Address-based APIs has been removed; use `Table` instead") public typealias TableAddress = Int @@ -114,6 +127,8 @@ public enum Reference: Hashable, Sendable { case function(FunctionAddress?) /// A reference to an external entity. case extern(ExternAddress?) + /// A reference to an exception. + case exception(ExceptionAddress?) } /// Runtime representation of a value. diff --git a/Sources/_CWasmKit/include/DirectThreadedCode.inc b/Sources/_CWasmKit/include/DirectThreadedCode.inc index 77fc2025..4ef0467b 100644 --- a/Sources/_CWasmKit/include/DirectThreadedCode.inc +++ b/Sources/_CWasmKit/include/DirectThreadedCode.inc @@ -1756,6 +1756,32 @@ SWIFT_CC(swiftasync) static inline void wasmkit_tc_atomicFence(Sp sp, Pc pc, Md INLINE_CALL next = wasmkit_execute_atomicFence(&sp, &pc, &md, &ms, state, &error); return ((wasmkit_tc_exec)next)(sp, pc, md, ms, state); } +SWIFT_CC(swiftasync) static inline void wasmkit_tc_throwTag(Sp sp, Pc pc, Md md, Ms ms, SWIFT_CONTEXT void *state) { + SWIFT_CC(swift) uint64_t wasmkit_execute_throwTag(Sp *sp, Pc *pc, Md *md, Ms *ms, SWIFT_CONTEXT void *state, SWIFT_ERROR_RESULT void **error); + void * _Nullable error = NULL; uint64_t next; + INLINE_CALL next = wasmkit_execute_throwTag(&sp, &pc, &md, &ms, state, &error); + if (error) return wasmkit_execution_state_set_error(error, sp, state); + return ((wasmkit_tc_exec)next)(sp, pc, md, ms, state); +} +SWIFT_CC(swiftasync) static inline void wasmkit_tc_throwRef(Sp sp, Pc pc, Md md, Ms ms, SWIFT_CONTEXT void *state) { + SWIFT_CC(swift) uint64_t wasmkit_execute_throwRef(Sp *sp, Pc *pc, Md *md, Ms *ms, SWIFT_CONTEXT void *state, SWIFT_ERROR_RESULT void **error); + void * _Nullable error = NULL; uint64_t next; + INLINE_CALL next = wasmkit_execute_throwRef(&sp, &pc, &md, &ms, state, &error); + if (error) return wasmkit_execution_state_set_error(error, sp, state); + return ((wasmkit_tc_exec)next)(sp, pc, md, ms, state); +} +SWIFT_CC(swiftasync) static inline void wasmkit_tc_catchHandlers(Sp sp, Pc pc, Md md, Ms ms, SWIFT_CONTEXT void *state) { + SWIFT_CC(swift) uint64_t wasmkit_execute_catchHandlers(Sp *sp, Pc *pc, Md *md, Ms *ms, SWIFT_CONTEXT void *state, SWIFT_ERROR_RESULT void **error); + void * _Nullable error = NULL; uint64_t next; + INLINE_CALL next = wasmkit_execute_catchHandlers(&sp, &pc, &md, &ms, state, &error); + return ((wasmkit_tc_exec)next)(sp, pc, md, ms, state); +} +SWIFT_CC(swiftasync) static inline void wasmkit_tc_catchHandlersEnd(Sp sp, Pc pc, Md md, Ms ms, SWIFT_CONTEXT void *state) { + SWIFT_CC(swift) uint64_t wasmkit_execute_catchHandlersEnd(Sp *sp, Pc *pc, Md *md, Ms *ms, SWIFT_CONTEXT void *state, SWIFT_ERROR_RESULT void **error); + void * _Nullable error = NULL; uint64_t next; + INLINE_CALL next = wasmkit_execute_catchHandlersEnd(&sp, &pc, &md, &ms, state, &error); + return ((wasmkit_tc_exec)next)(sp, pc, md, ms, state); +} static const uintptr_t wasmkit_tc_exec_handlers[] = { (uintptr_t)((wasmkit_tc_exec)&wasmkit_tc_copyStack), (uintptr_t)((wasmkit_tc_exec)&wasmkit_tc_globalGet), @@ -2027,4 +2053,8 @@ static const uintptr_t wasmkit_tc_exec_handlers[] = { (uintptr_t)((wasmkit_tc_exec)&wasmkit_tc_memoryAtomicWait64), (uintptr_t)((wasmkit_tc_exec)&wasmkit_tc_memoryAtomicNotify), (uintptr_t)((wasmkit_tc_exec)&wasmkit_tc_atomicFence), + (uintptr_t)((wasmkit_tc_exec)&wasmkit_tc_throwTag), + (uintptr_t)((wasmkit_tc_exec)&wasmkit_tc_throwRef), + (uintptr_t)((wasmkit_tc_exec)&wasmkit_tc_catchHandlers), + (uintptr_t)((wasmkit_tc_exec)&wasmkit_tc_catchHandlersEnd), }; diff --git a/Tests/WasmKitTests/Spectest/TestCase.swift b/Tests/WasmKitTests/Spectest/TestCase.swift index d27a3463..e0d1944d 100644 --- a/Tests/WasmKitTests/Spectest/TestCase.swift +++ b/Tests/WasmKitTests/Spectest/TestCase.swift @@ -305,6 +305,15 @@ extension WastRunContext { } return .passed } + case .assertException(let execute): + do { + _ = try wastExecute(execute: execute) + return .failed("exception expected") + } catch is WasmKitException { + return .passed + } catch { + return .failed("expected WasmKitException but got: \(error)") + } case .assertUnlinkable(let wat, let message): currentInstance = nil @@ -365,6 +374,7 @@ extension WastRunContext { switch heapType { case .abstract(.funcRef): return .ref(.function(nil)) case .abstract(.externRef): return .ref(.extern(nil)) + case .abstract(.exnRef): return .ref(.exception(nil)) case .concrete: throw SpectestError("concrete ref.null is not supported yet") } @@ -387,6 +397,9 @@ extension WastRunContext { features.remove(.referenceTypes) features.insert(.threads) } + if rootPath.ends(with: "proposals/exception-handling") { + features.insert(.exceptionHandling) + } return features } @@ -487,7 +500,8 @@ extension Value { case (.ref(.function(let lhs?)), .refFunc(let rhs)): return rhs.map { lhs == $0 } ?? true case (.ref(.extern(nil)), .refNull(.abstract(.externRef))), - (.ref(.function(nil)), .refNull(.abstract(.funcRef))): + (.ref(.function(nil)), .refNull(.abstract(.funcRef))), + (.ref(.exception(nil)), .refNull(.abstract(.exnRef))): return true default: return false diff --git a/Tests/WasmKitTests/SpectestTests.swift b/Tests/WasmKitTests/SpectestTests.swift index 3c3be6f7..77926b90 100644 --- a/Tests/WasmKitTests/SpectestTests.swift +++ b/Tests/WasmKitTests/SpectestTests.swift @@ -15,6 +15,7 @@ struct SpectestTests { Self.testsuite.appendingPathComponent("proposals/memory64").path, Self.testsuite.appendingPathComponent("proposals/tail-call").path, Self.testsuite.appendingPathComponent("proposals/threads").path, + Self.testsuite.appendingPathComponent("proposals/exception-handling").path, Self.projectDir.appendingPathComponent("Tests/WasmKitTests/ExtraSuite").path, ] } diff --git a/Utilities/Instructions.json b/Utilities/Instructions.json index 050e74f7..308526f4 100644 --- a/Utilities/Instructions.json +++ b/Utilities/Instructions.json @@ -5,6 +5,8 @@ ["mvp" , "loop" , ["0x03"] , [["blockType", "BlockType"]] , null ], ["mvp" , "if" , ["0x04"] , [["blockType", "BlockType"]] , null ], ["mvp" , "else" , ["0x05"] , [] , null ], + ["exceptionHandling" , "throw" , ["0x08"] , [["tagIndex", "UInt32"]] , null ], + ["exceptionHandling" , "throw_ref" , ["0x0A"] , [] , null ], ["mvp" , "end" , ["0x0B"] , [] , null ], ["mvp" , "br" , ["0x0C"] , [["relativeDepth", "UInt32"]] , null ], ["mvp" , "br_if" , ["0x0D"] , [["relativeDepth", "UInt32"]] , null ], @@ -16,6 +18,7 @@ ["tailCall" , "return_call_indirect" , ["0x13"] , [["typeIndex", "UInt32"], ["tableIndex", "UInt32"]], null ], ["functionReferences" , "call_ref" , ["0x14"] , [["typeIndex", "UInt32"]] , null ], ["functionReferences" , "return_call_ref" , ["0x15"] , [["typeIndex", "UInt32"]] , null ], + ["exceptionHandling" , "try_table" , ["0x1F"] , [["blockType", "BlockType"], ["tryCatch", "TryCatch"]], null ], ["mvp" , "drop" , ["0x1A"] , [] , null ], ["mvp" , "select" , ["0x1B"] , [] , null ], ["referenceTypes" , {"enumCase": "typedSelect"} , ["0x1C"] , [["type", "ValueType"]] , null ], diff --git a/Utilities/Sources/VMSpec/Instruction.swift b/Utilities/Sources/VMSpec/Instruction.swift index 15af5e81..2df80ae4 100644 --- a/Utilities/Sources/VMSpec/Instruction.swift +++ b/Utilities/Sources/VMSpec/Instruction.swift @@ -644,6 +644,28 @@ extension VMGen { ), ] + // MARK: - Exception handling instructions + + static let exceptionHandlingInsts: [Instruction] = [ + Instruction(name: "throwTag", documentation: "WebAssembly Exception Handling `throw`", + isControl: true, mayThrow: true) { + $0.field(name: "tagIndex", type: .UInt32) + $0.field(name: "payloadBase", type: .VReg) + }, + Instruction(name: "throwRef", documentation: "WebAssembly Exception Handling `throw_ref`", + isControl: true, mayThrow: true) { + $0.field(name: "exnRef", type: .VReg) + }, + Instruction(name: "catchHandlers", documentation: "Register exception handlers for a `try_table` block", + isControl: true) { + $0.field(name: "rawBaseAddress", type: .UInt64) + $0.field(name: "count", type: .UInt16) + }, + Instruction(name: "catchHandlersEnd", documentation: "Unregister exception handlers for a `try_table` block") { + $0.field(name: "count", type: .UInt16) + }, + ] + // MARK: - Instruction generation static func buildInstructions() -> [Instruction] { @@ -751,6 +773,8 @@ extension VMGen { instructions += atomicRmw32Ops.map(\.instruction) instructions += atomicCmpxchgOps instructions += atomicWaitNotifyInsts + // Exception handling + instructions += exceptionHandlingInsts return instructions } From 4007331eb3f63c1e820828c17536d2a360d2e8d7 Mon Sep 17 00:00:00 2001 From: Max Desiatov Date: Thu, 26 Feb 2026 23:41:13 +0000 Subject: [PATCH 2/4] Add `bench.md` for library benchmarks --- eh_bench.md | 3656 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 3656 insertions(+) create mode 100644 eh_bench.md diff --git a/eh_bench.md b/eh_bench.md new file mode 100644 index 00000000..15180e03 --- /dev/null +++ b/eh_bench.md @@ -0,0 +1,3656 @@ + +## Comparing results between 'main' and 'eh-branch' + +``` +Host 'MacBookAir.lan' with 8 'arm64' processors with 16 GB memory +``` +## MacroPlugin + +### Expand FoundationMacros.wasm metrics + +
Time (wall clock): results within specified thresholds, fold down for details. +

+ +| Time (wall clock) (μs) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 2929 | 2947 | 2955 | 2970 | 2994 | 3070 | 3250 | 334 | +| eh-branch | 2890 | 2949 | 2957 | 2970 | 2990 | 3092 | 3230 | 335 | +| Δ | -39 | 2 | 2 | 0 | -4 | 22 | -20 | 1 | +| Improvement % | 1 | 0 | 0 | 0 | 0 | -1 | 1 | 1 | + +

+

+ +
Time (total CPU): results within specified thresholds, fold down for details. +

+ +| Time (total CPU) (μs) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 2931 | 2949 | 2959 | 2972 | 2992 | 3060 | 3235 | 334 | +| eh-branch | 2892 | 2951 | 2961 | 2974 | 2992 | 3097 | 3235 | 335 | +| Δ | -39 | 2 | 2 | 2 | 0 | 37 | 0 | 1 | +| Improvement % | 1 | 0 | 0 | 0 | 0 | -1 | 0 | 1 | + +

+

+ +
Throughput (# / s): results within specified thresholds, fold down for details. +

+ +| Throughput (# / s) (#) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 341 | 339 | 338 | 337 | 334 | 326 | 308 | 334 | +| eh-branch | 346 | 339 | 338 | 337 | 335 | 323 | 310 | 335 | +| Δ | 5 | 0 | 0 | 0 | 1 | -3 | 2 | 1 | +| Improvement % | 1 | 0 | 0 | 0 | 0 | -1 | 1 | 1 | + +

+

+ +
Memory (resident peak): results within specified thresholds, fold down for details. +

+ +| Memory (resident peak) (M) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 50 | 50 | 50 | 50 | 50 | 50 | 50 | 334 | +| eh-branch | 50 | 50 | 50 | 50 | 50 | 50 | 50 | 335 | +| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | + +

+

+ +
Malloc (total): results within specified thresholds, fold down for details. +

+ +| Malloc (total) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 24 | 24 | 24 | 24 | 24 | 24 | 151 | 334 | +| eh-branch | 24 | 24 | 24 | 24 | 24 | 24 | 151 | 335 | +| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | + +

+

+ +
Instructions: results within specified thresholds, fold down for details. +

+ +| Instructions (M) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 20 | 20 | 20 | 20 | 20 | 20 | 20 | 334 | +| eh-branch | 20 | 20 | 20 | 20 | 20 | 20 | 20 | 335 | +| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | + +

+

+ +### Expand MMIOMacros.wasm metrics + +
Time (wall clock): results within specified thresholds, fold down for details. +

+ +| Time (wall clock) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 85 | +| eh-branch | 11 | 12 | 12 | 12 | 12 | 12 | 12 | 85 | +| Δ | -1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| Improvement % | 8 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +

+

+ +
Time (total CPU): results within specified thresholds, fold down for details. +

+ +| Time (total CPU) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 85 | +| eh-branch | 11 | 12 | 12 | 12 | 12 | 12 | 12 | 85 | +| Δ | -1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| Improvement % | 8 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +

+

+ +
Throughput (# / s): results within specified thresholds, fold down for details. +

+ +| Throughput (# / s) (#) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 86 | 85 | 85 | 85 | 84 | 83 | 83 | 85 | +| eh-branch | 87 | 86 | 85 | 85 | 84 | 83 | 83 | 85 | +| Δ | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | +| Improvement % | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | + +

+

+ +
Memory (resident peak): results within specified thresholds, fold down for details. +

+ +| Memory (resident peak) (M) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 169 | 169 | 169 | 169 | 169 | 169 | 169 | 85 | +| eh-branch | 169 | 170 | 170 | 170 | 170 | 170 | 170 | 85 | +| Δ | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | +| Improvement % | 0 | -1 | -1 | -1 | -1 | -1 | -1 | 0 | + +

+

+ +
Malloc (total): results within specified thresholds, fold down for details. +

+ +| Malloc (total) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 56 | 56 | 56 | 56 | 56 | 658 | 658 | 85 | +| eh-branch | 56 | 56 | 56 | 56 | 56 | 658 | 658 | 85 | +| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +

+

+ +
Instructions: results within specified thresholds, fold down for details. +

+ +| Instructions (M) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 84 | 84 | 84 | 84 | 84 | 86 | 86 | 85 | +| eh-branch | 84 | 84 | 84 | 84 | 84 | 85 | 85 | 85 | +| Δ | 0 | 0 | 0 | 0 | 0 | -1 | -1 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | + +

+

+ +### Expand StringifyMacros.wasm metrics + +
Time (wall clock): results within specified thresholds, fold down for details. +

+ +| Time (wall clock) (μs) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 2355 | 2374 | 2382 | 2396 | 2427 | 2480 | 2660 | 413 | +| eh-branch | 2322 | 2357 | 2378 | 2390 | 2404 | 2488 | 2591 | 416 | +| Δ | -33 | -17 | -4 | -6 | -23 | 8 | -69 | 3 | +| Improvement % | 1 | 1 | 0 | 0 | 1 | 0 | 3 | 3 | + +

+

+ +
Time (total CPU): results within specified thresholds, fold down for details. +

+ +| Time (total CPU) (μs) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 2357 | 2376 | 2384 | 2398 | 2431 | 2478 | 2662 | 413 | +| eh-branch | 2324 | 2359 | 2380 | 2392 | 2406 | 2490 | 2574 | 416 | +| Δ | -33 | -17 | -4 | -6 | -25 | 12 | -88 | 3 | +| Improvement % | 1 | 1 | 0 | 0 | 1 | 0 | 3 | 3 | + +

+

+ +
Throughput (# / s): results within specified thresholds, fold down for details. +

+ +| Throughput (# / s) (#) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 425 | 422 | 420 | 418 | 412 | 403 | 376 | 413 | +| eh-branch | 431 | 424 | 421 | 419 | 416 | 402 | 386 | 416 | +| Δ | 6 | 2 | 1 | 1 | 4 | -1 | 10 | 3 | +| Improvement % | 1 | 0 | 0 | 0 | 1 | 0 | 3 | 3 | + +

+

+ +
Memory (resident peak): results within specified thresholds, fold down for details. +

+ +| Memory (resident peak) (M) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 43 | 43 | 43 | 43 | 43 | 43 | 43 | 413 | +| eh-branch | 44 | 44 | 44 | 44 | 44 | 44 | 44 | 416 | +| Δ | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 3 | +| Improvement % | -2 | -2 | -2 | -2 | -2 | -2 | -2 | 3 | + +

+

+ +
Malloc (total): results within specified thresholds, fold down for details. +

+ +| Malloc (total) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 30 | 30 | 30 | 30 | 30 | 30 | 157 | 413 | +| eh-branch | 30 | 30 | 30 | 30 | 30 | 30 | 157 | 416 | +| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 3 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 3 | + +

+

+ +
Instructions: results within specified thresholds, fold down for details. +

+ +| Instructions (M) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 15 | 15 | 15 | 15 | 15 | 15 | 15 | 413 | +| eh-branch | 15 | 15 | 15 | 15 | 15 | 15 | 15 | 416 | +| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 3 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 3 | + +

+

+ +### Expand TestingMacros.wasm metrics + +
Time (wall clock): results within specified thresholds, fold down for details. +

+ +| Time (wall clock) (μs) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 5926 | 5951 | 5968 | 6001 | 6042 | 6291 | 6311 | 166 | +| eh-branch | 5855 | 5980 | 5997 | 6017 | 6054 | 6283 | 6306 | 166 | +| Δ | -71 | 29 | 29 | 16 | 12 | -8 | -5 | 0 | +| Improvement % | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +

+

+ +
Time (total CPU): results within specified thresholds, fold down for details. +

+ +| Time (total CPU) (μs) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 5928 | 5956 | 5968 | 6005 | 6038 | 6296 | 6312 | 166 | +| eh-branch | 5861 | 5984 | 6001 | 6021 | 6062 | 6287 | 6311 | 166 | +| Δ | -67 | 28 | 33 | 16 | 24 | -9 | -1 | 0 | +| Improvement % | 1 | 0 | -1 | 0 | 0 | 0 | 0 | 0 | + +

+

+ +
Throughput (# / s): results within specified thresholds, fold down for details. +

+ +| Throughput (# / s) (#) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 169 | 168 | 168 | 167 | 166 | 159 | 158 | 166 | +| eh-branch | 171 | 167 | 167 | 166 | 165 | 159 | 159 | 166 | +| Δ | 2 | -1 | -1 | -1 | -1 | 0 | 1 | 0 | +| Improvement % | 1 | -1 | -1 | -1 | -1 | 0 | 1 | 0 | + +

+

+ +
Memory (resident peak): results within specified thresholds, fold down for details. +

+ +| Memory (resident peak) (M) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 102 | 102 | 102 | 102 | 102 | 102 | 102 | 166 | +| eh-branch | 102 | 102 | 102 | 102 | 102 | 102 | 102 | 166 | +| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +

+

+ +
Malloc (total): results within specified thresholds, fold down for details. +

+ +| Malloc (total) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 202 | 202 | 202 | 202 | 202 | 202 | 202 | 166 | +| eh-branch | 202 | 202 | 202 | 202 | 202 | 202 | 202 | 166 | +| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +

+

+ +
Instructions: results within specified thresholds, fold down for details. +

+ +| Instructions (M) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 36 | 36 | 36 | 36 | 36 | 36 | 36 | 166 | +| eh-branch | 36 | 36 | 36 | 36 | 36 | 36 | 36 | 166 | +| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +

+

+ +### Startup FoundationMacros.wasm metrics + +
Time (wall clock): results within specified thresholds, fold down for details. +

+ +| Time (wall clock) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 88 | 89 | 89 | 89 | 89 | 89 | 89 | 12 | +| eh-branch | 87 | 87 | 88 | 88 | 89 | 89 | 89 | 12 | +| Δ | -1 | -2 | -1 | -1 | 0 | 0 | 0 | 0 | +| Improvement % | 1 | 2 | 1 | 1 | 0 | 0 | 0 | 0 | + +

+

+ +
Time (total CPU): results within specified thresholds, fold down for details. +

+ +| Time (total CPU) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 88 | 89 | 89 | 89 | 89 | 89 | 89 | 12 | +| eh-branch | 87 | 87 | 88 | 88 | 89 | 89 | 89 | 12 | +| Δ | -1 | -2 | -1 | -1 | 0 | 0 | 0 | 0 | +| Improvement % | 1 | 2 | 1 | 1 | 0 | 0 | 0 | 0 | + +

+

+ +
Throughput (# / s): results within specified thresholds, fold down for details. +

+ +| Throughput (# / s) (#) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 11 | 11 | 11 | 11 | 11 | 11 | 11 | 12 | +| eh-branch | 11 | 11 | 11 | 11 | 11 | 11 | 11 | 12 | +| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +

+

+ +
Memory (resident peak): results within specified thresholds, fold down for details. +

+ +| Memory (resident peak) (M) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 70 | 72 | 73 | 73 | 73 | 73 | 73 | 12 | +| eh-branch | 70 | 73 | 80 | 80 | 80 | 80 | 80 | 12 | +| Δ | 0 | 1 | 7 | 7 | 7 | 7 | 7 | 0 | +| Improvement % | 0 | -1 | -10 | -10 | -10 | -10 | -10 | 0 | + +

+

+ +
Malloc (total): results within specified thresholds, fold down for details. +

+ +| Malloc (total) (K) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 531 | 531 | 531 | 531 | 531 | 531 | 531 | 12 | +| eh-branch | 531 | 531 | 531 | 531 | 531 | 531 | 531 | 12 | +| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +

+

+ +
Instructions: results within specified thresholds, fold down for details. +

+ +| Instructions (M) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 1243 | 1249 | 1251 | 1255 | 1258 | 1258 | 1258 | 12 | +| eh-branch | 1233 | 1235 | 1236 | 1237 | 1246 | 1251 | 1251 | 12 | +| Δ | -10 | -14 | -15 | -18 | -12 | -7 | -7 | 0 | +| Improvement % | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | + +

+

+ +### Startup MMIOMacros.wasm metrics + +
Time (wall clock): results within specified thresholds, fold down for details. +

+ +| Time (wall clock) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 184 | 185 | 185 | 186 | 187 | 187 | 187 | 6 | +| eh-branch | 185 | 185 | 186 | 187 | 188 | 188 | 188 | 6 | +| Δ | 1 | 0 | 1 | 1 | 1 | 1 | 1 | 0 | +| Improvement % | -1 | 0 | -1 | -1 | -1 | -1 | -1 | 0 | + +

+

+ +
Time (total CPU): results within specified thresholds, fold down for details. +

+ +| Time (total CPU) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 184 | 185 | 185 | 186 | 187 | 187 | 187 | 6 | +| eh-branch | 185 | 185 | 186 | 187 | 188 | 188 | 188 | 6 | +| Δ | 1 | 0 | 1 | 1 | 1 | 1 | 1 | 0 | +| Improvement % | -1 | 0 | -1 | -1 | -1 | -1 | -1 | 0 | + +

+

+ +
Throughput (# / s): results within specified thresholds, fold down for details. +

+ +| Throughput (# / s) (#) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 5 | 5 | 5 | 5 | 5 | 5 | 5 | 6 | +| eh-branch | 5 | 5 | 5 | 5 | 5 | 5 | 5 | 6 | +| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +

+

+ +
Memory (resident peak): results within specified thresholds, fold down for details. +

+ +| Memory (resident peak) (M) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 234 | 235 | 235 | 236 | 236 | 236 | 236 | 6 | +| eh-branch | 234 | 234 | 239 | 239 | 239 | 239 | 239 | 6 | +| Δ | 0 | -1 | 4 | 3 | 3 | 3 | 3 | 0 | +| Improvement % | 0 | 0 | -2 | -1 | -1 | -1 | -1 | 0 | + +

+

+ +
Malloc (total): results within specified thresholds, fold down for details. +

+ +| Malloc (total) (K) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 628 | 628 | 628 | 628 | 628 | 628 | 628 | 6 | +| eh-branch | 628 | 628 | 628 | 628 | 628 | 628 | 628 | 6 | +| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +

+

+ +
Instructions: results within specified thresholds, fold down for details. +

+ +| Instructions (M) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 2249 | 2252 | 2252 | 2261 | 2266 | 2266 | 2266 | 6 | +| eh-branch | 2263 | 2265 | 2267 | 2273 | 2274 | 2274 | 2274 | 6 | +| Δ | 14 | 13 | 15 | 12 | 8 | 8 | 8 | 0 | +| Improvement % | -1 | -1 | -1 | -1 | 0 | 0 | 0 | 0 | + +

+

+ +### Startup StringifyMacros.wasm metrics + +
Time (wall clock): results within specified thresholds, fold down for details. +

+ +| Time (wall clock) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 88 | 89 | 90 | 90 | 91 | 92 | 92 | 12 | +| eh-branch | 89 | 89 | 90 | 90 | 90 | 90 | 90 | 12 | +| Δ | 1 | 0 | 0 | 0 | -1 | -2 | -2 | 0 | +| Improvement % | -1 | 0 | 0 | 0 | 1 | 2 | 2 | 0 | + +

+

+ +
Time (total CPU): results within specified thresholds, fold down for details. +

+ +| Time (total CPU) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 88 | 89 | 90 | 90 | 91 | 92 | 92 | 12 | +| eh-branch | 89 | 89 | 90 | 90 | 90 | 90 | 90 | 12 | +| Δ | 1 | 0 | 0 | 0 | -1 | -2 | -2 | 0 | +| Improvement % | -1 | 0 | 0 | 0 | 1 | 2 | 2 | 0 | + +

+

+ +
Throughput (# / s): results within specified thresholds, fold down for details. +

+ +| Throughput (# / s) (#) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 11 | 11 | 11 | 11 | 11 | 11 | 11 | 12 | +| eh-branch | 11 | 11 | 11 | 11 | 11 | 11 | 11 | 12 | +| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +

+

+ +
Memory (resident peak): results within specified thresholds, fold down for details. +

+ +| Memory (resident peak) (M) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 74 | 74 | 76 | 77 | 78 | 78 | 78 | 12 | +| eh-branch | 74 | 75 | 77 | 82 | 82 | 82 | 82 | 12 | +| Δ | 0 | 1 | 1 | 5 | 4 | 4 | 4 | 0 | +| Improvement % | 0 | -1 | -1 | -6 | -5 | -5 | -5 | 0 | + +

+

+ +
Malloc (total): results within specified thresholds, fold down for details. +

+ +| Malloc (total) (K) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 532 | 532 | 532 | 532 | 532 | 532 | 532 | 12 | +| eh-branch | 532 | 532 | 532 | 532 | 532 | 532 | 532 | 12 | +| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +

+

+ +
Instructions: results within specified thresholds, fold down for details. +

+ +| Instructions (M) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 1245 | 1249 | 1254 | 1256 | 1260 | 1261 | 1261 | 12 | +| eh-branch | 1255 | 1258 | 1260 | 1264 | 1270 | 1270 | 1270 | 12 | +| Δ | 10 | 9 | 6 | 8 | 10 | 9 | 9 | 0 | +| Improvement % | -1 | -1 | 0 | -1 | -1 | -1 | -1 | 0 | + +

+

+ +### Startup TestingMacros.wasm metrics + +
Time (wall clock): results within specified thresholds, fold down for details. +

+ +| Time (wall clock) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 119 | 119 | 119 | 119 | 120 | 120 | 120 | 9 | +| eh-branch | 118 | 118 | 118 | 119 | 119 | 119 | 119 | 9 | +| Δ | -1 | -1 | -1 | 0 | -1 | -1 | -1 | 0 | +| Improvement % | 1 | 1 | 1 | 0 | 1 | 1 | 1 | 0 | + +

+

+ +
Time (total CPU): results within specified thresholds, fold down for details. +

+ +| Time (total CPU) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 119 | 119 | 119 | 120 | 120 | 120 | 120 | 9 | +| eh-branch | 118 | 118 | 118 | 119 | 119 | 119 | 119 | 9 | +| Δ | -1 | -1 | -1 | -1 | -1 | -1 | -1 | 0 | +| Improvement % | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | + +

+

+ +
Throughput (# / s): results within specified thresholds, fold down for details. +

+ +| Throughput (# / s) (#) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 8 | 8 | 8 | 8 | 8 | 8 | 8 | 9 | +| eh-branch | 9 | 8 | 8 | 8 | 8 | 8 | 8 | 9 | +| Δ | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| Improvement % | 12 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +

+

+ +
Memory (resident peak): results within specified thresholds, fold down for details. +

+ +| Memory (resident peak) (M) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 126 | 126 | 133 | 133 | 133 | 133 | 133 | 9 | +| eh-branch | 127 | 129 | 138 | 138 | 138 | 138 | 138 | 9 | +| Δ | 1 | 3 | 5 | 5 | 5 | 5 | 5 | 0 | +| Improvement % | -1 | -2 | -4 | -4 | -4 | -4 | -4 | 0 | + +

+

+ +
Malloc (total): results within specified thresholds, fold down for details. +

+ +| Malloc (total) (K) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 462 | 462 | 462 | 462 | 462 | 462 | 462 | 9 | +| eh-branch | 462 | 462 | 462 | 462 | 462 | 462 | 462 | 9 | +| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +

+

+ +
Instructions: results within specified thresholds, fold down for details. +

+ +| Instructions (M) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 1529 | 1533 | 1537 | 1539 | 1543 | 1543 | 1543 | 9 | +| eh-branch | 1525 | 1527 | 1533 | 1536 | 1539 | 1539 | 1539 | 9 | +| Δ | -4 | -6 | -4 | -3 | -4 | -4 | -4 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +

+

+ +## MicroBench + +### empty instantiation metrics + +
Time (wall clock): results within specified thresholds, fold down for details. +

+ +| Time (wall clock) (μs) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 26 | 27 | 27 | 27 | 27 | 31 | 54 | 10000 | +| eh-branch | 27 | 27 | 27 | 28 | 28 | 31 | 91 | 10000 | +| Δ | 1 | 0 | 0 | 1 | 1 | 0 | 37 | 0 | +| Improvement % | -4 | 0 | 0 | -4 | -4 | 0 | -69 | 0 | + +

+

+ +
Time (total CPU): results within specified thresholds, fold down for details. +

+ +| Time (total CPU) (μs) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 28 | 29 | 29 | 29 | 29 | 33 | 54 | 10000 | +| eh-branch | 28 | 29 | 29 | 29 | 30 | 34 | 66 | 10000 | +| Δ | 0 | 0 | 0 | 0 | 1 | 1 | 12 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | -3 | -3 | -22 | 0 | + +

+

+ +
Throughput (# / s): results within specified thresholds, fold down for details. +

+ +| Throughput (# / s) (K) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 38 | 37 | 37 | 37 | 37 | 32 | 19 | 10000 | +| eh-branch | 38 | 37 | 37 | 36 | 36 | 32 | 11 | 10000 | +| Δ | 0 | 0 | 0 | -1 | -1 | 0 | -8 | 0 | +| Improvement % | 0 | 0 | 0 | -3 | -3 | 0 | -42 | 0 | + +

+

+ +
Memory (resident peak): results within specified thresholds, fold down for details. +

+ +| Memory (resident peak) (K) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 9093 | 9421 | 9421 | 9421 | 9421 | 9421 | 9421 | 10000 | +| eh-branch | 9060 | 9396 | 9429 | 9437 | 9437 | 9437 | 9437 | 10000 | +| Δ | -33 | -25 | 8 | 16 | 16 | 16 | 16 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +

+

+ +
Malloc (total): results within specified thresholds, fold down for details. +

+ +| Malloc (total) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 98 | 98 | 98 | 98 | 98 | 98 | 98 | 10000 | +| eh-branch | 101 | 101 | 101 | 101 | 101 | 101 | 101 | 10000 | +| Δ | 3 | 3 | 3 | 3 | 3 | 3 | 3 | 0 | +| Improvement % | -3 | -3 | -3 | -3 | -3 | -3 | -3 | 0 | + +

+

+ +
Instructions: results within specified thresholds, fold down for details. +

+ +| Instructions (K) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 309 | 310 | 311 | 311 | 311 | 319 | 335 | 10000 | +| eh-branch | 315 | 316 | 316 | 316 | 316 | 324 | 336 | 10000 | +| Δ | 6 | 6 | 5 | 5 | 5 | 5 | 1 | 0 | +| Improvement % | -2 | -2 | -2 | -2 | -2 | -2 | 0 | 0 | + +

+

+ +## WasmParserBenchmark + +### parseWasmBenchmark metrics + +
Time (wall clock): results within specified thresholds, fold down for details. +

+ +| Time (wall clock) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 1003 | 1003 | 1003 | 1003 | 1003 | 1003 | 1003 | 1 | +| eh-branch | 907 | 908 | 908 | 908 | 908 | 908 | 908 | 2 | +| Δ | -96 | -95 | -95 | -95 | -95 | -95 | -95 | 1 | +| Improvement % | 10 | 9 | 9 | 9 | 9 | 9 | 9 | 1 | + +

+

+ +
Time (total CPU): results within specified thresholds, fold down for details. +

+ +| Time (total CPU) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 926 | 926 | 926 | 926 | 926 | 926 | 926 | 1 | +| eh-branch | 908 | 908 | 908 | 908 | 908 | 908 | 908 | 2 | +| Δ | -18 | -18 | -18 | -18 | -18 | -18 | -18 | 1 | +| Improvement % | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 1 | + +

+

+ +
Throughput (# / s): results within specified thresholds, fold down for details. +

+ +| Throughput (# / s) (#) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | +| eh-branch | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 2 | +| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | + +

+

+ +
Memory (resident peak): results within specified thresholds, fold down for details. +

+ +| Memory (resident peak) (M) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 55 | 55 | 55 | 55 | 55 | 55 | 55 | 1 | +| eh-branch | 55 | 55 | 55 | 56 | 56 | 56 | 56 | 2 | +| Δ | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | +| Improvement % | 0 | 0 | 0 | -2 | -2 | -2 | -2 | 1 | + +

+

+ +
Malloc (total): results within specified thresholds, fold down for details. +

+ +| Malloc (total) (K) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 2894 | 2894 | 2894 | 2894 | 2894 | 2894 | 2894 | 1 | +| eh-branch | 2895 | 2895 | 2895 | 2895 | 2895 | 2895 | 2895 | 2 | +| Δ | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | + +

+

+ +
Instructions: results within specified thresholds, fold down for details. +

+ +| Instructions (G) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 15 | 15 | 15 | 15 | 15 | 15 | 15 | 1 | +| eh-branch | 15 | 15 | 15 | 15 | 15 | 15 | 15 | 2 | +| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | + +

+

+ +## WishYouWereFast + +### aead_chacha20poly1305.wasm metrics + +
Time (wall clock): results within specified thresholds, fold down for details. +

+ +| Time (wall clock) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 393 | 393 | 403 | 456 | 456 | 456 | 456 | 3 | +| eh-branch | 388 | 388 | 388 | 388 | 388 | 388 | 388 | 3 | +| Δ | -5 | -5 | -15 | -68 | -68 | -68 | -68 | 0 | +| Improvement % | 1 | 1 | 4 | 15 | 15 | 15 | 15 | 0 | + +

+

+ +
Time (total CPU): results within specified thresholds, fold down for details. +

+ +| Time (total CPU) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 392 | 392 | 403 | 432 | 432 | 432 | 432 | 3 | +| eh-branch | 388 | 388 | 388 | 389 | 389 | 389 | 389 | 3 | +| Δ | -4 | -4 | -15 | -43 | -43 | -43 | -43 | 0 | +| Improvement % | 1 | 1 | 4 | 10 | 10 | 10 | 10 | 0 | + +

+

+ +
Throughput (# / s): results within specified thresholds, fold down for details. +

+ +| Throughput (# / s) (#) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 3 | 3 | 2 | 2 | 2 | 2 | 2 | 3 | +| eh-branch | 3 | 3 | 3 | 3 | 3 | 3 | 3 | 3 | +| Δ | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 0 | +| Improvement % | 0 | 0 | 50 | 50 | 50 | 50 | 50 | 0 | + +

+

+ +
Memory (resident peak): results within specified thresholds, fold down for details. +

+ +| Memory (resident peak) (M) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 12 | 12 | 14 | 14 | 14 | 14 | 14 | 3 | +| eh-branch | 12 | 12 | 13 | 13 | 13 | 13 | 13 | 3 | +| Δ | 0 | 0 | -1 | -1 | -1 | -1 | -1 | 0 | +| Improvement % | 0 | 0 | 7 | 7 | 7 | 7 | 7 | 0 | + +

+

+ +
Malloc (total): results within specified thresholds, fold down for details. +

+ +| Malloc (total) (K) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 104 | 104 | 104 | 104 | 104 | 104 | 104 | 3 | +| eh-branch | 104 | 104 | 104 | 104 | 104 | 104 | 104 | 3 | +| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +

+

+ +
Instructions: results within specified thresholds, fold down for details. +

+ +| Instructions (M) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 4765 | 4765 | 4769 | 4772 | 4772 | 4772 | 4772 | 3 | +| eh-branch | 4763 | 4763 | 4763 | 4763 | 4763 | 4763 | 4763 | 3 | +| Δ | -2 | -2 | -6 | -9 | -9 | -9 | -9 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +

+

+ +### aead_chacha20poly13052.wasm metrics + +
Time (wall clock): results within specified thresholds, fold down for details. +

+ +| Time (wall clock) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 815 | 816 | 816 | 818 | 818 | 818 | 818 | 2 | +| eh-branch | 816 | 816 | 816 | 816 | 816 | 816 | 816 | 2 | +| Δ | 1 | 0 | 0 | -2 | -2 | -2 | -2 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +

+

+ +
Time (total CPU): results within specified thresholds, fold down for details. +

+ +| Time (total CPU) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 816 | 816 | 816 | 818 | 818 | 818 | 818 | 2 | +| eh-branch | 816 | 816 | 816 | 816 | 816 | 816 | 816 | 2 | +| Δ | 0 | 0 | 0 | -2 | -2 | -2 | -2 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +

+

+ +
Throughput (# / s): results within specified thresholds, fold down for details. +

+ +| Throughput (# / s) (#) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 2 | +| eh-branch | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 2 | +| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +

+

+ +
Memory (resident peak): results within specified thresholds, fold down for details. +

+ +| Memory (resident peak) (M) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 14 | 14 | 14 | 15 | 15 | 15 | 15 | 2 | +| eh-branch | 14 | 14 | 14 | 15 | 15 | 15 | 15 | 2 | +| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +

+

+ +
Malloc (total): results within specified thresholds, fold down for details. +

+ +| Malloc (total) (K) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 65 | 65 | 65 | 65 | 65 | 65 | 65 | 2 | +| eh-branch | 65 | 65 | 65 | 65 | 65 | 65 | 65 | 2 | +| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +

+

+ +
Instructions: results within specified thresholds, fold down for details. +

+ +| Instructions (M) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 9130 | 9130 | 9130 | 9130 | 9130 | 9130 | 9130 | 2 | +| eh-branch | 9128 | 9128 | 9128 | 9128 | 9128 | 9128 | 9128 | 2 | +| Δ | -2 | -2 | -2 | -2 | -2 | -2 | -2 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +

+

+ +### aead_xchacha20poly1305.wasm metrics + +
Time (wall clock): results within specified thresholds, fold down for details. +

+ +| Time (wall clock) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 404 | 404 | 405 | 405 | 405 | 405 | 405 | 3 | +| eh-branch | 405 | 405 | 406 | 407 | 407 | 407 | 407 | 3 | +| Δ | 1 | 1 | 1 | 2 | 2 | 2 | 2 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +

+

+ +
Time (total CPU): results within specified thresholds, fold down for details. +

+ +| Time (total CPU) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 404 | 404 | 405 | 405 | 405 | 405 | 405 | 3 | +| eh-branch | 405 | 406 | 406 | 407 | 407 | 407 | 407 | 3 | +| Δ | 1 | 2 | 1 | 2 | 2 | 2 | 2 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +

+

+ +
Throughput (# / s): results within specified thresholds, fold down for details. +

+ +| Throughput (# / s) (#) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 3 | +| eh-branch | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 3 | +| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +

+

+ +
Memory (resident peak): results within specified thresholds, fold down for details. +

+ +| Memory (resident peak) (M) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 12 | 12 | 14 | 14 | 14 | 14 | 14 | 3 | +| eh-branch | 12 | 12 | 13 | 13 | 13 | 13 | 13 | 3 | +| Δ | 0 | 0 | -1 | -1 | -1 | -1 | -1 | 0 | +| Improvement % | 0 | 0 | 7 | 7 | 7 | 7 | 7 | 0 | + +

+

+ +
Malloc (total): results within specified thresholds, fold down for details. +

+ +| Malloc (total) (K) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 84 | 84 | 84 | 84 | 84 | 84 | 84 | 3 | +| eh-branch | 84 | 84 | 84 | 84 | 84 | 84 | 84 | 3 | +| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +

+

+ +
Instructions: results within specified thresholds, fold down for details. +

+ +| Instructions (M) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 4653 | 4654 | 4654 | 4654 | 4654 | 4654 | 4654 | 3 | +| eh-branch | 4652 | 4652 | 4652 | 4652 | 4652 | 4652 | 4652 | 3 | +| Δ | -1 | -2 | -2 | -2 | -2 | -2 | -2 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +

+

+ +### auth.wasm metrics + +
Time (wall clock): results within specified thresholds, fold down for details. +

+ +| Time (wall clock) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 97 | 97 | 98 | 99 | 99 | 99 | 99 | 11 | +| eh-branch | 97 | 98 | 98 | 98 | 98 | 98 | 98 | 11 | +| Δ | 0 | 1 | 0 | -1 | -1 | -1 | -1 | 0 | +| Improvement % | 0 | -1 | 0 | 1 | 1 | 1 | 1 | 0 | + +

+

+ +
Time (total CPU): results within specified thresholds, fold down for details. +

+ +| Time (total CPU) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 97 | 98 | 98 | 99 | 99 | 99 | 99 | 11 | +| eh-branch | 97 | 98 | 98 | 98 | 98 | 98 | 98 | 11 | +| Δ | 0 | 0 | 0 | -1 | -1 | -1 | -1 | 0 | +| Improvement % | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 0 | + +

+

+ +
Throughput (# / s): results within specified thresholds, fold down for details. +

+ +| Throughput (# / s) (#) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 10 | 10 | 10 | 10 | 10 | 10 | 10 | 11 | +| eh-branch | 10 | 10 | 10 | 10 | 10 | 10 | 10 | 11 | +| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +

+

+ +| Memory (resident peak) (M) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 12 | 13 | 13 | 13 | 13 | 13 | 13 | 11 | +| eh-branch | 12 | 13 | 13 | 13 | 13 | 13 | 13 | 11 | +| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +
Malloc (total): results within specified thresholds, fold down for details. +

+ +| Malloc (total) (K) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 35 | 35 | 35 | 35 | 35 | 35 | 35 | 11 | +| eh-branch | 35 | 35 | 35 | 35 | 35 | 35 | 35 | 11 | +| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +

+

+ +
Instructions: results within specified thresholds, fold down for details. +

+ +| Instructions (M) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 1511 | 1511 | 1511 | 1511 | 1511 | 1511 | 1511 | 11 | +| eh-branch | 1512 | 1513 | 1513 | 1513 | 1513 | 1513 | 1513 | 11 | +| Δ | 1 | 2 | 2 | 2 | 2 | 2 | 2 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +

+

+ +### auth2.wasm metrics + +
Time (wall clock): results within specified thresholds, fold down for details. +

+ +| Time (wall clock) (μs) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 7715 | 7741 | 7758 | 7782 | 7807 | 8016 | 8040 | 128 | +| eh-branch | 7737 | 7770 | 7786 | 7811 | 7856 | 8065 | 8066 | 128 | +| Δ | 22 | 29 | 28 | 29 | 49 | 49 | 26 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | -1 | -1 | 0 | 0 | + +

+

+ +
Time (total CPU): results within specified thresholds, fold down for details. +

+ +| Time (total CPU) (μs) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 7717 | 7746 | 7762 | 7786 | 7811 | 8012 | 8043 | 128 | +| eh-branch | 7743 | 7774 | 7791 | 7815 | 7848 | 8061 | 8068 | 128 | +| Δ | 26 | 28 | 29 | 29 | 37 | 49 | 25 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | -1 | 0 | 0 | + +

+

+ +
Throughput (# / s): results within specified thresholds, fold down for details. +

+ +| Throughput (# / s) (#) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 130 | 129 | 129 | 128 | 128 | 125 | 124 | 128 | +| eh-branch | 129 | 129 | 128 | 128 | 127 | 124 | 124 | 128 | +| Δ | -1 | 0 | -1 | 0 | -1 | -1 | 0 | 0 | +| Improvement % | -1 | 0 | -1 | 0 | -1 | -1 | 0 | 0 | + +

+

+ +| Memory (resident peak) (M) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 11 | 13 | 14 | 14 | 14 | 14 | 14 | 128 | +| eh-branch | 11 | 14 | 14 | 14 | 14 | 14 | 14 | 128 | +| Δ | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | +| Improvement % | 0 | -8 | 0 | 0 | 0 | 0 | 0 | 0 | + +
Malloc (total): results within specified thresholds, fold down for details. +

+ +| Malloc (total) (K) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 24 | 24 | 24 | 24 | 24 | 24 | 24 | 128 | +| eh-branch | 24 | 24 | 24 | 24 | 24 | 24 | 24 | 128 | +| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +

+

+ +
Instructions: results within specified thresholds, fold down for details. +

+ +| Instructions (M) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 118 | 118 | 118 | 118 | 118 | 119 | 120 | 128 | +| eh-branch | 118 | 118 | 118 | 118 | 118 | 119 | 120 | 128 | +| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +

+

+ +### auth3.wasm metrics + +
Time (wall clock): results within specified thresholds, fold down for details. +

+ +| Time (wall clock) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 13 | 13 | 13 | 13 | 14 | 17 | 17 | 77 | +| eh-branch | 13 | 13 | 13 | 13 | 13 | 13 | 13 | 78 | +| Δ | 0 | 0 | 0 | 0 | -1 | -4 | -4 | 1 | +| Improvement % | 0 | 0 | 0 | 0 | 7 | 24 | 24 | 1 | + +

+

+ +
Time (total CPU): results within specified thresholds, fold down for details. +

+ +| Time (total CPU) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 13 | 13 | 13 | 13 | 14 | 16 | 16 | 77 | +| eh-branch | 13 | 13 | 13 | 13 | 13 | 13 | 13 | 78 | +| Δ | 0 | 0 | 0 | 0 | -1 | -3 | -3 | 1 | +| Improvement % | 0 | 0 | 0 | 0 | 7 | 19 | 19 | 1 | + +

+

+ +
Throughput (# / s): results within specified thresholds, fold down for details. +

+ +| Throughput (# / s) (#) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 80 | 79 | 79 | 77 | 72 | 59 | 59 | 77 | +| eh-branch | 79 | 79 | 78 | 78 | 78 | 75 | 75 | 78 | +| Δ | -1 | 0 | -1 | 1 | 6 | 16 | 16 | 1 | +| Improvement % | -1 | 0 | -1 | 1 | 8 | 27 | 27 | 1 | + +

+

+ +| Memory (resident peak) (M) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 12 | 13 | 13 | 15 | 15 | 15 | 15 | 77 | +| eh-branch | 12 | 13 | 13 | 13 | 13 | 13 | 13 | 78 | +| Δ | 0 | 0 | 0 | -2 | -2 | -2 | -2 | 1 | +| Improvement % | 0 | 0 | 0 | 13 | 13 | 13 | 13 | 1 | + +
Malloc (total): results within specified thresholds, fold down for details. +

+ +| Malloc (total) (K) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 24 | 24 | 24 | 24 | 24 | 24 | 24 | 77 | +| eh-branch | 24 | 24 | 24 | 24 | 24 | 24 | 24 | 78 | +| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | + +

+

+ +
Instructions: results within specified thresholds, fold down for details. +

+ +| Instructions (M) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 192 | 192 | 192 | 192 | 192 | 194 | 194 | 77 | +| eh-branch | 193 | 193 | 193 | 193 | 193 | 195 | 195 | 78 | +| Δ | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | +| Improvement % | -1 | -1 | -1 | -1 | -1 | -1 | -1 | 1 | + +

+

+ +### auth6.wasm metrics + +
Time (wall clock): results within specified thresholds, fold down for details. +

+ +| Time (wall clock) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 10 | 10 | 10 | 11 | 11 | 11 | 11 | 95 | +| eh-branch | 10 | 10 | 10 | 10 | 11 | 11 | 11 | 96 | +| Δ | 0 | 0 | 0 | -1 | 0 | 0 | 0 | 1 | +| Improvement % | 0 | 0 | 0 | 9 | 0 | 0 | 0 | 1 | + +

+

+ +
Time (total CPU): results within specified thresholds, fold down for details. +

+ +| Time (total CPU) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 10 | 10 | 10 | 11 | 11 | 11 | 11 | 95 | +| eh-branch | 10 | 10 | 10 | 10 | 11 | 11 | 11 | 96 | +| Δ | 0 | 0 | 0 | -1 | 0 | 0 | 0 | 1 | +| Improvement % | 0 | 0 | 0 | 9 | 0 | 0 | 0 | 1 | + +

+

+ +
Throughput (# / s): results within specified thresholds, fold down for details. +

+ +| Throughput (# / s) (#) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 96 | 96 | 96 | 95 | 95 | 93 | 93 | 95 | +| eh-branch | 96 | 96 | 96 | 95 | 95 | 93 | 93 | 96 | +| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | + +

+

+ +| Memory (resident peak) (M) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 11 | 13 | 13 | 13 | 13 | 13 | 13 | 95 | +| eh-branch | 11 | 13 | 13 | 14 | 14 | 14 | 14 | 96 | +| Δ | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | +| Improvement % | 0 | 0 | 0 | -8 | -8 | -8 | -8 | 1 | + +
Malloc (total): results within specified thresholds, fold down for details. +

+ +| Malloc (total) (K) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 24 | 24 | 24 | 24 | 24 | 24 | 24 | 95 | +| eh-branch | 24 | 24 | 24 | 24 | 24 | 24 | 24 | 96 | +| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | + +

+

+ +
Instructions: results within specified thresholds, fold down for details. +

+ +| Instructions (M) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 162 | 162 | 162 | 162 | 162 | 164 | 164 | 95 | +| eh-branch | 161 | 161 | 162 | 162 | 162 | 164 | 164 | 96 | +| Δ | -1 | -1 | 0 | 0 | 0 | 0 | 0 | 1 | +| Improvement % | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | + +

+

+ +### box.wasm metrics + +
Time (wall clock): results within specified thresholds, fold down for details. +

+ +| Time (wall clock) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 1407 | 1407 | 1407 | 1407 | 1407 | 1407 | 1407 | 1 | +| eh-branch | 1393 | 1393 | 1393 | 1393 | 1393 | 1393 | 1393 | 1 | +| Δ | -14 | -14 | -14 | -14 | -14 | -14 | -14 | 0 | +| Improvement % | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | + +

+

+ +
Time (total CPU): results within specified thresholds, fold down for details. +

+ +| Time (total CPU) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 1408 | 1408 | 1408 | 1408 | 1408 | 1408 | 1408 | 1 | +| eh-branch | 1393 | 1393 | 1393 | 1393 | 1393 | 1393 | 1393 | 1 | +| Δ | -15 | -15 | -15 | -15 | -15 | -15 | -15 | 0 | +| Improvement % | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | + +

+

+ +
Throughput (# / s): results within specified thresholds, fold down for details. +

+ +| Throughput (# / s) (#) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | +| eh-branch | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | +| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +

+

+ +| Memory (resident peak) (M) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 13 | 13 | 13 | 13 | 13 | 13 | 13 | 1 | +| eh-branch | 13 | 13 | 13 | 13 | 13 | 13 | 13 | 1 | +| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +
Malloc (total): results within specified thresholds, fold down for details. +

+ +| Malloc (total) (K) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 57 | 57 | 57 | 57 | 57 | 57 | 57 | 1 | +| eh-branch | 57 | 57 | 57 | 57 | 57 | 57 | 57 | 1 | +| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +

+

+ +
Instructions: results within specified thresholds, fold down for details. +

+ +| Instructions (G) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 16 | 16 | 16 | 16 | 16 | 16 | 16 | 1 | +| eh-branch | 16 | 16 | 16 | 16 | 16 | 16 | 16 | 1 | +| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +

+

+ +### box2.wasm metrics + +
Time (wall clock): results within specified thresholds, fold down for details. +

+ +| Time (wall clock) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 1409 | 1409 | 1409 | 1409 | 1409 | 1409 | 1409 | 1 | +| eh-branch | 1397 | 1397 | 1397 | 1397 | 1397 | 1397 | 1397 | 1 | +| Δ | -12 | -12 | -12 | -12 | -12 | -12 | -12 | 0 | +| Improvement % | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | + +

+

+ +
Time (total CPU): results within specified thresholds, fold down for details. +

+ +| Time (total CPU) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 1409 | 1409 | 1409 | 1409 | 1409 | 1409 | 1409 | 1 | +| eh-branch | 1397 | 1397 | 1397 | 1397 | 1397 | 1397 | 1397 | 1 | +| Δ | -12 | -12 | -12 | -12 | -12 | -12 | -12 | 0 | +| Improvement % | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | + +

+

+ +
Throughput (# / s): results within specified thresholds, fold down for details. +

+ +| Throughput (# / s) (#) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | +| eh-branch | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | +| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +

+

+ +| Memory (resident peak) (M) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 13 | 13 | 13 | 13 | 13 | 13 | 13 | 1 | +| eh-branch | 13 | 13 | 13 | 13 | 13 | 13 | 13 | 1 | +| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +
Malloc (total): results within specified thresholds, fold down for details. +

+ +| Malloc (total) (K) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 58 | 58 | 58 | 58 | 58 | 58 | 58 | 1 | +| eh-branch | 58 | 58 | 58 | 58 | 58 | 58 | 58 | 1 | +| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +

+

+ +
Instructions: results within specified thresholds, fold down for details. +

+ +| Instructions (G) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 16 | 16 | 16 | 16 | 16 | 16 | 16 | 1 | +| eh-branch | 16 | 16 | 16 | 16 | 16 | 16 | 16 | 1 | +| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +

+

+ +### box_easy.wasm metrics + +
Time (wall clock): results within specified thresholds, fold down for details. +

+ +| Time (wall clock) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 2794 | 2794 | 2794 | 2794 | 2794 | 2794 | 2794 | 1 | +| eh-branch | 2775 | 2775 | 2775 | 2775 | 2775 | 2775 | 2775 | 1 | +| Δ | -19 | -19 | -19 | -19 | -19 | -19 | -19 | 0 | +| Improvement % | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | + +

+

+ +
Time (total CPU): results within specified thresholds, fold down for details. +

+ +| Time (total CPU) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 2795 | 2795 | 2795 | 2795 | 2795 | 2795 | 2795 | 1 | +| eh-branch | 2776 | 2776 | 2776 | 2776 | 2776 | 2776 | 2776 | 1 | +| Δ | -19 | -19 | -19 | -19 | -19 | -19 | -19 | 0 | +| Improvement % | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | + +

+

+ +
Memory (resident peak): results within specified thresholds, fold down for details. +

+ +| Memory (resident peak) (M) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 13 | 13 | 13 | 13 | 13 | 13 | 13 | 1 | +| eh-branch | 13 | 13 | 13 | 13 | 13 | 13 | 13 | 1 | +| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +

+

+ +
Malloc (total): results within specified thresholds, fold down for details. +

+ +| Malloc (total) (K) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 60 | 60 | 60 | 60 | 60 | 60 | 60 | 1 | +| eh-branch | 60 | 60 | 60 | 60 | 60 | 60 | 60 | 1 | +| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +

+

+ +
Instructions: results within specified thresholds, fold down for details. +

+ +| Instructions (G) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 31 | 31 | 31 | 31 | 31 | 31 | 31 | 1 | +| eh-branch | 31 | 31 | 31 | 31 | 31 | 31 | 31 | 1 | +| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +

+

+ +### box_seal.wasm metrics + +
Time (wall clock): results within specified thresholds, fold down for details. +

+ +| Time (wall clock) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 7506 | 7506 | 7506 | 7506 | 7506 | 7506 | 7506 | 1 | +| eh-branch | 7462 | 7462 | 7462 | 7462 | 7462 | 7462 | 7462 | 1 | +| Δ | -44 | -44 | -44 | -44 | -44 | -44 | -44 | 0 | +| Improvement % | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | + +

+

+ +
Time (total CPU): results within specified thresholds, fold down for details. +

+ +| Time (total CPU) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 7506 | 7506 | 7506 | 7506 | 7506 | 7506 | 7506 | 1 | +| eh-branch | 7465 | 7465 | 7465 | 7465 | 7465 | 7465 | 7465 | 1 | +| Δ | -41 | -41 | -41 | -41 | -41 | -41 | -41 | 0 | +| Improvement % | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | + +

+

+ +
Memory (resident peak): results within specified thresholds, fold down for details. +

+ +| Memory (resident peak) (M) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 13 | 13 | 13 | 13 | 13 | 13 | 13 | 1 | +| eh-branch | 13 | 13 | 13 | 13 | 13 | 13 | 13 | 1 | +| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +

+

+ +
Malloc (total): results within specified thresholds, fold down for details. +

+ +| Malloc (total) (K) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 199 | 199 | 199 | 199 | 199 | 199 | 199 | 1 | +| eh-branch | 199 | 199 | 199 | 199 | 199 | 199 | 199 | 1 | +| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +

+

+ +
Instructions: results within specified thresholds, fold down for details. +

+ +| Instructions (G) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 84 | 84 | 84 | 84 | 84 | 84 | 84 | 1 | +| eh-branch | 84 | 84 | 84 | 84 | 84 | 84 | 84 | 1 | +| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +

+

+ +### box_seed.wasm metrics + +
Time (wall clock): results within specified thresholds, fold down for details. +

+ +| Time (wall clock) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 232 | 232 | 233 | 233 | 241 | 241 | 241 | 5 | +| eh-branch | 231 | 231 | 231 | 231 | 231 | 231 | 231 | 5 | +| Δ | -1 | -1 | -2 | -2 | -10 | -10 | -10 | 0 | +| Improvement % | 0 | 0 | 1 | 1 | 4 | 4 | 4 | 0 | + +

+

+ +
Time (total CPU): results within specified thresholds, fold down for details. +

+ +| Time (total CPU) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 232 | 232 | 233 | 233 | 234 | 234 | 234 | 5 | +| eh-branch | 231 | 231 | 231 | 231 | 231 | 231 | 231 | 5 | +| Δ | -1 | -1 | -2 | -2 | -3 | -3 | -3 | 0 | +| Improvement % | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 0 | + +

+

+ +
Throughput (# / s): results within specified thresholds, fold down for details. +

+ +| Throughput (# / s) (#) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 4 | 4 | 4 | 4 | 4 | 4 | 4 | 5 | +| eh-branch | 4 | 4 | 4 | 4 | 4 | 4 | 4 | 5 | +| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +

+

+ +| Memory (resident peak) (M) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 13 | 13 | 13 | 13 | 13 | 13 | 13 | 5 | +| eh-branch | 13 | 13 | 13 | 13 | 13 | 13 | 13 | 5 | +| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +
Malloc (total): results within specified thresholds, fold down for details. +

+ +| Malloc (total) (K) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 71 | 71 | 71 | 71 | 71 | 71 | 71 | 5 | +| eh-branch | 71 | 71 | 71 | 71 | 71 | 71 | 71 | 5 | +| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +

+

+ +
Instructions: results within specified thresholds, fold down for details. +

+ +| Instructions (M) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 2759 | 2760 | 2760 | 2760 | 2760 | 2760 | 2760 | 5 | +| eh-branch | 2759 | 2760 | 2760 | 2760 | 2760 | 2760 | 2760 | 5 | +| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +

+

+ +### chacha20.wasm metrics + +
Time (wall clock): results within specified thresholds, fold down for details. +

+ +| Time (wall clock) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 2185 | 2185 | 2185 | 2185 | 2185 | 2185 | 2185 | 1 | +| eh-branch | 2183 | 2183 | 2183 | 2183 | 2183 | 2183 | 2183 | 1 | +| Δ | -2 | -2 | -2 | -2 | -2 | -2 | -2 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +

+

+ +
Time (total CPU): results within specified thresholds, fold down for details. +

+ +| Time (total CPU) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 2186 | 2186 | 2186 | 2186 | 2186 | 2186 | 2186 | 1 | +| eh-branch | 2183 | 2183 | 2183 | 2183 | 2183 | 2183 | 2183 | 1 | +| Δ | -3 | -3 | -3 | -3 | -3 | -3 | -3 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +

+

+ +| Memory (resident peak) (M) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 1 | +| eh-branch | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 1 | +| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +
Malloc (total): results within specified thresholds, fold down for details. +

+ +| Malloc (total) (K) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 48 | 48 | 48 | 48 | 48 | 48 | 48 | 1 | +| eh-branch | 48 | 48 | 48 | 48 | 48 | 48 | 48 | 1 | +| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +

+

+ +
Instructions: results within specified thresholds, fold down for details. +

+ +| Instructions (G) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 20 | 20 | 20 | 20 | 20 | 20 | 20 | 1 | +| eh-branch | 20 | 20 | 20 | 20 | 20 | 20 | 20 | 1 | +| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +

+

+ +### codecs.wasm metrics + +
Time (wall clock): results within specified thresholds, fold down for details. +

+ +| Time (wall clock) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 3435 | 3435 | 3435 | 3435 | 3435 | 3435 | 3435 | 1 | +| eh-branch | 3435 | 3435 | 3435 | 3435 | 3435 | 3435 | 3435 | 1 | +| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +

+

+ +
Time (total CPU): results within specified thresholds, fold down for details. +

+ +| Time (total CPU) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 3436 | 3436 | 3436 | 3436 | 3436 | 3436 | 3436 | 1 | +| eh-branch | 3436 | 3436 | 3436 | 3436 | 3436 | 3436 | 3436 | 1 | +| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +

+

+ +| Memory (resident peak) (M) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 1 | +| eh-branch | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 1 | +| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +
Malloc (total): results within specified thresholds, fold down for details. +

+ +| Malloc (total) (K) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 560 | 560 | 560 | 560 | 560 | 560 | 560 | 1 | +| eh-branch | 561 | 561 | 561 | 561 | 561 | 561 | 561 | 1 | +| Δ | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +

+

+ +
Instructions: results within specified thresholds, fold down for details. +

+ +| Instructions (G) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 37 | 37 | 37 | 37 | 37 | 37 | 37 | 1 | +| eh-branch | 37 | 37 | 37 | 37 | 37 | 37 | 37 | 1 | +| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +

+

+ +### generichash.wasm metrics + +
Time (wall clock): results within specified thresholds, fold down for details. +

+ +| Time (wall clock) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 1771 | 1771 | 1771 | 1771 | 1771 | 1771 | 1771 | 1 | +| eh-branch | 1760 | 1760 | 1760 | 1760 | 1760 | 1760 | 1760 | 1 | +| Δ | -11 | -11 | -11 | -11 | -11 | -11 | -11 | 0 | +| Improvement % | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | + +

+

+ +
Time (total CPU): results within specified thresholds, fold down for details. +

+ +| Time (total CPU) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 1771 | 1771 | 1771 | 1771 | 1771 | 1771 | 1771 | 1 | +| eh-branch | 1760 | 1760 | 1760 | 1760 | 1760 | 1760 | 1760 | 1 | +| Δ | -11 | -11 | -11 | -11 | -11 | -11 | -11 | 0 | +| Improvement % | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | + +

+

+ +
Throughput (# / s): results within specified thresholds, fold down for details. +

+ +| Throughput (# / s) (#) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | +| eh-branch | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | +| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +

+

+ +| Memory (resident peak) (M) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 14 | 14 | 14 | 14 | 14 | 14 | 14 | 1 | +| eh-branch | 14 | 14 | 14 | 14 | 14 | 14 | 14 | 1 | +| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +
Malloc (total): results within specified thresholds, fold down for details. +

+ +| Malloc (total) (K) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 224 | 224 | 224 | 224 | 224 | 224 | 224 | 1 | +| eh-branch | 224 | 224 | 224 | 224 | 224 | 224 | 224 | 1 | +| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +

+

+ +
Instructions: results within specified thresholds, fold down for details. +

+ +| Instructions (G) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 19 | 19 | 19 | 19 | 19 | 19 | 19 | 1 | +| eh-branch | 19 | 19 | 19 | 19 | 19 | 19 | 19 | 1 | +| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +

+

+ +### generichash2.wasm metrics + +
Time (wall clock): results within specified thresholds, fold down for details. +

+ +| Time (wall clock) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 127 | 127 | 127 | 127 | 127 | 127 | 127 | 8 | +| eh-branch | 127 | 127 | 127 | 127 | 128 | 128 | 128 | 8 | +| Δ | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | -1 | -1 | -1 | 0 | + +

+

+ +
Time (total CPU): results within specified thresholds, fold down for details. +

+ +| Time (total CPU) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 127 | 127 | 127 | 127 | 128 | 128 | 128 | 8 | +| eh-branch | 127 | 127 | 127 | 127 | 128 | 128 | 128 | 8 | +| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +

+

+ +
Throughput (# / s): results within specified thresholds, fold down for details. +

+ +| Throughput (# / s) (#) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 8 | 8 | 8 | 8 | 8 | 8 | 8 | 8 | +| eh-branch | 8 | 8 | 8 | 8 | 8 | 8 | 8 | 8 | +| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +

+

+ +
Memory (resident peak): results within specified thresholds, fold down for details. +

+ +| Memory (resident peak) (M) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 12 | 13 | 13 | 13 | 13 | 13 | 13 | 8 | +| eh-branch | 12 | 13 | 13 | 13 | 13 | 13 | 13 | 8 | +| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +

+

+ +
Malloc (total): results within specified thresholds, fold down for details. +

+ +| Malloc (total) (K) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 70 | 70 | 70 | 70 | 70 | 70 | 70 | 8 | +| eh-branch | 70 | 70 | 70 | 70 | 70 | 70 | 70 | 8 | +| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +

+

+ +
Instructions: results within specified thresholds, fold down for details. +

+ +| Instructions (M) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 1370 | 1370 | 1370 | 1370 | 1370 | 1370 | 1370 | 8 | +| eh-branch | 1370 | 1370 | 1370 | 1370 | 1370 | 1370 | 1370 | 8 | +| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +

+

+ +### generichash3.wasm metrics + +
Time (wall clock): results within specified thresholds, fold down for details. +

+ +| Time (wall clock) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 127 | 127 | 127 | 127 | 128 | 128 | 128 | 8 | +| eh-branch | 126 | 126 | 127 | 127 | 127 | 127 | 127 | 8 | +| Δ | -1 | -1 | 0 | 0 | -1 | -1 | -1 | 0 | +| Improvement % | 1 | 1 | 0 | 0 | 1 | 1 | 1 | 0 | + +

+

+ +
Time (total CPU): results within specified thresholds, fold down for details. +

+ +| Time (total CPU) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 127 | 127 | 127 | 127 | 128 | 128 | 128 | 8 | +| eh-branch | 126 | 126 | 127 | 127 | 127 | 127 | 127 | 8 | +| Δ | -1 | -1 | 0 | 0 | -1 | -1 | -1 | 0 | +| Improvement % | 1 | 1 | 0 | 0 | 1 | 1 | 1 | 0 | + +

+

+ +
Throughput (# / s): results within specified thresholds, fold down for details. +

+ +| Throughput (# / s) (#) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 8 | 8 | 8 | 8 | 8 | 8 | 8 | 8 | +| eh-branch | 8 | 8 | 8 | 8 | 8 | 8 | 8 | 8 | +| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +

+

+ +| Memory (resident peak) (M) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 12 | 13 | 13 | 13 | 13 | 13 | 13 | 8 | +| eh-branch | 12 | 13 | 13 | 13 | 13 | 13 | 13 | 8 | +| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +
Malloc (total): results within specified thresholds, fold down for details. +

+ +| Malloc (total) (K) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 74 | 74 | 74 | 74 | 74 | 74 | 74 | 8 | +| eh-branch | 74 | 74 | 74 | 74 | 74 | 74 | 74 | 8 | +| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +

+

+ +
Instructions: results within specified thresholds, fold down for details. +

+ +| Instructions (M) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 1408 | 1409 | 1409 | 1409 | 1409 | 1409 | 1409 | 8 | +| eh-branch | 1408 | 1408 | 1408 | 1408 | 1409 | 1409 | 1409 | 8 | +| Δ | 0 | -1 | -1 | -1 | 0 | 0 | 0 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +

+

+ +### hash.wasm metrics + +
Time (wall clock): results within specified thresholds, fold down for details. +

+ +| Time (wall clock) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 14 | 14 | 14 | 14 | 14 | 14 | 14 | 72 | +| eh-branch | 14 | 14 | 14 | 14 | 14 | 14 | 14 | 72 | +| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +

+

+ +
Time (total CPU): results within specified thresholds, fold down for details. +

+ +| Time (total CPU) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 14 | 14 | 14 | 14 | 14 | 14 | 14 | 72 | +| eh-branch | 14 | 14 | 14 | 14 | 14 | 14 | 14 | 72 | +| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +

+

+ +
Throughput (# / s): results within specified thresholds, fold down for details. +

+ +| Throughput (# / s) (#) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 72 | 72 | 72 | 72 | 72 | 70 | 70 | 72 | +| eh-branch | 72 | 72 | 72 | 72 | 72 | 71 | 71 | 72 | +| Δ | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | + +

+

+ +| Memory (resident peak) (M) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 12 | 13 | 13 | 13 | 14 | 14 | 14 | 72 | +| eh-branch | 12 | 13 | 13 | 13 | 13 | 13 | 13 | 72 | +| Δ | 0 | 0 | 0 | 0 | -1 | -1 | -1 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 7 | 7 | 7 | 0 | + +
Malloc (total): results within specified thresholds, fold down for details. +

+ +| Malloc (total) (K) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 29 | 29 | 29 | 29 | 29 | 29 | 29 | 72 | +| eh-branch | 29 | 29 | 29 | 29 | 29 | 29 | 29 | 72 | +| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +

+

+ +
Instructions: results within specified thresholds, fold down for details. +

+ +| Instructions (M) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 210 | 210 | 210 | 210 | 210 | 212 | 212 | 72 | +| eh-branch | 210 | 210 | 210 | 210 | 210 | 212 | 212 | 72 | +| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +

+

+ +### hash3.wasm metrics + +
Time (wall clock): results within specified thresholds, fold down for details. +

+ +| Time (wall clock) (μs) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 4673 | 4698 | 4714 | 4739 | 4796 | 4977 | 5032 | 210 | +| eh-branch | 4760 | 4788 | 4809 | 4829 | 4862 | 5059 | 5088 | 206 | +| Δ | 87 | 90 | 95 | 90 | 66 | 82 | 56 | -4 | +| Improvement % | -2 | -2 | -2 | -2 | -1 | -2 | -1 | -4 | + +

+

+ +
Time (total CPU): results within specified thresholds, fold down for details. +

+ +| Time (total CPU) (μs) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 4674 | 4698 | 4714 | 4739 | 4805 | 4973 | 5031 | 210 | +| eh-branch | 4761 | 4792 | 4809 | 4833 | 4862 | 5063 | 5069 | 206 | +| Δ | 87 | 94 | 95 | 94 | 57 | 90 | 38 | -4 | +| Improvement % | -2 | -2 | -2 | -2 | -1 | -2 | -1 | -4 | + +

+

+ +
Throughput (# / s): results within specified thresholds, fold down for details. +

+ +| Throughput (# / s) (#) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 214 | 213 | 212 | 211 | 209 | 201 | 199 | 210 | +| eh-branch | 210 | 209 | 208 | 207 | 206 | 198 | 197 | 206 | +| Δ | -4 | -4 | -4 | -4 | -3 | -3 | -2 | -4 | +| Improvement % | -2 | -2 | -2 | -2 | -1 | -1 | -1 | -4 | + +

+

+ +| Memory (resident peak) (M) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 11 | 13 | 14 | 14 | 14 | 14 | 14 | 210 | +| eh-branch | 11 | 13 | 14 | 14 | 14 | 14 | 14 | 206 | +| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -4 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -4 | + +
Malloc (total): results within specified thresholds, fold down for details. +

+ +| Malloc (total) (K) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 23 | 23 | 23 | 23 | 23 | 23 | 23 | 210 | +| eh-branch | 23 | 23 | 23 | 23 | 23 | 23 | 23 | 206 | +| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -4 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -4 | + +

+

+ +
Instructions: results within specified thresholds, fold down for details. +

+ +| Instructions (M) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 72 | 72 | 72 | 72 | 72 | 73 | 74 | 210 | +| eh-branch | 73 | 73 | 73 | 73 | 73 | 75 | 76 | 206 | +| Δ | 1 | 1 | 1 | 1 | 1 | 2 | 2 | -4 | +| Improvement % | -1 | -1 | -1 | -1 | -1 | -3 | -3 | -4 | + +

+

+ +### kdf.wasm metrics + +
Time (wall clock): results within specified thresholds, fold down for details. +

+ +| Time (wall clock) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 85 | 86 | 86 | 86 | 86 | 86 | 86 | 12 | +| eh-branch | 85 | 86 | 86 | 86 | 86 | 87 | 87 | 12 | +| Δ | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | -1 | -1 | 0 | + +

+

+ +
Time (total CPU): results within specified thresholds, fold down for details. +

+ +| Time (total CPU) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 85 | 86 | 86 | 86 | 86 | 86 | 86 | 12 | +| eh-branch | 85 | 86 | 86 | 86 | 86 | 87 | 87 | 12 | +| Δ | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | -1 | -1 | 0 | + +

+

+ +
Throughput (# / s): results within specified thresholds, fold down for details. +

+ +| Throughput (# / s) (#) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 12 | +| eh-branch | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 12 | +| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +

+

+ +| Memory (resident peak) (M) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 12 | 13 | 13 | 13 | 13 | 13 | 13 | 12 | +| eh-branch | 12 | 13 | 13 | 13 | 13 | 13 | 13 | 12 | +| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +
Malloc (total): results within specified thresholds, fold down for details. +

+ +| Malloc (total) (K) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 67 | 67 | 67 | 67 | 67 | 67 | 67 | 12 | +| eh-branch | 67 | 67 | 67 | 67 | 67 | 67 | 67 | 12 | +| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +

+

+ +
Instructions: results within specified thresholds, fold down for details. +

+ +| Instructions (M) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 1066 | 1066 | 1066 | 1066 | 1066 | 1066 | 1066 | 12 | +| eh-branch | 1066 | 1067 | 1067 | 1067 | 1067 | 1067 | 1067 | 12 | +| Δ | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +

+

+ +### kdf_hkdf.wasm metrics + +
Time (wall clock): results within specified thresholds, fold down for details. +

+ +| Time (wall clock) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 2389 | 2389 | 2389 | 2389 | 2389 | 2389 | 2389 | 1 | +| eh-branch | 2393 | 2393 | 2393 | 2393 | 2393 | 2393 | 2393 | 1 | +| Δ | 4 | 4 | 4 | 4 | 4 | 4 | 4 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +

+

+ +
Time (total CPU): results within specified thresholds, fold down for details. +

+ +| Time (total CPU) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 2390 | 2390 | 2390 | 2390 | 2390 | 2390 | 2390 | 1 | +| eh-branch | 2394 | 2394 | 2394 | 2394 | 2394 | 2394 | 2394 | 1 | +| Δ | 4 | 4 | 4 | 4 | 4 | 4 | 4 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +

+

+ +
Memory (resident peak): results within specified thresholds, fold down for details. +

+ +| Memory (resident peak) (M) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 1 | +| eh-branch | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 1 | +| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +

+

+ +
Malloc (total): results within specified thresholds, fold down for details. +

+ +| Malloc (total) (K) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 91 | 91 | 91 | 91 | 91 | 91 | 91 | 1 | +| eh-branch | 91 | 91 | 91 | 91 | 91 | 91 | 91 | 1 | +| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +

+

+ +
Instructions: results within specified thresholds, fold down for details. +

+ +| Instructions (G) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 37 | 37 | 37 | 37 | 37 | 37 | 37 | 1 | +| eh-branch | 37 | 37 | 37 | 37 | 37 | 37 | 37 | 1 | +| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +

+

+ +### keygen.wasm metrics + +
Time (wall clock): results within specified thresholds, fold down for details. +

+ +| Time (wall clock) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 35 | 35 | 35 | 35 | 35 | 36 | 36 | 29 | +| eh-branch | 35 | 35 | 35 | 36 | 36 | 36 | 36 | 29 | +| Δ | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | +| Improvement % | 0 | 0 | 0 | -3 | -3 | 0 | 0 | 0 | + +

+

+ +
Time (total CPU): results within specified thresholds, fold down for details. +

+ +| Time (total CPU) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 35 | 35 | 35 | 35 | 36 | 36 | 36 | 29 | +| eh-branch | 35 | 35 | 35 | 36 | 36 | 36 | 36 | 29 | +| Δ | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | +| Improvement % | 0 | 0 | 0 | -3 | 0 | 0 | 0 | 0 | + +

+

+ +
Throughput (# / s): results within specified thresholds, fold down for details. +

+ +| Throughput (# / s) (#) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 28 | 28 | 28 | 28 | 28 | 28 | 28 | 29 | +| eh-branch | 28 | 28 | 28 | 28 | 28 | 28 | 28 | 29 | +| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +

+

+ +| Memory (resident peak) (M) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 12 | 13 | 13 | 13 | 13 | 13 | 13 | 29 | +| eh-branch | 12 | 13 | 13 | 13 | 13 | 13 | 13 | 29 | +| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +
Malloc (total): results within specified thresholds, fold down for details. +

+ +| Malloc (total) (K) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 28 | 28 | 28 | 28 | 28 | 28 | 28 | 29 | +| eh-branch | 28 | 28 | 28 | 28 | 28 | 28 | 28 | 29 | +| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +

+

+ +
Instructions: results within specified thresholds, fold down for details. +

+ +| Instructions (M) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 376 | 377 | 377 | 377 | 377 | 378 | 378 | 29 | +| eh-branch | 377 | 377 | 377 | 377 | 378 | 378 | 378 | 29 | +| Δ | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +

+

+ +### onetimeauth.wasm metrics + +
Time (wall clock): results within specified thresholds, fold down for details. +

+ +| Time (wall clock) (μs) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 4828 | 4846 | 4862 | 4887 | 4944 | 5087 | 5124 | 204 | +| eh-branch | 4819 | 4837 | 4850 | 4870 | 4891 | 5059 | 5104 | 204 | +| Δ | -9 | -9 | -12 | -17 | -53 | -28 | -20 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | + +

+

+ +
Time (total CPU): results within specified thresholds, fold down for details. +

+ +| Time (total CPU) (μs) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 4831 | 4850 | 4866 | 4887 | 4944 | 5083 | 5127 | 204 | +| eh-branch | 4821 | 4841 | 4854 | 4870 | 4891 | 5059 | 5107 | 204 | +| Δ | -10 | -9 | -12 | -17 | -53 | -24 | -20 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | + +

+

+ +
Throughput (# / s): results within specified thresholds, fold down for details. +

+ +| Throughput (# / s) (#) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 207 | 206 | 206 | 205 | 202 | 197 | 195 | 204 | +| eh-branch | 208 | 207 | 206 | 205 | 204 | 198 | 196 | 204 | +| Δ | 1 | 1 | 0 | 0 | 2 | 1 | 1 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 0 | + +

+

+ +| Memory (resident peak) (M) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 11 | 13 | 13 | 13 | 13 | 13 | 13 | 204 | +| eh-branch | 11 | 13 | 13 | 13 | 13 | 13 | 13 | 204 | +| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +
Malloc (total): results within specified thresholds, fold down for details. +

+ +| Malloc (total) (K) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 21 | 21 | 21 | 21 | 21 | 21 | 21 | 204 | +| eh-branch | 21 | 21 | 21 | 21 | 21 | 21 | 21 | 204 | +| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +

+

+ +
Instructions: results within specified thresholds, fold down for details. +

+ +| Instructions (M) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 65 | 66 | 66 | 66 | 66 | 67 | 68 | 204 | +| eh-branch | 66 | 66 | 66 | 66 | 66 | 66 | 68 | 204 | +| Δ | 1 | 0 | 0 | 0 | 0 | -1 | 0 | 0 | +| Improvement % | -2 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | + +

+

+ +### onetimeauth2.wasm metrics + +
Time (wall clock): results within specified thresholds, fold down for details. +

+ +| Time (wall clock) (μs) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 2245 | 2257 | 2265 | 2279 | 2306 | 2417 | 2544 | 432 | +| eh-branch | 2235 | 2243 | 2249 | 2261 | 2275 | 2382 | 2574 | 435 | +| Δ | -10 | -14 | -16 | -18 | -31 | -35 | 30 | 3 | +| Improvement % | 0 | 1 | 1 | 1 | 1 | 1 | -1 | 3 | + +

+

+ +
Time (total CPU): results within specified thresholds, fold down for details. +

+ +| Time (total CPU) (μs) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 2247 | 2259 | 2267 | 2281 | 2308 | 2421 | 2544 | 432 | +| eh-branch | 2237 | 2245 | 2251 | 2263 | 2277 | 2384 | 2547 | 435 | +| Δ | -10 | -14 | -16 | -18 | -31 | -37 | 3 | 3 | +| Improvement % | 0 | 1 | 1 | 1 | 1 | 2 | 0 | 3 | + +

+

+ +
Throughput (# / s): results within specified thresholds, fold down for details. +

+ +| Throughput (# / s) (#) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 445 | 443 | 442 | 439 | 434 | 414 | 393 | 432 | +| eh-branch | 447 | 446 | 445 | 443 | 440 | 420 | 389 | 435 | +| Δ | 2 | 3 | 3 | 4 | 6 | 6 | -4 | 3 | +| Improvement % | 0 | 1 | 1 | 1 | 1 | 1 | -1 | 3 | + +

+

+ +| Memory (resident peak) (M) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 11 | 13 | 13 | 13 | 13 | 13 | 13 | 432 | +| eh-branch | 11 | 13 | 13 | 13 | 13 | 14 | 14 | 435 | +| Δ | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 3 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | -8 | -8 | 3 | + +
Malloc (total): results within specified thresholds, fold down for details. +

+ +| Malloc (total) (K) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 17 | 17 | 17 | 17 | 17 | 17 | 17 | 432 | +| eh-branch | 17 | 17 | 17 | 17 | 17 | 17 | 17 | 435 | +| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 3 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 3 | + +

+

+ +
Instructions: results within specified thresholds, fold down for details. +

+ +| Instructions (M) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 34 | 34 | 34 | 34 | 34 | 35 | 36 | 432 | +| eh-branch | 34 | 34 | 34 | 34 | 34 | 35 | 36 | 435 | +| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 3 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 3 | + +

+

+ +### randombytes.wasm metrics + +
Time (wall clock): results within specified thresholds, fold down for details. +

+ +| Time (wall clock) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 7980 | 7980 | 7980 | 7980 | 7980 | 7980 | 7980 | 1 | +| eh-branch | 7968 | 7968 | 7968 | 7968 | 7968 | 7968 | 7968 | 1 | +| Δ | -12 | -12 | -12 | -12 | -12 | -12 | -12 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +

+

+ +
Time (total CPU): results within specified thresholds, fold down for details. +

+ +| Time (total CPU) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 7983 | 7983 | 7983 | 7983 | 7983 | 7983 | 7983 | 1 | +| eh-branch | 7970 | 7970 | 7970 | 7970 | 7970 | 7970 | 7970 | 1 | +| Δ | -13 | -13 | -13 | -13 | -13 | -13 | -13 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +

+

+ +| Memory (resident peak) (M) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 1 | +| eh-branch | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 1 | +| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +
Malloc (total): results within specified thresholds, fold down for details. +

+ +| Malloc (total) (K) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 254 | 254 | 254 | 254 | 254 | 254 | 254 | 1 | +| eh-branch | 254 | 254 | 254 | 254 | 254 | 254 | 254 | 1 | +| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +

+

+ +
Instructions: results within specified thresholds, fold down for details. +

+ +| Instructions (G) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 79 | 79 | 79 | 79 | 79 | 79 | 79 | 1 | +| eh-branch | 79 | 79 | 79 | 79 | 79 | 79 | 79 | 1 | +| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +

+

+ +### scalarmult.wasm metrics + +
Time (wall clock): results within specified thresholds, fold down for details. +

+ +| Time (wall clock) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 2715 | 2715 | 2715 | 2715 | 2715 | 2715 | 2715 | 1 | +| eh-branch | 2524 | 2524 | 2524 | 2524 | 2524 | 2524 | 2524 | 1 | +| Δ | -191 | -191 | -191 | -191 | -191 | -191 | -191 | 0 | +| Improvement % | 7 | 7 | 7 | 7 | 7 | 7 | 7 | 0 | + +

+

+ +
Time (total CPU): results within specified thresholds, fold down for details. +

+ +| Time (total CPU) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 2716 | 2716 | 2716 | 2716 | 2716 | 2716 | 2716 | 1 | +| eh-branch | 2525 | 2525 | 2525 | 2525 | 2525 | 2525 | 2525 | 1 | +| Δ | -191 | -191 | -191 | -191 | -191 | -191 | -191 | 0 | +| Improvement % | 7 | 7 | 7 | 7 | 7 | 7 | 7 | 0 | + +

+

+ +| Memory (resident peak) (M) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 13 | 13 | 13 | 13 | 13 | 13 | 13 | 1 | +| eh-branch | 13 | 13 | 13 | 13 | 13 | 13 | 13 | 1 | +| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +
Malloc (total): results within specified thresholds, fold down for details. +

+ +| Malloc (total) (K) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 91 | 91 | 91 | 91 | 91 | 91 | 91 | 1 | +| eh-branch | 91 | 91 | 91 | 91 | 91 | 91 | 91 | 1 | +| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +

+

+ +
Instructions: results within specified thresholds, fold down for details. +

+ +| Instructions (G) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 29 | 29 | 29 | 29 | 29 | 29 | 29 | 1 | +| eh-branch | 29 | 29 | 29 | 29 | 29 | 29 | 29 | 1 | +| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +

+

+ +### scalarmult2.wasm metrics + +
Time (wall clock): results within specified thresholds, fold down for details. +

+ +| Time (wall clock) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 230 | 231 | 231 | 231 | 231 | 231 | 231 | 5 | +| eh-branch | 229 | 230 | 230 | 231 | 237 | 237 | 237 | 5 | +| Δ | -1 | -1 | -1 | 0 | 6 | 6 | 6 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | -3 | -3 | -3 | 0 | + +

+

+ +
Time (total CPU): results within specified thresholds, fold down for details. +

+ +| Time (total CPU) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 230 | 231 | 231 | 231 | 231 | 231 | 231 | 5 | +| eh-branch | 229 | 230 | 230 | 231 | 233 | 233 | 233 | 5 | +| Δ | -1 | -1 | -1 | 0 | 2 | 2 | 2 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | -1 | -1 | -1 | 0 | + +

+

+ +
Throughput (# / s): results within specified thresholds, fold down for details. +

+ +| Throughput (# / s) (#) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 4 | 4 | 4 | 4 | 4 | 4 | 4 | 5 | +| eh-branch | 4 | 4 | 4 | 4 | 4 | 4 | 4 | 5 | +| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +

+

+ +| Memory (resident peak) (M) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 13 | 13 | 13 | 13 | 13 | 13 | 13 | 5 | +| eh-branch | 13 | 13 | 13 | 14 | 14 | 14 | 14 | 5 | +| Δ | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 0 | +| Improvement % | 0 | 0 | 0 | -8 | -8 | -8 | -8 | 0 | + +
Malloc (total): results within specified thresholds, fold down for details. +

+ +| Malloc (total) (K) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 66 | 66 | 66 | 66 | 66 | 66 | 66 | 5 | +| eh-branch | 66 | 66 | 66 | 66 | 66 | 66 | 66 | 5 | +| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +

+

+ +
Instructions: results within specified thresholds, fold down for details. +

+ +| Instructions (M) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 2721 | 2722 | 2722 | 2722 | 2722 | 2722 | 2722 | 5 | +| eh-branch | 2721 | 2722 | 2722 | 2722 | 2722 | 2722 | 2722 | 5 | +| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +

+

+ +### scalarmult5.wasm metrics + +
Time (wall clock): results within specified thresholds, fold down for details. +

+ +| Time (wall clock) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 700 | 700 | 700 | 700 | 700 | 700 | 700 | 2 | +| eh-branch | 695 | 695 | 695 | 706 | 706 | 706 | 706 | 2 | +| Δ | -5 | -5 | -5 | 6 | 6 | 6 | 6 | 0 | +| Improvement % | 1 | 1 | 1 | -1 | -1 | -1 | -1 | 0 | + +

+

+ +
Time (total CPU): results within specified thresholds, fold down for details. +

+ +| Time (total CPU) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 700 | 700 | 700 | 700 | 700 | 700 | 700 | 2 | +| eh-branch | 695 | 695 | 695 | 702 | 702 | 702 | 702 | 2 | +| Δ | -5 | -5 | -5 | 2 | 2 | 2 | 2 | 0 | +| Improvement % | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | + +

+

+ +
Throughput (# / s): results within specified thresholds, fold down for details. +

+ +| Throughput (# / s) (#) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 2 | +| eh-branch | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 2 | +| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +

+

+ +| Memory (resident peak) (M) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 13 | 13 | 13 | 13 | 13 | 13 | 13 | 2 | +| eh-branch | 13 | 13 | 13 | 13 | 13 | 13 | 13 | 2 | +| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +
Malloc (total): results within specified thresholds, fold down for details. +

+ +| Malloc (total) (K) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 51 | 51 | 51 | 51 | 51 | 51 | 51 | 2 | +| eh-branch | 51 | 51 | 51 | 51 | 51 | 51 | 51 | 2 | +| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +

+

+ +
Instructions: results within specified thresholds, fold down for details. +

+ +| Instructions (M) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 7822 | 7823 | 7823 | 7823 | 7823 | 7823 | 7823 | 2 | +| eh-branch | 7823 | 7825 | 7825 | 7825 | 7825 | 7825 | 7825 | 2 | +| Δ | 1 | 2 | 2 | 2 | 2 | 2 | 2 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +

+

+ +### scalarmult6.wasm metrics + +
Time (wall clock): results within specified thresholds, fold down for details. +

+ +| Time (wall clock) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 704 | 705 | 705 | 805 | 805 | 805 | 805 | 2 | +| eh-branch | 697 | 697 | 697 | 697 | 697 | 697 | 697 | 2 | +| Δ | -7 | -8 | -8 | -108 | -108 | -108 | -108 | 0 | +| Improvement % | 1 | 1 | 1 | 13 | 13 | 13 | 13 | 0 | + +

+

+ +
Time (total CPU): results within specified thresholds, fold down for details. +

+ +| Time (total CPU) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 705 | 705 | 705 | 722 | 722 | 722 | 722 | 2 | +| eh-branch | 697 | 697 | 697 | 698 | 698 | 698 | 698 | 2 | +| Δ | -8 | -8 | -8 | -24 | -24 | -24 | -24 | 0 | +| Improvement % | 1 | 1 | 1 | 3 | 3 | 3 | 3 | 0 | + +

+

+ +
Throughput (# / s): results within specified thresholds, fold down for details. +

+ +| Throughput (# / s) (#) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 2 | +| eh-branch | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 2 | +| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +

+

+ +
Memory (resident peak): results within specified thresholds, fold down for details. +

+ +| Memory (resident peak) (M) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 13 | 13 | 13 | 13 | 13 | 13 | 13 | 2 | +| eh-branch | 13 | 13 | 13 | 13 | 13 | 13 | 13 | 2 | +| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +

+

+ +
Malloc (total): results within specified thresholds, fold down for details. +

+ +| Malloc (total) (K) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 54 | 54 | 54 | 54 | 54 | 54 | 54 | 2 | +| eh-branch | 54 | 54 | 54 | 54 | 54 | 54 | 54 | 2 | +| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +

+

+ +
Instructions: results within specified thresholds, fold down for details. +

+ +| Instructions (M) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 7825 | 7827 | 7827 | 7829 | 7829 | 7829 | 7829 | 2 | +| eh-branch | 7824 | 7825 | 7825 | 7825 | 7825 | 7825 | 7825 | 2 | +| Δ | -1 | -2 | -2 | -4 | -4 | -4 | -4 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +

+

+ +### scalarmult7.wasm metrics + +
Time (wall clock): results within specified thresholds, fold down for details. +

+ +| Time (wall clock) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 1406 | 1406 | 1406 | 1406 | 1406 | 1406 | 1406 | 1 | +| eh-branch | 1389 | 1389 | 1389 | 1389 | 1389 | 1389 | 1389 | 1 | +| Δ | -17 | -17 | -17 | -17 | -17 | -17 | -17 | 0 | +| Improvement % | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | + +

+

+ +
Time (total CPU): results within specified thresholds, fold down for details. +

+ +| Time (total CPU) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 1403 | 1403 | 1403 | 1403 | 1403 | 1403 | 1403 | 1 | +| eh-branch | 1389 | 1389 | 1389 | 1389 | 1389 | 1389 | 1389 | 1 | +| Δ | -14 | -14 | -14 | -14 | -14 | -14 | -14 | 0 | +| Improvement % | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | + +

+

+ +
Throughput (# / s): results within specified thresholds, fold down for details. +

+ +| Throughput (# / s) (#) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | +| eh-branch | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | +| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +

+

+ +| Memory (resident peak) (M) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 13 | 13 | 13 | 13 | 13 | 13 | 13 | 1 | +| eh-branch | 13 | 13 | 13 | 13 | 13 | 13 | 13 | 1 | +| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +
Malloc (total): results within specified thresholds, fold down for details. +

+ +| Malloc (total) (K) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 51 | 51 | 51 | 51 | 51 | 51 | 51 | 1 | +| eh-branch | 51 | 51 | 51 | 51 | 51 | 51 | 51 | 1 | +| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +

+

+ +
Instructions: results within specified thresholds, fold down for details. +

+ +| Instructions (G) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 16 | 16 | 16 | 16 | 16 | 16 | 16 | 1 | +| eh-branch | 16 | 16 | 16 | 16 | 16 | 16 | 16 | 1 | +| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +

+

+ +### secretbox.wasm metrics + +
Time (wall clock): results within specified thresholds, fold down for details. +

+ +| Time (wall clock) (μs) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 9788 | 9822 | 9847 | 9871 | 9904 | 10863 | 17942 | 101 | +| eh-branch | 9797 | 9822 | 9839 | 9871 | 9904 | 10600 | 17836 | 101 | +| Δ | 9 | 0 | -8 | 0 | 0 | -263 | -106 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 2 | 1 | 0 | + +

+

+ +
Time (total CPU): results within specified thresholds, fold down for details. +

+ +| Time (total CPU) (μs) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 9793 | 9822 | 9847 | 9871 | 9912 | 10625 | 10871 | 101 | +| eh-branch | 9801 | 9830 | 9847 | 9880 | 9904 | 10519 | 10601 | 101 | +| Δ | 8 | 8 | 0 | 9 | -8 | -106 | -270 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 1 | 2 | 0 | + +

+

+ +
Throughput (# / s): results within specified thresholds, fold down for details. +

+ +| Throughput (# / s) (#) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 102 | 102 | 102 | 101 | 101 | 92 | 56 | 101 | +| eh-branch | 102 | 102 | 102 | 101 | 101 | 94 | 56 | 101 | +| Δ | 0 | 0 | 0 | 0 | 0 | 2 | 0 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 2 | 0 | 0 | + +

+

+ +
Memory (resident peak): results within specified thresholds, fold down for details. +

+ +| Memory (resident peak) (M) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 12 | 13 | 13 | 13 | 13 | 13 | 13 | 101 | +| eh-branch | 12 | 13 | 13 | 13 | 13 | 13 | 13 | 101 | +| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +

+

+ +
Malloc (total): results within specified thresholds, fold down for details. +

+ +| Malloc (total) (K) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 23 | 23 | 23 | 23 | 23 | 23 | 23 | 101 | +| eh-branch | 23 | 23 | 23 | 23 | 23 | 23 | 23 | 101 | +| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +

+

+ +
Instructions: results within specified thresholds, fold down for details. +

+ +| Instructions (M) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 112 | 112 | 112 | 112 | 112 | 112 | 112 | 101 | +| eh-branch | 111 | 111 | 111 | 111 | 112 | 112 | 112 | 101 | +| Δ | -1 | -1 | -1 | -1 | 0 | 0 | 0 | 0 | +| Improvement % | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | + +

+

+ +### secretbox2.wasm metrics + +
Time (wall clock): results within specified thresholds, fold down for details. +

+ +| Time (wall clock) (μs) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 7537 | 7565 | 7586 | 7614 | 7651 | 8245 | 8607 | 130 | +| eh-branch | 7615 | 7643 | 7668 | 7700 | 7844 | 8155 | 8573 | 129 | +| Δ | 78 | 78 | 82 | 86 | 193 | -90 | -34 | -1 | +| Improvement % | -1 | -1 | -1 | -1 | -3 | 1 | 0 | -1 | + +

+

+ +
Time (total CPU): results within specified thresholds, fold down for details. +

+ +| Time (total CPU) (μs) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 7538 | 7569 | 7590 | 7614 | 7651 | 8249 | 8611 | 130 | +| eh-branch | 7620 | 7651 | 7672 | 7709 | 7832 | 8151 | 8583 | 129 | +| Δ | 82 | 82 | 82 | 95 | 181 | -98 | -28 | -1 | +| Improvement % | -1 | -1 | -1 | -1 | -2 | 1 | 0 | -1 | + +

+

+ +
Throughput (# / s): results within specified thresholds, fold down for details. +

+ +| Throughput (# / s) (#) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 133 | 132 | 132 | 131 | 130 | 121 | 116 | 130 | +| eh-branch | 131 | 131 | 130 | 130 | 128 | 123 | 117 | 129 | +| Δ | -2 | -1 | -2 | -1 | -2 | 2 | 1 | -1 | +| Improvement % | -2 | -1 | -2 | -1 | -2 | 2 | 1 | -1 | + +

+

+ +| Memory (resident peak) (M) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 11 | 13 | 13 | 13 | 13 | 13 | 13 | 130 | +| eh-branch | 11 | 13 | 13 | 13 | 13 | 13 | 13 | 129 | +| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -1 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -1 | + +
Malloc (total): results within specified thresholds, fold down for details. +

+ +| Malloc (total) (K) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 24 | 24 | 24 | 24 | 24 | 24 | 24 | 130 | +| eh-branch | 24 | 24 | 24 | 24 | 24 | 24 | 24 | 129 | +| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -1 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -1 | + +

+

+ +
Instructions: results within specified thresholds, fold down for details. +

+ +| Instructions (M) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 89 | 89 | 89 | 89 | 89 | 89 | 90 | 130 | +| eh-branch | 90 | 90 | 90 | 90 | 90 | 91 | 92 | 129 | +| Δ | 1 | 1 | 1 | 1 | 1 | 2 | 2 | -1 | +| Improvement % | -1 | -1 | -1 | -1 | -1 | -2 | -2 | -1 | + +

+

+ +### secretbox_easy.wasm metrics + +
Time (wall clock): results within specified thresholds, fold down for details. +

+ +| Time (wall clock) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 33 | 33 | 33 | 33 | 33 | 33 | 33 | 31 | +| eh-branch | 33 | 33 | 33 | 33 | 33 | 36 | 36 | 30 | +| Δ | 0 | 0 | 0 | 0 | 0 | 3 | 3 | -1 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | -9 | -9 | -1 | + +

+

+ +
Time (total CPU): results within specified thresholds, fold down for details. +

+ +| Time (total CPU) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 33 | 33 | 33 | 33 | 33 | 33 | 33 | 31 | +| eh-branch | 33 | 33 | 33 | 33 | 33 | 34 | 34 | 30 | +| Δ | 0 | 0 | 0 | 0 | 0 | 1 | 1 | -1 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | -3 | -3 | -1 | + +

+

+ +
Throughput (# / s): results within specified thresholds, fold down for details. +

+ +| Throughput (# / s) (#) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 30 | 30 | 30 | 30 | 30 | 30 | 30 | 31 | +| eh-branch | 30 | 30 | 30 | 30 | 29 | 27 | 27 | 30 | +| Δ | 0 | 0 | 0 | 0 | -1 | -3 | -3 | -1 | +| Improvement % | 0 | 0 | 0 | 0 | -3 | -10 | -10 | -1 | + +

+

+ +| Memory (resident peak) (M) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 12 | 13 | 13 | 13 | 13 | 13 | 13 | 31 | +| eh-branch | 12 | 13 | 13 | 14 | 14 | 14 | 14 | 30 | +| Δ | 0 | 0 | 0 | 1 | 1 | 1 | 1 | -1 | +| Improvement % | 0 | 0 | 0 | -8 | -8 | -8 | -8 | -1 | + +
Malloc (total): results within specified thresholds, fold down for details. +

+ +| Malloc (total) (K) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 31 | 31 | 31 | 31 | 31 | 31 | 31 | 31 | +| eh-branch | 31 | 31 | 31 | 31 | 31 | 31 | 31 | 30 | +| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -1 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -1 | + +

+

+ +
Instructions: results within specified thresholds, fold down for details. +

+ +| Instructions (M) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 374 | 374 | 374 | 374 | 374 | 374 | 374 | 31 | +| eh-branch | 374 | 374 | 374 | 374 | 374 | 375 | 375 | 30 | +| Δ | 0 | 0 | 0 | 0 | 0 | 1 | 1 | -1 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -1 | + +

+

+ +### secretstream_xchacha20poly1305.wasm metrics + +
Time (wall clock): results within specified thresholds, fold down for details. +

+ +| Time (wall clock) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 303 | 303 | 303 | 306 | 313 | 313 | 313 | 4 | +| eh-branch | 302 | 303 | 307 | 308 | 310 | 310 | 310 | 4 | +| Δ | -1 | 0 | 4 | 2 | -3 | -3 | -3 | 0 | +| Improvement % | 0 | 0 | -1 | -1 | 1 | 1 | 1 | 0 | + +

+

+ +
Time (total CPU): results within specified thresholds, fold down for details. +

+ +| Time (total CPU) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 303 | 303 | 303 | 306 | 313 | 313 | 313 | 4 | +| eh-branch | 302 | 303 | 308 | 308 | 310 | 310 | 310 | 4 | +| Δ | -1 | 0 | 5 | 2 | -3 | -3 | -3 | 0 | +| Improvement % | 0 | 0 | -2 | -1 | 1 | 1 | 1 | 0 | + +

+

+ +
Throughput (# / s): results within specified thresholds, fold down for details. +

+ +| Throughput (# / s) (#) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 3 | 3 | 3 | 3 | 3 | 3 | 3 | 4 | +| eh-branch | 3 | 3 | 3 | 3 | 3 | 3 | 3 | 4 | +| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +

+

+ +| Memory (resident peak) (M) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 14 | 14 | 15 | 16 | 16 | 16 | 16 | 4 | +| eh-branch | 14 | 14 | 15 | 16 | 16 | 16 | 16 | 4 | +| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +
Malloc (total): results within specified thresholds, fold down for details. +

+ +| Malloc (total) (K) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 49 | 49 | 49 | 49 | 49 | 49 | 49 | 4 | +| eh-branch | 49 | 49 | 49 | 49 | 49 | 49 | 49 | 4 | +| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +

+

+ +
Instructions: results within specified thresholds, fold down for details. +

+ +| Instructions (M) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 3025 | 3026 | 3035 | 3056 | 3117 | 3117 | 3117 | 4 | +| eh-branch | 3028 | 3028 | 3081 | 3087 | 3101 | 3101 | 3101 | 4 | +| Δ | 3 | 2 | 46 | 31 | -16 | -16 | -16 | 0 | +| Improvement % | 0 | 0 | -2 | -1 | 1 | 1 | 1 | 0 | + +

+

+ +### shorthash.wasm metrics + +
Time (wall clock): results within specified thresholds, fold down for details. +

+ +| Time (wall clock) (μs) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 7262 | 7299 | 7315 | 7336 | 7365 | 7574 | 7611 | 136 | +| eh-branch | 7318 | 7348 | 7369 | 7397 | 7479 | 7639 | 7639 | 135 | +| Δ | 56 | 49 | 54 | 61 | 114 | 65 | 28 | -1 | +| Improvement % | -1 | -1 | -1 | -1 | -2 | -1 | 0 | -1 | + +

+

+ +
Time (total CPU): results within specified thresholds, fold down for details. +

+ +| Time (total CPU) (μs) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 7264 | 7303 | 7320 | 7336 | 7365 | 7565 | 7616 | 136 | +| eh-branch | 7319 | 7356 | 7373 | 7397 | 7483 | 7623 | 7635 | 135 | +| Δ | 55 | 53 | 53 | 61 | 118 | 58 | 19 | -1 | +| Improvement % | -1 | -1 | -1 | -1 | -2 | -1 | 0 | -1 | + +

+

+ +
Throughput (# / s): results within specified thresholds, fold down for details. +

+ +| Throughput (# / s) (#) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 138 | 137 | 137 | 136 | 136 | 132 | 131 | 136 | +| eh-branch | 137 | 136 | 136 | 135 | 134 | 131 | 131 | 135 | +| Δ | -1 | -1 | -1 | -1 | -2 | -1 | 0 | -1 | +| Improvement % | -1 | -1 | -1 | -1 | -1 | -1 | 0 | -1 | + +

+

+ +| Memory (resident peak) (M) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 11 | 13 | 13 | 13 | 13 | 13 | 13 | 136 | +| eh-branch | 11 | 13 | 13 | 13 | 13 | 13 | 13 | 135 | +| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -1 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -1 | + +
Malloc (total): results within specified thresholds, fold down for details. +

+ +| Malloc (total) (K) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 19 | 19 | 19 | 19 | 19 | 19 | 19 | 136 | +| eh-branch | 19 | 19 | 19 | 19 | 19 | 19 | 19 | 135 | +| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -1 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -1 | + +

+

+ +
Instructions: results within specified thresholds, fold down for details. +

+ +| Instructions (M) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 82 | 82 | 82 | 82 | 82 | 83 | 84 | 136 | +| eh-branch | 83 | 83 | 83 | 83 | 83 | 84 | 85 | 135 | +| Δ | 1 | 1 | 1 | 1 | 1 | 1 | 1 | -1 | +| Improvement % | -1 | -1 | -1 | -1 | -1 | -1 | -1 | -1 | + +

+

+ +### sign2.wasm metrics + +
Time (wall clock): results within specified thresholds, fold down for details. +

+ +| Time (wall clock) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 4150 | 4150 | 4150 | 4150 | 4150 | 4150 | 4150 | 1 | +| eh-branch | 4123 | 4123 | 4123 | 4123 | 4123 | 4123 | 4123 | 1 | +| Δ | -27 | -27 | -27 | -27 | -27 | -27 | -27 | 0 | +| Improvement % | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | + +

+

+ +
Time (total CPU): results within specified thresholds, fold down for details. +

+ +| Time (total CPU) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 4151 | 4151 | 4151 | 4151 | 4151 | 4151 | 4151 | 1 | +| eh-branch | 4124 | 4124 | 4124 | 4124 | 4124 | 4124 | 4124 | 1 | +| Δ | -27 | -27 | -27 | -27 | -27 | -27 | -27 | 0 | +| Improvement % | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | + +

+

+ +| Memory (resident peak) (M) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 13 | 13 | 13 | 13 | 13 | 13 | 13 | 1 | +| eh-branch | 13 | 13 | 13 | 13 | 13 | 13 | 13 | 1 | +| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +
Malloc (total): results within specified thresholds, fold down for details. +

+ +| Malloc (total) (K) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 113 | 113 | 113 | 113 | 113 | 113 | 113 | 1 | +| eh-branch | 113 | 113 | 113 | 113 | 113 | 113 | 113 | 1 | +| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +

+

+ +
Instructions: results within specified thresholds, fold down for details. +

+ +| Instructions (G) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 46 | 46 | 46 | 46 | 46 | 46 | 46 | 1 | +| eh-branch | 46 | 46 | 46 | 46 | 46 | 46 | 46 | 1 | +| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +

+

+ +### siphashx24.wasm metrics + +
Time (wall clock): results within specified thresholds, fold down for details. +

+ +| Time (wall clock) (μs) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 8739 | 8774 | 8798 | 8831 | 8905 | 9617 | 16842 | 112 | +| eh-branch | 8739 | 8790 | 8806 | 8856 | 8995 | 9077 | 9085 | 113 | +| Δ | 0 | 16 | 8 | 25 | 90 | -540 | -7757 | 1 | +| Improvement % | 0 | 0 | 0 | 0 | -1 | 6 | 46 | 1 | + +

+

+ +
Time (total CPU): results within specified thresholds, fold down for details. +

+ +| Time (total CPU) (μs) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 8745 | 8782 | 8806 | 8839 | 8913 | 9593 | 9621 | 112 | +| eh-branch | 8741 | 8790 | 8815 | 8856 | 8995 | 9077 | 9095 | 113 | +| Δ | -4 | 8 | 9 | 17 | 82 | -516 | -526 | 1 | +| Improvement % | 0 | 0 | 0 | 0 | -1 | 5 | 5 | 1 | + +

+

+ +
Throughput (# / s): results within specified thresholds, fold down for details. +

+ +| Throughput (# / s) (#) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 114 | 114 | 114 | 113 | 112 | 104 | 59 | 112 | +| eh-branch | 114 | 114 | 114 | 113 | 111 | 110 | 110 | 113 | +| Δ | 0 | 0 | 0 | 0 | -1 | 6 | 51 | 1 | +| Improvement % | 0 | 0 | 0 | 0 | -1 | 6 | 86 | 1 | + +

+

+ +
Memory (resident peak): results within specified thresholds, fold down for details. +

+ +| Memory (resident peak) (M) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 12 | 13 | 13 | 14 | 14 | 14 | 14 | 112 | +| eh-branch | 11 | 13 | 13 | 13 | 13 | 13 | 13 | 113 | +| Δ | -1 | 0 | 0 | -1 | -1 | -1 | -1 | 1 | +| Improvement % | 8 | 0 | 0 | 7 | 7 | 7 | 7 | 1 | + +

+

+ +
Malloc (total): results within specified thresholds, fold down for details. +

+ +| Malloc (total) (K) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 19 | 19 | 19 | 19 | 19 | 19 | 19 | 112 | +| eh-branch | 19 | 19 | 19 | 19 | 19 | 19 | 19 | 113 | +| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | + +

+

+ +
Instructions: results within specified thresholds, fold down for details. +

+ +| Instructions (M) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 95 | 95 | 95 | 95 | 95 | 95 | 95 | 112 | +| eh-branch | 94 | 94 | 94 | 94 | 95 | 95 | 96 | 113 | +| Δ | -1 | -1 | -1 | -1 | 0 | 0 | 1 | 1 | +| Improvement % | 1 | 1 | 1 | 1 | 0 | 0 | -1 | 1 | + +

+

+ +### stream3.wasm metrics + +
Time (wall clock): results within specified thresholds, fold down for details. +

+ +| Time (wall clock) (μs) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 3655 | 3672 | 3684 | 3705 | 3744 | 3936 | 4038 | 268 | +| eh-branch | 3652 | 3670 | 3678 | 3695 | 3719 | 3877 | 4022 | 268 | +| Δ | -3 | -2 | -6 | -10 | -25 | -59 | -16 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | + +

+

+ +
Time (total CPU): results within specified thresholds, fold down for details. +

+ +| Time (total CPU) (μs) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 3657 | 3674 | 3688 | 3707 | 3744 | 3928 | 4015 | 268 | +| eh-branch | 3654 | 3674 | 3682 | 3697 | 3719 | 3883 | 3986 | 268 | +| Δ | -3 | 0 | -6 | -10 | -25 | -45 | -29 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 0 | + +

+

+ +
Throughput (# / s): results within specified thresholds, fold down for details. +

+ +| Throughput (# / s) (#) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 274 | 272 | 272 | 270 | 267 | 254 | 248 | 268 | +| eh-branch | 274 | 272 | 272 | 271 | 269 | 258 | 249 | 268 | +| Δ | 0 | 0 | 0 | 1 | 2 | 4 | 1 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 1 | 2 | 0 | 0 | + +

+

+ +| Memory (resident peak) (M) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 11 | 13 | 13 | 14 | 14 | 14 | 14 | 268 | +| eh-branch | 11 | 15 | 15 | 15 | 15 | 15 | 15 | 268 | +| Δ | 0 | 2 | 2 | 1 | 1 | 1 | 1 | 0 | +| Improvement % | 0 | -15 | -15 | -7 | -7 | -7 | -7 | 0 | + +
Malloc (total): results within specified thresholds, fold down for details. +

+ +| Malloc (total) (K) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 20 | 20 | 20 | 20 | 20 | 20 | 20 | 268 | +| eh-branch | 20 | 20 | 20 | 20 | 20 | 20 | 20 | 268 | +| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +

+

+ +
Instructions: results within specified thresholds, fold down for details. +

+ +| Instructions (M) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 48 | 48 | 48 | 48 | 48 | 50 | 50 | 268 | +| eh-branch | 48 | 48 | 48 | 48 | 48 | 50 | 50 | 268 | +| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +

+

+ +### stream4.wasm metrics + +
Time (wall clock): results within specified thresholds, fold down for details. +

+ +| Time (wall clock) (μs) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 4903 | 4923 | 4940 | 4960 | 4993 | 5157 | 5213 | 201 | +| eh-branch | 5004 | 5022 | 5034 | 5050 | 5087 | 5333 | 5363 | 197 | +| Δ | 101 | 99 | 94 | 90 | 94 | 176 | 150 | -4 | +| Improvement % | -2 | -2 | -2 | -2 | -2 | -3 | -3 | -4 | + +

+

+ +
Time (total CPU): results within specified thresholds, fold down for details. +

+ +| Time (total CPU) (μs) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 4907 | 4927 | 4944 | 4964 | 4989 | 5161 | 5198 | 201 | +| eh-branch | 5005 | 5026 | 5038 | 5054 | 5087 | 5337 | 5366 | 197 | +| Δ | 98 | 99 | 94 | 90 | 98 | 176 | 168 | -4 | +| Improvement % | -2 | -2 | -2 | -2 | -2 | -3 | -3 | -4 | + +

+

+ +
Throughput (# / s): results within specified thresholds, fold down for details. +

+ +| Throughput (# / s) (#) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 204 | 203 | 203 | 202 | 200 | 194 | 192 | 201 | +| eh-branch | 200 | 199 | 199 | 198 | 197 | 188 | 186 | 197 | +| Δ | -4 | -4 | -4 | -4 | -3 | -6 | -6 | -4 | +| Improvement % | -2 | -2 | -2 | -2 | -2 | -3 | -3 | -4 | + +

+

+ +| Memory (resident peak) (M) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 11 | 13 | 13 | 13 | 13 | 13 | 13 | 201 | +| eh-branch | 11 | 13 | 13 | 13 | 13 | 14 | 14 | 197 | +| Δ | 0 | 0 | 0 | 0 | 0 | 1 | 1 | -4 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | -8 | -8 | -4 | + +
Malloc (total): results within specified thresholds, fold down for details. +

+ +| Malloc (total) (K) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 20 | 20 | 20 | 20 | 20 | 20 | 20 | 201 | +| eh-branch | 20 | 20 | 20 | 20 | 20 | 20 | 20 | 197 | +| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -4 | +| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -4 | + +

+

+ +
Instructions: results within specified thresholds, fold down for details. +

+ +| Instructions (M) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | +|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| +| main | 60 | 60 | 60 | 60 | 60 | 61 | 62 | 201 | +| eh-branch | 61 | 61 | 61 | 61 | 61 | 63 | 63 | 197 | +| Δ | 1 | 1 | 1 | 1 | 1 | 2 | 1 | -4 | +| Improvement % | -2 | -2 | -2 | -2 | -2 | -3 | -2 | -4 | + +

+

+ From 31baf8b988919497536f724c33822c697e7920e6 Mon Sep 17 00:00:00 2001 From: Max Desiatov Date: Tue, 26 May 2026 13:33:36 +0100 Subject: [PATCH 3/4] Clean up comments --- .../Instructions/ExceptionHandling.swift | 2 +- Sources/WasmKit/Translator.swift | 20 ++++++++++++++++++- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/Sources/WasmKit/Execution/Instructions/ExceptionHandling.swift b/Sources/WasmKit/Execution/Instructions/ExceptionHandling.swift index 67d8c539..25e2e99c 100644 --- a/Sources/WasmKit/Execution/Instructions/ExceptionHandling.swift +++ b/Sources/WasmKit/Execution/Instructions/ExceptionHandling.swift @@ -22,7 +22,7 @@ extension Execution { throw WasmKitException(tag: tag, payload: payload) } - /// Rethrow an exception from an `exnref` value. + /// Throw the exception referenced by an `exnref` value. @inline(never) func throwRef(sp: Sp, pc: Pc, immediate: Instruction.ThrowRefOperand) throws -> (Pc, CodeSlot) { let ref = UntypedValue(storage: sp[i64: immediate.exnRef]) diff --git a/Sources/WasmKit/Translator.swift b/Sources/WasmKit/Translator.swift index 7267c379..71cc13d5 100644 --- a/Sources/WasmKit/Translator.swift +++ b/Sources/WasmKit/Translator.swift @@ -1583,8 +1583,26 @@ struct InstructionTranslator: InstructionVisitor { if let condition { // If branch taken, fallthrough to landing pad, copy stack values, - // clean up exception handlers, then branch to the actual place. + // clean up exception handlers (if any), then branch to the actual place. // If branch not taken, branch to the next of the landing pad. + // + // (block (result i32) + // (i32.const 42) + // (i32.const 24) + // (local.get 0) + // (br_if 0) ------+ + // (local.get 1) | + // ) <-------+ + // + // [0x00] (i32.const 42 reg:0) + // [0x01] (i32.const 24 reg:1) + // [0x02] (local.get 0 result=reg:2) + // [0x03] (br_if_z offset=+0x3 cond=reg:2) --+ + // [0x04] (stack.copy reg:1 -> reg:0) | + // (catchHandlersEnd count=N)? | // only if handlersToUnwind > 0 + // [0x05] (br offset=+0x2) --------+ | + // [0x06] (local.get 1 reg:2) <----|---------+ + // [0x07] ... <-------+ let onBranchNotTaken = iseqBuilder.allocLabel() self.updateInstructionMapping() iseqBuilder.emitWithLabel(Instruction.brIfNot, onBranchNotTaken) { _, conditionCheckAt, continuation in From e0928a9ad7723fb20b8072c0020f808947b4f98f Mon Sep 17 00:00:00 2001 From: Max Desiatov Date: Tue, 16 Jun 2026 17:52:44 +0100 Subject: [PATCH 4/4] Delete eh_bench.md --- eh_bench.md | 3656 --------------------------------------------------- 1 file changed, 3656 deletions(-) delete mode 100644 eh_bench.md diff --git a/eh_bench.md b/eh_bench.md deleted file mode 100644 index 15180e03..00000000 --- a/eh_bench.md +++ /dev/null @@ -1,3656 +0,0 @@ - -## Comparing results between 'main' and 'eh-branch' - -``` -Host 'MacBookAir.lan' with 8 'arm64' processors with 16 GB memory -``` -## MacroPlugin - -### Expand FoundationMacros.wasm metrics - -
Time (wall clock): results within specified thresholds, fold down for details. -

- -| Time (wall clock) (μs) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 2929 | 2947 | 2955 | 2970 | 2994 | 3070 | 3250 | 334 | -| eh-branch | 2890 | 2949 | 2957 | 2970 | 2990 | 3092 | 3230 | 335 | -| Δ | -39 | 2 | 2 | 0 | -4 | 22 | -20 | 1 | -| Improvement % | 1 | 0 | 0 | 0 | 0 | -1 | 1 | 1 | - -

-

- -
Time (total CPU): results within specified thresholds, fold down for details. -

- -| Time (total CPU) (μs) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 2931 | 2949 | 2959 | 2972 | 2992 | 3060 | 3235 | 334 | -| eh-branch | 2892 | 2951 | 2961 | 2974 | 2992 | 3097 | 3235 | 335 | -| Δ | -39 | 2 | 2 | 2 | 0 | 37 | 0 | 1 | -| Improvement % | 1 | 0 | 0 | 0 | 0 | -1 | 0 | 1 | - -

-

- -
Throughput (# / s): results within specified thresholds, fold down for details. -

- -| Throughput (# / s) (#) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 341 | 339 | 338 | 337 | 334 | 326 | 308 | 334 | -| eh-branch | 346 | 339 | 338 | 337 | 335 | 323 | 310 | 335 | -| Δ | 5 | 0 | 0 | 0 | 1 | -3 | 2 | 1 | -| Improvement % | 1 | 0 | 0 | 0 | 0 | -1 | 1 | 1 | - -

-

- -
Memory (resident peak): results within specified thresholds, fold down for details. -

- -| Memory (resident peak) (M) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 50 | 50 | 50 | 50 | 50 | 50 | 50 | 334 | -| eh-branch | 50 | 50 | 50 | 50 | 50 | 50 | 50 | 335 | -| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | - -

-

- -
Malloc (total): results within specified thresholds, fold down for details. -

- -| Malloc (total) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 24 | 24 | 24 | 24 | 24 | 24 | 151 | 334 | -| eh-branch | 24 | 24 | 24 | 24 | 24 | 24 | 151 | 335 | -| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | - -

-

- -
Instructions: results within specified thresholds, fold down for details. -

- -| Instructions (M) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 20 | 20 | 20 | 20 | 20 | 20 | 20 | 334 | -| eh-branch | 20 | 20 | 20 | 20 | 20 | 20 | 20 | 335 | -| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | - -

-

- -### Expand MMIOMacros.wasm metrics - -
Time (wall clock): results within specified thresholds, fold down for details. -

- -| Time (wall clock) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 85 | -| eh-branch | 11 | 12 | 12 | 12 | 12 | 12 | 12 | 85 | -| Δ | -1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -| Improvement % | 8 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - -

-

- -
Time (total CPU): results within specified thresholds, fold down for details. -

- -| Time (total CPU) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 85 | -| eh-branch | 11 | 12 | 12 | 12 | 12 | 12 | 12 | 85 | -| Δ | -1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -| Improvement % | 8 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - -

-

- -
Throughput (# / s): results within specified thresholds, fold down for details. -

- -| Throughput (# / s) (#) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 86 | 85 | 85 | 85 | 84 | 83 | 83 | 85 | -| eh-branch | 87 | 86 | 85 | 85 | 84 | 83 | 83 | 85 | -| Δ | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | -| Improvement % | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | - -

-

- -
Memory (resident peak): results within specified thresholds, fold down for details. -

- -| Memory (resident peak) (M) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 169 | 169 | 169 | 169 | 169 | 169 | 169 | 85 | -| eh-branch | 169 | 170 | 170 | 170 | 170 | 170 | 170 | 85 | -| Δ | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | -| Improvement % | 0 | -1 | -1 | -1 | -1 | -1 | -1 | 0 | - -

-

- -
Malloc (total): results within specified thresholds, fold down for details. -

- -| Malloc (total) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 56 | 56 | 56 | 56 | 56 | 658 | 658 | 85 | -| eh-branch | 56 | 56 | 56 | 56 | 56 | 658 | 658 | 85 | -| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - -

-

- -
Instructions: results within specified thresholds, fold down for details. -

- -| Instructions (M) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 84 | 84 | 84 | 84 | 84 | 86 | 86 | 85 | -| eh-branch | 84 | 84 | 84 | 84 | 84 | 85 | 85 | 85 | -| Δ | 0 | 0 | 0 | 0 | 0 | -1 | -1 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | - -

-

- -### Expand StringifyMacros.wasm metrics - -
Time (wall clock): results within specified thresholds, fold down for details. -

- -| Time (wall clock) (μs) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 2355 | 2374 | 2382 | 2396 | 2427 | 2480 | 2660 | 413 | -| eh-branch | 2322 | 2357 | 2378 | 2390 | 2404 | 2488 | 2591 | 416 | -| Δ | -33 | -17 | -4 | -6 | -23 | 8 | -69 | 3 | -| Improvement % | 1 | 1 | 0 | 0 | 1 | 0 | 3 | 3 | - -

-

- -
Time (total CPU): results within specified thresholds, fold down for details. -

- -| Time (total CPU) (μs) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 2357 | 2376 | 2384 | 2398 | 2431 | 2478 | 2662 | 413 | -| eh-branch | 2324 | 2359 | 2380 | 2392 | 2406 | 2490 | 2574 | 416 | -| Δ | -33 | -17 | -4 | -6 | -25 | 12 | -88 | 3 | -| Improvement % | 1 | 1 | 0 | 0 | 1 | 0 | 3 | 3 | - -

-

- -
Throughput (# / s): results within specified thresholds, fold down for details. -

- -| Throughput (# / s) (#) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 425 | 422 | 420 | 418 | 412 | 403 | 376 | 413 | -| eh-branch | 431 | 424 | 421 | 419 | 416 | 402 | 386 | 416 | -| Δ | 6 | 2 | 1 | 1 | 4 | -1 | 10 | 3 | -| Improvement % | 1 | 0 | 0 | 0 | 1 | 0 | 3 | 3 | - -

-

- -
Memory (resident peak): results within specified thresholds, fold down for details. -

- -| Memory (resident peak) (M) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 43 | 43 | 43 | 43 | 43 | 43 | 43 | 413 | -| eh-branch | 44 | 44 | 44 | 44 | 44 | 44 | 44 | 416 | -| Δ | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 3 | -| Improvement % | -2 | -2 | -2 | -2 | -2 | -2 | -2 | 3 | - -

-

- -
Malloc (total): results within specified thresholds, fold down for details. -

- -| Malloc (total) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 30 | 30 | 30 | 30 | 30 | 30 | 157 | 413 | -| eh-branch | 30 | 30 | 30 | 30 | 30 | 30 | 157 | 416 | -| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 3 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 3 | - -

-

- -
Instructions: results within specified thresholds, fold down for details. -

- -| Instructions (M) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 15 | 15 | 15 | 15 | 15 | 15 | 15 | 413 | -| eh-branch | 15 | 15 | 15 | 15 | 15 | 15 | 15 | 416 | -| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 3 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 3 | - -

-

- -### Expand TestingMacros.wasm metrics - -
Time (wall clock): results within specified thresholds, fold down for details. -

- -| Time (wall clock) (μs) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 5926 | 5951 | 5968 | 6001 | 6042 | 6291 | 6311 | 166 | -| eh-branch | 5855 | 5980 | 5997 | 6017 | 6054 | 6283 | 6306 | 166 | -| Δ | -71 | 29 | 29 | 16 | 12 | -8 | -5 | 0 | -| Improvement % | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - -

-

- -
Time (total CPU): results within specified thresholds, fold down for details. -

- -| Time (total CPU) (μs) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 5928 | 5956 | 5968 | 6005 | 6038 | 6296 | 6312 | 166 | -| eh-branch | 5861 | 5984 | 6001 | 6021 | 6062 | 6287 | 6311 | 166 | -| Δ | -67 | 28 | 33 | 16 | 24 | -9 | -1 | 0 | -| Improvement % | 1 | 0 | -1 | 0 | 0 | 0 | 0 | 0 | - -

-

- -
Throughput (# / s): results within specified thresholds, fold down for details. -

- -| Throughput (# / s) (#) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 169 | 168 | 168 | 167 | 166 | 159 | 158 | 166 | -| eh-branch | 171 | 167 | 167 | 166 | 165 | 159 | 159 | 166 | -| Δ | 2 | -1 | -1 | -1 | -1 | 0 | 1 | 0 | -| Improvement % | 1 | -1 | -1 | -1 | -1 | 0 | 1 | 0 | - -

-

- -
Memory (resident peak): results within specified thresholds, fold down for details. -

- -| Memory (resident peak) (M) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 102 | 102 | 102 | 102 | 102 | 102 | 102 | 166 | -| eh-branch | 102 | 102 | 102 | 102 | 102 | 102 | 102 | 166 | -| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - -

-

- -
Malloc (total): results within specified thresholds, fold down for details. -

- -| Malloc (total) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 202 | 202 | 202 | 202 | 202 | 202 | 202 | 166 | -| eh-branch | 202 | 202 | 202 | 202 | 202 | 202 | 202 | 166 | -| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - -

-

- -
Instructions: results within specified thresholds, fold down for details. -

- -| Instructions (M) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 36 | 36 | 36 | 36 | 36 | 36 | 36 | 166 | -| eh-branch | 36 | 36 | 36 | 36 | 36 | 36 | 36 | 166 | -| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - -

-

- -### Startup FoundationMacros.wasm metrics - -
Time (wall clock): results within specified thresholds, fold down for details. -

- -| Time (wall clock) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 88 | 89 | 89 | 89 | 89 | 89 | 89 | 12 | -| eh-branch | 87 | 87 | 88 | 88 | 89 | 89 | 89 | 12 | -| Δ | -1 | -2 | -1 | -1 | 0 | 0 | 0 | 0 | -| Improvement % | 1 | 2 | 1 | 1 | 0 | 0 | 0 | 0 | - -

-

- -
Time (total CPU): results within specified thresholds, fold down for details. -

- -| Time (total CPU) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 88 | 89 | 89 | 89 | 89 | 89 | 89 | 12 | -| eh-branch | 87 | 87 | 88 | 88 | 89 | 89 | 89 | 12 | -| Δ | -1 | -2 | -1 | -1 | 0 | 0 | 0 | 0 | -| Improvement % | 1 | 2 | 1 | 1 | 0 | 0 | 0 | 0 | - -

-

- -
Throughput (# / s): results within specified thresholds, fold down for details. -

- -| Throughput (# / s) (#) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 11 | 11 | 11 | 11 | 11 | 11 | 11 | 12 | -| eh-branch | 11 | 11 | 11 | 11 | 11 | 11 | 11 | 12 | -| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - -

-

- -
Memory (resident peak): results within specified thresholds, fold down for details. -

- -| Memory (resident peak) (M) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 70 | 72 | 73 | 73 | 73 | 73 | 73 | 12 | -| eh-branch | 70 | 73 | 80 | 80 | 80 | 80 | 80 | 12 | -| Δ | 0 | 1 | 7 | 7 | 7 | 7 | 7 | 0 | -| Improvement % | 0 | -1 | -10 | -10 | -10 | -10 | -10 | 0 | - -

-

- -
Malloc (total): results within specified thresholds, fold down for details. -

- -| Malloc (total) (K) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 531 | 531 | 531 | 531 | 531 | 531 | 531 | 12 | -| eh-branch | 531 | 531 | 531 | 531 | 531 | 531 | 531 | 12 | -| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - -

-

- -
Instructions: results within specified thresholds, fold down for details. -

- -| Instructions (M) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 1243 | 1249 | 1251 | 1255 | 1258 | 1258 | 1258 | 12 | -| eh-branch | 1233 | 1235 | 1236 | 1237 | 1246 | 1251 | 1251 | 12 | -| Δ | -10 | -14 | -15 | -18 | -12 | -7 | -7 | 0 | -| Improvement % | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | - -

-

- -### Startup MMIOMacros.wasm metrics - -
Time (wall clock): results within specified thresholds, fold down for details. -

- -| Time (wall clock) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 184 | 185 | 185 | 186 | 187 | 187 | 187 | 6 | -| eh-branch | 185 | 185 | 186 | 187 | 188 | 188 | 188 | 6 | -| Δ | 1 | 0 | 1 | 1 | 1 | 1 | 1 | 0 | -| Improvement % | -1 | 0 | -1 | -1 | -1 | -1 | -1 | 0 | - -

-

- -
Time (total CPU): results within specified thresholds, fold down for details. -

- -| Time (total CPU) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 184 | 185 | 185 | 186 | 187 | 187 | 187 | 6 | -| eh-branch | 185 | 185 | 186 | 187 | 188 | 188 | 188 | 6 | -| Δ | 1 | 0 | 1 | 1 | 1 | 1 | 1 | 0 | -| Improvement % | -1 | 0 | -1 | -1 | -1 | -1 | -1 | 0 | - -

-

- -
Throughput (# / s): results within specified thresholds, fold down for details. -

- -| Throughput (# / s) (#) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 5 | 5 | 5 | 5 | 5 | 5 | 5 | 6 | -| eh-branch | 5 | 5 | 5 | 5 | 5 | 5 | 5 | 6 | -| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - -

-

- -
Memory (resident peak): results within specified thresholds, fold down for details. -

- -| Memory (resident peak) (M) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 234 | 235 | 235 | 236 | 236 | 236 | 236 | 6 | -| eh-branch | 234 | 234 | 239 | 239 | 239 | 239 | 239 | 6 | -| Δ | 0 | -1 | 4 | 3 | 3 | 3 | 3 | 0 | -| Improvement % | 0 | 0 | -2 | -1 | -1 | -1 | -1 | 0 | - -

-

- -
Malloc (total): results within specified thresholds, fold down for details. -

- -| Malloc (total) (K) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 628 | 628 | 628 | 628 | 628 | 628 | 628 | 6 | -| eh-branch | 628 | 628 | 628 | 628 | 628 | 628 | 628 | 6 | -| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - -

-

- -
Instructions: results within specified thresholds, fold down for details. -

- -| Instructions (M) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 2249 | 2252 | 2252 | 2261 | 2266 | 2266 | 2266 | 6 | -| eh-branch | 2263 | 2265 | 2267 | 2273 | 2274 | 2274 | 2274 | 6 | -| Δ | 14 | 13 | 15 | 12 | 8 | 8 | 8 | 0 | -| Improvement % | -1 | -1 | -1 | -1 | 0 | 0 | 0 | 0 | - -

-

- -### Startup StringifyMacros.wasm metrics - -
Time (wall clock): results within specified thresholds, fold down for details. -

- -| Time (wall clock) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 88 | 89 | 90 | 90 | 91 | 92 | 92 | 12 | -| eh-branch | 89 | 89 | 90 | 90 | 90 | 90 | 90 | 12 | -| Δ | 1 | 0 | 0 | 0 | -1 | -2 | -2 | 0 | -| Improvement % | -1 | 0 | 0 | 0 | 1 | 2 | 2 | 0 | - -

-

- -
Time (total CPU): results within specified thresholds, fold down for details. -

- -| Time (total CPU) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 88 | 89 | 90 | 90 | 91 | 92 | 92 | 12 | -| eh-branch | 89 | 89 | 90 | 90 | 90 | 90 | 90 | 12 | -| Δ | 1 | 0 | 0 | 0 | -1 | -2 | -2 | 0 | -| Improvement % | -1 | 0 | 0 | 0 | 1 | 2 | 2 | 0 | - -

-

- -
Throughput (# / s): results within specified thresholds, fold down for details. -

- -| Throughput (# / s) (#) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 11 | 11 | 11 | 11 | 11 | 11 | 11 | 12 | -| eh-branch | 11 | 11 | 11 | 11 | 11 | 11 | 11 | 12 | -| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - -

-

- -
Memory (resident peak): results within specified thresholds, fold down for details. -

- -| Memory (resident peak) (M) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 74 | 74 | 76 | 77 | 78 | 78 | 78 | 12 | -| eh-branch | 74 | 75 | 77 | 82 | 82 | 82 | 82 | 12 | -| Δ | 0 | 1 | 1 | 5 | 4 | 4 | 4 | 0 | -| Improvement % | 0 | -1 | -1 | -6 | -5 | -5 | -5 | 0 | - -

-

- -
Malloc (total): results within specified thresholds, fold down for details. -

- -| Malloc (total) (K) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 532 | 532 | 532 | 532 | 532 | 532 | 532 | 12 | -| eh-branch | 532 | 532 | 532 | 532 | 532 | 532 | 532 | 12 | -| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - -

-

- -
Instructions: results within specified thresholds, fold down for details. -

- -| Instructions (M) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 1245 | 1249 | 1254 | 1256 | 1260 | 1261 | 1261 | 12 | -| eh-branch | 1255 | 1258 | 1260 | 1264 | 1270 | 1270 | 1270 | 12 | -| Δ | 10 | 9 | 6 | 8 | 10 | 9 | 9 | 0 | -| Improvement % | -1 | -1 | 0 | -1 | -1 | -1 | -1 | 0 | - -

-

- -### Startup TestingMacros.wasm metrics - -
Time (wall clock): results within specified thresholds, fold down for details. -

- -| Time (wall clock) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 119 | 119 | 119 | 119 | 120 | 120 | 120 | 9 | -| eh-branch | 118 | 118 | 118 | 119 | 119 | 119 | 119 | 9 | -| Δ | -1 | -1 | -1 | 0 | -1 | -1 | -1 | 0 | -| Improvement % | 1 | 1 | 1 | 0 | 1 | 1 | 1 | 0 | - -

-

- -
Time (total CPU): results within specified thresholds, fold down for details. -

- -| Time (total CPU) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 119 | 119 | 119 | 120 | 120 | 120 | 120 | 9 | -| eh-branch | 118 | 118 | 118 | 119 | 119 | 119 | 119 | 9 | -| Δ | -1 | -1 | -1 | -1 | -1 | -1 | -1 | 0 | -| Improvement % | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | - -

-

- -
Throughput (# / s): results within specified thresholds, fold down for details. -

- -| Throughput (# / s) (#) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 8 | 8 | 8 | 8 | 8 | 8 | 8 | 9 | -| eh-branch | 9 | 8 | 8 | 8 | 8 | 8 | 8 | 9 | -| Δ | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -| Improvement % | 12 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - -

-

- -
Memory (resident peak): results within specified thresholds, fold down for details. -

- -| Memory (resident peak) (M) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 126 | 126 | 133 | 133 | 133 | 133 | 133 | 9 | -| eh-branch | 127 | 129 | 138 | 138 | 138 | 138 | 138 | 9 | -| Δ | 1 | 3 | 5 | 5 | 5 | 5 | 5 | 0 | -| Improvement % | -1 | -2 | -4 | -4 | -4 | -4 | -4 | 0 | - -

-

- -
Malloc (total): results within specified thresholds, fold down for details. -

- -| Malloc (total) (K) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 462 | 462 | 462 | 462 | 462 | 462 | 462 | 9 | -| eh-branch | 462 | 462 | 462 | 462 | 462 | 462 | 462 | 9 | -| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - -

-

- -
Instructions: results within specified thresholds, fold down for details. -

- -| Instructions (M) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 1529 | 1533 | 1537 | 1539 | 1543 | 1543 | 1543 | 9 | -| eh-branch | 1525 | 1527 | 1533 | 1536 | 1539 | 1539 | 1539 | 9 | -| Δ | -4 | -6 | -4 | -3 | -4 | -4 | -4 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - -

-

- -## MicroBench - -### empty instantiation metrics - -
Time (wall clock): results within specified thresholds, fold down for details. -

- -| Time (wall clock) (μs) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 26 | 27 | 27 | 27 | 27 | 31 | 54 | 10000 | -| eh-branch | 27 | 27 | 27 | 28 | 28 | 31 | 91 | 10000 | -| Δ | 1 | 0 | 0 | 1 | 1 | 0 | 37 | 0 | -| Improvement % | -4 | 0 | 0 | -4 | -4 | 0 | -69 | 0 | - -

-

- -
Time (total CPU): results within specified thresholds, fold down for details. -

- -| Time (total CPU) (μs) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 28 | 29 | 29 | 29 | 29 | 33 | 54 | 10000 | -| eh-branch | 28 | 29 | 29 | 29 | 30 | 34 | 66 | 10000 | -| Δ | 0 | 0 | 0 | 0 | 1 | 1 | 12 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | -3 | -3 | -22 | 0 | - -

-

- -
Throughput (# / s): results within specified thresholds, fold down for details. -

- -| Throughput (# / s) (K) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 38 | 37 | 37 | 37 | 37 | 32 | 19 | 10000 | -| eh-branch | 38 | 37 | 37 | 36 | 36 | 32 | 11 | 10000 | -| Δ | 0 | 0 | 0 | -1 | -1 | 0 | -8 | 0 | -| Improvement % | 0 | 0 | 0 | -3 | -3 | 0 | -42 | 0 | - -

-

- -
Memory (resident peak): results within specified thresholds, fold down for details. -

- -| Memory (resident peak) (K) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 9093 | 9421 | 9421 | 9421 | 9421 | 9421 | 9421 | 10000 | -| eh-branch | 9060 | 9396 | 9429 | 9437 | 9437 | 9437 | 9437 | 10000 | -| Δ | -33 | -25 | 8 | 16 | 16 | 16 | 16 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - -

-

- -
Malloc (total): results within specified thresholds, fold down for details. -

- -| Malloc (total) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 98 | 98 | 98 | 98 | 98 | 98 | 98 | 10000 | -| eh-branch | 101 | 101 | 101 | 101 | 101 | 101 | 101 | 10000 | -| Δ | 3 | 3 | 3 | 3 | 3 | 3 | 3 | 0 | -| Improvement % | -3 | -3 | -3 | -3 | -3 | -3 | -3 | 0 | - -

-

- -
Instructions: results within specified thresholds, fold down for details. -

- -| Instructions (K) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 309 | 310 | 311 | 311 | 311 | 319 | 335 | 10000 | -| eh-branch | 315 | 316 | 316 | 316 | 316 | 324 | 336 | 10000 | -| Δ | 6 | 6 | 5 | 5 | 5 | 5 | 1 | 0 | -| Improvement % | -2 | -2 | -2 | -2 | -2 | -2 | 0 | 0 | - -

-

- -## WasmParserBenchmark - -### parseWasmBenchmark metrics - -
Time (wall clock): results within specified thresholds, fold down for details. -

- -| Time (wall clock) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 1003 | 1003 | 1003 | 1003 | 1003 | 1003 | 1003 | 1 | -| eh-branch | 907 | 908 | 908 | 908 | 908 | 908 | 908 | 2 | -| Δ | -96 | -95 | -95 | -95 | -95 | -95 | -95 | 1 | -| Improvement % | 10 | 9 | 9 | 9 | 9 | 9 | 9 | 1 | - -

-

- -
Time (total CPU): results within specified thresholds, fold down for details. -

- -| Time (total CPU) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 926 | 926 | 926 | 926 | 926 | 926 | 926 | 1 | -| eh-branch | 908 | 908 | 908 | 908 | 908 | 908 | 908 | 2 | -| Δ | -18 | -18 | -18 | -18 | -18 | -18 | -18 | 1 | -| Improvement % | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 1 | - -

-

- -
Throughput (# / s): results within specified thresholds, fold down for details. -

- -| Throughput (# / s) (#) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | -| eh-branch | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 2 | -| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | - -

-

- -
Memory (resident peak): results within specified thresholds, fold down for details. -

- -| Memory (resident peak) (M) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 55 | 55 | 55 | 55 | 55 | 55 | 55 | 1 | -| eh-branch | 55 | 55 | 55 | 56 | 56 | 56 | 56 | 2 | -| Δ | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | -| Improvement % | 0 | 0 | 0 | -2 | -2 | -2 | -2 | 1 | - -

-

- -
Malloc (total): results within specified thresholds, fold down for details. -

- -| Malloc (total) (K) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 2894 | 2894 | 2894 | 2894 | 2894 | 2894 | 2894 | 1 | -| eh-branch | 2895 | 2895 | 2895 | 2895 | 2895 | 2895 | 2895 | 2 | -| Δ | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | - -

-

- -
Instructions: results within specified thresholds, fold down for details. -

- -| Instructions (G) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 15 | 15 | 15 | 15 | 15 | 15 | 15 | 1 | -| eh-branch | 15 | 15 | 15 | 15 | 15 | 15 | 15 | 2 | -| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | - -

-

- -## WishYouWereFast - -### aead_chacha20poly1305.wasm metrics - -
Time (wall clock): results within specified thresholds, fold down for details. -

- -| Time (wall clock) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 393 | 393 | 403 | 456 | 456 | 456 | 456 | 3 | -| eh-branch | 388 | 388 | 388 | 388 | 388 | 388 | 388 | 3 | -| Δ | -5 | -5 | -15 | -68 | -68 | -68 | -68 | 0 | -| Improvement % | 1 | 1 | 4 | 15 | 15 | 15 | 15 | 0 | - -

-

- -
Time (total CPU): results within specified thresholds, fold down for details. -

- -| Time (total CPU) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 392 | 392 | 403 | 432 | 432 | 432 | 432 | 3 | -| eh-branch | 388 | 388 | 388 | 389 | 389 | 389 | 389 | 3 | -| Δ | -4 | -4 | -15 | -43 | -43 | -43 | -43 | 0 | -| Improvement % | 1 | 1 | 4 | 10 | 10 | 10 | 10 | 0 | - -

-

- -
Throughput (# / s): results within specified thresholds, fold down for details. -

- -| Throughput (# / s) (#) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 3 | 3 | 2 | 2 | 2 | 2 | 2 | 3 | -| eh-branch | 3 | 3 | 3 | 3 | 3 | 3 | 3 | 3 | -| Δ | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 0 | -| Improvement % | 0 | 0 | 50 | 50 | 50 | 50 | 50 | 0 | - -

-

- -
Memory (resident peak): results within specified thresholds, fold down for details. -

- -| Memory (resident peak) (M) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 12 | 12 | 14 | 14 | 14 | 14 | 14 | 3 | -| eh-branch | 12 | 12 | 13 | 13 | 13 | 13 | 13 | 3 | -| Δ | 0 | 0 | -1 | -1 | -1 | -1 | -1 | 0 | -| Improvement % | 0 | 0 | 7 | 7 | 7 | 7 | 7 | 0 | - -

-

- -
Malloc (total): results within specified thresholds, fold down for details. -

- -| Malloc (total) (K) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 104 | 104 | 104 | 104 | 104 | 104 | 104 | 3 | -| eh-branch | 104 | 104 | 104 | 104 | 104 | 104 | 104 | 3 | -| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - -

-

- -
Instructions: results within specified thresholds, fold down for details. -

- -| Instructions (M) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 4765 | 4765 | 4769 | 4772 | 4772 | 4772 | 4772 | 3 | -| eh-branch | 4763 | 4763 | 4763 | 4763 | 4763 | 4763 | 4763 | 3 | -| Δ | -2 | -2 | -6 | -9 | -9 | -9 | -9 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - -

-

- -### aead_chacha20poly13052.wasm metrics - -
Time (wall clock): results within specified thresholds, fold down for details. -

- -| Time (wall clock) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 815 | 816 | 816 | 818 | 818 | 818 | 818 | 2 | -| eh-branch | 816 | 816 | 816 | 816 | 816 | 816 | 816 | 2 | -| Δ | 1 | 0 | 0 | -2 | -2 | -2 | -2 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - -

-

- -
Time (total CPU): results within specified thresholds, fold down for details. -

- -| Time (total CPU) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 816 | 816 | 816 | 818 | 818 | 818 | 818 | 2 | -| eh-branch | 816 | 816 | 816 | 816 | 816 | 816 | 816 | 2 | -| Δ | 0 | 0 | 0 | -2 | -2 | -2 | -2 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - -

-

- -
Throughput (# / s): results within specified thresholds, fold down for details. -

- -| Throughput (# / s) (#) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 2 | -| eh-branch | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 2 | -| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - -

-

- -
Memory (resident peak): results within specified thresholds, fold down for details. -

- -| Memory (resident peak) (M) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 14 | 14 | 14 | 15 | 15 | 15 | 15 | 2 | -| eh-branch | 14 | 14 | 14 | 15 | 15 | 15 | 15 | 2 | -| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - -

-

- -
Malloc (total): results within specified thresholds, fold down for details. -

- -| Malloc (total) (K) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 65 | 65 | 65 | 65 | 65 | 65 | 65 | 2 | -| eh-branch | 65 | 65 | 65 | 65 | 65 | 65 | 65 | 2 | -| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - -

-

- -
Instructions: results within specified thresholds, fold down for details. -

- -| Instructions (M) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 9130 | 9130 | 9130 | 9130 | 9130 | 9130 | 9130 | 2 | -| eh-branch | 9128 | 9128 | 9128 | 9128 | 9128 | 9128 | 9128 | 2 | -| Δ | -2 | -2 | -2 | -2 | -2 | -2 | -2 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - -

-

- -### aead_xchacha20poly1305.wasm metrics - -
Time (wall clock): results within specified thresholds, fold down for details. -

- -| Time (wall clock) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 404 | 404 | 405 | 405 | 405 | 405 | 405 | 3 | -| eh-branch | 405 | 405 | 406 | 407 | 407 | 407 | 407 | 3 | -| Δ | 1 | 1 | 1 | 2 | 2 | 2 | 2 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - -

-

- -
Time (total CPU): results within specified thresholds, fold down for details. -

- -| Time (total CPU) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 404 | 404 | 405 | 405 | 405 | 405 | 405 | 3 | -| eh-branch | 405 | 406 | 406 | 407 | 407 | 407 | 407 | 3 | -| Δ | 1 | 2 | 1 | 2 | 2 | 2 | 2 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - -

-

- -
Throughput (# / s): results within specified thresholds, fold down for details. -

- -| Throughput (# / s) (#) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 3 | -| eh-branch | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 3 | -| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - -

-

- -
Memory (resident peak): results within specified thresholds, fold down for details. -

- -| Memory (resident peak) (M) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 12 | 12 | 14 | 14 | 14 | 14 | 14 | 3 | -| eh-branch | 12 | 12 | 13 | 13 | 13 | 13 | 13 | 3 | -| Δ | 0 | 0 | -1 | -1 | -1 | -1 | -1 | 0 | -| Improvement % | 0 | 0 | 7 | 7 | 7 | 7 | 7 | 0 | - -

-

- -
Malloc (total): results within specified thresholds, fold down for details. -

- -| Malloc (total) (K) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 84 | 84 | 84 | 84 | 84 | 84 | 84 | 3 | -| eh-branch | 84 | 84 | 84 | 84 | 84 | 84 | 84 | 3 | -| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - -

-

- -
Instructions: results within specified thresholds, fold down for details. -

- -| Instructions (M) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 4653 | 4654 | 4654 | 4654 | 4654 | 4654 | 4654 | 3 | -| eh-branch | 4652 | 4652 | 4652 | 4652 | 4652 | 4652 | 4652 | 3 | -| Δ | -1 | -2 | -2 | -2 | -2 | -2 | -2 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - -

-

- -### auth.wasm metrics - -
Time (wall clock): results within specified thresholds, fold down for details. -

- -| Time (wall clock) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 97 | 97 | 98 | 99 | 99 | 99 | 99 | 11 | -| eh-branch | 97 | 98 | 98 | 98 | 98 | 98 | 98 | 11 | -| Δ | 0 | 1 | 0 | -1 | -1 | -1 | -1 | 0 | -| Improvement % | 0 | -1 | 0 | 1 | 1 | 1 | 1 | 0 | - -

-

- -
Time (total CPU): results within specified thresholds, fold down for details. -

- -| Time (total CPU) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 97 | 98 | 98 | 99 | 99 | 99 | 99 | 11 | -| eh-branch | 97 | 98 | 98 | 98 | 98 | 98 | 98 | 11 | -| Δ | 0 | 0 | 0 | -1 | -1 | -1 | -1 | 0 | -| Improvement % | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 0 | - -

-

- -
Throughput (# / s): results within specified thresholds, fold down for details. -

- -| Throughput (# / s) (#) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 10 | 10 | 10 | 10 | 10 | 10 | 10 | 11 | -| eh-branch | 10 | 10 | 10 | 10 | 10 | 10 | 10 | 11 | -| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - -

-

- -| Memory (resident peak) (M) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 12 | 13 | 13 | 13 | 13 | 13 | 13 | 11 | -| eh-branch | 12 | 13 | 13 | 13 | 13 | 13 | 13 | 11 | -| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - -
Malloc (total): results within specified thresholds, fold down for details. -

- -| Malloc (total) (K) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 35 | 35 | 35 | 35 | 35 | 35 | 35 | 11 | -| eh-branch | 35 | 35 | 35 | 35 | 35 | 35 | 35 | 11 | -| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - -

-

- -
Instructions: results within specified thresholds, fold down for details. -

- -| Instructions (M) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 1511 | 1511 | 1511 | 1511 | 1511 | 1511 | 1511 | 11 | -| eh-branch | 1512 | 1513 | 1513 | 1513 | 1513 | 1513 | 1513 | 11 | -| Δ | 1 | 2 | 2 | 2 | 2 | 2 | 2 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - -

-

- -### auth2.wasm metrics - -
Time (wall clock): results within specified thresholds, fold down for details. -

- -| Time (wall clock) (μs) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 7715 | 7741 | 7758 | 7782 | 7807 | 8016 | 8040 | 128 | -| eh-branch | 7737 | 7770 | 7786 | 7811 | 7856 | 8065 | 8066 | 128 | -| Δ | 22 | 29 | 28 | 29 | 49 | 49 | 26 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | -1 | -1 | 0 | 0 | - -

-

- -
Time (total CPU): results within specified thresholds, fold down for details. -

- -| Time (total CPU) (μs) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 7717 | 7746 | 7762 | 7786 | 7811 | 8012 | 8043 | 128 | -| eh-branch | 7743 | 7774 | 7791 | 7815 | 7848 | 8061 | 8068 | 128 | -| Δ | 26 | 28 | 29 | 29 | 37 | 49 | 25 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | -1 | 0 | 0 | - -

-

- -
Throughput (# / s): results within specified thresholds, fold down for details. -

- -| Throughput (# / s) (#) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 130 | 129 | 129 | 128 | 128 | 125 | 124 | 128 | -| eh-branch | 129 | 129 | 128 | 128 | 127 | 124 | 124 | 128 | -| Δ | -1 | 0 | -1 | 0 | -1 | -1 | 0 | 0 | -| Improvement % | -1 | 0 | -1 | 0 | -1 | -1 | 0 | 0 | - -

-

- -| Memory (resident peak) (M) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 11 | 13 | 14 | 14 | 14 | 14 | 14 | 128 | -| eh-branch | 11 | 14 | 14 | 14 | 14 | 14 | 14 | 128 | -| Δ | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | -| Improvement % | 0 | -8 | 0 | 0 | 0 | 0 | 0 | 0 | - -
Malloc (total): results within specified thresholds, fold down for details. -

- -| Malloc (total) (K) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 24 | 24 | 24 | 24 | 24 | 24 | 24 | 128 | -| eh-branch | 24 | 24 | 24 | 24 | 24 | 24 | 24 | 128 | -| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - -

-

- -
Instructions: results within specified thresholds, fold down for details. -

- -| Instructions (M) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 118 | 118 | 118 | 118 | 118 | 119 | 120 | 128 | -| eh-branch | 118 | 118 | 118 | 118 | 118 | 119 | 120 | 128 | -| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - -

-

- -### auth3.wasm metrics - -
Time (wall clock): results within specified thresholds, fold down for details. -

- -| Time (wall clock) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 13 | 13 | 13 | 13 | 14 | 17 | 17 | 77 | -| eh-branch | 13 | 13 | 13 | 13 | 13 | 13 | 13 | 78 | -| Δ | 0 | 0 | 0 | 0 | -1 | -4 | -4 | 1 | -| Improvement % | 0 | 0 | 0 | 0 | 7 | 24 | 24 | 1 | - -

-

- -
Time (total CPU): results within specified thresholds, fold down for details. -

- -| Time (total CPU) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 13 | 13 | 13 | 13 | 14 | 16 | 16 | 77 | -| eh-branch | 13 | 13 | 13 | 13 | 13 | 13 | 13 | 78 | -| Δ | 0 | 0 | 0 | 0 | -1 | -3 | -3 | 1 | -| Improvement % | 0 | 0 | 0 | 0 | 7 | 19 | 19 | 1 | - -

-

- -
Throughput (# / s): results within specified thresholds, fold down for details. -

- -| Throughput (# / s) (#) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 80 | 79 | 79 | 77 | 72 | 59 | 59 | 77 | -| eh-branch | 79 | 79 | 78 | 78 | 78 | 75 | 75 | 78 | -| Δ | -1 | 0 | -1 | 1 | 6 | 16 | 16 | 1 | -| Improvement % | -1 | 0 | -1 | 1 | 8 | 27 | 27 | 1 | - -

-

- -| Memory (resident peak) (M) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 12 | 13 | 13 | 15 | 15 | 15 | 15 | 77 | -| eh-branch | 12 | 13 | 13 | 13 | 13 | 13 | 13 | 78 | -| Δ | 0 | 0 | 0 | -2 | -2 | -2 | -2 | 1 | -| Improvement % | 0 | 0 | 0 | 13 | 13 | 13 | 13 | 1 | - -
Malloc (total): results within specified thresholds, fold down for details. -

- -| Malloc (total) (K) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 24 | 24 | 24 | 24 | 24 | 24 | 24 | 77 | -| eh-branch | 24 | 24 | 24 | 24 | 24 | 24 | 24 | 78 | -| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | - -

-

- -
Instructions: results within specified thresholds, fold down for details. -

- -| Instructions (M) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 192 | 192 | 192 | 192 | 192 | 194 | 194 | 77 | -| eh-branch | 193 | 193 | 193 | 193 | 193 | 195 | 195 | 78 | -| Δ | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | -| Improvement % | -1 | -1 | -1 | -1 | -1 | -1 | -1 | 1 | - -

-

- -### auth6.wasm metrics - -
Time (wall clock): results within specified thresholds, fold down for details. -

- -| Time (wall clock) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 10 | 10 | 10 | 11 | 11 | 11 | 11 | 95 | -| eh-branch | 10 | 10 | 10 | 10 | 11 | 11 | 11 | 96 | -| Δ | 0 | 0 | 0 | -1 | 0 | 0 | 0 | 1 | -| Improvement % | 0 | 0 | 0 | 9 | 0 | 0 | 0 | 1 | - -

-

- -
Time (total CPU): results within specified thresholds, fold down for details. -

- -| Time (total CPU) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 10 | 10 | 10 | 11 | 11 | 11 | 11 | 95 | -| eh-branch | 10 | 10 | 10 | 10 | 11 | 11 | 11 | 96 | -| Δ | 0 | 0 | 0 | -1 | 0 | 0 | 0 | 1 | -| Improvement % | 0 | 0 | 0 | 9 | 0 | 0 | 0 | 1 | - -

-

- -
Throughput (# / s): results within specified thresholds, fold down for details. -

- -| Throughput (# / s) (#) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 96 | 96 | 96 | 95 | 95 | 93 | 93 | 95 | -| eh-branch | 96 | 96 | 96 | 95 | 95 | 93 | 93 | 96 | -| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | - -

-

- -| Memory (resident peak) (M) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 11 | 13 | 13 | 13 | 13 | 13 | 13 | 95 | -| eh-branch | 11 | 13 | 13 | 14 | 14 | 14 | 14 | 96 | -| Δ | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | -| Improvement % | 0 | 0 | 0 | -8 | -8 | -8 | -8 | 1 | - -
Malloc (total): results within specified thresholds, fold down for details. -

- -| Malloc (total) (K) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 24 | 24 | 24 | 24 | 24 | 24 | 24 | 95 | -| eh-branch | 24 | 24 | 24 | 24 | 24 | 24 | 24 | 96 | -| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | - -

-

- -
Instructions: results within specified thresholds, fold down for details. -

- -| Instructions (M) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 162 | 162 | 162 | 162 | 162 | 164 | 164 | 95 | -| eh-branch | 161 | 161 | 162 | 162 | 162 | 164 | 164 | 96 | -| Δ | -1 | -1 | 0 | 0 | 0 | 0 | 0 | 1 | -| Improvement % | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | - -

-

- -### box.wasm metrics - -
Time (wall clock): results within specified thresholds, fold down for details. -

- -| Time (wall clock) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 1407 | 1407 | 1407 | 1407 | 1407 | 1407 | 1407 | 1 | -| eh-branch | 1393 | 1393 | 1393 | 1393 | 1393 | 1393 | 1393 | 1 | -| Δ | -14 | -14 | -14 | -14 | -14 | -14 | -14 | 0 | -| Improvement % | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | - -

-

- -
Time (total CPU): results within specified thresholds, fold down for details. -

- -| Time (total CPU) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 1408 | 1408 | 1408 | 1408 | 1408 | 1408 | 1408 | 1 | -| eh-branch | 1393 | 1393 | 1393 | 1393 | 1393 | 1393 | 1393 | 1 | -| Δ | -15 | -15 | -15 | -15 | -15 | -15 | -15 | 0 | -| Improvement % | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | - -

-

- -
Throughput (# / s): results within specified thresholds, fold down for details. -

- -| Throughput (# / s) (#) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | -| eh-branch | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | -| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - -

-

- -| Memory (resident peak) (M) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 13 | 13 | 13 | 13 | 13 | 13 | 13 | 1 | -| eh-branch | 13 | 13 | 13 | 13 | 13 | 13 | 13 | 1 | -| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - -
Malloc (total): results within specified thresholds, fold down for details. -

- -| Malloc (total) (K) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 57 | 57 | 57 | 57 | 57 | 57 | 57 | 1 | -| eh-branch | 57 | 57 | 57 | 57 | 57 | 57 | 57 | 1 | -| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - -

-

- -
Instructions: results within specified thresholds, fold down for details. -

- -| Instructions (G) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 16 | 16 | 16 | 16 | 16 | 16 | 16 | 1 | -| eh-branch | 16 | 16 | 16 | 16 | 16 | 16 | 16 | 1 | -| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - -

-

- -### box2.wasm metrics - -
Time (wall clock): results within specified thresholds, fold down for details. -

- -| Time (wall clock) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 1409 | 1409 | 1409 | 1409 | 1409 | 1409 | 1409 | 1 | -| eh-branch | 1397 | 1397 | 1397 | 1397 | 1397 | 1397 | 1397 | 1 | -| Δ | -12 | -12 | -12 | -12 | -12 | -12 | -12 | 0 | -| Improvement % | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | - -

-

- -
Time (total CPU): results within specified thresholds, fold down for details. -

- -| Time (total CPU) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 1409 | 1409 | 1409 | 1409 | 1409 | 1409 | 1409 | 1 | -| eh-branch | 1397 | 1397 | 1397 | 1397 | 1397 | 1397 | 1397 | 1 | -| Δ | -12 | -12 | -12 | -12 | -12 | -12 | -12 | 0 | -| Improvement % | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | - -

-

- -
Throughput (# / s): results within specified thresholds, fold down for details. -

- -| Throughput (# / s) (#) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | -| eh-branch | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | -| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - -

-

- -| Memory (resident peak) (M) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 13 | 13 | 13 | 13 | 13 | 13 | 13 | 1 | -| eh-branch | 13 | 13 | 13 | 13 | 13 | 13 | 13 | 1 | -| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - -
Malloc (total): results within specified thresholds, fold down for details. -

- -| Malloc (total) (K) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 58 | 58 | 58 | 58 | 58 | 58 | 58 | 1 | -| eh-branch | 58 | 58 | 58 | 58 | 58 | 58 | 58 | 1 | -| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - -

-

- -
Instructions: results within specified thresholds, fold down for details. -

- -| Instructions (G) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 16 | 16 | 16 | 16 | 16 | 16 | 16 | 1 | -| eh-branch | 16 | 16 | 16 | 16 | 16 | 16 | 16 | 1 | -| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - -

-

- -### box_easy.wasm metrics - -
Time (wall clock): results within specified thresholds, fold down for details. -

- -| Time (wall clock) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 2794 | 2794 | 2794 | 2794 | 2794 | 2794 | 2794 | 1 | -| eh-branch | 2775 | 2775 | 2775 | 2775 | 2775 | 2775 | 2775 | 1 | -| Δ | -19 | -19 | -19 | -19 | -19 | -19 | -19 | 0 | -| Improvement % | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | - -

-

- -
Time (total CPU): results within specified thresholds, fold down for details. -

- -| Time (total CPU) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 2795 | 2795 | 2795 | 2795 | 2795 | 2795 | 2795 | 1 | -| eh-branch | 2776 | 2776 | 2776 | 2776 | 2776 | 2776 | 2776 | 1 | -| Δ | -19 | -19 | -19 | -19 | -19 | -19 | -19 | 0 | -| Improvement % | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | - -

-

- -
Memory (resident peak): results within specified thresholds, fold down for details. -

- -| Memory (resident peak) (M) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 13 | 13 | 13 | 13 | 13 | 13 | 13 | 1 | -| eh-branch | 13 | 13 | 13 | 13 | 13 | 13 | 13 | 1 | -| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - -

-

- -
Malloc (total): results within specified thresholds, fold down for details. -

- -| Malloc (total) (K) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 60 | 60 | 60 | 60 | 60 | 60 | 60 | 1 | -| eh-branch | 60 | 60 | 60 | 60 | 60 | 60 | 60 | 1 | -| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - -

-

- -
Instructions: results within specified thresholds, fold down for details. -

- -| Instructions (G) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 31 | 31 | 31 | 31 | 31 | 31 | 31 | 1 | -| eh-branch | 31 | 31 | 31 | 31 | 31 | 31 | 31 | 1 | -| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - -

-

- -### box_seal.wasm metrics - -
Time (wall clock): results within specified thresholds, fold down for details. -

- -| Time (wall clock) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 7506 | 7506 | 7506 | 7506 | 7506 | 7506 | 7506 | 1 | -| eh-branch | 7462 | 7462 | 7462 | 7462 | 7462 | 7462 | 7462 | 1 | -| Δ | -44 | -44 | -44 | -44 | -44 | -44 | -44 | 0 | -| Improvement % | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | - -

-

- -
Time (total CPU): results within specified thresholds, fold down for details. -

- -| Time (total CPU) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 7506 | 7506 | 7506 | 7506 | 7506 | 7506 | 7506 | 1 | -| eh-branch | 7465 | 7465 | 7465 | 7465 | 7465 | 7465 | 7465 | 1 | -| Δ | -41 | -41 | -41 | -41 | -41 | -41 | -41 | 0 | -| Improvement % | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | - -

-

- -
Memory (resident peak): results within specified thresholds, fold down for details. -

- -| Memory (resident peak) (M) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 13 | 13 | 13 | 13 | 13 | 13 | 13 | 1 | -| eh-branch | 13 | 13 | 13 | 13 | 13 | 13 | 13 | 1 | -| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - -

-

- -
Malloc (total): results within specified thresholds, fold down for details. -

- -| Malloc (total) (K) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 199 | 199 | 199 | 199 | 199 | 199 | 199 | 1 | -| eh-branch | 199 | 199 | 199 | 199 | 199 | 199 | 199 | 1 | -| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - -

-

- -
Instructions: results within specified thresholds, fold down for details. -

- -| Instructions (G) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 84 | 84 | 84 | 84 | 84 | 84 | 84 | 1 | -| eh-branch | 84 | 84 | 84 | 84 | 84 | 84 | 84 | 1 | -| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - -

-

- -### box_seed.wasm metrics - -
Time (wall clock): results within specified thresholds, fold down for details. -

- -| Time (wall clock) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 232 | 232 | 233 | 233 | 241 | 241 | 241 | 5 | -| eh-branch | 231 | 231 | 231 | 231 | 231 | 231 | 231 | 5 | -| Δ | -1 | -1 | -2 | -2 | -10 | -10 | -10 | 0 | -| Improvement % | 0 | 0 | 1 | 1 | 4 | 4 | 4 | 0 | - -

-

- -
Time (total CPU): results within specified thresholds, fold down for details. -

- -| Time (total CPU) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 232 | 232 | 233 | 233 | 234 | 234 | 234 | 5 | -| eh-branch | 231 | 231 | 231 | 231 | 231 | 231 | 231 | 5 | -| Δ | -1 | -1 | -2 | -2 | -3 | -3 | -3 | 0 | -| Improvement % | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 0 | - -

-

- -
Throughput (# / s): results within specified thresholds, fold down for details. -

- -| Throughput (# / s) (#) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 4 | 4 | 4 | 4 | 4 | 4 | 4 | 5 | -| eh-branch | 4 | 4 | 4 | 4 | 4 | 4 | 4 | 5 | -| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - -

-

- -| Memory (resident peak) (M) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 13 | 13 | 13 | 13 | 13 | 13 | 13 | 5 | -| eh-branch | 13 | 13 | 13 | 13 | 13 | 13 | 13 | 5 | -| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - -
Malloc (total): results within specified thresholds, fold down for details. -

- -| Malloc (total) (K) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 71 | 71 | 71 | 71 | 71 | 71 | 71 | 5 | -| eh-branch | 71 | 71 | 71 | 71 | 71 | 71 | 71 | 5 | -| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - -

-

- -
Instructions: results within specified thresholds, fold down for details. -

- -| Instructions (M) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 2759 | 2760 | 2760 | 2760 | 2760 | 2760 | 2760 | 5 | -| eh-branch | 2759 | 2760 | 2760 | 2760 | 2760 | 2760 | 2760 | 5 | -| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - -

-

- -### chacha20.wasm metrics - -
Time (wall clock): results within specified thresholds, fold down for details. -

- -| Time (wall clock) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 2185 | 2185 | 2185 | 2185 | 2185 | 2185 | 2185 | 1 | -| eh-branch | 2183 | 2183 | 2183 | 2183 | 2183 | 2183 | 2183 | 1 | -| Δ | -2 | -2 | -2 | -2 | -2 | -2 | -2 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - -

-

- -
Time (total CPU): results within specified thresholds, fold down for details. -

- -| Time (total CPU) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 2186 | 2186 | 2186 | 2186 | 2186 | 2186 | 2186 | 1 | -| eh-branch | 2183 | 2183 | 2183 | 2183 | 2183 | 2183 | 2183 | 1 | -| Δ | -3 | -3 | -3 | -3 | -3 | -3 | -3 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - -

-

- -| Memory (resident peak) (M) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 1 | -| eh-branch | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 1 | -| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - -
Malloc (total): results within specified thresholds, fold down for details. -

- -| Malloc (total) (K) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 48 | 48 | 48 | 48 | 48 | 48 | 48 | 1 | -| eh-branch | 48 | 48 | 48 | 48 | 48 | 48 | 48 | 1 | -| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - -

-

- -
Instructions: results within specified thresholds, fold down for details. -

- -| Instructions (G) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 20 | 20 | 20 | 20 | 20 | 20 | 20 | 1 | -| eh-branch | 20 | 20 | 20 | 20 | 20 | 20 | 20 | 1 | -| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - -

-

- -### codecs.wasm metrics - -
Time (wall clock): results within specified thresholds, fold down for details. -

- -| Time (wall clock) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 3435 | 3435 | 3435 | 3435 | 3435 | 3435 | 3435 | 1 | -| eh-branch | 3435 | 3435 | 3435 | 3435 | 3435 | 3435 | 3435 | 1 | -| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - -

-

- -
Time (total CPU): results within specified thresholds, fold down for details. -

- -| Time (total CPU) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 3436 | 3436 | 3436 | 3436 | 3436 | 3436 | 3436 | 1 | -| eh-branch | 3436 | 3436 | 3436 | 3436 | 3436 | 3436 | 3436 | 1 | -| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - -

-

- -| Memory (resident peak) (M) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 1 | -| eh-branch | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 1 | -| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - -
Malloc (total): results within specified thresholds, fold down for details. -

- -| Malloc (total) (K) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 560 | 560 | 560 | 560 | 560 | 560 | 560 | 1 | -| eh-branch | 561 | 561 | 561 | 561 | 561 | 561 | 561 | 1 | -| Δ | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - -

-

- -
Instructions: results within specified thresholds, fold down for details. -

- -| Instructions (G) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 37 | 37 | 37 | 37 | 37 | 37 | 37 | 1 | -| eh-branch | 37 | 37 | 37 | 37 | 37 | 37 | 37 | 1 | -| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - -

-

- -### generichash.wasm metrics - -
Time (wall clock): results within specified thresholds, fold down for details. -

- -| Time (wall clock) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 1771 | 1771 | 1771 | 1771 | 1771 | 1771 | 1771 | 1 | -| eh-branch | 1760 | 1760 | 1760 | 1760 | 1760 | 1760 | 1760 | 1 | -| Δ | -11 | -11 | -11 | -11 | -11 | -11 | -11 | 0 | -| Improvement % | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | - -

-

- -
Time (total CPU): results within specified thresholds, fold down for details. -

- -| Time (total CPU) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 1771 | 1771 | 1771 | 1771 | 1771 | 1771 | 1771 | 1 | -| eh-branch | 1760 | 1760 | 1760 | 1760 | 1760 | 1760 | 1760 | 1 | -| Δ | -11 | -11 | -11 | -11 | -11 | -11 | -11 | 0 | -| Improvement % | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | - -

-

- -
Throughput (# / s): results within specified thresholds, fold down for details. -

- -| Throughput (# / s) (#) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | -| eh-branch | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | -| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - -

-

- -| Memory (resident peak) (M) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 14 | 14 | 14 | 14 | 14 | 14 | 14 | 1 | -| eh-branch | 14 | 14 | 14 | 14 | 14 | 14 | 14 | 1 | -| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - -
Malloc (total): results within specified thresholds, fold down for details. -

- -| Malloc (total) (K) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 224 | 224 | 224 | 224 | 224 | 224 | 224 | 1 | -| eh-branch | 224 | 224 | 224 | 224 | 224 | 224 | 224 | 1 | -| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - -

-

- -
Instructions: results within specified thresholds, fold down for details. -

- -| Instructions (G) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 19 | 19 | 19 | 19 | 19 | 19 | 19 | 1 | -| eh-branch | 19 | 19 | 19 | 19 | 19 | 19 | 19 | 1 | -| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - -

-

- -### generichash2.wasm metrics - -
Time (wall clock): results within specified thresholds, fold down for details. -

- -| Time (wall clock) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 127 | 127 | 127 | 127 | 127 | 127 | 127 | 8 | -| eh-branch | 127 | 127 | 127 | 127 | 128 | 128 | 128 | 8 | -| Δ | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | -1 | -1 | -1 | 0 | - -

-

- -
Time (total CPU): results within specified thresholds, fold down for details. -

- -| Time (total CPU) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 127 | 127 | 127 | 127 | 128 | 128 | 128 | 8 | -| eh-branch | 127 | 127 | 127 | 127 | 128 | 128 | 128 | 8 | -| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - -

-

- -
Throughput (# / s): results within specified thresholds, fold down for details. -

- -| Throughput (# / s) (#) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 8 | 8 | 8 | 8 | 8 | 8 | 8 | 8 | -| eh-branch | 8 | 8 | 8 | 8 | 8 | 8 | 8 | 8 | -| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - -

-

- -
Memory (resident peak): results within specified thresholds, fold down for details. -

- -| Memory (resident peak) (M) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 12 | 13 | 13 | 13 | 13 | 13 | 13 | 8 | -| eh-branch | 12 | 13 | 13 | 13 | 13 | 13 | 13 | 8 | -| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - -

-

- -
Malloc (total): results within specified thresholds, fold down for details. -

- -| Malloc (total) (K) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 70 | 70 | 70 | 70 | 70 | 70 | 70 | 8 | -| eh-branch | 70 | 70 | 70 | 70 | 70 | 70 | 70 | 8 | -| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - -

-

- -
Instructions: results within specified thresholds, fold down for details. -

- -| Instructions (M) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 1370 | 1370 | 1370 | 1370 | 1370 | 1370 | 1370 | 8 | -| eh-branch | 1370 | 1370 | 1370 | 1370 | 1370 | 1370 | 1370 | 8 | -| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - -

-

- -### generichash3.wasm metrics - -
Time (wall clock): results within specified thresholds, fold down for details. -

- -| Time (wall clock) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 127 | 127 | 127 | 127 | 128 | 128 | 128 | 8 | -| eh-branch | 126 | 126 | 127 | 127 | 127 | 127 | 127 | 8 | -| Δ | -1 | -1 | 0 | 0 | -1 | -1 | -1 | 0 | -| Improvement % | 1 | 1 | 0 | 0 | 1 | 1 | 1 | 0 | - -

-

- -
Time (total CPU): results within specified thresholds, fold down for details. -

- -| Time (total CPU) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 127 | 127 | 127 | 127 | 128 | 128 | 128 | 8 | -| eh-branch | 126 | 126 | 127 | 127 | 127 | 127 | 127 | 8 | -| Δ | -1 | -1 | 0 | 0 | -1 | -1 | -1 | 0 | -| Improvement % | 1 | 1 | 0 | 0 | 1 | 1 | 1 | 0 | - -

-

- -
Throughput (# / s): results within specified thresholds, fold down for details. -

- -| Throughput (# / s) (#) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 8 | 8 | 8 | 8 | 8 | 8 | 8 | 8 | -| eh-branch | 8 | 8 | 8 | 8 | 8 | 8 | 8 | 8 | -| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - -

-

- -| Memory (resident peak) (M) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 12 | 13 | 13 | 13 | 13 | 13 | 13 | 8 | -| eh-branch | 12 | 13 | 13 | 13 | 13 | 13 | 13 | 8 | -| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - -
Malloc (total): results within specified thresholds, fold down for details. -

- -| Malloc (total) (K) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 74 | 74 | 74 | 74 | 74 | 74 | 74 | 8 | -| eh-branch | 74 | 74 | 74 | 74 | 74 | 74 | 74 | 8 | -| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - -

-

- -
Instructions: results within specified thresholds, fold down for details. -

- -| Instructions (M) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 1408 | 1409 | 1409 | 1409 | 1409 | 1409 | 1409 | 8 | -| eh-branch | 1408 | 1408 | 1408 | 1408 | 1409 | 1409 | 1409 | 8 | -| Δ | 0 | -1 | -1 | -1 | 0 | 0 | 0 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - -

-

- -### hash.wasm metrics - -
Time (wall clock): results within specified thresholds, fold down for details. -

- -| Time (wall clock) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 14 | 14 | 14 | 14 | 14 | 14 | 14 | 72 | -| eh-branch | 14 | 14 | 14 | 14 | 14 | 14 | 14 | 72 | -| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - -

-

- -
Time (total CPU): results within specified thresholds, fold down for details. -

- -| Time (total CPU) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 14 | 14 | 14 | 14 | 14 | 14 | 14 | 72 | -| eh-branch | 14 | 14 | 14 | 14 | 14 | 14 | 14 | 72 | -| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - -

-

- -
Throughput (# / s): results within specified thresholds, fold down for details. -

- -| Throughput (# / s) (#) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 72 | 72 | 72 | 72 | 72 | 70 | 70 | 72 | -| eh-branch | 72 | 72 | 72 | 72 | 72 | 71 | 71 | 72 | -| Δ | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | - -

-

- -| Memory (resident peak) (M) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 12 | 13 | 13 | 13 | 14 | 14 | 14 | 72 | -| eh-branch | 12 | 13 | 13 | 13 | 13 | 13 | 13 | 72 | -| Δ | 0 | 0 | 0 | 0 | -1 | -1 | -1 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 7 | 7 | 7 | 0 | - -
Malloc (total): results within specified thresholds, fold down for details. -

- -| Malloc (total) (K) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 29 | 29 | 29 | 29 | 29 | 29 | 29 | 72 | -| eh-branch | 29 | 29 | 29 | 29 | 29 | 29 | 29 | 72 | -| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - -

-

- -
Instructions: results within specified thresholds, fold down for details. -

- -| Instructions (M) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 210 | 210 | 210 | 210 | 210 | 212 | 212 | 72 | -| eh-branch | 210 | 210 | 210 | 210 | 210 | 212 | 212 | 72 | -| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - -

-

- -### hash3.wasm metrics - -
Time (wall clock): results within specified thresholds, fold down for details. -

- -| Time (wall clock) (μs) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 4673 | 4698 | 4714 | 4739 | 4796 | 4977 | 5032 | 210 | -| eh-branch | 4760 | 4788 | 4809 | 4829 | 4862 | 5059 | 5088 | 206 | -| Δ | 87 | 90 | 95 | 90 | 66 | 82 | 56 | -4 | -| Improvement % | -2 | -2 | -2 | -2 | -1 | -2 | -1 | -4 | - -

-

- -
Time (total CPU): results within specified thresholds, fold down for details. -

- -| Time (total CPU) (μs) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 4674 | 4698 | 4714 | 4739 | 4805 | 4973 | 5031 | 210 | -| eh-branch | 4761 | 4792 | 4809 | 4833 | 4862 | 5063 | 5069 | 206 | -| Δ | 87 | 94 | 95 | 94 | 57 | 90 | 38 | -4 | -| Improvement % | -2 | -2 | -2 | -2 | -1 | -2 | -1 | -4 | - -

-

- -
Throughput (# / s): results within specified thresholds, fold down for details. -

- -| Throughput (# / s) (#) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 214 | 213 | 212 | 211 | 209 | 201 | 199 | 210 | -| eh-branch | 210 | 209 | 208 | 207 | 206 | 198 | 197 | 206 | -| Δ | -4 | -4 | -4 | -4 | -3 | -3 | -2 | -4 | -| Improvement % | -2 | -2 | -2 | -2 | -1 | -1 | -1 | -4 | - -

-

- -| Memory (resident peak) (M) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 11 | 13 | 14 | 14 | 14 | 14 | 14 | 210 | -| eh-branch | 11 | 13 | 14 | 14 | 14 | 14 | 14 | 206 | -| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -4 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -4 | - -
Malloc (total): results within specified thresholds, fold down for details. -

- -| Malloc (total) (K) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 23 | 23 | 23 | 23 | 23 | 23 | 23 | 210 | -| eh-branch | 23 | 23 | 23 | 23 | 23 | 23 | 23 | 206 | -| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -4 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -4 | - -

-

- -
Instructions: results within specified thresholds, fold down for details. -

- -| Instructions (M) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 72 | 72 | 72 | 72 | 72 | 73 | 74 | 210 | -| eh-branch | 73 | 73 | 73 | 73 | 73 | 75 | 76 | 206 | -| Δ | 1 | 1 | 1 | 1 | 1 | 2 | 2 | -4 | -| Improvement % | -1 | -1 | -1 | -1 | -1 | -3 | -3 | -4 | - -

-

- -### kdf.wasm metrics - -
Time (wall clock): results within specified thresholds, fold down for details. -

- -| Time (wall clock) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 85 | 86 | 86 | 86 | 86 | 86 | 86 | 12 | -| eh-branch | 85 | 86 | 86 | 86 | 86 | 87 | 87 | 12 | -| Δ | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | -1 | -1 | 0 | - -

-

- -
Time (total CPU): results within specified thresholds, fold down for details. -

- -| Time (total CPU) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 85 | 86 | 86 | 86 | 86 | 86 | 86 | 12 | -| eh-branch | 85 | 86 | 86 | 86 | 86 | 87 | 87 | 12 | -| Δ | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | -1 | -1 | 0 | - -

-

- -
Throughput (# / s): results within specified thresholds, fold down for details. -

- -| Throughput (# / s) (#) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 12 | -| eh-branch | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 12 | -| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - -

-

- -| Memory (resident peak) (M) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 12 | 13 | 13 | 13 | 13 | 13 | 13 | 12 | -| eh-branch | 12 | 13 | 13 | 13 | 13 | 13 | 13 | 12 | -| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - -
Malloc (total): results within specified thresholds, fold down for details. -

- -| Malloc (total) (K) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 67 | 67 | 67 | 67 | 67 | 67 | 67 | 12 | -| eh-branch | 67 | 67 | 67 | 67 | 67 | 67 | 67 | 12 | -| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - -

-

- -
Instructions: results within specified thresholds, fold down for details. -

- -| Instructions (M) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 1066 | 1066 | 1066 | 1066 | 1066 | 1066 | 1066 | 12 | -| eh-branch | 1066 | 1067 | 1067 | 1067 | 1067 | 1067 | 1067 | 12 | -| Δ | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - -

-

- -### kdf_hkdf.wasm metrics - -
Time (wall clock): results within specified thresholds, fold down for details. -

- -| Time (wall clock) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 2389 | 2389 | 2389 | 2389 | 2389 | 2389 | 2389 | 1 | -| eh-branch | 2393 | 2393 | 2393 | 2393 | 2393 | 2393 | 2393 | 1 | -| Δ | 4 | 4 | 4 | 4 | 4 | 4 | 4 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - -

-

- -
Time (total CPU): results within specified thresholds, fold down for details. -

- -| Time (total CPU) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 2390 | 2390 | 2390 | 2390 | 2390 | 2390 | 2390 | 1 | -| eh-branch | 2394 | 2394 | 2394 | 2394 | 2394 | 2394 | 2394 | 1 | -| Δ | 4 | 4 | 4 | 4 | 4 | 4 | 4 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - -

-

- -
Memory (resident peak): results within specified thresholds, fold down for details. -

- -| Memory (resident peak) (M) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 1 | -| eh-branch | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 1 | -| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - -

-

- -
Malloc (total): results within specified thresholds, fold down for details. -

- -| Malloc (total) (K) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 91 | 91 | 91 | 91 | 91 | 91 | 91 | 1 | -| eh-branch | 91 | 91 | 91 | 91 | 91 | 91 | 91 | 1 | -| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - -

-

- -
Instructions: results within specified thresholds, fold down for details. -

- -| Instructions (G) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 37 | 37 | 37 | 37 | 37 | 37 | 37 | 1 | -| eh-branch | 37 | 37 | 37 | 37 | 37 | 37 | 37 | 1 | -| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - -

-

- -### keygen.wasm metrics - -
Time (wall clock): results within specified thresholds, fold down for details. -

- -| Time (wall clock) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 35 | 35 | 35 | 35 | 35 | 36 | 36 | 29 | -| eh-branch | 35 | 35 | 35 | 36 | 36 | 36 | 36 | 29 | -| Δ | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | -| Improvement % | 0 | 0 | 0 | -3 | -3 | 0 | 0 | 0 | - -

-

- -
Time (total CPU): results within specified thresholds, fold down for details. -

- -| Time (total CPU) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 35 | 35 | 35 | 35 | 36 | 36 | 36 | 29 | -| eh-branch | 35 | 35 | 35 | 36 | 36 | 36 | 36 | 29 | -| Δ | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | -| Improvement % | 0 | 0 | 0 | -3 | 0 | 0 | 0 | 0 | - -

-

- -
Throughput (# / s): results within specified thresholds, fold down for details. -

- -| Throughput (# / s) (#) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 28 | 28 | 28 | 28 | 28 | 28 | 28 | 29 | -| eh-branch | 28 | 28 | 28 | 28 | 28 | 28 | 28 | 29 | -| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - -

-

- -| Memory (resident peak) (M) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 12 | 13 | 13 | 13 | 13 | 13 | 13 | 29 | -| eh-branch | 12 | 13 | 13 | 13 | 13 | 13 | 13 | 29 | -| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - -
Malloc (total): results within specified thresholds, fold down for details. -

- -| Malloc (total) (K) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 28 | 28 | 28 | 28 | 28 | 28 | 28 | 29 | -| eh-branch | 28 | 28 | 28 | 28 | 28 | 28 | 28 | 29 | -| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - -

-

- -
Instructions: results within specified thresholds, fold down for details. -

- -| Instructions (M) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 376 | 377 | 377 | 377 | 377 | 378 | 378 | 29 | -| eh-branch | 377 | 377 | 377 | 377 | 378 | 378 | 378 | 29 | -| Δ | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - -

-

- -### onetimeauth.wasm metrics - -
Time (wall clock): results within specified thresholds, fold down for details. -

- -| Time (wall clock) (μs) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 4828 | 4846 | 4862 | 4887 | 4944 | 5087 | 5124 | 204 | -| eh-branch | 4819 | 4837 | 4850 | 4870 | 4891 | 5059 | 5104 | 204 | -| Δ | -9 | -9 | -12 | -17 | -53 | -28 | -20 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | - -

-

- -
Time (total CPU): results within specified thresholds, fold down for details. -

- -| Time (total CPU) (μs) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 4831 | 4850 | 4866 | 4887 | 4944 | 5083 | 5127 | 204 | -| eh-branch | 4821 | 4841 | 4854 | 4870 | 4891 | 5059 | 5107 | 204 | -| Δ | -10 | -9 | -12 | -17 | -53 | -24 | -20 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | - -

-

- -
Throughput (# / s): results within specified thresholds, fold down for details. -

- -| Throughput (# / s) (#) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 207 | 206 | 206 | 205 | 202 | 197 | 195 | 204 | -| eh-branch | 208 | 207 | 206 | 205 | 204 | 198 | 196 | 204 | -| Δ | 1 | 1 | 0 | 0 | 2 | 1 | 1 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 0 | - -

-

- -| Memory (resident peak) (M) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 11 | 13 | 13 | 13 | 13 | 13 | 13 | 204 | -| eh-branch | 11 | 13 | 13 | 13 | 13 | 13 | 13 | 204 | -| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - -
Malloc (total): results within specified thresholds, fold down for details. -

- -| Malloc (total) (K) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 21 | 21 | 21 | 21 | 21 | 21 | 21 | 204 | -| eh-branch | 21 | 21 | 21 | 21 | 21 | 21 | 21 | 204 | -| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - -

-

- -
Instructions: results within specified thresholds, fold down for details. -

- -| Instructions (M) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 65 | 66 | 66 | 66 | 66 | 67 | 68 | 204 | -| eh-branch | 66 | 66 | 66 | 66 | 66 | 66 | 68 | 204 | -| Δ | 1 | 0 | 0 | 0 | 0 | -1 | 0 | 0 | -| Improvement % | -2 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | - -

-

- -### onetimeauth2.wasm metrics - -
Time (wall clock): results within specified thresholds, fold down for details. -

- -| Time (wall clock) (μs) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 2245 | 2257 | 2265 | 2279 | 2306 | 2417 | 2544 | 432 | -| eh-branch | 2235 | 2243 | 2249 | 2261 | 2275 | 2382 | 2574 | 435 | -| Δ | -10 | -14 | -16 | -18 | -31 | -35 | 30 | 3 | -| Improvement % | 0 | 1 | 1 | 1 | 1 | 1 | -1 | 3 | - -

-

- -
Time (total CPU): results within specified thresholds, fold down for details. -

- -| Time (total CPU) (μs) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 2247 | 2259 | 2267 | 2281 | 2308 | 2421 | 2544 | 432 | -| eh-branch | 2237 | 2245 | 2251 | 2263 | 2277 | 2384 | 2547 | 435 | -| Δ | -10 | -14 | -16 | -18 | -31 | -37 | 3 | 3 | -| Improvement % | 0 | 1 | 1 | 1 | 1 | 2 | 0 | 3 | - -

-

- -
Throughput (# / s): results within specified thresholds, fold down for details. -

- -| Throughput (# / s) (#) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 445 | 443 | 442 | 439 | 434 | 414 | 393 | 432 | -| eh-branch | 447 | 446 | 445 | 443 | 440 | 420 | 389 | 435 | -| Δ | 2 | 3 | 3 | 4 | 6 | 6 | -4 | 3 | -| Improvement % | 0 | 1 | 1 | 1 | 1 | 1 | -1 | 3 | - -

-

- -| Memory (resident peak) (M) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 11 | 13 | 13 | 13 | 13 | 13 | 13 | 432 | -| eh-branch | 11 | 13 | 13 | 13 | 13 | 14 | 14 | 435 | -| Δ | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 3 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | -8 | -8 | 3 | - -
Malloc (total): results within specified thresholds, fold down for details. -

- -| Malloc (total) (K) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 17 | 17 | 17 | 17 | 17 | 17 | 17 | 432 | -| eh-branch | 17 | 17 | 17 | 17 | 17 | 17 | 17 | 435 | -| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 3 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 3 | - -

-

- -
Instructions: results within specified thresholds, fold down for details. -

- -| Instructions (M) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 34 | 34 | 34 | 34 | 34 | 35 | 36 | 432 | -| eh-branch | 34 | 34 | 34 | 34 | 34 | 35 | 36 | 435 | -| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 3 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 3 | - -

-

- -### randombytes.wasm metrics - -
Time (wall clock): results within specified thresholds, fold down for details. -

- -| Time (wall clock) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 7980 | 7980 | 7980 | 7980 | 7980 | 7980 | 7980 | 1 | -| eh-branch | 7968 | 7968 | 7968 | 7968 | 7968 | 7968 | 7968 | 1 | -| Δ | -12 | -12 | -12 | -12 | -12 | -12 | -12 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - -

-

- -
Time (total CPU): results within specified thresholds, fold down for details. -

- -| Time (total CPU) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 7983 | 7983 | 7983 | 7983 | 7983 | 7983 | 7983 | 1 | -| eh-branch | 7970 | 7970 | 7970 | 7970 | 7970 | 7970 | 7970 | 1 | -| Δ | -13 | -13 | -13 | -13 | -13 | -13 | -13 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - -

-

- -| Memory (resident peak) (M) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 1 | -| eh-branch | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 1 | -| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - -
Malloc (total): results within specified thresholds, fold down for details. -

- -| Malloc (total) (K) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 254 | 254 | 254 | 254 | 254 | 254 | 254 | 1 | -| eh-branch | 254 | 254 | 254 | 254 | 254 | 254 | 254 | 1 | -| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - -

-

- -
Instructions: results within specified thresholds, fold down for details. -

- -| Instructions (G) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 79 | 79 | 79 | 79 | 79 | 79 | 79 | 1 | -| eh-branch | 79 | 79 | 79 | 79 | 79 | 79 | 79 | 1 | -| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - -

-

- -### scalarmult.wasm metrics - -
Time (wall clock): results within specified thresholds, fold down for details. -

- -| Time (wall clock) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 2715 | 2715 | 2715 | 2715 | 2715 | 2715 | 2715 | 1 | -| eh-branch | 2524 | 2524 | 2524 | 2524 | 2524 | 2524 | 2524 | 1 | -| Δ | -191 | -191 | -191 | -191 | -191 | -191 | -191 | 0 | -| Improvement % | 7 | 7 | 7 | 7 | 7 | 7 | 7 | 0 | - -

-

- -
Time (total CPU): results within specified thresholds, fold down for details. -

- -| Time (total CPU) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 2716 | 2716 | 2716 | 2716 | 2716 | 2716 | 2716 | 1 | -| eh-branch | 2525 | 2525 | 2525 | 2525 | 2525 | 2525 | 2525 | 1 | -| Δ | -191 | -191 | -191 | -191 | -191 | -191 | -191 | 0 | -| Improvement % | 7 | 7 | 7 | 7 | 7 | 7 | 7 | 0 | - -

-

- -| Memory (resident peak) (M) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 13 | 13 | 13 | 13 | 13 | 13 | 13 | 1 | -| eh-branch | 13 | 13 | 13 | 13 | 13 | 13 | 13 | 1 | -| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - -
Malloc (total): results within specified thresholds, fold down for details. -

- -| Malloc (total) (K) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 91 | 91 | 91 | 91 | 91 | 91 | 91 | 1 | -| eh-branch | 91 | 91 | 91 | 91 | 91 | 91 | 91 | 1 | -| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - -

-

- -
Instructions: results within specified thresholds, fold down for details. -

- -| Instructions (G) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 29 | 29 | 29 | 29 | 29 | 29 | 29 | 1 | -| eh-branch | 29 | 29 | 29 | 29 | 29 | 29 | 29 | 1 | -| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - -

-

- -### scalarmult2.wasm metrics - -
Time (wall clock): results within specified thresholds, fold down for details. -

- -| Time (wall clock) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 230 | 231 | 231 | 231 | 231 | 231 | 231 | 5 | -| eh-branch | 229 | 230 | 230 | 231 | 237 | 237 | 237 | 5 | -| Δ | -1 | -1 | -1 | 0 | 6 | 6 | 6 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | -3 | -3 | -3 | 0 | - -

-

- -
Time (total CPU): results within specified thresholds, fold down for details. -

- -| Time (total CPU) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 230 | 231 | 231 | 231 | 231 | 231 | 231 | 5 | -| eh-branch | 229 | 230 | 230 | 231 | 233 | 233 | 233 | 5 | -| Δ | -1 | -1 | -1 | 0 | 2 | 2 | 2 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | -1 | -1 | -1 | 0 | - -

-

- -
Throughput (# / s): results within specified thresholds, fold down for details. -

- -| Throughput (# / s) (#) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 4 | 4 | 4 | 4 | 4 | 4 | 4 | 5 | -| eh-branch | 4 | 4 | 4 | 4 | 4 | 4 | 4 | 5 | -| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - -

-

- -| Memory (resident peak) (M) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 13 | 13 | 13 | 13 | 13 | 13 | 13 | 5 | -| eh-branch | 13 | 13 | 13 | 14 | 14 | 14 | 14 | 5 | -| Δ | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 0 | -| Improvement % | 0 | 0 | 0 | -8 | -8 | -8 | -8 | 0 | - -
Malloc (total): results within specified thresholds, fold down for details. -

- -| Malloc (total) (K) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 66 | 66 | 66 | 66 | 66 | 66 | 66 | 5 | -| eh-branch | 66 | 66 | 66 | 66 | 66 | 66 | 66 | 5 | -| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - -

-

- -
Instructions: results within specified thresholds, fold down for details. -

- -| Instructions (M) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 2721 | 2722 | 2722 | 2722 | 2722 | 2722 | 2722 | 5 | -| eh-branch | 2721 | 2722 | 2722 | 2722 | 2722 | 2722 | 2722 | 5 | -| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - -

-

- -### scalarmult5.wasm metrics - -
Time (wall clock): results within specified thresholds, fold down for details. -

- -| Time (wall clock) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 700 | 700 | 700 | 700 | 700 | 700 | 700 | 2 | -| eh-branch | 695 | 695 | 695 | 706 | 706 | 706 | 706 | 2 | -| Δ | -5 | -5 | -5 | 6 | 6 | 6 | 6 | 0 | -| Improvement % | 1 | 1 | 1 | -1 | -1 | -1 | -1 | 0 | - -

-

- -
Time (total CPU): results within specified thresholds, fold down for details. -

- -| Time (total CPU) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 700 | 700 | 700 | 700 | 700 | 700 | 700 | 2 | -| eh-branch | 695 | 695 | 695 | 702 | 702 | 702 | 702 | 2 | -| Δ | -5 | -5 | -5 | 2 | 2 | 2 | 2 | 0 | -| Improvement % | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | - -

-

- -
Throughput (# / s): results within specified thresholds, fold down for details. -

- -| Throughput (# / s) (#) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 2 | -| eh-branch | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 2 | -| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - -

-

- -| Memory (resident peak) (M) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 13 | 13 | 13 | 13 | 13 | 13 | 13 | 2 | -| eh-branch | 13 | 13 | 13 | 13 | 13 | 13 | 13 | 2 | -| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - -
Malloc (total): results within specified thresholds, fold down for details. -

- -| Malloc (total) (K) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 51 | 51 | 51 | 51 | 51 | 51 | 51 | 2 | -| eh-branch | 51 | 51 | 51 | 51 | 51 | 51 | 51 | 2 | -| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - -

-

- -
Instructions: results within specified thresholds, fold down for details. -

- -| Instructions (M) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 7822 | 7823 | 7823 | 7823 | 7823 | 7823 | 7823 | 2 | -| eh-branch | 7823 | 7825 | 7825 | 7825 | 7825 | 7825 | 7825 | 2 | -| Δ | 1 | 2 | 2 | 2 | 2 | 2 | 2 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - -

-

- -### scalarmult6.wasm metrics - -
Time (wall clock): results within specified thresholds, fold down for details. -

- -| Time (wall clock) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 704 | 705 | 705 | 805 | 805 | 805 | 805 | 2 | -| eh-branch | 697 | 697 | 697 | 697 | 697 | 697 | 697 | 2 | -| Δ | -7 | -8 | -8 | -108 | -108 | -108 | -108 | 0 | -| Improvement % | 1 | 1 | 1 | 13 | 13 | 13 | 13 | 0 | - -

-

- -
Time (total CPU): results within specified thresholds, fold down for details. -

- -| Time (total CPU) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 705 | 705 | 705 | 722 | 722 | 722 | 722 | 2 | -| eh-branch | 697 | 697 | 697 | 698 | 698 | 698 | 698 | 2 | -| Δ | -8 | -8 | -8 | -24 | -24 | -24 | -24 | 0 | -| Improvement % | 1 | 1 | 1 | 3 | 3 | 3 | 3 | 0 | - -

-

- -
Throughput (# / s): results within specified thresholds, fold down for details. -

- -| Throughput (# / s) (#) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 2 | -| eh-branch | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 2 | -| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - -

-

- -
Memory (resident peak): results within specified thresholds, fold down for details. -

- -| Memory (resident peak) (M) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 13 | 13 | 13 | 13 | 13 | 13 | 13 | 2 | -| eh-branch | 13 | 13 | 13 | 13 | 13 | 13 | 13 | 2 | -| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - -

-

- -
Malloc (total): results within specified thresholds, fold down for details. -

- -| Malloc (total) (K) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 54 | 54 | 54 | 54 | 54 | 54 | 54 | 2 | -| eh-branch | 54 | 54 | 54 | 54 | 54 | 54 | 54 | 2 | -| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - -

-

- -
Instructions: results within specified thresholds, fold down for details. -

- -| Instructions (M) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 7825 | 7827 | 7827 | 7829 | 7829 | 7829 | 7829 | 2 | -| eh-branch | 7824 | 7825 | 7825 | 7825 | 7825 | 7825 | 7825 | 2 | -| Δ | -1 | -2 | -2 | -4 | -4 | -4 | -4 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - -

-

- -### scalarmult7.wasm metrics - -
Time (wall clock): results within specified thresholds, fold down for details. -

- -| Time (wall clock) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 1406 | 1406 | 1406 | 1406 | 1406 | 1406 | 1406 | 1 | -| eh-branch | 1389 | 1389 | 1389 | 1389 | 1389 | 1389 | 1389 | 1 | -| Δ | -17 | -17 | -17 | -17 | -17 | -17 | -17 | 0 | -| Improvement % | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | - -

-

- -
Time (total CPU): results within specified thresholds, fold down for details. -

- -| Time (total CPU) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 1403 | 1403 | 1403 | 1403 | 1403 | 1403 | 1403 | 1 | -| eh-branch | 1389 | 1389 | 1389 | 1389 | 1389 | 1389 | 1389 | 1 | -| Δ | -14 | -14 | -14 | -14 | -14 | -14 | -14 | 0 | -| Improvement % | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | - -

-

- -
Throughput (# / s): results within specified thresholds, fold down for details. -

- -| Throughput (# / s) (#) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | -| eh-branch | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | -| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - -

-

- -| Memory (resident peak) (M) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 13 | 13 | 13 | 13 | 13 | 13 | 13 | 1 | -| eh-branch | 13 | 13 | 13 | 13 | 13 | 13 | 13 | 1 | -| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - -
Malloc (total): results within specified thresholds, fold down for details. -

- -| Malloc (total) (K) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 51 | 51 | 51 | 51 | 51 | 51 | 51 | 1 | -| eh-branch | 51 | 51 | 51 | 51 | 51 | 51 | 51 | 1 | -| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - -

-

- -
Instructions: results within specified thresholds, fold down for details. -

- -| Instructions (G) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 16 | 16 | 16 | 16 | 16 | 16 | 16 | 1 | -| eh-branch | 16 | 16 | 16 | 16 | 16 | 16 | 16 | 1 | -| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - -

-

- -### secretbox.wasm metrics - -
Time (wall clock): results within specified thresholds, fold down for details. -

- -| Time (wall clock) (μs) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 9788 | 9822 | 9847 | 9871 | 9904 | 10863 | 17942 | 101 | -| eh-branch | 9797 | 9822 | 9839 | 9871 | 9904 | 10600 | 17836 | 101 | -| Δ | 9 | 0 | -8 | 0 | 0 | -263 | -106 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 2 | 1 | 0 | - -

-

- -
Time (total CPU): results within specified thresholds, fold down for details. -

- -| Time (total CPU) (μs) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 9793 | 9822 | 9847 | 9871 | 9912 | 10625 | 10871 | 101 | -| eh-branch | 9801 | 9830 | 9847 | 9880 | 9904 | 10519 | 10601 | 101 | -| Δ | 8 | 8 | 0 | 9 | -8 | -106 | -270 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 1 | 2 | 0 | - -

-

- -
Throughput (# / s): results within specified thresholds, fold down for details. -

- -| Throughput (# / s) (#) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 102 | 102 | 102 | 101 | 101 | 92 | 56 | 101 | -| eh-branch | 102 | 102 | 102 | 101 | 101 | 94 | 56 | 101 | -| Δ | 0 | 0 | 0 | 0 | 0 | 2 | 0 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 2 | 0 | 0 | - -

-

- -
Memory (resident peak): results within specified thresholds, fold down for details. -

- -| Memory (resident peak) (M) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 12 | 13 | 13 | 13 | 13 | 13 | 13 | 101 | -| eh-branch | 12 | 13 | 13 | 13 | 13 | 13 | 13 | 101 | -| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - -

-

- -
Malloc (total): results within specified thresholds, fold down for details. -

- -| Malloc (total) (K) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 23 | 23 | 23 | 23 | 23 | 23 | 23 | 101 | -| eh-branch | 23 | 23 | 23 | 23 | 23 | 23 | 23 | 101 | -| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - -

-

- -
Instructions: results within specified thresholds, fold down for details. -

- -| Instructions (M) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 112 | 112 | 112 | 112 | 112 | 112 | 112 | 101 | -| eh-branch | 111 | 111 | 111 | 111 | 112 | 112 | 112 | 101 | -| Δ | -1 | -1 | -1 | -1 | 0 | 0 | 0 | 0 | -| Improvement % | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | - -

-

- -### secretbox2.wasm metrics - -
Time (wall clock): results within specified thresholds, fold down for details. -

- -| Time (wall clock) (μs) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 7537 | 7565 | 7586 | 7614 | 7651 | 8245 | 8607 | 130 | -| eh-branch | 7615 | 7643 | 7668 | 7700 | 7844 | 8155 | 8573 | 129 | -| Δ | 78 | 78 | 82 | 86 | 193 | -90 | -34 | -1 | -| Improvement % | -1 | -1 | -1 | -1 | -3 | 1 | 0 | -1 | - -

-

- -
Time (total CPU): results within specified thresholds, fold down for details. -

- -| Time (total CPU) (μs) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 7538 | 7569 | 7590 | 7614 | 7651 | 8249 | 8611 | 130 | -| eh-branch | 7620 | 7651 | 7672 | 7709 | 7832 | 8151 | 8583 | 129 | -| Δ | 82 | 82 | 82 | 95 | 181 | -98 | -28 | -1 | -| Improvement % | -1 | -1 | -1 | -1 | -2 | 1 | 0 | -1 | - -

-

- -
Throughput (# / s): results within specified thresholds, fold down for details. -

- -| Throughput (# / s) (#) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 133 | 132 | 132 | 131 | 130 | 121 | 116 | 130 | -| eh-branch | 131 | 131 | 130 | 130 | 128 | 123 | 117 | 129 | -| Δ | -2 | -1 | -2 | -1 | -2 | 2 | 1 | -1 | -| Improvement % | -2 | -1 | -2 | -1 | -2 | 2 | 1 | -1 | - -

-

- -| Memory (resident peak) (M) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 11 | 13 | 13 | 13 | 13 | 13 | 13 | 130 | -| eh-branch | 11 | 13 | 13 | 13 | 13 | 13 | 13 | 129 | -| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -1 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -1 | - -
Malloc (total): results within specified thresholds, fold down for details. -

- -| Malloc (total) (K) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 24 | 24 | 24 | 24 | 24 | 24 | 24 | 130 | -| eh-branch | 24 | 24 | 24 | 24 | 24 | 24 | 24 | 129 | -| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -1 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -1 | - -

-

- -
Instructions: results within specified thresholds, fold down for details. -

- -| Instructions (M) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 89 | 89 | 89 | 89 | 89 | 89 | 90 | 130 | -| eh-branch | 90 | 90 | 90 | 90 | 90 | 91 | 92 | 129 | -| Δ | 1 | 1 | 1 | 1 | 1 | 2 | 2 | -1 | -| Improvement % | -1 | -1 | -1 | -1 | -1 | -2 | -2 | -1 | - -

-

- -### secretbox_easy.wasm metrics - -
Time (wall clock): results within specified thresholds, fold down for details. -

- -| Time (wall clock) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 33 | 33 | 33 | 33 | 33 | 33 | 33 | 31 | -| eh-branch | 33 | 33 | 33 | 33 | 33 | 36 | 36 | 30 | -| Δ | 0 | 0 | 0 | 0 | 0 | 3 | 3 | -1 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | -9 | -9 | -1 | - -

-

- -
Time (total CPU): results within specified thresholds, fold down for details. -

- -| Time (total CPU) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 33 | 33 | 33 | 33 | 33 | 33 | 33 | 31 | -| eh-branch | 33 | 33 | 33 | 33 | 33 | 34 | 34 | 30 | -| Δ | 0 | 0 | 0 | 0 | 0 | 1 | 1 | -1 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | -3 | -3 | -1 | - -

-

- -
Throughput (# / s): results within specified thresholds, fold down for details. -

- -| Throughput (# / s) (#) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 30 | 30 | 30 | 30 | 30 | 30 | 30 | 31 | -| eh-branch | 30 | 30 | 30 | 30 | 29 | 27 | 27 | 30 | -| Δ | 0 | 0 | 0 | 0 | -1 | -3 | -3 | -1 | -| Improvement % | 0 | 0 | 0 | 0 | -3 | -10 | -10 | -1 | - -

-

- -| Memory (resident peak) (M) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 12 | 13 | 13 | 13 | 13 | 13 | 13 | 31 | -| eh-branch | 12 | 13 | 13 | 14 | 14 | 14 | 14 | 30 | -| Δ | 0 | 0 | 0 | 1 | 1 | 1 | 1 | -1 | -| Improvement % | 0 | 0 | 0 | -8 | -8 | -8 | -8 | -1 | - -
Malloc (total): results within specified thresholds, fold down for details. -

- -| Malloc (total) (K) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 31 | 31 | 31 | 31 | 31 | 31 | 31 | 31 | -| eh-branch | 31 | 31 | 31 | 31 | 31 | 31 | 31 | 30 | -| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -1 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -1 | - -

-

- -
Instructions: results within specified thresholds, fold down for details. -

- -| Instructions (M) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 374 | 374 | 374 | 374 | 374 | 374 | 374 | 31 | -| eh-branch | 374 | 374 | 374 | 374 | 374 | 375 | 375 | 30 | -| Δ | 0 | 0 | 0 | 0 | 0 | 1 | 1 | -1 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -1 | - -

-

- -### secretstream_xchacha20poly1305.wasm metrics - -
Time (wall clock): results within specified thresholds, fold down for details. -

- -| Time (wall clock) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 303 | 303 | 303 | 306 | 313 | 313 | 313 | 4 | -| eh-branch | 302 | 303 | 307 | 308 | 310 | 310 | 310 | 4 | -| Δ | -1 | 0 | 4 | 2 | -3 | -3 | -3 | 0 | -| Improvement % | 0 | 0 | -1 | -1 | 1 | 1 | 1 | 0 | - -

-

- -
Time (total CPU): results within specified thresholds, fold down for details. -

- -| Time (total CPU) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 303 | 303 | 303 | 306 | 313 | 313 | 313 | 4 | -| eh-branch | 302 | 303 | 308 | 308 | 310 | 310 | 310 | 4 | -| Δ | -1 | 0 | 5 | 2 | -3 | -3 | -3 | 0 | -| Improvement % | 0 | 0 | -2 | -1 | 1 | 1 | 1 | 0 | - -

-

- -
Throughput (# / s): results within specified thresholds, fold down for details. -

- -| Throughput (# / s) (#) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 3 | 3 | 3 | 3 | 3 | 3 | 3 | 4 | -| eh-branch | 3 | 3 | 3 | 3 | 3 | 3 | 3 | 4 | -| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - -

-

- -| Memory (resident peak) (M) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 14 | 14 | 15 | 16 | 16 | 16 | 16 | 4 | -| eh-branch | 14 | 14 | 15 | 16 | 16 | 16 | 16 | 4 | -| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - -
Malloc (total): results within specified thresholds, fold down for details. -

- -| Malloc (total) (K) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 49 | 49 | 49 | 49 | 49 | 49 | 49 | 4 | -| eh-branch | 49 | 49 | 49 | 49 | 49 | 49 | 49 | 4 | -| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - -

-

- -
Instructions: results within specified thresholds, fold down for details. -

- -| Instructions (M) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 3025 | 3026 | 3035 | 3056 | 3117 | 3117 | 3117 | 4 | -| eh-branch | 3028 | 3028 | 3081 | 3087 | 3101 | 3101 | 3101 | 4 | -| Δ | 3 | 2 | 46 | 31 | -16 | -16 | -16 | 0 | -| Improvement % | 0 | 0 | -2 | -1 | 1 | 1 | 1 | 0 | - -

-

- -### shorthash.wasm metrics - -
Time (wall clock): results within specified thresholds, fold down for details. -

- -| Time (wall clock) (μs) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 7262 | 7299 | 7315 | 7336 | 7365 | 7574 | 7611 | 136 | -| eh-branch | 7318 | 7348 | 7369 | 7397 | 7479 | 7639 | 7639 | 135 | -| Δ | 56 | 49 | 54 | 61 | 114 | 65 | 28 | -1 | -| Improvement % | -1 | -1 | -1 | -1 | -2 | -1 | 0 | -1 | - -

-

- -
Time (total CPU): results within specified thresholds, fold down for details. -

- -| Time (total CPU) (μs) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 7264 | 7303 | 7320 | 7336 | 7365 | 7565 | 7616 | 136 | -| eh-branch | 7319 | 7356 | 7373 | 7397 | 7483 | 7623 | 7635 | 135 | -| Δ | 55 | 53 | 53 | 61 | 118 | 58 | 19 | -1 | -| Improvement % | -1 | -1 | -1 | -1 | -2 | -1 | 0 | -1 | - -

-

- -
Throughput (# / s): results within specified thresholds, fold down for details. -

- -| Throughput (# / s) (#) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 138 | 137 | 137 | 136 | 136 | 132 | 131 | 136 | -| eh-branch | 137 | 136 | 136 | 135 | 134 | 131 | 131 | 135 | -| Δ | -1 | -1 | -1 | -1 | -2 | -1 | 0 | -1 | -| Improvement % | -1 | -1 | -1 | -1 | -1 | -1 | 0 | -1 | - -

-

- -| Memory (resident peak) (M) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 11 | 13 | 13 | 13 | 13 | 13 | 13 | 136 | -| eh-branch | 11 | 13 | 13 | 13 | 13 | 13 | 13 | 135 | -| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -1 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -1 | - -
Malloc (total): results within specified thresholds, fold down for details. -

- -| Malloc (total) (K) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 19 | 19 | 19 | 19 | 19 | 19 | 19 | 136 | -| eh-branch | 19 | 19 | 19 | 19 | 19 | 19 | 19 | 135 | -| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -1 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -1 | - -

-

- -
Instructions: results within specified thresholds, fold down for details. -

- -| Instructions (M) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 82 | 82 | 82 | 82 | 82 | 83 | 84 | 136 | -| eh-branch | 83 | 83 | 83 | 83 | 83 | 84 | 85 | 135 | -| Δ | 1 | 1 | 1 | 1 | 1 | 1 | 1 | -1 | -| Improvement % | -1 | -1 | -1 | -1 | -1 | -1 | -1 | -1 | - -

-

- -### sign2.wasm metrics - -
Time (wall clock): results within specified thresholds, fold down for details. -

- -| Time (wall clock) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 4150 | 4150 | 4150 | 4150 | 4150 | 4150 | 4150 | 1 | -| eh-branch | 4123 | 4123 | 4123 | 4123 | 4123 | 4123 | 4123 | 1 | -| Δ | -27 | -27 | -27 | -27 | -27 | -27 | -27 | 0 | -| Improvement % | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | - -

-

- -
Time (total CPU): results within specified thresholds, fold down for details. -

- -| Time (total CPU) (ms) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 4151 | 4151 | 4151 | 4151 | 4151 | 4151 | 4151 | 1 | -| eh-branch | 4124 | 4124 | 4124 | 4124 | 4124 | 4124 | 4124 | 1 | -| Δ | -27 | -27 | -27 | -27 | -27 | -27 | -27 | 0 | -| Improvement % | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | - -

-

- -| Memory (resident peak) (M) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 13 | 13 | 13 | 13 | 13 | 13 | 13 | 1 | -| eh-branch | 13 | 13 | 13 | 13 | 13 | 13 | 13 | 1 | -| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - -
Malloc (total): results within specified thresholds, fold down for details. -

- -| Malloc (total) (K) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 113 | 113 | 113 | 113 | 113 | 113 | 113 | 1 | -| eh-branch | 113 | 113 | 113 | 113 | 113 | 113 | 113 | 1 | -| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - -

-

- -
Instructions: results within specified thresholds, fold down for details. -

- -| Instructions (G) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 46 | 46 | 46 | 46 | 46 | 46 | 46 | 1 | -| eh-branch | 46 | 46 | 46 | 46 | 46 | 46 | 46 | 1 | -| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - -

-

- -### siphashx24.wasm metrics - -
Time (wall clock): results within specified thresholds, fold down for details. -

- -| Time (wall clock) (μs) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 8739 | 8774 | 8798 | 8831 | 8905 | 9617 | 16842 | 112 | -| eh-branch | 8739 | 8790 | 8806 | 8856 | 8995 | 9077 | 9085 | 113 | -| Δ | 0 | 16 | 8 | 25 | 90 | -540 | -7757 | 1 | -| Improvement % | 0 | 0 | 0 | 0 | -1 | 6 | 46 | 1 | - -

-

- -
Time (total CPU): results within specified thresholds, fold down for details. -

- -| Time (total CPU) (μs) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 8745 | 8782 | 8806 | 8839 | 8913 | 9593 | 9621 | 112 | -| eh-branch | 8741 | 8790 | 8815 | 8856 | 8995 | 9077 | 9095 | 113 | -| Δ | -4 | 8 | 9 | 17 | 82 | -516 | -526 | 1 | -| Improvement % | 0 | 0 | 0 | 0 | -1 | 5 | 5 | 1 | - -

-

- -
Throughput (# / s): results within specified thresholds, fold down for details. -

- -| Throughput (# / s) (#) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 114 | 114 | 114 | 113 | 112 | 104 | 59 | 112 | -| eh-branch | 114 | 114 | 114 | 113 | 111 | 110 | 110 | 113 | -| Δ | 0 | 0 | 0 | 0 | -1 | 6 | 51 | 1 | -| Improvement % | 0 | 0 | 0 | 0 | -1 | 6 | 86 | 1 | - -

-

- -
Memory (resident peak): results within specified thresholds, fold down for details. -

- -| Memory (resident peak) (M) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 12 | 13 | 13 | 14 | 14 | 14 | 14 | 112 | -| eh-branch | 11 | 13 | 13 | 13 | 13 | 13 | 13 | 113 | -| Δ | -1 | 0 | 0 | -1 | -1 | -1 | -1 | 1 | -| Improvement % | 8 | 0 | 0 | 7 | 7 | 7 | 7 | 1 | - -

-

- -
Malloc (total): results within specified thresholds, fold down for details. -

- -| Malloc (total) (K) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 19 | 19 | 19 | 19 | 19 | 19 | 19 | 112 | -| eh-branch | 19 | 19 | 19 | 19 | 19 | 19 | 19 | 113 | -| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | - -

-

- -
Instructions: results within specified thresholds, fold down for details. -

- -| Instructions (M) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 95 | 95 | 95 | 95 | 95 | 95 | 95 | 112 | -| eh-branch | 94 | 94 | 94 | 94 | 95 | 95 | 96 | 113 | -| Δ | -1 | -1 | -1 | -1 | 0 | 0 | 1 | 1 | -| Improvement % | 1 | 1 | 1 | 1 | 0 | 0 | -1 | 1 | - -

-

- -### stream3.wasm metrics - -
Time (wall clock): results within specified thresholds, fold down for details. -

- -| Time (wall clock) (μs) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 3655 | 3672 | 3684 | 3705 | 3744 | 3936 | 4038 | 268 | -| eh-branch | 3652 | 3670 | 3678 | 3695 | 3719 | 3877 | 4022 | 268 | -| Δ | -3 | -2 | -6 | -10 | -25 | -59 | -16 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | - -

-

- -
Time (total CPU): results within specified thresholds, fold down for details. -

- -| Time (total CPU) (μs) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 3657 | 3674 | 3688 | 3707 | 3744 | 3928 | 4015 | 268 | -| eh-branch | 3654 | 3674 | 3682 | 3697 | 3719 | 3883 | 3986 | 268 | -| Δ | -3 | 0 | -6 | -10 | -25 | -45 | -29 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 0 | - -

-

- -
Throughput (# / s): results within specified thresholds, fold down for details. -

- -| Throughput (# / s) (#) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 274 | 272 | 272 | 270 | 267 | 254 | 248 | 268 | -| eh-branch | 274 | 272 | 272 | 271 | 269 | 258 | 249 | 268 | -| Δ | 0 | 0 | 0 | 1 | 2 | 4 | 1 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 1 | 2 | 0 | 0 | - -

-

- -| Memory (resident peak) (M) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 11 | 13 | 13 | 14 | 14 | 14 | 14 | 268 | -| eh-branch | 11 | 15 | 15 | 15 | 15 | 15 | 15 | 268 | -| Δ | 0 | 2 | 2 | 1 | 1 | 1 | 1 | 0 | -| Improvement % | 0 | -15 | -15 | -7 | -7 | -7 | -7 | 0 | - -
Malloc (total): results within specified thresholds, fold down for details. -

- -| Malloc (total) (K) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 20 | 20 | 20 | 20 | 20 | 20 | 20 | 268 | -| eh-branch | 20 | 20 | 20 | 20 | 20 | 20 | 20 | 268 | -| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - -

-

- -
Instructions: results within specified thresholds, fold down for details. -

- -| Instructions (M) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 48 | 48 | 48 | 48 | 48 | 50 | 50 | 268 | -| eh-branch | 48 | 48 | 48 | 48 | 48 | 50 | 50 | 268 | -| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - -

-

- -### stream4.wasm metrics - -
Time (wall clock): results within specified thresholds, fold down for details. -

- -| Time (wall clock) (μs) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 4903 | 4923 | 4940 | 4960 | 4993 | 5157 | 5213 | 201 | -| eh-branch | 5004 | 5022 | 5034 | 5050 | 5087 | 5333 | 5363 | 197 | -| Δ | 101 | 99 | 94 | 90 | 94 | 176 | 150 | -4 | -| Improvement % | -2 | -2 | -2 | -2 | -2 | -3 | -3 | -4 | - -

-

- -
Time (total CPU): results within specified thresholds, fold down for details. -

- -| Time (total CPU) (μs) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 4907 | 4927 | 4944 | 4964 | 4989 | 5161 | 5198 | 201 | -| eh-branch | 5005 | 5026 | 5038 | 5054 | 5087 | 5337 | 5366 | 197 | -| Δ | 98 | 99 | 94 | 90 | 98 | 176 | 168 | -4 | -| Improvement % | -2 | -2 | -2 | -2 | -2 | -3 | -3 | -4 | - -

-

- -
Throughput (# / s): results within specified thresholds, fold down for details. -

- -| Throughput (# / s) (#) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 204 | 203 | 203 | 202 | 200 | 194 | 192 | 201 | -| eh-branch | 200 | 199 | 199 | 198 | 197 | 188 | 186 | 197 | -| Δ | -4 | -4 | -4 | -4 | -3 | -6 | -6 | -4 | -| Improvement % | -2 | -2 | -2 | -2 | -2 | -3 | -3 | -4 | - -

-

- -| Memory (resident peak) (M) | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 11 | 13 | 13 | 13 | 13 | 13 | 13 | 201 | -| eh-branch | 11 | 13 | 13 | 13 | 13 | 14 | 14 | 197 | -| Δ | 0 | 0 | 0 | 0 | 0 | 1 | 1 | -4 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | -8 | -8 | -4 | - -
Malloc (total): results within specified thresholds, fold down for details. -

- -| Malloc (total) (K) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 20 | 20 | 20 | 20 | 20 | 20 | 20 | 201 | -| eh-branch | 20 | 20 | 20 | 20 | 20 | 20 | 20 | 197 | -| Δ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -4 | -| Improvement % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -4 | - -

-

- -
Instructions: results within specified thresholds, fold down for details. -

- -| Instructions (M) * | p0 | p25 | p50 | p75 | p90 | p99 | p100 | Samples | -|:----------------------------------------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:| -| main | 60 | 60 | 60 | 60 | 60 | 61 | 62 | 201 | -| eh-branch | 61 | 61 | 61 | 61 | 61 | 63 | 63 | 197 | -| Δ | 1 | 1 | 1 | 1 | 1 | 2 | 1 | -4 | -| Improvement % | -2 | -2 | -2 | -2 | -2 | -3 | -2 | -4 | - -

-

-